理論與工具在真實問題前才能見真章。這篇記錄一個真實場景的全流程:從 PM 丟過來的一句話,走過 Intent Extraction → Problem Framing → Spec → Plan → Tasks,看看每個環節把問題的形狀改變了多少。

起點:一句模糊的需求

PM:「用戶對登入體驗不滿意,能不能改一下?」

這是一個「症狀陳述」,不是問題定義。它沒有告訴我們:哪個用戶?哪種不滿意?現在的數字是什麼?改到什麼程度算「改好了」?

如果此刻直接開工,你會在「猜測什麼是對的解法」上花大部分精力。


第一步:Intent Extraction(Interview Me)

目標:確認對方真正想要的是什麼,而不是他描述問題的方式。

Q:你說「用戶不滿意」——你指的是哪些用戶?在哪裡看到這個信號?
猜測:大概是客服票或 App Store 評論,抱怨密碼登入太麻煩?

PM:主要是 App Store 一顆星評論,最近三個月暴增,很多人說
    「每次都要重新登入,很煩」。

Q:「每次都要重新登入」——你知道是 session 過期太短,
   還是另有原因(比如強制重登或 token 更新有 bug)?
猜測:大概是 session TTL 設得太短,7 天就到期了。

PM:我不確定,但 iOS 更新之後就開始變多這類評論了。

確認後的意圖聲明:

Outcome:讓已驗證用戶不需要頻繁重新登入
User:現有 iOS 用戶(特別是每週使用一次以上的回頭客)
Why now:iOS 更新後一顆星評論量三個月內增加,懷疑 session 持久化行為改變
Success:每週活躍用戶的強制重登次數降至 ≤1 次/月
Constraint:不能降低帳戶安全性,不能破壞現有 Android 行為
Out of scope:新用戶首次登入流程、社交登入功能

第二步:Problem Framing

意圖聲明告訴我們「什麼方向」,Problem Framing 告訴我們「為什麼這裡有個洞」。

5 Whys:

症狀:iOS 用戶每週需要重新登入 Why 1:為什麼需要重新登入?→ Session/token 過期了 Why 2:為什麼 token 過期?→ Refresh token 沒有被正確儲存進 iOS Keychain(iOS 更新後行為改變) Why 3:為什麼 Keychain 儲存邏輯沒有跟上 iOS 更新?→ 沒有針對 iOS major version 的回歸測試 Why 4:為什麼沒有這個測試?→ 當初的測試策略沒有覆蓋「OS 升級後的持久化行為」 Why 5:為什麼測試策略沒有覆蓋這個?→ 我們假設 Keychain API 是穩定的,不需要測

根因:「Keychain API 行為在 iOS 版本之間的穩定性假設從未被驗證過,也沒有自動測試覆蓋它。」

HMW 重構:

  • 我們要怎樣才能讓已驗證的 iOS 用戶在跨版本升級後仍保持登入狀態?
  • 我們要怎樣才能在 iOS major update 之後,自動偵測 auth 持久化回歸?

問題陳述句:

已驗證 iOS 用戶在 iOS major version 升級後,
因 Keychain refresh token 持久化行為改變而被強制重登,
導致每月約 12% 的週活用戶流失一次完整登入 session,
App Store 一顆星評論量三個月增加 47%。

這個陳述比「登入體驗不好」具體 10 倍,而且可以被測試:修完之後,同樣的 iOS 升級場景,強制重登應該不再發生。


第三步:Specify

## Objective
讓已驗證 iOS 用戶在 iOS major version 升級後維持登入狀態。
 
**驗收標準:**
- 模擬 iOS 17 → 18 升級後,refresh token 從 Keychain 正確讀取,
  用戶無需重新輸入密碼
- 週活用戶強制重登次數 ≤1 次/月(以 Session invalidation log 量測)
- Android 行為不受影響(現有 Android E2E test suite 全過)
 
## 假設
1. Refresh token 目前儲存在 Keychain,不是 UserDefaults
2. 問題在 iOS 17 → 18 升級的 Keychain migration policy 改變(待確認)
3. 後端 token 驗證邏輯不需要改動
→ 假設 2 需要在 iOS 測試機上先驗證,未確認前不進入 Plan
 
## Boundaries
- Always:改動前後跑完 iOS E2E auth flow test
- Ask first:任何改動 token 儲存格式的決策(影響所有已登入用戶)
- Never:直接在 production 測試 token migration logic

第四步:Plan → Tasks

計畫(Plan):

  1. 在 iOS 17 / 18 測試機上複現問題,確認根因(Keychain migration policy)
  2. 修正 Keychain 存取邏輯,支援新的 kSecAttrAccessibleAfterFirstUnlock 政策
  3. 加入 iOS 版本升級的回歸測試(XCTest + 模擬器 snapshot)
  4. Staged rollout:先 10% 用戶,觀察 Session invalidation 指標

任務(Tasks,垂直切片):

Task 1:複現問題
  驗收:在 iOS 17 → 18 升級後,refresh token 讀取失敗,可重現
  驗證:手動測試 + 截圖記錄
  預估:S(1 人 × 2 小時)

Task 2:修正 Keychain 存取邏輯
  驗收:iOS 17 → 18 升級後,token 讀取成功,無重登
  驗證:iOS E2E auth test pass;Android E2E test pass
  預估:M(1 人 × 4 小時)

Task 3:加入回歸測試
  驗收:CI 包含一個測試案例,模擬 Keychain migration,
        在邏輯被改壞時會失敗
  驗證:故意引入 regression,確認測試失敗
  預估:M(1 人 × 3 小時)

Task 4:Staged rollout 計畫
  驗收:rollout plan 文件,含回滾條件和監控指標
  驗證:PM + 工程 lead review
  預估:S(0.5 小時)

結果:問題的形狀改變了多少

環節後問題的描述
初始需求「登入體驗不好,改一下」(無邊界、無指標、無根因)
Intent Extraction 後「iOS 用戶週活中有重複強制重登,iOS 更新後惡化」(有用戶、有信號、有範圍)
Problem Framing 後「iOS major version 升級改變 Keychain 存取政策,導致 refresh token 讀取失敗」(有根因、可測試)
Spec 後可量測的驗收標準 + 明確假設清單 + 邊界定義
Tasks 後4 個有驗收標準的具體任務,總估時 9.5 小時

如果跳過前三步直接開工,很可能花在「優化密碼輸入 UI」或「加入 Social Login」上,解掉一個不存在的問題。

延伸