少し前に、コードコンプリート 第2版 (上)を読み終えた。この本を入手したのはもう随分前になる。ずっと放置したままだった。頭の何処かに、読みたいし、読まないといけない、という意識がずっとあった。それにも関わらず、なぜずっと読まずにいたのか。初めて目を通したときの、最初のいくつかの章のとっつきにくさが原因だったように思う。プログラミングの前段階、要求やアーキテクチャから始まるのだけど、まだプログラミングを始めたばかりの頃には、それらが一体何なのかを現実のプログラミングと結びつけることができなかった。そこをスキップしてしまえば、具体的なコーディングの話が始まって、それほどソフトウェア開発の経験がなくても読み進められる内容ではある。しかし、最初に躓いてしまって、読む気が失せたと言うか、まだ読めるだけの経験値が溜まっていないと判断して後回し後回しになってしまっていた。
これまでこの本を読まずにいたことでどれだけの損失を出していたかを考えてみよう。読まなかったからといって、コードが全く書けなくなるわけではない。逆に、読んだだけですぐに効果が発揮されて、優れたコードが書けるようになることもない。そう考えると、読んでも読まなくても対して違いがないのではないかと捉えられなくもない。
仮に、今まだプログラミングを初めて1週間目くらいで、何かの言語を使って簡単なプログラムが書けるような状態になったところとしてみる。さらに、能力的には平均にしておいて、なぜかこの本の内容を理解して吸収できるだけの驚異的な適正があったとしてみる。この架空のプログラマーがこの本を読んだときと読まなかったときで、どれだけコードを書く能力に差が出るかを比較してみる。
まず、読んだ場合を検討してみる。まだ1週間目なので、ようやくifの使い方が身についてきたというところだろう。そして、ifを書くときに、どうやったら良い条件を作ることができるかというところにも意識が向いてくる頃だ。その状態でこの本を読んだところ、ifの条件をうまく作るための指針が書かれていて、その優れた理解力によって、なるほど、こうすればいいのかと知ることになる。さっそく実践に移そうとするだろう。しかし、まだプログラミング始めて1週間であるという縛りは有効だ。頭の中ではこうしたらいいと分かっていても、身体がまだ作れていない。単純に言うと、経験値が不足している。これからifを書くときには、この本の指針を思い出しながら、注意を払ってコードディングしてくことになる。それを繰り返していくうちに、意識せずとも自然と良いifが書けるようになってくる。
次に、読まなかった場合を検討してみる。実験台になる架空のプログラマーは、先と同一の条件を備えた人物だとしよう。ifを書くときに、ややこしい条件を扱わなければいけない状況に遭遇したとする。先と同じ能力を備えていると仮定しているので、やはりどうやれば良い条件が作れるかに思いを巡らすことになる。しかし、指針が全く無いので、自分でなんとかならないかを試行錯誤することになる。その結果出来上がるコードは、この本に書かれているような優れたコードの性質を満たしていないかも知れない。最も優れたコードでないことは自分自身がよく理解している。だが、何とかして動作するようにしないといけないので、現状でできる最も良いやり方で妥協して先に進んでいく。その後も、何度もifを使うことになるので、その都度同じように試行錯誤しながら良い条件にならないかを模索していくことになる。そのうちに、自覚はできないかも知れないが、なかなか良いifが書けるようになってくる。
前者は、先に目標を設定することができ、そこに向かって訓練していくというスタイルになっている。後者は、その場その場で目標を更新しながら、徐々に鍛え上げていくというスタイルになる。前者の優位なところは、最終的な目標に到達するまでの時間を短縮できるかも知れないという点だ。ダイエットをする場合に、最終的な目標体重を定めて、そこに向かって食事や運動を調整するほうが、効果が現れやすい。それは、レールが敷かれているからそこに従っていけばいいと言うだけではなく、目標を立てたのだから、達成できるように努力をするように意識が当たらくという精神論の効果もある。また、目標があると安心感が得られる。どこまで体重を減らせばいいのかわからないよりも、理想的な体重が分かっていた方が圧倒的に安心できるだろう。後者の優位な点と不利な点は、前者のちょうど反対だ。時間はかかるかも知れない、安心できないかも知れない。しかし、試行錯誤の中から自分で見つけ出したものを目標と定めて、それを繰り返していくことで、違った性質の経験値を得ることができる。単純な筋トレのようなトレーニングとは違った、発見的な経験、想像力を養うプロセスから、独特な能力を得ることができるかもしれない。
もともとの問に戻ってみる。果たして、後者のプログラマーはこの本を読まなかったことで、より大きな損失があったと言うことができるだろうか。 まず、1週間目という仮定に現実味がない。1年目に読むとして、10年後の違いを考えてみよう。10年間読まずにいたプログラマーは、1年目に読んだプログラマーよりも損失はあっただろうか。全く同一の人物で、同じくらい量のトレーニングを行ってきたとするとき、10年目の違いはどこに現れるか。まず考えられるのは、読んだ方は、その後の反復トレーニングによって、目標の能力を完全に獲得しているという状況だ。読まなかった方は、目標そのものが絶えず変化していくので、安定した能力を獲得できていないかもしれない。しかし、目標を自ら変化させていくというまた違った能力が鍛えられていくことになる。時間的なところに目を向けると、読んだ方は、10年も書けずとも目標に到達してしまう可能性もあるだろう。その場合、また新たな目標を立てて、より高いところに進んでいくこともできる。もし損失があったとしたらそこではないだろうか。つまり、この本を入手した時点で読んでいれば、もっと早く良いコードの書き方の目標が定まっていて、そこに到達していたかも知れない。そして、もっと関心のある現実の問題を解決するソフトウェアを書くことに専念できたかも知れない。
今回、この本を読んでみて思ったのは、それほどまでに新たな発見のようなものが得られたのではなく、これまでの経験と照らし合わせると、とんでもなく道を逸れて、変なところに来てしまったわけではないということだ。そして、ようやく入門者から一歩先に進んで初心者の手前くらいまでは来たかも知れないと、何か達成感のようなものを感じている。もし、1年目に読んでいたら、このような感傷的な感想は抱かなかったに違いない。そして、誰かに与えられた助言ではなく、自身の経験から獲得してきたことであるという事実は、なかなか貴重であるかも知れない。この本を読む一番の理由はそれじゃないだろうか。何か新しいことを身につけたり、いきなり優れたコードが書けるようになることを期待するのではなく、自分がどの方向に向かっているのか、今どのくらいの経験値溜まっているのかを確認するために読むことで、より先に奨めるようになる。
しかし、まだ上巻なので、あと半分のこってるのに結論を出してしまうのはちょっと早い。でも、たぶんそんなに違った感想は持たないだろうとは思う。