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


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

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

《轉載》Software Quality Assurance (上)

如果你在逛街時,發現有件款式非常流行的衣服,看了覺得十分滿意,
可是衣服破了一個洞,還有一些污痕,你覺得有點訝異,找來賣衣服的
小姐,想要問個仔細,她卻對你說:『這件衣服雖然這裡有一個洞,那
裡的顏色也不太對,不過你既然急著要,那就先拿回去穿吧。過兩個月
以後,我會把針線放在我家門口,你自己到這裡來一趟拿回家自己縫一
縫吧。雖然是這樣,這件衣服,還是不二價。』你會怎麼做?

1.乖乖付錢,兩個月後很高興地去拿針線

2.殺價

3.叫會殺價的人去買,再叫別人補好了以後,再拿來穿

凡是在這個性向測驗選擇1的人適合當軟體工程師,選擇2的人會在企業
裡面擔任採購,選擇3的人,則是可以順利當上主管。至於會把售貨小姐
痛扁一頓的人,可以考慮到反微軟聯盟工作。

這種莫名其妙的事情,在購買一般的消費品時,是不會發生的,最少在
已開發國家不會。可是軟體公司趕時間做出勉強可以運作的軟體,接著
靠著好奇又喜歡嘗試新鮮事物的使用者的奉獻與測試,再靠著強勢手法
行銷,就不斷地推出更新版,升級版來賺更多的錢,這好像已經變成了
這個業界的常態。經過多年的洗腦,大部分的人都已經默默地接受了『
只要是人開發出來的軟體,就必然會有bug』這樣的觀念。

遇到這種狀況,有些人就會想要把以往流行過的品管觀念,像是TQM
(Total Quality Management),拿來用在軟體開發上。不過依照這個業
界的特性,頭字語怎麼可以採用其他領域的名詞呢?我們應該自己發明
一個。所以就有了類似SQA 軟體品質保證(Software Quality Assurance,
SQA)這樣的名詞出現。

關於Software Quality Assurance呢,我個人並不是這方面的專家。所
以關於SQA跟TQM,或是其他各個令人頭痛的頭字語之間到底有什麼細微
的差異,我是一概不知。不過沒關係,根據統計數字顯示,大多數的讀
者也不是這一個領域的專家。這就讓我有機會可以扮演先知的角色。如
果你剛好是這個領域的佼佼者,建議你快快翻過去,不要看得太認真。

對於很多人來說,Software Quality Assurance指的就是軟體測試。以
我看來, Software Quality Assurance最少還包含了怎麼去做review,
怎麼建立一套良好的標準開發流程,怎麼進行相關檔案的版本控制,遇
到高severity(優先權)的defect時,要怎麼進行處理,建置開發與測試
的環境時,又要考慮什麼,以及怎麼樣去收集並解讀defect的資料…等
等。

(※作者註:defect跟bug不太一樣,例如有些人可能會覺得螢幕上的字
不夠大,想要叫你把字型調大一點,像這種狀況就是一個defect,可是
這並不是程式有什麼錯誤(bug)。不過呢,除非你想要考狀元,否則大
部分時候你可以不去管它們有什麼不同。以我來說,我覺得最大的不同
是當你在討論專案的狀況時,如果用了defect這個字,會讓你看起來非
常的專業。)

不過不可否認,要把Software Quality Assurance做好,最重要的工作
還是測試。所以我會從軟體測試這個主題開始聊起。

***測試***

我開始從事軟體工作時,我以為軟體公司的主管,應該都是這個業界的
資深前輩,所以對於軟體應該要怎麼發展,應該有很深刻的了解跟體認
。不過經過了這幾年,我發現好像全然不是這麼一回事。至少在測試這
件事情上來說,我遇到的主管真是形形色色都有。

最天真的主管,通常會像是發現新大陸一樣的問我這樣的問題:『我們
為什麼要做測試呢?我們要的東西不是軟體嗎?只要程式設計師夠努力
,夠小心,應該就可以做出沒有bug的軟體,為什麼還要花錢養人去做測
試呢?把錢省下來,我們去養超級優秀的程式設計師,找超強的駭客嘛
,幹嘛花那麼多心血去做測試呢?』

我總覺得,為什麼要做軟體測試其實就跟人類為什麼要戴保險套,是同
樣的道理。男人會戴上保險套,並不是這個動作會帶來什麼快美難言的
愉悅,我們要的是性。不會生小孩,不會得性病的性。做軟體測試也是
一樣。我們會做測試,並不是我們喜歡測試帶來的感覺,而是我們怕小
蟲蟲會帶來我們不想要的結果。測試並不會讓一個本來已經正確的軟體
,變的更為正確。所以總會有人認為,幹嘛要養專門的測試人員呢?

