Shunze 學園 >同班同學 >佑邦通訊 > 《轉載》獨孤木專欄 之 Reuse the Component 哈囉,還沒有註冊或者登入。請你[註冊|登入]
« 上一篇主題 下一篇主題 » 顯示成列印模式 | 增加到我的最愛
發表新主題 發表回覆
作者
主題
yonkov
班導師


註冊日期: 2003 10
來自: 火星
文章: 51

yonkov 離線
《轉載》獨孤木專欄 之 Reuse the Component引用回覆 編輯/刪除文章 搜尋由  發表的其他文章 回報給版主 IP 位置 回此頁最上方

as Title

2003-10-15, 16:02 yonkov 的個人資料 把 yonkov 加入好友列表 發送Email給 yonkov 瀏覽 yonkov 的網站 MSN : yonkov@mail.com
yonkov
班導師


註冊日期: 2003 10
來自: 火星
文章: 51

yonkov 離線
《轉載》Reuse the Component (上)引用回覆 編輯/刪除文章 搜尋由  發表的其他文章 回報給版主 IP 位置 回此頁最上方

我記得小時候要寫數學作業時,如果遇到那種大家都解不出來的問題
時,通常會有一個高手會先把解法解出來,剩下的人再依樣畫葫蘆,
照著抄一遍。只要高手沒有寫錯,不會是每個人都錯同樣的地方,老
師通常不會發現。只是有些時候,有些人抄的時候,把過程給寫錯了
,卻可以算出正確的答案,就有可能會被老師逮到。

