プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

プログラムは偶然で動く


コードを直したくなる衝動にかられることは多くあります。しかし、コードを修正するということは変更した部分に関して責任を持つということです。たとえ1ラインの変更であっても、それに伴う動作確認の工数を、プログラマはあらかじめ予測し、リスクに備えておく必要があるでしょう。

コードを直したくなる衝動


小野和俊さんのブログより:


人のプログラムを自分色に染めてしまいたくなる衝動

担当者に代わって機能追加を行うのが本来の目的だったはずなのに、
該当箇所の周辺の実装をフムフムなるほどと確認しているうちに
自分だったらこう書くな、と思う箇所があると、
直接関係ない箇所まで自分色に染め始めてしまうのが
プログラマーとしての私の性質の一つである。


私もそういう衝動にかられることはよくありますね。レベル1/2はまあまあ許せるとして、レベル3あたりになると、ちょっと耐えられなくなってきます。ただ、明らかにバグと思われるコードであっても、実際に書き換えるのはちょっと怖いです。特にそのソフトウェアがすでに出荷した後であった場合は。


少しの修正であっても、コードを直すことは勇気が必要になることがあります。その原因はどこにあるのでしょうか。

プログラムは偶然で動く


プログラムは偶然で動く。


ソフトウェア業界で働き始めて25年あまりになります。長いわりにそれほど多くの経験をしてきていないのですが、そんな私でもプログラムというものは偶然で動いているのではないかと思うようになりました。


そう思うようになった理由は以下のようなことからです。

暗黙の了解が増えていく


ソフトウェアは作れば作るほど暗黙の了解が増えていきます。


どんな入力データが来ても大丈夫なように設計する。簡単そうで一番難しいのがソフトウェアの入力データチェックです。最初は色々なケースを考えてデータの範囲や正当性をチェックするコードを書くでしょう。しかしながら、あらゆるケースを想定して処理ロジックを組むと、かなりの作業量となることがあります。そこで「この実装ではこの範囲のデータしか想定しない」という割り切りをすることになります。


しかし、それが意外な使われ方をしたりすると、思わぬバグを呼ぶことがあるのです。しかもそういう細かな「仕様」は作ったプログラマしか知らないことも多く、問題を複雑にしがちです。「理由はよく分からないけど、このライブラリは必ず最初の呼び出しが失敗する」といった経験はありませんか!?

品質が一定ではない


同一人物が書いたコードでも、品質は一定のものになりません。


実際にコードを書く時、プログラマはいろいろなことに気を使いながらプログラムを作っています。APIがエラーを返した時、パラメータに思いもしない値が渡された時、スレッドセーフになっているか、ファイルの排他制御を考慮しているか、等々。それ以外にも多くの注意を払いながらプログラムは書かれているのです。


そのような緊張状態は長くは続きません。また、その日の気分でチェックすべき観点が抜けることもあるでしょう。全てを一人で見通せる規模のプログラムであっても、品質は一定とは限らないのです。

変更部分に責任を持とう


プログラムはコンピュータを自分の命令通りに動かす指示書ですが、実は自分が思ったほど正確には指示できていないのではないかと思います。多少間違えていても、目に見える間違いが出ない限り、使っている人には気づかないものです。間違いが重なった結果、一見正しい動きをしているように見えることもあります。


明らかにロジックが間違えているとしても、単純にその部分を修正しただけでは、別のバグを生み出してしまうことも少なくありません。コードを変更する際は出来る限り広い範囲で見ることが大切になります。現実にはなかなか難しいことですが。


明らかに書き方がよくない、拡張性に欠ける、値のチェックをしていない、等々。コードを直したくなる衝動にかられることは多くあります。それぞれが自分なりのポリシーを持つプログラマならばなおさらのこと。しかし、コードを修正するということは変更した部分に関して責任を持つということです。たとえ1ラインの変更であっても、それに伴う動作確認の工数を、プログラマはあらかじめ予測し、リスクに備えておく必要があるでしょう。


「このバグを直すのは簡単だよ。一日で直る」というプログラマの言葉を、テスト担当者はうのみにしてはいけません。その修正がどの程度のルートチェックをする必要があるのか、しっかり確認しましょうね。:)