プログラミングに挫折していた頃のこと

読者諸兄は、雪が降り積もって行くその過程を眺めていたことがあるだろうか。

雪が降り積もる時、雪は初めから着実に蓄積してゆくのではなく、初めは地面に触れては融け、触れては融けを繰り返す。そうして無為に見える時を過ごした後、地面が十分に冷えた時を境に、そこから初めて雪が積もり始めるのである。


唐突に思い出したのだが、私は3回、プログラミングに挫折している。

最初の一回は、まず条件分岐を理解していなかった。今で言うScratchのような、タイルを敷き詰めることでプログラムを書くような教育用言語を触ったのだが、動いて欲しいと思っている内容をコードに落とせなかった。小学校の頃だったので、そもそも自我がなかったせいではないかと思う。最後の一回は、制御フローはわかってきていたのだが、データ構造という概念がなく、ひたすらに冗長になってしまい嫌になっていた。配列を知らずにint a1, a2, a3 ...; のようにしてしまうやつだ。あと、今なら二分木かハッシュ、または find を使うところで無限に else if を書いたりしていた。そして小規模なプログラムの行数が1000行近くに達し、何もかもがわからなくなるという事態を引き起こしていた。

悪名高いポインタを知ったのは、プログラミングを4回目に始めた時だ。つまり今に繋がっている、そこから一度も投げ出していない(一年以上コードを書かなかった時期を投げ出していたと定義する)一連の流れの最初の頃である。ポインタで詰まった記憶はない。データがメモリにあるというモデルは頭の中に既にあったので、それを指しているもの、と非常にすんなりと理解した。たまに聞く p += sizeof(T) のような引っかかり方もしなかった。というのも当時読んでいた本に、ポインタに1足すと次の要素を見るようになる(sizeof相当の値をアドレスに足す)とexplicitに書いてあったからだ。その後順調にリンクリストや木構造の実装を知り、ポインタの便利さを理解し、のめり込むようになって行った。

さて、では真ん中の一回、挫折したのは何故だったか。あれは中学の頃だったと思う。条件分岐を理解して、非常に簡単なプログラムが書けるようになっていた。すると次にしたくなることはループだろう。確か、自分がやめていいとシグナルを送るまで回り続けるようにしようとして、私は以下のようなコードを書いた。

main:
    // do something...
    call main

これは走らなかった。「ネストが深すぎます」というエラーが出たのだ。当時の私は「ネスト」という言葉を知らなかったので、検索してみた。どうやら入れ子構造を作りすぎているということらしいとはわかったのだが、当時の私はその何が悪いのかわからなかった。

今ならわかる。関数の再帰が深すぎるので、スタックオーバーフローを引き起こす可能性を憂慮し、言語処理系が止めていたのだ。だが当時の私はスタックなどと言うものを知らない。しかも、これはある意味「正しい」コードだ。動くはずだ、と私は思っていたし、動かない理由を思いつけなかった。これはプログラムという抽象的なものが有限の資源しか持っていない現実のマシンで動いていることを意識しないと辿り着けない答えのような気がする。特に、当時の自分は callgoto か何かのように理解していたはずなので、これが動かない理由は真剣にわからなかった。よって回避策も考えつかなかった。私は簡単なプログラムを動かすことにも失敗し、しばらくプログラミングを投げ出していた。

今も、当時あの言語処理系が末尾最適化をするぐらい賢かったらどうなっていただろうと考える。プログラミング経験が4, 5年伸びていたかもしれない。ぴったりハマってから今まででこれだけ知識が増えたことを思うと……いや、起きなかったことを考えても仕方ないのだが……。

どんなことでも、一度ピタッと嵌るまでが難しい。最初は何がおかしいのかもわからないし、自分が何をわかっていないかもわからないからだ。一度ある程度点と点が繋がるところまで来ると、その後は何をわかっていないのかくらいはわかるようになり、爆発的に学習が進む。不思議な話ではあるし、じゃあどうやったら最初に目の粗い網が張れる程度に物事が繋がるところまで行けるのかと言われると、私は忘れてしまったのでよくわからない。

不思議なことに、何かよくわからないままにもがいて、あるいは放置して別のことを勉強しているうちに、戻ってきた時突然すんなりと理解できるようになっていたりする。何故なのかはわからない。関係ないと思っていた分野に実は根底が同じものがあって素地ができていたか、時間経過で昔の知識が整理されて見通しがよくなったか、それとも単に局所最適に囚われて変な見方をしていたせいでわからなくなっていたのが解放されたのか。理由はわからないが、これまでも何度もこう言うことがあり、聞いてみると知人の多くが同じ経験をしていることがわかった。

冬が好きな知人の一人は、この現象を積雪に譬えた。雪が積もる日も、初めは雪は地面に触れると融けてしまう。しばらくそれが無為に続いたのち、ある瞬間、地面が十分に冷えて、それ以降は雪が融けずに積もり始める。無為に見える過程でも、見えないところで変化は進行している。そしてあるところでそれがわっと外に見える形で出て来ることがある。大事なのは、無為に見える間に諦めてしまわないことなのだと。

さて、今日も地面を冷やそう。