「バグのないプログラムは書けないのか」について
🌏
これを読んだ。
プログラムのわからないえらい人「バグのないプログラムを書くことはできないのか?難しいかもしれないが、十分に気を付けていれば防げるのではないか?」にどう返したらいいのかわからない
基本的に、プログラムは「AしたらBする」を実現するためのものだ。虫眼鏡アイコンをクリックしたら検索結果が返る、×ボタンを押したらタブが閉じる、新着メールが来たらポップアップが表示される。人間の動きや状況の変化などに応じて適切な処理をするために、プログラムは存在する。
簡単な「AしたらBする」の処理だけなら、バグなしで書けることもある。しかし、多くの場合、「AしたらBする」を実現するために「AしたらBする」の処理だけを書けばいいわけではない。
上の記事に「二桁の整数の和を返すプログラムなら簡単に完璧に作れる」と返した人がいた。この返事に対して、「1桁や3桁は不要?」「全角数字が入力されたら?」「整数がたくさん入力されるかも」などのツッコミがあった。
このことからも、事前に多くの決めごとが必要なことがわかる。「AしたらBする」を実現するためには、「Aじゃない場合はどうするか」も考えておく必要がある。正しい入力と解釈して対応するのか、エラーを返すのか。「Aする」は限定的な状況だが、「Aじゃない」はケースが多すぎる。事前に漏れなく対応するのは難しい。
A以外に、隠れた前提が含まれていることもある。上の整数の例なら、依頼主は「二桁以下」を想定しているかもしれないし、和が二桁になるものだけを想定しているかもしれない。全角数字に対応するのは当然と思い込んでいることもある。依頼になかった機能が実装されていないことに対して文句を言われる理由は「原理的には」ないが、「ビジネス的には」あるかもしれない。これを「バグ」と呼ぶ依頼主だっている。「バグ」の定義は人によって違う。
バグのない完璧なプログラムとは、カスタマーサポートが要らない完璧な取扱説明書のようなものだと思う。使用者と作成者の間に前提のズレがなく、あらゆる行動や状況に対応している取扱説明書は、十分に気を付けていれば書けるのだろうか。