所有筆記 · 發布於 2026-10-22

一個多益 App 到底有多大?單手刷990 的規模盤點:65 萬行程式、28,640 題、8 萬個音檔

單手刷990 從第一天寫程式到今天,剛好 156 天。我們把整個專案翻了一遍,把程式碼、題目、教材、圖片、音檔、影片、改動紀錄、版本、文章和設計文件通通數了一次。這篇把所有數字攤開,說明每個數字是怎麼算的,順便解釋你在 App 裡按下「回報問題」之後到底發生了什麼——以及哪些數字你不該太當真。

先給結論:一張總表

項目 數字
開發天數 156 天(2026-05-19 第一次存檔)
程式碼 654,678 行
自動化測試 5,069 個
題目(多益七大題 + 補充練習) 28,640 題
題目與教材裡的英文 約 116 萬個英文字
翻譯對照字串 976,479 條
圖片 7,153 張(App 專案內)+ 2,538 幅畫作(雲端)
音檔 79,854 個,約 80 小時
影片 24 支
程式改動 / 審查合併 / 工作單 5,523 次 / 1,521 包 / 1,226 張
發布版本 81 個(1.0.0 → 1.74.0)
官網頁面 / 文章(本篇上線前) 445 頁 / 84 篇
設計與工程文件 234 份,57,536 行

下面一項一項講。

Happysaur 站在小梯子上,拉著捲尺量一疊高過畫面的紙堆——這篇就是把整個專案從頭量了一次。

程式碼:65 萬行,最大的一個檔案裡沒有任何邏輯

區塊 檔案數 行數
App 本體 301 297,228
自動化測試 303 133,087
網頁版 426 116,584
內容生成、檢查、發布的腳本 336 89,262
雲端後台(轉送回報、驗證訂閱…) 25 10,256
官網產生器 8 7,568
手機系統專用的小片段 5 693
合計 1,404 654,678

幾個值得知道的細節:

  • 最大的檔案是介面文字檔,20,712 行,裡面沒有一行「程式」。App 裡每一句話都住在這裡:2,960 句介面文字,16,839 條字串。第二名是首頁,17,232 行。我們知道,我們也很想拆。
  • App 本體的 29.7 萬行裡,約 1.9 萬行是程式從資料自動產生的表格(例如字根課程的展開表、解題鐵則的詞性表)。這些行數算不上「寫」的,但它們確實要編譯、要測。
  • App 本體有 3,945 個程式單元,其中 1,550 個是畫面元件,約 380 個是完整的畫面。跨裝置同步的資料有 98 種,每一種都有自己的合併規則——這是另一篇文章的題目了。
  • 測試的 13.3 萬行是 App 本體的 45%。自動化測試共 5,069 個,每一次改動都要全部通過,才能併進正式版。網頁版另外有 2.1 萬行測試。

順帶一提,「行數」是全世界最差的生產力指標。它衡量的不是品質,是要維護的東西有多少。65 萬行的意思是:改任何東西,都有 65 萬行可能被你弄壞。

Happysaur 小心翼翼地從一座高高的積木塔抽出一塊,塔微微傾斜——程式越多,改一個地方能弄壞的東西就越多。

題目:28,640 題,分成兩堆

第一堆是多益本身的七大題,11,032 題,分在 4,364 組題組裡:

Part 題數
Part 1 照片描述 335
Part 2 應答問題 1,375
Part 3 簡短對話 2,082
Part 4 簡短獨白 1,536
Part 5 句子填空 1,216
Part 6 段落填空 680
Part 7 閱讀測驗 3,808

第二堆是補充練習,17,608 題:片語 9,417、單字 3,834、文法 2,445、搭配詞 1,000、句子重組 441、改錯 246、口音辨識 225。

