跳到正文
目录

2026 年 9 月 1 日测试 EnglishAholic 的时候,我点了一下“准备今日学习”。

轮到的第一个 Episode,也就是学习单元,已经排好了十二个词:makegivetakecarrygetgocallraisefollowclearseeblow。接下来,AI 要用这十二个词写出一段自然、连贯、前后有因果关系的情景,而且一个词也不能漏。

AI 生成了两版,两版都没有通过规则校验。第一次页面还让我稍后刷新,刷新以后,只剩下一句:情境暂不可用。

这当然是一个程序问题。但顺着这个问题往回查,我很快发现,真正出错的地方比程序更早:这十二个词为什么会被认为适合放进同一个场景?一个连人都很难完成的任务,我为什么会觉得换个模型、改改提示词就能解决?

于是,做了很久的 EnglishAholic,又被我推翻了。

这已经不是我第一次因为英语做一个产品,也不是我第一次把它做到一半。

英语从来没有给过我一条终点线

学英语这件事,大概已经成了我的一个心病。

从小学三年级第一次接触二十六个字母开始,它断断续续折磨了我二十多年。我一直在学,也一直在忘;忘了再学,学了再忘。我有时甚至不知道,英语到底学到什么时候才算到头。

在我的世界观里,学习一件事,总该有个“学会了”的时候。可英语好像没有。它更像中文,是一件需要一直做下去的事。区别是中文每天都有人和我说,我也会不断读到、听到和用到它;英语却不会自然出现在我的生活里。身边没有人和我说英语,我只能自己读、自己练、自己跟自己说。

可一门没有交流对象的语言,真的能靠这种方式学会吗?至少对我来说,很难。

疫情期间被关在家里,闲着也是闲着,我又一次开始学英语。那时我报了一个课程,主要学英音、美音和英语发音,也学了一些语法。课程快结束的时候,ChatGPT 发布了。1

在我此前接触过的工具里,所谓的“对话”更像固定问答或者自动补全。ChatGPT 带来的感觉完全不同:我说一句,它会接住这句话;我可以追问,可以解释,也可以换一种方式重新说。对当时正在学英语的我来说,它最直接的意义是,我终于多了一个愿意一直陪我说英语的对象。

也是魔怔人遇上了魔怔事。那段时间我学到一个词:workaholic。老师当时把 -aholic 通俗地解释为对某件事痴迷甚至上瘾。2 我一听就觉得,这不就是我当时的状态吗?一个常年做产品的程序员,又在没完没了地学英语,那我算不算一个 EnglishAholic?

于是我注册了 englishaholic.com

现在回头看,那个域名比产品先诞生,甚至比我要解决的问题还早。

当时的想法其实很简单。我正在上的课程要求我们把学到的内容说出来、讲出来,我觉得这个方法不错。读出声音,至少意味着英语不只是在脑子里转一圈。ChatGPT 出现以后,这件事又多了一种可能:以前说完就结束了,多少有点自娱自乐;现在,对面终于会回应。我开始想,能不能调用 AI 的能力,把英语练习真正变成一场对话?

EnglishAholic 最初的想法就是这样来的。我希望把那些同样对英语上头的人聚到一起,大家借助 AI,也借助彼此,让英语从一门总在学习的知识,变成一种真的会被使用的语言。

至于具体做成什么,我并没有想清楚。

那时我还在用 Laravel 做 PHP 全栈项目,于是顺手做了一个简单的网站。它具体有哪些功能,我现在已经记不太清了,大概和语法学习有关,可能还想让 AI 帮用户纠正语法。别的事情不断进来,产品做到一半就被搁置,EnglishAholic 这个域名也跟着安静了下来。

英语重新回到我的工作里

到了 2025 年,我又开始频繁使用英语。

写代码的方式其实早就在变:先是一个字母一个字母地敲,后来有了越来越好用的代码补全。我一度自嘲是个“Tab 工程师”:写个开头,按一下 Tab,后面一截就出来了。到了那一年,Claude Code 和 VS Code 中的 GitHub Copilot agent mode 又把它推进到了 Agent 阶段,AI 开始直接处理一整段任务。3 4

我和这些工具协作时,经常使用英文。一方面,很多技术文档、报错信息和现成示例本来就是英文;另一方面,我以前的英语老师说过一句话:英语是农夫的语言。它很朴实,不一定简短,但往往会把一件事情老老实实地说出来。

我一直记得这句话。后来与 AI 协作时,我也借它说服自己:用英文把事情一层层讲清楚,似乎更顺手。

写英文多了,读英文自然也多了。新的问题很快出现:一句话里只要有几个单词不认识,阅读就会卡住;有时每个单词我都认识,连在一起却不知道这个短语在当前语境里是什么意思。尤其是技术文章,词典里的第一条释义常常帮不上忙,真正有用的是它在这一段代码、这个框架或者这次讨论里到底指什么。

