新人OJTネタです。
前に引き続き、
コーディングレビューでの一コマ。
とあるコマンドのエンハンスをしたときのこと。
コマンドを実行することで、サービスを停止するという処理があるところに、ある設定ファイルを追加して、その設定ファイルに定義されている名称を、返すステータスと一緒に出るようにするというエンハンスですが…
[エンハンス後の処理(イメージ)]
※ 黄色部分がエンハンスする部分の処理
というように、設定ファイルの読み込み処理を追加。
この設定ファイルを読み込み処理で、設定ファイルが読み込めなかった場合にどうするか?というところで…
設定ファイルが読み込めない場合、例外スローをしてエラー終了するように実装されていました。
仕様書には確かに上記フローのようにしか書かれていないので、エラー時の動作ははっきりしておらず、コーディングレビューになって始めて出てきたわけですが、このコマンドの用途を考えると結構危ない仕様です。
当人にこのような仕様で実装した経緯を聞いてみると、「そもそもファイルがない時点で環境不正だから、処理を停止するべきだと判断しました。」とのことでしたが…
今まではコマンドが途中でクラッシュしない限りは、サービス停止自体は必ず行われていましたが、このエンハンスによりファイルの読み込みができないとサービスが停止できなくなることに。
こうなると、仮に環境が壊れてファイルが破損もしくは消えてしまった場合、コマンドで永久にサービスが停止できないことになります。
(もちろん、プロセスKILLなどでいくらでも止める手段はありますが、それは知っていればで、一般ユーザにプロセス名やサービス名などを公開しているわけはありませんので。)
サービスが停止できないとなると、当然再インストールによる復旧もできないため、見方によってはデグレード…ということにもなりかねません。
そのコマンドだけで閉じていれば(状態を表示するだけのコマンドで、他のプログラムが使用することはないなど)、環境不正で異常停止させることは問題ないと思いますが、そうではない場合、チェックをしっかり入れて良かれと思い仕様を変えてしまうことで、今までできたことができなくことは、結構ありますからね…。
やはりこういったことは、面倒だからといって仕様を明確化しないというのは危険ですね…。