每一題不是寫完就算數。Part 1 到 Part 7 的每一題都有難度標記和中文對照——Part 3 到 7 對照每個選項,Part 1、2 的選項是用聽的,對照放在逐字稿上;其中 8,329 題(四分之三)附答案證據——文章或對話裡哪一句話支持這個答案;Part 5 和 Part 6 另有文法標籤;另外 5,682 題 Part 5–7 附了詳解。至於題庫到底夠不夠用,我們在〈多益題庫夠不夠?〉裡用 9,854 份雲端備份算過。

教材:題目以外的東西,比題目還多

「題目」只是練習的入口。單字、片語、文法這些模組,底下各自有一層又一層的資料:

  • 單字 3,834 個,每一個都有:詞典釋義、字源故事、搭配詞(合計 19,930 組)、三種口音的發音、例句朗讀。另外有 737 個單字家族、201 組衍生字、152 個字根字綴、145 張主題地圖,以及長按任何字都查得到的 10,176 條詞庫。
  • 片語 3,022 個,9,417 題,分成 196 個片語家族;149 個片語有來歷故事。
  • 文法 48 個主題,每個都有講解;另有〈互動文法書〉46 章,每一節一幅漫畫,共 139 幅。
  • 生活實用英語:290 句英語諺語(12 個主題)、230 個刁鑽發音字(8 種陷阱)、480 則文化典故(9 個部分)、136 篇荒謬單字故事(34 個等級,每級四篇)。
  • 其他:93 堂字根課程、83 張小撇步卡、240 句聽寫語料、225 題口音比較(每題三種口音)、77 級單字隨身聽、2,538 幅單字畫作,還有一個做了 10 集、正在問大家意見的單字電台(另外約 860 集已錄好等著)。

把這些文本全部加起來:題目與逐字稿裡約 116 萬個英文字(閱讀 48.7 萬、聽力逐字稿 67.3 萬),對照用的翻譯字串 976,479 條。全部內容的資料檔有 563 個,共 230 MB。以一頁 250 個字、400 頁一本來算,差不多是十一本半的書。

圖片、音檔、影片

圖片在 App 專案裡有 7,153 張:

類型 張數
單字意思貼圖 3,672
商店截圖與宣傳圖 1,029
官網插圖、截圖、分享卡 565
文化典故插圖 484
聽力 Part 1 照片與圖表 357
互動文法書漫畫 139
單字故事插圖 136
單字攻城的城堡 78
Happysaur 吉祥物各種姿勢 29
圖示、品牌、電台角色、其他 664

另外有 2,538 幅單字畫作放在雲端,你點開那個字才下載,不隨 App 打包。

音檔是最大的一塊。專案裡有 79,854 個音檔。我們抽了 250 個量長度,再乘回去,估計總長約 80 小時——不睡覺從頭聽到尾要三天多:

類型 檔案數 估計時長
聽力題目音檔(Part 1–4) 9,306 ≈ 21 小時
單字隨身聽(字、釋義、拼字、例句、搭配詞) 54,996 ≈ 40 小時
單字例句朗讀 6,639 ≈ 10 小時
單字發音(美音) 3,834 ≈ 1 小時
片語朗讀 3,064 ≈ 1 小時
口音訓練 1,365 ≈ 1 小時
暖身題、刁鑽發音 650 < 1 小時

這還沒算放在雲端、要用時才下載的英音與澳音單字發音 7,668 個,以及專案其他角落的聽寫 240 句、故事朗讀 136 篇、考場環境音 159 段。單字隨身聽的 54,996 個檔案裡,有 3,834 個是把一個字一個字母一個字母拼出來的——沒有人想親口錄這個,所以是請電腦錄的。

Happysaur 戴著耳機、捧著馬克杯,坐在一座錄音帶小山裡,窗外已是深夜——把全部音檔聽完要三天多。

影片最少:官網連到 YouTube 上的 24 支(23 支短影片加 1 支長片),分成 2 個播放清單。專案裡只有 1 支示範用的影片檔。做影片的時間,大部分花在做上面那些東西了。

開發紀錄:5,523 次改動、1,521 包審查、81 個版本

