跳转到主要内容

WRITING

我给三年级的孩子做了个练习站:题目无限,但每一套都有头有尾

2026年8月9日13 分钟阅读曾田力
教育产品工具小学工程
我给三年级的孩子做了个练习站:题目无限,但每一套都有头有尾

孩子愿不愿意点第二次,靠的不是题目质量,是「差一点就完成」始终在他眼前。

这话我一开始不信。我以为把题出好、把讲解写透就够了。做完第一版给孩子用,十分钟他就放下了——题没问题,是他不知道自己在干什么、做到哪了、还剩多少。

现在这个站是重写过的。它的每一样东西都在回答同一个问题:怎么让一个三年级学生主动点开第二次。

下面所有配图都是从真页面上截的,没有一张示意图。

打开是这样

学习路径首页

顶上那条是成长档案:等级、还差多少经验升级、累计一次做对多少题、连续来了几天、勋章拿了几枚、今天的任务还差几题。它是跨学科共用一条线的——语文练的经验和数学练的经验加在一起,不是各算各的。

再往下是小学十门学科。开着的两门是语文和数学,另外八门标着「筹备中」,各自写清为什么还没开。空着的地方本身就是下一步要做的活,比一张假装很全的课程表诚实。

每张课卡上都写着这一站有几种题型、掌握度多少、这一课是哪天建的。

一套 12 题,有头有尾

题卡顶部:今日任务与题号条

打开一课,第一眼就是题号条和第一道题——讲解折在下面,不在上面。开局一屏文字,孩子就走了。

任务条永远写着「还差 N 题」。剩三题以内会变成金色并且开始脉冲,就是那句「就差 2 题,冲一下!」。

题号条 1..12 是这个站的骨架:

题号条:做对做错一眼看得见

  • 绿 = 做对了, = 做错了, = 还没做,蓝圈 = 现在在这题
  • 点任意一个数字直接跳过去
  • 左右翻题,键盘方向键也行,平板上直接左右滑
  • 翻回做过的题,原样还原(填过的数、选过的项、当时给的讲解),并且全部锁死不能再答
  • 跳过不算错,也不计分,题号条上仍然空着,随时能回来做

题目本身是无限的——现在这套题库能出 5 万多种不同的题。但**「无限」和「无结构」是两件事**:一套一套地无限出,每套有头有尾。孩子得随时能看见「我做到哪了、前面做了什么」。

答错了不是甩个红叉

答错两次给完整的分步讲解

  • 第一次答错只提示不判定,给一次重来的机会
  • 第二次错才判错,同时给完整的分步讲解——每道题都必须有,这是硬规矩
  • 提示是「哪个数卡住了」,不是「答案是 5」
  • 一题只计一次,正确率按一次做对算。反复重试刷不出 100%

错题本记的是题型,不是题目

错题本

这是我最想说的一条。

一般的错题本是把错的那道题存下来,复习时再放一遍。我第一版就是这么做的,结果孩子刷了两轮把答案背下来了——第三轮全对,看着像学会了,一道都没会。

所以现在错题本里只有题型,没有题目:条目里存的是「哪一类题、错了几次、订正到几次、上次错的那道长什么样(一句摘要)」。复习的时候用同一个题型重新出一道新题:换数字、换选项、换课文段落。

想重放原题都做不到——存档里物理上就没有答案和选项。

配套的两条规则:

  • 一次做对才算订正一次,连着 2 次才划掉。一次蒙对就当学会了,下回照样错
  • 普通套卷也会给错过的题型加权。不用专门去点「练错题」,它自己会找上门

交卷:一张能点回去的成绩单

交卷总览

交卷之后逐题一行:第几题、什么题型、对还是错还是没作答、题面是什么。点任意一行都能翻回那道题看讲解。

没做的判「未作答」,不计分也不进错题本。错的已经进了错题本,下次会换成同类新题再考一遍。

底下两个按钮:「再来一套(全新的题)」和「只练错的 N 类(换新题)」。

每道题都能「再造一道类似的」

构建类似题目:追加到本套末尾

