「意図」という言葉は好きだけど、マーチン・ファウラーのエッセイを読んで、もっと考えさせられた。トーマス・クーンがパラダイムシフトについて話したとき、「パラダイム」は20以上の異なる意味を持つことになった。最近、意図もプログラミングの中で最も汚染され、使われすぎている言葉の一つになったと思う。自分のトイ言語プロジェクトでも「意図」という言葉を使っているから、他人をあまり厳しく批判する立場にはないけどね。Hacker Newsのコメントを読んでいると、プログラミングは根本的にメンタルモデルを構築することだと思ったし、市場は最終的に自分のメンタルモデルを買うんだよね。人間の意図から始めると、チェーンはこんな感じになるかも:人間の意図 -> 問題モデル -> 抽象化 -> 言語表現 -> コンパイル -> ハードウェアの変化。でも、抽象化と表現はそれ自体が多くの層に分かれている。プログラマーが知らなくてもいい層の量は、そのプログラマーの市場での立ち位置に直接影響する。人々は抽象化をクリーンなものだと思いがちだけど、実際には不完全で文脈に依存している。理論的には常にクリーンだけど、実際には常に壊れている。どの層にいるかによって、同じプログラミング言語を使っていても、表現の形は大きく異なることがある。この観点から見ると、人々は何でもかんでもまとめて「抽象化」や「意図」と呼ぶけど、実際には意図と抽象化の間にはギャップがあり、抽象化と表現の間にもギャップがある。その微妙な摩擦点は完全には還元できない。そういう視点から見ると、たとえ非常に明確な仕様を書いても、きれいに還元できない何かが常に残る。おそらく、LLMと人間の本当の違いは、その残り物にどう対処するかにある。マーチンはLLMの抽象化が悪いと示唆する形で問題を提起しているけど、私は完全には同意しない。アジアの第三世界の出身として、自分の言語や環境で書かれた悪い抽象化をたくさん見てきたから。その意味で、LLMが生成するコードは、実際にはアジアの仲間たちが作る平均的な抽象化よりもずっと良いと感じることが多い。一方で、本当に優れた西洋のエンジニアのプログラミングを見ると、良い抽象化とは何かを再び考えさせられる。エッセイではTDDや他の手法についても触れているけど、個人的には抽象化が壊れているとき、TDDは最悪の手法の一つになり得ると思う。抽象化が間違っていたら、テストは本当に意味があるのか?緑のテストを追いかけながら、アーキテクチャを徐々に壊していくケースをたくさん見てきた。特にデータベースを含むシステムではよく見かける。手法の最大の問題は、常に教条主義になりがちで、従わなければならない何かのように扱われることだ。たとえば、SOLID原則は常に守る必要はないけど、ある組織ではほぼ宗教的な教義になってしまう。UIコンポーネントのデザインでは、LSPをあまりにも厳格に適用すると、UIの多様性や柔軟性を損なうことがある。結局、私たちが「意図」と呼ぶものは、文脈の中で柔軟であり続け、最適な解決策を探す能力なのかもしれない。その観点から見ると、意図はLLMの報酬関数に基づく学習にとても似ている。