ソフトウェアエンジニアは日々、技術選定やアーキテクチャ設計で判断を迫られる。しかし、その判断がどれほど「論理的」かを検証する人は驚くほど少ない。ここで武器になるのがクリティカルシンキング——批判的思考だ。哲学が2000年以上かけて磨き上げた「正しく考える技法」を、エンジニアリングの現場に持ち込んでみよう。
クリティカルシンキングとは何か
クリティカルシンキングとは、主張や情報を鵜呑みにせず、根拠・前提・推論過程を検証して判断する思考法だ。古代ギリシャの哲学者ソクラテスが実践した「問答法」にその起源がある。相手の主張に対して「なぜそう言えるのか」「その根拠は妥当か」と問い続ける姿勢そのものだ。
エンジニアの日常に置き換えると、「このフレームワークが最適です」という提案に対し、「何を基準に最適と判断したのか」「比較対象は何か」「どの文脈での最適か」と問うことに等しい。
| 思考のステップ | 問いかけの例 | エンジニアリングでの場面 |
|---|---|---|
| 主張の特定 | 結局、何を言いたいのか? | 提案の要点を切り出す |
| 根拠の検証 | その根拠はどこから来たか? | ベンチマーク結果の出典確認 |
| 前提の洗い出し | 暗黙に何を仮定しているか? | 「ユーザーは常にネット接続」等 |
| 推論の妥当性 | 根拠から結論は論理的に導けるか? | 因果関係と相関関係の区別 |
| 反証の探索 | 反対の証拠はないか? | 失敗事例のリサーチ |
この5ステップを習慣化するだけで、技術判断の精度は格段に上がる。
エンジニアが陥りやすい論理の誤謬7選
論理学では「誤謬(fallacy)」と呼ばれる、一見正しそうに見えて実は論理的に破綻した推論パターンが分類されている。エンジニアの議論で頻出するものを厳選した。
| 誤謬の名称 | 定義 | エンジニアリングでの典型例 |
|---|---|---|
| 権威に訴える論証 | 権威者が言ったから正しい | 「[Google](/tag/google)が使っているから最適」 |
| バンドワゴン効果 | 多数派だから正しい | 「[GitHub](/tag/github)スター数が多いから良い」 |
| 藁人形論法 | 相手の主張を歪めて攻撃 | 「テストは不要と言うのか?」 |
| 滑り坂論法 | 小さな一歩が極端な結末に至る | 「例外を1つ許したらコードが崩壊する」 |
| 二分法の誤り | 選択肢を2つに限定する | 「モノリスかマイクロサービスか」 |
| 後件肯定 | 結果から原因を断定する | 「デプロイ後にバグ→デプロイが原因」 |
| 生存者バイアス | 成功例だけを見て一般化する | 「成功[スタートアップ](/tag/startup)はRailsだった」 |
特に厄介なのは権威に訴える論証だ。テック業界ではGAFAMの技術選択が「正解」として流通しやすい。しかし、彼らの課題とあなたのプロジェクトの課題は根本的に異なる。10億ユーザーを想定した設計が、月間1万ユーザーのサービスに適切とは限らない。
仮説検証とエンジニアリング——[科学](/tag/science)的方法を実装に活かす
クリティカルシンキングの実践形として最も強力なのが、仮説検証のフレームワークだ。科学的方法論の中核であるこの手法は、バグ調査からアーキテクチャ設計まで幅広く応用できる。
バグ調査を例に考えてみよう。多くのエンジニアは症状を見た瞬間に「おそらくこれが原因だろう」と直感で修正に取りかかる。しかし、仮説検証のアプローチでは次の手順を踏む。
まず現象を正確に記述する。「ログインボタンを3回連打すると500エラーが返る」のように再現条件を特定する。次に、複数の仮説を立てる。「レースコンディション」「セッション管理のバグ」「DB接続プールの枯渇」など、少なくとも3つは挙げる。そして各仮説に対して、「この仮説が正しければ何が観測されるか」「この仮説が正しければ何が観測されないか」を予測する。最後に、予測と実際の観測結果を照合して仮説を絞り込む。
| 仮説 | 予測される観測 | 実際の観測 | 判定 |
|---|---|---|---|
| レースコンディション | タイミング依存でエラー頻度が変化 | 必ず3回目で発生 | 否定的 |
| セッション多重生成 | 同一ユーザーのセッションが複数存在 | セッション3つ確認 | 有力 |
| DB接続プール枯渇 | 他のAPIも遅延する | 他APIは正常 | 否定的 |
この方法論を徹底するだけで、「なんとなく直した」という曖昧な修正が激減する。再発防止策も仮説に基づいて設計できるため、品質が構造的に向上する。
コードレビューに哲学を持ち込む
コードレビューはクリティカルシンキングの格好の訓練場だ。しかし多くのレビューは「動くかどうか」「コーディング規約に従っているか」の表面的なチェックに終始している。
哲学的な問いをレビューに導入してみよう。「このコードはどんな前提に依存しているか」を問う。たとえば、ユーザー入力が常にUTF-8であるという前提、ネットワークレイテンシーが100ms以下であるという前提、データベースの整合性が常に保たれるという前提——これらの暗黙の仮定を炙り出すことで、本番環境で起きうる障害の芽を摘める。
「この設計判断の代替案は検討されたか」を問うのも有効だ。設計には必ずトレードオフがある。パフォーマンスと可読性、柔軟性と複雑性、一貫性と実用性。レビューの場で「なぜこちらを選んだのか」を掘り下げることで、チーム全体の判断力が鍛えられる。
さらに「この変更が間違っていた場合、どうやって気づけるか」という問いは、可観測性(observability)の設計に直結する。ログ、メトリクス、アラートの設計は、まさにクリティカルシンキングの「反証可能性」の実装にほかならない。
技術選定における「問いの構造化」
新しいフレームワークやツールの導入を検討するとき、多くのチームは「機能比較表」を作成する。しかし、この比較表自体が論理的に正しいとは限らない。
まず、比較軸の選定にバイアスがかかっていないかを検証する必要がある。推進者が自分の推すツールに有利な比較軸を無意識に選んでいないか。たとえば、Rustを推したい人がパフォーマンスを最重要軸に置き、開発速度やエコシステムの成熟度を軽視するケースがある。
次に、比較の粒度が揃っているかを確認する。ツールAは本番運用実績が3年あるのに対し、ツールBはPoCレベルの評価しかしていないなら、フェアな比較にはならない。
| チェック項目 | 問うべきこと | 落とし穴の例 |
|---|---|---|
| 比較軸の公平性 | 全候補に平等な軸か | 推しツールに有利な軸だけ選定 |
| 評価の粒度 | 全候補を同条件で検証したか | 片方だけ本番級テスト実施 |
| 時間軸の考慮 | 1年後・3年後のシナリオは | 現時点の機能だけで判断 |
| 撤退コスト | 選択を撤回する費用は | ロックインリスクの無視 |
| 不確実性の表明 | わからないことを明示したか | 全てを確信的に語る |
最後に、「わからない」を明示する勇気も重要だ。クリティカルシンキングは「正解を出す技法」ではなく、「わからないことを正確に把握する技法」でもある。知的誠実さこそが、長期的に正しい判断を積み重ねる基盤となる。
あなたの「論理」を疑う習慣を
クリティカルシンキングの真髄は、他者の論理を批判することではなく、自分自身の思考を検証する姿勢にある。自分が書いたコード、自分が下した設計判断、自分が推薦した技術——それらに対して「本当にそうか?」と問い続けることが、エンジニアとしての成長を支える。
ソクラテスは「無知の知」を説いた。自分が知らないことを知っている者こそが、真に知恵ある者だと。2000年以上前のこの洞察は、日進月歩のテクノロジー業界でこそ切実さを増している。
あなたが最近下した技術的判断のうち、「論理的に検証しないまま通した」ものはいくつあるだろうか?