题头有三个按钮,这是其中最实用的一个。

按钮干什么
☆ 收进错题本收的是这一类题,下次出同类新题。答对答错都能点,再点取消
+ 构建类似题目按这道题的考点现造一道,追加到本套末尾——原题和新题都留着,可以对照着做
📋 留下来把这道题复制成一段 JSON,在终端一条命令就能存进题库

这个按钮解决的是家长最常见的那句话:「这道他不会,能不能再来几道一样的。」以前得自己去搜、去编,现在点一下就有,而且考点一致、数字全新

变不出新题的时候它会明说,不糊弄。

掌握度:哪一类还没练熟,一眼看得见

题型清单与掌握度

这一课有几种题型全列着,每种后面挂星:

  • 1 星 = 做对过 3 道
  • 2 星 = 做对 8 道且正确率 ≥ 70%
  • 3 星 = 做对 15 道且正确率 ≥ 85%

点任意一张题型卡就进专项练——只出那一种题,练到星满为止。组卷的时候星少的、错过的优先出。

让他愿意点第二次的那几样东西

这套东西做在引擎里,所有练习页一起生效,不是给某一页贴的补丁。

答对就有反馈,答错也有

做对了飘一行经验

一次做对 +12 经验,订正对 +4,答错也给 +2——敢试就有分,这一条是故意的。经验条永远写着「再练 X 经验就升级」。

连对还有倍数:连对 3 次 ×1.5,6 次 ×2,10 次 ×3。

今天的任务做完了

今日任务完成

任务条填满的那一下:+50 经验、全屏彩带、一张「12 题,全做完了」的弹卡,末尾还补一句「明天再来,连续天数 +1」——把下一次的钩子提前挂上。

升级

升级

升一级要的经验递增,前几级升得快(先给甜头),后面慢下来。升级弹卡上直接写着下一级还要多少。

勋章解锁

勋章解锁:五连击

一共 16 枚。关键在于:

勋章墙:没解锁的也摆着,条件写明白

没解锁的也灰着摆出来,并且把条件写在上面。「连着一次做对 20 题」「练过 3 门不同的课」「本课每个题型都 3 颗星」——下一枚要什么、还差多少,一眼看得见。藏起来的成就等于不存在。

还有一条连续天数:第一次答题才打卡,点进来不做题不算来过。

音效是 WebAudio 现场合成的,零文件零外链,一个按钮就能关。

题库是查得到的

孩子问过我一句:这上面一共有多少道题。这个问题当时我答不上来——那时候站里只有出题的规则,没有题库。

现在有了。一道题就是数据库里的一行,能列、能搜、能改、能加、能溯源回是哪份卷子第几题。

题库总览页

这一页能干的事:

  • 按学科 / 知识点 / 题型 / 难度 / 来源筛
  • 全文搜索题面
  • 勾选若干道导出成一张可打印的卷子
  • 按知识点看弱项
  • 点一道题看它来自哪份卷子的第几题,以及孩子当时怎么答的

题库分四种来源,这个分法是整个设计的核心:

来源是什么进套卷吗
卷子原题期末卷上的原题,带孩子当时的作答和失分优先出,每套最多占 1/3
题型样例每个题型留 2~3 道,让人看得见它长什么样不出,只供查
手写题自己加的
留下来的「构建类似题目」造出来、点了保留的

库以卷子原题为骨,生成器不预先摊开。 这样题库的体量跟卷子数线性走,不跟组合数走——再录十份卷子,也就是加十份的量。而能出的题仍然是 5 万多种。

加一道题:一条命令

不做管理界面,加题走终端:

cat > /tmp/q.json <<'EOF'
{ "type":"choice", "q":"题面", "ask":"问法", "level":2,
  "options":[{"t":"对的那个","ok":true},{"t":"干扰项","ok":false,"why":"错在哪"}],
  "sol":"分步讲解(必填)", "hint":"指方向不给答案" }
EOF
python3 engine/bank.py add --topic chinese-text-evidence --json /tmp/q.json

