從 BDD 操作盤點展開到狀態矩陣
BDD 操作盤點描述使用者操作的情境和預期結果,但操作盤點的格式(Given / When / Then)聚焦在「什麼情境下做什麼得到什麼」,容易漏掉畫面層級的兩個面向:每個狀態下使用者能執行哪些操作,以及如何離開當前狀態。畫面狀態矩陣補上這兩個面向,讓導航缺口在實作前浮現。
操作盤點的覆蓋範圍
BDD 操作盤點通常包含:
- 使用者操作(When):「使用者點擊連線按鈕」
- 前端引導(Then):「顯示連線進度指示」
- 後端回應:「WebSocket 連線建立」
「前端引導」描述的是畫面的顯示內容 — 對應狀態矩陣的「顯示」欄。但操作盤點通常不會展開:連線中的畫面除了顯示進度指示,使用者能做什麼?如果連線失敗,使用者怎麼離開失敗畫面?
app_tunnel 的操作盤點在「前端引導」欄寫了「連線失敗顯示無法連線」,覆蓋了 error 狀態的顯示。但是「顯示無法連線之後使用者能做什麼」和「使用者怎麼離開這個畫面」都沒有描述。實作出來的 error 狀態有重連按鈕但沒有 back 按鈕 — 重連失敗時使用者被困在 error → retry → error 循環裡(U.C1)。
展開步驟
步驟一:從操作盤點抽出所有畫面
每個 BDD 情境至少涉及一個畫面。列出所有情境提到的畫面名稱,去重後得到畫面清單。
例:app_tunnel 的操作盤點涉及三個畫面 — 首頁、配對畫面、終端機畫面。
步驟二:每個畫面列出狀態
從操作盤點的 Given / When / Then 條件中抽出狀態。「Given 連線已建立」暗示有 connected 狀態;「Then 顯示無法連線」暗示有 error 狀態。
同時檢查程式碼中的狀態 enum — 操作盤點可能遺漏了某些狀態(如 idle、disconnected),程式碼裡有但操作盤點沒提到的狀態同樣需要設計 UI。
步驟三:每個狀態填「顯示」欄
從操作盤點的「前端引導」直接填入。這一步通常不缺資料,因為操作盤點的強項就是描述顯示內容。
步驟四:每個狀態填「可用操作」和「退出路徑」欄
這一步是關鍵 — 操作盤點通常不提供這些資訊,需要主動補上。
對每個狀態問兩個問題:
- 使用者在這個狀態下想做什麼?(可用操作)
- 使用者怎麼離開這個狀態?(退出路徑)
開發者容易假設 connected 狀態下使用者只想打字,不會想返回首頁。但使用者可能想切換到配對畫面重新配對、想暫時離開做其他事、想結束當前操作。把這些可能性列出來,判斷哪些需要提供操作按鈕。
步驟五:檢查矩陣的空白格
退出路徑欄為空的狀態是 UX 死胡同,需要補上退出路徑。可用操作欄為空的狀態需要判斷是否合理 — loading 狀態操作欄為空可能合理,但建議至少提供取消操作。
操作盤點的「描述顯示」偏差
操作盤點的「前端引導」傾向描述顯示(What the user sees)而非描述互動(What the user can do)。這個偏差的根源在 BDD 的 Then 語法 — Then 通常描述可觀察的結果,而「畫面顯示 X」比「使用者可以做 Y」更容易寫成可觀察的斷言。
app_tunnel 的操作盤點就是這個模式。四個操作情境的「前端引導」都寫了顯示內容(「顯示終端機畫面」「顯示連線中」「顯示無法連線」),沒有一個寫了操作(「使用者可以取消」「使用者可以返回」)或退出路徑(「使用者可以回到首頁」)(U.C1)。
畫面狀態矩陣的四欄結構強制補上這兩個面向。從 BDD 操作盤點到畫面狀態矩陣的展開步驟,就是把「只描述顯示」擴展成「顯示 + 操作 + 退出」的過程。
下一步路由
- 畫面狀態矩陣的完整定義 → 畫面狀態矩陣的定義與填寫方法
- 路由可達性檢查 → 路由可達性檢查
- 想知道什麼是「假設只走 happy path」的反模式 → 反模式:假設使用者只走 happy path