エラーが出ないのに、思ったとおりに動かない。そういう日は、プログラムに独り言を言わせている
赤い文字が出るうちは、まだ楽なほうだった。
何も言わずに違う答えを返してくるほうが、ずっと手強い。
先月、投稿の公開日時がひとつだけずれた。
入れたはずの時刻と、画面に出ている時刻が一時間違う。
エラーは一度も出ていない。保存も成功している。
この手の不具合がいちばん時間を食う。
画面のどこにも「ここが変です」と書いていないから、どこを見ればいいのかが分からない。
エラーが出ないほうが、こわい
プログラムが止まって赤い文字を出すとき、そこには行番号が書いてある。
怒られているように見えて、実は場所を教えてくれている。
その話は前にも書いた。
やっかいなのは、止まらないほうだ。
プログラムから見れば、何も失敗していない。
受け取った数字をそのまま計算して、そのまま返しただけ。
「その数字がそもそも違う」ことに、プログラムは気づけない。
だから僕は、こういう日はまず考えるのをやめる。
頭の中で筋道を立てても、外れていたら一時間が消えるだけだった。
途中で、値を書き出させる
やることは単純で、処理のとちゅうに「いま持っている値を出す」一行を足す。
画面に出してもいいし、記録用のファイルに書いてもいい。
本当にそれだけ。
大事なのは、出す場所を一つに絞らないこと。
受け取った直後・計算する直前・返す直前、と三か所に置く。
そうすると「どこまでは正しかったか」が見える。
今回の日時のずれも、これで一発だった。
受け取った直後の値は合っていて、保存する直前の値がずれていた。
犯人はその間にいる、と分かった時点で残りは五分の作業になる。
ついでに、一行ずつ名前を付けて出すようにしている。
「ここ」「2」みたいな印だけを出すと、たくさん並んだときにどれがどれだか分からなくなる。
「保存の直前 / 入力された時刻 = ...」まで書いておくと、あとで自分が読める。
どこを見ればいいかも分からないときは、真ん中で切る
処理が長いと、三か所では足りないこともある。
そういうときは端から順に追わない。真ん中で切る。
全体のちょうど中ごろで値を出してみて、そこが正しければ犯人は後ろ半分。
おかしければ前半分。
残った半分をまた真ん中で切る。
百行あっても、七回くらい繰り返せば一行まで詰まる。
端から一行ずつ読んでいくのと比べると、体感でまるで違う。
知ってから、長い処理を前にしてうんざりすることが減った。
直ったら、独り言は消す
調べるために足した一行は、直ったら消す。
残しておくと、次に困った人(たいてい半年後の自分)が「これは必要な処理なのか」で悩む。
それと、消し忘れたまま公開してしまうのがいちばん危ない。
中の値をそのまま画面に出す一行を残せば、見せなくていいものを見せることになる。
調べるための一行は、調べているあいだだけのもの、と決めている。
結局のところ、これはプログラムの話というより聞き方の話だと思う。
黙っている相手に「どうしたの」と聞いても何も出てこない。
「いま何を持ってる?」と具体的に聞くと、ちゃんと答えてくれる。