結局エンジニアは学び続けないといけない

# はじめに

最近、コーディングの世界が大きく変わってきています。Generative AIの台頭により、もはやコードの仕組みを深く理解していなくても、プロンプトを書けば動作するコードが手に入る時代になりました。このノリでコーディングすることを、元OpenAI研究者のAndrej Karpathy氏は「Vibe Coding(バイブコーディング)」と呼びました。
このアプローチは従来のプログラミングパラダイムを根底から覆し、まさに今、業界全体のコーディング手法が変わってきていると思っております。
今回はVibe Codingのメリット/デメリット、そしてそれを支えるための必要なスキル、そしてそのスキルを身につけるための学習方法について紹介していきます。
主観的な内容が多いので不快に感じられた方はすみません。

## Coding Agentの対応による、Vibe Coding時代の幕開け

Vibe Codingの登場で、プロトタイプやデモの作成が劇的に素早く、簡単になりました。「Vue.jsでシンプルなカウンターアプリを作って」と指示するだけで、数秒後には動くコードが目の前に現れます。

そして、Vibe Codingが適しているユースケースは以下だと考えています。

- プロダクトのアイデア検証フェーズ
- MVP(Minimum Viable Product)の迅速な構築
- プログラミング初心者の挫折防止(まさにVibe)
- 複雑なアルゴリズムや難解なライブラリの実装支援

上記のようなケースにおいて、正しくステップ(適切なプロンプトを投げれば)を踏めば、自分の理解を超えたコーディングも出来てしまいます。

ただし、Vibe Codingで楽しく開発が出来るのは、Vibe Debugが始まるまでと皮肉られています。
> "Vibe coding is all fun and games until you have to vibe debug"

