【養成講座】0から始めるプログラミング

「プログラマーになってみたいけど、プログラムの理解が出来ない」「プログラマーだけど、最近行き詰まっている」といった方を対象に、ちょっとした育成講座として、記事を書いてみることにしました。

似たようなカテゴリは仮ブログ時から存在していましたが、なかなか書く機会が無く、結局カテゴリをたてただけで終わってしまいました。しかしながら、「若手プログラマー」が育っていないと感じる今日この頃、休憩時間を用いて、頭休めにちょっとしたコラムでも書いてみようと思っています。ノープランで書き殴りになると思いますので、役に立つのかは良く分かりませんが、少しでも参考になれば幸いです。

さて、最初ということで、私自身が現在に至るまでを書いてみることにするのですが…

私がPCと初めて出会ったのは、今から26年前の近所の電気店ででした。店頭でデモっていた、シャープの「X1」という機種で動いていたゲーム(「サラダの国のトマト姫」という、ハドソンのアドベンチャーゲームでした)が、当時小学生だった私の人生を間違いなく決定しました。正確な金額は忘れましたが、確かセットで20万~30万円の間だったと思いますが、当然ながら小学生の私に買えるものではありませんでした。しかしお店の人はとても寛大で、いつも遊ばせてくれました。このお店は今はもうないのですが、大変に感謝しています。

その店には、他に何本か遊べるゲームソフトがありましたが、全てやり尽くしてしまった私は、「自分でもゲームが作れないだろうか」と考えるようになりました。それは、当時数少ないコンピュータ雑誌の中の一誌であった「月刊マイコンBASICマガジン(=ベーマガ)」の影響でした。
本体やソフトの紹介記事がメインの他誌とは違い、この雑誌は読者のプログラム投稿がメインで、当時一世を風靡した「BASIC」というプログラミング言語(たまに違うこともあるけど)で書かれたプログラムコードが誌面の半分以上を用いて紹介されていました。タダ(正確には当時の本誌の価格である300円)で未体験のゲームソフトが手に入ることになるので、それを打ち込んで遊ぶことにしました。
面白そうだと感じたゲームを選び、それを慣れない手つきでコードを打ち込みます。ほぼ1日を消費し、最後の行を打ち込んで「やった、出来た!」と感慨にふけります(他人が書いたコードですが、自分で作った気になっていたのは隠すまでもありません)。そしてドキドキしながら実行… しかし、「Syntax error」の英文が出てくるだけで、ゲームらしい画面にはならない。何度ソースコードを見直しても、相変わらず理解の出来ない英文が出てくるのみでした。
今となっては「Windows対応のPCとソフト同士なら動作する」もしくは「PHPなら」「JavaScriptなら」といった具合で、機種を選ばないのが普通ですが、当時は「BASIC」という名前でも、ほとんどがその機種固有の言語体系だったため、他の機種では間違いなくエラーが出ました。ベーマガが誌面の半分を使っていた理由はこれで、ほぼ全機種のソースコードを網羅していたために、各機種1~2本分を掲載しても、相当ページになってしまっていたのです。そして私はX1用ではなく、他の機種のソースコードを選んでいたのでした。それに気がついたのは、何本か他のゲームを打ち込んで失敗した後でした。

面白そうだと感じたゲームは大抵別機種のもので(これはX1用を投稿していた作者たちが悪いのではなく、確率論的に他機種のものが面白そうだと感じるだろうから仕方がないことでしょう)、何とかこれを遊べるようにならないかと考えるようになります。プログラムを見比べてみると、何となく似たようなルールで書かれていることに気がつきます。例えば、IF文やFOR文などは、どの機種でも同じような記述になっている。逆に、X1だと「LOCATE」と書かれているのに、同じシャープのMZ-700だと「CURSOR」と書かれている…などなど。各機種のマニュアルを見れば一発だったはずですが、当時インターネットなど無く、書籍など資料も無く、お金もなかった小学生の私は、今考えてみると、この「違い」を調べることから、プログラムの勉強をしていったように思います。

市立図書館にプログラミングの本が若干有り、そういったものも組み合わせて、これらの「違い」を変換していくうちに、ようやく「アルゴリズム」というものを体験的に覚えていきました。最初は「初期化」から始まり、いろいろな変数を用意する。初期化が終わったらメインループに移行し、よく使う動作は「サブルーチン」を作ってそれを呼び出す。自機が死んだらゲームオーバーにして終わり。さらに細かく見ていくと、サブルーチン中の「自機の移動」は、キーボードから進む方向を調べ、進んだ方向に座標計算し、その座標に自機を表示してからはみ出た部分を消す…といった感じです。

そして、ある程度基本的な文法が理解できるようになって、初めて「自分オリジナル」のゲームにチャレンジしてみました。自分が撃った球がランダムで動く敵に当たったら終わり、というめちゃくちゃ簡単なものでしたが、出来たときはとても感動しました。確か、初めてパソコンと出会ってから1年後の事だったと思います。

だらだらと書いてしまいましたが、この一番最初の経験が、今の自分を作っているなと感じています。
確かにこの頃は今とは違い「無いものは作るしかない」といった時代でした。インターネット等の手段もなく、自分の欲しい情報も手に入りにくいため、自分で考えるしかない…だからその課程で勝手に覚えていってしまう。確かにそういうところもあると思います。今の「何でも手に入る」世界と比べれば、プログラミング学習のモチベーションも違うかもしれません。
しかし、一番役に立っていることは、「機種固有のプログラムのため、そのままコードを打ち込んでも動かなかった」事だったのではないかと思います。

プログラミングからは少し離れてしまうかもしれませんが、現在の学生や若い社会人は「ゆとり学習」で学力低下になっている。その原因は、インターネットから得られる情報の「コピペ」ではないか…そんな意見をたまに見ます。確かにそうかもしれません。私もそう思っていました。しかし、私のプログラミング学習は、どうやっていたかを思い返してみれば、やはり最初は上記の通り「コピペ」をしようとしていたのであり、今と何ら変わりのない行為でした。
ただ唯一の違いは「コピペしようとしたものがほぼ100%そのままでは動かない」ことが大きな違いでした。自分の環境に合わせるためにはプログラム全部に目を通す必要があり、そしてその仕組みをまず理解する必要があった。仕組みを理解しているから、他のどんな機種にも移植しようと思えば出来たし、その一部分を他のプログラムに応用することも出来た。つまり、コピペしようとしたものそのものに価値があるわけではなく、考え方そのものに価値があるのだと私は主張します。

私自身もたいした技術は持っていないと思っていますし、模範的な学習方法をしていたわけでもないと思います。
しかし、他人のプログラムから「仕組み・考え方」をくみ取る作業は大変に有用です。確実に表現の幅が広がります。今まで人のソースをあまり見ないで利用していたら、一度それを調べてみて、何故そのようにコーディングされているのか、自分なりに理由を考えてみましょう。そして、自分ならどうするのかを考えてみましょう。それがよいソースなら参考になるでしょうし、ダメなソースでも、自分なりの解法を確立するための良い助けになると思います。

今後語っていくことになりますが、プログラミング学習は「言語を覚えること」ではあらず、「仕組み・考え方を理解し、それを形にする(方法を習得する)」ことだと思います。
最初ということで少し気合いが入ってしまったため、長文になってしまいましたが、次回からは、このことを踏まえつつ、プログラミングについていろいろと語っていきたいと思います。