見出し画像

ChatGPT/Co-Pilotで改めてわかる「プログラミング」とはどんな作業だったのか

最初にプログラミングを始めた時は、学校にリファレンスマニュアルを持って行って全てのページを丸暗記した。丸暗記が目的だったわけではなく、読んで知識を吸収していくのが楽しくてしょうがなかった。

PC-9801のN88-BASICリファレンスマニュアルは、読み物としてとても良くできていた。各ステートメントの紹介があり、パラメータの説明があり、ごく簡単なサンプルコードも書いてあった。大体見開き一ページで一つのステートメントの説明なので読みやすかったし、ベーマガかなんかで読む呪文のようなコマンドの意味を詳細まで知れて楽しかった。

だがこれを「楽しい」と思う人は少数派のようだった。
僕のクラスメートのうち、相当数の人が親にパソコンを買ってもらい、BASICに挑戦したが、全くその世界に馴染めず結局ゲーム機になって行った。僕も親父がゲームなんかを買ってきたら話は変わっていたかもしれないが、親父の教育方針でゲームソフトは買ってもらえなかったし、そもそも当時PC-9801はビジネス用と見做されていて市販のゲームソフトはほぼ存在しなかった(後に沢山出る)。

これがいわゆる「76ナナロク世代」の原体験で、大なり小なりプログラミングが向いていた思った人も向いてないと思った人も、同じような記憶を持っていると思う。

リファレンスマニュアルの内容が全て暗記されていると、単純にプログラムを早く書くことができた。暗記してないと、リファレンスマニュアルを開いて、該当箇所を探しているだけプログラミングが遅れる。つまり、丸暗記はプログラミング高速化のための手段、要はL1キャッシュだった。

もう少し凝ったことをしようとすると、いろいろな知識が必要になった。三次元空間を操るための数学的知識、アルゴリズム、グラフィック処理専用プロセッサの操作方法、マシン語とC言語。

こうなると、今度は図書館が僕の知識の補助となった。図書館には膨大な本があるが、プログラミングに関係する本は僅か。その僅かな本の中から、自分の疑問に答えてくれる一冊を探さなくてはならない。この頃僕は「検索」という言葉を知った。図書館の本は「検索」できる。そもそも検索とは図書館情報学から生まれた言葉なのだ。

しかしこの頃から僕は「検索」の限界を常に感じていた。もちろん図書館の検索システムは、蔵書の全文検索などできない。図書館の司書や出版社が作ったキーワードを元に検索するしかない。それでもないよりはマシで、どんなキーワードが自分の知りたい知識に繋がっているのかを推理しながら司書の人に検索キーワードを指示するのである。この頃、検索端末は高価かつ複雑で、司書が操作するのが前提だった。

90年代の後半に入ると、ワールドワイドウェブが「検索」という言葉の意味を広めた。これで格段に知識が探しやすくなった。NASAの文献を図書館で探すのではなく、nasa.govに直接アクセスできるようになった。

しかし、この頃は僕はプロになっていて、プロのプログラミングとはネットで検索できない閉じられた知識の塊だった。NDAの下でプラットフォーマーから配布されたマニュアルは、分厚いが時々支離滅裂で、書いてある通りに動作しないこともしばしばだった。読む人が少ないと情報は間違いが増えていく。最初は憤慨したが、これが最前線かと思うようになった。

この頃、僕は自分がプログラムしたいと思うものをプログラミングするのに必要な知識をほとんど全て暗記していた。ファイルを開くには?大脳新皮質L1キャッシュをサーチするとf=fopen('filename','r')というスニペットが出てくる。'r'は読み込み専用で、'w'は削除して書き込み、'a'は追記というのはソラで言える。驚くべきことに、今でもそうだ。

ところが2000年代に入ると、学ぶべきことが爆発的に増えた。
1999年から2002年まで、商用WebサービスはCで書いてApacheのfast_cgiで動作させるのが最速だと信じていた。場合によってはhttpdそのものをCで書いた。

