プログラミング
80%問題:エンジニアがかつて住んでいた最後の20%
The 80% Problem: The Last 20% Is Where the Engineer Used to Live (jonathanbeard.io)
要約
AIは作業の下書きを高速に(約80%まで)生成できるが、残りの20%が持つ複雑さ、特にエッジケースや運用上の課題への対応が、かつてエンジニアの重要な役割だった。この記事では、AIが生成する80%の部分は容易だが、残りの20%である「見えない部分」が実際のシステムを動かし、エンジニアの経験を形成していたことを指摘している。AIがこの20%をスキップすることで、エンジニアのスキルや判断力の価値がさらに高まると筆者は主張している。
全文翻訳
AIを使えば、作業の下書きはあっという間に(例えば5分の4まで)できあがり、そのスピードは本物だ。問題は、残りの5分の1が何を含み、それを処理する筋肉を誰が作っていたか、ということだ。前回の投稿の最後で、私は関連する痛みを別の投稿のために残していることを認めた。それは、ツールが急いで80パーセントまで連れて行ってくれるが、最後の20パーセントは常にエンジニアが実際に住んでいた場所だ、というものだ。これがその投稿である。
古くからのジョークから始めよう。通常、ベル研究所のトム・カーギルに由来し、ジョン・ベントレーの「プログラミング・パール」コラムで有名になったものだ。コードの最初の90パーセントは、時間の最初の90パーセントを費やし、残りの10パーセントのコードは、残りの90パーセントの時間を費やす。算術は不合理だが、経験は正確なので面白い。システムの目に見える部分、デモできる部分は、すぐにまとまる。それからプロジェクトは、誰も予算を計上しなかった部分に遭遇する。エッジケース、失敗モード、負荷がかかったときにだけ現れる条件、世界との接触を生き残れるかを決定する運用上の現実の半ページである。1 その尻尾はスケジュールの丸め誤差ではない。それがスケジュールそのものだ。生成AIはこのルールを撤廃していない。それを移転させ、移転させることで、慎重に名前を付ける価値のある問題を作り出した。
コーディングモデルに機能の構築を依頼すると、最初の80パーセントは驚くべきスピードと流暢さで生成される。ハッピーパスのロジック、基本的なテストに合格する構造、デモで動く足場だ。ただし、注意点が1つある。この80パーセントは、モデルがあなたの問題のようなものでトレーニングされており、それに一般化できる場合にのみ現実となる。トレーニングデータがほとんど触れていない場所に指示すると、流暢さはどこにも行かないが、正しさは失われ、同じ自信に満ちた足場が、今や幻覚となる。2 流暢な出力と利用可能な作業は異なるものであり、モデルは最初のものを完璧にするのに十分なほど良くなっているが、2番目のものを逃している。80パーセントが本物の場合、それが静かにスキップするのは残りの20パーセントであり、そのスキップはランダムではない。それらは、持続的な運用経験を要するエンジニアリングのまさにその部分に集中している。2つの競合するリクエストが状態を破壊するのを防ぐ冪等性キー、リトライが殺到するのを防ぐバックオフとジッター、長いテーブルロックを回避するために書かれたマイグレーション、レートリミッター、サーキットブレーカー、午前3時に最終的な障害を診断可能にする構造化ログなどだ。これらはすべて開発中には見えない。なぜなら、開発環境はそのような状況を露呈する条件を決して実行しないからだ。コードはコンパイルされる。テストは合格する。デモは動作する。成果物は完成したように見える。それから、並行性、トラフィックの急増、部分的なネットワーク障害、またはプロダクションの通常の過酷な状況のいずれかに遭遇すると、まったく完成していないことがわかる。その最後の20パーセントこそ、エンジニアがかつて住んでいた場所なのだ。それは決して楽しい部分ではなかったが、形成的な部分だった。なぜなら、それが基盤との接触を強制し、その接触が生み出す判断力を構築する部分だったからだ。説明できないセグメンテーション違反を追いかけることでメモリについて学んだり、並列プログラムにおける破壊のうんざりするようなランダムさ、時折のスタックスマッシュについて学んだりした。3 火曜日にしか現れない競合状態をデバッグすることで並行性について学んだ。1000行では飛んでいたクエリが1000万行で倒れるのを見ることでデータの形状について学んだ。どれも親切に効率的に教えてくれたわけではないが、教えてくれた。システムが理解するまで単純に動作を拒否したからだ。モデルが今生成する80パーセントは、概して最も抵抗の少なかった部分だ。それがスキップする20パーセントは、教えてくれた部分だ。そこには声に出して言う価値のある教訓があり、この話の不安なバージョンとは反対の方向を向いている。経験は今や、より価値がある、少なくないのだ。タイピングが部分的に処理されるとき、決定的なスキルはタイピングの周りのすべてになる。どのアルゴリズムが実際に合うかを知り、コンポーネントがどこで出会い、ストレス下でどのように振る舞うかを見抜き、システムが本当に何をすべきかを頭の中で保持することだ。それが、最後の20パーセントが構築していた判断力であり、モデルがあなたに手渡せないまさにその部分なのだ。(私が認める偏見:私は自分のLLMよりも自分で最適化することが多いが、私がLLMよりも単に好みがうるさいだけという可能性も十分にある。4)
良い計画は、激しく実行される
ここには別の方向を向く帰結があり、私はそれを別の制服で初めて学んだ。アメリカ陸軍は、この同じ比率の計画バージョンを教えており、通常はパットンに帰される言葉に包まれている。完璧な計画を不確定な将来に実行するよりも、良い計画を今すぐ激しく実行する方が良い。
ジョージ・S・パットン将軍
これは、計画なしで、あるいは悪い計画で突撃する許可ではない。それは反対の失敗、計画による麻痺に対する警告だ。完璧な計画を待つと、いずれにせよ負ける。あなたの部隊は静止したままで配置されず、より粗い計画を持つ競争相手が動き、あなたを取り囲み、勝利するからだ。これは、行動に向けられたパレートの80/20 5であり、「良い」計画が成果のほとんどをもたらす努力の重要な20パーセントであり、それを今すぐ実行することが、とらえどころのない最後の部分のために時間を蓄えることに勝る、というものだ。
では、どちらなのだろうか?失われた20パーセントは、スキップして先に進むべきものなのか、それとも静かにあなたを殺すものなのか?それがまさに疑問であり、正直な答えは、あなたの特定の20パーセントに何があるかに完全に依存する、ということだ。戦闘計画は敵に遭遇するにつれて適応し続ける。ギャップは接触によって、状況を理解している人々によって埋められる。これが、今すぐ実行することが待つことに勝る理由のすべてだ。AIの落とし穴は、それがスキップする20パーセントは接触によって埋まらないということだ。現場で適応する指揮官はループしておらず、ただ完成したように見える成果物があるだけで、放置すると負荷や競合状態、部分的な停止がそれを見つけるまで見えないままそこに座っているだけだ。それは、接触によってそれを埋めることができないという意味ではなく、それを計画する必要があるという意味だ。これを新しいアジャイルな取引と呼ぼう。AIの80パーセントを出荷する。多くの場合、それは本当に問題ない。そして、現実と遭遇するにつれて、それが問題を引き起こす前に、20パーセントを見つけて調整することを体系的に計画するのだ。計画は「これは完成した」ではなく、「これは始めるのに十分であり、実際にそれを完成させる、火中での適応のために人員を配置し、計装している」というものだ。パットンの読みと私が説明している危険は、同じ算術が反対の顔をしているものだ。違いは、あなたの最後の5分の1が後で稼げる改良なのか、それとも他のすべてが静かに依存していた部分なのか、スキップできると思っていた部分なのか、ということだ。
合成された能力
これが中心的な危険に名前を付ける場所だ。なぜなら、それは無能でも幻覚でもなく、これらの古い言葉は実際に何が起こっているのかを隠しているからだ。それを「合成された能力」と呼ぼう。理解の表面的な質感を持ちながら、その下には理解がまったくない出力だ。AIを持つ開発者は、流暢な設計文書、もっともらしいコード、自信に満ちたアーキテクチャの推奨事項、きちんとしたマイグレーション計画、きれいなインシデントの概要を生成でき、見かけの能力の表面積全体が膨張する一方で、その背後にある深さは少しも動かないかもしれない。6 成果物は理解されているように見える。しかし、その人、そして成果物が適用されるシステムは、そうではないかもしれない。そして、その2つの間のギャップは、もはやそれ自体を知らせないものだ。なぜなら、モデルは、古い兆候である「生産できない」という能力の欠如がなくなったほどに良くなったからだ。古い世界では、何かを理解していないことは、それを構築できないこととして現れた。今では構築が安価になり、理解は別の方法で確認する必要がある。その人がどのように失敗するかを予測できるか、それがどのような仮定をしているかを述べられるか、そしてたまたま間違っているもっともらしい答えを出すことができるか、によってだ。7 合成された能力は、それがどれほど説得力があるかに比例して危険であり、外部の根拠となる真実がない場合に最も説得力がある。出力がコンパイラとテストスイートを備えたコードの場合、