プログラマが知るべき97のこと/シンプルさは捨てることによって得られる

「やり直し、だな....」Deleteキーを押しながら上司が言いました。私は、毎度のことながらとても沈んだ気持ちで、コンピュータの画面を見つめていました。私の書いたコードが1行1行、きれいに消されていくのを見ていたのです。

私の上司ステファンは、いつも口うるさい人というわけではなかったのですが、質の悪いコードは一目で察知しました。また、そういうコードをどうすればいいか、よく知っていました。

私は当時まだ見習いのプログラマで、やる気は十分だったのですが、コードの書き方がまったくわかっていませんでした。プログラムで解決すべき問題が増える度、とにかく解決のために変数を新たに加える悪い癖がありました。それでプログラムの行数も増やしてしまいます。リビジョンが上がる度にコードが良くなることはなく、かわりに規模が大きくなり、複雑さも増してしまうのです。そうなるとやはり、動作は安定しなくなってきます。

特に急いでいる時には、できれば既存のコードに最低限の修正だけをして済ませたいと考えるのは自然なことです。たとえ既存のコードがひどいものでも、それで済めばありがたい、と考えるわけです。質の悪いものであっても、過去に書いたコードを消せないプログラマが多いでしょう。すべてをゼロからやり直して新しいコードを書くと、修正よりはるかに労力がかかるのではないかと恐れているのです。確かに既存のコードの質が良ければ、作り直しより修正が楽だとは言えますが、質の悪い既存コードは、あっても何の役に立たないことが多いのです。

役に立たないどころか、既存のひどいコードを無理に残そうした結果、かえって余計な手間がかかってしまうということもあります。ある程度以下の質のコードは、活かそうとはせず、即座に破棄してしまった方が得策と言えます。

もちろん、せっかく書いたコードをいきなりDeleteキーで全部消してしまうのが必ずしも良いとは言いません。私の上司のやり方は少々極端でしょう。ただ、私の場合は、そうして自分の目の前でコードを消されてしまったことで、2度目(時には3度目もありました)のコーディングの際は、嫌でも慎重に考えるようになりました。質の悪いコードは容赦なく書き直す、場合によってはいっそ全部消してしまう、というくらいの姿勢で取り組む方が、確実に質の向上につながると言えます。

コードはシンプルなものであるべきです。変数や関数、宣言といった構成要素はできる限り減らすべきです。余分な行、余分な変数…、ともかく余分なものが少しでもあれば、即座に消すようにします。残るべきは、アルゴリズムを完成させ、必要な演算をすべて処理するための、必要最小限の要素だけです。余分な要素、不要なノイズがあると、処理の流れがわかりにくくなり、重要な部分が見えにくくなってしまいます。

良い部分だけを残して悪い部分は消す、ということも困難なくらいひどいコードであれば、全部消して、はじめから書き直す方がいいのです。せっかく書いたものを結局全部消したという記憶が頭のどこかにあれば、次からは無駄なコードは書かないでおこうと無意識に気をつけるようになるはずです。