主張不用測試人員的主管,還是只要請程式設計師自己測試就可以的主
管,其實就像是主張透過性交中斷法來避孕一樣。會有這樣思考模式的
主管,基本上就跟想要哄騙女朋友上床,卻有沒有準備保險套的十五歲
少男一樣。『我的自制能力比較強,只要我們小心一點,在蟲蟲快要跑
出來之前,就先把它抽出來,就不會懷孕了。』同樣的道理,只要程式
設計師小心一點,就不會有小蟲蟲了。

下回你遇到這樣的主管,你就直接想到十五歲的思春少男就對了。採用
這種策略通常都要付出可觀的代價,就像避孕失敗就得選擇墮胎或是當
小父母一樣。當然,當你發展的軟體沒啥價值時,有沒有測試人員其實
都沒差。大自然會自動淘汰不適合生存的物種。

另外一種天真的想法是,只要我們用了超強的程式設計師,就不會有bug
了。相信這種論調的人,或許也會認為下面的推論很有道理。

甲 :醫師,怎麼可能?我女朋友怎麼會懷孕呢?這一定不是我的孩子。

醫生:怎麼說?

甲 :我每天坐在電腦前面超過十二個小時,又長時間的熬夜,每天還都
穿著牛仔褲,依據醫學報告,我應該會不孕才對啊。怎麼有可能懷
孕呢?

醫師:……

相信擁有良好的天賦,再加上長時間接受輻射線的照射,以及超長的工作
時間,小蟲蟲就會比較少。如果這個理論成立的話,我們也不需要避孕了
,只要轉行來寫程式就好了。寫程式的功力比較好,並不表示就沒有小蟲
蟲。況且有很多問題,並不是來自於程式設計師本身,從使用者到系統分
析師,以及系統設計人員,每個環節都可能有問題。就像不孕並不一定都
是女方的責任一樣;凡是長時間在電腦前面工作的人都有可能要負點責任。

關於這個問題,其實程式設計人員也要負一部份責任。主管的愚蠢,多半
是因為無知所造成的;可是程式設計人員的自我膨脹,卻是讓這個問題更
加惡化。我不只一次遇到所謂的超級程式設計師,他們的特點是動作很快
,或是腦筋很好,每個人都自信可以移山倒海:『如果有人寫程式會有bug
,那一定是他們能力不夠好。像我們能力這麼好,寫出來的東西一定不會
有問題。所以我寫的程式是不會有bug的。或者因為我比較強,所以我寫
的程式bug比較少…你找任何測試人員來挑戰我的智商,簡直就是在侮辱
我!』

很多人寫好程式以後,就自以為天衣無縫,根本就不想繼續測試。所謂的
單元測試,常常都是虛晃故事。說來慚愧,我小時候也是其中的一分子。
像我還很年輕的時候,每次寫完一篇文章,總是覺得自己真是妙筆生花,
文思泉湧。任何人要是嘗試修改我完美的遣詞用句,必定會遭到我無情的
奚落與鄙視。

後來長大一點以後,就發現用新注音用久了,有時候電腦還是會胡亂組字
,我沒有在第一時間改回來,就把文章寄出去了。害我每次印出來看到自
己寫錯字,都會想要叫電腦用微軟新注音罰寫一百遍。打字習慣了,寫起
字來也是魯魚豕亥,多所舛誤。隨著年月的增長,隔了一段時間回去看自
己的各種議論時,慢慢也領悟到自己所學還是有所不足。所以現在對於各
方的指正,就會比較虛心接受。

寫文章都已經是這樣了,更何況是寫程式?程式發生錯誤,並不是因為智
商的關係,也不盡然都是因為一時的粗心。大部分時候,是因為design沒
做好,或是在開發時想法上不連貫,或是對於要解答的問題沒有想清楚。
很有可能寫程式寫到一半,心愛的女友忽然打電話來說要分手,以致於心
神喪失,無法專心致志的把程式寫完;也有可能是房東臨時打電話來要收
房租,得要跑出去避難;也很可能是隔壁的貓咪在思春…反正造成bug的問
題很多,沒有一樣跟你們的智商有關。你們自己編。

而一個負責任的程式設計師,就應該體認到寫程式時,可能會面臨很多干
擾,所以任何時候要把程式release出來前,都應該要自己做好把關的角色
。沒有經過自己的單元測試,驗證你的程式確實是work的,不應該把程式
release出去。

當主管也認知到,超強的程式設計師所寫的程式也會有bug以後,就已經往
上成長了一層。畢竟軟體需要測試,這跟人需要買保險是一樣的道理。可是
測試到底包含什麼呢?他們的了解就不是很深入了。所以他們唯一會做的就
是:『不斷地重複一些陳腔濫調,可是沒有任何實際的動作。或是想出一些
不太有用的把戲。』

『品質非常重要。所以CEO對於品質非常重視,他特別把今年定位成品質年…』

『Quality is number 1.』

『測試非常重要。所以你們要努力地測,用力地測,想盡辦法地測。』

『品質是所有東西的根本。只有良好的品質,我們才能獲得客戶的認同…』

