🌟

エンジニアリングの本質をコーディングに還元してしまう短絡的な見方への反発

に公開1

AIの進化とともに、"Vibe Coding"のような、自然言語からコードを生成するスタイルが実用的になりつつある。それに対して、「プログラマ/ソフトウェアエンジニアの価値がなくなる」「プログラミングを学んだ知識が無駄になる」といった声を目にする機会が増えた。

だが、これらの主張には一つの共通した前提がある。それは、エンジニアリングの本質を「手を動かしてコードを書くこと」に還元してしまっているということだ。そして、その前提に基づいて「AIができるから人間はいらない」といった短絡的な結論に飛躍してしまう。私はこの見方に強い違和感を覚える。

エンジニアリングの本質は「問題解決」にある

「エンジニアリングの本質は「問題解決」である」という言葉は、使い古された言葉だが、私はこの視点を重視する。

補足

あえて補足するが、問題解決という名目のもとにコーディングという効率的な手段を軽視するような論調がこれまでしばしばあったため、私はあまりこれを声高に主張したくなかった。

そもそもソフトウェアエンジニアの価値は、コードを書くという行為そのもの「だけ」にあったわけではない。本質は、社会や事業、あるいはソフトウェア自体の問題を的確に捉え、抽象化し、それに対して最適な手段を用いて解決に導くことにある。これまでは、コードを書くことが最も効率的な手段の一つだったに過ぎない。

Vibe Coding のような新たな手段が登場しても、それによってエンジニアの価値が失われるわけではない。むしろ、抽象的な指示で動くシステムを使いこなすには、(もしかするとかつて以上に)高度な論理性、言語化力、設計力、抽象化能力、問題分解能力、デバッグ能力が求められる。適切な構造を描き、正確に意図を伝える能力は、まさにエンジニアがこれまで培ってきた力に他ならない。

また、「プログラミングを学んだ知識が無駄になる」という懸念も同様に、本質を見誤っている。プログラミングを通じて得られる能力とは、文法や構文の暗記だけではなく、問題を分解し、抽象化し、論理的に構築していくという普遍的な思考の型である。この力は、AI時代においてもなお重要である。


プログラミングによって訓練される能力がAI時代も生かされる例:

AIとのやり取りを効果的にするためには、筋が通っている論理的な文章を構築する必要がある。これはプログラミングと全く無関係に思えるかもしれない。
しかし、以下の記事でプログラマとしての能力と国語力の相関があることについて言及されている。

https://newswitch.jp/p/14132

https://atmarkit.itmedia.co.jp/ait/articles/0901/15/news131.html

これは私の実感とも合っており、周りやインターネットを見ても優れたプログラマは良い文章を書いている。良いプログラムを書こうとすることで国語力(論理的構成能力)が訓練されてきたのではないだろうか。


私は、エンジニアという職能を「特定の技術を操る人」ではなく、現状分析、課題特定、要件定義、実現手段の検討・選択、設計、実装、テスト、評価、改善といった問題解決のための一連の知的プロセス全体において最も効果的な手段を選択し、実行する人と考えている。ソフトウェアエンジニアは、その中でもソフトウェアという領域に豊富な手段 (武器) を持っているというだけという捉え方をしている。このような視点から見れば、手段が変わろうとも、エンジニアの本質は変わらないのである。

このような考えを持つ背景には、私の尊敬するプログラマの一人である登大遊さんの影響もある。

https://www.youtube.com/watch?v=Uww1CZTXfXs&list=PLBVUzYJmzbJKSU4Ilelp2HUNXArxhM4pl&index=3&t=1459s

登さんは、ビッグテックでの「エンジニア」とされる人は、ソフトウェアに直接的に関連することだけでなく、技術の対象領域に関連する事項なら大体なんでも理解している人ではないだろうかと仰っている。私にとっての「あるべきエンジニア像」もまさにこれであり、「コーディングこそに価値がある」というような言説に、以前から違和感を抱いてきた。

「AIを使いこなす」ということ

そして今、「これからはAIを使いこなせる人が価値を出す時代だ」という言葉が広く語られている。私はこの主張自体には賛成する。AIを活用できているかどうかでエンジニアとしての価値に大きな差が生まれるという話も真実だろう。実際、AIの使い方を知っていることで生産性や対応範囲が飛躍的に広がるのは確かだ。だが、そのあとに続く典型的な文脈──「だからAIの使い方を覚えよう」──という方向性には引っかかりを覚える。

もちろん、AIの使い方を学ぶことは大事だ。しかし、それはあくまで使いこなすための“必要条件”であり、十分条件ではない。ツールの操作方法を覚えただけで「使いこなせている」と言えるだろうか? 私はそうは思わない。

AIを本当に使いこなすとは、対象領域とその影響範囲に対して一定の理解を持ち、言語化能力と論理的な思考力をもって対話し、評価し、調整できる力のことだ。それらの力があって初めて、AIの出力を意図的に制御できるようになる。単なるプロンプトのテンプレートでは、本質的な問題解決はできない。

