Anki卡片的本质是由一系列字段组成的数据结构。卡片的字段可以在Browser中看到,有些字段比较简单,例如Added代表“添加日期”,这是一眼就能看出的。有些字段比较复杂,例如Ease代表间隔扩大系数,需要明白调度算法才能理解。

其中有一个Due字段,代表“到期时间”,但不同卡片类型的Due值有所差异,这一点可能让人迷惑,在这里捋一捋。

“新卡片”(new card)的Due值是整数。“新卡片”由于还没有学过,所以不存在“到期”一说,但Anki需要决定“新卡片”的显示顺序,哪张在前哪张在后是如何决定的呢?Anki的Deck配置中,有一项专门针对“新卡片”显示顺序的配置“Order”,如下图所示:

关于这个配置项,文档的部分说明如下:

Order controls whether Anki should add new cards into the deck randomly, or in order.

Anki文档 “Order”决定了“新卡片”的学习顺序,即“随机显示”或“按添加顺序显示”。如果是“随机显示”,则Anki会将“新卡片”的Due值设置为一个随机的整数。如果是“按添加顺序显示”,则Anki会将每一张“新卡片”的Due值设置为一个更大的整数,下一张总是比上一张的Due值大1,如下图所示:

但有一个例外,无论“新卡片”按哪种顺序显示,只要属于同一个note,则它们的Due值相同,此时顺序就取决于生成卡片的template的序号。Cloze类型的卡片就是这种情况的典型,如下图所示:

“学习中卡片”(learning card)的Due值是Unix时间戳。“新卡片”完成第一次学习后变成“学习中卡片”,其下次的显示时间取决于Deck的Steps配置项。

如果不是在学习卡片的过程中忘记,比如其中一个step是Again,Steps配置项的第一个step是无效的,下次的显示时间由第二个step决定。假如Steps配置项是“10、20、60”,则“新卡片”变成“学习中卡片”后的下次显示时间便是20分钟后。

虽然“学习中卡片”的Due值在Browser中显示的依然是日期,但在内部的表示是一个Unix时间戳,否则就无法确切地知道在哪个时间点再次显示它。对Unix时间戳有疑问的同学请自行了解。假设当前的时间戳是1614944804,按照前面的配置,“学习中卡片”下次显示的时间戳是1614944804+20*60即1614946004。

“复习卡片”(review card)的Due值是日期。如果一张卡片从“学习中卡片”变成“复习卡片”,其Due值便从时间戳变成下次显示该卡片的日期,此时的Due才与它的本意更相符。“学习中卡片”第一次变成“复习卡片”的Due值与当天间隔的天数取决于两个配置项,如下图框起的部分所示:

两个配置分别适配两种不同的情况。
情况一,“学习中卡片”经过了完整的Steps变成“复习卡片”,比如每个step都是Good,Graduating Interval适配这种情况。
情况二,“学习中卡片”未经过完整的Steps变成“复习卡片”,比如其中一个step是Easy,Easy Interval适配这种情况。
根据默认配置,情况一中的“复习卡片”显示的日期与当天的间隔是1天,即明天就会再次出现。情况二中的“复习卡片”的显示日期与当天的间隔是35天。明明配置是4天,为什么结果是35天呢?因为Anki会对大于等于两天的间隔进行随机混淆,目的是为了避免相同间隔的卡片扎堆显示,所以同一天新增的卡片在后面的复习过程中并不是同一天出现,可能相差一天,也可能相差几十天,越往后相差越大。“复习卡片”每成功复习一次,Anki就会为其计算一个比上次间隔更长的新间隔,此时的Due值便是复习当天的日期加上新间隔后的日期。

对于不太关心Anki运行原理的同学来说,上面的内容略显枯燥,但相信坚持看下来的同学对Due字段的理解可以说相当透彻。