過去問追加時に、解答記録を引き継ぐ

過去問アプリは、年に1〜2回、新しい回の過去問を追加しています。実はこの「過去問を追加する」という作業のたびに、ユーザーが積み上げてきた○×の記録や集計表は、引き継いでいませんでした。今回はその原因と、直した内容、そして直す過程でずっと感じていた迷いの話です。


そもそも何が起きていたか

アプリの中のデータは「キー」という名前をつけて保存しています。たとえば「今使っているシートのID+回番号+科目番号」を組み合わせて、1つの記録の場所を決めていました。


過去問を1回追加すると、これまで「第1回」だったものが「第2回」に繰り下がります。回番号がズレると、キーの中身もズレてしまい、「第1回の記録」のつもりが「第2回の記録として保存されているデータ」を指してしまう。これは事故なので、うちのアプリは安全側に倒して「シートのIDそのものを変える」という力技で対処していました。IDが変われば全部のキーが作り直しになるので、事故は起きない代わりに、記録も全部消える。これが今までの仕様でした。


「消える」だけならまだしも、下手をすると「別の回の記録が表示される」という、もっと厄介な壊れ方をする可能性もありました。これは絶対に避けたかったポイントです。


「そこまでやる必要あるか?」と何度も自問した

実装を進める中で、何度も立ち止まって考えました。☆マーク(あとで見返したい問題へのチェック)とAIの回答は、シートIDを変えても引き継がれる仕組みを既に実装していました。


つまり「ユーザーが能動的に残そうとした情報」はもともと守られていた。ここで一つの考え方が浮かびました。過去問の追加というのは、いわば試験範囲が広がる節目でもある。ユーザーにとっても「気持ち新たに、また一から解き直す」タイミングとして捉えれば、○×の記録や集計表、解答状況が一度リセットされることは、むしろ自然な区切りなんじゃないか。守るべきは、ユーザーが「これは大事」と自分の意思でチェックを付けた☆マークと、せっかく生成させたAIの回答だけで十分ではないか、という考え方です。


記録をリセットしました。☆とAIの回答は保持されています」というダイアログを出すだけの、もっと安価な対処法もありました。わざわざ位置情報からID紐付けへ作り替える大工事をする必要、本当にあるのか。


最終的にやることにしたのは、2つの理由からです。

・53アプリを抱えていて、過去問追加は年1〜2回。

「記録が消えました」ダイアログを、53回分×年1〜2回、出し続けることになる。1人あたりの不満は小さくても、積み重なれば無視できない。


・実装してみたら思ったより流用が効いたこと。

☆やAI回答を守るための「問題IDで紐付ける」仕組みは、○×や集計表にもほぼそのまま使い回せました。ゼロから作るなら見送っていたと思いますが、既にある土台に乗せる形だったので、懸念していたほどのコストにはなりませんでした。


とはいえ、「☆とAIの回答だけで十分」という考え方が間違っていたとは今も思っていません。どちらの選択肢にも理屈は通っていて、今回はたまたま実装コストの見積もりが「やる」側に傾いた、というだけの話です。


直したポイントは大きく4つ


1. 回番号を「使い切り」にする


これまでは新しい回を追加するたびに、既存の回の番号を1つずつ繰り下げていました。これをやめて、新しい回には「まだ誰も使っていない番号」を割り当てる方式に変えました。1〜10までは今まで通りの数字、11回目以降は A、B、C…とアルファベットを使います。これで既存の回の番号は一切動かなくなり、記録がズレる心配がなくなりました。


2. 「どの問題か」でデータを紐付ける


○×の記録も、位置情報ではなく問題そのものの固有IDで管理する方式に変えました。位置がズレても、問題そのものを追いかけられるので、記録が正しく引き継がれます。


3. アプリのIDを「最初に見た値で固定」する


アプリは新しい過去問を用意するとき、今使っているスプレッドシートをまるごとコピーして編集し、完成したら「今度からはこっちを見てね」とIDを差し替える運用をしています。この「IDの差し替え」自体が、全消去の引き金になっていました。


これを解決するために、アプリが最初に起動したときのIDを端末の中に保存しておき、以降は元のスプレッドシートのIDが変わっても、保存しておいた値を使い続けるようにしました。こうすれば、コピーして差し替える運用を続けても、ユーザーのデータには一切影響しなくなります。


4. それでも「まっさらに戻したい」ときのための緊急スイッチ


万が一データがおかしくなったときのために、管理用の表に1つだけ列を追加しました。ここに印を付けると、そのアプリを使っている全員のデータが一斉に初期状態に戻ります。普段は絶対に触らない列ですが、いざというときの逃げ道として用意しました。


引き継がれるもの・されないもの

過去問を追加したとき、これからは次のようになります。


保持されるもの

過去問の○×、集計表、解答状況、チェックマーク、AIの回答


リセットされるもの

模擬試験と「腕試し」機能の記録(これはそもそも問題の中身が変わるので、月1回のペースで元々リセットしている運用と同じ扱いにしました)


機種変更のときの引き継ぎ機能にも影響

うちのアプリには、機種変更のときにコードを使ってデータを移す機能があります。これまでは「送信元と受信先でシートのIDが完全一致していないと復元できない」という仕組みでした。今回IDの持ち方を変えたので、この一致判定も見直し、IDが多少違っていても正しく復元できるように直しました。(これが後々問題になるのですが…。


それでも残る違和感

とはいえ、これで完全に迷いが晴れたわけではありません。「気持ち新たに、☆とAI回答だけ引き継げばいい」という考え方は、今でも一理あると思っています。しかし、今回新たに追加した 過去問の○×、集計表、解答状況 についてはボタンタップ1回で初期化できるものでもあります。気になればそのボタンを押して貰うことにします。


まとめ

一言でいうと「IDを変える」という荒療治をやめて、「変わっても大丈夫な仕組み」に作り替えた、これでようやく「過去問を追加したら記録が消えました」という問い合わせに怯えなくて済みそうです。