バグを作りこんだ話

バグを作りこんだ。
単体試験、結合試験をすり抜け障害となった。
死にたい。
どうすればよかったのか。
つまるところ、ヌルポだったのだけれど。
つかっていた制御構造はifのみだった。
我がチーム洗練されたコードを書くという目標がある。
洗練されたコードとは何か。
洗練されたコードしか書けない状況がほしい。
洗練とは何か。
 1 詩歌・文章の表現を推敲して、よりよいものにすること。「―を極めた文体」
 2 人柄や趣味などを、あかぬけのした優雅・高尚なものにすること。「―された着こなし」
 via コトバンク
推敲すること、書き直し続けることが重要だということか。
コードの推敲とはテストコード・テスト行為だろうか。
なるほど、単体テストが完璧であれば今回の障害は防げた。
しかし、単体テストが完全ではなかった。
今回は詳細設計書があり、その通りに作ったうえでの障害だ。
単体テストブラックボックス的に詳細設計書を元にテストケースを作成し、実行された。
詳細設計書には無い状況だった。
全体像をつかむ事を怠った。まぁ、状況的に出来なかったという言い分もあるが。
データの生成と消滅についてもっと注意を払うべきだった。
データの生成と生存と消滅はプログラムの肝だと思っている。
もっとデータの生成と生存と消滅に気をつけていればヌルポは防げた。
設計、製造時に定まっていなかったとはいえ、食い下がってデータについて明らかにすべきだった。
上司の前居た会社に洗練されたコードを書く人が居たという。
その人のコードは可読性が著しく高く、素晴らしかったという。
「どうやったらそうなれますか」という問うと、「その人は非常に頭が良かった」という。
それでは追いつけないではないか。答えにならない。
具体的にどうすればよいのか
データのライフサイクルを明らかにする。
データは常にnullになる可能性があることを意識する。詳細設計書記載事項でなくとも。nullチェックは必ずする。
nullチェックは妥当か明らかにする。
データにセンシティブに成るためにアルゴリズムに親しむ。
アルゴリズムに関連するが、制御構造をもっと考えて書く。
ホワイトボックステストを実施する。
unitテストならマトリックスを展開してホワイトボックステストすることができるだろう。
ホワイトボックステストでは頭が悪いのでマトリックスを展開する。
マトリックスの転回にはエクセルなどが使えるだろう。
コードカバレジを高める。
テストを回して推敲する。洗練を追求する。
テストを回すためにコードを書く速度を高める。
コーディング速度を高めるためにはコードをたくさん書くことが必要だろう。
経験を積む。
テストについて書籍にあたる。
こんな感じか。