《代碼之殤》節選之Bug報告

爲什麼大家就不能寫一份像樣的Bug報告?不是說像樣的報告就比蹩腳的報告冗長或者更難寫,也不是說在Bug報告中爲每個事物做個確切的定義是不可能的。呵呵,團隊間的那些定義確實不同而且還互相矛盾。那在Bug報告中什麼纔是最確切的定義呢?我希望聽到你的回答。

作者注:軟件的每一小部分都會有成千上萬的Bug,這取決於它的規模與複雜程度。有些Bug並無大礙,像“我希望關閉按鈕更大一點。”有些Bug則是誤解了,像“我不能爲我的遊戲匿稱起個下作的名字。”但有些Bug就是討厭的臭蟲,無論如何都必須加以改進,像泄漏用戶信息。因爲Bug往往是開發團隊的局外人發現的,必須等到所有問題修正爲止,Bug報告才告完結——通常使用工作項目跟蹤數據庫,像Product Studio(微軟經典的開發工具)或者Team Foundation Server。


Bug剖析

  • 所有的Bug報告有以下的基本要求:
  • 標題。要簡略。
  • 指派。誰來處理這個問題。
  • 重現步驟。問題再次出現的相關步驟。
  • 優先級別。問題的緊迫性與重要性。
  • 嚴重程度。問題所產生的後果。
  • 解決方案。怎麼解決問題。

其他很多方面對修復問題及明白其深層次原因也很有幫助,但以上基本準則簡練得多。下面我們來對每條準則逐一展開討論,消除這些疑惑。

標題及指派

標題應該簡明扼要,一句話就詳盡說明問題的唯一性,使Bug報告的檢索及標識變得簡單。“點擊取消按鈕,屏幕就清空了”是個差勁的標題。“關閉編輯框,清空屏幕”就是個很好的標題。後者簡短得多,而且對問題的出處及發生時間提供了具體的信息。

當你要創建一份新的Bug報告時,你必須指定具體人選來解決其中問題。但是,即使你這個團隊的每個人都很瞭解,你也不應該將一個Bug指定給其中某一位,除非你是開發團隊的一員。相反,你應該將此任務交給這整個團隊。通常的做法是在Bug報告中指定責任方或團隊作爲默認選擇。默認的選擇通常是“主導”或“會診”團隊。不會再有更好的了。要相信這些團隊,他們會知道問題由誰來解決。

作者注:有些團隊希望將所有Bug都指派給團隊中的某些個人,這樣可保證沒有Bug被遺漏。但是,他們還是必須確認將Bug指派給“主導”或“會診”團隊以確保Bug未被遺漏。畢竟,團隊外部人員並不知道軟件還有其他什麼功能。

作爲慣例,所有Bug必須指派給能對其進行經常性檢查的個人或團隊。因爲,大多數優先團隊會每天開例會,我還是偏好將Bug指定給“主導”或“會診”團隊爲默認選擇。

重現步驟

沒什麼比一份Bug報告沒有清晰的重現步驟更讓人鬱悶了。就像你的親友對你說:“你知道該怎麼辦!”,沒有給你更多解釋。這讓我很茫然,不知道怎麼辦。悲催了。

Bug重現步驟應是言簡意賅——一言中的。同時要包含軟件創建編號(通常是單獨列出的),你的工作環境(操作系統版本、所用瀏覽器及其他相關的細節)以及一些先備條件(像先註冊個Xboxcom金牌賬號等)。

有時你不能確定Bug是怎麼發生的,因爲它有時是間歇性的或跟某種特定的狀態相關。這種情況下,列出創建編號、運行環境及配置等信息,接着描述下當時的情況,以說明具體的Bug重現步驟無法確定。

作者注:我們有些內部工具,如Watson與Autobug,它們可以自動生成Bug報告。誠然,用這些工具生成Bug重現步驟有其侷限性,但是它們通常仍可以提供些堆棧跟蹤信息、創建編號、環境及其他相關的信息,且它們對隔離問題有幫助。


在簡潔的Bug重現描述後,你必須指出什麼是你希望發生的(“期望”),及事實發生了什麼(“事實”)。所有的重現步驟包括這三方面——配置、期望結果及實際結果。這樣當別人在看這份Bug報告時就知道到底哪裏出錯了及怎麼重現它。