很多人把相同的觀念用到了軟體開發上,特別是在物件導向開發盛行
之後,很多人通常會希望在開發軟體時,應該有人先開發出一些可以
共用的物件,然後讓大家可以在不同的場合,不同的時機裡重複使用
(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時,這時候所面臨的問題,就被提高到了另一個層次...
(待續)

2003-10-15, 16:03 yonkov 的個人資料 把 yonkov 加入好友列表 發送Email給 yonkov 瀏覽 yonkov 的網站 MSN : yonkov@mail.com
yonkov
班導師


註冊日期: 2003 10
來自: 火星
文章: 51

yonkov 離線
《轉載》Reuse the Component (下)引用回覆 編輯/刪除文章 搜尋由  發表的其他文章 回報給版主 IP 位置 回此頁最上方

***低估學習使用component所需要花的時間***

如果你對這個component完全地不熟悉,你到底要花多久才能了解要怎
麼樣來使用它呢?如果你能夠了解它背後的設計理念,你可能不用花
太多時間,就可以了解它的意義。問題是,大部分可以稱得上是component
的東西,通常都十分複雜。即使擁有相當多的參考文件,許多人的學
習,還是需要透過從使用這個component的經驗中,慢慢觀察,多多練
習,才可以漸漸掌握它的精髓。這跟學習騎腳踏車與游泳的道理是一
樣的。

這個過程,非常像是透過component與原作者進行心靈上的溝通。然而
我們常常會低估這樣的學習,所需要花的時間。這通常還得要視你是
否可以得到原創者的開示灌頂有關。如果你可以獲得原作者的現場指
導,通常會有機會頓悟;如果你只是透過文件想要了解他的神奇功用
以及微言大義,要花的時間差不多就是跟你要透過電話性愛達到高潮
的時間差不多久。

對於撰寫component的人來說,每次有人用他所寫好的component,帶
來的興奮可能就真的跟透過電話性愛帶來高潮差不多。剛開始會很新
鮮,久了以後就沒啥子感覺了。再久一點,等到所有使用的人把他們
的問題跟抱怨用email把你淹沒,或是又有一個菜鳥,希望大師可以撥
冗指點迷津之後,這種心情,可能就會轉變成跟專業的色情電話接聽
小姐一樣吧。只會剩下虛假的高潮,跟交差了事的應付吧。

當然,這還算是你運氣好,也就是說你所用的component,是真正有用
的。然而有些時候,你會遇到這樣的狀況:

***錯誤的component設計理念,以至於reuse這些component反倒會降
低生產力。***

這跟你抄數學作業,抄到印刷錯誤的解答還是抄錯題差不多。只是通
常發現的時候,都已經太晚了,老師都已經把分數打完還給你了。也
很像是剃頭剃到一半,打了一個瞌睡醒來後才發現,原本打算?個馬
尾,這下子已經半邊是個大光頭了,不剃成整個大光頭,就得要打扮
成清朝的辮子頭。老實說,用了設計不好的component,差不多就像
這樣。

根據調查,設計不好的component,在這個業界還真常見。(再次感謝
靈犬萊西能夠協助進行調查的工作)。我想這可能跟component到底是
怎麼設計出來的過程,有絕對的關係。

很多人都認為,可以被reuse的component,是某個天才,坐在樹下被
蘋果砸到就想出來的道理。這種故事只是說明了大多數人不知道牛頓
花多少時間去觀察天象,並研究別人所研究出來的結果。老實說我也
不是很清楚,畢竟他在做研究時,我並沒有在現場目睹。

然而對於不好的component,我可是看到過不少。我不否認會有會有像
我一樣的天才,可以一眼就看出事情的本質,然後設計出可以重複使
用功能超強bug超少的component。可是這樣的人呢,通常像鳳毛麟角
一樣地稀少。大多數比較好的component,都是建立在對於某個領域
的了解與經驗,將許多類似的東西抽離出來,才有辦法做出應用很廣
,很容易reuse的component。簡單地說,component應該是演化的結果
。經過實際運用、改良、測試、再改良,才會有功能越來越強,應用
越來越廣的component。當然,即使是天才,通常還是要經歷過這樣
的過程。只是時間可能會短一些就是了。

然而有許多人就是弄不清楚,自己到底是天才,還是一般的凡夫俗子
。所以通常會把自己的小小心得,當成光芒萬丈的創見。然後就會寫
出沒什麼用或是設計很不好的component。受限於經驗,通常這些
component都會有不太好用的地方,甚至根本就是把一件簡單的事情,
變得非常複雜。

然而有這個特權可以設計component的人呢,通常都具有一定程度的政
治影響力,老闆才願意投資時間跟資源在他們身上。通常隱含的結果,
就是這種不太好用的component,會被強迫應用在專案裡面。所以一個
不是植基於經驗與實際應用的component,帶來的壞處遠遠大於所可以
帶來的好處。

除了經驗以外,很重要的一點就是模仿。畢竟一個人的經驗一定有限
。現在有許多open source(開放原始碼)的component。當你花時間下
去trace(追蹤)這些component,並且從實戰中累積使用的經驗之後,
通常透過這樣的模仿與消化,你建構component的能力就會成長,這
個時候才會比較有機會做出更stable(穩定)更良好的component。

然而,老闆通常都相信牛頓原本是個白痴,被蘋果打到以後,忽然開
竅頓悟萬有引力這一套,所以會對開發component的流程有錯誤的期待
,間接就會造成這樣的現象:

***低估開發component的困難程度以及測試component的困難程度***

如果component是由經驗中推導出來,也就會從以前的實作經驗中,抽
出適合的程式,來加以歸納與整理。這樣的流程,由於是根基於以前
的程式,所以在開發上與測試上,相對都比較容易。

然而一旦老闆接受了component的開發是天啟的結果這種神奇的觀念,
災難馬上就會降臨。Component的好壞,只能建立在天才的高超想像力
之上。然而這種純粹根基於想像力的component,通常基石不穩,所以
即使設計好了,還會面臨相當多的困難。因為你所預測的運用可能根
本不會發生;你始料未及的需求可能不斷出現。要開發component的困
難程度,相對地就會變成非常高。加上以往可能沒有相關的程式當作
基礎,所以整個component的測試就會是一個夢魘。

更不要提,不當的設計通常會伴隨著無數的修改。每次的修改,就會
帶來新的邊際效應。久而久之,很有可能就會疊床架屋,變成一個巨
大的怪獸。這個效應,如果伴隨著原作者離開,會有更顯著的影響。

如果你有維護過大型系統的經驗,你就會了解這種可怕的現象。有許
多時候,每個人都只維護很小的一個部分,所以並不知道自己的程式
會帶來什麼結果。所以只能就單一模組或是單一個component來看。
問題是如果原作者離開了,通常要完全掌握他所寫的程式,就需要從
文件來了解他的想法。如果文件殘缺不全,還是文件根本就寫錯了,
那就只剩下程式碼可以告訴我們事實的真相。

問題是如果是維護一套既有的系統,通常我們還沒有能力掌握事實的
真相,就會收到要我們修改程式的需求。這些需求通常都會有蠻大的
時間壓力,不改不行。這時候就精彩了。你要對一個你不是完全了解
的東西去做修改。所以邊際效應會不停發生。為了降低邊際效應,也
因為他們沒有時間跟精力去研究成千上萬行的程式碼,所以通常的做
法就是寫一段程式,把原有程式計算出來的結果,加上一些新的運算
,產生新的結果。

如果運氣好,這個人還會寫一些文件跟註解。問題是如果當你前面已
經有數十個能力習慣不一的人做過這種事情時,事情的真相就沒有人
會了解了。你會看到有莫名其妙的迴圈,亂七八糟的程式流程。以及
缺三落四的開發文件。你要了解一項東西,可能得要從第一個人的原
始文件,一路讀到最後一個人的文件,才能掌握大概的情況,還不要
提第七個人文筆很爛,寫的英文不知所云,第十五個人寫的文件根本
就寫錯了。

通常到了這個時候,我們會建議來個改版。對於大部分的人來說,資
訊科技的不斷進步,順道解決了這個痛苦的維護問題。

然而如果你還沒有機會遇到大改版,這時候通常你會需要解決下面這
個問題:

***開發出來的軟體,回應速度太慢,需要進行大幅度的改寫***

不管使用什麼開發模式,是演化型,還是天才型的,其實都有可能面
臨這樣的問題。有很多時候,你寫的東西不是彈性不夠,而是彈性太
高,以至於每次要產生出來這樣的結果時,需要蠻長的運算時間。當
然,那種因為維護的人更替太多,造成疊床架屋的component,更會有
performance的問題。

使用者:以前我們只要20秒,就可以打完一張訂單了。現在你們的做
法的確比較有彈性,我們可以動態地去改變每張訂單所需要輸入的欄
位。可是你們新版的程式,卻需要花20分鐘的時間,才有辦法打完一
張訂單,單單那個畫面要出現就要5分鐘了!你們已經tune了三個月了
,是有變得比較快啦,現在只要花15分鐘就可以打完了,畫面只要1分
鐘就跑出來了。可是還是很慢啊,你們打算怎麼解決這個問題?

布魯斯:可是你要注意到現在我們所提供的彈性啊!我們這個功能開
發了這麼久,功能這麼強大,又把以前的bug都解決了…

使用者:我不管,我可以接受的是30秒。你們都是IT方面的專家,我
相信你們一定有辦法的…

任何時候,只要你所開發出來的軟體,超出使用者的耐心以後,就會
有改寫的需求。使用者通常都會期待超高的回應速度,加上超級彈性
的設定。問題是這兩者通常是不相容的。如果你要負責調整一個設計
相當複雜的component的回應速度,通常所需要耗費的資源與時間,
是遠大於開發與測試component原型所需要花的時間與資源。所以很有
可能會因為component的引進,反而專案造成進度的延遲,以及經費
的超支。

還是回到component設計的過程來說,經過演化所形成的component,
因為經過實際應用的洗禮,所以通常前幾次的使用者,會負責逼出回
應速度還可以接受,以及系統還保有一定彈性的component。經過整理
出這些東西,建構出可以reuse的component,所能夠造成的生產力改
變會比較明顯。所要擔負的風險也會比較小。

***結語***

專案管理,原本就存在許多迷思。有一些植基於直覺的思考,可能會
帶來完全相反的結果。物件導向開發,其實並不是很新潮的理念。如
果component都能reuse,那為什麼我們還是需要越來越多的程式設計
人員?為什麼這些程式設計人員,還是需要日以繼夜的工作,才寫得
出勉強可以運作的系統?

我想建立一套可以集體學習,共同開發的開發環境,加上演化式的
component分析設計開發流程,才是發揮reuse component最大功效的
基礎。如果沒有做到這點,任何期待引進component就可以改善生產
力的想法都是不切實際的幻想。

即使如此,當你的老闆還是要你開發可以reuse的component時,千萬
不要放棄這個難得的特權,畢竟,不是每個人都有機會把專案搞垮的
,不是嗎?

(全文完)

2003-10-15, 17:46 yonkov 的個人資料 把 yonkov 加入好友列表 發送Email給 yonkov 瀏覽 yonkov 的網站 MSN : yonkov@mail.com
  « 上一篇主題 下一篇主題 »
發表新主題 發表回覆
跳到:

Powered by: Burning Board 1.1.1 2001 WoltLab GbR