好吧,對這些主管來說,反正測試就是一件很重要的事情,你可以為這麼
重要的事情設計一些標語,印在馬克杯上,還是做做海報貼在牆上,平時
訓話時,加強宣導測試或者是品質的重要性,或者是把測試跟品保,指派
給一個專門的人,這樣子主管的工作就告一段落了。

每次遇到這樣的主管,我就會想起下列連續劇的對白:

父親:你怎麼這麼不小心?怎麼會把人家的肚子給搞大了?我不是一再跟
你講,要小心嗎?我不是一再跟你講,要記得戴上保險套嗎?

兒子沒有說話,可是音響要傳來他內心的聲音:『你每天只會講這個,可是
我連買保險套的錢都沒有,怎麼戴啊…』

或許這個兒子並不了解何謂reuse的真諦,他應該要多加了解使用OOAD的好
處。不過很多主管,就跟這個父親一樣。總是覺得測試或是任何品質保證
的工作,應該只要加強宣導就可以了,並不需要另外花錢,或是花太多資
源來做這樣的事情。這應該是寫程式的人,應該要負起的責任。畢竟問題
就是你們造成的,你們自己不找出來,自己不解決,還要推給誰呢?

另外一種很有趣的觀念,就是測試雖然很重要,可是我只要安排人去測就
好了。而且最好測試人員就是實際的使用者。畢竟,還有誰對這個領域更
了解呢?所以他們的想法,就是請這些測試人員,用力的測,大力的測,
想盡辦法的測。反正就是做monkey test就對了。下回遇到這樣的主管時,
記得買些香蕉。

好吧,我們並不是生活在蠻荒時代,這個業界還是有很多了解為什麼要做
測試的主管。只是通常測試在台灣不怎麼被重視,連帶地也比較少人想要
往這個領域鑽研與發展。結果常常就是測試人員嚴重地編制不足,地位低
落。

測試人員的不足通常有兩種現象,一種是程式設計師要兼著做測試,另一
種則是程式設計師把測試的責任,通通推到已經不足的測試人員身上。

讓程式設計師兼著做測試(不是只有unit test,是連後面的integration
test, system test喔。)其實是一種最笨的做法。眾所皆知程式設計師的
薪水很高,人數很少。所以是一種稀有的資源。請程式設計師兼著做測試
,就跟拿純金去打造一隻馬桶刷一樣。除了不好用以外,價錢一定很高就
不要提了。

請原作者去找出自己的錯誤,是很困難的。因為每個人思考都會有盲點,
那就是為什麼需要由不同的人從不同的觀點進行測試,才有辦法找出潛在
的問題。

另一個現象則是程式設計師把測試的責任,通通推到已經不足的測試人員
身上。這是因為有很多公司,除了測試人員嚴重編制不足,連程式設計師
也是嚴重不足。所以程式設計師的心態就是,我只要寫完就好了,所有的
測試,都不是我的責任。

測試是需要程式設計師與測試人員彼此緊密配合,密切溝通的活動。如果
一個程式設計師的心態不正確,就會讓這個工作很難順利地推展下去。

軟體測試其實是一門很高深的學問,要進行測試之前,需要先做出詳細的
規劃,把要做哪些種類的測試,要收集哪些資料,怎麼收集,遇到問題要
怎麼判定,怎麼追蹤問題…通通都規劃好寫出來,寫成測試計劃。接著則
是需要依據分析或設計文件,仔細去想想要怎麼測試,要用什麼樣的資料
來進行測試,要用什麼程序來進行測試…。把這些都想好了以後還是要寫
下來,寫成測試個案。接著除了去執行原先設計的個案以外,還得要針對
問題進行分析與追蹤,並且要管制好各個版本的系統…還好我在這本書中
,只想提提我所看到的一些問題,至於每件事情該怎麼做才比較好,那是
下一本書的課題。

測試其實是確保品質的最後一道防線。眾所周知,越晚發現問題,解決的
成本越高。早期發現,早期治療,治愈的機會越高。要怎麼樣才能早期發
現問題的徵兆呢?那只有靠review了。

***Review***

早期發現,早期治療,聽起來非常有道理。然而開發軟體牽涉到心智思考
模式的交換,這也讓review這件事,變得相當困難。很多人對於review的
看法,就是找超人幫忙用X光眼睛看一看,就可以早期發現問題。問題是
如果超人這麼管用的話,為什麼他不是一開始就加入這個專案?為什麼有
這麼多的超人,還是有這麼多失敗的專案呢?

或許我們可以看看下面的例子。

客戶甲:布魯斯,為什麼你們在專案組織裡面列了超人的名字,可是我們
一直沒有看到超人的出現?