通常一張圖、一段視頻頂上千句文字,有很多工具可以對屏幕進行圖片及視頻抓取。將這些文件附到Bug報告中,這些文件就是一份能妥善修復Bug的報告與含糊不清的報告之間的區別。

作者注:如果一個問題可以用4個步驟講清楚而你在Bug報告裏卻用了15個步驟,這是讓人相當惱火的。不僅僅是因爲4步很簡單,容易理解,而且這樣可以使開發者及測試者快速找到Bug。重現Bug用的時間越少,在確認Bug的原因上所花時間也越少(可能出現Bug的步驟少了),同樣在確認Bug已被修復上所用的時間也越少。

優先級別

對於優先級別意義的討論一直沒完沒了,這種級別的範圍值通常爲0~3。說實在的,你可以把時間更好地用到其他地方去。這裏還是說些簡單的準則,以此爲基礎闡明優先級別。

  • 優先級別一旦設定則不宜再改,除非Bug本身角色變換了。如果級別1意味着:“在目前的衝刺階段或里程碑期間修復”,級別2意味着:“到下一個衝刺階段或里程碑期間再修復,”那麼在每個衝刺結束時,你必須更新Bug的優先級別,這樣不僅很浪費時間,而且改變了Bug的“最後一次變更時間”,這會喪失很多重要信息。
  • 優先級別必須容易指定並區分。你不會想讓你的團隊花大量的時間爭論每一個Bug的優先級別吧。它必須是顯而易見的,不管是在寫Bug報告或讀Bug報告的時候。
  • 優先級別必須易記且易操作。人們不需要問:“下一個Pri 2是什麼?”,人們也不需要問哪種級別需要做什麼。

基於以上三條準則,一般普遍接受以下優先級別的定義。

優先級別
描述
修復時間點
Pri 0 一個需引起嚴重關注的致命錯誤。不存在變通辦法,是一個不可逾越的Bug 只有解決了這個問題或找到了變通辦法,你才能安心
Pri 1 一個需引起嚴重關注的致命錯誤 必須在當前的衝刺階段或里程碑期間解決
Pri 2 一個嚴重的錯誤 必須在產品發佈前解決
Pri 3 一般性錯誤或建議 最好在產品發佈前解決
Pri 0通常有礙測試、部署或其他對時間敏感的工作。你必須給開發者或團隊發郵件並電話告知他們,或者直接過去跟他們談,直到有人解決這個問題。如果有變通辦法,Pri 0就必須改成Pri 1。

作者注:確實有開發團隊對優先級別有非常多的定義。有的從Pri 1開始,而不是Pri 0;有的不遵從我在本章開始時列出的準則,或者在一個單獨的區域提示Bug信息。
如果你查看另一個團隊的工作項目數據庫,確定你使用的是他們的定義。這些定義通常顯示在工具提示上或幫助窗口中。

嚴重程度

嚴重程度比優先級別簡單得多,但是它還是經常被搞混。嚴重程度指的是問題所產生的影響範圍,不關乎“有多麼嚴重”這樣的問題。其定義是:

  • 嚴重程度1。某問題引起系統崩潰或客戶數據丟失。
  • 嚴重程度2。某問題引起的故障阻斷了後續操作。
  • 嚴重程度3。某問題引起操作不便或界面顯示不完整。
注意,嚴重程度與優先級別是相互獨立的——換句話說,嚴重程度與優先級別毫無關係。優先級別1的Bug比級別2的Bug更重要,不管其嚴重程度如何。顯示一些不合適的內容就是嚴重程度3但也可能是優先級別1;系統崩潰後用戶強行重啓就是嚴重程度1同時也可能是優先級別3。工程師聲稱一個未致系統崩潰的Bug的嚴重程度是1,因爲嚴重程度很高。你完全沒必要成爲他戲弄的笑料。如果你這樣就白癡了。

解決方案

