ソフトウェアのエンハンスとかけて生物進化と解く
最近、バイオインフォマティクスの技術習得のため、生物学を勉強している。その中では特に、進化の仕組みを科学的に解明する進化論が面白い。ダーウィンが進化論の思想を説き、メンデルが初めて、正統的サイエンスの方法、つまり、実験して理論およびモデルを作成し、それを実験で証明していく方法を確立した。ワトソンとクリックがDNAの構造を解明し、進化の仕組みの実際の実装部分の解明にいたり、現代、ものすごい勢いで進歩しているのが進化論だ。進化論では『生物の進化は、遺伝情報にランダムな突然変異が入り、その発現が、その生物が生きる環境によりテストされ、結果が好成績の変異が生き残っいくことにより行われる』と主張する。ここでいうテストは色々な要素を対象に行われ、それぞれの要素の結果に重みを付けを施した後の総合得点で判定される。
重み付けで、もっとも優先されるのが子孫を残す能力だ。ほぼ100%の重みがその能力にかけられる。テストにパスして、生き残る突然変異はほんのわずかだ。ほとんどの突然変異がテストに不合格になり、死に絶える。ダーウィンの言葉でいうところの、Natural selectionだ。日本語では『自然淘汰』と訳すのだろう。
一方、当然のことだが、ソフトウェアのエンハンスにこのランダムな変更の過程はない。自然にソースコードが変わっていき、その振る舞いが変わっていくソフトウェアなど、恐ろしくて使えない。プログラマが完璧にロジックを考え、変更をいれていくのがソフトウェアのエンハンスだ。
一昔前の開発には、自動テストというものがなかった。その代わりにあったのは、手動テストだ。テストは変更が入るたびに、すべてのテストをやり直すのが、機能縮退を避けるもっともリスクが少ないやり方だ。しかし、エンハンスンの頻度が大きい場合、エンハンスのたびにすべての手動テストを行うには限界がある。勢いエンハンスの回数を減らしてでも、あくまでも理想的なテスト、つまり、全数テストにこだわるか、それとも、エンハンス頻度は頻繁なままとして、エンハンス時に行うテストのカバー範囲を狭めることにより工数削減を達成するかの、どちらかが選択される。優秀な設計者に設計させ、優秀なプログラマにコーディングさせ、なるべくテスト工数を少なくできるような開発体制を作る方法が取れれば、それに超したことはない。
アジャイルの開発では、前者の方法、つまり、エンハンスの数を減らすというアプローチは、その開発方法論にかかわる部分だけに、使えない。そこで考え出されたのが、自動テストコードを常にメンテナンスしていくという手法だ。変更を入れるたびに、あらかじめ作成済みのテストコードをかけて、変更を入れた後も、同じ環境で継続して動作することを確認していく。テストは自動なので、テストそのものを実行する工数はほぼゼロになる。もちろん、テストプログラムを作る工数はかかる。それはもしかしたら、アジャイル開発でネックになるところかもしれない。ところで、この自動テストで、システムの環境への適合性をチェックする部分は、進化の仕組みのNatural selectionの過程と似ているのではないだろうか。違いは、ソフトウェアのエンハンスではほとんどのケースはテストに合格し、変更は生き残るというところだ。
ここまでは両者が似ているということを書いてきたが、実は大きな違いがある。それは、生物の進化には、作り直しがないということだ。ダーウインの時代、そして現代でもそうだが、進化論を否定する人は多い。キリスト教の根本原理はアダムとイブから人類が始まったという創造論だ。人類は、神が創造したものとしてこの世に存在すると創造論と、進化の結果、人類が生まれたという進化論は、同居することは難しい。アメリカの大学生、つまりインテリでも3分の1は進化論を信じていないという。約40億年というとんでもなく長い期間が必要ではあったが、自然のランダムな変異だけで、この超精密な『ヒト』という種が出来上がったと考えるには、実はわたしも抵抗を感じる。ダーウインの時代、そして現代でも、創造論者が議論する時に例に出すのが、人の目、つまり眼球らしい。こんな精巧なものが、ランダムな変異と自然淘汰だけで、できるわけがないと。
それに対して、進化論者は、人の目のデザインは、決して立派なものではなく、実はひどいものだと反論する。目には、盲点という視界の中に見えない部分が存在する。さらに、網膜の血管網はその表面にあって、内部や裏側ではない。その結果、万が一血管が破裂した時の、目の能力の損傷がはげしい。これらは、作った後の後戻りができないという、進化の仕組みが持つ本質的欠陥が原因だと、進化論者は説明する。進化ではすでに出来上がったものを、一度やり直して、もう一度作り直すということはできない。あくまでも改良を繰り返すだけしか能がないのだ。
ところが、ソフトウェアエンハンスでは、進化にはない『作り直し』、つまり後戻りが可能だ。エンハンスする前に、コードの整理をして、変更しやすくした後、つまりリファクターした後、おもむろに目的のエンハンスのためのコードをいれる方法は、確立されたアジャイルな開発手法だ。
ソフトウェアには、寿命があるという考えがある。ソフトウェアは完成して、実際のプロダクションが開始された後、数々のエンハンスが入れられていく。エンハンスの度に、コードは複雑になっていく。ある時点で、複雑すぎて、変更をいれることが不可能になる。その時、システムの寿命が尽きることになる。振り返って、進化には寿命はない。40億年の歳月、延々と進化は続いている。進化でそれが可能なのは、テストつまりNatural selectionのおかげだとわたしは思う。同じ考えをソフトウェアエンハンスに置き換えると、ソフトウェア開発に、もっとも重要なことが自ずと見えてくる。それは、優秀な設計者による優秀な設計でもなく、優秀なプログラマによる、すばらしいプログラムでもない。一番重要なものは、システムの動作をテストする自動テストコードだ。