システム開発で、最もやってはいけないのが、デグレードだ。これをやってしまうと、お客さんは激怒する。お客さんが他のお客さんにサービスを提供している類なら、お客さんも、そのお客さんも、みんな激怒する。それだけ恐ろしいことだ。
やってはいけないのだが、何も考えずにソフトウェアを変更していれば、しょっちゅうデグレードは発生する。エンジニアをやっていれば、多かれ少なかれ、必ずこの言葉をどこかで聞くことになるはずだ。今回は、デグレードをどうやって防止するかについて整理する。
デグレードとは?
デグレード(以下、デグレ)とは、新しいバージョンのソフトウェアの品質が、以前より悪くなることを意味する。「リリース後に前の機能が動かなくなった」といった場合はデグレだ。筆者もデグレに悩まされてきた。不具合修正案件の場合は、わざわざ「デグレをさせないこと」というのを要件としていたぐらいだ。また、「デグレをさせないために、どのようなことをしようとしているか」を開発者に説明してもらっていたくらいだ。デグレのやっかいな点は、変更した箇所以外のところで不具合が出現する点だ。したがって、変更箇所を起点として作成したテストをすり抜けることが多い。
デグレが発生するメカニズム
なぜデグレが発生するのかについて整理する。デグレというのは、ある機能を変更することで、ほかの機能がその変更の影響を受け、結果として他の機能が動かなくなることだ。そのようなケースを整理すると、下記パターンとなる。
- ①変更により、他モジュールから参照されている共通変数の中身が書き換わった
- ②変更により、変更したモジュールのふるまい(戻り値)が変わった
- ③変更により、変更したモジュールのふるまい(速度低下)が変わった
①他モジュールから参照されている共通変数の中身が書き換わった
この場合は、2通りのパターンに分かれる。
・明示的に共通変数を書き換える場合
・意図せず共通変数を書き換える場合
前者に関しては、見ればわかるものであるので問題ない。後者に関しては、ソースコードを見てもすぐわからないので問題だ。たいていは別モジュールを呼び出したことにより、呼び出されたモジュールが共通変数を書き換える場合だ。意図せず共通変数を書き換えていないか、変更した際に使用するモジュールが何をしているのか、よく理解しておく必要がある。
②変更したモジュールのふるまい(戻り値)が変わったケース
このケースは非常によくあるケースだ。呼び出し元は振る舞いの変更など知らずに動作しているので、いきなりモジュールの戻り値が変わってしまうと、動くわけがない。従って、原則として、振る舞いが変わってしまう場合は、呼び出し元を全部調査して影響がないことを確認することとなる。
しかしながら、この作業はとてつもなくめんどくさい。ちなみに、筆者が関わった大規模プロジェクトでは、テキストエディタのgrep機能でモジュール名を調べただけで、数分かかることがあった。その後に絶望したのは言うまでもない。
③変更したモジュールのふるまい(速度低下)が変わったケース
このケースもよくある。呼び出し元は、呼び出し先のモジュールの処理が終わらないことを想定してタイムアウト処理を行うことがある。変更により処理が遅くなった結果、なんだか動きがおかしい、となることはよくある。
影響調査が必要な個所
前述のデグレを起こさないために、どのような影響調査をしなければならないのかを、下記図に示す。
先項でも記載した通り、デグレードというのは、処理変更により、共通変数もしくはモジュールの振る舞いが変わったときによく発生する。
したがって、まず実施すべきは、処理変更(処理B-②)による共通変数の置き換え有無の調査だ。共通変数が変わらないのであれば、他モジュールの振る舞いが変わるようなことはほとんどない。
次に調査すべきは、変更した箇所以降に動作する処理(処理B-③)だ。処理B-②は当然動作が変わるであろう。となると、そのすぐ後ろに動くプログラムに影響がないかを確認すべきだ。モジュール単位で振る舞い(戻り値や速度)が変わらないなら万々歳だ。以降の影響調査をする必要はない。
最後に調査すべきは、変更したモジュール(モジュールB)の呼び出し元(モジュールA)だ。変更モジュールの振る舞い(戻り値や速度)が変わるのであれば、確認しなければならない。何度も言うが、全部確認しなければならない。全部確認しないと、問題ないことを保証できないのだ。
デグレを防止するためにやるべきこと
これまでの話を踏まえて、デグレを防止するためにやるべきことをまとめる。
①[設計]変更をする場合は、なるべくモジュールの振る舞いを変えない変更にする
②[検証]変更箇所による、共通変数の書き換え有無を確認する
③[検証]変更箇所による、変更箇所以降への影響有無を確認する
④[検証]変更箇所が存在するモジュールの振る舞いが変わる場合は、当該モジュールの呼び出し箇所すべてへの影響有無を確認する
⑤[設計]影響がある場合は、対策を検討する
④の作業は、本当にしんどい。どれだけツールで影響調査をしても、最後にハンコを押すのは人間なのだから、必ず一通りチェックをしなければならない。SEという仕事は大変だ。