概要
- ソフトウェアエンジニアの面接経験 から、効果的なエンジニアの特性を考察
- 優秀なエンジニアは明確なメンタルモデルを維持 できる点が特徴
- LLM(大規模言語モデル)はコード生成は得意 だが、メンタルモデル維持は苦手
- 現状のLLMは複雑な文脈管理や問題解決が困難
- エンジニアが主導し、LLMをツールとして活用する重要性
ソフトウェアエンジニアの本質的な役割
- 要求仕様のメンタルモデル構築 が最初のステップ
- そのモデルに基づくコード記述 が次の作業
- 実装後、コードの動作を正確に把握するメンタルモデル構築 が必要
- モデルと実際のコードの差異を特定し、修正または要求仕様の見直し を実施
- 優秀なエンジニアはこれらのループを的確に繰り返す能力 がある
LLMの現状と限界
- LLMはコード生成や修正が得意、問題点の指摘があれば改善も可能
- テスト作成、ログ追加、デバッグなども実施可能
- しかし、明確なメンタルモデルの維持ができない という根本的な課題
- 自分が書いたコードが正しいと仮定しがち、テスト失敗時の判断も曖昧
- 混乱時には全てを削除してやり直す傾向、本質的な問題解決から遠ざかる
エンジニアとLLMの違い
- エンジニアはテスト結果からコードと要求仕様のどちらを修正すべきか判断 可能
- 問題発生時は一時的に文脈を保持し、必要な情報に集中 できる
- 全体像と細部を自在に行き来し、効率的な問題解決 が可能
- LLMはコンテキストウィンドウの拡大だけでは人間のような柔軟な思考ができない
LLMの技術的課題
- 文脈の省略検出が苦手 (Context omission)
- 直近の情報に偏る傾向(Recency bias)
- 存在しない情報を生成するハルシネーション(Hallucination)
- これらは今後の技術進化で克服可能と期待されるが、現時点では限界
LLMの活用とエンジニアの責任
- LLMは要件整理やドキュメント作成、単純なコード生成に有用
- 複雑な課題や反復的な改良には人間の文脈管理能力が不可欠
- エンジニア自身が要件の明確化とコードの正当性担保を担う必要
- Zedでは人とエージェントの協働を重視
- 現状ではエンジニアが主導し、LLMは補助的なツールとして活用する姿勢が重要