AIコーディング時代における人間の本当の仕事
GitHub Copilotを使い始めて数ヶ月。確かにコードを書く速度は上がった。でも、仕事の本質が変わったかというと、そうでもない。
AIが変えたのは「作業の効率」で、「仕事の本質」は変わってない。むしろ、AIが普及したからこそ、人間がやるべきことがはっきりしてきた。それは「何を作るか」を決めることだ。
仕様提案と仕様を固めることの重要性
使ってみて分かったのは、AIコーディングで一番大事なの は「仕様を提案して固める能力」だということ。
昔は曖昧な要件から始めて、実装しながら詰めていけた。でもAIだとそれが通用しない。曖昧な指示を出すと、曖昧なコードが返ってくる。
ログイン機能を作るにしても、認証方式、セッション管理、エラーハンドリング、セキュリティ要件。これ全部決めてから指示しないと、使えるコードは生成されない。
で、その仕様を決めるには、ビジネス要件の理解、技術的なトレードオフの判断、セキュリティリスクの評価、将来の拡張性の考慮が必要になる。これ全部、人間がやる仕事。
もっと言うと、仕様を「提案」する能力が重要。顧客から「ログイン機能がほしい」って言われたとき、そのまま作るんじゃなくて、最適な認証方式を提案して、セキュリティ要件を説明して、選択肢とメリデメを示す。これができて初めて、ちゃんとした仕様が固まる。
AIを使うなら、むしろ従来以上に明確な仕様提案と確定が求められる。
設計フェーズは短縮できない
色々な規模のシステムをAIで作ってみて分かったこと。実装は速くなるけど、設計の時間は変わらない。
CRUD APIを作る場合、AIなしで4時間かかってたのが1時間半になった。60%短縮。でも内訳を見ると、設計の30分は変わってない。短くなったのはボイラープレート、テストコード、ドキュメント。要するに「決まったことを形 にする」部分だけ。
認証システム全体だと、設計2時間+実装8時間が、AIを使っても設計2時間+実装4時間。実装は半分になるけど、設計は変わらない。
大規模なマイクロサービスになると、もっと顕著。設計に1週間かかるものは、AIを使っても1週間かかる。下手すると、AIのコードをレビューしたりデバッグしたりで、自分で書いた方が早いこともある。
AIが苦手な領域
AIが得意なのは、パターンがはっきりしてる作業。ボイラープレート、型定義、テストケース、ドキュメント。「お決まりの形」があるやつは精度高く生成できる。
逆に苦手なのがビジネスロジック。在庫管理システムの受注処理とか。在庫の引当、予約、キャンセル、返品、自動発注。これら全部が絡み合って、タイミングで挙動が変わる。どの順で処理する?トランザクションどこで切る?エラー時のロールバックは?
こういう判断には、ドメイン知識が必要。在庫切れの定義って何?予約と確定の違いは?キャンセルはいつまで可能?これ全部、プロジェクトごとに違うし、AIには判断できない。
つまり、AIは「HOW(どう実装するか)」は支援できるけど、「WHAT(何を実装するか)」は決められない。その「WHAT」を決めるには、要件整理して、仕様提案して、関係者と合意形成する能力が必要になる。
セキュリティとパフォーマンスの判断
もっと深刻なのが、セキュリティとパフォーマンス。AIは平気でSQLインジェクションのリスクがあるコードを書くし、非効率なアルゴリズムも生成する。「動く」けど「本番で使える」わけじゃない。
ユーザー検索機能を実装させたとき、全ユーザーをメモリに読み込んでJavaScriptでフィルタリングするコードが出てきた。ユーザーが少ないうちはいいけど、数万人規模になったら破綻する。データベース側でインデックス使って検索して、必要な列だけ取得して、件数制限する。この判断は、システム全体のアーキテクチャを理解してる人間にしかできない。
だから、セキュリティ要件やパフォーマンス要件も、実装前に仕様として固める必要がある。レスポンスタイムは何秒?同時アクセスは何人想定?セキュリティ対策のレベルは?これを明確にして初めて、AIに適切な指示が出せる。
エッジケースへの対処
AIがもう一つ苦手なのが、エッジケース。例外的な状況への対処。
ファイルアップロード機能を作らせると、基本的なケースは書いてくれる。でも、ファイルサイズが上限超えたら?サポート外の形式だったら?同名ファイルが既にあったら?アップロード中にネットワーク切れたら?
こういうエッジケースを全部洗い出して、それぞれの対処方法を決めるのは人間の仕事。AIは指示されたケースには対応するけど、網羅的に想定はできない。
実際、本番で問題になるのは大体このエッジケース。基本機能は動いても、想定外の入力や状況で壊れる。エッジケースを想定するには、ドメイン知識と経験が必要。
レビューと責任
AIが生成したコードをそのまま本番に投入して障害が起きたら、誰が責任取るの?
答えは簡単。レビューせずに投入した人間が責任を取る。AIは責任取れないから。だから、AIが生成したコードを理解して、レビューして、必要なら修正する能力が求められる。
レビューができるってことは、自分でも書けるってこと。コード読めない人はレビューできないし、アーキテクチャ分かってない人は設計レビューできないし、セキュリティの知識がない人は脆弱性を見抜けない。
結局、AIを使いこなすには、従来のプログラミングスキルが全部必要。AIは作業を効率化するけど、スキルの代替にはならない。
学習曲線への影響
AIツールが普及して心配なのは、若手エンジニアへの影響。
初心者がAIに頼りすぎると、基礎を学ぶチャンスを失う。なんで動くか分からないままコピペして、エラー出たらまたAIに聞いて。これじゃ本質的な理解は深まらない。
逆に、ちゃんと使えばAIは優秀な学習ツールになる。分からないコードの説明を聞けるし、複数の実装方法を比較できるし、ベストプラクティスも学べる。効率的に実験もできる。
大事なのは、AIを「考えることを代替するツール」じゃなくて、「学習を加速するツール」として使うこと。
人間とAIの役割分担
数ヶ月使ってみて、こういう役割分担がベストだと感じてる。
人間がやるべきなのは、要件理解、設計、アーキテクチャ決定、技術選定、トレードオフ判断、セキュリティ検討、パフォーマンス最適化、エッジケース想定、コードレビュー、そして最終的な責任。
AIが手伝えるのは、ボイラープレート生成、型定義補完、テストケース作成、ドキュメント作成、リファクタリング提案、既存パターンの適用。
この役割分担を理解せずに、AIに全部任せようとすると失敗する。逆に、ちゃんと理解して使えば、生産性は確実に上がる。