生物の進化から学ぶシステムの進化 – Timee Advent Calendar 2023

2023-12-09Diary,つぶやき

はじめに

今の組織には話がうまいエンジニアばかりです。
僕は自分のことを語るのが苦手です。

そんな僕にも「アドベントカレンダーの記事を書いてほしい」というお願いがありました。
記事を書かなければならないということで、今までエンジニアという仕事を通じて僕が感じてきた「システムの進化」と「生物の進化」の似ている点について書いてみることにしました。

お断りしておくと、このエントリで述べる内容は多分に自分の体験・主観に基づいたものとなっており、現職の組織を代表するものではありません

「生物の進化とシステムの進化を同じように考えるのは短絡的だ」という意見が上がるだろうということは予想されますが少しでも興味があればお付き合いください。

収斂進化 : どれを選んでも結局同じような仕組みになる

アプリケーションの初期開発時やリプレイス時に「どの言語でシステムを開発するか」の議論になります。
各社ごとにメインとするプログラミング言語を決定しています。
僕も今まで Java、C#、PHP、JavaScript、Go、 Python、 Ruby といろいろな言語の使用を決定した組織でWebシステムの開発に携わりました。
言語ごとに言語仕様に違いはありますが、俯瞰してみるとシステム構成の要素は似たようなものが必要となります。

  • データベース接続
  • ログイン認証・認可・ACL
  • ロギング
  • キャッシュ
  • モジュール・プラグインによる拡張
  • ライブラリ・パッケージ管理ツール
  • Linter ( コードの静的解析ツール )
  • Formatter ( コードの整形ツール )
  • ビルドツール

上記のような機構やツールは、いずれの言語にもフレームワークなりOSSなりSDKなりで提供されており、言語前提の選定基準にはならないと考えています。
処理性能はプログラミング言語ごとに差はありますが、実際言語選定時に重要視しているケースは多くないのではないかと思います。
( 処理性能が重要視されているなら、いくつかの言語は選定外から外れるはずですよね )
これらの問題も、キャッシュを上手に利用するなど工夫すれば解決可能なためと考えています。

どの言語でも必要な周辺システム ( エコシステム ) が必ず出来上がっていくことに不思議さを覚えます。


僕は生物学の中でもよく知られている現象である「収斂進化」を連想します。

異なるグループの生物が、環境に適応するために同じような形質 ( 見た目、機能 ) を獲得するという現象です。

具体例を見ていきましょう。

サメとイルカはどちらも海の生物です。
海の中を上手に泳ぎながら生活しています。
見た目はどちらも魚のようであり、背びれ、尾びれ、胸びれがあります。
ところがサメは軟骨魚類、イルカは哺乳類であり、両者は別の生物群として分類されます。
御存知の通りイルカの祖先は陸上で四本足で生活していたと言われていますから、独自の進化を経て、ひれを手に入れたことになります。

哺乳類であるもぐらと昆虫のケラも収斂進化の例としてあげられます。
両者とも地中で土を掘りながら生活している生物ですが、土を掘り進むために鍬のような前足と細長くでっぱりが無い体を持っています。


僕は生物もシステムも同じ圧力が加えられれば同じような形質を獲得すると考えています。

生物システム
圧力環境圧要件
具体例土の中、水の中、樹上、極寒Web系、組込系、基幹系、デスクトップアプリ、0.1s以外のレスポンス

言語の選定に影響を与えるのは、非技術的要因のほうが大きいと思います。
( エンジニアメンバーのスキル、声の大きなメンバーの好み、対外的な視点・採用戦略など )

何事もはじめてみれば、あとはなるようになるもんです

過去の進化は未来の進化の土台

エンジニアが日々気になっている小さな課題。
気になったメンバーが時間の合間を縫って改善した改善のプルリクエストに対して「これは〜の観点が欠けている」「これではセキュリティの問題が」となかなか改善が承認されない……。そうこうしている間に改善の熱も冷め、おざなりに、ということもよくある話です。

自分のチームではそんなことにならないように、マイナスにならない限りはできるかぎりプルリクエストを承認し取り込んでいます。

