
プログラミングは写経と実験の繰り返しだ
プログラミングは、難しいかもしれないけど、試行錯誤を繰り返せば道は開ける。
ずいぶんと長い間、プログラミングとは縁を切っていた私ですが、シェルスクリプトマガジンで Vol.29 からずっとプログラミングについて連載を持っている程度には、プログラムがちょっと分かる私です。もうすぐ Vol.61 が発刊されるので、30回くらいですね。2回くらいお休みいただいた気がしますが、4年くらい連載を続けさせていただいています。しばらくずっとプログラムと無縁でも、連載をかけてしまうほどに私がスーパープログラマーなのかと言うと、そういうことではありません。

プログラミングのきっかけは、ビデオゲームでした。ゲーム&ウォッチやカセットビジョン、ゲーセンにファミコンと、多感な時期をゲームにまみれて暮らしてきました。おのずと「どうしてゲームは動くのだろう」というシンプルな問に変わっていきます。これが、プログラミングを始めるきっかけでした。
最初のころは友人からファミリーベーシックを借りて。中学生になってからは、小遣いとお年玉をなんとか溜め込んで、MSXを購入し、ゲームにプログラムに明け暮れていました。明け暮れていたからといって、最初からプログラムを書けていたわけではもちろんありません。最初は、何もできませんでした。今でこそ、プログラムの先頭に書くおまじないをまちがえずに、C言語で「Hello World」を出力するプログラムを書けます。ですが、中学生のころは、もっと単純な BASIC 言語で文字を出力するだけでも、かなり考え込みました。たとえ文字が出力できるようになったところで、ゲームのようにキャラを動かすまでには、さらに数ヶ月の歳月が必要でした。そう、とても難しかったんです。時代背景もありますが、プログラミング言語って、思ったよりも難しいのです。
ちなみに、私が C言語で Hello World 作るとこんな感じになります。この系の住人です。どうぞよろしくお願い申し上げます。
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello World\n");
}
今でこそ、豊富なテキストに、オンラインのラーニングなど、とにかく潤沢な教育システムが揃っています。とてもうらやましい。わたしが中学生のころは、そもそも学習すべき本が定番の本しかなかったのです。それも各言語に 1冊あれば良い方です。体系だったMSX-BASIC の本など、結局わたしは見つけられませんでした。ほとんどがいい大人たち向けの難解な技術書しかなく、小中学生と言えば「ベーマガ」や「MSX・FAN」「Mマガ」に頼るしかありません。なお、ゲームは「コンピュティーク」。そこで、わたしが行ったプログラミング学習方法は、ただ一つ。
写経

写経です。なんてことはない。雑誌に書いてあるプログラムを打ち込んでは、それを実行してみるという繰り返しです。ベーマガもMSXFAN/Mマガもゲームプログラムがついているので、ゲームやりたさに入力できるモチベーションを持てたことは幸いです。中学生に、ビジネスアプリのプログラムとか COBOL 並べられても、知恵熱は上がってもモチベが上がることはなかったでしょう。ゲームばんざい。ゲームやりたさに、気がついたら写経していた。それが、私のプログラミング学習のきっかけです。
写経だからといって見くびってはいけません。書いてあるプログラムを見ても他人事ですが、それを写して自分で入力していくと、それは突然に自分事になります。写しまちがえもあるだろうし、さまざまなバイアスによって、勝手に他のものに変換してしまう場合もあるだろうし、とにかく打ちまちがえとの戦いです。
うちまちがえは、実に厄介です。他人のプログラムなので、打ちまちがえると、なかなか見つかりません。よく考えてください。エラーメッセージは英語です。今でこそ「Syntax Error」とでてくれば、該当の行に書きまちがいがあるとすぐ分かりますが、当時は中学生です。誰かに教え込まれないとわかりません。該当の行がなにかおかしいと思って、一つ一つ見比べないと分からんわけです。このうちまちがえの現象は、無心に入力するしかない最初のころに非常に多く発生します。どういうことでしょうか。