布魯斯心想,(那是因為吉娜為了讓專案的組織看起來稱頭,才列了超人的
名字,超人這麼忙,要對抗邪惡拯救整個地球都來不及了,怎麼會有時間來
拯救我們呢?)於是布魯斯說:超人會在需要幫忙的時候出現,我想,除了
一開始在設計系統架構時,會需要超人的指導。我們會請超人來參加review
,幫我們先期找出系統潛在的問題。

客戶甲:能夠這樣當然是最好了。

三個月後。

客戶甲:布魯斯,為什麼超人還是沒有出現?我們review了這麼多次,超人
還是沒有出現!是不是我們這個專案比較不重要?

布魯斯(超人本來就沒有時間了,這該如何是好?):我想超人會在我們需要
幫忙的時候出現。目前我們的成果應該還算可以。

客戶甲:誰給你這種錯誤的印象!我覺得我們這個案子已經陷入很大的危機
之中。我會跟吉娜好好討論這件事情,是不是你們覺得我們這個專
案比較不重要?如果你們的resource調度有問題,我來幫你解決。

辦公室內,吉娜正在跟客戶甲通電話。

吉娜:是,是,是。沒有問題。我會負責解決。您客氣了,好的,好的。沒
有問題。拜拜。(掛掉電話。)布魯斯,客戶甲剛剛打電話來。你說該
怎麼辦才好?

布魯斯(還不是你捅的紕漏?還問我怎麼辦?):我想我們還是得要請超人去
露露臉,不然這件事可能不容易解決。

吉娜:不可能,超人現在正在全力對抗邪惡的外星壞蛋。我目前可以提供的
支援就只剩下靈犬萊西。

布魯斯(陷入極度的恐慌):可是他是一隻狗!而我們沒有人懂得小狗在叫什麼!

吉娜:這就跟你從美國找consultant過來一樣嘛。上回我們找那個拿美國護
照的俄國佬,他的英文不是沒幾個人聽得懂?客戶甲不是也被唬的一
楞一楞嗎?

吉娜顯露出智商突然下降至90以下的表情。布魯斯無法抵抗沒有邏輯的思考,
只好屈服在吉娜的淫威之下:我還是覺得要想辦法請超人過來露露臉?

吉娜:如果超人有空的話,當然沒問題。(是啊,如果太陽從西邊升起來的話。)

三天後。

布魯斯:我知道超人會用光速飛行,不過他現在因為照射到克卜頓星球隕石
的光線,所以身體變得非常虛弱。目前正在調養身體之中。(有本事
,你殺到醫院去抓他出來啊。)沒關係,為了支援這個專案,我們公
司還是派遣了相當資深的顧問,這位是靈犬萊西,它具有多年的專
案經驗。

靈犬萊西:汪汪汪。

布魯斯:我想靈犬萊西可以參加我們的review。如果我們討論的過程,他發
現了任何問題,他會隨時提醒我們。

靈犬萊西:汪汪汪,汪汪汪,汪汪汪。

客戶甲:……

一般在進行review時,有分為形式上的審查,以及實質內容的檢討。形式上
的審查,多半在於審查文件格式是否符合標準的格式?開發流程是否依據標
準的流程?除非你相信,因為你寫的文件格式不符合標準格式,所以跟你共
同開發的夥伴們就沒有辦法看懂這些文件,否則這些審查最大的意義,只是
在於把review這個法定的程序給走完。本身當然沒有什麼立即的價值。

實質內容的檢討,當然會有意義的多。可是這裡就牽涉到,參與review的每
個人,事先必須對於要被review的事物有足夠的了解,要被review的文件要
事先發給所有與會人員,並且各個review的人最好要事先將意見寫出來,提
供給其他參與會議的人。

光這一點就很難做到了。所以一旦進入這麼細節的討論,無可避免的是開發
時間一定會拖的很長,而要找到這麼適當的人選,並不容易。而這些人是否
有時間可以仔細地推敲,詳細地審閱,來找出潛在的問題,都是蠻關鍵的因
素。要能達到有效的review,人選其實是最關鍵的因素。你要找的人,是否
擁有足夠的能力,如果這個人有這樣的能力,在時間上又是否可以配合?這
其實都會影響review所可以達到的效果。

大多數時候,所謂的review都是在蓋橡皮圖章。很多人就是想找個強人背書
,表示這個案子有被強人看過了,也提出一些問題,不過大致上看起來還好
。然而對於真正有問題的專案來說,不是找不到適當的人來review,就是這
些人沒有時間。有時候則是整個review流於形式上的審查,並沒有什麼真正
的發現。不過這還不是最令人惋惜的結果。

即使你找到對的人,也發現了問題,這樣就達到了review的目的嗎?當然不
是。Review除了要找出問題,最重要的還是要針對問題來提出解決方案。然
而有很多時候,解決方案並不是那麼容易可以實行。

超人:經過我用X光眼睛照射,加上我從克卜頓星球所學來超越凡夫俗子的知
識,我覺得整個架構都有問題,整個high level design跟low level design
都需要重新來過。不然就算是現在開始implement,以後問題還是會層出不窮


