進化モデルに学ぶOSS開発モデル
生物の進化モデルを情報科学で応用した例に、遺伝的アルゴリズム(GA)とか遺伝的プログラミング(GP)などがあります。大まかに言うと、適当な情報を遺伝子とみなして、その遺伝子を進化させることによってよりよい情報を得るような手法です。
よくある遺伝的アルゴリズムでは、まず進化させたい情報をビット列で表してそれを遺伝子とみなします。それに対して下記の操作を加えることによって新しい情報を作成していきます。
- 交叉 (二つの遺伝子を混ぜ合わせて一つの遺伝子を作る)
- 突然変異 (遺伝子が世代交代時にランダムに書き換わる)
- 選択 (世代交代が行われる際、強い個体ほど生き残りやすい。適者生存)
実行の流れを簡単に書くと、次のような感じです。やり方はいくらでもあるので、これが全てではないですが。
- 最初にいくつかの遺伝子をランダムに生成する
- 遺伝子の集団を交配させて、次の世代の集合を作る(交叉)。その際に遺伝子にノイズが入ることがある(突然変異)
- 現世代と次世代の中から、強い個体が多く残るようにいくつかを排除する (選択)
- 2から3までを好きなだけ繰り返す
生物の進化も似たようなものだと思います。つまり、強い生物ほどそこから生まれる子供も強い可能性があります。また、強い生物ほど長生きし、多くの子供を残します。世代を重ねることによって、それら強い生物の子孫が世界に生き残る可能性が高く、より強い生物を創造する可能性があります。
遺伝的アルゴリズムで良い解を得るには、次のようなところに注意する必要があります。
- 遺伝子の集団は十分に多様性があるか
- 同じような遺伝子ばかりだと、交叉の際に同じような個体ばかりが生まれ、いつまで経っても強い個体が生まれない
- 「強い個体」の基準は適切か
- 選択の基準を間違うと、良い遺伝子を持っていても淘汰されてしまう
- 世代は十分に重ねられたか
- 遺伝的アルゴリズムでは世代交代によって良い個体を作っていくので、世代数が少ないとまだ良い個体が発生していないかもしれない
と、ここまでの生物の進化モデルとOSS開発モデルってのは地味に似ている部分があるんじゃないかと思いました。
遺伝子というのを着想やプログラムとみなすと、遺伝操作というのは次のように読み替えることもできそうな感じです。
- 交叉 → 着想のインスパイア、プログラムのマージ
- 突然変異 → インスピレーション(とか?)
- 選択 → そのまま。良さそうでない着想やプログラムは世間の認識から消される。良い情報ほど人目につきやすい
そして、遺伝的アルゴリズムで良い解(=強い個体)を得るための考え方は、開発でよいプロダクトを作るときに参考になるのかなと。
- 遺伝子の集団は十分に多様性があるか
- インスパイア/マージすべき情報はたくさん存在するか。多くの人が意見を出したり、プログラムを書いたりした際に、それらは広く公開されて、だれでも閲覧可能であるか。
- 情報が公開されていないと、少ない情報を元にプロダクトが作られることになり、「強い個体」でない可能性がある。
- 「強い個体」の基準は適切か
- その情報は本当に重要なのか。人間の判断なのでぶれがあるものの、ネームバリューだけで良い/悪いという決めつけがあるかもしれない。
- 多くの情報が体系的にまとめられていないと、本当に「強い個体」に到達する前に情報収集をやめてしまうかも。
- 世代は十分に重ねられたか
- 情報の閲覧性に難があったり、情報の公開が困難であると、情報の世代(交代)が進むのが遅れてしまう。
- 世代交代が止まれば情報の進化は停滞するかも。
ウォーターフォール開発とアジャイル開発の一番の違いは、「世代は十分に重ねられたか」という点だと思います。対して、OSS開発ではそれ以外にも多様性や価値基準なんかも積極的に程度マネージする必要があると思います。
通常の固い開発モデルでは、情報が発散する(多様性が高くなりすぎる)と期間内に終わらなくなってしまいます。ましてや、複数人が一つのプログラムを、別々の方法で実装してみるなんてことはやらないはずです。でも、多様性が高いこと自体は別に悪ではなく、それのトータルコストが高いのと、情報をまとめるシステムを準備するのが大変なだけというだけな気がします。
OSSでは厳密なman-hourというのはそれほど重要ではなく(hourが重要な場面はある)、同じ機能を持つプログラムが2つ以上作られたところで、それらのマージによってよりよいものができるかもしれません。また、Web上には厳密な意思決定機関というものが存在しないため、適当に情報が発散しても有機的に(世代交代に伴って)収束していき、いずれは「その時点での最高のアイデア」になっていく可能性があります。
まぁ、これらはもちろん理想論ではありますが、↓の3項目を念頭に置きながらIrenkaを開発していきたいなと考えてます。
- 情報の多様性の確保 - 多くの情報を公開し、閲覧性を高くする。
- 情報の選択基準 - 情報を体系的にまとめ、先入観なく閲覧できるようにする。
- 情報の発信頻度 - 情報発信を容易にし、コミュニケーションコストを下げる。コミッタのやる気をそがない。
こう考えると、blogやらMLってのは最高のツールではないかも。