my anki sample page

刚做完, 所以本来今天想好好写一下.但是现在时间太晚了, 明天肯定又要忙其他的,就速记下吧.

选择Anki, 是因为 “间隔复习”.这种复习方式,确实有效果. 经过约1个月的试用, Anki确实显著提升了记忆效果.第一周就能体会到, 两三周之后,真的有一种记忆素材深深印在脑海,与自己融为一体的效果.

离开Anki, 最主要是它不符合我的直觉; 或者说过于复杂,无法让我很好地继续用. 最直观的感受是: 有一天,突然发现, 有些记忆素材,出现的频率要比预想中要高很多.我深入查了下, 发现是: Anki 会把 点击”忘记”按钮的卡片, 重新设置为 “新卡片”. 具体的原理和作用机制,要更复杂一些. 但是我….算了, 我懒得去深入分析和讲解.

我认为, 从用户使用的角度, Anki 是一个很粗糙的产品. 粗糙到, 我宁愿中止一周,做一个更符合自己需要的替代品, 也不想迁就继续用.我相信我是对的. 如果你要做的事非常重要,但是依仗的工具,完全不符合直觉或者需要极高的学习成本,那最理性的方式或许就是: 换!

我做的东西,主要集中于以下几个核心需求:

  • 复习阶段和复习周期,要足够明确,可预期. 目前我是设置了5个阶段, 复习间隔用了简单的斐波那契数列.最后一个阶段,作为保留.
"config": {
    "stage": {
        "1": 3,
        "2": 5,
        "3": 8,
        "4": 13,
        "5": 21,
        "6": 99999
    }
}
  • 针对 “忘记”的特殊处理:
    • “忘记”操作, 只会让卡片回退到前一阶段;
    • “忘记” 的卡片, 当日可以继续 复习, 复习通过不会导致 卡片周期的变化.
    • “忘记” 的卡片, 在重新复习完成前, 如果再次 “忘记”, 不会导致 卡片 的记忆阶段 继续回退.
reviewNgAction: {
    reducer(state, action) {
        const { cardId } = action.payload
        const card = state.card[cardId]
        if (true == card.reviewToday) {
            return
        }
 
        // 回答错的卡片, 今天需要额外单独复习一次.但是复习阶段,会掉落 1 级.
        card.reviewToday = true
        card.stage = Math.max(1, card.stage - 1)
 
        localCacheCardState(state)
    },
    prepare(cardId) {
        return {
            payload: { cardId }
        }
    },
},

Anki 的各种复杂参数,劝退了很多用户. 我现在是真的认为: 没必要! 根本就没有必要引入各种 “摩擦因子” “学习效率” 一类的概念, 甚至我不认为有必要专门引入某种特殊的 “间隔复习” 算法. 因为每个人的记忆力, 过往知识的积累, 待记忆内容本身的特征,都是不同的.完全没必要反复去调教和优化各种 “参数”.

让素材本身去自我优化, 自己去寻找自己的独特记忆周期和间隔不好吗? 被忘记了, 下次就早复习几天; 记住了, 下次就晚复习几天. 最终来看,大部分素材肯定都会有多次在不同的记忆阶段来回摇摆的情况; 而且显而易见, 对素材记忆者本身越难记忆的素材, 摇摆的频次会越多.

于是也就引出了, 我为什么不继续使用Anki的最直接的原因: 我要记忆的素材,总体数量足够大; 按照它的算法, 在等几个星期, 我要记忆的素材数量,几乎肯定要爆炸.

我在记忆口语对话相关的素材. 需要同时关注发音和文字内容的准确度. 但是有时候发音,我认为自己与原始音频相差太多, 想今天再多听两次, 这样我就必须点击 “遗忘”…当然, 有人可能会说, 我应该将 “文字” 和 “音频” 的记忆分开记忆 — — 真扯淡 — 我需要一个 记忆工具来 教我做事?!

“间隔复习” 这个记忆原理,或者说理念,真的挺好,至少解决了我无法熟练运用新语言口语素材的问题; 但是现在的 Anki, 真心不适合面向 普通用户. 从产品体验的角度, 真的很失败. — 需要用户自己调教 技术参数 的产品, 大概率都是 “魔鬼”吧!