自らのミスをプログラムという「よくわからないもの」のせいにしたい人たち(続き)

悪魔の影のイラスト

先日のこの記事の続き。


自らのミスをプログラムという「よくわからないもの」のせいにしたい人たち – NOBODY:PLACE


記事内容をかいつまんで言うと、「人為的ミスが疑われる給与の計算間違いについて報告したら、ソフトのバグだったという回答が来た」という内容です。



問題はブラックボックスに放り込め

技術者にとって「バグ」とは、実体のつかめないよくわからないもの……ではないですよね。今時点で原因がわからずともそれは「まだ判明していない」というだけであって、実装ミスや設計ミス、仕様書の間違いやハードウェア的な制限などを理由として、意図したとおりにプログラムが動いていないことをバグと呼ぶはずで、逆に言えばなんらかの原因があって起きる不具合であるとも言えます。「バグ」がある以上必ず原因と責任が存在していて、「バグ」とは原因を調査・確認した上で修正されるべきものです。現実的には原因の特定や修正が難しい場合もありますが、その場合でも「バグ」を回避して意図したとおりに動くことを目的にするでしょう。「バグ」とはそういう類のものです。

一方で非技術者が語る「バグ」とは、思った通りの動作をしないときに、誰も間違ったことをしていないことを示すために責任を押しつけるためのもの。「バグのせいでこんなことになった」というセリフには、「僕は何も悪いことはしていないんだけど」というエクスキューズが隠されています。ここでは本当に「バグ」であるかどうかは問われず、原因不明であればあるほどよい。機械やハードウェアならいざ知らず、一般的なプログラムには「機嫌」といったものは存在していないはずですが、つまり何か条件を与えればそれに対していつも同じ答えを返すはずですが、ここで語られる「バグ」にはソフトウェアの機嫌だとか、何回か試すと上手く行くとかそういうことも含まれます。自分が悪いことをしてしまったどころか、ソフトウェアの出来の悪さを自分が補っていると言わんばかりです。まあ、色んなソフトウェアがあるので一概には言えませんが、開発者の方が聞いたら泣いちゃいますね。



「バグ」か?人為的ミスか?

「こういう条件が揃うとこういう挙動をする、それが意図しない結果をもたらす」

一般的な「バグ」の仕組みはこうです。確かにソフトウェアの問題であることが多いのですが、条件を設定する人間の方にもミスがあることがあります。


「タイムカードで記録された勤務時間から休憩時間の1時間を差し引く」という処理があったとして、それを労働時間の長さによらず適用してしまったらそれはソフトウェアの「バグ」です。そういう会社もあるかも知れませんが、労働基準法を遵守する一般企業においては6時間以上8時間未満は少なくとも45分、8時間以上は少なくとも1時間休憩を与える、6時間未満の勤務の場合には休憩時間はなしとなっていて休憩時間を差し引く必要はありません。普通のソフトウェアならそれは考慮されているでしょうし、かつ、それでも1時間を差し引くように設定も出来るでしょう。で、その設定に不備があればそれは当然設定した人間のミスです。設定に異を唱えないプログラムは不親切かも知れないけれど、設定通りに動作した結果に対して「バグ」だと批判されるいわれはありません。だってかわいそうじゃないですか、ねえ。言われたとおりにやってるのに。


もちろん、きちんと設定しているのに設定通りに動いていないのであればそれは「バグ」です。とある人が開発したプログラムが、設定を無視して動いているように見えてものすごく悩んだことがありましたが、よくよく調べたらなんのことはない、設定の一部だけがハードコーディングされてました。そりゃ設定してもきちんと動かんわけだわ。100歩譲ってハードコーティングしたいならそれでも別に良いけど、だったら設定ファイルを読み込んでるフリすんなよ。


時にはそういうこともありますが、一般的なプロダクトにおいては、そこまで酷いのはなかなかないんじゃないかな。誰かのせいにする前にまず見直すのは設定。使用環境。パソコンのユーザーサポートにおいて「電源が入らない」というクレームに対して「わかりました、一度電源プラグを抜いてみてもらえますか」とアドバイスするというライフハックがありますが(「電源プラグは刺さっているもの」という思い込みがあるので、「電源プラグは刺さっていますか?」と聞いても人は必ず「刺さってます」と答えてしまう。「抜いてもらえますか」と言われて初めて確認する)、それと同じで、設定を変更してみてもらえますかと言ってあげたい。それ、「バグ」じゃないかもよと。



「よくわからないもの」のせいにしたい人たち

で、結局のところ、「バグでした」で終わりにした人たちというのは、原因は求めていないんですよね。手っ取り早く問題を解決したい、問題のない状態にしたい、ただそれだけで、再発防止とか関連事案の調査とか求めてない。下手に調べて自分のせいになっても嫌だし、誰かの責任を暴いてしまって揉めても嫌だし、その点、文句を言わないソフトウェアのせいにしてしまえば誰も困る人はいないし誰も責任を取らなくて良いし、八方丸く収まる。

で、先の休憩時間の差し引きのような場合、

  • 勤務時間の長さによらず休憩時間が差し引かれてしまうので(「バグ」と呼称)
  • 自動で勤務時間を計算したあと目視でシフトを確認して
  • 休憩時間を差し引かなくていい日を計算して手動で勤務時間に加算

というバッドノウハウと謎のルーチンが発生し、属人的に管理され、担当者が変わるたびに「バグ」が発現して被害が出るということになるわけですが、それでもやっぱり悪いのはソフトウェアと目視を徹底しなかった担当者。いや、そこじゃないんだと思うけど、まあでも良くあることです。内製エンジニアやってる会社のバックエンドシステムでもよくある。要件と違ったことを強引にやって変な処理が行われて、それを是正するために一度プリントアウトしてペンで書き直すとかいう頭がクラクラするルーチンが継承されてたこともありました。いやあ……おかしいときはおかしいって言おうぜ。変えて欲しいときは変えて欲しいって言おう。頼むからペンで書き直したのをあとでまとめて手入力するとかいうこと考えるの止めて……頼むから。



技術者が良く言う「バグって言うな問題」とはまた違った意味で、ソフトウェアのせいにするならしてもらっても構わないんだけど、でもそう断定するだけの根拠が希薄なことが多いわけだから、責任をソフトウェアになすりつけるんじゃなくて人間の方も何かミスってなかったか確認ぐらいはしましょうよ、それがソフトウェアを使う人間の責任なんじゃないですかね、ということを思うんですけど、でもやっぱり今日もまた疑いは掛けられ続けるのだよなあ。うちの子じゃなくても不憫に思う。なんとかならんか。