落库那一刻立刻过一遍校验:字段齐不齐、选择题是不是只有一个正确项、讲解写没写、排序题的答案是不是一个合法排列——不过就自动回滚

改题、删题、搜题、看统计都是同一个命令的子命令。

加一课:三步

python3 engine/practice_render.py primary-语文/<新课>.practice.md   # 出练习页
python3 engine/path_render.py                                       # 进学习路径首页
python3 engine/check_all.py                                         # 全部检查

每一步都有硬校验:日期没写不给渲、题库对不上不给渲、首页有死链不给渲。

数学也是同一套引擎

数学 · 余数的最值

语文四站(回原文找依据 / 用词要准 / 理清顺序 / 判断题的陷阱),数学六站(余数入门 / 验算式 / 最值 / 周期 / 进一去尾 + 一个可拖着玩的精讲页)。

语文那四站每一站都对着期末卷上一道真丢过分的题,不是通用练习。比如第一站「回原文找依据」,起因是卷子上写着「请你在文中找出三个成语」,而他写上去的两个词,文章里一个字都没有——那不是词汇量问题,是没回原文找。

还有一套积分账本

练习站之外,我把孩子的积分制度也做成了系统:83 条规则(按学校科目分区,奖分扣分并列)、12 件可兑换的东西、一条从开局涨上来的资产曲线。

几条设计上的选择:

  • 分值一律服务端算,页面报什么都不算数
  • 家长的管理密码每次现输,不发登录状态——孩子拿到已登录的平板也加不了分。能自己给自己加分的积分系统,第二天就变成刷分游戏
  • 刷题得分每天封顶,而且空交卷不给分(一道题不做直接点交卷,判定要数做对的题,不是数总览的行数)
  • 账本只追加,余额永远从流水累计。撤销走红冲:反向流水 + 原条目盖作废戳,不删记录

它和练习站是打通的:做完一套题自动入账,首页上能看见今天挣了多少。

现在这个站有什么

学科小学 10 门摆着,语文 + 数学已开课,其余 8 门写明筹备理由
语文 4 站 + 数学 6 站 + 1 个互动精讲页
题型74 种,合计能出 50,725 种不同的题
题库227 道查得到的具体题目(卷子原题 + 题型样例),能搜能改能导出打印
勋章16 枚,未解锁的也摆着并写明条件
形态单文件 HTML,零外链,双击就能用,能发家长、能塞平板离线做
存档存在这台设备的浏览器里,跨学科共用一条成长线

站本身是登录才进得去的,也不给搜索引擎收录——里面有孩子的作文、试卷原图和成绩,那些东西一个字节都不上传。所以这篇不放地址,只放功能。

最后,给同行留一段

这个站是零后端、零 CDN 的自包含单文件 HTML:题库在构建时内联进页面,运行时不发一个请求,双击本地文件功能完整(积分那部分会自己判断协议,本地打开就不出现)。

引擎大约 7,200 行:渲染器 + 运行时 + 题库读写口 + 学习路径校验 + 端到端冒烟。17 道 fail-closed 的机器门,改完跑一条命令全过才算数。其中我最看重的一条是 verify 契约——每道题的验算必须走和出题不同的路子:出题用公式直接算,验算就穷举候选真做一遍;语文题的答案则回原文 indexOf 查证,该在的必须搜得到、干扰项必须搜不到。复用同一个公式去「验算」等于测了个替身,错了两边一起错。

包括这篇文章里的图也是机器产的:一个截图引擎把每张图定义成「一段真实操作 + 一个 DOM 断言 + 一道空白像素门」,跑不出预期状态就不给出图。它当场抓到过一张 DOM 断言全绿、实际却是纯背景色的空白图——截图这种东西,最容易假绿。

题目、讲解、干扰项这些内容层的东西,机器一概不管,得自己念一遍。这也写在检查脚本的最后一屏上:全绿不等于事情对。

订阅

新文章都先发在这里。用 RSS 订阅: /feed.xml

作者

曾田力

水利工程师。在这里写 AI 方法论、投资日复盘和工程实践。

这篇写错了、写漏了,或者你有别的想法?