この写経修行は、慣れてくるとだいたい次にどういうステートメントがやってくるのか、想像がつくようになってきます。マルチステートメントのときでも、スペースを全部埋めても書くことのできる、あの文法キラーとも言われる恐ろしいMSX-BASICでもです。たとえば「FORI」と書いてあれば、このあとは
FORI=0TO100:xxxxx:NEXT
的なことになろうと予測がつくんです。頭おかしいですよね、MSX-BASIC。最初のころ「FORI」って命令があるんだとずっと思ってました。これ、ちなみに C言語で書くとこんな感じ。
for (int i = 0; i <= 100; i++) {
xxxxx
}
for文かよ
そこはおいといて、長年写経に勤しんでいると、なんとなく命令セットや式、ステートメントのテンプレが、頭の中に思い描かれてくるようになります。その結果、予測しながら写経を行うようになってミスも少なくなり、入力も早くなっていきます。すごい。成長しています。とは言っても、この成長はある程度のところで止まります。そりゃそうです、他人のアルゴリズムをただパクってるだけですから。
このように写経しては、そのゲームを実行するということを繰り返していくと、段々とつまらなくなってきます。すると、次に進むのは「改造」です。ここ。成長に重要なポイントは、今動いているあるものを、少しずつ改造しながら、大きくしていくこと。なにか、企業の立ち上げにも似たようなものを感じる瞬間です。それが、小さなことの改造や、追加によってもたらされてくるわけです。
写経をしてプログラムを書いていると、最初のころは、どこで何が行われているのかさっぱり分かりません。しかし、様々な経験をすることによって、プログラム内でどのような処理が行われているのかを、推測できるようになります。たとえば、エラーの発生箇所によって、どの動作に支障があるかが分かったりします。そう、プログラムがついに読めるようになってくるんです。中学生なのに、英語を(そうじゃない)。
それまでに学習したことや、新しく試したいことを考えながら、一つずつステートメントを追加したりして、実際の動作を見ながらゲームを改造していきます。スペースインベーダーであれば、インベーダーしかなかったゲームに UFOを追加してみたり。壁を置いてみたり。こうやって少しずつ改修を重ねていくことによって、プログラム自身の学習にもなりますし。どのようにコンピュータに処理させようかと、アルゴリズムをひねるようになります。
プログラミングを行う上で、重要な点はアルゴリズムです。たとえば敵キャラを自動的に動かそうとしたとき、単純な横への移動だけというのは、実装がカンタンならゲームもカンタンです。PACMANの各キャラの動きは、最近でもゲームAIの研究対象となっていました(人工知能 Vol.34 No.1)。あのモンスターたちを特徴的にしたのは、色ごとに動きの異なるアルゴリズムを実装したからです。常にPACMANを追いかけるアカベエだけではなく、先回りするようなピンキー、気まぐれに追いかけるアオスケ、ランダムのグズタ。こういったアルゴリズムを組み合わせて、ゲームを更に特徴的にしていきました。ちょっとしたゲームの改造の積み重ねが、プログラム言語学習の枠を超えて、アルゴリズム学習にも役立っていったのです。

その後、ゲームを実装するためにはマシン語でないと無理だと、更に厳しい世界にダイブしていきました。いずれにせよプログラムを書くための基礎は、写経によって生まれました。写経からの改造による試行錯誤。ただプログラムを読んでいるだけではなく、自分のものとして、実際に動かしてその挙動を試してみる。さまざまな挙動を実験して、体験してみる。その結果、プログラムのステートメントがどのようなものかを、正しく理解していくことができるようになりました。ここでの、基礎的なプログラミング力、それからアルゴリズムの考え方が、今でも連載を書ける程度には役に立っています。
今からでも遅くはありません、コピペではなく、写経でプログラムを書いてみませんか。
いいなと思ったら応援しよう!
