私はいかにしてプログラミングを習得したか? みたいな話

このへんを読んで。

http://d.hatena.ne.jp/scinfaxi/20090811/1249995872
プログラミングに殺される
http://d.hatena.ne.jp/scinfaxi/20070523/1179935877



プログラミングに殺されるの増田さんは、

数百時間は勉強しましたが、クラス、オブジェクト、public/private、コンストラクタ、グローバル、継承
その他数え切れないほどの専門用語が何一つわかりません。なんであんなものを理解できる人がいるのか不思議でなりません。

とのことですが、こんなの最初から習得しなければいけないことじゃないと思うんですよね。
「コンストラクタって何?」という問いの立て方がまず間違っていて、本来、「こういうことがしたい。でも今知っている知識だけでは無理がある」→「そうか、こうするとうまくいくんだ!」→「あ、これをコンストラクタって言うのね」という順番じゃないと。私が本とか書くときはできるだけそういう方向にしようと心がけているつもりです。成功しているかどうかはさておき。

以下、おっさんの昔話ほどうざいものはない、ということはわかっていて敢えて書きますが。

私がプログラミングに最初に触れたのは中学生の頃で、8ビット時代のBASICでした。PC8001とか8801とか6001とかそんな頃。
そのあたりの話はこのへんにも書いたしこのへんとかでも取り上げていますから繰り返しませんが、まあなんというか当時は、中学生が数十行のプログラムを書くだけで、UFOゲームやらブロック崩しやらのプログラムを作ることができたわけです。そしてもうひとつ重要なこととして、当時はゲームセンターで100円取るゲームでも、レベル的にそれと大差なかったんですよね。高校生のとき、PC-8001上のTL/1コンパイラでLoad Runnerを作りました。なにせPC-8001ですから、「XとYを切り替えて表示して走っているように見せる」レベルでしたけど*1。TL/1に手を出す前だったと思うんですが、BASICでは遅すぎる、という理由で機械語もやりました(Z80とLH5801)。まあ、それなりの規模のプログラムが作れるレベルには至りませんでしたけど。

年寄りの「昔はよかった」ほどうざいものはない、ということはわかっていて書くのですが、私がプログラミングのサワリをおぼえた時代と言うのは、

  • 目標となるプログラム(ゲームセンターにあるゲームとか)が、絶対に手が届かないほど無茶な目標でなくて、
  • コンピュータのアーキテクチャそのものも、抽象化の層が今よりずっと少なく理解しやすくて、
  • BASICでクソみたいなプログラムを作ってGOTOの嵐になったりグローバル変数が管理しきれなかったりして苦労する、という形で、プログラミングに有用ないろいろな概念を、まさに必要に迫られておぼえることができて、
  • そして、時代の発展段階もおおむねそれに合っていた。

という点で、「梯子の段がそろっている」状態にあったのだと思います。最近は、ゲームセンターにあるゲームなんて、グラフィックのデータを作る時点で素人の手に負えないわけで、まさに梯子の段が欠けている状態なのではないかと。

その意味で、「12才から始める! Diksamによるゲームプログラミング入門!」なんてのは余裕ができたらぜひ書いてみたいと思っていたりするわけですが。

ところで、こっちなんですが、

本気でプログラミングをするなら、C を勉強するしかありませんHow To Become A Hacker: Japaneseとのことなので「独習 C 」という本を買ってきて、なんとか読破したものの、ポインタが理解出来ずに挫折。

私自身は、「アドレス」についてはPC-8001時代に十分理解していました。なにせ入門者が最初に触る言語であるBASICでさえ、PEEK, POKEでアドレスを直参照する時代、POKEでV-RAMに書き込めば見える形で文字が出たし、最も単純な「UFOゲーム」でさえPEEKでV-RAMを読み取ってビームとUFOの衝突チェックをしていました*2

でも、「アドレス」は十分に理解していたであろう私にも、Cの「ポインタ」は難しかったんですよねえ。

今にして思うとなんともったいないことをしたんだろうと思うけれども*3、私は大学生の頃は、プログラミングからちょっと離れていました。その後就職して本格的にCを勉強したのですが、ポインタについてはなんとなくわかったつもりで実はわかっていなかった。それなりの規模のプログラムを書いたりもしていて、

int *p = malloc(sizeof(int) * size);

のように領域を確保すればp[i]のようにして参照できることとかは知ってはいたものの、統一的な規則で、これらを読み解くことはできなかったのでした。

その後、いろいろあってCのサブセットのコンパイラを作る機会があって、近藤嘉雪さんの「yaccによるCコンパイラプログラミング」を読んだりもして、そこでようやく、Cの宣言の構文の読み解き方を知りました。
それをWebに上げておいたら原稿依頼が来て本になったのが、C言語 ポインタ完全制覇です。

で、何を言いたいのかと言うと、プログラミング言語をマスターしたかったら結局それを作るしかないのではないのか、と言うことです。

というわけで結局こっちの宣伝につなげるのでした。

でも、「作ってみよう」と思うこと自体が、下手に本とかで(モノを作らずに)情報を入手しようとするよりも、ずっと大きな効果を得られる、ということは、おぼえておいてもよいと思うんですよ。うん。

*1:私の高校時代はLoad Runnerが日本のPCで動いていたくらいだから、PC-8001の現役時代ではなかったんですけどね。PCとか買ってもらえなかったので、貧乏な私には当時はそれしか入手できなかったんです。後にこれでテトリスも作った。

*2:BASICマガジンで「UFOゲームを作ってみよう」という企画があって、PEEKを使っていた。座標比較でいいんじゃないか、と当時から思ったものだけど。それはさておきあの企画は本当にすばらしかったと思う。

*3:だって、あの人やらあの人やらが、毎日毎日目の前にいたんですぜ。