这一次,我终于遇到了一个足够具体的问题。

于是我开始做一个浏览器插件。读英文时选中一个词或一句话,它可以直接翻译;如果是在技术文章里,它还能结合上下文,解释这句话在当前语境中的意思。

插件基本成形了。然后,熟悉的事情又发生了。

能翻译以后,我又想把查过的词收藏起来;收藏以后,自然又想拿出来复习;有了复习,还要安排学习计划。再往后,每个人收藏的内容不同,练习似乎也应该根据他的职业、水平和使用场景来生成。

每一个问题听起来都很合理,每一个功能也都能解释上一个功能为什么不够。产品就这样一点点长大,发布却一点点往后退。

我以前一直觉得,产品做得慢,是因为还有很多问题没有想清楚。后来才发现,有时正好相反:脑袋里的东西越多,事情反而进行得越慢。再加上那段时间生活里发生了一些别的事,我没有办法沉下心来继续做,插件也就再次搁置了。

一个背单词的问题,又把所有东西连到了一起

时间一天天过去,到了今年,我又开始背单词。

我使用的背词 App 会给每个单词配例句,可单词 A 和单词 B 的例句通常没有任何关系。学完一个单元以后,我记住的不只是十几个单词,还得另外记住十几个互不相关的小场景。单词当然可以这样学,但对我来说,这个记忆过程很痛苦,也很难把它们真的用出来。

我开始想,能不能把一个单元里的词写进同一个小故事?几个词发生在同一段对话、同一个任务或者同一件事情里。学完这些词,也就顺便走完了一个完整场景。它有点像小时候的英语课本:先有一篇课文,再从课文里学习单词,而不是让每个单词各自住在一个孤零零的例句里。

于是,我又把 EnglishAholic 捡了起来。

最开始,我只是想做一个帮助自己背单词的网站。后来我又把插件接了进来:插件负责收词,网站负责保存;保存以后可以复习;复习时可以生成情景;情景还可以根据每个人的工作和生活做个性化。因为它们都和英语有关,也都能共享一部分数据,我很自然地认为,它们应该属于同一个产品。

十二个单词,又把这个产品拆开了

直到那一天,那十二个单词出现在同一个 Episode 里。

一开始,我以为只要把分组算法修好就行。但要决定哪些词应该放在一起,就必须先回答:这些词是从一本正式词书里来的,还是某个用户刚刚在网页上选中的?前一种内容可以提前整理成固定的学习单元,后一种却无法预先知道。再往后,谁来安排复习、哪些内容可以多人共享、哪些对话只能属于当前用户,也都不是改一条提示词能解决的问题。

我这才看清楚,插件解决的是阅读正在发生时的问题:我此刻选中了哪个词,它在眼前这篇文章里是什么意思。至于按照一本词书持续学习、把合适的词组成一篇课文、记录进度和安排复习,那是另一套学习过程。

我现在想把它设计成这样:选择同一本词书的人,先共享相同的词和 Episode 结构,再根据生活、工作和学习场景使用不同版本的情境。真正开始学习以后,对话再跟着每个人的回答继续。插件也可以把一个词送到网站,却没有必要因此背上整套课程和复习系统。

除此之外,还需要一套底层内容系统,统一处理词库、不同词书之间重复出现的词,以及它们应该进入哪些 Episode。它和前面的产品都有关,却不该继续被当成同一个功能。

原来我学英语时,也在犯同一种错误

它们之间有关系,却不因此成为同一件事。

这可能也是我做产品时最容易犯的错误。一看到两件事之间可以连接,就想把它们装进同一个系统;一想到以后可能需要什么,就希望第一版先给未来留好位置。最后,系统越来越完整,真正需要它的人却还没有机会用到它。

学英语这些年,我好像也一直在做类似的事。我总想找到一个完整的方法,想把发音、语法、阅读、单词和对话一次学明白,仿佛只要系统设计得足够好,英语就会出现一个“已经学完”的状态。

这一次,我还是会重新架构 EnglishAholic,也会把它从零长出来的过程记录下来。不过还有一个问题得留给我自己:重新架构以后,第一件真正交到用户手里的东西到底是什么?如果答案还是“全部”,那这次推翻大概还不够彻底。

至于英语到底什么时候才算学到头,我现在还是不知道。

先把它用起来再说。

Footnotes

  1. OpenAI, Introducing ChatGPT, 2022-11-30。

  2. Merriam-Webster, -aholic:表示对某件事有强迫性需要,或喜欢到过度的程度。

  3. Anthropic, Claude 3.7 Sonnet and Claude Code, 2025-02-24。

  4. Visual Studio Code, Introducing GitHub Copilot agent mode, 2025-02-24。