「レガシー」なシステムと戦うために必要なのは、「技術」だけではない
こんにちは、エンジニアのgamiです。
ソフトウェア開発の世界にいると、「〇〇というシステムはかなりレガシー化している」といった言葉を耳にすることがよくあります。実際に過去に僕自身が関わったシステムにも、これは「レガシー」と言えそうだぞ、というものがいくつかありました。(それはそれはレガシーだったのですが、語ると長くなるので別の機会に。)
一方で、あるシステムが「レガシー」かどうかを定量的に評価する標準指標のようなものが広く普及しているわけでもありません。ソフトウェア開発に関わったことがない人からすると、「レガシーシステム」とはどんなもので、何が問題で、どう対応すればいいのか、というのがわかりにくい状況であると感じます。
もちろん、そもそも問題が無ければ対処する必要もありません。しかし、たとえば経産省が公開しているDXレポートでは、「約7割の企業が老朽システム(レガシーシステム)がDXの足かせになっていると感じている」とされています。
(DXレポート 経済産業省)
最近、僕は『Engineers in VOYAGE ― 事業をエンジニアリングする技術者たち』という本を読んでいます。VOYAGE GROUPのエンジニアたちが、数ある自社システムの開発や運用について話した、非常に現場感ある対談が6つ収録されています。中でも、第3章の「VOYAGE MARKETING - 20年級大規模レガシーシステムとの戦い」(以下、「VOYAGE MARKETING」)では、レガシーシステムの一例とその戦い方が詳しく描写されていました。まさにレガシーシステムとは何かを理解するための教科書として使えそうな内容です。
今回は、この「VOYAGE MARKETING」をガイドラインにして、レガシーシステムとは何かについて考えていきます。
「レガシー」なシステムとは何か?
「VOYAGE MARKETING」では、「ECナビ」にまつわるシステムが「レガシー」として取り上げられています。そのレガシーさは、たとえば次のように表現されています。
まとめると、「歴史的経緯によって、システムが巨大化複雑化し、全体を把握できなくなった結果、場当たり的な機能追加が行われるようになっている状態」といった具合でしょうか。システムとは当然「作って終わり」ではなく、事業の変化にともなって新機能がどんどん追加されていきます。その中には当初の予定にはない機能も多く含まれ、初期のシステム設計では想定されていないような発展の仕方をすることもあります。使われ続けるシステムというのは、「その機能群を実現するシステムをゼロから作ったらこうなる」という理想状態からどんどん乖離していく宿命を抱えています。その乖離が大きくなりすぎた状態が、「レガシー」と形容されるシステムの一般的なイメージです。
さらに、レガシーシステムの何が問題であるかについては、次のようなエピソードが紹介されています。
レガシーシステムの大きな問題点は、「既存のシステムに悪影響を与えずに新機能を開発するためのコスト」が膨れ上がっていくということです。気付かないうちにジワジワと開発スピードが落ちていき、身動きが取れなくなっていくわけです。
「どこから手を付けるか?」という大問題
「VOYAGE MARKETING」では、レガシーシステムが目指すシステムの理想状態について、たとえば次のように書かれています。
レガシーシステムの克服では、ビジネスの拡大を止めないために、巨大化複雑化したシステムをどうダイエットするかを考える必要があります。もちろん、「運動したら痩せる」というような単純な話にはならず、事業や機能を整理しながら、無駄な部分を消していき、必要十分なサイズのシステムに徐々に作り変えていくというプロセスを踏むことになります。
一方で、全体を把握できなくなったレガシーシステムは、「どこをどう変更したら壊れるかよくわからない」という恐ろしさを抱えています。その不確実な恐ろしさを前にして、どのようにレガシーと戦っていけばいいんでしょうか?
この「レガシーと戦うときに何から始めるべきか?」という点がかなり具体的に書かれていたのが、「VOYAGE MARKETING」の最も価値ある情報だと僕は感じました。この本の中では、ECナビの開発チームが優先度高く取り組んだこととして、次の2点が挙げられていました。
1つは、ひたすら「現状把握」をしにいったということです。
巨大で複雑なシステムを前にすると、それを無視して「ゼロから作り直したい。。。」という気持ちになりがちです。一方で、実際に事業的価値を生み出している現行のシステムの詳細を把握することなしに、その価値を維持したまま新システムとしてアーキテクチャを設計し直すということは不可能です。逆に、既存システムに対する認識をクリアにしていくことで、開発チーム内での齟齬が減り意思決定のスピードが早くなったり、他のチームを説得しやすくなったりします。
2つ目が、インフラをコントロール可能な状態にすることです。そのためのソリューションとして、オンプレ前提で組まれた既存システムをAWSに移行するという大戦略を立てたことが紹介されています。
インフラをクラウドに移行し、開発チームだけでコントロールできるようにすることで、現状把握や改善のスピードを上げていこうとしたわけです。世の中の対レガシープロジェクトではクラウドを利用すること自体が目的化しがちですが、冷静な課題認識から血の通った意思決定としてのクラウド移行が語られており痺れました。ちなみに、「なぜクラウドインフラを使うと開発チームでインフラをコントロールしやすくなるのか」を理解するにはおそらくDevOpsやIaC(Infrastructure as Code)について知る必要がありますが、長くなるので別の機会に譲ります。
他にも「事業葬り/機能葬り/コード葬り」の3つに分けてシステムをダイエットした話や、技術的負債を返済するという意思決定をどのように通したのかなど、価値あるトピックがたくさん書かれています。詳細はぜひ本書を読んでみてください。
「技術的負債」は必ずしも技術的問題ではない
最後に、レガシーシステムと密接に関係する「技術的負債」という言葉について補足します。「VOYAGE MARKETING」でも、「技術的負債」という言葉がしばしば登場します。
この「技術的負債」についてはソフトウェア業界においてある種の誤解を帯びながら語り尽くされており、検索すれば玉石混交の記事がヒットします。『エンジニアリング組織論への招待』の著者である広木大地さんの記事では、その誤解も含めて「技術的負債」という言葉の意味するところがわかりやすく解説されています。
上記記事では、「技術的負債」という言葉は「不可解な開発速度の低下」を説明しようとしている、という前提をおいています。その上で、次のように問題の本質を指摘しています。
「VOYAGE MARKETING」でも、こうした情報の非対称性から来る問題について言及されています。
「技術的負債がある」と言われるとき、その問題は純粋に「技術」によって解消できると誤解されがちです。一方で、システムの理想状態というのは当然、技術的な観点からのみ導かれるものではありません。どの機能が重要で、どの程度のリスクが許容されるかなど、事業上の意思決定の積み重ねの上に、「必要十分なシステム」がどういったものかが定義されていきます。
「VOYAGE MARKETING」の中でも、実際に開発チームが「技術的負債の蓄積」を経営上の課題として捉え、他のチームとの「コミュニケーション」によって情報の非対称性を解消していく様子が紹介されています。こうしたシステムとコミュニケーションを巡る話は、「DXとは経営や組織の変革である」という話に通じているように思います。
外注プロジェクトでの「技術的負債」との戦い方
以上が、今回書きたかった話でした。
蛇足として、「VOYAGE MARKETING」では語られていなかった「外注システムとレガシー克服」について考えたことを載せておきます。
「VOYAGE MARKETING」の例では、社内の開発チームがレガシーシステムと戦っていました。一方、世の中の多くのレガシーシステムは、いわゆるSIerや受託開発会社に開発や保守運用が外注されていることでしょう。こうした外注されたレガシーシステムの場合、戦い方はより複雑になるはずです。
外注によって問題が複雑化するのは、発注者と受注者との間で利害が一致しないというところに一番の要因があります。一般的な契約形態では、システムの受注者側に「技術的負債を返済する」ということへのインセンティブが自然には働きません。極端に言えば、工数見積による保守契約を前提にした場合、受注者からすれば「新機能開発に時間がかかればかかるほど儲かる」という状況にさえなります。つまり、技術的負債をたっぷり抱えた状態を維持し続けたほうが、見積もりも膨れ上がり、売上が上がるというわけです。さらには、「全体を誰も把握できないシステム」の方が他の開発会社によるリプレースの難易度が上がるので、ベンダーロックインしやすくなるという事情もあります。
この問題に対処するには、おそらく2つの方向性があります。
1つは、発注者側にシステム開発の責任者を(できれば経営レベルで)置き、開発プロジェクトに対するガバナンスを強力に効かせられるようにする、というアプローチです。責任者がシステムの現状把握を徹底的に行い、「技術的負債」を評価できるようになる状態を目指します。その上で、「技術的負債」を返済することを目的としたプロジェクトを立ち上げて受注者側の見積もりを取るようなアプローチです。
しかし、前述した利害の不一致を根本的に克服できるような方法ではなく、茨の道ではあります。また、プロジェクトが終了してしまうとまた技術的負債を無計画に積み上げてしまうなど、継続的な返済活動が見込めない恐れがあります。
2つ目は、発注者と受注者でレベニューシェアをするような契約形態を採用する、というアプローチです。受注者側に「開発スピードを維持すること」のインセンティブを契約レベルでもたせることができれば、同じ目線で意思決定ができるようになります。もちろん、そのような契約はまだまだ一般的ではなく、契約締結やプロジェクト進行の難易度は上がります。
一方で、「VOYAGE MARKETING」で語られている次のような開発文化を当然のものにしていくためには、自社の採用プロセスによって開発エンジニアのカルチャーマッチを見極め、同じ組織の中に自己組織的な開発チームをもつ必要があると強く感じます。
レガシーシステムへの対処について考えた場合も、やはり理想的には徐々に内製開発におきかえていくというアプローチが有効であるように思います。とはいえこれがすぐにできたら苦労しないという話は大いにあるので、「外注システム開発×レガシーシステムとの戦い」を描いた書籍が執筆されることを願うばかりです。(すでにあったら教えて下さい!)
ここから先は
仕事を楽しくするデジタルリテラシー読本
【初月無料】デジタル時代の歩き方について考えたことを発信します。ソフトウェアの時代とは何か。エンジニアの頭の中はどうなっているのか。NoC…
サポートをいただけると、喜びドリブンで発信量が増えます!初月無料のマガジン『仕事を楽しくするデジタルリテラシー読本』もおすすめです!