先解釋三個詞。程式每存一次正式紀錄叫一次 commit(改動);一批改動要先經過別人審查、通過測試,才能併進正式版,這一批叫一個 PR(合併請求);而每一個 bug、回報、提案,都是一張 issue(工作單)。

  • 5,523 次改動,156 天,平均一天 35 次,週末也算在內。七月 1,408 次是高峰,之後每個月都在 1,250 到 1,400 之間。
  • 1,521 包合併請求,1,509 包併進去了。每一包都要先通過全部 5,069 個自動化測試;有 213 包的討論串有五則以上留言,那通常是審查的人和寫的人來回了好幾回合。
  • 1,226 張工作單,1,190 張已關閉。其中 562 張是題目回報、534 張是意見回饋——也就是說,1,096 張(89%)是你們在 App 裡按「回報問題」開的。這個專案最大的測試團隊沒有領薪水。剩下的 130 張是我們自己開的:功能提案、bug 和待辦事項。這條生產線值得單獨講一節,就在下面。
  • 81 個發布版本,從 5 月 19 日的 1.0.0 到今天的 1.74.0,平均每 1.9 天一版。這不是計畫,是回頭看才發現的。
  • 另外發過 106 則 App 內公告,包括幾次問卷——最近一次的結果在〈用戶說我們方向錯了〉。

你按下「回報問題」之後,發生了什麼事?

你在某一題按「回報問題」,寫兩句話,送出。接下來是這樣的:

  1. 幾秒內,它變成一張工作單,掉進我們的追蹤系統,跟上面那 1,226 張排在一起。你不用填的東西,App 替你附上了:那一題的編號、你的 App 版本、手機型號、系統版本、你用的語言。這些正是修 bug 最需要、而寫信的人幾乎永遠忘了寫的東西。
  2. 你的手機記住了這張單的號碼。 到「設定 → 我的回報」,你會看到它現在的狀態:已收到 → 處理中 → 已修正。如果我們看不懂,狀態會變成「等待你補充說明」,旁邊有個按鈕讓你補。不用帳號,不用 email,不用登入任何地方。
  3. 我們在單子上寫的每一句回覆,都會原文出現在你的手機上。 你可以再回、可以補圖、也可以在我們結案之後重新打開它說「沒好」。
  4. 修好之後,單子會標上修正的版本,你那邊會顯示「已在 1.xx 修正」,首頁也會跳一條「你的回報有新進度」。你知道該更新了,也知道為什麼。

三格漫畫:回報從手機飛向 Happysaur,Happysaur 把它釘上工作板逐一處理,修好後再把結果送回同一支手機。

這就是為什麼我們一直、一直請大家用 App 裡的回報,而不是其他管道:

  • Email:沒有題號、沒有版本、沒有機型,我們得先回信問三個問題;而且它不在追蹤系統裡,很容易被下一封信蓋掉。
  • 問卷:問卷是匿名的,我們看得到問題,卻找不到人問細節,也沒辦法告訴你修好了。
  • 商店評論(最糟的一種):我們可以公開回覆一次,但沒有對話串:問不到題號和版本,修好了也沒有辦法通知你。更慘的是,一條「第 1,204 題答案錯了」的一星評論,在那題第二天就修好之後,還會在商店頁面上掛好幾年。

在 App 裡按回報的 1,096 張單子,每一張都有人看、有人回、修完有人通知。寄到別處的,我們只能盡力。

官網:445 頁、84 篇文章

在這篇上線之前,官網 handy990.happysaur.com 有 445 個網頁,繁體中文版 102 頁。文章分五區,共 84 篇:技術文件 24 篇、英文知識 33 篇、多益指南 14 篇、實戰報告 3 篇、開發筆記 10 篇——你正在讀的是第 11 篇。

設計文件:234 份、5.7 萬行