僕の個人的な考えですが、「完全」なものができるまでシステムの改善を反映しないよりは「不完全」でも1歩進化するのであれば積極的にサービスに取り込んでいきたいからです。
なぜなら小さな改善が次の小さな改善に繋がることがあるからです。


昔々、生物は深海で誕生したと言われています。
陸上には動物はもちろん、植物も存在しませんでした。
そこから時代は進み、陸地同士がぶつかることで隆起し、雨が降り河が流れ植物が生えるようになります。

陸上生物の祖先は生物の主戦場である海では弱者でした。
海の王者だったオウムガイからの攻撃を避けるために、海を捨てて浅瀬の海、さらには河をすみかとするようになりました。
当時の河は海洋生物がいないニッチでした。

ただし、河での生活には問題があります。
ミネラルが不足するのです。
河に含まれるミネラル分は海に比べて1/10から1/100しか含まれていません。
これに対処するため、河で生活する魚類は 「背骨」 にミネラル分を蓄えるという方法をとりました。

この名残は人間にも残っています
妻も子供を妊娠、出産した際には産婦人科の先生からカルシウム不足にならないように注意されたと言います
子供への栄養供給のために自分の背骨に含まれているカルシウムを溶かして利用するのだそうです

ミネラルを含んだ背骨は、元々は「貯蔵庫」としての機能を果たしていたわけですが、後に陸上で体を支える骨格としての役割を果たすことになります。
河の魚類たちは陸上に進出できました。
元々は「貯蔵庫」としての進化が、「陸上で体を支える骨格」としての進化に繋がったのです。

もう1つ事例を上げます。
哺乳類という脊椎動物にはどのような共通点があるかご存知でしょうか。
子供の頃は胎生 ( お腹の中で赤ちゃんを育て出産する ) する生物のことかと思っていましたが、カモノハシやハリモグラといった卵を生む哺乳類も存在します。

哺乳類の正しい定義は母乳で子供を育てる生物ということになります。
この哺乳類のメスが作り出す母乳ですが、元々はリゾチームという殺菌作用のある成分を含んだ汗でした。
この汗が産み落とした卵を濡らすことで病原菌から守られていました。
ところがあるとき、リゾチーム成分が変異し栄養豊富な母乳となりました。
その証拠にリゾチームタンパク質と母乳内タンパク質の構造が酷似しているそうです。
元々は「殺菌作用のある汗」としての進化が、「栄養豊富な母乳」としての進化に繋がったのです。


誰かが行ってくれた改善があったおかげで、自分の改善が楽にできました、という経験は少ないくないはずです。
こういうことが続くと、環境圧を乗り越えてきた改善や変化を馬鹿にせず、感謝しようと思えるようになります。

僕の経験ですが、広告の効果測定の仕組みを構築した際のロジックを流用して、検索流入、LPのランディング効果の測定のサービスを開発したことがありました。
更にこれを汎用化しテレビやスマートフォンなどあらゆる媒体上のアクションを計測する仕組みにまで発展させましたが、まずははじめの小さなリリースがあったからこその結果でした。

また大きなリリースは避けるべきです。
今まで大規模なフルリプレイス案件に何度も携わってきましたが、フルリプレイス案件のリリースが無傷で成功したことは一度としてありませんでした。
大規模に体を作り変えるのはリスクが大きく、自然界では死に繋がりやすいです。
小さな足場を飛び石と見立てて少しずつ飛んでいくことが大切です。
まずは今を精一杯生きます。

先人たちが作ってきた今あるシステムによって食べさせてもらっていることに感謝したいですね

退化という進化 : 間違ったら/不要になったら廃棄、撤退、削除

せっかく決断し最近リリースした仕組みだけど、需要にマッチしてなかったみたいだなぁ。
せっかく決断し最近リリースした仕組みだけど、改修前のほうが良かったという声が多いなぁ。
サンクコストを考えるとリリース前の状態に戻した方が良いのだけどみんなで合意できるでしょうか。

こういう時、一度始めてしまった変化をどう扱うのがよいでしょう。


先程イルカの話をあげたので、イルカの進化について取り上げます。