吉娜想,(我們已經花了十二個人月在做design,這個穿著內褲的傢伙在開玩
笑吧?):超人,難道你不可以看出最關鍵的問題,我們針對問題來解決就好
了?可不可以不要動架構?

超人:我會用光速飛行,可是要不動大架構,就可以解決這個問題,這只有上
帝才行。

吉娜心想,(這種只懂得技術的人,果然腦筋比較死一點,讓我來點醒他一下):
超人,其實客戶現在只是想要你幫忙看一下。你的想法我已經知道了,可是這
個問題如果要這樣解決的話,公司會受到很大的打擊。你要不要在review的結
果這裡盡量地輕描淡寫,反正現在問題很大我們已經知道了。詳細該怎麼做,
我會跟project team討論過以後,再請布魯斯好好規劃以後再跟你討論。畢竟
你這麼忙,有這麼多事要去做。(等老娘把你擺平了以後,就趕快找人去
implement了。我又不是被嚇大的。Design重新來過?怎麼可能?我今年考績
不就完蛋了?聽說ERP部門正在找主管,我跟Michael好好談談,趕快調過去,
這個燙手山芋就可以丟給別人了。Design做完了,超人也背書了,剩下有問題
,就是implement的人做的不好,跟我是一點關係都沒有。)

超人:好吧,整個文件的格式看起來還是不太對。我會請整個design team在
每個文件之前加上一張比較好看的封面,跟詳細的目錄,最後要加上一
個漂亮的封底。這樣才符合我們公司定出來的文件標準。

從上面的例子看來,review的時機還是很重要的。如果解決方案的成本太高,
專案經理很有可能會採取比較沒有效果的方案。因為這看起來可能對於目前的
衝擊比較小。只是對於目前衝擊比較小的方案,不見得對於整個專案的衝擊比
較小就是了。

跟review相同,系統測試一樣與很多執行面的細節有關。設計出來怎麼進行
測試,或是找了人來負責進行測試,並不會保證你的問題就會就此解決。我
認為測試的成敗,會跟下一節的主題很有關係。

(待續)

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


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

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

《轉載》Software Quality Assurance (下)

Defect Tracking, Version Control and Environment Setup ======================================================

要做好測試,除了要設計出好的設計個案以外,怎麼樣去追蹤你所找
到的問題,並且確定版本的控制如你所預期,這裡面就有一些學問啦。

對很多主管來說,要做好問題的追蹤,以及版本的控制,其實就是看
你在這幾個方面,是否使用了先進的工具來進行管理。只要學會了怎
麼樣使用這些工具,並且也真正地在專案中使用了這些工具,這些工
作就必然會做的很好。

所以我們會在很多公司裡面看到,defect tracking的系統是上了,可
是整個開發團隊裡面沒有人會針對defect進行剖析;Version control
的系統是用了,可是感覺起來好像就是變成了一個檔案的備份工具,
並沒有實質上帶來什麼驚人的效益。

這就牽涉到了為什麼要使用工具了。其實工具是為了幫助我們來解決
問題。使用任何工具,就都會跟為什麼要使用這個工具有關。只有在
了解我們要解決的問題是什麼,並且知道工具會扮演的角色是什麼,
而我們的作業還有什麼要跟工具互相搭配之後,才能夠真正解決我們
想要解決的問題。

拿問題追蹤系統(defect tracking system)來說好了。Defect tracking
system其實就是一個紀錄defect,以及紀錄這個defect相關的處理紀
錄的系統。這裡牽涉到的會是誰可以決定這是一個defect?這個defect
是在哪個環境下發生的?要怎麼reproduce?誰要負責把defect分派給
適當的programmer?defect的嚴重程度(severity該怎麼判定)?defect
的狀態有哪些?誰又要負責重新測試programmer已經解決的問題?如果
這不是一個defect,那又應該要怎麼處理?每個階段該觀察哪些指標,
才知道現在quality到底好不好?

大部分的問題,都不在於工具要怎麼使用,團隊內部要怎麼一起建立共
識,並且分工合作,這才是重點。這就跟我們學習使用保險套一樣。學
習如何戴上保險套,這絕對不是重點。重點在於要怎麼透過保險套的幫
助,讓兩個人可以琴瑟和鳴。不要兩個人之間我退你進,我進你退,你
正興致盎然時,我卻是垂頭喪氣,這樣就會很難切中要害了。只有在雙
方你情我願時,這個小小的薄膜,才可以幫助雙方達成彼此共同的快樂


對於defect來說,最重要的關鍵是,要怎麼樣reproduce這個defect。也
就是說,tester要幫助programmer,找到問題可能會發正在哪裡。所以
要怎麼重回案發現場,就會是最重要的關鍵。

有很多時候,programmer會強調,在我的環境裡面不會發生這種事情啊,
為什麼在你們的測試環境裡面會發生這種事情?這就牽涉到了environment
setup的policy。