ただ、そうして量産したサービスは僕以外の人には絶望的に保守しにくいものになった。

90年代までは「ゲーム」といえば、それはほとんど組み込みソフトのようなもので、他の人が「保守」することなどまずあり得なかった。

ところが僕は幸か不幸かROMに焼いて売っておしまいの世界から、ネットでパッチを継続的に配布し、サーバーを維持する世界の変わり目に業界に飛び込んでしまった。保守性など冗談だろという世界から、保守性がないと自分がいつまでもシステムのお守りをしなければならない世界へ。

保守性を優先すると、急にいろいろなものが必要になった。
デザインパターン、フレームワーク、モジュール。それに伴い、どの言語が最も合目的的か。JavaかPHPかPythonかRubyかPerlかNodeJS、schemeなんてのもあった。そしてまたそれぞれの言語のそれぞれのフレームワーク、そのお作法。コンパイルしないとインストールできない外部ライブラリ、エトセトラ、エトセトラ。

この頃から処理系の丸暗記はほとんど不可能になった。
これは年齢的なものもあると思うが、猫の目のようにクルクルと
変わる言語の仕様とフレームワークのバージョンアップ。

もうどんなつまらないことをするにも先に検索するようになってしまった。
Pythonでテキストファイルを開くのはどうやるんだっけ?
まあこれくらいは覚えてる

with open('file.txt','r') as f:

でもその先をどうすればいいのか迷う。readline()かreadlines()か。それぞれの言語で似て非なる「方言」があり、考えるのが面倒になって検索を先にする。なぜなら、

   勘で書く→実行する→エラー→検索する→実行する→上手くいく

というプロセスよりも

   検索する→実行する→上手くいく

の方が短いからだ。
これはBASICだとむしろ逆で、勘で書いて実行したほうが、毎回本を調べるよりもはるかに早かった。一度本を開いてページを確認する時間があれば勘で10回くらい試すことができた。今は実行して現象を再現するまでの時間が長いのでだったら最初からネットでコードスニペットを拾ってきた方がいい。

かくして「うちの会社の先輩プログラマーはネットからコピペしてきて貼り付けているだけに見えます」という新人に馬鹿にされるベテランプログラマーが爆誕するのである。でも、「どれをコピペしてくるべきか」を判断するためにはそれなりの経験を積んでないと出来上がったコードはでたらめになる。

この「スニペットを検索してきて貼り付けて、作りたいコードに馴染ませる(微調整する)」という段階に到達したのが、昨今の生成AIである。検索はきっかけにすぎず、本当に欲しかったのはこっちなのだ。

Github Copilotを使ってプログラムを書くとき、それまでコメントは書く前ではなくて書いた後に入れていたのだが、先にコメントを書くとそれをするコードスニペットが提案されるようになった。タイプ数も減るし、何よりブラウザとエディタを行ったり来たりしなくていいので恐ろしく効率が上がる。

ただ、今のVScodeのCopilot機能はやっつけで作った感じがするので、いずれもっと過激な統合がされるようになるだろう。

驚いたのは、VScodeで文字の原稿を書いていたときに、原稿の続きを提案されることだ。これは結構混乱する。まるで僕がAIに促されるように原稿を書いているような感じだ。

一つのファイルだけで解決しないことはChatGPTに直接聞いてみる。GPT4の出番だ。

結局、プログラミングとは彫刻のようなものなのだ。

よく、「プログラミングができるようになりたいがどうすればいいのかわからない。ネットのビデオ教材に挑戦したり本を読んだりしたが、全くわからない」という相談を受けるが、そのやり方ではプログラミングが全くできない人ができるようになるわけではない。

あるプログラミング言語(Scratchでもいい)を習得した人が、知識を拡張するためにそうした教材を頼るのにはいいが、そもそも「目的を持ってプログラミングをした経験」がないと「何をどこまで作れるのか」をイメージするのが難しい。

