很多項(xiàng)目經(jīng)理對(duì)于項(xiàng)目評(píng)估、管理、控制的能力基本上是來自于項(xiàng)目經(jīng)理本身的從業(yè)經(jīng)驗(yàn),由于各種各樣的原因,項(xiàng)目經(jīng)理更多的是一個(gè)全才,這是在當(dāng)前環(huán)境下,保證項(xiàng)目還能正常運(yùn)行的必然結(jié)果。在實(shí)際情況中,項(xiàng)目不但耗時(shí)長(zhǎng),而且成功率也很低,其中一個(gè)很重要的原因是對(duì)于需求的工作量評(píng)估沒有一個(gè)具體的依據(jù),很多時(shí)候都是想當(dāng)然的估算一個(gè)數(shù)字,當(dāng)項(xiàng)目開發(fā)過程中來自于需求變更后對(duì)新需求的工作量估計(jì)不足導(dǎo)致產(chǎn)生連鎖反應(yīng),后失去對(duì)項(xiàng)目的控制。
本文的目的在于提出一種對(duì)項(xiàng)目總體工作量估算的模型,用于項(xiàng)目經(jīng)理在面對(duì)原始合同進(jìn)行概要設(shè)計(jì),項(xiàng)目進(jìn)行過程中面對(duì)需求變更時(shí)計(jì)算工作量的一種參考依據(jù)。這個(gè)模型的目的是要有效的減少工作量,這并不意味著會(huì)少做事,而是希望引導(dǎo)多做正確的事情。特別是這個(gè)模型也能為提高工作效率指明方向。
要設(shè)計(jì)一個(gè)模型,首先要對(duì)日常工作進(jìn)行全面的分析,抽象出工作的每一個(gè)步驟,對(duì)每個(gè)步驟中所需要用到的知識(shí)進(jìn)行歸納,還需要對(duì)每個(gè)步驟中的復(fù)雜度進(jìn)行評(píng)估。
在一個(gè)項(xiàng)目的開發(fā)過程中,在面對(duì)一個(gè)業(yè)務(wù)功能時(shí)首先做的是從需求中設(shè)計(jì)表結(jié)構(gòu),然后為表結(jié)構(gòu)定義各種各樣的關(guān)聯(lián),定義完關(guān)聯(lián)后基本上在大腦內(nèi)形成界面的大致樣子,然后開始寫代碼。
從上面的過程中,大致可以分成下面的兩個(gè)步驟:
1. 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)階段
2. 根據(jù)數(shù)據(jù)結(jié)構(gòu)編寫代碼階段
接下來分析下每個(gè)步驟所用到的知識(shí)。
1. 在數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)階段所使用的知識(shí)分為以下幾個(gè)部分
1) 數(shù)據(jù)庫設(shè)計(jì)知識(shí)
2) 業(yè)務(wù)知識(shí)
2. 在根據(jù)數(shù)據(jù)結(jié)構(gòu)編寫代碼階段所使用的知識(shí)分為以下幾個(gè)部分
1) 數(shù)據(jù)庫操作知識(shí)
2) 后臺(tái)編程語言知識(shí)
3) 前臺(tái)編程語言知識(shí)
4) 業(yè)務(wù)知識(shí)
通過以上的分析可以看到,在第一個(gè)階段所需知識(shí)單一,更多的源自于經(jīng)驗(yàn)。由于所使用知識(shí)比少,當(dāng)需求產(chǎn)生變化時(shí),為變化所花費(fèi)的時(shí)間也比較少。因此可以得出一個(gè)簡(jiǎn)單的結(jié)論,當(dāng)某一個(gè)步驟所需知識(shí)比較單一時(shí),對(duì)該步驟的變更和編碼所需時(shí)間都比較少。
那么可以看到在第二個(gè)階段,所用知識(shí)復(fù)雜,所以必須要對(duì)第二階段進(jìn)行細(xì)分
在第二階段,通常的做法是,根據(jù)業(yè)務(wù)功能,首先編寫關(guān)于這個(gè)業(yè)務(wù)表的增刪改的代碼,再根據(jù)表之間的關(guān)系寫出數(shù)據(jù)關(guān)系代碼,后根據(jù)設(shè)計(jì)的界面樣式,編寫界面代碼
在這個(gè)階段也分成以下幾個(gè)步驟
1. 編寫單表的維護(hù)代碼
2. 編寫該表與其他表的業(yè)務(wù)關(guān)系代碼
3. 編寫界面代碼
同樣的,再來分析下每個(gè)步驟所使用的知識(shí)
1. 在編寫單表的維護(hù)代碼所使用的知識(shí)分為以下幾個(gè)部分
1) 數(shù)據(jù)庫單表操作知識(shí)
2) 后臺(tái)編程語言知識(shí),僅需要知道如何操作數(shù)據(jù)庫
3) 業(yè)務(wù)知識(shí)
2. 在編寫該表與其他表的業(yè)務(wù)關(guān)系代碼所使用的知識(shí)分為以下幾個(gè)部分
1) 數(shù)據(jù)庫多表查詢知識(shí)
2) 后臺(tái)編程語言,這里是根據(jù)業(yè)務(wù)的復(fù)雜度來決定所使用的知識(shí)范圍。
3) 業(yè)務(wù)知識(shí)
3。在編寫界面代碼所使用的知識(shí)分為以下幾個(gè)部分
1) html知識(shí)
2) javascript知識(shí)
3) css知識(shí)
4) 后臺(tái)編程語言,僅使用到與前臺(tái)界面編寫相關(guān)的部分知識(shí)。
5) 業(yè)務(wù)知識(shí)
通過以上分析可以看到,在編寫單表的維護(hù)代碼階段是使用知識(shí)少的一個(gè)步驟,同樣的當(dāng)業(yè)務(wù)產(chǎn)生變更時(shí),為該處的變化所用的編碼時(shí)間也比較少,而變化所花費(fèi)的時(shí)間與表結(jié)構(gòu)的調(diào)整所花費(fèi)的時(shí)間是正比關(guān)系。這個(gè)關(guān)系將在復(fù)雜度分析時(shí)進(jìn)一步說明。接下來看編寫該表與其他表的業(yè)務(wù)關(guān)系代碼和編寫界面代碼部分,這個(gè)2個(gè)階段所使用的知識(shí)繁多,并且涉及的知識(shí)面也很廣,是項(xiàng)目中花費(fèi)時(shí)間多的地方。但是在實(shí)際項(xiàng)目開發(fā)中并沒有再對(duì)這兩個(gè)步驟進(jìn)行更細(xì)的分解的過程。
現(xiàn)在可以得出一個(gè)這樣的結(jié)論,工作量是與所使用的知識(shí)相關(guān)的。一個(gè)業(yè)務(wù)所使用的知識(shí)點(diǎn)越少,所涵蓋的知識(shí)面越少,那么所耗費(fèi)的工作量也會(huì)越少。由此,當(dāng)需要提高工作效率時(shí),盡量少的使用知識(shí)是一種有效的手段。但是在實(shí)際情況中,并不能有效的減少知識(shí)使用種類,只能在使用知識(shí)的熟練度上下工夫,一個(gè)開發(fā)者所掌握的知識(shí)熟練度越高,那么相對(duì)的工作量也會(huì)越少,一個(gè)知識(shí)點(diǎn)的入門門檻越低,那么工作量也會(huì)越少。因此,設(shè)置工作量為G,知識(shí)點(diǎn)入門門檻為B,B1為交給新手人員開發(fā)的知識(shí)點(diǎn),知識(shí)點(diǎn)總數(shù)為C,P1為高級(jí)開發(fā)人數(shù)的,P2為新手人數(shù),那么G = ( C - B )/P1 + ( B - B1 ) / P1 + B1 / P2 。
對(duì)知識(shí)點(diǎn)分析完后,再對(duì)業(yè)務(wù)的復(fù)雜度進(jìn)行分析,知識(shí)點(diǎn)的應(yīng)用可以看作是開發(fā)中的橫切方向的話,那業(yè)務(wù)的復(fù)雜度是開發(fā)中的縱切方向,業(yè)務(wù)的復(fù)雜度貫穿了所有的開發(fā)步驟。
在本文中,從數(shù)據(jù)的應(yīng)用著手,來分析業(yè)務(wù)的復(fù)雜度。
在項(xiàng)目開發(fā)中,經(jīng)常要遇到"類型"這樣的業(yè)務(wù)點(diǎn),例如職務(wù)。對(duì)于這一類業(yè)務(wù),其主要開發(fā)時(shí)間花費(fèi)在"對(duì)于單表的增刪改查"上。另一種類型的業(yè)務(wù),其復(fù)雜度高一點(diǎn),主要應(yīng)用于該表需要與另一個(gè)表進(jìn)行組合,然后產(chǎn)生一種"所屬"的關(guān)系,例如權(quán)限,角色等,其主要開發(fā)時(shí)間花費(fèi)在"對(duì)于多個(gè)表的所屬關(guān)系的增刪改查"上。還有一種類型的業(yè)務(wù),主要是將多個(gè)表的數(shù)據(jù)進(jìn)行組合轉(zhuǎn)換后輸出,例如報(bào)表,CMS的模板解析等,其主要開發(fā)時(shí)間花費(fèi)在"對(duì)于多個(gè)表數(shù)據(jù)的監(jiān)測(cè)和重組上",后一種類型的業(yè)務(wù),主要是為數(shù)據(jù)附加上狀態(tài),例如工作流等,其主要開發(fā)時(shí)間花費(fèi)在"對(duì)于數(shù)據(jù)的不同狀態(tài)的處理上"。
以上4點(diǎn)基本涵蓋了做項(xiàng)目時(shí)所面對(duì)的業(yè)務(wù)。接下來,我們?yōu)檫@4種業(yè)務(wù)定一個(gè)權(quán)值
1.對(duì)于單表的增刪改查"權(quán)值為1
2.對(duì)于多個(gè)表的所屬關(guān)系的增刪改查"權(quán)值為4
3.對(duì)于多個(gè)表數(shù)據(jù)的監(jiān)測(cè)和重組上"權(quán)值為8
4.對(duì)于數(shù)據(jù)的不同狀態(tài)的處理上"權(quán)值為16
這個(gè)權(quán)值的比值基本來自于數(shù)據(jù)的維度,1類業(yè)務(wù)是單一緯度。2類業(yè)務(wù)除了要處理多個(gè)1類業(yè)務(wù)外,還需要處理多個(gè)1類業(yè)務(wù)之間的關(guān)系。3類業(yè)務(wù)除了要處理2類業(yè)務(wù)中包含的,還需要對(duì)數(shù)據(jù)本身進(jìn)行轉(zhuǎn)換處理,4類業(yè)務(wù)除了要處理3類業(yè)務(wù)的,還需要處理數(shù)據(jù)的狀態(tài)。后一種業(yè)務(wù)要比前一種業(yè)務(wù)多處理一種邏輯結(jié)構(gòu)。
根據(jù)這個(gè)權(quán)值,來看看在項(xiàng)目中經(jīng)常遇到的情況,以職務(wù)為例,開始的需求是1類業(yè)務(wù),這個(gè)時(shí)候客戶的需求變更可能如果制在1類業(yè)務(wù)的需求范圍內(nèi),那么如果完成職務(wù)的業(yè)務(wù)開發(fā)時(shí)間為1的話,那么修改的時(shí)間應(yīng)該在<=1的開發(fā)時(shí)間內(nèi)。但是,這個(gè)時(shí)候客戶提出一種需求變更,他要求,職務(wù)是有從屬關(guān)系的,例如A部門有屬于A部門的職務(wù),B部門有屬于B部門的職務(wù),當(dāng)這類需求出現(xiàn)時(shí),那么開發(fā)完成的時(shí)間必須提高到4了,從這一種變化可以看出,當(dāng)需求變更在某一個(gè)級(jí)別的分類業(yè)務(wù)內(nèi)進(jìn)行變化時(shí),其所完成的單位時(shí)間是與權(quán)值成正比關(guān)系。但是如果需求變更導(dǎo)致該業(yè)務(wù)的分類級(jí)別被提升,那么修改所花費(fèi)的時(shí)間將直接提高到對(duì)應(yīng)業(yè)務(wù)分類的權(quán)值所對(duì)應(yīng)的時(shí)間比。
假設(shè)工作量為G,權(quán)值為D那么G=D(D=1,4,8,16)。再結(jié)合前面關(guān)于知識(shí)點(diǎn)的分析結(jié)果,G = D_*( ( C - B )/P1 + ( B - B1 ) / P1 + B1 / P2 ) ( D = 1 , 4 , 8 , 16 )
公式的完全說明如下:
G = D_*( ( C - B )/P1 + ( B - B1 ) / P1 + B1 / P2 ) ( D = 1 , 4 , 8 , 16 )
G : 工作量
D : 業(yè)務(wù)復(fù)雜度( D = 1 , 4 , 8 , 16 )
C : 知識(shí)點(diǎn)總量
B : 入門知識(shí)點(diǎn)總量
B1 : 交給新手人員做的入門知識(shí)點(diǎn)總量
P1 : 高級(jí)開發(fā)人員數(shù)量
P2 : 新手開發(fā)人員數(shù)量
( C - B ) / P1 : 意思是只能由高級(jí)開發(fā)人員做的事情
( B - B1 ) / P1 : 意思是由高級(jí)開發(fā)人員做的只需要入門門檻知識(shí)能做的事情
B1 / P2 : 意思是由新手人員做的需要入門門檻知識(shí)做的事情
從這個(gè)公式可以看出D值越小,C值越小,B值趨向于C值,B1值趨向于B值時(shí),工作量是小的。要想D值小,那么在做需求和需求變更時(shí)要引導(dǎo)客戶避免高權(quán)值的需求產(chǎn)生。要想C值小,讓開發(fā)者只面對(duì)少量知識(shí)點(diǎn),是分層開發(fā),每一層的知識(shí)點(diǎn)將足夠的小。要想B值趨向于C值,必須使用框架來進(jìn)行開發(fā),要想B1趨向于B值,應(yīng)該避免讓僅需入門門檻知識(shí)能應(yīng)付的需求讓高級(jí)開發(fā)人員來做。
希望這個(gè)模型能為項(xiàng)目經(jīng)理在面對(duì)需求和需求變更時(shí)提供指導(dǎo)意義,使得在對(duì)工作量估算時(shí)有據(jù)可循。