《轉載》Reuse the Component (上) |             |   
						我記得小時候要寫數學作業時,如果遇到那種大家都解不出來的問題 
時,通常會有一個高手會先把解法解出來,剩下的人再依樣畫葫蘆, 
照著抄一遍。只要高手沒有寫錯,不會是每個人都錯同樣的地方,老 
師通常不會發現。只是有些時候,有些人抄的時候,把過程給寫錯了 
,卻可以算出正確的答案,就有可能會被老師逮到。 
 
很多人把相同的觀念用到了軟體開發上,特別是在物件導向開發盛行 
之後,很多人通常會希望在開發軟體時,應該有人先開發出一些可以 
共用的物件,然後讓大家可以在不同的場合,不同的時機裡重複使用 
(reuse),經過這樣子產生的綜效,就可以減少重複的工作,並且加 
速開發的流程,提高整個團隊的生產力。 
 
這通常給程式開發人員一個很好的藉口,當他的進度落後時,他只要 
把reuse放在口上,大部分的專案經理都會願意投資一些小小的時間 
與資源,在進行這樣的工作上,特別是這樣有機會讓日後的生產力有 
倍數的成長。 
 
在某次整個開發團隊的status review meeting中,我們聽到這樣的 
對話。 
 
布魯斯(帶著質疑的表情):強森,我從你的status report中可以看到 
                        ,你目前的進度正在落後。你這個禮拜正 
                        在忙什麼? 
                         
強森(有點興奮)        :我這個禮拜正忙著設計跟開發一個可以共用的 
                        component,所以花了不少時間。我想如果一切 
                        順利的話,大概再兩個禮拜就可以完工。所以 
                        整個進度大概目前會比目前的plan晚三個禮拜。 
                        可是如果這個component寫的好的話,我們就可 
                        以馬上發揮它的威力。如果每個人都用我新寫好 
                        的這個comonent的話,我預估可以省下我們一 
                        半的開發時間。我想如果沒有出大問題的話,應 
                        該可以讓大家提早兩個月完成 
 
布魯斯                 :Good job。(面對其他的人) 我常常說,要work  
                         smart,不要work hard。你們要好好跟強森學習。 
                         艾力克斯,你的進度怎麼樣?… 
 
一個月後的status review meeting.... 
 
布魯斯(帶著沒有耐心的表情):強森,你的那個共用的component現在進度怎 
                            麼樣了?你不是說,兩個禮拜就寫完了嗎? 
                            現在都已經一個月了。 
 
強森                      :我目前遇到幾個比較tricky的bug,所以花了不 
                            少時間在找問題,現在還差一些小地方還沒做好 
                            。我想應該再給我一個禮拜應該就沒有問題了。 
                            我想應該還是可以讓我們提早一個月完成 
                            implementation。 
 
布魯斯                    :要注意時間喔,還有quality。Quality是最重要的。 
 
Implementation delay了一個月時的status meeting... 
 
布魯斯(帶著沒有耐心的表情):強森,湯米跟艾力克斯還有潔西卡,都是call 
                            你所寫的那個共用的component,可是每個人都 
                            遇到不一樣的問題。你寫的這個component到底 
                            還有多少bug?到底什麼時候才會穩定下來? 
 
強森                      :我想可能是上次debug時,帶來的side effect。我 
                            想再給我一個禮拜的時間,應該就可以穩定下來了。 
                            不過我想對於日後的專案應該可以有相當大的幫助。 
 
布魯斯                    :不是早告訴過你要注意Quality了嗎?(對著整個team) 
                            Quality是最重要的。我們做什麼事情,都要確保它 
                            的quality… 
 
Implementation delay了三個月之後,強森離開了公司。留下一個勉強可以 
運作的component。在日後的project裡,這個寫好的component從來都沒有 
被reuse過… 
 
當然這裡可以從對話中,發現一個有趣的現象: 
 
- 一般的程式開發人員,非常喜歡使用If then else的描述。而管理人員, 
通常只會聽到他想聽的部分。 
 
我用這句話來做比喻:『如果太陽從西邊出來的話,天上就會掉下來很多很 
多的錢,讓我一輩子也花不完。』 
 
對一個程式設計師來說,這是一個完全make sense的statement。因為程式設 
計師通常都擁有良好的邏輯觀念:『若A則B,如果A的值是false,B的這個 
block當然就run不到』。可是對於老闆來說,他只聽得到『天上會掉下來很 
多很多的錢,讓我一輩子也花不完。…』 
 
所以當強森說:『我想如果一切順利的話,大概再兩個禮拜就可以完工。』 
指的其實是:『如果你運氣好,再給我一個月就會寫好了。這個component 
多有用啊。絕對值得花一個月的時間開發。可是如果你知道要花那麼久,你 
一定不會support這件事。沒關係,預估本來就會有誤差。』要特別注意到 
的是,連他內心的想法,都包含了if then else的架構: 
 
If (你運氣好) then {再給我一個月就會寫好了。}; 
 
component = 非常有用; 
 
非常有用 = 絕對值得花一個月的時間開發; 
 
If (你知道要花那麼久) then {你一定不會support這件事}; 
 
嗯,這就是軟體工程師跟一般人最大的不同。 
 
然而對於布魯斯來說,他只聽到:『花兩個禮拜,就有一個可以讓整個team 
提早兩個月完工的秘密武器,以後還可以reuse,我們以後就會有超高的生產 
效率,可以把對手遠遠拋在後面…這簡直就像是擁有自己的印鈔機一樣嘛。 
就算這個傢伙慢了兩個月,我還是可以從日後整體加速的時間補回來啊。我 
要不要跟吉娜報告這個好消息?因為我卓越的領導,才會有這麼高的生產力 
,表現這麼優秀,今年一定可以領一百張股票…』嗯,這就是老闆跟一般人 
最大的不同。 
 
