世界を動かす技術を、日本語で。

怠惰の危険を失う

概要

  • Programming Perl の著者Larry Wallが提唱した 「怠惰・短気・傲慢」 というプログラマの三大美徳について解説
  • 怠惰 がもたらす抽象化の重要性とソフトウェア設計の美学を強調
  • LLM(大規模言語モデル)登場による 生産性と品質のジレンマ
  • LLMは人間の「怠惰」の美徳を持たず、 システムの複雑化を助長
  • LLMはあくまでツールであり、 人間の美徳に基づく設計思想が不可欠

プログラマの三大美徳と抽象化

  • Programming Perl でLarry Wallが提唱した 「怠惰・短気・傲慢」 という三大美徳
  • 怠惰 :面倒を避けるために抽象化や自動化を追求する姿勢
  • 短気 :すぐに結果を求め、効率化を図る動機
  • 傲慢 :自分の書いたコードが他者にとっても価値あるものだという自負
  • 多くの技術者が コピペ に頼る一方、本来は 高レベル抽象化再利用性 を優先すべき
  • 美徳としての怠惰は、 システムをできるだけ単純に保つ 努力を促す
  • 抽象化の設計 には多大な知的労力が必要であり、将来の自分や他人の時間を節約する投資
  • 成功した抽象化は、 後続の開発者にも恩恵 をもたらす

LLM時代の「偽りの勤勉」と生産性の罠

  • 近年、ソフトウェア開発者層が拡大し、「怠惰」の美徳が伝わりにくくなった現状
  • LLM(大規模言語モデル) の普及で、 コード量や生産性の過剰アピール が増加
  • 例:Garry Tanが 1日3万7千行のコード生成 を自慢
  • こうしたアプローチは 本質的な価値を見失う危険性
  • 実際の成果物には 不要なファイルや重複、無駄なデータ が混在
  • LLMは 「怠惰」の美徳を持たず、無限に作業を積み重ねる傾向
  • 人間の有限な時間 こそが、良い抽象化や設計を生む制約

LLMと人間の役割分担

  • LLMは 人間の美徳や制約 を持たず、自律的にシンプルさを追求しない
  • 最良のエンジニアリング は制約から生まれる
  • LLMは あくまでツール であり、設計思想や品質管理は人間の責任
  • 技術的負債の解消作業効率化 など、非本質的な部分でLLMを活用
  • 「美徳としての怠惰」 に基づき、よりシンプルで強力なシステムを目指すべき
  • 次世代のエンジニア にも恩恵を与える設計思想の継承が重要

Hackerたちの意見

一般的には、私たちのほとんどは、抽象化をもっと使うことを考えるべきだと思う。Programming Perlが書かれたときはそうだったかもしれないけど、今は逆のことが多い気がする。私はWET(Write Everything Twice)を支持してるよ(ここでのコメントからパクったけどね)。で、3回目には新しい抽象化を作ることを考えてみる。

WET - Write Everything Twice これは「三の法則」として聞いたことがあるな。

大学の頃から、すべてを2回書くことを推奨してるよ。

二回以上って、かなり低いハードルだよね。Programming Perlの引用とは矛盾しないと思う。

これには完全に同意するよ。ソフトウェアの美しさは、正しい抽象化が計り知れない影響を持つことにある。オペレーティングシステムやRDBMS、クラウドオーケストレーションみたいな大きな革新について話してるんだ。でも、世界の大多数のコードはそうじゃなくて、単純なビジネスロジックで、人間が人間の目的のために実行するアイデアやプロセスを表していて、抽象化に抵抗するんだよね。それでも人々は試みるけど、大手テック企業ではプラットフォームの創造が技術的な帝国主義やキャリア駆動の開発の一形態として広がってる。私のテックレビューのルールは、プラットフォームを持つには、三つの実証済みのユースケースが必要で、それらを結びつけることが共有システムの自律性制約によるネットマイナスにならないことを示さなきゃいけないってこと。

時間が許せば、二回書くのは理にかなってるし、機会があればそうすべきだよ。最初は少し探求的な感じ(もしかしたら捨てプロトタイプかも)で、二回目には問題をよりよく理解して、より良い仕事ができる。三回目は新しい抽象化を使う時で、ここが注意が必要なところ。フレッド・ブルックス(「神話のマン・マンス」)はこれを「第二システム効果」と呼んでいて、一度(本物で、ただのプロトタイプじゃなく)やったことに自信を持つことで、過剰設計で不必要に複雑な「バージョン2」を作りたくなることがあるんだ。抽象化や余計な機能を追加して「もっと良くしよう」と誘惑されるからね。

それでも、平均的なプログラマーよりも抽象化が進むことになるね。

同意するよ。1991年(『Programming Perl』が出版された年)から、どれだけ多くの抽象化の層が作られたか、ほんとに驚くよね。

200k locをLLMで書いたって大声で言うのはバカみたいだけど、他の人が書いたコードを見て「はは!こんなにバカだ!」って言うのもあんまり良くないと思う。君も同じ間違いをしてるよ、ただ逆の方向でね。コードの出力でソフトウェアエンジニアリングの職業を判断してるんだ。じゃあ、Garry Tanはその週に実際に価値のあるものを生み出したのかな?わからない、彼に聞いてみて。

そうだよね!コードの品質が負の価値や失われた命に関係ないわけじゃないよね?!さらに、> Tanがそんなにエネルギーをかけて作っていたアーティファクトについては、私は大体無視してた。でも、ポーランドのソフトウェアエンジニアのGregoreinがそれを分解して、結果は予想通りで面白くて教育的だったよ。Tanの「ニュースレター・ブログ・なんか」は、複数のテストハーネス(!)、Hello WorldのRailsアプリ(?!)、隠れたテキストエディタ、そして同じロゴの8つの異なるバリエーションが含まれてたんだ。その中の1つはゼロバイトだったけど。これらのソフトウェアに含まれている... /もの/ が攻撃の対象になりやすくする面積を増やしたと思う?

「価値生成」っていう言葉にはちょっと警戒してる。私にとって、この文脈では化石燃料で経済成長を促進するのと似てる。最終的にそれがネット利益につながるか(価値がそれに関わるコストや後で混乱を整理するコストより大きいか)は言うのが難しいと思うけど、短期的な価値だけで判断できるとは思わないな。

時間の無駄だね。200,000行のコードを読んで、短期間でこんなにコードを生成して本番環境に出すのが悪いアイデアだって証明するつもりはないよ。証明するのはそのコードを書いた人の責任だし。もしただのツイートのやり取りで、LOCを自慢してもっとLOC/秒を目指してる人を判断したいなら、もちろん判断するよ。バカみたいだし。

Hacker Newsで議論の続きを見る