/note/tech

ソフトウェア工学をコンピュータサイエンスとよぶのはおかしい

要約:

■ 1. 問題提起

  • ソフトウェア設計論(SOLID原則・DRY・YAGNI・OOP/FP・TDD/DDDなど)が絶対的な真理として語られる光景に違和感を覚える
  • これらを「コンピュータサイエンス」「アルゴリズム」として権威付けし批判を封じる風潮が存在する
  • 「事実」と「規範」という性質の異なる知識に同じ「科学」のラベルを貼ることに対してエンジニアとしての危機感を持つ
  • この混同は現場から考える力を奪い設計論を批判不可能な信仰へと変質させる

■ 2. 事実と規範の二領域

  • 従うしかない事実の領域:
    • 停止性問題の決定不能性(任意のプログラムの停止判定は不可能という証明済みの事実)
    • CAP定理・FLP不可能性といった分散システムの制約
    • クイックソートの計算量オーダー(平均O(n log n)・最悪O(n²))
    • 光速を超えた情報伝達の不可能性やネットワーク帯域の物理的上限
    • これらはエンジニアの努力や美しいコードでは覆せない制約である
  • 取捨選択して調整すべき規範の領域:
    • SOLID原則・デザインパターン・RESTfulといった設計思想が該当する
    • 自然法則でも数学的定理でもなく観測された事実ですらない
    • 人間にとって扱いやすいシステムを作るために先人が編み出した知恵・ベストプラクティスである
    • 採用すべきか否かはチームのスキルセットやシステムの寿命など文脈によって常に正解が変わる

■ 3. カリキュラムへの包含は分類の根拠にならない

  • 「CS学部のカリキュラムに含まれるからCS」という反論への反駁:
    • 問題にすべきは「基礎か実用か」ではなく「事実か規範か」という分類である
    • 実用的な分野の中にもこの二層は存在する
  • OSを例にした分類:
    • スケジューリングアルゴリズムの数理や待ち行列の理論はサイエンスの側面が強い
    • UNIXのファイルシステム設計思想やモノリシック/マイクロカーネルの議論はトレードオフの中で最適解を探るエンジニアリングである
  • 倫理の例示による論証:
    • 理学・工学カリキュラムには「科学技術者の倫理」が必修として含まれる
    • しかし倫理はカリキュラムに含まれても「科学」とは呼ばれない
    • 同様に教科書に掲載されるという理由だけで性質の異なるものを「サイエンス」と呼ぶのは乱暴である
  • ソフトウェア工学の実証的アプローチ(開発プロセスのデータ収集と統計的傾向の把握)は科学的と言えるが現場で語られるSOLIDなどの原則は統計的事実ですらなく経験則に基づく規範に過ぎない

■ 4. 物理法則と設計戦略の混同

  • 「DRYやSOLIDはメモリ領域の管理破綻を防ぐための工学原則であり絶縁原則と同様」という主張への反駁:
    • 電子回路の絶縁破壊は観測された物理法則であり人間の意図と無関係に発生する自然現象である
    • DRY原則の違反はメモリ領域の管理を常に破綻させるわけではない
  • コンパイラの最適化を用いた反証:
    • 近代的なコンパイラはインライン展開(DRYの逆であるコード複製)を最適化として頻繁に行う
    • もしDRY違反がメモリ破壊をもたらすならコンパイラの最適化時点でバイナリがクラッシュするはずだが現実にはそうならない
  • DRYやSOLIDはコードの管理・構造理解を容易にするための人間のための規範である
  • メモリ安全性を担保するのはGCやRustの借用チェッカーといった言語処理系の仕組みであってソースコード設計の美しさではない
  • 物理的破壊は壊れるか否かの二元論であるのに対しDRY違反による認知負荷は保守しやすいか否かというグラデーションの議論であり混同はエンジニアリング的解像度の低さの表れである

■ 5. 権威付けによる指導は怠慢である

  • 「初心者に作法を守らせるために科学的権威で指導することは教育的配慮」という意見への反対:
    • 設計が必要な理由・適用しない場合の実害(保守コスト増大・認知負荷上昇)を説明せず権威を借りて従わせるのは指導側の「説明の怠慢」である
  • 権威付けによる指導の結果:
    • 目的が蔑ろにされ「従うこと自体」が目的化する
    • 文脈が変わっても思考停止して万能薬のようにルール遵守を強制するカーゴカルトが生まれる
  • 「DRYの違反は物理的な破壊と等しい」と本気で信じるエンジニアが実際に存在することは教育的方便として行われた偽りの権威付けが現場で絶対的信仰として定着した実例である
  • 初学者が型を身につける「守」の段階を否定するわけではないが指導者が理由を説明せず虚偽の権威でマウントを取ることは教育ではなくただの怠慢である

