はじめに
この記事はCLI型のAIを使いこなせていなかった私の軌跡を振り替えながら、学んだこと、気づきを確認しながらAI駆動開発の考え方や実践の仕方を解説することを目的としています。
この記事の目的
- AI駆動開発を実践できるようになること
- AI駆動開発を行う際の注意点を確認すること
想定される読者
- 職業としてエンジニアをしている人
解説すること
- AI駆動開発でAIを暴走させずに優秀な部下として扱う方法
解説しないこと
- モデル間の比較や詳細
私がCLI型AIを使いこなせなかった頃
※ 私がAI駆動開発について理解を得る前の話です。読み飛ばしてもOKです。
私が生成AIを本格的に使用し始めたのは、2024年に新卒でエンジニアになってからでした。
エンジニアリングの学習を始めたのは2020年からで、それまではAIを使わずに自力でコードを書いたり、設計したりしていました。いわゆる旧来の「ググって解決する」手法ですね。
もちろん、それまでにも多少ChatGPTなどを使った経験はありましたが、ちょっとした調べ物をする、興味本位で触ってみる、程度でした。
私がAIに飛び付かず、それまで自力実装を試みていたのには理由があります。
→ 「AIを使うと自分が成長しなさそう」
これにつきます。
これについては現状、半分正解で半分不正解だと感じています。後ほど振り返りの際に触れてみたいと思います。
さて、2024年から本格的にAIを使い始めた私ですが、当初はGUI型のLLMが中心で、Claude CodeのようなCLI型は使用していませんでした。理由は単純で、使いこなせなかったからです。
CLI型はプロジェクト全体を対象にタスクを実行できる一方で、変更箇所が非常に多くなりがちで、中身が分からない状態で開発し続ける体験に違和感を覚えていました。
AIを暴走させていたということですね。
最近までCLI型AIの使い道といえば、プロジェクト全体から指定の処理を探してきてもらったり、複雑なコードの説明をしてもらう程度でした。
バイブコーディングとは?
みなさんバイブコーディングを聞いたことがあるでしょうか。
バイブコーディングとは自然言語を使用して全てAIに開発させる開発手法です。
以下の特徴がります。
- 設計は後回し or しない
- 動いたらOK
- 人間は自然言語で開発する
- AIに全てを託す
- 非エンジニアでも可能
スピードが最優先で試作向きです。 一方で設計も含めてAIに全部丸投げして、途中のコードの確認もほぼ行われないため、大きなものを作ろうとするとAIのコードにAIのコードが重なっていき、気づいた頃には全体を把握するのが難しくなります。
この特徴から非エンジニアでも可能であり、近年SNS上で非エンジニアでバイブコーディングを使ってサービス開発をしている方をよくみるようになりました。(個人的な感想です)
AI駆動開発とは?
ではAI駆動開発とは何でしょうか。
設計・意思決定は人間が担い、実装・定型作業をAIに委ねる開発スタイルです。
この設計・意思決定は人間が行うという点がバイブコーディングとの違いです。
この特性上開発者はエンジニアのような専目的な知識が求められます。
AI駆動開発は何が良いのか
AI駆動開発はAIによる無秩序なコード生成が行われないため、商用レベルのプロダクトでも、保守性を保ったまま高い開発生産性を発揮できるのが良い点です。
AI駆動開発で必要な3つのこと
思考は人間が行う
以下のような設計フェーズは人間がプロジェクトの要件や、今後の保守性、チームの特性などを加味して自身が中心になって行います。
- アーキテクチャ
- 責務分割
- データ構造
実装とテストはAIに任せる
以下のような作業はAIに任せます
- ボイラープレート
- CRUDの実装
- テストの作成
出力は必ずレビューする
- 意図と合っているか
- 将来変更できるか
- 境界が壊れていないか
AI駆動開発の具体的なステップ
AI駆動開発で実際に機能開発する際の流れを確認してみます。
※ 流れだけを明示するために簡易的に行います。
お題
テストの合計点を表示するアプリを考える。
1 処理の流れを考える
- ユーザーのテストデータを取得する
- 計算処理関数に渡す
2 メソッドや作成するファイルを考える (設計)
type TestData = {
subject: string;
score: number;
}
const main = () => {
}
const getTestData = (user_id: number): TestData[] => {
}
const sumTestScore = () => {
}
3 AIに中身を実装してもらう
4 レビュー
このように処理の流れ、設計(メソッド分けや必要ファイルの考察)を行い、実際の実装はAIにしてもらう流れになります。
どこまで人間が決めるか、どれほど詳しく決めるのかは、実装する内容に依存します。
このフローで開発することで、保守しやすい設計を保ったまま開発効率を上げることができます。
AIを使うことでエンジニアは成長しなくなってしまうのか
ここで先に挙げた話題に戻ります。
以前「半分正解、半分不正解」と述べましたが、現在は以下のように考えています。
- 未経験エンジニア、もしくはコードを書く経験が少ない場合は成長を鈍化させる可能性がある
- ある程度のコーディング経験がある場合は、AI駆動開発が適している
数年経験を積むと、要件や設計が明確な問題については、ある程度スムーズにコーディングできるようになります。
この作業は「ひらがなで書かれた文章をカタカナに書き写す作業」に近いと言えるでしょう。
※ もちろん書き方の細かな違いはありますが、本質的な差ではないと考えています。
エンジニアが日々頭を悩ませるのは、コーディングそのものよりも、要件の適切な把握や、将来の保守性を考慮した設計、複数ある選択肢の中からどれを採用するかという技術調査や意思決定です。
単に言われた通りにコーディングできる人材よりも、「何をすべきか」「どう実現すべきか」を判断できることが求められます。
未経験・微経験の段階では、コードを読む力を身につけるためにも、ある程度は自力でコードを書くフェーズが必要でしょう。
一方で、一定の経験を積んだエンジニアは、AI駆動開発によってより重要な設計に集中できます。
疑問:自力でコーディングを続けることで得られる気づきは、AI駆動開発では失われないのか?
これは私自身が以前抱いていた疑問です。
結論から言うと、その心配は無用だと考えています。
経験を積むと、「この処理ではこの書き方をする」という自分なりの型が固まってきます。人間は反復する作業を無意識に効率化する生き物であり、結果として慣れた書き方しか使わなくなりがちです。
それよりも、AIが書いたコードをレビューする過程で新しい発見を得たり、定期的に公式ドキュメントを振り返って便利なメソッドを再確認する方が、効率的だと感じています。
AIネイティブ世代はすぐそこ
今後はAIをフル活用して爆速でコーディングをするのが当たり前の世代が増えていくでしょう。
AIに頼らず自力でコーディングする姿勢は、一見すると地道で技術力が高そうに見えるかもしれません。しかし、AIを適切に使うエンジニアとの差はアウトプット速度として明確に表れます。
どちらが事業の成長に貢献できるのかを見極め、自分をアップデータしていきたいですね。
おわりに
ここまで、私自身の実体験を振り返りながら、AI駆動開発についていくつかの考えを共有してきました。
内容を整理すると、以下のようになります。
- 未経験・微経験のうちは、まず自力でコードを書く訓練を積むことが重要
- ある程度慣れてきたら、AI駆動開発によって開発速度を高めつつ、設計や意思決定に集中する
- AI駆動開発は、今後のソフトウェア開発におけるスタンダードになり得る
AIを使うか使わないかではなく、どう使い、どこに人間の価値を置くのかが、これからのエンジニアに問われていくと感じています。
自分なりの付き合い方を見つけながら、技術と向き合っていきたいですね。
余談
最近、自社のエンジニアとAI駆動開発について話す機会がありました。
現状では、AIが書いたコードをエンジニアがレビューする形が一般的ですが、AIの進化によって、いずれそのレビューすら不要になる未来が来るかもしれません。
それが良いか悪いかはひとまず置いておくとして、そのような開発手法を取るエンジニアが増え、実際に成果を出していくのであれば、それが「正解」として受け入れられていくのでしょう。
一方で、現役のエンジニアほど「仕組みの分からないもの」を使うことに抵抗を感じがちです。
しかし、そうした意識そのものを乗り越えなければならない日が、意外と近くまで来ているのかもしれません。