[参照: Will the future of software development run on vibes?](https://arstechnica.com/ai/2025/03/is-vibe-coding-with-ai-gnarly-or-reckless-maybe-some-of-both/)

## 昨今のAIとコーディングの関係

昨今のGPT-4、Claude、GeminiなどのLLMは、すでにハルシネーションが少なく、かつエージェントとして質の高いコードを生成可能になりました。
下記のような特徴があります。

**多様なプログラミング言語を自在に扱い、**
**フレームワークやライブラリの使い方を理解し**
**APIの連携やデータベース操作も難なくこなし**
**コードの最適化やリファクタリングまで可能**

(もちろんプロンプトが曖昧だと結果も安定しませんが)


特に注目すべきはGitHub Copilot、Cursor、 Cline、 WindsurfのようなCoding Agentの普及です。これらはリアルタイムでコード補完や提案を行い、開発者の生産性を大幅に高めていると言われています。

# Vibe Codingの良し悪し

Coding Agentの普及によりプログラミングに対してのパラダイムシフトが起き始めていると言っても過言ではないと思います。
いわゆるVibe Codingによって、プログラミングの敷居が格段に下がったのは間違いないと思います。
技術的知識がなくても「こんなものを作りたい」という意図を伝えるだけで、動くコードが生まれます。アイデアの検証が格段に速くなり、プロトタイピングが驚くほど簡単になったと思います。
ただし、メリットとデメリットがあるのでそれをまとめていきたいと思います。

## メリット

### 1. 開発スピードの劇的な向上

従来なら数日から数週間かかっていた機能開発が、AIの力を借りれば数時間で完成することもザラになってきました。特にCRUD操作やUI要素の実装など、パターン化された部分はAIが得意とするところだとものの数秒で動くモノが出来てしまうようになりました。

### 2. 初心者の壁を低くする

コーディング経験が浅い人でも、AIの力を借りれば実用的なアプリが作れるようになりました。「アイデアはあるけどコードが書けない」という壁が低くなり、多様な背景を持つ人々がテクノロジー創造に参加できるようになっていると考えられています。

### 3. シニアの生産性も向上

経験豊富なエンジニアにとっても、Coding Agentは大きな武器となっています。シニアエンジニアは以下のような形で生産性を向上させています

#### a. ボイラープレートコードの自動生成

定型的なコード（設定ファイル、CRUD操作、バリデーションロジックなど）をAIに任せることで、より創造的で複雑な問題解決に集中できるようになりました。

#### b. ドキュメント作成の効率化

コードのドキュメント化やAPIリファレンスの作成など、必要だが時間のかかる作業をAIが支援することで、質の高いドキュメントを短時間で作成できるようになりました。これにより、チーム全体の生産性も向上しています。ドキュメントのメンテナンスは開発に追いつくことが出来ず、おろそかになりがちですが、AIによる自動生成で簡単に仕様書を作成することもできます。

#### c. 新技術の学習曲線の短縮

新しいフレームワークやライブラリを学ぶ際、AIが実用的なサンプルコードを提供することで、学習時間が大幅に短縮されています。「ドキュメントを読むだけでなく、実際のユースケースに基づいたコード例をすぐに得られる」という利点もあります。
特にCursorのようなAI Editor内で使用出来る、**@doc**は非常に強力でドキュメンテーションのURLを登録しておくだけで、Indexを貼って簡単に対話ベースで新技術のキャッチアップが可能になります。

#### d. コードレビューの質と速度の向上

AIを活用したコードレビューツールにより、基本的なコーディング規約やバグの検出を自動化し、人間のレビュアーはより高度な設計の問題や最適化に集中できるようになりました。これにより、レビュープロセス全体の質と効率が向上したと思います。(Codium AgentやGithub Copilot等)


とはいえ、この手軽さには落とし穴もあります。特に気をつけるべきなのは以下の点だと思います。

## デメリット(課題・危険性)

### 1. 表面的な理解で終わるリスク

AIが生成したコードをそのまま使うだけでは、表面的な理解にとどまり、ソースコードを読まなければ、技術的成長が見込めないと思います。
その背後にある設計思想や動作原理を理解していなければ、カスタマイズや拡張が必要になった時に行き詰まる可能性があります。(より高度なタスクに移行していくにつれプロンプトの明確さも重要となるため)

### 2. 技術的負債が溜まりやすい

AIに頼りすぎると、「なぜそのコードが動くのか」より「とにかく動けばいい」という思考に陥りがちです。
これは長期的には技術的負債となり、保守コストの増大やシステムの硬直化にもつながると思います。
気がついたらチーム内で誰もソースコードを理解していないブラックボックス化となる可能性も持っています。

### 3. セキュリティとコンプライアンスの落とし穴

AIは時として、セキュリティの脆弱性を含むコードを生成することがあります。
AIが生成したコードには、以下のようなセキュリティリスクが潜んでいることもあります。

#### a. 古いセキュリティプラクティスの採用

AIモデルは過去のコードベースから学習しているため、最新のセキュリティベストプラクティスに対応していないコードを生成することがあります。例えば、非推奨の暗号化アルゴリズムや、既知の脆弱性を持つライブラリのバージョンを使用するコードが生成されることもあります。

#### b. 認証・認可の不備

AIは認証や認可のロジックを生成する際に、セキュリティホールを作り出してしまうことがあります。特に複雑なアクセス制御が必要なシステムでは、AIが生成したコードだけでは不十分なケースが多いです。

#### c. 機密情報の取り扱いミス

データの暗号化や機密情報（APIキーやパスワードなど）の安全な保管方法について、AIが不適切な実装を提案することがあります。これらは情報漏洩のリスクを高めます。

## 生成コードへの責任

AIが生成したコードであっても、それを実際のプロダクトに組み込み、ユーザーに提供する責任は我々エンジニアにあると思います。
セキュリティの脆弱性、パフォーマンスの問題、ビジネスロジックの誤りなど、生成コードに潜む問題を見つけて修正できるのは、そのコードを理解できるエンジニアだけです。

### コード品質の見極め方

開発チームでは、AIが生成したコードにも従来と同じ厳格なレビュープロセスを適用すべきだと思います。レビューでは次の点をチェックするといいと思います。

1. セキュリティ: インジェクション攻撃、XSS、権限管理の不備などの脆弱性はないか
2. パフォーマンス: 無駄なループ、非効率なアルゴリズム、メモリリークなどの問題はないか
3. スケーラビリティ: 負荷増大時にも正常に機能するか
4. 保守性: コードは理解しやすく、将来の変更に対応できる柔軟性があるか
5. ビジネスロジック: 業務要件を正確に満たしているか

コードの良し悪しを判断するには、使用している技術やフレームワークへの理解が不可欠です。
とはいえ、こういった点もAIをうまく活用すれば回避も出来ると思います。

## 学習し続ける必要性

これまで、Vibe Codingに関してメリット/デメリットを記載していきましたが、Coding Agentの台頭によりコーディング作業は効率化されますが、エンジニアとしての学習の必要性はむしろ高まっていると思います。

### 技術の基礎理解・専門分野への理解

AI生成コードの品質を適切に評価するには、その基盤となる技術への深い理解が必要だと思います。
ハルシネーションが起きていないかはもちろん、要求どおりにコードが生成されたとしても、その評価が出来なければ品質は保証出来ないと言えると思います。
フレームワークへの理解、データベースのチューニングやネットワークプロトコルの最適化など、基礎知識だけでなく、専門知識はエンジニアの重要な武器であり続けると思います。

### AI最新動向のキャッチアップ

すでにAIを活用して一部を任せるような使い方からAI同士の連携を強めていく動きがここ数ヶ月で活発になっています。
MCP(Model Context Protocol)やGoogleが発表したA2A プロトコル、そしてAI Agent作成ライブラリとしてGoogle ADK(Agent Development Kit)等が発表され、すでに誰でもAI Agentを作成することができる時代が来たと思います。
また、LLMやAI Agentについても毎月、毎日のように進化・新しくリリースされるなど、数ヶ月前に出た情報はすでに古くなっている、ということが今まさに起きていると思います。

### 問題解決力の価値は不変

複雑な問題に直面した時、AIは部分的な解決策を提案できても、問題の本質を理解し最適解を導く能力はエンジニアに求められると考えられています。
特にビジネスドメインの知識と技術的専門性を組み合わせた判断は、AIだけではまだ難しいと思います。

## エンジニアの新たな役割

AIの進化に伴い、エンジニアの役割も変わってくると考えています。
コードを書くことより、以下のスキルがより重要になってきているのではないかと感じています。(あくまで個人的な見解のためあしからず)

### システム設計と全体アーキテクチャ

AIはコンポーネントレベルのコードは上手く生成できますが、システム全体のアーキテクチャを設計する能力は限られていると思います。
ビジネス要件からシステム設計への変換、適切な技術スタックの選定、スケーラビリティを考慮したアーキテクチャ設計は、まだまだ必要であると考えています。

### コード評価とレビュー

前述の通り、AI生成コードを評価し品質を判断する能力は、これからのエンジニアに不可欠なスキルだと思います。パフォーマンス、セキュリティ、保守性、拡張性などの観点から総合的に評価できるエンジニアの価値はまだまだ高いと思います。
ただ、数年で、コードレビューも必要ではなくなるぐらい、AIによるレビューの精度・質も高まるのかなとも思っています。


### ドメイン知識とビジネス理解

技術知識と並んで、ビジネスドメインへの理解を持つエンジニアの価値も高まっていると思います。
AIがコードを生成するには正確な要件提示が必要ですが、その要件をビジネスニーズから適切に導き出せるのはドメイン知識を持つエンジニアだと思います。

# AIを活用した効率的な学習

生成AIは学習ツールとしても強力です。上手く活用すれば、学習効率を大幅に向上出来ると考えています。
次は、AIを活用した学習テクニックを紹介します。

## AIを活用した学習テクニック

### 概念理解を深める

AIは複雑な技術概念を色々な視点から説明できるため、学習ツールとして非常に有用だと思います。
「Reactのフックの仕組みを説明して」と質問すれば、初心者向けの基本から内部実装の詳細まで、自分のレベルに合わせた説明を要求することも出来ます。
特に初学者の方には、生成されたコードを理解する際に重宝する使い方だと思います。

### 実践的なコード例で学ぶ

「ReactのuseEffectを使ったデータフェッチングの例を示して」といった指示で、AIに実用的なコード例を生成させられます。
このコードを分析し、変更を加えて動作を確認する実践的な学習法は、技術記事を読むよりも有用かもしれません。
百聞は一見に如かず、手を動かしてコードを書くことで理解が深まると思います。


### コードレビューとフィードバック

自分のコードをAIにレビューしてもらえば、改善点や最適化の余地が出てきます。
レビューやフィードバックを求める際は、先程述べた、コード品質の見極め方、の観点で質問をすると良いと思います。
ただし、アーキテクチャに対してのレビューは現時点ではまだまだ精度が低いと考えてます。

## AIを活用した学習の注意点

AIを学習ツールとして活用する際にも、いくつかの制約や注意点があるとされています

### 最新情報には弱い

こちらはWeb検索やDeep Researchの登場によって幾分改善されていますが、そもそもLLMにはCut Offがあり、最新の情報を持っていないことが往々にしてあります。
特にIDE上では、ライブラリのバージョンが古いことはよくあります。(npmのパッケージは結構古いバージョンを参照していたりします。)
きちんと自分でライブラリのバージョンを調べることも大切です。

### 実践経験の代わりにはならない

AIからの情報収集だけでは、実際のプロジェクトで発生する予期せぬ問題への対応力は養われない部分なんじゃないかなと思っています。
技術知識と実践経験は別物であり、後者は実際のプロジェクト参加でしか得られないことが多いと思っています。

# まとめ

Vibe Coding、Coding Agentの時代において、エンジニアの役割は単なるコード作成者からコード評価者、全体設計の専門家へと移りつつあるのではと考えています。
しかし、この転換期にも変わらないことは、エンジニアとして学び続けることだと思います。

最後にこの記事を作成するにあたり、同じようなことを先日イベントでお話しましたので資料をおいておきます。

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/57RMMD/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/2299591337/57RMMD-2025-04-23-203734">AIネイティブ時代におけるエンジニアの生存戦略 by @2299591337</a></div>

また、下記の記事も参考になるかと思い掲載させていただきます。
[After Cline - あるいは語りえぬ者について語ろうとする時代について](https://gist.github.com/mizchi/1ad9d75fd008201571e85496fc736185)