在可行性分析之后,項目計劃與質(zhì)量管理將貫穿需求分析、系統(tǒng)設(shè)計、程序設(shè)計、測試、維護(hù)等軟件工程環(huán)節(jié)。
項目計劃是要提供一份合理的進(jìn)程表,讓所有開發(fā)人員任務(wù)明確、步調(diào)一致,終共同準(zhǔn)時地完成項目。項目計劃是要付諸實施的,不象用嘴巴喊政治口號,可以很夸張。軟件的項目計劃重在“準(zhǔn)確”而非“快速”。
提高質(zhì)量是軟件工程的主要目標(biāo)。但由于軟件開發(fā)是一種智力創(chuàng)作活動,很難象傳統(tǒng)工業(yè)那樣通過執(zhí)行嚴(yán)格的操作規(guī)范來保證軟件產(chǎn)品的質(zhì)量。世上小心翼翼、老實巴腳的程序員未必能開發(fā)出高質(zhì)量的軟件來。程序員必須了解軟件質(zhì)量的方方面面(稱為質(zhì)量因素),如正確性、性能、易用性、靈活性、可復(fù)用性、可理解性等等,才能在進(jìn)行系統(tǒng)設(shè)計、程序設(shè)計時將高質(zhì)量內(nèi)建其中。軟件的高質(zhì)量并不是“管理”出來的,實質(zhì)上是設(shè)計出來的,質(zhì)量的管理只是一種預(yù)防和認(rèn)證的手段而已。
項 目 計 劃
做項目計劃,如同給一個待出生的嬰兒寫傳記那樣困難。如果允許項目結(jié)束后再寫計劃,那輕松多了,并且可以 地準(zhǔn)確。
歷史教訓(xùn)讓我們明白一個道理:如果一萬年以后才會有一條陽光大道通向共產(chǎn)主義,那么現(xiàn)在不要忙著砸鍋煉鋼趕英超美,免得在跑步奔向共產(chǎn)主義時把自己累死餓死。在做軟件的項目計劃時,應(yīng)屏棄一切浮夸作風(fēng)。只有“知已知彼”才能做出合理的項目計劃。這里“知彼”是指要了解項目的規(guī)模、難度與時間限制。“知已”是指要了解有多少可用資源,如可調(diào)用的程序員有幾個?他們的水平如何?軟硬件設(shè)施如何?
知己知彼
首先要了解項目的規(guī)模、難度與時間限制,才可以確定應(yīng)該投入多少人力、物力去做這個項目。在可行性分析階段要考慮這個問題。但不幸的是,人們在陷入項目不能自撥之前總難以準(zhǔn)確地估計項目的規(guī)模與難度。這里經(jīng)驗起到了重要的作用。
項目的時間限制有兩類。第一類,項目應(yīng)該完成的日期寫在合同中,如果延期了,則開發(fā)方要作出相應(yīng)的賠償。第二類是開發(fā)自己的軟件產(chǎn)品,雖然只確定了該產(chǎn)品大致的發(fā)行日期并允許有延誤,但如果拖延太久則會失去商機造成損失。
項目的資源分為三類:“人”、“可復(fù)用的軟構(gòu)件”和“軟硬件環(huán)境”。
(1)人是有價值的資源。項目計劃的制定者要確定開發(fā)人員的名單,要根據(jù)他們的專長進(jìn)行分工。
(2)可復(fù)用的軟構(gòu)件是次有價值的資源。軟構(gòu)件并非一定要用自己的,可以向?qū)I(yè)的軟件供應(yīng)商購買。
(3)軟硬件環(huán)境雖然不是重要的資源,卻是必需的資源。原則上軟硬件環(huán)境只要符合項目的開發(fā)要求即可。有些項目可能要用到特殊的設(shè)備,則要事先作好準(zhǔn)備,以免用時找不到而擔(dān)擱了進(jìn)程。
進(jìn)度安排
有一位程序員忙著編寫程序,經(jīng)理問他還需要多久才能完成。
“明天可以完成。”程序員立即回答。
“我想這是不切實際的,實話實說,到底還要多少時間?”經(jīng)理說。
“我還想加進(jìn)一些新的功能,這需要花兩個星期。”程序員想了一會兒說。
“即使這樣也期望過高了,只要你編完程序時告訴我一聲,我也滿足了。”經(jīng)理說。
幾年以后,經(jīng)理要退休了。在他去退休午餐會時,發(fā)現(xiàn)那位程序員正趴在機器旁睡覺:可憐的家伙整個晚上都在忙于編寫那個程序。[James 1999]
程序員也期望每天早晨能在7:00準(zhǔn)時起床,可老是一覺醒來到中午了。項目落后于進(jìn)度表乃是家常便飯,不必大驚小怪。以下一些事件經(jīng)常會導(dǎo)致項目被延誤:
(1)上級領(lǐng)導(dǎo)主管臆斷,制定了不現(xiàn)實的期限。項目經(jīng)理與程序員們被迫按照不合理的進(jìn)度表開展工作。
(2)客戶的需求發(fā)生了變化,但沒有對進(jìn)度表作出相應(yīng)的修改。
(3)低估了項目的規(guī)模與難度,導(dǎo)致投入的人力和物力不足。
(4)并未預(yù)見到存在難以克服的技術(shù)障礙。
(5)并未預(yù)見到開發(fā)人員會發(fā)生問題,如生病,辭職等等。
(6)開發(fā)人員之間不能很好的交流、協(xié)作,導(dǎo)致各階段任務(wù)難以如期完成。
所以寫進(jìn)程表不能象小學(xué)生寫決心書那樣充滿幻想。以下是一些有益的建議:
(1)制定進(jìn)度表的人好是項目負(fù)責(zé)人,他了解項目和開發(fā)人員。進(jìn)度表要經(jīng)過開發(fā)小組的討論,在得到大部數(shù)人的支持后才能實施。避免出現(xiàn)一廂情愿的局面。
(2)進(jìn)度安排并不見得一定要符合邏輯順序。應(yīng)盡可能地先做技術(shù)難度高的事,后做難度低的事。也是辛苦在前,輕松在后。
小時候我對一位老先生吃飯很感興趣:他總是先把一大盒的米飯吃光了,然后再幸福地品嘗一小盒菜。父母告訴我這是中國的傳統(tǒng)美德,叫“先苦后甜”。從此我銘記在心,按此道理去學(xué)習(xí)和工作?扇缃裨陲埖昀铮藗兛偸窍劝巡顺酝炅,后才吃點米飯。天哪,生活真是太復(fù)雜了,我究竟該“先吃飯” 還是“先吃菜”?
(3)開發(fā)一個大的軟件項目,應(yīng)該將進(jìn)度表分為若干個里程碑。一個里程碑之內(nèi)的多個任務(wù)可以同步進(jìn)行。程序員極容易沉迷于技術(shù),要么樂不思蜀,要么焦頭爛額。里程碑象心靈的燈塔,使忙碌的人群不混亂,不迷失方向。
(4)進(jìn)度表中必須留有緩沖時間,并將緩沖時間用到不確定的事情上。因為人們對即將要做的事情知之甚少,所以要留一些時間以防不測。Microsoft公司的一些開發(fā)小組甚至制定了“50% 緩沖規(guī)則”[Cusumano 1996]。對許多項目經(jīng)理而言,容忍進(jìn)度表中存在緩沖時間,不啻為觀念上的一個飛躍。
(5)如果發(fā)現(xiàn)項目應(yīng)交付的期限非常不合理,要跟領(lǐng)導(dǎo)或跟客戶據(jù)理力爭,請求放寬期限、調(diào)整進(jìn)度。當(dāng)客戶的需求發(fā)生變化時,要對進(jìn)度表作出相應(yīng)的修正。不要覺得修改進(jìn)度表很困難很麻煩,不修改才會產(chǎn)生真真的麻煩。很多人認(rèn)為戒煙很困難,但馬克·吐溫曾說:“戒煙很容易,我一年戒幾十次。”
零缺陷質(zhì)量管理的觀念
“零缺陷”質(zhì)量管理的觀念來源于一些國際上的硬件生產(chǎn)廠商。盡管軟件的開發(fā)與硬件生產(chǎn)有極大的差別,但我們?nèi)钥梢詮?ldquo;零缺陷”質(zhì)量管理中得到啟迪。“零缺陷”質(zhì)量管理至少有兩個核心內(nèi)容:一是高目標(biāo),二是可執(zhí)行的規(guī)范。
高目標(biāo)
人在做一件事情時,由于存在很多不確定的因素,一般不可能 地達(dá)到目標(biāo)。假設(shè)平常人做事能完成目標(biāo)的80%。如果某個人的目標(biāo)是100分,那么他終成績可達(dá)80分。如果某個人的目標(biāo)只是60分,那么他終成績只有48分。我們在考場上身經(jīng)百戰(zhàn),很清楚那些只想混及格的學(xué)生通常都不會及格,那些想得高分的學(xué)生也常為自己的失誤而捶胸頓足。
做一個項目通常需要多個人的協(xié)作。假設(shè)項目的總質(zhì)量(高為1)是十個開發(fā)人員的工作質(zhì)量之積。如果每個人的質(zhì)量目標(biāo)是0.95,那么十個人的累積質(zhì)量不會超過0.19。如果每個人的質(zhì)量目標(biāo)是0.9分,那么十個人的累積質(zhì)量不會超過0.03。只有每個人都做到1,項目總質(zhì)量才會是1。
如果沒有高目標(biāo),人的墮落很快。如果沒有“零缺陷”的質(zhì)量目標(biāo),也許缺陷會成堆。
可執(zhí)行的規(guī)范
實現(xiàn)100分顯然比實現(xiàn)80分要付出更多的努力。“零缺陷”質(zhì)量目標(biāo)不是隨心所欲提出來的,做得到才有意義。實現(xiàn)高目標(biāo)需要一套可執(zhí)行的規(guī)范來保證。
50年代末,掀起了“浮夸風(fēng)”。為了實現(xiàn)畝產(chǎn)數(shù)萬斤推廣各種方法,害得鬧饑荒。想不到有數(shù)千年種糧經(jīng)驗的幾億中國農(nóng)民這么整齊地栽倒了。
好規(guī)范必須是本企業(yè)有能力執(zhí)行的。一個普通企業(yè)照搬企業(yè)的規(guī)范未必行得通。軟件工程的規(guī)范很容易從書籍中找到,但有了這些規(guī)范并不表明能把軟件做好。國內(nèi)很多軟件公司根本沒有條件去執(zhí)行業(yè)界推薦的軟件工程規(guī)范。社會主義初級階段的“草”與發(fā)達(dá)資本主義的“苗”的確有不同的培育方式。
軟件是如此的靈活,如果沒有規(guī)范來制約,容易因無序的喜好而導(dǎo)致混沌;但規(guī)范如果太嚴(yán)密了,會扼殺程序員生機勃勃的創(chuàng)造力。制定軟件規(guī)范是進(jìn)退兩難的事。程序員必須深入了解軟件多方面的質(zhì)量因素,把那些能提高軟件質(zhì)量因素的各種規(guī)范植入腦中,才能在各個實踐環(huán)節(jié)自然而然地把高質(zhì)量設(shè)計到軟件中。
軟件的質(zhì)量因素
“運行正確”的程序是高質(zhì)量的程序嗎?
不貪污的官是好官嗎?
時下老百姓對一些腐敗的地方政府深痛惡絕,對“官”不再有質(zhì)量期望。只要當(dāng)官的不貪污,哪怕毫無政績,也算是“好官”。也有一些精明的老百姓打出旗號:寧要貪污犯,不要大笨蛋。相比之下,程序員是夠幸福的了。因為我們能通過努力,由自己來把握軟件的命運。那么不要輕易放棄提高軟件質(zhì)量的權(quán)利了。
“運行正確”的程序不見得是高質(zhì)量的程序。這個程序也許運行速度很低并且浪費內(nèi)存;也許代碼寫得一塌糊涂,除了開發(fā)者本人誰也看不懂也不會使用。正確性只是反映軟件質(zhì)量的一個因素而已。
軟件的質(zhì)量因素很多,如正確性、精確性、可靠性、容錯性、性能、效率、易用性、可理解性、簡潔性、可復(fù)用性、可擴(kuò)充性、兼容性等等(還可以列出十幾個)。這些質(zhì)量因素之間“你中有我,我中有他”,非常纏綿。如果程序員每天要面對那么多質(zhì)量因素咬文嚼字,不久會迂腐得象孔乙已,并且有找不到女朋友的危險。
正確性與精確性
正確性與精確性之所以排在質(zhì)量因素的第一位,是因為如果軟件運行不正確或者不精確,會給用戶造成不便甚至造成損失。機器不會主動欺騙人,軟件運行不正確或者不精確一般都是人造成的。即使一個軟件能 地按需求規(guī)格執(zhí)行,但是如果需求分析錯了,那么對客戶而言這個軟件也存在錯誤。即使需求分析完全符合客戶的要求,但是如果軟件沒有 地按需求規(guī)格執(zhí)行,那么這個軟件也存在錯誤。開發(fā)一個大的軟件項目,程序員要為“正確”、“精確”四個字竭盡精力。