2011年7月13日 星期三

完成90%的程式長什麼樣子?一個軟體估算(Estimate)的思考

軟體的點子容易想,可是如果有人問你要花多少錢才做得出來?這可就難了,多少錢?換句話說就是多少人?多長時間?的問題。
如果你是個軟體的專案經理或是程式經理,你一定聽過程式設計師說過這句話:這個月底系統就可以完成90%!
當寫程式的人說「90%完成」時,這代表什麼意思呢?說這話的人自己知道是什麼意思嗎?
這是我今天想要跟大家分享的軟體專案管理思維。

愛說謊的軟體專案經理
如果你今天的工作是預估與控制何時軟體專案可以完成,那你一定是公司裡公信力最差的一個,如果不是的話,那你大概是作弊,在不延遲時間如期交件的情況下,不加人或錢(資源),那你一定是犧牲系統的功能或品質。這個玩笑還是有憑有據的,根據一項 統計
  • 40% 的專案如期完成,222% 超出計劃時間
  • 189% 的專案超出原先的預算
  • 70% 的專案交出縮小版(說得多,做得少)
  • 30% 的專案腹死腹中
我要在此為專案經理說句公道話,其實他們並沒有「說謊」,他們處在一個「不管不行,越管越糟」的兩難,不管的話,軟體專案像黑洞一樣,不知道何時完成;管的話,開始要求程式設計師填報表,馬上引起怨言,生產力下降,取得的數字也不見得可靠。如何在其中找到平衡點?這是我想引發大家思考的問題。


軟體開發的本質
Armour 有一系列論文在2000年10月開始發表:The Five Orders of Ignorance by Philip G. Armour in the Communications of the ACM. 他認為
"軟體開發的過程就是知識取得的過程"
,因此如果可以從排除「無知」的角度著手,那就可以比較容易控制軟體專案的進行,讓我解釋一下「無知」這兩個字,原文是 Ignorance 意思是指缺乏知識的狀態,是沒有意識到或主觀地忽略資訊。Armour用「亂湊」(原文Hacking)來解釋這個過程,如果一開始你沒有意思去取得知識,只是亂湊一些程式,等你把程式寫好了你是不是要跑一下,才知道程式寫得對不對?哈!這個判斷對不對的動作就是「知」,如果你要辯說不知道怎樣才是正確結果,那麼知道「不知道」也算是「知」的一部份,用孔子的話說:「知之為知之,不知為不知,是知也。」如果你是個早已放棄國文一科的程式設計師,改用C#可以寫成:
var knowing = whatYouKnow + whatYouDoNotKnow;
五級無知及解決辦法
同意了Armour的知識辯證以後,軟體專案管理就可以簡化成消除「無知」的過程了,接著他把無知的程度與理由分成以下幾個等級,從0開始:
  • 0OI (Lack of Ignorance)
  • 1OI (Lack of Knowledge)
  • 2OI (Lack of Awareness)
  • 3OI (Lack of Process)
  • 4OI
OI 是 Order of Ignorance 的簡稱,0OI是最佳狀態,缺乏無知就是知,用白話來說就是知道問題也知道答案,這聽起來像是繞口令一樣了,讓我用白板圖來說明一下:
IMG_0582
左上角知道問題也知道答案是 0OI 的狀態,這是可驗證的,比如說我會開車我可以開給你看來證明;
然後是知道問題不知道答案的右上角,稱為 1OI,例如說我不會彈鋼琴,需要去上課就可以學會了,這中間的差別是知識;
右下角的 2OI  就是自己沒有意識到自己的無知,這是一般專案管理最頭痛的問題,如果你不知道問題在那,那要怎麼解決呢?「90%完成」就屬於這個狀態,並不是程式設計人員刻意要說謊,而是他本身並沒有辦法意識到程式的完成進度,所以剩下的10%可能要花另外90%的時間,誰曉得呢?
3OI 是連這四個格子都劃不出來的無知混沌狀態,一般來說所有的軟體工程方法論是經過「建立程序的方式」把 3OI 帶到 2OI,然後再運用認知去轉化為可處理的0OI與1OI。從這裡你可以了解到:
方法論給你的是一個架構,讓你有系統地問問題,找出自己的無知來脫離2OI;
方法論並沒有辦法給你答案。
至於不知問題可以知道答案的部份,我把它歸到神秘學的領域,不在此討論。
第五級無知是4OI,是指不知道這個概念的人,各位讀者讀到此處算是已經擺脫了這種無知。

程式只是知識的載具
「它傻瓜,你聰明!」這是一個有名的傻瓜相機廣告台詞,意思是工具與人之間的配合,軟體的開發當然不是像誰聰明誰笨這麼簡單,好的工具加上好的團隊可以說是如虎添翼,你也可以爭辯說好的軟體團隊不一定要好的工具也可以開發出好的軟體,當然有好的工具可以讓整個過程變得更有效率,再換個角度來看,有好的開發工具也不一定保證你能做得出好的軟體… 所以下次你在選擇開發工具的系統時,請先想想自己的團隊是處於那一級的無知狀態,然後再挑選一個會幫你問對問題的工具才是重點,所以與其問完成百分比,不如問:從報表裡顯示的那5個bug你需要多久能簽入?QA跑自動測試要多久時間才能完成驗證?
雖然天有不測風雲,可是更令人氣憤的不外乎是敗在自己的無知,我想用 Armour 的一句話來結束今天的分享:
你寫下的是知識,程式只是取得知識過程中的副產品。

沒有留言:

張貼留言