目錄
2026 年 9 月 1 日測試 EnglishAholic 時,我點了一下「準備今日學習」。
排在第一個的 Episode,也就是學習單元,已經放好了十二個單字:make、give、take、carry、get、go、call、raise、follow、clear、see、blow。接下來,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
-
OpenAI, Introducing ChatGPT, 2022-11-30。 ↩
-
Anthropic, Claude 3.7 Sonnet and Claude Code, 2025-02-24。 ↩
-
Visual Studio Code, Introducing GitHub Copilot agent mode, 2025-02-24。 ↩