- Authors

- Name
- Youngju Kim
- @fjvbn20031
- はじめに — なぜいまこの話なのか
- 答えと理解は違う
- 抽象の向こうを見る価値
- 理解の五つの層 — コピーから創造まで
- デバッグ — 理解が表れる瞬間
- 制御と所有権 — 理解がくれるもの
- 学習としての理解 — 回り道の価値
- チーム次元の理解 — 個人を超えて
- バランス — いつ抽象に頼ってよいか
- LLMと理解の健全な関係 — 増幅器として使う
- 実務に適用する — 理解を積む習慣
- 落とし穴と批判的視点
- よくある質問
- おわりに — 理解という喜びを守る
- 参考資料
はじめに — なぜいまこの話なのか
2026年のGeekNewsとHacker Newsには、しばらく同じ情緒の記事が交互に上がりました。核心はこう要約できます。「LLMがコードを代わりに書いてくれる時代に、私たちは本当に何かを理解しているのか、それともただ答えを書き写しているだけなのか」。
ある開発者(binaryigor)が書いた「理解する喜び(the joy of understanding)」に関する記事が、とくに多くの共感を得ました。要旨は単純です。検索とLLMは私たちに即座の答えをくれますが、その答えを本当に理解することは別の事柄であり、その理解こそがエンジニアリングの喜びであり力の源だ、というものです。
この主張がいま響く理由は明白です。AIコーディングツールが普遍化し、私たちはかつてないほど速く「動くコード」に到達できるようになりました。ところが同時に、そのコードがなぜ動くのかを次第に理解しなくなる危険も大きくなりました。動くが理解していないコード。これが2026年のエンジニアが直面する新しい形の負債です。
本稿はLLMを拒否するラッダイト宣言ではありません。むしろLLMという強力なツールを使いながらも、どう理解の深さを失わないか、そしてなぜその深さが依然として決定的に重要かについての話です。抽象の向こうを見ることの価値、デバッグで表れる理解の差、学習としての理解、そしていつ抽象に安心して頼ってよいかのバランスまで順に扱います。
興味深いのは、こうした情緒がLLM懐疑論者ではなく、むしろLLMを積極的に使う人たちの間で広まったことです。ツールを深く使った人ほど、そのツールが何をくれ何を奪うのかをより鮮明に感じます。速い答えを十分に味わったあとになって、答えだけでは満たされない何かがあると気づくわけです。本稿の出発点もそこにあります。
答えと理解は違う
速い答えの罠
まず「答え」と「理解」を区別してみましょう。この二つは同じに見えますが、まったく違うものです。
答え (Answer) 理解 (Understanding)
------------------- -------------------------
- 即座 - 時間がかかる
- コピー可能 - 転移可能 (他の問題に適用)
- 表面的に動く - なぜ動くか分かる
- 文脈が変われば無力 - 文脈が変わっても再構成可能
- 検索/LLMがくれる - 自分で作らねばならない
答えは揮発性が高いです。同じ問題がまた来ても、答えだけ受け取った人はまた検索しなければなりません。一方、理解した人はその答えを再生産でき、より重要なことに、少し違う問題にもその理解を適用できます。
LLM時代の危険は、答えに到達するコストがほぼ0に落ちることで、理解を飛ばそうとする誘惑が最大化される点です。以前は答えを探す過程自体に理解が一部混ざり込みました。文書を読み、例を真似し、失敗しながら、私たちは否応なく少しずつ理解しました。ところがLLMはその過程を丸ごと圧縮します。質問すれば動くコードが出ます。理解という回り道を経なくても目的地に着きます。
動くが理解していないコード
ここで新しい種類のコードが生まれます。「動くが作者が理解していないコード」。これは単にコピーしたコードとも違います。少なくともStack Overflowからコピーするときは「この答えが自分の問題に合うか」を一瞬でも判断せねばなりませんでした。LLMは自分の文脈に合わせてコードを生成してくれるので、その判断の必要性さえ減らしてしまいます。
こういうコードの問題は平時には表れません。動くからです。問題は常に境界状況で起きます。負荷が集中するとき、入力が予想を外れるとき、依存が更新されるとき。そのとき私たちは自分が書いたコードの前で見知らぬ人になります。
抽象の向こうを見る価値
抽象は嘘をつく
ソフトウェアは抽象の塔です。私たちは関数を呼び、その関数はライブラリを呼び、ライブラリはシステムコールを呼び、システムコールはカーネルへ、カーネルはハードウェアへ下りていきます。各層は下層の複雑さを隠してくれます。これが抽象の祝福です。
ところが有名な格言があります。「すべての非自明な抽象は、ある程度漏れる(All non-trivial abstractions, to some degree, are leaky)」。抽象は普段は下層を完璧に隠すふりをしますが、決定的な瞬間にその嘘が露呈します。
あなたのコード
|
[ ORM ] <- 「ただオブジェクトを保存するだけ」
|
[ SQL ] <- 実はクエリが生成される (N+1問題!)
|
[ インデックス/プランナ ] <- 実はフルスキャンが起きる
|
[ ディスクI/O ] <- 実はランダムI/Oで遅くなる
ORMは「オブジェクトを保存するだけ」と言いますが、その下ではSQLが生成され、インデックスが使われたり使われなかったり、ディスクI/Oが発生します。性能問題が起きたとき、ORMという抽象しか知らない人はお手上げです。一方、その下のSQLとインデックスを理解する人は、漏れた抽象の隙間をのぞき込んで問題を直せます。
一層下を知ることの複利効果
深く理解するとは、すべてを知ることではありません。普通は「自分が毎日使う抽象の一層下」を知ることで十分です。そしてこの「一層下」の知識は複利で膨らみます。
- Webフレームワークを使うなら、HTTPの一層下(リクエスト/レスポンス、ヘッダー、ステータスコード)を知れ。
- ORMを使うなら、SQLとインデックスを知れ。
- コンテナを使うなら、Linuxのネームスペースとcgroupを知れ。
- ガベージコレクション言語を使うなら、メモリ割り当てとGCの動作を知れ。
各層を一段だけ深く理解しても、抽象が漏れる瞬間にうろたえなくなります。そしてこれらの理解は互いに連結し、時が経つほどシステム全体を見る直観へと育ちます。これが理解の複利です。
理解の五つの層 — コピーから創造まで
同じコード、異なる深さ
「理解する」という言葉は、実は一つではありません。同じコードを前にしても、人によって理解の深さは異なります。五つの層に分けてみると、自分の位置を点検しやすくなります。
層5: 創造 - このパターンを新しい問題に適用/変形できる
層4: 評価 - このコードの弱点と代替案を批判できる
層3: 説明 - なぜこう動くのかを他人に説明できる
層2: 追跡 - 入力がどう出力へ変わるかを追える
層1: コピー - 動くコードを持ってきて貼れる
LLMは私たちを一瞬で層1(コピー)に押し上げます。動くコードが即座に手に入ります。ところが本当の価値は層3以上から出ます。説明できてこそデバッグでき、評価できてこそLLMの提案を拒否でき、創造できてこそ新しい問題を解けます。
具体的な例 — デバウンス関数
よくあるデバウンス関数を例に挙げてみましょう。
// debounce — 最後の呼び出しから一定時間が経って初めて実際に実行
function debounce(fn, delay) {
let timer = null;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
- 層1(コピー): このコードを貼り付けて動けば満足する。
- 層2(追跡): 呼び出しが続けて来るとtimerが毎回キャンセルされ再設定される流れを追う。
- 層3(説明): なぜクロージャでtimerを閉じ込めねばならないか、applyでthisを保つ理由を説明する。
- 層4(評価): 即時実行オプション(leading edge)がない弱点、キャンセルメソッドがない限界を突く。
- 層5(創造): 同じクロージャの原理でスロットル(throttle)を自分で作り、二つのパターンの違いを説明する。
LLMは層5のコードも即座にくれます。しかしそのコードを受け取って層4で評価できなければ、私たちはそれが自分の状況に合うのかさえ分からないまま使うことになります。理解の層を上げることは、LLMをより良く使うための営みでもあります。
デバッグ — 理解が表れる瞬間
障害の前で分かれる二人
理解の価値が最も劇的に表れる瞬間は障害です。午前3時、プロダクションが落ちました。ログは曖昧で、エラーメッセージは抽象の最上層からしか出ません。ここで二種類のエンジニアが分かれます。
答えだけ集めてきたエンジニアは、エラーメッセージをそのまま検索窓やLLMに貼り付けます。運が良ければ似た事例が出て、運が悪ければそうではありません。この人はシステムの精神モデルがないので、検索結果が自分の状況に合うかさえ判断しにくいです。
理解したエンジニアは違います。頭の中にシステムの精神モデルがあります。「この症状ならここかあそこだ。どちらかを排除するにはこのログを見ればよい」。仮説を立て、検証し、絞り込んでいきます。LLMを使っても、それは自分の仮説を検証する道具であって、仮説そのものを代わってはくれません。
答え収集型デバッグ 理解ベースのデバッグ
---------------- -----------------------
エラーメッセージ -> 検索 症状 -> 精神モデル -> 仮説
結果を貼り付け -> 試す 仮説 -> 検証実験の設計
駄目ならまた検索 結果で仮説を絞る
運に依存 体系的な収束
精神モデルは検索されない
核心はこれです。精神モデルは検索されません。LLMは一般的知識をくれますが、「いまあなたのシステムがどんな形か」についてのモデルはあなたしか持てません。そしてそのモデルは、普段から深く理解しておかなければ、危機の瞬間に突然生まれたりはしません。
障害対応は普段の理解の残高を引き出す仕事です。普段答えだけ書き写していたなら、危機に引き出す残高がありません。普段理解を積んでおいたなら、危機にその理解があなたを救います。
短い事例 — 同じ症状、異なる結末
具体的な仮想の事例で差を描いてみましょう。あるAPIの応答遅延が突然増えました。普段200ミリ秒だったp99が3秒に跳ね上がりました。二人のエンジニアが同じ症状に直面します。
症状: p99遅延 200ms -> 3s 急増、エラー率は正常
[ 答え収集型の経路 ]
1. 「API latency spike」を検索
2. 一般論(キャッシュ追加、インデックス追加)を試す
3. 効果なし -> また検索
4. 無作為な変更を繰り返し、運に任せる
[ 理解ベースの経路 ]
1. 精神モデル: リクエスト -> コネクションプール -> DB -> 外部API
2. エラー率正常 + 遅延だけ増加 -> 資源枯渇の仮説
3. コネクションプール使用率を確認 -> 100%飽和を発見
4. 原因: 外部APIが遅くなる -> コネクション占有 -> プール枯渇
5. 対応: タイムアウト短縮 + プール隔離(バルクヘッド)
二つの経路の差は知識の量ではなく精神モデルの有無です。理解ベースのエンジニアは「エラー率は正常なのに遅延だけ増えた」という手がかり一つから資源枯渇を疑います。これはコネクションプールという抽象の一層下(プールが枯渇するとどうなるか)を理解しているからこそ可能な推論です。答えだけ集める人にとって、この手がかりはただのもう一つの検索語にすぎません。
興味深いのは、理解ベースのエンジニアもLLMを使うことです。「コネクションプールのバルクヘッドパターンの例を見せて」のように。差は、LLMを仮説検証と実装の加速に使うか、仮説そのものを代わらせるかです。精神モデルがある人にとってLLMは増幅器であり、ない人にとってLLMは松葉杖です。
制御と所有権 — 理解がくれるもの
理解は力だ
深い理解がくれる最大の贈り物は制御(control)と所有権(ownership)です。理解していないコードの上で私たちは常に不安です。何かを変えようとするたびに「これがどこに影響するか分からない」という恐怖が伴います。だから手を出せず、回避し、迂回します。コードが私たちを支配します。
逆に理解したコードの上で私たちは自由です。変更の波及を予測でき、自信を持ってリファクタリングし、大胆に最適化します。コードを私たちが支配します。この差は単なる生産性の差ではなく、仕事で感じる主体性と喜びの差です。
ツールに引きずられない
LLM時代にこの制御の問題はより尖鋭になります。ツールが強力なほど、私たちはツールに引きずられる危険も大きくなります。LLMが提案したコードをそのまま受け入れることが繰り返されると、ある瞬間に私たちは自分のコードベースのハンドルをツールに渡した状態になります。
ツールに引きずられないとは、LLMを使わないという意味ではありません。LLMがくれたものを理解し、批判し、必要なら拒否する能力を保つという意味です。提案を受けつつ、それがなぜ正しいか(あるいは間違っているか)を判断できねばなりません。その判断力は結局、深い理解から来ます。理解がなければ私たちはツールの提案を評価する基準がなく、評価できなければただ従うしかありません。
ツールに引きずられる関係 ツールを使いこなす関係
------------------- -------------------------
提案 -> 無批判に受容 提案 -> 理解 -> 批判 -> 採用/拒否
理解なく統合 理解の上に統合
問題時に無力 問題時に自分で直す
ハンドルを渡す ハンドルを握る
学習としての理解 — 回り道の価値
速い道が常に良い道ではない
理解のもう一つの側面は学習です。何かを深く理解しようと格闘する過程自体が私たちを成長させます。答えを書き写すだけではこの成長の機会を逃します。
ここに微妙な逆説があります。LLMは「速い道」をくれます。ところが学習では速い道が常に良い道ではありません。認知科学には「望ましい困難(desirable difficulties)」という概念があります。適度な困難を経て自分で答えに到達する過程が、答えを即座に受け取るより深く長持ちする学習を作る、というものです。
自分で詰まってみて、仮説を立ててみて、間違えてみて、ついに「なるほど」となる瞬間を経験すること。この回り道こそが理解を作ります。LLMがこの回り道をなくしてくれることは時に祝福ですが、学習の文脈では呪いになり得ます。
意図的に理解を選ぶ
だからLLM時代の学習は意図的な選択を要求します。すべてをLLMに尋ねず、あるものはわざと自分で格闘すると選ぶことです。
実務的な区分を提案します。
LLMに任せてよいもの 自分で理解すべきもの
------------------- -------------------------
- 慣れたボイラープレート - 核心のドメインロジック
- 使い捨てスクリプト - 頻繁にデバッグする領域
- よく知る領域の反復 - 初めて学ぶ技術の基礎
- 文法/API記憶の補助 - システムの精神モデル
すでに理解した領域ではLLMが指の延長になります。速く進んでよいです。しかし初めて学ぶこと、これから深く扱う核心領域では、わざと回り道を選んで自分で理解を積むことが長期的に勝ちます。
チーム次元の理解 — 個人を超えて
理解は個人だけのものではない
ここまで理解を個人の能力として扱ってきましたが、チームでは理解が共有資産になります。一人だけが核心システムを理解していると、その人が休暇に出たり退職したりした瞬間にチーム全体が止まります。これをよくバス係数(bus factor)と呼びます。バス係数が1とは、一人が消えるとシステムが迷宮になるという意味です。
バス係数 1 (危険) バス係数 3+ (健全)
------------------- -------------------------
核心の理解が一人に集中 理解が複数人に分散
その人の不在時に麻痺 誰が抜けても対応可能
知識が頭の中だけにある 文書/ペアリングで外部化
LLMもその文脈を知らない 共有された精神モデルがある
LLM時代にこの問題は微妙に悪化し得ます。各自がLLMと一対一で働くと、コードは生まれてもチームの共有理解は育たないことがあります。以前は詰まったとき隣の人に尋ねて自然に知識が広がりましたが、いまはLLMに尋ねるとその対話が個人の中に閉じ込められます。
理解を外部化する習慣
だからチーム次元では、理解を意図的に外部化する習慣が重要になります。
[ ] 核心システムについて「なぜこう作ったか」を文書に残しているか?(ADRなど)
[ ] ペアリング/コードレビューでコードだけでなく精神モデルを共有しているか?
[ ] LLMとの有用な対話をチームが見られるよう整理しているか?
[ ] 一人だけが知る領域(バス係数1)を識別し分散しているか?
とくに「なぜこう作ったか」を記録することが重要です。コードは「何を」するかは見せますが、「なぜ」そうしたかは見せません。その「なぜ」こそが精神モデルの核心であり、それが消えると後任はコードは読めても理解を失います。良い設計決定記録(ADR)は、未来のチームに理解を引き継ぐ最も確実な方法です。
バランス — いつ抽象に頼ってよいか
すべてを理解することはできない
ここでバランスが重要です。「深く理解せよ」を「すべてを底まで理解せよ」と受け取ると麻痺します。現代ソフトウェアは誰も全体を理解できないほど巨大です。私たちは絶えず抽象に頼らねばならず、それは誤りではなく必須です。
問題は「いつ理解をやめて抽象を信じてよいか」です。いくつかの実用的基準を提案します。
- 頻度: 頻繁に出会い頻繁にデバッグする領域ほど深く理解する価値が大きい。年に一度触る領域は抽象に頼ってよい。
- リスク: 失敗のコストが大きい領域(セキュリティ、決済、データ整合性)ほど理解の価値が大きい。
- 漏れやすさ: 抽象が漏れる頻度が高い領域(性能、並行性)ほど一層下を知る価値が大きい。
- 核心性: 自分の仕事の核心ドメインほど理解すべきだ。周辺部は信頼できる抽象に任せてよい。
深く理解する価値
高い +----------------------------------+
| 核心ドメインロジック | セキュリティ/決済 |
| 頻繁にデバッグ領域 | 性能ボトルネック |
+----------------------------------+
| よく知る反復 | 使い捨てスクリプト |
低い | 安定したライブラリ | 周辺のグルーコード |
+----------------------------------+
低い 高い
抽象に頼ってよい
信頼できる抽象の条件
抽象に安心して頼れる条件もあります。よく作られた抽象は漏れる頻度が低く、漏れるとき明確な信号をくれ、文書とコミュニティがその境界をよく説明します。標準ライブラリ、検証されたプロトコル、成熟したフレームワークがこの類です。こういう抽象の上では毎回底を掘らなくてもよいです。
逆に新しく作った内部抽象、検証されていないライブラリ、頻繁に漏れる性能境界はより深い理解を要求します。バランスの核心は「どの抽象は信じてよく、どの抽象は疑うべきか」を見分ける眼であり、その眼自体も結局、経験と理解から来ます。
LLMと理解の健全な関係 — 増幅器として使う
理解を強調するからといって、LLMを遠ざけよという意味ではありません。むしろ理解が深いほどLLMをより強力に使えます。二つの健全な関係は次のように描かれます。
理解がないとき 理解があるとき
------------------- -------------------------
LLM出力 = 最終的な答え LLM出力 = 草案/仮説
検証不可 -> ただ信じる 検証可能 -> 批判/修正
プロンプトも漠然とする 正確なプロンプトを書ける
間違っても分からない 間違えば即座に気づく
ツールが運転 自分が運転、ツールが加速
核心は、理解がLLMの入力と出力の両方を改善するということです。入力側では、理解が深くてこそ正確な質問を投げられます。「これなぜ動かないの」より「コネクションプールが枯渇したようだが、バルクヘッドで隔離するパターンを見せて」のほうがはるかに良い答えを引き出します。出力側では、理解があってこそ受け取った答えを評価し修正できます。つまり理解はLLMを代替するのではなく、LLMの価値を倍加させる増幅器です。
これが「理解 vs LLM」という構図が間違っている理由です。本当の構図は「理解 + LLM」対「LLMのみ」です。理解を備えた人がLLMを使えば最も速く、理解なくLLMだけ使えば最も危険です。
実務に適用する — 理解を積む習慣
理解は大げさな決意ではなく小さな習慣で積まれます。一日30分ずつ抽象の底を掘れということではなく、普段の流れの中に小さな摩擦を差し込むことです。コードをマージする直前、エラーを検索する直前、その一瞬に「待て、これはなぜこうなのか」と問う習慣一つが、時が経つと大きな差を作ります。日常で実践できる方法を整理します。
[ 一層下を見る ]
[ ] 毎日使う抽象のうち一つを選び、その一層下を理解したか?
[ ] LLMがくれたコードの「なぜ」を最低一度は自分で説明してみたか?
[ 自分で格闘する ]
[ ] 核心領域ではLLMに尋ねる前にまず仮説を立ててみたか?
[ ] 詰まったとき即座に答えを受け取るより、少し自分で推論してみたか?
[ 精神モデルを作る ]
[ ] 自分のシステムのデータフローを紙に描いてみたことがあるか?
[ ] 障害時にどこを先に見るかの精神モデルがあるか?
[ 教えて検証する ]
[ ] 理解したことを同僚に説明できるか? (できなければまだ知らない)
[ ] LLMの説明を受けつつ、自分の言葉で整理し直したか?
とくに最後の項目、「教えて検証する」を強調したいです。何かを本当に理解したか最も確実に検証する方法は、他人に説明してみることです。LLMに説明させることと、自分がLLMや同僚に説明することは正反対の事柄です。前者は答えを受け取ることで、後者は理解を証明することです。
理解を妨げるよくある落とし穴
良い習慣と同じくらい、悪い習慣を知ることも重要です。理解を蝕むよくある落とし穴を整理します。
落とし穴 代わりにすること
------------------------- -------------------------
動いたらすぐ次へ進む なぜ動くのか一度だけ確認する
エラーを丸ごとLLMに貼る まずエラーを自分で読み仮説を立てる
抽象を決して疑わない たまに一層下をのぞく
コピーしたコードを変えず使う 自分の文脈に合わせて書き直す
理解したふりで通す 説明してみて詰まる箇所を確認する
これらの落とし穴の共通点は「いま手っ取り早い道」だということです。だから意志力だけでは避けにくいです。代わりに小さな儀式を作るのが効果的です。たとえば「LLMがくれたコードはマージ前に一文の要約コメントを付ける」という規則は、その一文を書く過程で最低限の理解を強制します。理解は大げさな決意ではなく、こうした小さな摩擦を意図的に設計するところから育ちます。
落とし穴と批判的視点
本稿の主張にも反論があります。バランスのために整理します。
- 理解物神主義の危険: 「すべてを深く理解せよ」という態度が過ぎると生産性を害します。締切のある実務ですべての抽象を底まで掘るのは贅沢かもしれません。理解は目的ではなく、より良い仕事のための手段です。
- 抽象の本質的価値: 抽象は私たちを巨人の肩に立たせてくれます。毎回底から理解しようとすれば人類は進歩しません。適切な無知(productive ignorance)は協業と分業の土台です。
- 理解の幻想: 深く理解したと信じることが実際の理解を保証しません。精神モデルはしばしば間違い、間違った精神モデルはむしろない方がましなほど危険になり得ます。理解は謙虚さと検証を伴わねばなりません。
- 世代とツールの変化: アセンブリを知らない高級言語開発者がかつて批判されましたが、いまは普通です。LLMの上で働く新しい世代が別種の理解(システム合成、検証、評価)を発展させることもあり得ます。「我々の頃は理解した」という郷愁は警戒すべきです。
- 理解と速度のトレードオフ否定の危険: 深い理解が常に正しいという主張は、実際に速い答えが十分に良い無数の状況を無視します。すべてのコードが午前3時の障害の主役になるわけではありません。
- 理解の有効期限: 深く理解しておいたことも技術が変われば古びます。特定のフレームワークの内部を完璧に理解したのに、そのフレームワークが消えれば、その理解のかなりの部分は無用になります。だからある理解は揮発性があり、より根本的な層(データ構造、ネットワーク、OS)ほど長持ちする理解だという点も併せて考えるべきです。
- 個人差無視の危険: 理解が学習に良いという一般論が、すべての人・すべての文脈に同じ強度で当てはまるわけではありません。ある人は速い答えを先に受け取り逆順に理解するやり方のほうがよく合います。「望ましい困難」も大きすぎれば挫折だけが残ります。理解の方法は一つではありません。
これらの反論は妥当であり、本稿の核心主張と矛盾しません。要点は「常に深く掘れ」ではなく「どこを深く掘りどこを抽象に任せるか見分けよ、そしてその見分け自体が理解から来る」ということです。
よくある質問
Q1. LLMが全部やってくれるのに、なぜわざわざ理解するのですか?
LLMが「うまくいく場合」には理解がなくても構いません。問題はうまくいかない場合です。LLMが間違った答えを自信を持ってくれるとき、微妙なバグを仕込むとき、初めて見る障害が起きるとき。そのとき理解はLLMの出力を評価し修正する唯一の基準になります。理解は平時ではなく例外的状況のための保険です。
Q2. すべてを理解しようとすると時間がかかりすぎませんか?
その通りです。だから「すべて」ではなく「一層下」と「核心領域」だけ深く掘れということです。頻度・リスク・漏れやすさ・核心性の基準で選別すれば、理解にかかる時間は無限ではなく管理可能な投資になります。
Q3. ジュニア開発者にも同じ助言は有効ですか?
とくにジュニアにこそ重要です。キャリア初期は精神モデルの土台を築く時期です。このときLLMにすべてを依存すると、土台なく出力だけ組み立てる習慣が固まります。ジュニアほどわざと回り道を選んで自分で格闘する割合を高めることが長期的に勝ちます。
Q4. 理解と速度、両方を取ることはできませんか?
長期的には理解が速度を作ります。短期には理解がコストのように見えますが、理解した領域ではデバッグと変更がはるかに速くなるので、時が経つほど理解が速度に転換されます。二つは短期にはトレードオフ、長期には同じ方向です。
Q5. 「理解した」ことをどう確認しますか?
説明してみるのが最も確実です。同僚に、あるいは空の画面に文章で説明してみてください。詰まる地点がすなわちまだ理解していない地点です。これがよく言う「ラバーダック・デバッグ」が効果的な理由でもあります。
おわりに — 理解という喜びを守る
LLMはエンジニアリングの多くを変えます。答えに到達するコストは劇的に下がりました。しかし答えと理解は依然として違うものであり、理解がくれるもの — 制御、所有権、危機対応力、そして仕事で感じる深い満足 — はLLMが代わりにはくれません。
整理すると次のようになります。
- 答えは揮発性が高く、理解は転移します。LLM時代の危険は、答えに到達するコストが0になることで理解を飛ばす誘惑が大きくなることです。
- 抽象は漏れます。毎日使う抽象の一層下を知るだけで、危機の瞬間にうろたえません。
- 精神モデルは検索されません。障害対応は普段の理解の残高を引き出す仕事です。
- 理解は制御と所有権をくれ、ツールに引きずられないようにします。LLMを使いこなしつつ引きずられないには判断力が、その判断力には理解が必要です。
- しかしすべてを理解することはできません。頻度、リスク、漏れやすさ、核心性を基準にどこを深く掘るか見分けることが本当の知恵です。
理解する喜びは効率の反対側にある贅沢ではありません。それは私たちがツールを使いこなす主体であり続けられるようにする根本能力であり、この仕事を愛する理由そのものです。LLMがより強力になるほど、逆説的にその喜びを意識的に守ることがより重要になります。
最後に一つの実践を提案して本稿を締めくくります。次にLLMがコードをくれたとき、それをそのままマージする前に、たった一つだけ自分に問うてみてください。「このコードがなぜ動くのか、そしてどんな場合に壊れるのか、自分は説明できるか」。この問いに「はい」と答えられるなら、速く進んでよいです。「いいえ」なら、そここそ少し立ち止まって理解を積むべき地点です。
この小さな問い一つが、答えだけ集める人と理解を積む人を分けます。そして時が経つと、その問いを投げ続けてきた人だけが午前3時の障害の前で落ち着いていられ、ツールの提案を批判でき、自分のコードの真の主人であり続けられます。理解は遅い道のように見えますが、結局最も遠くまで行く道です。
参考資料
- GeekNews — 理解する喜び(the joy of understanding)に関する議論
- Hacker News
- Joel on Software — The Law of Leaky Abstractions
- Peter Norvig — Teach Yourself Programming in Ten Years
- Desirable difficulty (学習の認知科学)
- Julia Evans (b0rk) — Debugging and mental models
- The Pragmatic Programmer (Hunt and Thomas)
- Dan Luu — Files are hard (抽象の向こうの複雑さの事例)