The Rewrite Loop:
終わりのない旅
「レガシーシステムを捨てて、ゼロから作り直そう」。
その甘美な誘惑が、企業のIT戦略を「永遠の未完成」へと突き落とす。
システム刷新プロジェクトの9割が失敗する構造的欠陥と、そこから抜け出す唯一の道。
- 「今のシステムはスパゲッティ状態だから、保守するより作り直した方が早い」という意見がエンジニアから出ている
- 「次期システム刷新プロジェクト(20xx年稼働予定)」という計画が3年以上続いている
- 要件定義において、「現行踏襲(今のシステムと同じ動き)」という言葉が頻出する
- 新システムリリース日(X-Day)に向けて、すべての機能改修をストップ(凍結)している
- 実は、過去に一度システム刷新に失敗(頓挫)した経験がある
そのまま進めば、数十億円の損失は確実です。
序章:ビッグ・リライ(The Big Rewrite)の誘惑
プログラマーなら誰でも、一度はこう思ったことがあるはずです。
「こんなクソコード、直すより新しく書いた方が早い」と。
古いシステム(レガシーシステム)は、醜いものです。継ぎ接ぎだらけで、変数名は意味不明、ドキュメントは更新されておらず、ちょっと変更すると全く関係ない場所でバグが出る。
そんなコードと格闘している時、エンジニアの頭の中には「理想郷」が浮かびます。
最新の言語、最新のフレームワーク、きれいなアーキテクチャ。技術的負債のない、ピカピカのグリーンフィールド。
経営者にとっても、この提案は魅力的に聞こえます。
「今のシステムは限界です。ゼロから作り直せば、開発スピードは2倍になり、バグも激減します。DXも実現できます」
そう言われれば、数億円の投資も「将来への必要なコスト」に見えてきます。
しかし、これが最大の罠です。
「ゼロから作り直す(Rewrite)」という決断こそが、ソフトウェア開発における最大の戦略的ミスである。
これは私たちの意見ではなく、ジョエル・スポルスキ(Stack Overflow共同創業者)をはじめ、多くの業界の巨人が警告し続けてきた事実です。
Netscapeの教訓と歴史的敗北
IT業界には、語り継がれるべき「敗北の歴史」があります。その最も有名な例がNetscape社です。
2000年代初頭、Netscape Navigatorは世界シェアNo.1のWebブラウザでした。しかし、彼らのコードは度重なる改修でスパゲッティ状態になっていました。
そこで彼らは決断しました。「コードを捨てて、バージョン6.0としてゼロから書き直そう」と。
結果はどうなったか?
彼らがコードを書き直している3年間、Netscapeは市場に新機能を一切リリースできませんでした。
その隙に、Microsoft(Internet Explorer)は不格好ながらも着実にアップデートを重ね、新機能を出し続けました。
3年後、ようやく完成したNetscape 6.0がリリースされた時、市場は完全にIEに支配されていました。しかも、書き直したばかりのコードはバグだらけで、動作も重かったのです。
唯一の資産である「知識」を捨てることだ。
古いコードが汚いのには理由があります。
「ある特定の古いルーターに対応するための回避策」「文字化けを直すためのパッチ」「特定の日付計算バグへの対応」......。
それらの汚い行の一つ一つが、過去に実際に起きた問題への「解決策」であり、システムの「免疫」なのです。
ゼロから書き直すということは、これら全ての免疫を失い、過去に踏んだ地雷をもう一度全て踏み直すことを意味します。
氷山の一角 - 「仕様書」には何も書かれていない
「大丈夫です。今のシステムの仕様書(設計書)がありますから、それ通りに作ればいいんです」
リニューアルプロジェクトの開始時、PMは自信満々にこう言います。
しかし、5年以上稼働しているシステムにおいて、「仕様書」と「実際のコード(挙動)」が一致している確率は限りなくゼロです。
日々の小さな改修、緊急対応、データパッチ......それらはコードには反映されても、Excelの仕様書には反映されません(ドキュメントの陳腐化)。
リプレイスプロジェクトで必ず起きるのが、「現行踏襲」の罠です。
「現行通りに作って」と依頼されたエンジニアは、仕様書通りに作ります。
しかしテスト段階で、現場ユーザーから「動きが違う!前のシステムではここでエラーが出なかった!」「この計算結果、端数処理が違う!」と猛烈なクレームが入ります。
調べてみると、仕様書にはない「暗黙の仕様」がコードの奥深くに埋め込まれていたことが判明します。
真の仕様書は、ドキュメントではありません。
「稼働しているソースコード」だけが、唯一の真実の仕様書なのです。
それを捨てて、陳腐化したドキュメントを頼りに再構築するのは、目隠しをして迷路を歩くようなものです。
動く標的 - ビジネスは開発を待ってくれない
システム刷新には時間がかかります。大規模な基幹システムなら2年、3年は当たり前です。
ここで問題になるのが、「ムービング・ターゲット(Moving Target)問題」です。
プロジェクト開始時に要件を凍結(Fix)したとしましょう。
しかし、開発中の2年間、ビジネスは止まってくれません。
新しい競合が現れ、法律が変わり、社内の組織変更があり、新しい商品が発売されます。
現行システム側では、それらに対応するために(汚いコードに更にパッチを当てて)機能追加を続けます。
一方、新システム開発チームは「2年前の要件」に向かって開発を続けています。
そして2年後、新システムが完成した瞬間、それは「リリースされた瞬間に時代遅れ(レガシー)」になっています。
現行システムでこの2年に追加された機能が、新システムにはないからです。
ここから、デスマーチ(死の行進)のような「追加開発キャッチアップ」が始まります。いつまで経っても現行システムに追いつけないアキレスと亀の競争です。
セカンドシステム症候群 - 肥大化する欲望
フレデリック・ブルックスは名著『人月の神話』の中で、「セカンドシステム症候群」について警告しました。
最初のシステム(ファーストシステム)を作ったエンジニアが、その時の「あれもやりたかった、これもやりたかった」という抑圧された欲望を、2番目のシステム(リニューアル)に全て詰め込もうとする現象。
リニューアルプロジェクトでは、「せっかく作り直すんだから」という心理が働き、機能が肥大化しがちです。
「AIも入れよう」「マイクロサービス化しよう」「多言語対応しよう」「スマホアプリも同時に出そう」......。
要件は膨れ上がり、技術的難易度は跳ね上がり、スケジュールは破綻します。
シンプルに「現行の機能を置き換える」ことさえ難しいのに、そこに「理想の機能」まで乗せれば、プロジェクトが沈没するのは必然です。
解決策:ストラングラー・フィグ(絞め殺しの木)パターン
では、私たちは古びたレガシーシステムと心中するしかないのでしょうか?
いいえ、答えは「ビッグバン(一括刷新)」ではなく、「漸進的移行(段階的移行)」です。
その代表的な手法が、マーティン・ファウラーが提唱した「ストラングラー・フィグ(絞め殺しの木)パターン」です。
巨木を枯らすのではなく、絡みついて入れ替わる
熱帯雨林に生息する「絞め殺しの木(イチジクの一種)」は、宿主となる巨木に絡みつき、何年もかけて成長し、最終的には元の木を枯らして自分がその場所を占拠します。
システムの入り口にAPIゲートウェイ(プロキシ)を置く。
最初は全てのリクエストを現行システム(レガシー)に流す。
【STEP 2: 小さな切り出し】
「ユーザー認証」や「商品検索」など、特定の一機能だけを新しい技術で作り直す(マイクロサービス)。
プロキシの設定を変え、その機能へのアクセスだけを新システムに流す。
【STEP 3: 繰り返す】
これを機能単位で繰り返す。数年かけて、徐々にレガシーシステムへのアクセスを減らしていく。
【STEP 4: レガシーの停止】
全ての機能が移行された時、レガシーシステムをシャットダウンする。
この方法の最大のメリットは、「価値を出し続けられる」ことです。
3年待つ必要はありません。最初の1ヶ月で「検索機能」が新しくなり、ユーザーはその恩恵を受けられます。
もし失敗しても、プロキシを切り戻せばいいだけなので、リスクは最小限です。
Netscapeのような「3年間の空白」は生まれません。
リファクタリングという「掃除」
作り直しではなく、既存コードを「リファクタリング」し続けることも重要です。
ボーイスカウトのルール(来た時よりも美しくして去る)のように、機能追加のついでに、触った箇所のコードを少しだけきれいにする。
変数を分かりやすくする、関数を分割する、テストコードを書く。
地味ですが、これが「腐敗」を止める唯一の特効薬です。
終章:永遠のベータ版として生きる
「システム完成」という言葉を捨ててください。
ビジネスが続く限り、システムは永遠に未完成であり、永遠のベータ版です。
一度で完璧なものを作ろうとするから失敗するのです。
変化に強いシステムとは、頑丈な城塞ではなく、代謝を繰り返す生物のようなものです。
一部が死に、新しく生まれ変わり続ける。
「The Rewrite Loop(再構築の無限ループ)」から抜け出し、「The Refactoring Loop(改善の無限ループ)」へ。
それが、100の失敗を乗り越えた先にある、持続可能な開発の姿です。
START OF ENGINEERING.