一般而言,你會需要至少一個開發環境(development environment),一
個測試環境(testing environment),以及一個正是上線運轉的環境
(production environment)。如果這是一個更新現有系統的專案,你需
要的環境可能會更多。

很多人可能都搞不清楚為什麼我們會需要這麼多的環境,老實說,我一
開始也不知道。一直到我做的專案越來越多了,我才明白,不這樣做,
很難解決我們會面臨的問題。

開發環境是為了將大家的程式整合在一起,確保多人共同開發時,不會
因為程式的修改,因為彼此的不一致,造成開發上的問題。例如改掉了
程式的介面,或是在共用的檔案上加了一些東西,或是增加了資料庫裡
面,某個table的欄位…這種事情一發生,就會有人哇哇叫。所以很多人
為了避免這種問題,就建議每天把大家的東西通通丟在一起,看看會有
什麼結果。這就是daily build的由來。

可惜的是,很多資淺的程式設計師只聽過daily build,就以為每個環
境都是要daily build。事實上,daily build僅在於開發期間以及測試
工作剛開始,版本還不是很穩定的狀態下,才需要在開發環境中進行。

測試環境則是為了讓測試人員在進行測試時,可以有一個不會受到干擾
的工作環境所建置的。這個環境裡面呢,最重要的是版本的更新,必須
要接受測試人員的控制。

雖然我不懂射擊,不過我猜想要射中一個正在高速移動的飛靶,應該比
射中一個固定不動的靶子,來的困難的多吧。測試環境的版本,其實也
是建立在這樣的思維上。穩定的版本是最大的考量。在進行測試時,如
果發現了問題,只要問題不是太嚴重,那就把問題紀錄下來,繼續測下
去,不要去更新測試環境的版本,即使programmer已經把bug修好了也
一樣。

很多人可能會想,如果我找到了問題,那不是應該要趕快把問題解決嗎
?為什麼不趕快更新版本呢?主要的原因有下面幾個:

1.你把版本更新了,你就沒有辦法reproduce這個問題了。這樣子在需要
reproduce給programmer看時,你就沒有辦法辦到。

2.如果你測試正做到一半,還有一半的test case還沒有測試,你不把原
先的test case全部測完,你就不知道系統在這個版本時,會有什麼反應
。可能舊的版本,比起新的版本會來得好。可是你如果沒有全部測完,你
並沒有辦法確定這一點。

3.你會沒有辦法比較修改前,跟修改後之後的差異。這跟減肥的廣告需
要留下減肥前的照片或是影片,才有辦法跟減肥後的做比較是相同的道
理。很多時候我們為了怕新的版本會造成邊際效應,所以會需要把兩個
版本之間進行比較。拿來看看,這個修改到底有什麼不一樣。

我只有在一種情況下,才會決定要更新一個還沒有完成全部測試個案的
測試環境。那就是遇到了severity 1的bug。如果不去更新環境,整個測
試根本就做不下去。真遇到這種狀況,不更新版本也不行了。

Production environment就比較單純了。原則上就是一個神聖不容侵犯
的東西。(這跟娶了公主回家當老婆一樣,你如果太粗魯,一不小心把
它弄壞了,可是沒有人可以擔待的起喔。)

任何關於production environment的更動,都需要先在測試環境中演練
。(任何你想在公主身上使用的特殊招式,最好先跟丫頭演練一下。)

在更新production environment之前,最好先把東西備份下來。萬一出
了什麼差錯,你還可以把環境恢復成原有的狀況。(要跟公主上床之前,
最好先拿到免死金牌。)

關於版本控制的話,其實我的認知就很簡單。版本的編號要怎麼樣編?
同一個版本的原始碼要怎麼樣抽在一起?除了原始碼以外,還有哪些東
西也需要版本控制?(例如test data的initializing scripts,database
initializing scripts…)什麼時候要rollback一個版本?每個人要怎
麼check out,check in原始碼?code freeze以後應該要怎麼作業?…

只有defect tracking、version control以及environment setup這幾
個環節扣在一起後,進行測試才會有意義。

當你對於怎麼處理一件事情的經驗越來越豐富了以後,你就會想要把
你的心得傳承下去,這時候你就會試著去建立一個新的制度,或是針
對原有的制度提出修正。這時,通常就會寫出一套又一套的standard
procedure and guidelines。

Standard Procedure & Guidelines
===============================

建立一套標準的開發流程,以及作業指引,可以說是許多工程師夢寐
以求的目標。這種高檔的工作,看起來就是在職場金字塔頂端的人應
該要做的事情。想想看,讓所有的小齒輪,都臣服在我驚人的腦容量
,以及睿智的思考之下,是多麼令人興奮的事情。

