arithmetic-timeattack

算数タイムアタック

小学校の算数で、既習事項の習熟を測って伸ばすための Web アプリ群。 Google Workspace for Education と Chromebook での運用を前提にしている。

1回1分。制限時間内に何問正解できるかを競い、 教師側には「どの児童が、どの型で、どれだけ時間がかかっているか」が残る。

なぜ所要時間で測るのか

九九も単位換算も既習事項なので、正答率は早期に天井に張り付き、児童間の差が消える。 差が出るのは想起にかかる時間。だから主指標を平均想起時間(ms)にしてある。

「間違える」のではなく「数えて出すから遅い」子を見つけるのが目的で、 正答率だけを見ていると、この層が見えない。

測るのは「出題から最初のキーを押すまで」で、送信までの時間ではない。 送信までには打鍵と欄移動が乗るので、3kg=□g(4桁)と 5000g=□kg(1桁)を 並べると、桁数の差がそのまま所要時間の差として現れる。 主指標から打鍵を外さないと、型どうしを比べた瞬間に結論が桁数で決まる。

平均と並んで「ゆらぎ」(標準偏差÷平均)を出す。 1.2秒で想起できる時と4.0秒かけて数える時が半々の子は、平均2.6秒で基準内に見える。 一定して2.6秒かかる子と平均が同じだからで、両者は必要な手当てが違う (前者は想起の練習、後者は手続きの短縮)。平均だけでは区別できない。

集計は既定で直近30日ぶん(window_days)。全期間平均にすると、 年間数百試行に対して直近の変化が1%程度に薄まり、伸びも落ちも見えなくなる。

いま動いているもの

アプリ 内容 対象
apps/hub 各アプリへの入口。学年で出し分ける。教師の一部だけが使う単元横断分析(?page=analysis) 全学年
apps/grade3/kuku 九九・わり算(9×9 / 9×16) 3年
apps/grade3/length km と m の換算・加減計算、まきじゃくの読み取り 3年
apps/grade3/weight g と kg の換算・加減計算、はかりの読み取り 3年
apps/grade3/divmod あまりのあるわり算(九九の逆→九九さがし→引き算→ひとつなぎ→誤答判別→わり算) 3年
apps/grade3/bignum 大きな数(万・億・兆、位取り、いくつ分、10倍・100倍と逆算) 3年
apps/grade3/decimal 小数(0.1・0.01のいくつ分、位取り、10倍・100倍と逆算) 3年
apps/grade3/circle 円と球(中心・半径・直径の見分け、半径⇄直径、球の切り口、箱に並んだボール) 3年
apps/grade3/bai 何倍でしょう(もとにする大きさ、テープ図・関係図、式の選択、第1〜第3用法、倍の倍) 3年
apps/grade5/volume 体積(積み木、公式と逆算、m³・cm³・L・mL、複合図形、容積) 5年

構成

common/
  Core.gs        共通エンジン。認証・出題配信・再採点・記録・ランキング・分析
  index.html     共通の児童画面(レイアウト・キー配置・タイマー・送信)
  teacher.html   共通の教師画面(設定・クラスごとの公開モード・集計)
apps/
  grade3/          3年の単元(学年ごとに grade<学年>/ を切る。Unit.gs の grade と一致させる)
    kuku/Unit.gs     九九の出題定義
    length/Unit.gs   長さの出題定義
    weight/Unit.gs   おもさの出題定義
    divmod/Unit.gs   あまりのあるわり算の出題定義
    bignum/Unit.gs   大きな数の出題定義(詳細: apps/grade3/bignum/README.md)
    decimal/Unit.gs  小数の出題定義
    circle/Unit.gs   円と球の出題定義(図は単元が SVG で描く。詳細: apps/grade3/circle/README.md)
    bai/Unit.gs      何倍でしょうの出題定義(詳細: apps/grade3/bai/README.md)
  grade5/
    volume/Unit.gs   体積の出題定義(詳細: apps/grade5/volume/README.md)
  hub/           ハブ(Code.gs / links.html / teacher.html / Analysis.gs / analysis.html / Archive.gs)
docs/
  ARCHITECTURE.md  設計の考え方
  SETUP.md         設置手順
  ADD_UNIT.md      新しい単元の作り方
  ANALYSIS_REQUIREMENTS.md  横断分析の要件定義(未実装)
tools/
  preview/       スプレッドシート無しで Unit.gs をブラウザ確認する開発ツール(tools/preview/README.md)

単元を足すときに書くのは Unit.gs 1枚だけ。 Core は単元を知らない。逆向きの依存を作らないことで、単元が増えても Core が肥大しない。

詳細は docs/ARCHITECTURE.md。

設置

各アプリごとに Google スプレッドシートを1つ用意し、 拡張機能 > Apps Script に該当ファイルを貼ってデプロイする。

手順は docs/SETUP.md。 シートもトリガーも初回アクセス時に自動で用意されるので、 実行するのは承認のための setup 1回だけ。

clasp を使う場合は .clasp.json を各 apps/grade<学年>/* に置き、 common/ のファイルを同じプロジェクトに含める。

設計の要点

教室での運用

貢献するとき

Core を変える場合、単元固有の知識を Core に入れないこと。 「この単元のときだけ」という分岐が Core に現れたら、それは Unit に置くべきもの。

出題を追加する場合、自動判定のために答えの桁数を揃える責任は Unit 側にある。 確定に使う桁数は UNIT.digitCap で宣言する。宣言せず実際の答えの桁数で確定させると、 桁数がヒントになるうえ、打鍵数の差が主指標の所要msに混入する。 docs/ARCHITECTURE.md の「自動判定と情報漏れ」を読むこと。

ライセンス

MIT