皆さん御存知の通り、イルカは人間や犬、猫と同じ「哺乳類」です。
イルカやクジラは元々他の陸上哺乳類と同じように4本足で陸上で生活していました。
( 余談ですが、イルカとクジラの区別は厳密には曖昧で、大きさぐらいしかありません )
しかし何らかの理由で陸上生活から再び水中生活に戻っていきました。

この時、背びれ、尾びれは進化させましたが、前足は胸びれに後ろ足はほぼ見えないぐらいの小ささに退化させました ( 僕の子どもたちの大好きな大阪市自然史博物館にあるクジラの骨格標本にも、とても小さな後ろ足を見つけることができました ) 。

「前足は胸びれに」「後ろ足はほぼ見えないぐらいの小ささに」 退化させたと書きましたが、退化も進化の1つとして考えることができます。
退化とは不要となった形質を捨てて他の形質にリソースを投下する進化 ( 変化 ) の1つです。

今を生き抜くためにイルカはせっかく獲得した陸上で生活するための形質を捨てて、再び海中で生活する形質を獲得することにしました。


僕も予想外の事態が発生した際には迷わずリリースを撤退するルールをチームで合意していました。

削除あるいは改修前の状態に戻した後にやっぱり削除しなければよかったと気付いたのなら、その時改めてリリースすればよいのです。

必要なものを必要な分だけ所有します。
生物はミニマリストなのです。

共進化 : 互いに圧力をかけあって進化させる

プロダクトコードとテストコードは永遠のパートナーです。

生物の進化のためには環境圧のような外部からの強力な圧力が必要です。
ITシステムの場合には要件による外圧がプロダクトの方向性や進化を決定することとなります。
しかし、この要件というものが厄介でふわっとして掴みどころがないです。
はじめは頭の中にあるだけですが、それでは他者と共有できないので明文化します。
明文化しても言葉の表現力や相手の理解力の違いで認識のズレが生じます。
そこでこの文章という曖昧さが残るものをテストコードとして動作可能なものにします。
プロダクトコードにとってとても強力な圧力となります。

プロダクトコードは外圧に抵抗するために進化しなければなりません。
進化しなければ文字通りデッドコードとして死んでしまいます。
テストコードはプロダクトコードの曖昧さを潰すために要件を取り込み進化します。
お互いに圧力をかけ合い進化しながら、本来目には見えないはずの境界を具現化していくさまに僕はいつも共進化を想起します。


マダガスカル島には少し変わったランの花が生息しています。
そのランの距 ( きょ:花びらの一部が袋状または管状にくぼみ、内部に蜜腺を持つ ) は約30cmもの長さとなります。
距は細長いツボのような形状で底には花の蜜があります。
これだけ深いところにあると蜜を吸うことはできなさそうです。
同じマダガスカル島にはキサントパンスズメガという少し変わったガが存在しています。
なんとこのガの口吻 ( 蝶などのあのロープを巻いたような口のことで、伸ばしてストローのように蜜を吸う ) は伸ばすと約30cmほどの長さになります。
キサントパンスズメガはランの蜜を独り占めできるわけです。

ランの距とガの口吻。
なぜ両者がこれほどの長さになったのでしょうか。
花を咲かせる被子植物は昆虫に花粉を運ばせることで受粉させるという戦略をとります。
彼らは昆虫に花の蜜というインセンティブを提供します。
昆虫たちは花の蜜を求めてやってきますが、蜜だけを頂戴する不届き者もいます。
そこで花たちはできる限り昆虫たちが花粉に接触した状態で蜜を吸わざるを得なくなるよう距を長くします。

キサントパンスズメガはこれに対して口吻を伸ばすことで対応します。
口吻が長いほうがより効率的に花の蜜が吸えるわけです。
ラン側も負けるかと距を伸ばしていき、キサントパンスズメガも口吻を伸ばす...というやり取りを長い年月の間に続けた結果、両者の長さは約30cmもの長さになったそうです。

ここまで「蜜月」となった関係性は強力な構造となり、2つで1つのシステムと呼べるものとなります。
他者の介入を許さないほどの強いシステムとなります。


注意しないといけないのは共進化は対立構造に見えても実は共生に近い関係にあること。
お互いに境界を超えることのないように均衡している必要があります。
プロダクトコードの進化だけではなく、テストコードの進化も続けていく必要があるということです。

