技育祭でも聞かれた「AI時代にどうやって経験を積んでいけばいいのか」というテーマです。
オーガニックな時代は学習速度が遅かった
僕はパソコン通信やインターネットがない時代にプログラミングを始めました。まあ当時の話を書いても若い人とは環境が違いすぎるので、細かいことは書きません。インターネットが使えるようになったら、確かに学習の速度は上がりました。わかならないことを調べるとだいたい同じような悩みを持っている人が世の中にはいて、すでに解決策を見つけてネット上に書いてくれたりします。またツールや言語の発展とも関連して、具体例を説明した本とか記事とかも増えているように思います。
とはいえ、何かしらを実装するには何か作りたいものを決め、それに合わせてアーキテクチャを決めて実装してみて・・・上手くいかなくて作り直し、みたいなのを何ヶ月か単位でやっていました。
だいたい入門書ばかりが書籍では売れるのですが、一通り本に書いてあることをなぞっておしまい。じゃあ応用して自分で作りたいものを作るには・・・?というところはよく初心者のつまづきポイントとして知られていましたので、そもそも一本何かオリジナルで作るというところに辿り着かないことも多かったと思います。
また、まずは画面周りを頑張ってみる、次はサーバーを頑張ってみる、など1つ1つできることを増やしていってそれに合わせて手を動かすということをしてきました。戦略的に使える技術を増やすためにちょっとずつ新しいものを触れるような作戦をとっている人もいれば、作りたいものありきでやりたいことを増やしてきた人もいるでしょう。どちらにしても1度に1つしか学べなかったし、学ばないと物も作れなかったというのが過去の時代ですね。
誰しもが上から下まで全部書けたわけではない
オーガニックプログラミング時代はAIがなかったので、みんなが上から下まで経験を積んで開発できた・・・というわけではありません。結局はサンプルコードのコピー&ペーストでものを作っている、という人は一定数いるでしょう。以下のようなジョーク画像が作られるほどです。
かくいう僕も、UI周りのボタンとかデザインが苦手で、Bootstrapが出たらそれを使い、Material Designが出たらそれのCSSを使うという感じでUIデザインをしていました。世の中もそういう人が多かったらしく、デザインにこだわりがある人からすると「Bootstrap臭がするダサいデザイン」としか見えないと判断されるのは知っていましたが、まあデザインセンスはそんな身につかないし、それしかできないので仕方がないですね。
結局1つずつ積み上げで勉強しないと手は動かないし、手が動かない領域はコピー&ペーストやほぼ完成品がサンプルコピーで動くようなフレームワークを使って誤魔化すのが当たり前に行われてきた、というのが実態かなと思います。おっさんたちが「今の若者は学習のチャンスが減ってかわいそう」というのは余計なお世話というか、自分の胸に手を当てて考えな、と返すのが正しいお作法と言えるかと思います。
学習方法には2つある
今までは自分の思うものを作れるような知識を下から貯めてボトムアップで積み上げてアプリケーションに必要な知識をボトムアップで作るというのが王道パターンとされてきたように思います。現在の「AIを使って開発すると経験値がつかない」というのはこちらを意識してのことだと思います。
しかし、AI以前から、逆方向のトップダウンの学習ステップは確かにありました。たとえば、ウェブのフレームワークを使い、アプリが作られるようになってから、その下のレイヤーのHTTPを学ぶとか。あるいは、PythonやRubyでコードを書けるようになってから、高速化のために一部をC言語で再実装みたいな。僕もRubyを大学時代に触って初めてオブジェクト指向が理解できて、C++で意図を持ってコーディングができるようになりました。ソフトウェアはこう書くべき→そのためにはこの文法を使って組み上げよう、というところに補助線とか補助輪が提供されている環境を使うことで、流れを知って、その流れを埋めるためにどのように手を動かせば良いかがわかると。
最初に説明した「入門書で文法とか一通り理解したけど、自分の作りたいプログラムの組み方がわからない」はまさにボトムアップ型学習しかしてなくて、トップダウンの「全体の流れからブレークダウンしてコードにしていく作法」を学んでいないからこそ起きると言えます。
AI時代はこのトップダウン型の学習を意識すると良いかと思います。作りたいWebサービスがある・ファイルを操作するCLIのユーティリティがある、といったゴールがあって、コマンドラインのパラメータ解釈とかそういうのは自動で書いてくれて、コアのロジックもさっとは書いてくれる。ただその流れを見てパフォーマンスの悪い部分を自分でさっと直したりをしながら少しずつより効率の良い書き方を学んでいく、という流れになっていくはず。
以前もフレームワークを使ってコードは書ける、と言う人は多くいました。そこから興味を持って深ぼって仕組みを調べたりして、原理原則を学んで開発者として成長できる人というのはいました。そうじゃない人もいました。今後はそのような「還元して学んでいく」姿勢が大事になるはずです。
ファッションと技能
RubyやPythonの拡張機能を書くだけであればコマンドライン引数をどう処理するかとか、メモリ管理とか多くの部分はもうレールに乗っているのでC言語でゼロからアプリケーションを書くのと比べて圧倒的に必要な知識は減ります。なにせ今時の言語ランタイム(配列とか文字列とか)相当が欠けていて、そこを自分で組み上げるなり外部ライブラリを利用するなりして初めて効率よくコードが書ける言語ですし。枠組みの中でコードを書くだけであればかなり考えることは減ります。
ファッションとか洋服とかも、「着こなす」とか「ファッションセンス」とかは、自分で洋服をゼロから作っているわけではなくて既製品の組み合わせ方です。もちろん型紙からミシンで洋服を縫い上げる人もいますが、組み合わせにフォーカスする人と完全自作の間には、既製品に装飾を足したりちょっと手を加えたりするという市場が大きく広がっているわけで、AI以降のプログラミングはそういう着こなしスタイルに寄っていくのは間違いないと思います。
「プログラミングできないとAIの成果物の評価なんてできない」といった言説は早晩聞かれなくなるかと思います。「プログラミングができるから、一部こだわりをもってパフォーマンスの高いコードが書けた」みたいなプラスアルファの技能としてプログラミングが変わってくるんじゃないかと思います。
AIでしか学びにくいスキルもある
「プログラミングできない人には良い設計は書けない」みたいなことがたまにXで話題になります。個人的にはそれはもう過去の話になると思っています。確かに過去には言語とかフレームワークの表現力と合わない設計を無理強いして現場が困る、みたいな例もあったかと思いますが、AIを活用した設計は決してその言語の詳しい知見がなくてもまあまあできてしまうのですよね。自分が知らない言語のコードを生成AIに書いてもらった人はもう気づいていると思いますが。ただ、だからと言って何にも技能がいらないかというと、システム全体を適切な塊に分割したりそもそも業務の流れをシンプルになるように整理したりといった、分析・設計のスキルは必要です。また、ファッションセンス的な技能が重要になります。
今までは複数人で開発するような大きな案件に入る、アーキテクトの人にレビューしてもらうという観点でしかなかなか一人では身につけにくかったそのようなアプリケーション設計スキルがAIとやりとりしながら身につけられる、というのは良いことかなと思います。これまでは下積みを積んで何年目かになってから仕事をやりながら身につけるような能力ですね。あとは、うまく情報を整理してAIに伝える言語化力とか、サボろうとするAIを働かせるマネジメント法とかも。
できなくなる経験とかに目が向きがちですが、逆に、身につけられる技能がいくつもあります。
あえて勧めるとしたらGitHub CopilotとKiro
さて、AIを使いつつ設計などを身につけつつプログラミングもプラスアルファで身につけていくにはどうしていけばいいかと言う最初の問いですが、個人的にはトークン数が限られている環境でAIを使ってみると言うのが良いかなと思っています。ある程度枠組みを作ってもらってから中身の実装を自分でやる、というステップでやるにはちょうど良いかと思います。フルに稼働して上から下まで全部書いてもらおうとすると月のクオータ制限にひっかったりします。難しいところはどこか自分で書けるところはどこかを考えながら必要なところだけAIにやってもらうとかそんな使い分けをすると安価なプランでも月末まで使い切ることなく十分に使えるかと思います。
おすすめは以下の2つです。
- GitHub Copilotの$10/月のProプラン
- Kiroの$20/月のProプラン
CopilotのProプランは比較的安価ですが、それに加えてGitHub Educationに登録すると無料になります。OpenAI、Anthropic、Googleなどのいろんなモデルが使えると言うところが良いですね。いろんなモデルを試食してみたい時にも良いです。あと、0xと書かれているモデルは利用量にカウントされないで使い放題なので、使い切ってもちょっとドキュメント整理とかシンプルなタスクはお願いできたりするところも良いです。
Kiroは使い切ったら無料の救済措置はないのですが、SteeringとSpecによる仕様駆動開発は、要件を整理してレールにのっとって開発ができるという点ではアーキテクト経験がなくてもシステムを作るガイドがしてもらえるという点ではかなりやりやすいですね。以下の記事で発表してきましたが、当時と比べてSonnet-4/4.5デコーディング能力アップ(当時は3.7/4だった)のと、軽いタスクを任せられる軽量モデルの3倍使えるHaiku-4.5が追加されたのと、Amazon Q Developerと呼ばれていたCLIツールが統合されたり進歩しています。
Kiroの使い方はAWSのKiroを使うハッカソン「Kiroween」に参加してみたでも紹介しています。
まとめ
生成AIが出たあとに言われる「時計の針は戻らない」という言葉ですが、この時代にあった教育とかそういうのをみんなで一緒に考えていく必要があるのは間違いないです。少なくとも現在ITで仕事をしている年長者が今後のAIを使った開発について考えると同時に若手の育成も一緒に知恵を絞らないといけないのは間違いないです。11/30に参加した技育展でも教育関係のプロジェクトが2つあり、対象はプログラミングと学校教育で違うものの、AIを解答を教えるのではなく考え方を身につける目的で使うみたいな内容でした。若手側からも危機感があってそこに取り組んでいる人たちもいるので、お互い知恵を出し合って良い教育について考えていけたら、「AIのせいで・・・は杞憂だったね」となるのでは、と思います。
悪いオタク的姿勢あるあるなんですが、「自分が学んできたのと同じものを実現する」というのにこだわる人は一定数います。自分の苦労した下積みがあるから若者も10年は泥水をすすってがんばれ、みたいな。あとは自分がウルトラマンティガ/初代ガンダムから順番に見てきたから、最新作を見るにはお前らもその順番に履修しろ、だって前作のアレが出るじゃん(なぜか履修と呼ぶ)、みたいな。自分と違う立場で考えるのを放棄した考えなのでそういうのは無視していけばいいかと思います。
とりあえず、手軽に始められる学習手段ということで利用制限枠が小さい契約でAIを使ってみるというのを紹介しました。少なくとも今まで数ヶ月とか年単位でかかって動くものがようやく作れた、みたいなところからだいぶ時短で動くものは作れて、とAI以前よりはアウトプットも出しやすくなっています。より短期間で、今まで身につけられなかったスキルもセットを高速で身につけられるような、そんな時代はつくれると思っています。僕も今まで開発してなかった言語でコードを書いてみたり、高速に学習できているなというのを実感しています。
ともすればAIが出てきたからジュニアな開発者はいらない、という話も聞こえてきますが、しっかりと理解してスキルを持っている人の必要性はゼロにはならない(そうじゃないとAIのコードの質の評価ができない)です。コーディングスキルの必要性は下がるかもしれませんが、マネジメント的なスキルを最初から要求されて身に着ける流れにはなるはずです。きちんと新卒を採用して育てていく、というのはIT業界の継続発展には必要だと思っていますし、それを以前からきちんとやっているからこそ僕もフューチャーを選んだ、ということもあります。大きな変化の荒波ですが、みんなで知恵を絞っていきたいですね。