根據非正式的調查(作者註:可以參考我跟靈犬萊西的訪談紀錄為證),reuse 
通常沒有帶來如同預期的生產力改變。在某些特殊的案例中,太強調要reuse 
還造成了schedule的嚴重落後。我嘗試著歸納出下列原因: 
 
*自以為厲害的程式設計師只想用他自己開發的component。 
 
*開發軟體最花時間的部分,並不是在於寫程式本身。 
 
*低估學習使用component所需要花的時間。 
 
*錯誤的component設計理念,以至於reuse這些component反倒會降低生產力。 
 
*低估開發component的困難程度以及測試component的困難程度。 
 
*開發出來的軟體,回應速度太慢,需要進行大幅度的改寫。 
 
以下我會針對這些原因,進行更詳細的說明。 
 
***自以為厲害的程式設計師只想用他自己開發的component*** 
 
對很多號稱是程式設計師高手的人來說,開發自己的component,比起使用 
別人的component,要來得有成就感多了。使用別人的component,固然可 
以增加批評的樂趣,可是對於這些人來說,帶來的不適可遠大於帶來的便 
利。最主要的原因在於: 
 
-使用別人的component,就像把別人用過的保險套洗一洗,再拿出來用一樣 
,雖然看起來外表沒什麼問題,可是,噁!誰知道裡面藏什麼髒東西? 
 
女性讀者如果沒有用過保險套的經驗,可以想像把別人用過的衛生紙曬乾再 
來reuse…很噁心對不對?覺得很髒對不對?使用別人寫好的component,大 
部分時候,差不多就是這樣的感覺。 
 
對於這些人來說,別人開發的component總是有不夠完美的地方,即使外在的 
介面定義的清清楚楚,使用各式各樣的數據進行測試看起來沒有問題,裡面還 
是可能會暗藏玄機。想想看在試算表的程式裡面,居然可以玩模擬飛行遊戲? 
…別人寫的東西,你如果拿不到原始碼,你永遠不知道到底藏了多少後門跟bug 
在裡面…還是自己來吧。 
 
然而當你寫出自己的component,那故事就完全不一樣了。大部分的人都希 
望自己寫的東西可以造成轟動,讓自己做好的這個小螺絲釘,可以使用在各 
式各樣不同的場合。這很像是看著自己養大的孩子長大成人一樣。即使它不 
成材,你還是認為它可以承擔重要的責任,每次看到有人在用它,就會忍不 
住內心竊喜。當然,總有人不識貨,會低估我們所撰寫程式的一般性與超高 
的彈性。遇到這種狀況,當然得要指責這種不具團隊合作精神的行為。除此 
之外,建立一套一定要使用你開發物件的標準,在把這個文件列入你們公司 
的ISO文件中,就可以強迫使用這個component。對了,如果有誰看到我所寫 
的薪資計算模組,請幫我告訴它,我很想念它。我還是覺得它是最棒的。 
 
因為文人總是相輕,所以要說服其他人使用你所開發出來的component,就 
得要花相當大的力氣。所以很多時候,所謂的reuse,其實都只有自己在reuse 
自己寫過的component。 
 
使用別人的component,是否可以提昇生產力,其實還跟下一個問題有關: 
 
***開發軟體最花時間的部分,並不是在於寫程式本身。*** 
 
共同開發軟體,其實像是把一堆來自歐美非各個大陸,不同國家的人,共同 
聚集起來,用文言文來寫新詩一樣困難。最困難的地方,在於要能夠彼此溝 
通,清楚了解到底要開發什麼,還有要怎麼開發這個東西。觀念的溝通,是 
最花時間的。寫程式本身其實並不是最花時間的部分。即使你看著良好的設 
計文件,你還是需要消化別人的想法,仔細地思考,再轉化成你自己的想法 
,最後才會變成程式。而這個過程,並不是任何共用的component可以加速的。 
 
所以對於生產力的提昇,其實是在一個人已經清楚地知道他要負責撰寫什麼 
樣的程式以後,並且也了解component要怎麼使用以後,才會帶來這樣的效 
益。如果component的引進,可以讓溝通觀念的速度加快,只有在這個時候 
,才會帶來生產力的提昇。不過有關生產力的提昇,事實上還是有極限的。 
 
布魯斯:你們不是擁有共用的component嗎?所以生產力不是已經提昇了50%嗎? 
        你們不是對它越來越熟悉嗎?應該可以越做越快啊。上次寫了三個月的 
        程式,現在應該只要三天就可以寫完了吧,咦,不是嗎? 
 
況且除了溝通以外,我們不可以低估找東西所需要的時間。你需要一個component 
,可是這個component到底在那裡呢?有誰寫過類似的東西呢?如果你運氣不 
好,可能你會花三天的時間去找一個你一個下午就寫好的東西。很多人都會 
選擇自己動手寫,而非找共用的component。所以越簡單的小程式,就會有越 
多人想寫寫看。況且寫寫小東西,本來就是程式設計師在學習一項新把戲時, 
最常做的事情。所以輕量級的component,數量可能最多。累積起來也花掉最 
多開發的時間。 
 
還好一家公司通常都會有幾個超人,可以迅速幫你找到你要的資訊。類似搜 
尋引擎的程式,可能可以幫你一點忙,可是這些程式運作的前提是,必須要 
有人整理過這些資訊。而這個假設的不成立,通常也說明了為什麼要推共用 
的component會相當困難。因為要使用的人,不知道你這裡有好康的東西。 
 
當你找到了這個component,你也了解在你完成你的工作時,會需要用到這個 
component時,這時候所面臨的問題,就被提高到了另一個層次... 
(待續) 
 
 
						
						
						
						 |