■ 6. 工学の本質としての抽象化

  • 設計原則や規範を重視する理由はエンジニアリングの本質が「よい抽象化を模索すること」にあるからである
  • 共通化と抽象化の違い:
    • 共通化: 「AとBは似ているからまとめる」というボトムアップな整理整頓に過ぎない
    • 共通化の問題: 文脈が異なるものを無理やりまとめると片方の仕様変更にもう片方が引きずられる密結合なシステムが生まれる
    • 抽象化: 複雑な事実の上に人間が扱いやすい「都合のよいモデル」の層をトップダウンに設計すること
  • TCPプロトコルを用いた抽象化の例示:
    • ネットワーク上のパケットは消失し順序も入れ替わるという逆らいようのない事実がある
    • TCPを被せることでデータが信頼性をもって順序通りに届くという抽象化されたモデルをアプリケーション層に提供する
    • パケットロスという事実の上にストリームという扱いやすいモデルを提供することがエンジニアリングである
  • SOLIDやDRYはこのような抽象化を成立させるための発見的な道具であり観測された事実そのものではない
  • どの詳細を隠蔽してどの自由度を残すかという境界線の引き方は科学的裏付けだけでなくエンジニアの意思決定とトレードオフに委ねられる
  • 絶対的な唯一の正解はなく人間の美意識やチームの文化に依存するアートやデザインに近い側面があるため自然科学と同列に扱うことには無理がある

■ 7. まとめ

  • 「サイエンス」のラベルを貼ることで主張を客観的事実に見せかけ反論を封じることは誠実ではない
  • 科学者の仕事が「変えられない事実」を解き明かすことであるのに対しエンジニアの仕事は「変えられる設計」を調整して現実の問題を解決することである
  • 規範や原則を科学と偽ることはエンジニアリングの本分を放棄することに等しい
  • CSの原則として正しいからと思考停止するのではなくサイエンスという制約条件のもとで設計原則の物差しをどう使いこなすかその文脈とトレードオフを語ることがプロフェッショナルとしての工学的な態度である

論評:

■ 1. 論旨の核心

  • 記事の中心主張は「事実(is)と規範(ought)を同じ『科学』というラベルで括ることは誤りであり危険である」という点にある
  • 哲学におけるヒュームの「is-ought問題」(自然主義的誤謬)に対応する知識論として正当な問題提起である

■ 2. 論理的に強い部分

  • 事実と規範の二分法:
    • 停止性問題・CAP定理・計算量オーダーといった「証明または観測された制約」と SOLID・DRYのような「人間の認知都合から導かれたベストプラクティス」を区別する視点は哲学的に堅実である
    • 前者は反証不可能な定理であり後者は文脈依存の経験則であるという分類は概ね正確である
  • コンパイラのインライン展開による反証:
    • 「DRY違反はメモリを破壊する」という主張に対しコンパイラが最適化としてコード複製(DRYの逆)を行っても問題が起きないという具体的な反例を提示している
    • 論理的に有効な反証であり論証の精度が高い
  • 倫理のアナロジー:
    • 「カリキュラムに含まれるから科学」という反論に対し「倫理も必修カリキュラムに含まれるが科学とは呼ばない」という例示は端的かつ有効である

■ 3. 論理的に弱い部分・留意点

  • ストローマン論法の傾向:
    • 「DRY違反は絶縁破壊と等しい」という主張を議論の代表例として使用することで反論者全体を極端な立場として描いてしまっている
    • 「SOLIDは経験的に有効性が示されている」といったより一般的な反論には十分に答えていない
  • 二分法の過剰な単純化:
    • 「事実 vs 規範」の境界は実際には曖昧なグラデーションである
    • サイクロマティック複雑度とバグ率の相関(実証的研究あり)・テストカバレッジと保守コストの関係(統計データが存在する)・チーム規模とモジュール境界の関係(Conwayの法則など)といった「観測から導かれた傾向」は記事の二分法に収まりきらない
  • 「規範は人間の都合に過ぎない」の過剰な相対化:
    • 設計原則を「人間側の都合に過ぎない」と述べることは認知科学的知見に基づいた設計論の妥当性を軽視するリスクがある
    • 「都合」であっても人間の認知特性や計算機の動作原理に根ざした合理性を持つものは多い
  • 教育的権威付けへの批判の一面性:
    • 初心者への指導で「まず型を守らせる」アプローチを全面的に「怠慢」と断じているが学習理論上は「先に規則を内面化し後で理由を学ぶ」プロセスが有効な場面も存在する
    • この批判は正当な側面を持つものの教育的文脈の複雑さを十分に扱えていない

■ 4. 総合評価

  • 核心論旨の妥当性: 高い(is-ought問題として正当)
  • 具体的反証の精度: 高い(コンパイラ例は有効)
  • 反論への対応の網羅性: 中程度(極端例への反証に偏る)
  • 二分法の精度: やや粗い(グレーゾーンを扱えていない)
  • 結論の一貫性: 高い

■ 5. 結論

  • 記事の主張する「規範を科学と偽ることの危険性」は知識論として正当であり実務的にも重要な問題提起である
  • 事実と規範の二分法を過度に単純化している点および最も極端な反論を論駁の対象としている点で論証の網羅性に限界がある
  • 主張の方向性は妥当だが設計原則の実証的根拠に関する議論を避けていることが論証の弱点となっている