這一項通常不會有人數,但它大概最能說明「這個專案是怎麼做的」。每一個功能在寫程式之前,都先有一份設計文件:要解決什麼問題、為什麼這樣做而不是那樣做、資料怎麼存、怎麼測、哪些事刻意不做。功能上線後,文件留著,下一個改它的人先讀文件。

類別 份數
功能設計 81 份,31,142 行
內容編寫規範與審查 24
工程(同步、帳號、遙測、媒體託管、網頁版) 18
行銷 16
推廣文案 57
商業模式 4
商店文案 6
其他 28

旁邊還有一整套「工具的工具」:336 支腳本、51 個一鍵建置指令、11 套封裝好的工作流程(出題、審題、發版、修 bug、寫這種文章……)。這些東西沒有一行會出現在 App 裡,但沒有它們,上面的內容做不出來。

還有幾個不好歸類的數字

  • 專案裡有 117,208 個檔案,5.06 GB;加上每一次改動的完整歷史,8.7 GB。
  • 另外有 2.4 GB 的半成品內容,還沒通過審查、還沒進 App。
  • 32 個補充練習模組(還不含諺語、發音、典故、故事這些「生活實用英語」)。
  • 截至 9 月 8 日,9,854 份雲端備份。

小小的七人團隊怎麼做到的?

單手刷990 是七個人做的,156 天。(七人團隊是本站長期堅持的官方說法。如果你在 App 的「關於開發團隊」頁看到「獨立開發」四個字,請當作沒看見;如果你數了數下面提到的人只有一個,那是因為另外六位都很低調。)老實說,做法沒有什麼秘密,只有幾條一開始就定下來、之後沒有破例的規矩:

  • 先寫文件,再寫程式。 上面那 81 份功能設計不是事後補的。一個功能想不清楚「為什麼」和「不做什麼」,就不會動工。
  • 內容走同一條生產線。 每一題都經過:出題 → 跟現有題庫查重 → 人工審題 → 上架。不管是 Part 7 的閱讀文章還是一句諺語的翻譯,都一樣。工具(包括 AI 工具)幫忙產初稿和找問題,但沒有一題是沒人看過就上架的。
  • 測試擋在門口。 5,069 個自動化測試,每一包改動都要全過。這是我們敢每 1.9 天出一版的原因。
  • 用的人告訴我們哪裡壞了。 89% 的工作單來自 App 裡的回報按鈕。我們回每一張,修完也在 App 裡告訴回報的人。

七張椅子的團隊合照,只有中間那張坐著揮手的 Happysaur,其他六張是空的——另外六位同事都很低調。

七個人(姑且這麼說)、156 天、65 萬行,聽起來很快。但真正花時間的從來不是「做出來」,是「做出來之後判斷它對不對」——文件和測試,就是把這些判斷留下來的方法。

但是老實說

照例把話說清楚:

  • 大不等於好。65 萬行、2.8 萬題、80 小時音檔,對你明天的練習毫無意義。重要的是今天推給你的那 10 題選得對不對。這些數字說明的是「有多少東西要顧」,不是「有多好」。
  • 音檔時長是抽樣估計,誤差可能有幾個小時。英文字數是用空白切的,不是語言學意義上的「詞」。
  • 行數包含大量不是程式的東西:介面文字、自動產生的表格、測試。如果只算真正的程式邏輯,答案大概是上面那個數字的一半。
  • 562 張題目回報不是勳章。每一張都是有人被一道有問題的題目耽誤了時間。數字大代表題庫大、用的人多,也代表我們欠的修正多。
  • 所有數字都是 2026 年 10 月 22 日當天的。下週就不對了。

Happysaur 背對一座題目卡山,只舉起今天的一張卡——大不等於好,重要的是今天推給你的那幾題選得對不對。


這篇是單手刷990 的開發筆記。相關文章:〈多益題庫夠不夠?〉從使用紀錄看題庫覆蓋率,〈用戶說我們方向錯了〉是最近一次問卷的結果。

← 所有筆記