プログラマが知るべき97のこと/車輪の再発明の効用
「前に作られたものがあるのなら、それを使えばいいじゃないか。車輪を再発明するなんてバカげてる……」
—誰か
この言葉、人によって言い方は少しずつ違うでしょうが、聞いたことのある人は多いのではないでしょうか。仕事の現場でも、大学などでも頻繁に言われることだからです。しかしなぜでしょうか。「車輪の再発明」はどうしてそんなに忌み嫌われるのでしょうか。それはまず、新たにコードを書くより、既存のコードを流用する方が安全でコストが少なくて済むからです。既存のコードは、その多くが「正しく動作すると既に確認されたコード」です。厳しいテストによって品質を高められ、製品としても役立ってきた実績のあるコードが多いのです。既存の製品やコードベースに時間と労力を投資したのに、同様のものを再度作ってまた時間と労力を投資するのは無駄、という考えもあります。あえて車輪の再発明をするのだとしたら、それなりの理由は必要でしょう。
世の中には、ソフトウェア開発のパターンや、設計について書かれた本がたくさん出回っています。読者の中にも読んだことのある人は多いでしょう。ただ、そういう本は、いくら素晴らしいことが書かれていても、だいたいは読むと眠くなります。ヨットの出てくる映画を見るのと、実際に自分でヨットに乗るのとではまったく違います。それと同様、すでに存在するコードを流用するのと、自分でゼロからソフトウェアをデザインし、テストし、バグ修正をして品質を高めていくのとでは、まるで違うのです。
「車輪の再発明」をしようと思えば、ただ単に目的に合う部品を探してきて、適切な場所にはめ込むだけでは済まなくなります。部品から自分の手で作ろうとすれば、その部品に中でどういう処理をさせる必要があるのか、また他の部分はどういう処理をしているのか、嫌でも詳しく知ることになります。メモリ管理、たとえば仮想ページングなどはどうなっているでしょうか。果たして自分の手でそれを実装できるでしょうか。双方向リスト、動的配列クラス、ODBCクライアント、自分が普段使っているようなGUIのコードなどを自分で書けるでしょうか。Webブラウザウィジェットを自ら作れるでしょうか。多重化システムをマルチスレッドシステムのかわりに書くことや、ファイルベースのデータベースとメモリベースのデータベースのどちらを使うか、自分で判断することなどはできるでしょうか。
こういうソフトウェアの核になる部分を自ら実装する機会を持てるプログラマはごくわずかです。このため普通の開発者は、これらの部分が現実にどのように機能しているのかを詳しく知ることができません。どう動いているか自分ではわからないために、神秘的なもの、「ブラックボックス」のようなものとみなし、機能した結果を利用するしかなくなっているのです。水面だけを見ていたのでは、その下にどんな危険が潜んで、いるかわかりません。また、底の方で何が起きているのかがわからなければ、せっかく優れた能力があっても、できることは限られてしまいます。
車輪の再発明をしようとした結果、失敗をすることもあるでしょう。しかし、それは一度で車輪の再実装がうまくいくよりも貴重な体験になるはずです。自分の手でゼロからコードを書き、あれこれと試行錯誤をすることを通して学ぶのは、ただ技術者を読んで学ぶこととは大きく違います。試行錯誤をしている間は、悔しがったり喜んだり、感情が大きく動くことになるからです。
本を読むなどして知識を頭に入れることも大切です。しかし優れたプログラマになるためには、経験を積むことがどうしても必要です。現場で多くを見て、自分の手で何かを作ることが必要なのです。車輪の再発明は、プログラマが学び、技術を高める上で非常に重要なことです。ボディビルダーがバーベルを上げるのと同じようなもの、と言ってもいいでしょう。