前言
軟件開(kāi)發(fā)項(xiàng)目計(jì)劃為項(xiàng)目管理服務(wù)的,本文用項(xiàng)目管理的眼光去看待項(xiàng)目計(jì)劃的內(nèi)容。應(yīng)用本文的方法制定的項(xiàng)目計(jì)劃可以:
1. 讓項(xiàng)目的時(shí)間、成本、進(jìn)度的估算可以通過(guò)簡(jiǎn)易的公式進(jìn)行一次性計(jì)算得到
2. 讓不了解項(xiàng)目實(shí)現(xiàn)技術(shù)的人,如客戶、投資者、管理者及愿意了解項(xiàng)目的人員很容易地了解項(xiàng)目的時(shí)間、成本、進(jìn)度的狀態(tài)及其完工估算
3. 讓項(xiàng)目工作量的分配更具體、更客觀,對(duì)成員的績(jī)效表現(xiàn)顯而易見(jiàn)
4. 使項(xiàng)目之間的工作績(jī)效具有可比性
實(shí)例
一般情況下我們的項(xiàng)目計(jì)劃是這樣的:
1. 第一層是項(xiàng)目開(kāi)發(fā)的實(shí)際階段
2. 第二層是所在階段的工作
3. 第三層是對(duì)較大工作量的工作做進(jìn)一步分解
問(wèn)題
這樣的計(jì)劃有以下幾個(gè)缺點(diǎn):
1. 不適應(yīng)迭代開(kāi)發(fā)的工作模式。多數(shù)應(yīng)用軟件的開(kāi)發(fā)不是純粹“瀑布開(kāi)發(fā)模型”,當(dāng)?shù)竭_(dá)后面的階段時(shí),不可避免的發(fā)現(xiàn)以前階段的工作沒(méi)有真正完成,需要繼續(xù)進(jìn)行。例如,設(shè)計(jì)階段時(shí),極有可能會(huì)發(fā)現(xiàn)分析需求階段中漏了一個(gè)功能沒(méi)有考慮進(jìn)去,以致分析需求階段沒(méi)有真正完成而需要繼續(xù)。
2. 計(jì)劃的實(shí)際執(zhí)行數(shù)據(jù)不能作為項(xiàng)目的完成估算的依據(jù)。 比如調(diào)研和需求確認(rèn)階段完成時(shí),依據(jù)該階段的實(shí)際執(zhí)行數(shù)據(jù)不能預(yù)知項(xiàng)目將在什么時(shí)間結(jié)束,在什么成本范圍完成。有以下幾個(gè)原因:
1) 階段本身的界限是不清晰的
2) 階段之間的時(shí)間、成本、進(jìn)度的分配關(guān)系并不確定
3. 這些估算數(shù)據(jù)難以被以后的開(kāi)發(fā)計(jì)劃所借鑒。當(dāng)一個(gè)項(xiàng)目或一個(gè)階段結(jié)束后,我們總會(huì)想在這個(gè)已執(zhí)行完成的計(jì)劃的上面得到一點(diǎn)關(guān)于估算方面的經(jīng)驗(yàn)或教訓(xùn),如:
1) 這個(gè)項(xiàng)目的總開(kāi)發(fā)成本與其他項(xiàng)目相比,是多了還是少了?
2) 設(shè)計(jì)分析階段的時(shí)間分是不是不與項(xiàng)目的需求不匹配?
3) 哪個(gè)階段的成本分配有問(wèn)題?
4) 各項(xiàng)工作的平均時(shí)間合不合適?
按上面的計(jì)劃,我們不能夠很好的回答這些問(wèn)題,是因?yàn)檫@個(gè)計(jì)劃是按階段來(lái)劃分的,實(shí)際工作中,這些階段的界限并不明顯,無(wú)法得到準(zhǔn)確的數(shù)據(jù)。
4. 當(dāng)需求變更時(shí),不知把這些變更的工作放入項(xiàng)目計(jì)劃的哪個(gè)階段。因?yàn)檫@些變更往往包含了很多的階段。有人建議把它們放到一個(gè)叫做“需求變更”的特殊階段中,但這些變更是不可預(yù)知的,它幾乎分布到項(xiàng)目的整個(gè)開(kāi)發(fā)過(guò)程中,我們又如何在計(jì)劃是反應(yīng)它們呢?
實(shí)際過(guò)程
在介紹本文的方法以前,了解RUP(rational unified process) 的朋友,知道軟件開(kāi)發(fā)過(guò)程并不是我們想象的如此簡(jiǎn)單。它告訴我們?cè)谕粋€(gè)時(shí)間內(nèi)所有的開(kāi)發(fā)階段是有可能共存的。也是說(shuō)整個(gè)開(kāi)發(fā)過(guò)程可以是多個(gè)迭代同時(shí)進(jìn)行。
我們回顧一下日常的開(kāi)發(fā)過(guò)程:
1. 得知有一個(gè)項(xiàng)目需要開(kāi)發(fā)。有可能是老板告訴你的,也可能是業(yè)務(wù)部門(mén)告訴你的,總之我們要為它而工作了,同時(shí)確信老板同意開(kāi)始這個(gè)項(xiàng)目
2. 對(duì)這個(gè)項(xiàng)目涉及的人員及其需求進(jìn)行調(diào)查。這里的需求包括了所有項(xiàng)目的需求,比如老板對(duì)這個(gè)項(xiàng)目的要求及期望,用戶對(duì)這個(gè)項(xiàng)目的期望,開(kāi)發(fā)人員對(duì)這個(gè)項(xiàng)目的期望。這時(shí),我們很快會(huì)發(fā)現(xiàn),調(diào)查所有人是不可能的,調(diào)查所有需求也是不可能的。因此,
1) 我們會(huì)先找?guī)讉€(gè)關(guān)鍵人物,了解他們的期望,確定系統(tǒng)的邊界(或叫輪廓,XP(Extreme Programming)中把它叫系統(tǒng)隱喻);
2) 再把系統(tǒng)劃分為幾個(gè)部分,確定先做哪個(gè)部分后做哪個(gè)部分;
3) 再一個(gè)一個(gè)部分對(duì)需求進(jìn)行調(diào)查
當(dāng)我們?cè)谡{(diào)查的時(shí)候,常常會(huì)發(fā)現(xiàn)新的部分之間的關(guān)聯(lián),這使我們不得不對(duì)這兩個(gè)部分的內(nèi)容進(jìn)行檢查,加的加,改的改,刪的刪。
3. 基于調(diào)查的結(jié)果進(jìn)行設(shè)計(jì)。這個(gè)時(shí)間,我們經(jīng)過(guò)對(duì)這些需求的分析、歸類,設(shè)計(jì)一個(gè)開(kāi)發(fā)的模型以支持這些需求。設(shè)計(jì)時(shí)也免不了會(huì)發(fā)現(xiàn)需求不對(duì)的地方,對(duì)需求進(jìn)行加的加,改的改,刪的刪。
4. 基于設(shè)計(jì)的結(jié)果進(jìn)行編碼、集成。也免不了會(huì)發(fā)現(xiàn)設(shè)計(jì)、需求不對(duì)的地方,對(duì)需求進(jìn)行加的加,改的改,刪的刪。
5. 基于編碼的結(jié)果進(jìn)行測(cè)試,以驗(yàn)證軟件是否達(dá)到了需求。我們常常發(fā)現(xiàn)這時(shí)的需求與設(shè)計(jì)之前的需求已有了很大的變化。
6. 發(fā)布(部署)產(chǎn)品,進(jìn)行項(xiàng)目收尾。
如果某一時(shí)間,客戶要知道項(xiàng)目進(jìn)行到哪了,我們告訴他設(shè)計(jì)已完成,正進(jìn)行編碼工作。當(dāng)有需求變更時(shí),相關(guān)的需求、設(shè)計(jì)又要來(lái)過(guò)??蛻裟懿粦岩晌覀兊幕卮鹈??
解決方法
做過(guò)軟件開(kāi)發(fā)的人就會(huì)知道,上面的過(guò)程描述中有很大的問(wèn)題。我們的做過(guò)程并沒(méi)有錯(cuò),一個(gè)一個(gè)需求,一個(gè)一個(gè)功能的實(shí)現(xiàn),有變更時(shí)就一個(gè)一個(gè)變更的實(shí)現(xiàn),大家都這樣做,也只有這樣做。對(duì)于一個(gè)應(yīng)用軟件項(xiàng)目來(lái)講,而不太可能真正的按軟件書(shū)上寫(xiě)的過(guò)程一個(gè)一個(gè)過(guò)程的做下去,集中10天做完所有的需求,集中20天內(nèi)做完所有設(shè)計(jì)。
做的過(guò)程沒(méi)有錯(cuò),把過(guò)程描述出來(lái),為什么就錯(cuò)了?原因很簡(jiǎn)單:我們?cè)诿枋鰰r(shí),總喜歡套用一些“模式”,一些書(shū)寫(xiě)的“方法”,而不是按實(shí)際的過(guò)程描述。如果我們不套用任何模式,將會(huì)如何呢?我們?cè)賮?lái)描述一遍上面的過(guò)程:
1. 了解軟件項(xiàng)目的故事(story)。開(kāi)始一個(gè)軟件應(yīng)用項(xiàng)目,了解關(guān)鍵人物都有哪些?他們要求是一個(gè)什么樣的系統(tǒng)?把這些要求描述成一個(gè)一個(gè)的故事,如果稍稍規(guī)范一點(diǎn)。就會(huì)象這樣:
1) 這個(gè)系統(tǒng)的目標(biāo)是為了誰(shuí)解決什么問(wèn)題
2) 第一步做什么,系統(tǒng)反饋什么
3) 第二步做什么,系統(tǒng)反饋什么
4) …
5) 問(wèn)題解決了,結(jié)束本故事
我們會(huì)仔細(xì)的看這些故事,發(fā)現(xiàn)有些地方看不懂,于是我們就去問(wèn)清楚,有些事情是那個(gè)描述故事的A也不清楚的,但A告訴我們B會(huì)懂,于是我就問(wèn)B;有些事情A也不知道有誰(shuí)會(huì)知道,我們就把它放在一邊,等知道的時(shí)候再問(wèn),繼續(xù)看其他的故事。
2. 了解系統(tǒng)隱喻,構(gòu)造軟件框架。永遠(yuǎn)也問(wèn)不清楚所有的事情,所以當(dāng)我們知道整個(gè)系統(tǒng)的是為了解決什么問(wèn)題,將用什么辦法來(lái)解決它(暫時(shí)叫做系統(tǒng)隱喻),關(guān)鍵人物也認(rèn)可時(shí),我們就不再問(wèn)下去了。我們依據(jù)這個(gè)系統(tǒng)隱喻去構(gòu)造一個(gè)最上面的故事。然后,只關(guān)心與這個(gè)故事有關(guān)的故事。同時(shí)構(gòu)造一個(gè)程序框架以支持項(xiàng)目的開(kāi)發(fā)
3. 實(shí)現(xiàn)故事。在軟件框架上,實(shí)現(xiàn)一個(gè)故事,再實(shí)現(xiàn)一個(gè)故事,…
4. 實(shí)現(xiàn)變更。有時(shí)發(fā)現(xiàn)事情并沒(méi)有想象的簡(jiǎn)單,于是就變更它,這就要求我們實(shí)現(xiàn)這些次變更。它象實(shí)現(xiàn)故事一樣:實(shí)現(xiàn)一次變更,再實(shí)現(xiàn)一次變更,…
5. 部署軟件。感覺(jué)軟件已達(dá)到了可被接受的預(yù)想或合適的要求了,就發(fā)布這個(gè)軟件。
上面所說(shuō)的故事就是我們常說(shuō)的用例(use case)。我們可以使用用例的形式來(lái)描述整個(gè)系統(tǒng)的計(jì)劃內(nèi)容,并計(jì)算它的工作量,為工作之間、項(xiàng)目之間的績(jī)效提供一個(gè)統(tǒng)一的衡量標(biāo)準(zhǔn)。
這時(shí),我們發(fā)現(xiàn):
1. 由故事(有些項(xiàng)目可以用故事所包含的步驟)的數(shù)量可計(jì)算出開(kāi)發(fā)的工作量
2. 我們實(shí)際開(kāi)發(fā)工作過(guò)程的時(shí)間、成本、進(jìn)度是可以被不了解項(xiàng)目實(shí)現(xiàn)技術(shù)的人所感知的
如果我們仔細(xì)查看項(xiàng)目的所有工作,會(huì)發(fā)現(xiàn)有些工作不是基于某個(gè)用例的,也與某些用例沒(méi)有直接關(guān)系,如何拿用例來(lái)計(jì)算它的工作量呢?在項(xiàng)目的開(kāi)發(fā)中確定存在這些工作,如項(xiàng)目開(kāi)始時(shí)的“了解軟件項(xiàng)目的故事”。但通過(guò)分析知道,在一個(gè)軟件項(xiàng)目中頂層用例的數(shù)量是不難預(yù)測(cè)的,也是說(shuō)在這個(gè)時(shí)期要向關(guān)鍵人了解的用例數(shù)是可以預(yù)測(cè)的。我們不難發(fā)現(xiàn),要了解的用例數(shù)越多,需求了解的工作量就越大。在相同類型的應(yīng)用軟件開(kāi)發(fā)中,需求了解的工作量與用例數(shù)量的比例是基本一致的。同理,了解系統(tǒng)隱喻,構(gòu)造軟件框架、部署軟件的工作量與用例的量也是成比例的。
在沒(méi)有不熟習(xí)技術(shù)的前提下,根據(jù)本人的經(jīng)驗(yàn),同類軟件項(xiàng)目的工期與底層用例數(shù)或步驟數(shù)有著可計(jì)算的關(guān)系,如WEB應(yīng)用軟件中,一個(gè)底層故事的開(kāi)發(fā)時(shí)間大約為1.5個(gè)人日。這個(gè)是經(jīng)驗(yàn)數(shù)據(jù),在不同的公司可能有所不同。網(wǎng)上也有文章證明不同規(guī)模的應(yīng)用軟件,故事與程序代碼的行數(shù)有一定的計(jì)算關(guān)系。這樣我們的不同項(xiàng)目,或同一項(xiàng)目的不同故事之間,在時(shí)間、成本、進(jìn)度上就具有了可比性。
同時(shí),我們發(fā)現(xiàn):
3. 讓項(xiàng)目的時(shí)間、成本、進(jìn)度的估算可以通過(guò)簡(jiǎn)易的公式進(jìn)行一次性計(jì)算得到
4. 讓項(xiàng)目工作量的分配更具體、更客觀,對(duì)成員的績(jī)效表現(xiàn)顯而易見(jiàn)
5. 使項(xiàng)目之間的工作績(jī)效具有可比性
要注意的問(wèn)題
1. 在不同層次上的用例有著不一樣的工作量比例,一定要分清。比如WEB應(yīng)用軟件的用例可以這樣劃分:
用例層次 對(duì)應(yīng)系統(tǒng)的對(duì)象
頂層 項(xiàng)目,如網(wǎng)上商城
上層 子系統(tǒng),如網(wǎng)上商城\用戶管理
中層 流程,如網(wǎng)上商城\用戶管理中\注冊(cè)流程
底層 頁(yè)面,如網(wǎng)上商城\用戶管理中\注冊(cè)流程\第一個(gè)頁(yè)面
2. 這種用例與工作量的比例關(guān)系,是建立一定量的基礎(chǔ)之上的,比如20個(gè)以上才有這個(gè)比例關(guān)系。對(duì)于一般應(yīng)用軟件的計(jì)劃及績(jī)效的計(jì)算是合適的,但對(duì)于個(gè)例是不適用的,不能憑這個(gè)比例來(lái)衡量某幾個(gè)用例的工作量。
總結(jié)
好了,下面總結(jié)一下本文方法的實(shí)現(xiàn)步驟:
1. 了解軟件項(xiàng)目的故事。從項(xiàng)目關(guān)鍵人物那了解到系統(tǒng)的主要故事有哪些,并力求描述清楚
2. 了解系統(tǒng)隱喻,構(gòu)造軟件框架
3. 實(shí)現(xiàn)故事。先實(shí)現(xiàn)頂層故事;再一個(gè)一個(gè)故事實(shí)現(xiàn)
4. 故事變更。實(shí)現(xiàn)一次變更,再實(shí)現(xiàn)一次變更,…
5. 部署軟件
【?發(fā)表評(píng)論?0條?】