「直したはずなのに、変わらないんですけど」。
お客様からそう言われて、自分の画面で確かめると、ちゃんと直っている。編集して、保存して、表示も新しくなっている。なのに、お客様の画面では古いまま。同じページを見ているはずなのに、見えているものが違った。
自分には、直って見える
しばらく、原因が分からなかった。
コードは直っている。保存もされている。データを取りに行く処理も間違っていない。なのに反映されない。自分の環境では再現しないから、なおさら厄介だった。「こちらでは直っています」としか言えない時間が、いちばん心細い。
ブラウザが、古い答えを覚えていた
犯人は、キャッシュだった。
データを取りに行くとき、同じ場所へ同じ取り方で、何度も問い合わせていた。するとブラウザは気をきかせて、「さっきと同じだから」と、前に受け取った答えを覚えて使い回す。速くするための仕組みだ。けれどそのせいで、中身が新しくなっても、古い答えを返し続けていた。
自分の画面で直って見えたのは、たまたまキャッシュが効いていなかっただけ。お客様の画面では、古い答えがしっかり残っていた。
「毎回ちがう問い合わせ」にする
直し方は、毎回少しだけ違う問い合わせにすることだった。
取りに行くたびに、その時刻のような「毎回変わる印」を一つ付ける。ブラウザから見ると、毎回ちがう問い合わせに見えるから、覚えた答えを使い回せない。あわせて、「古い答えは使わないで」と明示もしておく。これで、編集した内容が、すぐ反映されるようになった。
速さのための仕組みが、正しさを隠す
キャッシュは、悪者ではない。
同じ問い合わせに毎回フルで答えていたら、画面は重くなる。前の答えを覚えて使い回すのは、速くするための、ちゃんとした工夫だ。問題は、その「速さのための工夫」が、ときどき「正しさ」を覆い隠すことにある。
速いことと、新しいこと。この二つは、よく綱引きをする。速さを取ると、少し古くても許す。正しさを取ると、毎回確かめにいく。どちらを優先すべきかは、場所による。大事なのは、いまどちらを選んでいるかを、自分で分かっていることだ。無自覚なキャッシュが、いちばん人を惑わせる。
「反映されない」は、キャッシュを疑う
この落とし穴は、一度はまると忘れない。
「コードは直っているのに、画面に出ない」。「自分の環境では再現しないのに、相手の環境では古いまま」。この二つがそろったら、まずキャッシュを疑う。バグを探してコードを何度も読み返す前に、そもそも新しい答えが届いているのかを確かめる。
直すことと、届けること。直しただけでは、届いていないことがある。作る側は、つい前者だけで安心してしまう。けれど、お客様が見ているのは、届いたあとの画面だけだ。