「おまかせで進める」機能が、実は何もしていなかった
ボタンを押すと最後まで進む。ログにもちゃんと記録が残る。
だが12日間、ずっと「温存する」しか選んでいなかった。
候補者として一つの選挙区を戦う個人モードに、「おまかせで投票日まで進める」というボタンを足した。
毎日打てる手(街頭演説、戸別訪問、後援会づくりなど)の中から、いちばん得票が伸びそうな手を内部でいったん試算してから選ぶ、という機能のつもりだった。
実装は動いた。ボタンを押すと投票日まで進み、行動ログもちゃんと積み上がる。テストも通った。
ところが実際に動かしてみると、12日間・24回ぶんの行動ログが、すべて「体調を整える」——つまり何もしない手だった。資金もまったく減っていない。
複製したつもりが、複製できていなかった
試算のやり方はこうだった。その日打てる手それぞれについて、候補者のプロフィールを複製し、複製のほうに手を適用して、開票シミュレーションにかけて得票シェアを見る。いちばん良かった手を、本番のほうに適用する。
プロフィールの複製自体は問題なくできていた。
だが開票シミュレーションが実際に見ているのは、選挙区の候補者一覧に埋め込まれた候補者オブジェクトのパラメーターのほうだった。そしてそのオブジェクトの中身(知名度や地盤といった数値)は、複製したはずのプロフィールとは別に、最初に出馬したときのプロフィールをそのまま参照していた。
複製したのは「入れ物」で、中の数値はずっと同じ箱を指したままだった。
どの手を試算しても、シミュレーションが見ている数値は変わらない。結果、どの手を選んでも試算スコアは同点になり、配列のいちばん先頭にある「温存する」だけが、律儀に選ばれ続けていた。
気づいたきっかけは、機能とは無関係のバグだった
この不具合そのものには、しばらく気づかなかった。ログを見れば「行動している」ようには見えるし、テストも「何か行動ログが残っている」ことしか確認していなかったからだ。
見つかったのは、まったく別の作業——クラウドセーブの動作確認のために、手作りの壊れたテストデータを読み込ませたときだった。資金の値が壊れて計算不能になった状態で「おまかせ進行」を動かしたら、無限ループになりかけた。原因を追ううちに、そもそも試算が機能していないこと自体に気づいた。
複製するときは、複製した先のオブジェクトを指すよう、参照している側もちゃんと差し替える。当たり前のことだが、埋め込まれた側にまで気が回っていなかった。
直したあとは、ちゃんと街頭演説にも戸別訪問にも予算が使われるようになった。
※運営者が個人で書いているnoteです。