然而,有這種想法的人通常不只有一個。你也覺得你的經驗豐富,我
也覺得我的看法具有洞察力,為什麼我就要聽你的?況且如果我沒有
在訂定標準的工作上,表現出我卓越的貢獻,那我怎麼展現出我的績
效呢?多種政治考量的結果,通常就讓所有的Standard Procedure與
guideline的訂定,蒙上很多層的陰影。很多人為了擺平政治上的阻
力,會來個腦力激盪,或是來個集體討論。

當你觀察很多這種集體討論會的話,你會發現通常會被找來開會的,
不外乎下面這些人。

*滿腔熱血,懷抱理想的菜鳥
*一知半解,被抓來充數的米蟲
*經驗豐富,莫可奈何的老江湖
*不知所云,異想天開的上級指導員

滿腔熱血,懷抱理想的菜鳥
========================
很多年輕人,特別是剛出校門的人,通常抱持著滿腔熱血,總會想要依
據書上的理論,來訂定這樣的典章制度,所以會參加這樣的討論。這些
人的特點是缺乏工作經驗,可是很喜歡讀書,所以會發揮高度的想像力
,來補足他們經驗上的不足。因為沒有實際的經驗,所以總要找個靠山
來靠,所以你看他們所發表的言論,言必稱大師,動輒引經據典,好像
當他們在苦心鑽研UML、RUP、CMMI、還是第五項修鍊時,別人都在看電
視睡覺。好吧,這還算好的,因為這些人雖然搞不清楚事情要怎麼做,
可是最少還算具有理性,可以經得起理性的思辯。而因為經驗不足,所
以他們的發言雖然會影響方向,不過不會是影響決策的主要因素。

一知半解,被抓來充數的米蟲
==========================
有時候有些人會參與討論,多半是因為他們年紀較長,看起來經驗豐富
。不過年紀較大,或者曾經參與過成功的專案,並不表示他們就是成功
的關鍵。當我們強調團隊合作時,其實只要你有夠好的同事,只要一人
得道,你一樣可以雞犬升天。所以呢,總有一些其實並不是十分了解狀
況的人,會被抓來開會,反正他們也是抱持著當一天和尚撞一天鐘的心
態。

這些人的特點就是他們在職場上打滾多年,已經練就一身開無聊會議的
功夫,所以可以一邊聆聽菜鳥漫無邊際的高談闊論,一邊神遊太虛打瞌
睡。最厲害的是每次請教他們的高見時,就可以突然從恍惚狀態驚醒,
然後以他們先前參與的偉大專案當例子,開始言不及義的談話。

比較傷腦筋的是,對於高階主管來說,這些徒具工作經驗,卻沒有從經
驗中汲取任何教訓的人所發表的言論,跟其他的人看起來沒有什麼兩樣
,主要也是因為高階主管自己也不懂。所以通常在討論的過程裡,高階
主管就會用這個人的政治影響力,來決定要採納多少他的意見。

經驗豐富,莫可奈何的老江湖
==========================
每個團體裡面總有一些知道事情該怎麼做的人。不過事情總是很難往他
們所期望的方向發展。所以每次開這樣子的會議,這些人都是一副莫可
奈何的表情。語帶譏刺跟反諷,就是標準配備啦。

這些具有豐富經驗的老江湖,一方面要引領菜鳥們的討論方向,一方面
要跟米蟲們進行論戰。可是最無力的,就是要忍受上級指導員們神奇的
結論。

這些人因為戰功彪炳,所以通常講話會很有份量。不過遇到思考方向神
鬼莫測的高階主管,多半意見都會被打個七八折。

不知所云,異想天開的上級指導員
==============================
官大學問大。好像是一種政治上正確的真理。高級主管的人,常常都會
想要提供宏觀的看法,或是企圖在各種不同的意見中,扮演仲裁者或是
協調者的角色。然而大部分的高階主管,都不是這個領域的專家,所以
常常不是對於問題有錯誤的認知,就是提出很奇怪的指示,例如:

* 讓我們折衷一下:當會議上有不同的意見時,例如一個人說要做A,另
外一個人要做B,所謂的折衷就是A做一半,B做另一半。(這個字我可不
會寫。)即使這兩件事是沒有辦法只做一半就連起來,或是根本毫不相關
也不管。

*這些建議都很好,我想我們就分頭進行:當會議上有不同的意見時,例
如一個人說要做A,另外一個人要做B,所謂的分頭進行就是你高興怎麼做
都可以。遇到這種結論,我們就可以鼓鼓掌了。

*這些建議都很好,我想我們應該要兼容並蓄:當會議上有不同的意見時
,例如一個人說要做A,另外一個人要做B,所謂的兼容並蓄就是A跟B都
要做,即使這兩件事之間互相重複,或是屬於完全互斥的兩件事。

*這些建議都很好,可是我想跳脫出大家的思考方式,用更宏觀的方向來
思考:這一個撒手?在冗長的會議後施展出來,所有防禦力不足或是生命
點數不足的玩家就只好等死吧。搞了老半天,原來高階主管早有定見,開
會的目的只是想要走完民主程序。每次遇到這種狀況,我都會想到鬥雞、
鬥蟋蟀…這種觀賞其他動物互相爭鬥的活動。可能我們在開會時的爭辯,
也提供了高階主管類似的娛樂吧。