また、AIの使い方というスキル自体が、長期的に見て持続的な価値を持つものかには疑問もある。現在こそ、AIやAIツールの操作には一定の複雑性があり、多少の学習コストが存在する。だが、それも過渡的な現象にすぎないのではないかと私は考えている。

むしろ今後は、AIツールの操作はますます単純化し、ほとんど習得に時間がかからないほど簡単なものになると考えている。 (例えば、プロンプトエンジニアリングがほとんど必要なくなるなど) そうなれば、「AIの使い方を知っている」ことそのものの価値は急速に薄れていく。それに依存した優位性もまた、きわめて短命なものに終わるだろう。

だからこそ、AIやAIツールの表面的な使い方だけではなく、AIとの対話を通じて価値を生み出せるかどうかという観点がより重要になる。これは一時的なスキルではなく、長期的に磨かれるべき思考様式に近い。

加えて、AIの使い方だけを覚えて得られる優位性というのは非常に大きなものであるが、“(従来の技術習得に比べて)一瞬で得られる優位性である以上、一瞬で埋められる優位性でもある”ということを忘れてはならない。誰もが当たり前にAIを扱うようになれば、それは差ではなく前提になる。だからこそ、継続的に市場で価値を持つためには、従来通りの技術的な学習や思考力の訓練が依然として不可欠だと私は思っている。

https://zenn.dev/mizchi/articles/all-in-on-cline

高度なAIは自分の鏡みたいなもので、AIから引き出せる性能は、自分の能力にそのまま比例する。プログラミング作業が少し自然言語に近づいただけで、実際の動作レベルがプログラミング言語であることは変わらないし、デバッグ時に必要とされる水準は変わっていないし、なんならより難しくなっているかもしれない。

この記事にも書いてあるように、現在のAIは万能な存在ではなく、むしろ自分の思考や知識を反映する“鏡”のような存在である。的確に質問し、出力を評価し、改善に導けるかどうかは、使い手の知識と判断力に強く依存している。AIの操作法や使い方を知っているところでは、その性能を引き出すことはできない。技術的な基礎力や思考力があってこそ、AIは“拡張”として機能するのであって、代替にはなり得ない。

AIやAIツールを学ぶことは、もちろん素晴らしく有意義なことだ。それらを学ぶ努力を否定するのは、問題解決のための武器を試しもせずに捨てているのと同じであり、エンジニアとしては恥じるべき姿勢だと私は思う。

しかし同時に、AIやAIツールといった具体的な手段に振り回されるあまり、「今この瞬間の手段」が目的化してしまい、本来の役割である“最適な手段の選択と実行による問題解決”が蔑ろにされてしまっては本末転倒だ。

これからのエンジニアリング

結局のところ、今のAIはまだこれまでの技術と同様に、問題解決のための“手段”にすぎない。 (もちろん、少なくない分野で他の手段より圧倒的な価値を引き出せる超強力な手段である。) 手作業によるコーディングはなくなるかもしれないが、ソフトウェア技術とそれが影響する範囲に対して広く理解し問題解決のための手段を講じるというエンジニアリングのメタ的な役割は変わらず残る。

「これまで通りやっていれば大丈夫」という楽観的な結論に誘導したいわけではない。問題解決をするために状況や時代に応じた適切な手段を選択し実行するには、時流を見て柔軟に変化していく姿勢が重要だ。ただいずれにせよ、エンジニアリングの本質というのは今までと何ら変わらないと考えている。

完全に自律的に何もかもを解決してくれるAGIが誕生し、問題解決をするエンジニアが必要なくなる日は近いのかもしれないが、そのような日にはエンジニアの仕事がなくなると同時に多くの事業が消滅し、資本主義ですら消滅するかもしれないし、正確に予想できるものでもない。

AIによる変革は確かに起きているが、未来を如何に正確に予想できているかというマウントを取り合ったり失業への不安に囚われるよりも、問題解決という本質的な価値を見失わず、新たな技術を取り入れながら自らの思考力と創造性を磨き続けることこそ、これからのエンジニアに求められる姿勢ではないだろうか。

Discussion

rilril

タイトルおよび冒頭部分の「エンジニアリングの本質を「手を動かしてコードを書くこと」に還元してしまっている」の部分は「エンジニアリング」ではなく「ソフトウェアエンジニアリング」が適切ではないでしょうか。

Zennの多くの記事では単純にエンジニア=ソフトウェアエンジニア(もしくはもっと狭くITエンジニア)と置き換えて読んでも問題なさそうですが、本記事においては、そうではない部分が多くあるようです。意識的に「ソフトウェアエンジニア」と「エンジニア」、「ソフトウェアエンジニアリング」と「エンジニアリング」などを使い分けておられる雰囲気を感じます。些末な言葉遣いの差ともとれますが、このような記事においては本質的に重要なのではないかと思いました。