如何從敏捷到精益地修復bug與解決問題
關于精益的定義有許多,但其中最令我感到鼓舞的是精益企業(yè)研究所主席John Shooke在它的著作《管理精益》中所描述的一段話:精益通過提高員工的水平來保證產(chǎn)品開發(fā)。在這個定義的基礎上,這篇論文接下來解釋了精益是怎樣提高人員的水平的:方法就是解決問題。這一定義揭示了以下管理實踐的美妙之處:仔細設計你的工作,讓你能夠清晰地看見所發(fā)生的問題(以及同時出現(xiàn)的學習機會),并在問題出現(xiàn)后以科學的方式解決。
在與使用敏捷方法進行軟件開發(fā)的團隊共同工作時,我曾經(jīng)有過一些誤解:起初時,我混淆了bug和問題的概念,并且確信敏捷過程就是精益,因為它能夠使bug變得可見。在最后的幾個月里,在我頭腦中的概念開始漸漸清晰起來,回想起當初的情景,我開始相信,我所在的敏捷團隊產(chǎn)生的bug,與精益系統(tǒng)產(chǎn)生的學習機會并不是一回事:后者表明在我的團隊中確實存在著質(zhì)量問題,而在其它許多團隊身上我也看到了同樣的問題。
寫這篇文章的目的,是為了描述我對bug與質(zhì)量問題這一點上的思考方式是怎樣逐漸變化的。這對于讀者更好地理解造成bug產(chǎn)生的質(zhì)量問題,并相應地提高績效能夠起到一些啟示作用。并通過一些真實的故事描述來看清楚真正的問題所在。(先聲明一點:我們并不假設所有的敏捷團隊都對此問題抱有類似的誤解)
什么是bug?
在軟件工業(yè)中,一個bug可以代表任何形式的系統(tǒng)錯誤(NullPointerException、Http 404錯誤代碼或是藍屏……)、功能性錯誤(在我單擊B的時候,系統(tǒng)本應執(zhí)行Z,卻最終執(zhí)行了Y)、性能問題以及配置錯誤等等。
在精益的術語中,一個bug必須能夠按照下一節(jié)提到的定義進行清晰的表達,才能說它是一個問題。請相信我,我所見過的(和自己產(chǎn)生的)bug中,95%以上都不像是某種問題。性能問題或許是個常見的例外情況,但有趣的是,它們都
而在精益團隊中,一個bug并不代表一個問題,xXXX。我所見過的95%以上的bug表面上并不像真正的問題——性能問題或許是個常見的例外情況,但有趣的是,它們也是績效的一部分,不是嗎?
什么是問題?
讓我們在這里做一個標準的定義吧。在《豐田模式:精益模式的實踐》(Toyota Way Field book)這本書中,Jeffrey Liker定義了一個問題所需的四個方面的信息:
當前的實際績效
預期的績效(標準績效或目標績效)
以當前績效和目標績效之差所體現(xiàn)的問題嚴重程度
問題的范圍和特點
正如Brenée Brown在TED所做的一次關于漏洞的演講中所說的一樣,如果你不能評估某個漏洞,那么它就不存在。從更實用的角度來說,如果你不能解釋在績效差距上的問題所在,那么很可能是由于你并沒有花足夠的時間去思考它。
在開始著手解決一個問題之前,重要的一點是要清晰地表達它,花一定時間去理解它(按照精益專家Michael Ballé的說法:要善待它),并且克制住直奔解決方案的沖動。我們都聽說過愛因斯坦的名言:“如果我只有一小時的時間去解決一個問題,我會首先用55分鐘去思考問題,最后用5分鐘去思考解決方案。”沒有人說這是件容易的事。
在軟件開發(fā)敏捷團隊的情境中,績效指標或許是一張燃盡圖(表示工作量與延遲)、bug數(shù)量、系統(tǒng)響應時間(質(zhì)量)、客戶對已提交的用戶故事的評價(以總分10分來表示客戶滿意度),以及每個Sprint提交的用戶故事(或用戶故事總點數(shù))數(shù)量(生產(chǎn)力)。
按照這些指標,可以有以下這些問題存在:
質(zhì)量:這個頁面的響應時間目標是在500ms以內(nèi),而在5000個并發(fā)用戶的情況下,我們測量到的結果是1500ms。
質(zhì)量:在Sprint結束時仍未解決的bug數(shù)量(2個,而不是0個)
工作量/延遲:我們預計這個用戶故事需要3天時間完成,而實際上用了8天才完成
生產(chǎn)力:在Sprint結束時,整個團隊共提交了5個完成的用戶故事,而之前的計劃是完成7個。
客戶滿意度:我們希望每個用戶故事都能夠得到8分以上(滿分10分),而在上個Sprint結束后,有兩個用戶故事的客戶滿意度低于這個分數(shù)(6.5分和7分)。
怎樣從bug中分析問題所在?
Bug的出現(xiàn)往往是系統(tǒng)中產(chǎn)生了更常見問題的一種癥狀,而對于精益團隊來說,將這些癥狀與真正的問題相關聯(lián)起來是至關重要的。可以這么說,正如米開朗基羅從大理石碎片中發(fā)現(xiàn)它的美麗,并最終打造成迷人的雕像一樣,精益團隊的任務(例如某些團隊會將持續(xù)改進作為他們每日工作內(nèi)容的一部分)就是發(fā)揮他們的洞察力,從大量的bug中發(fā)現(xiàn)問題,并將其抽取出來。實現(xiàn)這一點需要進行細致地分析,并將這些原始的問題轉化為學習的機會。
我發(fā)現(xiàn)了一種著手進行這種分析的良好方式,就是將所有bug分門別類,并且理解每個bug類別的權重。大多數(shù)情況下,某個bug類別就體現(xiàn)了造成某個現(xiàn)有問題的原因,或者它本身就是一個問題。這種關聯(lián)性可以幫助你以正確的順序處理這些問題,并首先從對整個操作績效影響最大的問題開始解決。如果你仍然不確定應該從何處著手,那么優(yōu)先解決質(zhì)量問題是比較保險的做法。