IME 與國際化測試
有些 Bug,在英文世界裡根本不存在
有些 Bug,在英文世界裡根本不存在
你將學到什麼
Bug 的成因
input 事件每鍵觸發重畫,打斷組字流程,中文變成散掉的注音符號。
修法很簡單
用 compositionstart 與 compositionend 判斷組字中,完成前不動輸入框。
英文世界的預設
按一鍵出一字的假設,讓即時搜尋、Enter 送出這些標準寫法在中日韓失靈。
Beta 測的是想像力邊界
測的是真實的人不照你想像的方式操作時,產品會發生什麼事。
你知道有些 bug 在英文世界裡根本不存在嗎?!昨晚在升級學員許願的功能時,遇到一個乍看之下很荒謬的問題,那是一個知識庫搜尋頁面,我只是想在搜尋框裡輸入中文,結果畫面上沒有出現我想打的字,反而留下了一整串散掉的注音符號。系統當然找不到任何資料,最後很誠實地顯示「符合 0 份」。一開始看到這個畫面,我沒有先往搜尋索引、資料切片、知識庫狀態或向量搜尋那些複雜的方向查,也沒有立刻怪罪 AI 又生成了一段看起來合理、實際上不能用的程式。那些方向都可能出錯,但這一次,我對這個畫面太熟悉了。我知道原因比資料庫、搜尋演算法和向量索引更接近日常,卻也更容易被忽略。
剛說的這些懷疑都正常,因為在 Vibe Coding 的過程裡,任何一層都有可能出問題。只是這一次,我知道原因比資料庫、搜尋演算法和向量索引都更接近日常,卻也更容易被忽略。
搜尋框綁了 input 事件,每打一鍵就會重新處理畫面
搜尋框監聽了 input 事件,而且每收到一次輸入變化就立即啟動搜尋並更新畫面。偏偏注音、日文與韓文輸入法在組字完成以前,也會不斷產生輸入變化;如果程式在這個階段重新指定輸入框內容、重建元件或改變游標與焦點,就可能把尚未完成的組字流程打斷。
中文輸入不是按下一個鍵,就立刻得到一個完整的中文字,我們在輸入注音時,會先經歷一段「組字中」的過程,例如從 ㄓ、ㄓㄨ、ㄓㄨˇ 的過程,最後才選成「主」。
在這段時間裡輸入框內的內容其實還沒有正式完成,只是輸入法暫時放進去的候選狀態,如果這時候程式急著搜尋、更新 state、重新指定輸入框內容,甚至把整個輸入元件重新建立,輸入法的組字流程就可能被中斷。
結果本來應該合成中文字的內容最後都會以注音符號的殘影留在畫面上,也就是截圖裡看到的狀況。
解決這件事很簡單,加上 compositionstart 和 compositionend,讓程式在組字期間暫停搜尋,通常就能解決。這兩個事件不是魔法,關鍵是用它們判斷「現在是否正在組字」,並且在組字完成前不要做會干擾輸入框的事情。
如果只是為了修 bug,那這個小 bug 很快就可以結束,叫 AI 補上組字狀態,讓系統在中文還沒選字完成之前不要啟動搜尋,大概幾分鐘就能處理完。
讓我想寫這篇文的原因是這個問題,我已經遇到過很多次了
過去十年來,我玩票性質的幫國外 SaaS 做過很多很多次的 Beta 測試,很多團隊會很有信心地說「Everything works」,當然他們確實測過搜尋、表單、快捷鍵、即時篩選、留言框、登入流程,也做過不同瀏覽器和裝置的測試。
問題是他們的工程師是用英文或其他語言輸入,自動化測試腳本輸入的也是英文,整個開發流程就等於是建立在一個很自然、卻很侷限的假設上:按下一個鍵,畫面上就會出現一個字元。
在英文裡,按下 a 畫面上就是 a;按下 b 畫面上就是 b,這樣很正常,每一次輸入幾乎都可以視為一個已經完成的字元,所以 chatbot、即時搜尋這樣設計,然後每次輸入就呼叫 API、按下 Enter 就送出、keydown 就觸發快捷鍵,這些設計都非常合理。
可是中文、日文、韓文不是這樣的啊!
我們的輸入需要組字、選字、切換候選內容,Enter 可能是確認一個中文字,不一定是送出表單或欄位;方向鍵可能是在選擇候選字,不一定是移動畫面焦點;畫面上的暫時內容也不一定是使用者最後真正要送出的搜尋關鍵字。
對亞洲使用者來說,這不是罕見情境,也不是需要特別測試的極端案例,這就是每天最普通的輸入方式。
所以我以前在測試國外 SaaS 時,常常只要切換成中文輸入法,原本看起來運作正常的功能就開始出問題。
有的產品會在我還沒選完字時就啟動搜尋,結果列表不停的閃;有的輸入框會突然失焦,候選字視窗直接消失;有的系統把我為了選字而按下的 Enter,誤判成送出表單;有的快捷鍵會在組字期間被觸發;還有些產品中文字可以輸入,卻怎麼樣都搜尋不到,因為後端早就把組字過程中的注音、拼音或假名當成正式查詢送出去了。
這些團隊並不是沒有做測試,他們只是沒有測過「不是英文的人怎麼使用」。
這讓我一直很在意一句話「我們已經測試過了」
我現在聽到這句話,第一個反應不是放心,而是想問誰測的?用什麼語言測?用哪一種輸入法?在哪一個瀏覽器?是桌機還是手機?有沒有測過選字時按 Enter?有沒有測過中英文混合輸入?有沒有貼入一段很長的文字?有沒有使用全形符號?有沒有在輸入途中切換語言?
因為測試的品質,取決於測試者進入的是哪一種使用者的世界。
產品團隊最容易犯的錯不是完全沒有想到使用者,而是把自己熟悉的使用方式誤認為所有人的使用方式,他們以為自己做的是通用產品,實際上做出來的卻可能只是英文鍵盤環境下的通用產品,當產品進入亞洲市場,團隊才突然發現,原來同一個輸入框在不同語言裡根本不能正常運作。
很多人談國際化第一個想到的是翻譯,把英文介面翻成繁體中文,把 Submit 改成「送出」,把 Dashboard 改成「儀表板」,日期格式稍微調整一下,再加上一個語言切換選單,產品就好像完成了全球化。
但國際化遠遠不只是文字翻譯而已,它還包含使用者怎麼輸入文字、怎麼閱讀資訊、怎麼填地址、怎麼寫姓名、怎麼排列日期、怎麼理解數字和貨幣、怎麼操作鍵盤!喔還有!系統如何處理不同語言的字元長度、斷行、搜尋、排序和正規化?
翻譯只是介面表層,需要開發團隊留心的是產品邏輯有沒有符合到不同使用者的行為。
這次的 Bug 就是很好的例子,介面完全可以是繁體中文,按鈕也可以翻譯得非常完整,但只要搜尋框不理解 IME,這個產品對中文使用者來說就不是完整可用的產品。
而且這件事放到 AI Coding 的時代,反而更值得注意
很多人會以為 AI 看過全世界的程式碼,所以它自然知道所有市場、所有語言和所有使用情境。事實不是這樣的!
AI 很會的是生成「最常見的寫法」,而網路上最常見的前端教學、程式範例和技術討論大量建立在英文環境裡。
即時搜尋綁定 input、keydown 按 Enter 就提交、每次輸入就重畫,這些做法在很多情況下就是標準答案。
但標準答案通常只涵蓋標準使用者!
AI 不一定會主動問你「這個輸入框需要支援注音嗎?要不要處理日文假名或韓文輸入?使用者按下 Enter 時可能仍在選字嗎?」除非你在需求裡說清楚或真的遇到錯誤,不然 AI 還是會直接把主流世界的預設做法複製出來。
這也是為什麼我一直覺得 Vibe Coding 的核心從來不是「完全不用懂程式」
沒錯!我們不必再把所有語法、事件名稱和 API 背在腦子裡,但我們必須知道哪裡不合理、哪裡值得懷疑以及該用什麼方式把問題描述清楚。
這次如果我只跟 AI 說「搜尋壞了,幫我修」,它可能會從搜尋索引、資料切片、API、狀態管理一路亂改,但如果我能明確描述「中文注音輸入時,還沒選字就被拆成注音符號,而且每打一鍵搜尋結果就會更新」,問題範圍就會立刻縮小,再加上截圖、元件程式碼和事件流程,AI 才能快速定位到是 IME 組字和前端重畫之間的衝突。
我們提供的資訊必須接近真正的 Debug
這也是我認為 AI 時代很重要、卻常被低估的一種能力:不是直接給答案,而是要能準確描述現象、拆分可能原因、建立驗證方式,再讓 AI 協助縮小問題。
很多人使用 AI Coding 時,只關心能不能生成畫面,卻沒有意識到畫面生成之後可能會出哪些問題?功能做出來只是第一步,真實使用者進來才是產品開始接受考驗的時候。
① 工程師通常會測試「使用者照著我們設計的流程操作時,系統能不能正常運作?」
② Beta 測試是在測試「當真實的人不照你想像的方式操作時,產品會發生什麼事?」
一個好的 Beta 測試者不只會照著功能清單逐項打勾,而是會帶著自己的語言、裝置、工作習慣和直覺進入產品,他可能會輸入超長文字、快速切換頁面、重複點擊按鈕、貼入不完整格式、在送出前切換語言,或做出產品團隊從來沒有想過的操作。
喔!我還是要再公開表揚一下我老公,是他二十多年來可怕的使用經驗,讓我學會了怎麼變身成他,然後成為一個稱職的 Beta 測試者😂 他每一次大喊酒Ann 的時候,就是我可以學習他那完全不合理的操作方式的時刻!
當然 Beta 的這些行為不是在故意找麻煩,而是要提醒團隊:真實世界不會依照產品規格書使用你的產品,就像有些人買了空氣清淨機之後,不會把濾網的塑膠封膜拆掉一樣😂
所以我後來愈來愈覺得 Beta 真正測的不只是程式有沒有 Bug,而是產品團隊的想像力邊界,他們想像中的使用者是誰?他們認為什麼叫做正常操作?他們預設大家使用哪一種語言、鍵盤、裝置和網路環境?當一個不在他們預設裡的人進來時,產品還能不能正常工作?
這些問題才是真正的產品能力。
回頭看這次的 AI Coding,我並沒有因為注音符號而覺得 AI 很笨
相反的我覺得它再次證明了一件事,AI 可以非常快地把一個功能做出來,也可以很快協助修正錯誤,但它不會自動替我們補上所有未被說出的世界。
AI 能生成程式卻不一定知道誰會使用這個程式;AI 能實作搜尋卻不一定知道不同語言的人怎麼輸入搜尋文字;AI 能複製最佳實作卻不一定知道那個最佳實作是替哪一群人建立的。
所以我們真正要養成的不只是生成能力,而是對「預設」這兩個字保持挑惕的敏感度:這套流程少想了哪一種情境?這個介面漏掉了哪一群使用者?這個最佳實作,究竟是替誰建立的?
當大家都可以用 AI 快速做出一個 SaaS、一個網站、一個搜尋工具,競爭點就變成誰能更早發現那些「在自己世界裡完全正常,換一個使用者就立刻壞掉」的地方。
昨晚,我看著搜尋框裡散掉的注音,突然覺得這個畫面其實很誠實!它提醒我很多產品所謂的全球化都只是把英文翻譯成其他語言,而且很多產品所謂的測試完成也只是確認熟悉的使用者可以正常使用。
但這個世界不是每個人按下一個鍵就會得到一個字,如果想打造真正的全球性產品,請理解這件事開始!
至於怎麼成為 Beta 測試員,我真的不知道
第一次是因為我魯小來的阿里巴巴 AI 工具,當時我天天魯小他們,最後終於讓他們受不了才開放我使用,然後我就抓了一堆蟲出來,另外建議了一堆 UI / UX 可以改進的地方,然後他們看完使用者調查之後就直接打我台灣電話,發錢錢給我!!!
然後我的 email 就開始收到各種測試邀請...........於是這十年來我一直都在玩新工具、新應用😅
#每次上課做最多的都是我
#以後要禁止許願
本文原發表於 2026/08/03 的 Facebook 貼文,原文照登,僅調整網頁排版;文中提及的產品、價格與活動以當時為準。