民主不應該是在企業內部解決問題的方法。開會通常會獲得的是共識,是
妥協的產物,並不是一個比較好的結論。偶爾也會有三個臭皮匠,勝過一
個諸葛亮的狀況。是啦,諸葛亮都已經死了那麼久,三個活人還贏不了一
個不會說話的死人嗎?透過這樣的參與,多半可以擺平政治上的爭論,讓
大家心服口服。

妥協的結果通常就是這些所謂的standard procedure以及guideline,會
產生過多的文件。只要有人覺得重要,就要多寫一份文件。除了聽到瀕臨
死亡的森林在悲泣以外,好像也沒聽到什麼反對的聲浪。企業總需要一些
事情來消化過多的時間以及冗員,以免把太多精力花費在真正具有生產力
的事情上。

先把事情變多,變得複雜一點,再要求每個人都要照著做。當文件過多了
以後,還要另外貼標籤,寫文件,告訴別人我們這件事情該怎麼做,又是
在做些什麼。原則上,這就是ISO認證的精神。嗯,聽起來果然跟quality
有關。我差點忘記這一章的主題是什麼。

當然,如果standard procedure and guideline是從實戰上的best practice
推導出來的話,就會有完全不同的價值。要能夠達到這一點,需要在專案
前進的過程裡,找些時間回來review,並且做做分析,看看問題通常是從
哪裡出現的?特別是在一個專案告一段落以後。只是人們通常都急急忙忙
的要趕下一個deadline,要做下一個project。卻忘了要好好看看,在這樣
的過程裡,到底大家學到了什麼?

走筆至此,不禁要問在這個充滿了缺陷的軟體世界裡,到底零缺點的軟體
有可能存在嗎?

Is Zero-Defect Possible?
========================
看了很多書,做了一些專案,慢慢的就有了一些自己的體認。我覺得大部
分的問題,都是出在整個開發流程的前端。不是需求沒有收集好,就是設
計出了問題。

1.review發現的過晚。最強的人不是在一開始就進來。

2.發現design錯誤時,不能下定決心。所以最多的心力在於補破洞,越補越大洞。

3.design不夠solid就開始coding。

4.requirement認知不同。使用者沒有辦法幫忙review requirement。

5.當你發現一個壞掉的零件,你會把零件丟掉,還是嘗試著去修理零件?

我們常常會為了meet中間的milestone,而miss掉最後的deadline。這種事
情在專案開發的過程裡面,層出不窮。如果在裝配線上,遇到有瑕疵的零
件,技術員會停下他的工作把零件修到正常,才繼續組裝,還是換一個新的
零件?

當我們發現一段寫得很差的code時,通常不會決定重寫,因為這些人的工時
跟心力已經花下去了。最典型的決定就是把它改到對。所以你會花加倍的時
間,去把它改對,而不是把它丟掉。

更多時候,因為我們要趕schedule,這時候Pipeline好像是個不錯的選擇。
所以design還沒有做的很確實,就開始努力寫程式。先寫好的東西呢,很有
可能下一個階段就要再大幅度的修改。所以凡是強調用OO方法開發的軟體,
都會強調要用iterative的方法來開發程式。在開發共用元件時,的確是應
該用iterative的方法,可是那並不表示,每個iteration都應該在design還
沒做完之前就先下去coding。我認為在任何時候,做了這種決定,企圖爭取
到時間,最後都會浪費更多時間。

那是否意味著『等到design做完了,才開始coding;如果開發出來的東西有
太多的defect,就做個design review;如果某段程式的bug太多,就乾脆丟
掉重寫。』這樣的開發模式會比較好呢?

我不知道。專案開發只有一次,就如同生命只有一次一樣,你沒有辦法找到
同樣的team,在相同無知的情況下,重頭用不同的方法,跟相同的user再重
新做一次。接著比較兩個不同做法的結果。

很多時候我們都是在已經看到結果時,才去想想如果當初我們如何如何,現
在可能會怎樣怎樣的問題。很有可能站在現在這個山頭,會覺得遠方的山頭
比較怡人,可是等你翻山越嶺到了那個山頭,又覺得不過爾爾。

只是依據現在我微薄的經驗,我覺得這樣的方法,比較有可能達到我們的目
標。

一開始想要描述software quality assurance,居然會扯到zero defect
software development。我不禁對於自己漫無邊際的漫談能力感到驚嘆。
大腦Run到這裡,也不知道怎麼繼續寫下去了。這一章可能算是我的腦袋
在運算時,遇到了一個severity 1的defect吧。嗯,這一定是因為detailed
design沒有做好的關係。

System Halt…… :-)

(全文完)

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

Powered by: Burning Board 1.1.1 2001 WoltLab GbR