产品设计

Anki:先想起答案,再决定下一次什么时候复习

Anki 把复习拆成回忆、揭晓和自评。四个按钮不只是结束一道题,它们把这次记忆的难度交给后续调度;设计的关键是让用户愿意提供真实信号。

先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。

01
代码思考

一次复习,只记录一次评分

为一个本地卡片练习器实现复习模块。卡片 A 的问题是“apple 的中文”,答案是“苹果”。调用方可以开始一次复习、读取当前内容、揭晓答案、提交 Again/Hard/Good/Easy 中的一项。开始时只显示问题,揭晓后显示答案;一次复习只能成功提交一次评分。

  1. 模块接收一个外部调度函数:输入卡片编号和评分,返回下次复习时间。有效提交才调用它,并保存一条包含卡片编号、评分和返回时间的记录;未揭晓或重复提交时返回拒绝,已有记录不变。接口和状态表示由你决定。
  2. 用测试调度函数验证:A 选 Good 时返回“明天”。开始后直接提交 Good 应拒绝、调用次数为 0;揭晓后提交应成功,产生 A/Good/明天这一条记录;再提交 Again 应拒绝,调用次数仍为 1。重新开始 A 的一次复习后可以再次正常提交。
  3. 交付可运行模块、重现上述过程的调用,以及关键职责划分的简短说明。操作依次执行,调度函数始终成功返回,不需要接入真实算法或存储。
查看思路

先决定什么标识一次复习,什么属于卡片长期记录,避免把“这次已评分”误写成“这张卡永远不能再评分”。把允许提交的判断留在模块中,把下次时间交给传入的调度函数;用调用次数检查被拒绝操作是否泄漏到了调度层。