気嚢システムと横隔膜システム : 自分たちの決断を信じる

今話題のあの技術。自分たちのサービスに組み込みたいが、なんだかマッチしていないような気もします。
とはいえ多くの組織で導入していることを考えるとそれだけ信頼性の高いものだとも言えます。
自分たちが今導入しているツールは失敗だったのではないか。

エンジニアの方々がはそんな迷いを常に感じながらいつも開発をしているのではないでしょうか。

どの決断をしたとしても、現在の自分たちのシステムに根付いた進歩であれば自信を持ちましょう。
要は問題が解決できればいいのですから。


大部分の生物が生きていくためには酸素が必要です。
酸素を如何にして体の中に取り込み、廃棄物である二酸化炭素を体の外に吐き出すか。
どれだけ効率的に行えるかで生物の姿、形、大きさまでを規定することとなります。

生物の歴史を大きく3つに分類すると古生代、中生代、新生代に分類できます。
中生代は恐竜の時代であり、中生代が隕石の衝突で終わり哺乳類の時代である新生代が始まります。
古生代は恐竜以前の時代となりますが、この時代の後半では比較的酸素が豊富な時代でした。
昆虫には積極的に酸素を取り込むための仕組みがないため、大気中の酸素濃度の増減で体の大きさが規定されてしまいます。
そのため現在は体の小さな昆虫ばかりですが、中生代後期にはおばけのような昆虫が生息していました。
体長1mのおばけトンボの「メガネウラ」や体長2mのおばけヤスデの「アースロプレウラ」がそれらに当たります。
生物にとって豊富な資源を惜しみなく使える幸せな時代だったことでしょう。

ところが中生代の終わりには今度は急激に酸素濃度が低下することとなります。
豊富な酸素の存在を前提としていた生物は絶滅し、生物種の90〜95%が絶滅したと言われています。

これを境に覇権を握ったのが恐竜に代表される鳥類 ( 恐竜は鳥類に含まれます ) と哺乳類です。
鳥類 ( 恐竜 ) も哺乳類もともにこの酸素不足という問題に対処するため体の作りを変化させていきました。

空気中の酸素濃度が低下したことによる対策として、酸素の吸入量を増やすことにしました。
吸入量を増加させます、という同一要件を解決するためにとった肺周辺の刷新アーキテクチャは異なっていました。

鳥類は気嚢システムというアーキテクチャを選択しました。
前提として、肺には筋肉がないため膨らんだりしぼんだりできません。
肺とは別に前気嚢、後気嚢という空気袋を用意しました。
息を吸い込んだときの新鮮な空気の流れは 口→肺/口→後気嚢 と流れます。
同時に 肺→前気嚢 と古い空気が押し出され、前気嚢に吐き出した空気がたまります。
息を吐き出したときの新鮮な空気の流れは 後気嚢→肺 と流れます。
同時に 肺→口/前気嚢→口 と古い空気が押し出されます。

対して哺乳類は横隔膜システムというアーキテクチャを選択しました。
前提として、肺には筋肉がないため膨らんだりしぼんだりできません。
横隔膜を下げ肺の外側にある胸膜腔の気圧を下げることで肺を広げます。
( 説明が難しいので割愛 )

さて、酸素の吸入効率では気嚢システムに軍配が上がります。
空気を吸い込んでいるタイミングだけでなく、吐き出しているタイミングでも酸素を取り込めるからです。
これにより上空数千メートルの高さでも鳥類は運動が可能となりました。

では横隔膜のシステムを選択したのは失敗なのかというと一概にそうとも言えないわけです。
横隔膜によるシステムを導入するために、哺乳類は肋骨を取り除くことで腹部の内奥物が比較的自由に動くようになりました。
これが胎生の獲得に繋がっていきます。


どの選択肢をとっても間違いではないと思います。
その決断を持って継続的に更に次の進化に繋げていけるか。

同時に決断したチームや個人に「あの選択は間違いだ」というのはおかしなことだと思っています。
決めて一歩進んだこと自体が進化なのです。

ひとこと

「だから何だ」という締めになってしまいましたが、迷ったら生物の短期・中期・長期的な戦略からヒントが得られると思います。

2023-12-09Diary,つぶやき