- 効果的なソフトウェアエンジニアは、要件とコードについての明確なメンタルモデルを構築・維持し、それを反復的に比較・更新するループを回している
- LLMはコードの作成や修正、テストの作成、デバッグなどは可能だが、正確なメンタルモデルの維持能力が不足しているため、複雑な作業では混乱しやすい
- 現在のLLMには、コンテキスト欠落、新近性バイアス、ハルシネーションの問題があり、コードと要件の差分を正確に把握して適切に修正することに限界がある
- 人間は状況に応じて全体の文脈を一時的に保持したり、細部を一時的に隠して大きな全体像を見るなど柔軟に思考を切り替えられるが、LLMはそれを実現できていない
- LLMは要件が単純な作業には有用だが、複雑なソフトウェア開発では、最終的にソフトウェアエンジニアが要件の明確さとコードの動作に直接責任を負う必要があり、LLMは補助ツールの役割にとどまる
ソフトウェアエンジニアリングのループ
- 熟練したエンジニアは、次の手順を繰り返しながら作業する
1. 要件のメンタルモデルを構築する
2. そのモデルに合わせてコードを書く
3. 書いたコードが実際に何をしているかを理解する
4. 差分を特定してコードまたは要件を修正する
- このループの核心は、正確で維持可能なメンタルモデルを保有する能力にある
LLMの限界
- LLMは、コードの作成、問題の特定後の修正、テストの作成・実行、ロギングの追加、デバッガの使用などの機能を実行できる
- しかし、メンタルモデルを維持できないため、次のような問題が発生する
- 自分が書いたコードはうまく動くはずだと仮定する
- テストが失敗した際、コードとテストのどちらを直すべきかを推測に頼る
- 混乱するとコード全体を削除して最初から書き直す
- 人間と違って、テスト失敗時にモデルを点検して修正の方向を決めたり、行き詰まったときに対話を通じて問題を解きほぐしたりする柔軟性に欠ける
- ソフトウェアエンジニアは作業の途中でテストを実行し、問題が起きたときにどの部分を修正すべきかを明確に判断できる
- ときには作業全体をやり直す場合でも、問題に対する理解度がより深まる結果につながる
今後の可能性
- 今後モデルがさらに発展すれば変わる可能性はあるが、ソフトウェアエンジニアリングは単なるコード生成以上のものを要求する
- 人間は重大な問題を解決するとき、全体の文脈を一時的に記憶から取り出して扱い、個別の課題に集中したり大きな全体像を見たりできる
- コンテキスト情報をただ増やし続けるのではなく、必要な情報を選択的に扱う思考様式が重要である
- 人間のように文脈を一時保存・復元したり、全体像と細部を行き来しながら思考したりする機能がLLMには欠けている
- 現在のLLMの主な制約
- コンテキスト欠落(Context omission): 必要な情報が抜けている箇所をうまく見つけられない
- 新近性バイアス(Recency bias): コンテキストウィンドウ内で最新の情報に過度に偏る
- ハルシネーション(Hallucination): 存在しない細部を作り出す
- メモリ機能が追加されれば一部は改善できる可能性があるが、複雑さが一定水準を超えると、なお文脈理解とモデル維持には失敗する
- 2つの似たメンタルモデルを維持しながら差分を分析し、要件またはコードのどこを修正すべきかを決める機能が不足している
現在の役割と活用
- LLMは高速なコード生成と要件・文書の統合に強みがあり、単純で明確な作業には十分活用できる
- しかし、単純ではない問題では十分な文脈維持と反復的な改善が難しい
- したがって、要件の明確化、コードの検証などは依然としてソフトウェアエンジニアの責任である
- 人とエージェント(LLM)が一緒にソフトウェアを作る環境を目指してはいるが、現時点ではエンジニアが主導し、LLMはツールとして活用すべきである
まだコメントはありません。