学習ドリル設計の教訓 — 「測定」と「練習」を分けないと数字が嘘をつく
この記事について
資格試験のために単一HTMLの想起ドリルを自作した——その実装で踏んだ設計の落とし穴を、資格の中身から切り離して一般化する。
想起ドリルや間隔反復(SRS)を自作しようとしている人向けだ。結論を先に言う。「測定」と「練習」を同じ数字に混ぜると、その数字は嘘をつく。 自分の習熟度を見誤らせる罠が、素直に作ると3か所に仕込まれる。
罠その1: 解き直しを集計に混ぜると正答率が水増しされる
一番わかりやすい罠がこれだ。間違えた問題をもう一度解く。今度は正解する。この正解を、全体の正答率にそのまま足すとどうなるか。
答えを見た直後の正解は、「実力で解けた」のか「さっき見た答えを覚えていた」のか区別できない。区別できない正解を集計に入れると、正答率は実力より高く出る。80%あるように見えて、初見での実力は60%かもしれない。
対策はシンプルだ。「初見の回答」と「復習の回答」を別のカウンタで持つ。習熟度の指標にするのは初見のほうだけ。復習は練習として回すが、成績評価には混ぜない。
| カウントの種類 | 用途 | 習熟度に使うか |
|---|---|---|
| 初見の正誤 | 実力の測定 | 使う |
| 復習の正誤 | 定着のための練習 | 使わない |
罠その2: 出題と記録が別システムだと周回が数えられなくなる
次の罠は、出題を担うロジックと、成績を記録するロジックを別々に作ったときに起きる。両者が同じ「1周」の定義を共有していないと、こういう矛盾が出る。
320問解いたのに、システム上は「まだ1周していない」
理由は、出題側は「苦手だけ優先」で同じ問題を何度も出しているのに、記録側は「全問を1回ずつ通過したか」で周回を数えていたからだ。片方は延べ回数、片方はユニークな到達数を見ている。同じ言葉(1周)で違うものを数えていると、進捗が信用できなくなる。
教訓は「周回」「達成」「残り」といった指標を、出題と記録の両方が参照する単一の定義に寄せること。定義がシステムをまたいで二重化した瞬間、数字は静かにずれ始める。
罠その3: 減衰の無いフラグは「同じ問題ばかり」を生む
苦手フラグを「間違えたら付く/自分で克服ボタンを押すまで残る」で実装すると、真面目に苦手モードを回すほど、苦手プールに残った問題だけが延々と出続ける。飽きるし、他の問題に触れる機会が減る。
ここで効くのが連続正解による減衰=簡易SRSの考え方だ。
- 苦手フラグを0/1のフラグではなく、優先度スコアとして持つ
- 正解するたびにスコアを下げる(例: 連続正解でスコアを半減させる)
- スコアが閾値を切ったら出題頻度を落とす
こうすると、まだ身についていない問題は高頻度で、克服しつつある問題は低頻度で出るようになる。「同じ問題ばかり出る」問題が、手動の卒業判定を待たずに自然に解消する。ただしフラグ自体の手動卒業は残しておく価値がある(罠その1と同じで、機械の判定を甘くしすぎない安全弁になる)。
まとめ
学習ツールを自作するときの一番の敵は、バグではなく自分を安心させる方向に嘘をつく数字だ。3つの教訓を一行ずつにするとこうなる。
- 復習の正解を実力の正答率に混ぜない(測定と練習を分ける)
- 「1周」の定義を出題側と記録側で1つに統一する
- 苦手は0/1フラグでなく減衰するスコアで持つ
測定を甘くすれば数字は気持ちよくなる。だが試験本番は、その水増しの分だけ容赦なく牙をむく。道具は自分に厳しく作れ、というのが今回の教訓だ。
更新履歴
- 2026-07-05: 初稿