# 十一、難伺候的故障修復
TRS-80 Level-I BASIC只能儲存兩個字符串變量姊和郎.同樣的我腦袋里天生就 只夠放兩只程序臭蟲(bug).不管何時我只能記住兩只臭蟲.如果你要我記住第 三只,先前的某一只,就會自然而然的被遺忘在荒煙漫草的回憶中。
擁有記錄問題的數據庫是優秀軟件團隊的標記之一.事實上只有極少數團隊有 實際進行,這一點一直令我很驚訝.程序人員似乎全都自認能用腦袋或立可貼 記住所有錯誤,這件事實在錯得離譜.
如果你能專心聽一下,我想要延續我前幾篇文章無痛時程表和無痛規格的精神, 說明一種能無痛地進行錯誤追蹤的方法.
首先你需要一個真正的數據庫.如果是兩人一組在周末程序課上寫些小程序, 拿文本文件當數據庫大概還可以.不過只要規模再大一點就要用真正的錯誤追 蹤數據庫.市面上有無數的錯誤追蹤數據庫隨你選買.(厚臉皮自我推銷一下:
我們在Fog Creek Software也寫了一套,名為FogBUGZ.要我來形容的話,這是個功能強大而且使用簡單的網頁型產品.)
為了示范作用,讓我們跟著臭蟲走走,看著它從出生一直到某人讓它解脫為止 的生活.我們將要跟著大名鼎鼎的1203號臭蟲.下面是錯誤數據庫對這只蟲的敘述:
```
1203
Bee Flogger 2.0 FTP客戶端
上傳檔案會導致FTP服務器傾印核心(dump core)
已關閉
結束(已解決-已修正)
2 -必須修正
2.0 Alpha Build 2019
Jill 的 iMac, Mac OS 9.0, 128M RAM, 1024x768 millions of colors
11/1/2000由超級測試員Jill發現
* 啟動Bee Flogger
*建立一個未命名檔案,內容只有一個"a"字 *點工具欄上的FTP鈕 *嘗試用ftp傳至你的服務器
錯誤:觀察;ftp服務器停止響應.輸入ps-augx顯示ftp服務器 甚至停止執行而且根目錄有核心傾印.
預期:不應當掉
11/1 /2000由Jill超級測試員指派給指派給開發主管Willie
11/2/2000 (昨天)已解決-開發主管不予修正
不是我們的程序,Jill,那只是Linux所附的proftpd.
11/2/2000 (昨天)已由超級測試員Jill重新啟動(指派給開 發主管Willie)
這不對勁.我用一般ftp客戶端聯機都不會讓proftpd當掉.可是 用我們的程序每次都會當.Ftp服務器不會自己"當"掉.
11/3/2000 (今天)己由開發主管Willie指派給裎序人貝 Mikey
,你能不能看一下這個問題?你的客戶端程序可能有毛病.
11/3/2000 (Today)已解決-已由裎序人員Mikey修正
我想我把密碼錯傳成用戶名稱或其他東西了...
11/3/2000 (今天)己由超級測試員Jill重新啟動(指派給程 序人貝Mikey)
Build 2021還是有這個問題.
11/3/2000 (今天)已由裎序人員Mikey編輯
呃.這蠻奇怪的.讓我來抓這個錯.
11/3/2000 (今天)己由裎序人員Mikey編輯
我想應該是MikeyStrCpy()的問題...
11/3/2000 (今天)己解決-己由裎序人員Mikey修正
啊!
終于修好了丨
11/3/2000 (今天)已由超級測試員Jill關閉
build 2022顯然修好了,所以我把這個問題關閉了.
```
以下是實際發生的事情.
程序員Mikey正為他的麥金塔軟件寫新的FTP用戶功能.寫到一半時由于覺得不 爽,就寫了自己的字符串復制函數.想藉此教訓教訓公司里那些強迫要重復使用 程序代碼的家伙!哇哈哈!
Mikey,當你不重新使用程序代碼時就會出事.而現在所出的事就是Mikey忘記把復制好的字符串加零字符作結尾.不過他一直都沒有注意到這個問題,因為 大部份情況下,剛好都是把字符串復制到已先清成零的內存里.
同一周稍后超級測試員Jiii正在猛操那個程序,她把額頭頂在鍵盤上滾來滾去 或進行某些同等嚴荷的測試.(恰巧的是大多數優秀的測試員都叫做Jill或 Gillian等等.)突然間發生了非常奇怪的事情:她測試用的ftp服務器當掉了. 不要懷疑,我知道這是臺Linux機器而Linux機器是不會當的(slashdot的人拜托 不要噓我).不過這個該死的東西就是當了.而她根本沒有動過服務器,她只不 過用Mikey的Mac程序把檔案FTP上去而已.
現在呢,由于Jill是個超級優秀的測試員,所以她會小心地把所做過的事記下 來了(比如在實驗手冊上精確記錄頭在鍵盤上滾動的方位).她找一臺干凈的機 器從頭開始重復每個步驟,看吧,又發生了!Linux的ftp daemon又當了!這么 一來一天內就發生兩次了! Linus(譯注:創造Linux的人)注意啦.
Jill斜眼看看重現步驟清單.總共大約有20個步驟.其中有幾個似乎與問題無關. 做了一點實驗后,Jill已經能把問題縮減到四個步驟,而且每次都能產生相同 的結果.現在她已經準備好把問題發出來了.
Jill在問題追蹤數據庫中輸入新錯誤.這里光是輸入錯誤的動作就是有學問的: 有好的錯誤報告也有不好的錯誤報告.
## 優良錯誤報告必備的三元素
> 然后主說話了,祂說”你要先取出圣撞針.然后你要數到三,不多,不少.三是你要數的數而要數 的數就是三.四不是要數的數,二也不是,除非接下來要數到三.五完成不行.當數到第三個數字 三時,就把你的安提阿金手榴彈投向你的敵人,那些在我眼中極其下流的人,他們必須承受”
> –圣杯傳奇
寫一份優良錯誤報告的規則很好記.每個好的錯誤報告都要有剛好三個東西.
1. 重現的步驟,
2. 期望看到的,以及
3. 實際所看到的.
看起來很簡單,對不對?可能沒那么容易,身為程序員,別人丟給我的問題總 會缺一兩點.
如果你沒告訴我要怎樣重現問題,我可能根本不知道你講的是什么.”程序當了 而且在桌面留下一個臭臭的大便狀物體.”講得很好,寶貝.不過除非你告訴我 你做了些什么,否則我是什么事都不會做的.現在我得承認有兩種情況是很難 找出重現步驟的.有時候是根本不記得或只是在轉述〃田野〃中(field,譯注:指 實驗室以外的環境)的錯誤.(順便提一下,為什么他們要稱之為〃田野〃呢?是不 是像黑麥田或其他作物呢?不管了…)還有另一個可以不提供重現步驟的場合, 就是問題時有時無并非一直出現,不過你還是應該提供重現步驟,再加個小附 注標明問題不是時常出現.在這些場合下要找到問題實在是很難,不過我們還是可以試試.
如果你不指明你期望看到的,我可能不明白它為什么是個問題.開機畫面上有 血跡.那又怎樣?我寫這段程序時割到手指啦.你希望看到什么?啊,你說規格 上說沒有血跡!現在我搞懂你為什么說它是個問題了.
第三部份.你實際上看到什么.如果你不告訴我這一點,我不會知道問題是什么. 這是理所當然的.
## 回到我們的故事
Anyhoo. Jill把錯誤輸進走了.在良好的錯誤追蹤系統中,錯誤會自動分派給該 項目的開發主管.這里隱藏了第二個概念:每個錯誤隨時都要有一個人負責, 一直到錯誤關閉為止.錯誤就像是個燙手山芋:當拿到燙手山芋時,你就得負 責把它解決掉,或是把它丟給別人.
程序主管Willie看看這個錯誤,認為這個可能與ftp服務器有關,所以就以”不 予修正〃把它處理掉.畢竟他們并沒有寫那個ftp服務器.
問題被處理掉之后就會分派回開啟的人身上.這可是個重點.不是程序人員認為 沒事就真的沒事了.鐵律是只有開啟錯誤的人才能關閉錯誤.程序人員可以解決 問題,意思是”嗨,我覺得弄好了 “,不過要實際關閉錯誤并把它從清單中拿掉, 最初開啟的人必須確認問題真的已被修好,或是同意該問題基于某于原因不必 修正.
Jill收到一封電子郵件通知她問題回來了.她看看信里開發主管Willie的說明. 有些東西不太對勁.這套ftp服務器大家用好幾年了都沒有當.只有用Mikey的程 序才會當.所以Jill重新啟動該問題并說明她的想法,所以問題又回到Willie 身上.這次Willie把問題指派給Mikey修正.
Mikey看看這個錯誤,認真的想了很久,結果完全誤診了這個問題.他修正了其 他完全不相干的錯,然后就說把Jill開啟的問題解決掉了.
問題回到Jill身上,這次標示為〃已解決-已修正Jill拿最新版軟件試了她 的重現步驟,看著看著Linux服務器就當了.她又重新開啟問題并且直接指派回給Mikey.
Mikey被難到了,不過最后還是找到了錯誤的根源.(知道是什么了嗎?我要把它 當作給讀者的作業.線索可是給足了!)他把問題修好后測一測,然后–找到了! 照重現步驟去做不會再讓ftp服務器當掉了.他再一次標示〃已修正〃把問題解決 掉.Jill也試了重現步驟,發現問題的確修好了,所以就把它關掉.
## 錯誤追蹤的十大建議
1. 好的測試員一定會試著把重現步驟減到最少步;這對必須追出問題的程 序人員來說極為有用.
2. 要記住只有一開始開啟的人才能關閉該錯誤.其他人可以解決問題,不 過只要最初看到錯誤的人可以真正確認所看到的錯誤已被修正.
3. 要解決錯誤有很多種方法.FogBUGZ中可用的解決方法有fixed(已修正), won’t fix(不予修正),postponed(暫緩),not「ep「o(無法重現)duplicate(重復的問題),〇「by design(設計限制).
4. Not Repro表示沒有人能重現該錯誤.程序人員在錯誤報告漏寫重現步驟 時常常會用這一項.
5. 你需要小心追蹤程序版本.每次發給測試員的軟件都應該有個編譯ID編 號,這樣可憐的測試員才不必在根本尚未修正的版本上測試同一個問題.
6. 如果你是個程序員,而且想盡辦法都無法讓測試員使用問題數據庫,只 要不接受用其他方法寫的錯誤報告就可以了.如果測試員習慣用電子郵件 送錯誤報告給你,你就把信退回去并加上以下簡短訊息:”請把它放進問 題數據庫中.我沒法子追蹤電子郵件
7. 如果你是個測試員,而且想盡辦法都無法讓程序人員使用問題數據庫, 只要停止向他們報告錯誤就好了-把錯誤直接放在數據庫里并讓數據 庫發信通知.
8. 如果你是個程序員,而且只有部份同事在用問題數據庫,只要開始在數 據庫里把錯誤分派給他們.最后他們自然會明白的.
9. 如果你是個經理,而且似乎沒人在用你花大筆費用安裝的問題數據庫,那就開始利用它把新功能分派給大家.因為問題數據庫也是個很好的”未 完成功能〃數據庫.
10. 要避開在問題數據庫里增加新字段的誘惑.每個月總會有人想出個要在 數據庫里新增字段的好點子.什么聰明的點子都有,比如追蹤發現問題 的檔案;追蹤有多少比例的問題是可重現的;追蹤某錯誤發生的次數; 追蹤某問題發生時機器上某個DLL的版本.不要屈服在這些點子之下,這 一點非常重要.如果你屈服了,輸入新錯誤的畫面最后會出現上千個字 段要輸入,結果是沒有人會想輸入錯誤報告.要讓問題數據庫有效運作, 一定得讓大家都用,如果〃正式〃輸入錯誤太麻煩,大家就會繞過錯誤數 據庫.
只要你在寫程序(只有一個人寫也一樣),如果沒有一套良好的數據庫列出程序 中所有的問題,一定會產生質量低劣的程序代碼.良好的軟件團隊不只會廣泛 使用問題數據庫,其中成員還會習慣用問題數據庫產生待辦事項列表,并把瀏 覽器首頁設成會列出所分派到的工作,還會開始祈禱他們能把問題指派給辦公 室經理,叫他進多點山露汽水(Mountain Dew,譯注:百事可樂的著名飲料).
Fog Creek Software制作了 一套易用的問題追蹤軟件,名為FogBUGZ.
- 第一部分 位與字節:編程實踐點滴
- 一、語言的選擇
- 二、深入底層
- 三、joel測試:改進代碼的12個步驟
- 四、每一位軟件開發人員必須、絕對要至少具備UNICODE 與字符集知識(沒有任何例外!)
- 五、輕松寫就功能規格說明書 - 第1節:為什么煩心?
- 六、輕松寫就功能規格說明書 - 第2節:什么是規格說明書?
- 七、輕松寫就功能規格說明書 - 第3節:但是……如何?
- 八、輕松寫就功能規格說明書 - 第4節:技巧
- 九、輕松制訂軟件進度表
- 十、每日連編是朋友
- 十一、難伺候的故障修復
- 十二、軟件開發中的5個世界
- 十三、稿紙原型開發
- 十四、不要被太空架構師所嚇倒
- 十五、開火與運動
- 十六、人員技能
- 十七、源于計算機學科的三個錯誤思想
- 十八、二元文化
- 十九、自動獲取用戶故障報表
- 第二部分 開發人員的管理
- 二十、面試游擊指南
- 二十一、重金激勵害多利少
- 二十、二不配備測試人員的五個首要(錯誤)原因
- 二十三、任務換人有害無益
- 二十四、絕不去做的事情,第一部
- 二十五、冰川下的秘密
- 二十六、漏洞抽象定律
- 二十七、程序設計界的LordPalmerston
- 二十八、評測
- 第三部分 Joel對常態問題的遐想
- 二十九、RickChapman解讀愚昧
- 三十、在這個國家狗是干什么的? 我們有多么天真?
- 三十一、作為哼哈二將,只管去做事
- 三十二、兩個故事
- 三十三、巨無霸麥當勞與天才廚師JamieOliver
- 三十四、沒有什么像IT看起來那么簡單
- 三十五、提防非自主開發綜合癥
- 三十六、策略I:BEN&JERRY公司與AMAZON
- 三十七、策略II:雞與蛋問題
- 三十八、策略III:讓我回去!
- 三十九、策略IV:大件與80/20神話
- 四十、策略V:公開源代碼的經濟因素
- 四十一、墨菲法則肆掠的禮拜
- 四十二、微軟公司是如何敗北API之戰的
- 第四部分 對.NET稍多的評說
- 四十三、微軟精神失常了
- 四十四、我們的.NET對策
- 四十五、請問,我可以使用連接程序嗎