システムの保守には修繕計画が必要という話

こんにちは、CTOの山岡(@hiro_y)です。

ソフトウェア開発(特にWebアプリケーション開発)に携わっていると「レガシー」という表現をよく聞きます。でもよくよく考えてみると、ソフトウェアは放っておいても腐りませんし、錆びてしまうこともありません。しかし現実問題として、ソフトウェアは放っておくと否応なく「レガシー化」します。どうしてそうなってしまうのでしょうか。

(「レガシー」それ自体は悪い意味の言葉ではないはずですが、不思議とソフトウェア開発の文脈だとよくない意味合いの方が強くなってしまいますね…。)

レガシー化する理由とその対策

動いているソフトウェア自体が変化しなくても、周りの環境が変化します。OSのバージョンが上がったり、その上で動いているミドルウェアが変わります。また、最近だとクラウド環境を利用することが多いので意識することが減りましたが、ハードウェアも新しいものがどんどん出てきます。

また、セキュリティの問題やサポート期間の問題もあるので、その対応コストも見逃せない要因です。ソフトウェアは決して単体で動いているのではありません。環境それ自体が変化していってしまうのですから、RubyKaigi 2022で@hsbtさんが言及されたとおり「ソフトウェアは何もしないと壊れる」のです(文脈はだいぶ異なりますが、的を射た表現だと思ったので使わせていただきました)。

そのレガシー化を防ぐために(ソフトウェアの寿命をできるだけ延ばすために)、ソフトウェア自体の継続的なアップデートは欠かせません。いわゆるリファクタリングであったり、使用しているフレームワークやライブラリ、プログラミング言語のバージョンアップ等です。

きちんと計画的にアップデートできていれば、レガシー化のおそれから遠ざかることができます。たとえて言うなら、自動車のオイルやパーツを適宜新しいものと交換していくような、そうした取り組みです。

受託開発の場合

しかし従来型の受託開発の世界において、アップデートのコストは問題になり得ます。クライアント(発注側)にしてみれば、どうして動いているソフトウェアに追加コストが必要なのかよくわからない、という話です。

例えばシステムの保守契約を結んでいる場合、大きなアップデートが考慮されていることは希でしょう。アップデートをせずに保守を続けるとどうなるかというと、次のような事態に陥ります。

  • 利用しているフレームワークやライブラリに脆弱性がある
  • 利用しているフレームワークやライブラリが開発や公開を終了してしまう
  • 機能追加したいが、バージョン等の問題で新しく便利なライブラリを利用できない
  • ソフトウェアとして古いので、ベテランエンジニアしか修正できない
  • そもそも修正できるベテランエンジニアが確保できない
  • 若手エンジニアを担当にしづらい(成長機会にはなりづらいので)

皆さまの中にも思い当たる部分がある方もいらっしゃるのではないでしょうか…。

先程の自動車のたとえで言うなら、古いオイル・古いパーツのまま何も考えずに乗り続けることに等しいのですが、案外危険性は見過ごされます。あたかも今まで通り利用できるように見えるからです。しかし、実際のメンテナンスコストは上がり続けます。

受託開発の保守コストをどう扱うべきか

システムの保守契約の場合、一般的に毎月(あるいは毎年)、同じ金額で請け負い続けることが多いと思うのですが、実際のコストは先程書いたとおり上がっていきます(ただし、完全に塩漬けで手を入れない、何か問題が起こっても対処しない場合を除きます。それはもはや保守ではない気もしますが…)。

そのまま数か月、あるいは数年経つと立派なレガシーのできあがりです。たとえ大きな改修に見えない作業でも、かかるコストがどんどん大きくなっていく。そしてエンジニアもどんどん触りたくなくなる…。負のスパイラルですね。

コストに基づくのであれば、保守費は段階を追って(年に一度とか)値上げしたいところです。実際かかるコストは上がっていくのですから、それをきちんと反映させればよいのです。ただ、実際保守費の値上げを続けられるかというと難しいと思います。同じように使えている(ように見える)のに、上がっていくのは直感に反するからです。

だからコストが上がってしまわないように、マンションの修繕計画と同じように、将来にわたってのアップデート計画をクライアントと一緒に立てられるとよいのではないでしょうか。アップデートの必要性については、計画をきちんと説明すればわかってくれることも多いと思います。自動車とかマンションとか、たとえ話にしてもよいかもしれません。

もちろん、保守を諦めて新しいシステムをフルスクラッチで作り直す、という手もあります(新車を買うとかマンションを建て替えるような話ですね)。当然それはそれで費用がかかるものなので、そのコストと効果によるのですが。

いずれにせよ、ソフトウェアにはアップデートが必要なこと、そのための修繕計画をエンジニアリングの専門家としてクライアントと一緒に考えることはソフトウェア開発のプロフェッショナルとして誠実なふるまいだと思います。何も考えずに保守するのではなく、きちんと計画を持って保守していくことができれば、レガシー化を避けられる未来もあるのではないでしょうか。