彫刻を作る人は、直方体の木を眺めた時に、最初から「こんなのが欲しい」と答えがある程度見えている。

その「答え」を求めるために大胆にノミで木を穿つことができる。大体の輪郭は見えているから、「ここは絶対いらない」というところをとりあえず削っていけば完成する。

プログラミングも同じで、経験を積んだ人は自分の限界も機械の限界もわかっているので、「これを作りたい」の「これ」を最小でイメージできる。

例えば、「LINEみたいなアプリを作りたい」と思った時、LINEには実際には膨大な機能があるのだが、「まず2台の携帯電話でメッセージをやり取りできるようにして、次に友達リストを作って、友達どうしで別のスレッドを作れるようにして、その後三人以上のスレッドを作れるようにして、友達をブロックしたりミュートしたりできるようにする」という、「木片から仏像」までの道筋を考える。

すると「次の段階に行く前に疑問を解決しよう」というステップ・バイ・ステップで構想を実現することができる。

例えば全くプログラムができない人がiOSのアプリを作ろうとするんだったら、「画面に"こんにちは"」と出すには?みたいなくらいの気持ちで挑もうとすると、Xcodeには最初から「Hello World」と表示するテンプレートが入っているので、初心者は大混乱に陥る。

なぜなら「Hello World」を表示するために四つくらいのファイルが最初から用意されており、そこに書かれているものはほとんど意味不明な呪文に見えるからだ。

だから「この次どうすればいいんだ」と悩んでしまうのである。

昔ならここで挫折して終わりだったのだが、今ならChatGPTに質問することができる。ただ、その質問への答えも初心者が理解するには難しすぎるだろう。

重要なのは、「今は覚えなくていい」ということを知ることだ。
海外旅行に行く時、僕は必ず現地語で「イエス」「ノー」「ありがとう」「すみません」「これをください」の五つの表現だけは覚えていく。というか「地球の歩き方」に必ず載ってる。今は自動翻訳で事前に調べてからいけばいい。

それ以外のことを旅行者が知る必要はない。中国の英語が全く通じない地域で「没有メイヨー」だけで30分くらい会話したことがある。自然言語においては文法的にあってるかどうかなどどうでもよく、伝わればいい。

プログラミング初心者にとって、いろいろなプログラミング言語にある「お約束」はまさに「今は覚える必要のない言葉」である。目的さえ達成できればそれでいい。あとで意味が必要になったら調べればいい。

人間に聞くとうんざりされそうな質問も、ChatGPTは根気よく答えてくれる。これほど恵まれている環境はちょっとない。

これから、かつてないほど、多くの人々にとって、「それぞれのビジョン」が大切な時代に入っていくだろう。

20世紀まで、ビジョンを掲げ、それを達成できる人は権力者だけだった。例外はプログラマーだ。プログラマーは自分一人の力でビジョンを達成できる。

21世紀は誰でもビジョンさえあればプログラミングできる時代である。
すごく楽観的に考えれば、AIにビジョンを指示するだけでその通りのプログラムを書いてくれる時代はもうすぐそこまできている。

実を言うとここ数日、プログラミングに熱中していた。
新刊発売記念イベントもあったのだが、その裏でプログラミングのことが頭から離れなかった。こんなことは久しぶりだ。

AIそのもののプログラミングは、実は結構退屈で、誰が書いても似たようなものになるし、結局その性能は計算規模にほぼ正比例する、つまりお金を持っている人が単純に強いというクソゲーなのだ。

しかし、AIを応用したアプリケーションのプログラミングは、個人のビジョンが大きなレバレッジを得る世界である。これぞハックであり、ワクワクするような冒険の始まりだ。

生成モデルが手軽に使えるようになって、人々の想像力が開発者の想像力に追いつき、ようやく楽しい時代がやってきた。VR勢もIoT勢も、もちろんゲーム業界もみんな生成AIでアプリケーションの「つくり」が根本的に変わるということがもっと浸透すると、これから世の中はもっと面白くなるはずだ。