プログラマが知るべき97のこと/コードは設計である
想像してみてください。ある朝目覚めた時、建設業の世界に世紀の大革命が起きていたとしたら。信じがたいほど仕事が速く、コストの安いロボットたちがすべての作業をしてくれるようになっていたとしたら。ロボットたちは素材をなにもないところから合成できる上、働くためのエネルギーコストもほぼゼロです。そしてなにか不具合があっても自分で自分を修理できます。更に素晴らしいのは、正確な図面をこちらで用意する必要がないということです。おおまかな青写真さえ渡しておけば、ロボットたちはそれを元に人間の介入なしに作業ができるのです。つまり建設コストを無視できるほど小さく出来るということです。
もしそんなことが起きたら、建設業者にどれほどの影響が及ぼすかはすぐにわかるでしょう。影響は実際の建設を行う施工業者だけにとどまりません。さらに「上流」にも影響は及ぶでしょう。施工のコストがゼロに近くなった時、建築士、設計士と呼ばれる人たちの仕事はどう変わるでしょうか。今はまだ、ある建設プロジェクトに投資するか否かを決める前に、物理的な模型を作るか、コンピュータでモデルを作るかして、事前に細かく検討を重ねる必要があります。しかし、施工のコストが実質上ゼロになったとしたら、誰がわざわざそんなことをするでしょうか。設計がずさんで途中で工事がうまく行かなくなってもどこが問題だったのかを確かめ、また魔法のロボットたちにゼロから新しい建物をつくらせればいいだけなら大した問題ではありません。事前に模型やモデルを作るようなやり方は廃れることになります。代わりに、十分な設計をしないまま作り始め、何度も失敗しながら改良を重ね、徐々に完成に近づけていく、というやり方が主流になります。そういうやり方をしたとしても、少なくとも出来上がったものの表面だけを見る限り、設計を十分にしてから作り始めた場合との違いはほとんどわからないでしょう。
作業にどのくらい時間を要するか、事前に予測するようなことは急激に減るに違いありません。建設にかかるコストは、設計にかかるコストよりも容易に計算できます。建設コストは、資材や部品の単価、組立作業にかかるコストなどが判れば、あとはそれを掛け算足し算するだけで大体わかるからです。そして、この計算しやすいコストが限りなくゼロに近づいていくとしたら、コストの読みにくい設計作業に時間をかけるインパクトが相対的に大きくなるでしょう。その結果、設計には時間をかけずとにかく早く作る、という方法が採られるようになり、作業がいつからいつまでかかるのかを正確に予測してスケジュールを立てるよいう方法は採られなくなります。
もちろん、資本主義社会ですから厳しい競争原理はそのまま残ります。建築コストが事実上ゼロになれば、その後は、設計の作業をほかより早く完了させられる企業が市場で優位に立つでしょう。設計の早さが、企業の競争力の源泉になるわけです。出来上がったものを設計に詳しくない人間が見ても、設計が良いか悪いかはよくわかりません。早くできる方が明らかに有利だとなれば、必然的に、素人目にわかるような問題がなければよしとされることが増えるでしょう。
人の生死に関わるようなプロジェクトでは、もっと慎重な設計が行われることもあると思います。しかし、多くの場合、十分な設計はなされず、そのせいで消費者が苦しむことが増えます。購入した建物にあれこれ問題が起きるからです。でも、企業側は、ロボットさえ派遣してしまえば、安く簡単に修理、修復できるのでそれでよいと考えます。結局、建設コストの劇的な低下により品質が低下するという、直感に反した事態を招くことになっていますのです。
本書の読者は、この話を聞いても驚かないかもしれません。同じことはすでにソフトウェアの世界で起きているからです。私たちは、「コードを書くことは設計をすることである」ということ(機械的な作業などではなく、創造的な仕事なのだということ)を肝に銘じる必要があります。それをよく考えれば、ソフトウェア開発がなぜ今、危機に陥ってるのか、その理由がわかるでしょう。何より危機に陥っているのは設計です。作る人間の能力を超えるほどの高度な製品、複雑な設計が求められていて、しかも製品を早く市場に出せという圧力が強いような状況では、設計が不十分なまま製品が作られることがどうしても多くなるのです。
はたしてどうすればいいのでしょう。ヒントは、先に書いた建設業の世界にあるのではないか、と私は思います。建設の世界では「模型」を作りますが、これはソフトウェア開発における「自動テスト」にあたると考えます。多数の過酷なテストに耐えるものであると証明されない限り、設計が完了したとはみなされないようにするのです。テストをより有効なものにするためには、大規模システムの巨大な状態空間に圧倒されないような方法を考える必要がありますが、言語や設計手法の改善を図れば、きっと希望が見えてくるでしょう。決して忘れてはならないのは、優れた設計には優れた設計のできる「人間」が要る、ということです。そういう人間になるためには、技術の習得のため相当の努力が必要になります。コーディング能力も例外ではありません。