
ギリシャ神話に「テセウスの船」の話がある。アテネの人々は、テセウスが乗って帰ってきた船を何世紀にもわたって保存した。古い板が腐れば新しい板に取り替え、また取り替え。やがて元の板が一枚も残らなくなったとき、哲学者たちは問うた。これはまだテセウスの船なのか?
ソフトウェアエンジニアリングにも、この逆説とまったく同じ形のパターンがある。Strangler Figと呼ばれていて、同じパターンを人によってはShip of Theseusと呼ぶこともある。
Strangler Figは熱帯の絞め殺しイチジクから取った名前だ。宿主の木に巻きついて成長し、最終的には宿主を置き換える植物で、レガシーを段階的に置き換える戦略と似ているからとMartin Fowlerが2004年に名付けた。「絞め殺し」という名前が荒っぽいせいか、Ship of Theseusパターンとも呼ばれる。
私のいるスタートアップにも、こういう船が一艘ある。最初はDjangoのモノリスだった。すべての機能がひとつのコードベースに収まっていた。MSAへ移行するなかで機能をひとつずつ剥がし、Djangoはリクエストを各サービスに転送するプロキシになった。板を一枚ずつ取り替えてきたわけだ。そして今、そのプロキシまでもがSpring WebFluxに置き換える作業が始まった。最後に残った一枚だ。
この置き換えが終われば、Djangoのコードは一行も残らない。そのとき、テセウスの船と同じ問いが立ち上がる。これは同じサービスなのか?名前は同じ、同じユーザーが同じリクエストを送っている。しかし最初のコードは一行もない。
それでも同じ船だろう。板が木でも鉄でも、同じ海を渡って同じ目的地にたどり着くなら、それは同じ船だ。とりわけソフトウェアにおいてアイデンティティはコードではなく契約にある。同じユーザーが同じリクエストを送り、同じレスポンスを受け取る限り、それは同じサービスだ。コードはその契約を一時的に支える板にすぎず、それを替えたところで船が変わるわけではない。むしろ同じ契約を、より速く、あるいはより遠い海まで届ける営みだ。古い板には限界があり、それが私たちが板を替え続け、問い続ける理由だ。