まだ駆け出しでソフトウェア開発経験が浅い頃、ある製品のファームウェア開発を担当した際に「やっちまった」失敗談です。
その製品はリモートで外部からの入出力の切替を行う仕様があるので、その機能実装として入出力を定期的に監視し、状態に合わせて処理を行うプログラムを作成することになりました。
処理自体は、判断基準になる入出力の状態を、直接「グローバル変数」に格納して処理する関数を作成するという比較的簡単なものです。そしてある程度想定できる条件で動作検証を行い(自分としては)問題無い事を確認しリリースを行いました。この時の検証方法としては、入出力状態としてはON/OFFの2パターンしかなかったので、その組み合わせでの検証のみ行っていました。
リリース後に数年して、外部入出力の状態が正しく処理できていないという問い合わせがあり、急遽調査を行うことになりました。
実際の使用条件は、かなり早い周期で、外部からの入出力状態を切り替えるものであり、開発を行っていた時は、そういったシビアな条件での検証を行っておらず、言い訳もできませんでした。
さらに調査を進めると、原因は簡単で、入出力状態をグローバル変数に格納しているので、定義後はどこからコールされても値は変わらないはずだと思い込み、別関数内の処理で入出力状態が書き換わることを想定していなかったことです。そのため正しい処理ができなくなっていました。
このとき、なんでもかんでもグローバル変数で処理を行うのではなく、想定機能のアルゴリズムを理解し、データの流れや加工のイメージを自分なりに把握することの大切さを痛感しました。基本的なことですが、グローバル変数がどこからアクセスされるのかや、どういったタイミングで更新されるかが重要です。
また、検証方法についても、ON/OFFのような単調パターンだけではなく、複数条件の組み合わせを考える(検証仕様を作成する)ことの大事さも痛感しました。ただし、全ての組み合わせを考えるのは難しいですが・・・。
分かってしまえばなんてことも無い事ですが、初めての開発であったりすると、簡単なことが思い浮かばないこともあります。困ったときには、Webや本で調べるのもいいのですが、まずは隣の同僚に聞くのが、一番早いのではと思います。意外と、答えを持っている人、ヒントをくれる人がいっぱいいますよ。