實習第一個月,有人問我一個功能測完了沒。
我說還沒,我還在把每一種情況都試一遍。
那句話本身就是問題。
拿一個輸入框來算。空白、一個字、一千個字、表情符號、全形空格、貼上帶換行的段落、打到一半切到背景再切回來、送出的瞬間網路斷掉。
這只是一個欄位。
一個畫面上有五個欄位、三個按鈕、兩種登入狀態、四種網路情況。把它們的組合乘開,幾千種起跳。而那還只是一個畫面。
窮舉在物理上做不到。
我那時候不知道。我以為做不完的原因是我不夠快。
以前在北護讀資管系,想到統計學有一個入門的比喻,愣了一下,那講的就是我每天在幹的事。
你煮了一鍋湯。你不會整鍋喝完才判斷鹹淡。你通常會先攪一攪,舀一小匙,嘗。
那一小匙不是整鍋湯。但只要你攪得夠勻、舀的位置有代表性,舌頭嘗到的口感、鹹度,這些證據足以支撐一個夠用的判斷。
統計有一組現成的詞在講這件事:母體是你想了解的全部,樣本是你實際取到的那一小部分,代表性決定你能不能從樣本推回母體。
軟體的所有可能狀態是母體。你執行測試案例得到的實際結果是樣本。
你從來不在窮舉。你一直在抽樣,而且一直在做推論。
如果這是抽樣,那「我測完了嗎」就是個問錯的問題。母體不可窮盡,永遠沒有「完」。
該問的是:我這幾匙,取得夠不夠有代表性?
這個轉換有幾個實際的後果。
覆蓋率不等於信心。 一鍋湯的表面舀滿一百匙,你還是不知道底下沉澱了什麼。一百個案例全部壓在同一條主流程上,跟三十個案例散落在不同風險區,後者給你的信心高得多。
你開始需要知道哪裡可能不一樣。 攪湯是為了讓樣本有代表性,此刻你知道湯頭太淡,你會再撒點鹽巴;在軟體裡,對應的動作是搞清楚這一版動了什麼、哪些是新的、哪些地方過去反覆出事。少了這些,你只是在同一個位置重複下勺。
Day 3 那個資訊落差之所以要命,就在這裡。它直接決定你取得到哪裡。
測不完不是你的問題,取樣偏誤才是。 我實習的時候為「做不完」焦慮。現在我認為該焦慮的是另一件事:做完了,但全部集中在無關緊要的角落。
再往下推一層,麻煩不只在軟體這一邊。
軟體本身不可窮盡。 它有沒人預料到的行為,狀態列不完。
人對軟體的期待也不完整。 規格不會寫全,PM 跟 RD 想得到的情境有限。這正是 Day 6 我在動手測試之前追問規格漏洞時撞到的東西。
真實的使用更超出設想。 使用者一定會做出沒有人想過的事。
測試站在這三者中間。它不負責證明軟體是對的——它負責把這三邊的落差顯影出來,交給有權力的人去決定要不要放行。
這句話我實習的時候聽不懂。現在我認為它是這份工作最準確的描述。
卡在「我到底測完了沒」的時候,換一個問題:
我這幾匙取在哪裡?為什麼取在那裡?
答得出第二句,你手上就是一份說得出理由的測試範圍。
明天聊:時間只剩十分鐘的時候,怎麼決定取在哪裡。