Bug報告中最重要且經常被混淆的部分是“解決方案”——說明如何解決問題。解決了一個Bug意味着你不再關心這個問題。當Bug的發現者確認這個方案能修復這個Bug時,你也不打算再作更多的處理。
在你發佈產品前,如果對一個問題需要做更多的處理,即使這不是你的團隊的責任,那這個Bug還是要引起關注,並指定你團隊裏的一個人繼續跟蹤相關事宜。

以下是解決方案部分可能包含的內容,按字母排序:

  • 意圖。Bug報告描述了所需處理的細節,按預先意圖進行。
  • 重複。這個Bug與報告中先前指出的Bug有相同的起因及非常相似的用戶體驗。不要像分析一箇舊Bug一樣分析新Bug——不管這個新的Bug報告看起來會多精美,除非你想與Bug發現人爲敵並喪失“首先發現Bug”的機會。
  • 外部性。一個Bug是由你控制能力之外的原因引起的,則你可以在Bug未修復之前發佈產品。如果你團隊之外的人沒有修復這個問題,使你的產品發佈不了,那麼保持對這個Bug的關注並指定你團隊裏的某人進行跟蹤,找到其他團隊中存在的問題。
  • 已修復。Bug修復了。這是我最喜愛的解決方案。
  • 不再發生。你不能讓Bug在之前說過的創建版本及環境中再次發生。聲稱“在我的機子上運行沒什麼問題”並不代表Bug解除了——隨時與Bug發現人保持溝通。
  • 延期。你不想在這個版本中修復Bug。延期是偷懶者的藉口,他們總說明天我會寫個測試單元。真正的工程師會時刻關注這個Bug並會在Bug報告裏留出一個“等待修復”專區來指出下一個改進版本,只要他們真的想修復這個問題。
  • 不修復。你不再修復Bug。這是我第二種得意的解決方法——這說明你有豐富的經驗判知哪些Bug不需要修復。通常是因爲修復本身會帶來比Bug更多的問題。
當你在解決一個Bug時,你必須在解決方案中有段描述。這段描述是很重要的。這樣可使解決方案少些爭論,Bug重現時就更易理解,使你與你的公司免於因爲這個問題成了公衆熱議的話題。這在我之前的一個團隊中曾發生過——我們使這個公司免於千夫所指,因爲我們的解決方案中對一個出現不合適內容的Bug作了描述,以說明我們並非蓄意而爲。

當一個Bug被解決,它將被自行指派給發現它的人。如果這個人不是開發團隊的人員,那這個Bug必須指定給另一個團隊中的人,這個人可以跟Bug發現者覈實解決方案。但你不能總是指望團隊外部的人能及時周到地確認解決方案。當然,如果這個解決方案不怎麼令人滿意,那麼這個Bug應被重新激活。

作者注:我第一次爲我的團隊制定解決方案是在10年前。回顧之前的郵件,以上定義至今仍然有效。

過猶不及

Bug報告中還有很多其他區域。我說過用“創建”及“環境”兩個區域記錄Bug相關信息以及用“等待修復”區域來說明什麼時候處理Bug。還有一些區域用來跟蹤記錄底層原因,這個Bug是怎麼被發現的,Bug是在產品或服務的哪個方面發生的,潛在的安全威脅以及其他信息。

設定好Bug報告的必要條件,少則缺,多則無益。要求太多人們會怨聲四起而拒絕完成Bug報告——兩種極端都會對你及你的客戶不利。

Bug報告要易寫且易讀,這樣會促使他們在發現問題的時候制定清晰的Bug報告。使用一些Bug模板對於一些內容的編寫是很有幫助的。對於我們在乎的工程師及客戶來說,規範的Bug報告使一個問題在用戶發現前消滅於萌芽狀態,沒有比這更好的禮物了。

作者Eric Brechner,微軟公司“卓越開發”部門的總監,在軟件行業已經積累了20多年的經驗。他從2001年開始寫“HardCode”欄目,作爲一種資源 提供給微軟的員工。自那以後,其觀點欄目在微軟內部成千上萬的軟件開發者之間,激起了無休無止的關於最佳實踐的討論——如今。這些觀點走出了微軟,走向了 整個開發社區。

本文選自《代碼之殤》,Eric Brechner 著,林鋒譯,由機械工業出版社出版。
發佈了30 篇原創文章 · 獲贊 11 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章