項目開發(fā)經(jīng)驗談
作者: 來源: 文字大小:[大][中][小]
一、項目過程
根據(jù)我們項目出現(xiàn)的問題,我自己的總結(jié)的一些經(jīng)驗以及我在培訓(xùn)中學(xué)習(xí)得知識總結(jié)下項目中遇到的問題和解決方案。
1.1 簽訂合同
我們項目的合同內(nèi)主要寫的很模糊,范圍可大可小,致使我們在后期的工作中項目越做越大,但是項目費用是不變的。在國內(nèi)的合同好像都是在打單時是基本上都承諾,也不會到細(xì)節(jié),在合同簽訂后啟動后才發(fā)現(xiàn)問題。但合同中可以寫明如果需求變更什么級別的怎么樣,多少錢等;簽訂合同也是一個很高的技巧,建議把系統(tǒng)的邊界及功能范圍和解決方案與合同一起簽署,這樣客戶提出的新功能就可以暫且擱置。
1.2 團(tuán)隊建設(shè)
在立項后盡早確定該項目的負(fù)責(zé)人及項目經(jīng)理,這個人員非常關(guān)鍵,需要很強(qiáng)的綜合能力,尤其的人格魅力方面。盡最大的努力將客戶的人員加入到我們的項目團(tuán)隊來,這個人也是我們將來和客戶的統(tǒng)一聯(lián)系人,客戶指定一個人和項目組進(jìn)行溝通,不能是張領(lǐng)導(dǎo)、王領(lǐng)導(dǎo)都來說幾句,如果他們意見不一致,那你只有得罪領(lǐng)導(dǎo)的選擇了,所以,項目的最初就要定好規(guī)矩,項目組只認(rèn)一個的意見,有什么要求你們內(nèi)部先統(tǒng)一再和項目組談,我們不想卷入客戶內(nèi)部業(yè)務(wù)部門之間的矛盾和政治斗爭之中。很多項目經(jīng)理都沒有自己選擇組員的權(quán)利,那么,就盡量發(fā)揮你的影響力去尋找那些你想要的人吧。成員的組成根據(jù)項目不同,相差較大,很難有什么具體要求,但是,一定要有精通客戶業(yè)務(wù)的人,很多小項目里,這個人就是項目經(jīng)理本人,大項目里會配備行業(yè)專家(Industry expert),這樣和客戶溝通起來才不會雞同鴨講,雙方才可以相互理解。項目經(jīng)理需要了解每個組員的情況,用就要用每個員工的特長。軟件行業(yè)是個非常特殊的行業(yè),從項目的管理以及人員的管理都有它的特殊性。
作為項目經(jīng)理,其實腦子里就是幾樣?xùn)|西:做哪些事情、做到什么程度、怎么交貨、手上的資源以及各個事情的優(yōu)先級。所謂多快好省那是人類的夢想,這四個方面都是相互矛盾的,屬于典型的又要馬兒跑,又要馬兒不吃草的類型。考慮問題的輕重緩急方面,往往是把快放在第一位,各方領(lǐng)導(dǎo)都會給你最后期限,所以保進(jìn)度是第一位的;省是第二位的,企業(yè)的根本目的是盈利,如果收入不能增加的話,至少費用要控制住;好是第三位的,沒辦法,誰都想精益求精,但是,沒有強(qiáng)大的資源保障,質(zhì)量只好先犧牲了;最后是多,客戶的要求源源不斷,如何降低客戶的期望值,讓他們從理想回到現(xiàn)實也是項目經(jīng)理的分內(nèi)工作。
1.3 需求調(diào)研
在需求調(diào)研分析階段,項目組對客戶的整體組織結(jié)構(gòu)、有關(guān)人員及其關(guān)系、工作職責(zé)等沒有足夠了解以致于無法得到完整需求或最終經(jīng)權(quán)威用戶代表確認(rèn)的需求。由于項目經(jīng)理和需求分析員的工作問題以及調(diào)研工作做的不夠細(xì),客戶參與程度都不高,客戶方相關(guān)責(zé)任人不明確或?qū)Ψ秶托枨筘?zé)任心不強(qiáng),提出的需求具有隨意性,項目前期對需求的確認(rèn)不夠積極;多個用戶代表各說各話、昨是今非但同時又希望軟件盡早交付;我們的做法主要注重領(lǐng)導(dǎo)的需求,基本上都是領(lǐng)導(dǎo)說什么就是什么,致使開發(fā)出來的功能在實際使用中不是真正的使用人所需要的,項目后期需求變化隨意,造成項目范圍的蔓延,進(jìn)度的拖延,成本的擴(kuò)大。同時在我們的認(rèn)識中是需求調(diào)研很關(guān)鍵,很多公司只是概念上認(rèn)為該階段重要,需要投入的時間長,但是實際上很多公司做不到這個,總想很快進(jìn)入編碼階段。而且為了趕進(jìn)度總想省做某些工作,少寫某些文檔,使我們無法拿出客戶需求以及后來功能變化和原先功能之間的對比度。
造成上述現(xiàn)象的原因是我們沒有全面了解所有項目干系人的需求以及對需求調(diào)研的重視程度不夠。軟件開發(fā)是沒有捷徑可以走的,省掉的工作后面會有更高的代價回報。全面的需求來自所有項目干系人,不同的干系人其愿望和追求的目標(biāo)往往相差甚遠(yuǎn),因此對項目干系人的愿望進(jìn)行平衡可能是相當(dāng)困難的事情。
軟件開發(fā)項目的目的就是實現(xiàn)項目干系人的需求和愿望。如果對項目所有干系人沒有進(jìn)行足夠的溝通和影響,使其盡可能地參與項目,則可能因為項目開始時項目范圍和一些具體需求不夠完整清晰,也可能因為某個項目干系人后期因為認(rèn)識的變化而提出新的需求,造成工期的延長,成本的增加,甚至項目的完全失敗。因此,應(yīng)當(dāng)從項目的啟動開始,需求分析員及其項目成員就要分清項目干系人包含哪些人和組織,通過溝通協(xié)調(diào)對他們施加影響,驅(qū)動他們對項目的支持,調(diào)查并明確他們的需求和愿望,減小其對項目的阻力,以確保項目獲得成功。以下是一些有效的措施
1、盡快熟悉項目干系人全貌
有些項目在做需求調(diào)查時,由于受進(jìn)度要求等客觀因素影響,需求分析員與建設(shè)單位的技術(shù)部門交流較多,向業(yè)務(wù)管理部門和實際使用者調(diào)查不夠深入,造成軟件試用后不得不再對需求做較大調(diào)整,"從頭再來"的部分比例很高,大大超過進(jìn)度要求時間。因此,熟悉項目干系人全貌是進(jìn)行需求調(diào)查的第一步,也是需求調(diào)查的基礎(chǔ)。在定制開發(fā)項目的項目干系人中,最重要的是建設(shè)單位中的人事組織、業(yè)務(wù)關(guān)系。最好是能夠用組織結(jié)構(gòu)圖畫出相關(guān)單位的組織結(jié)構(gòu);建立調(diào)研對象通訊錄以保證調(diào)研及分析期間及時的溝通。與此同時要注意項目干系人的主次關(guān)系,以便在他們之間的需求出現(xiàn)矛盾時能夠進(jìn)行合理的取舍。
熟悉建設(shè)單位內(nèi)部相關(guān)部門的業(yè)務(wù)劃分及它們之間的相互關(guān)系,為功能分析準(zhǔn)備了必要的資料, 同時可以熟悉用戶方的各類人員,并及時進(jìn)行廣泛、有效的溝通與交流。特別要與客戶方業(yè)務(wù)與技術(shù)的規(guī)劃者和實際使用者進(jìn)行深入探討,收集必要的原始資料,保證需求調(diào)查的完整性、正確性。
建設(shè)單位只是項目干系人中的一部分(當(dāng)然是主要的部分),為了更好地了解項目干系人全貌,還應(yīng)當(dāng)在建設(shè)單位組織結(jié)構(gòu)圖基礎(chǔ)上全體項目干系人結(jié)構(gòu)圖,以便更好更全面地進(jìn)行需求調(diào)研分析。
2、詳細(xì)描述各項業(yè)務(wù),以利于讓所有客戶確認(rèn)
盡可能全面詳細(xì)地調(diào)查并且描述原有系統(tǒng)(這點非常關(guān)鍵,需要調(diào)查清楚原有系統(tǒng)的不足以及優(yōu)點,以及用戶在這些系統(tǒng)中的操作習(xí)慣)和用戶希望將來系統(tǒng)具有的各項業(yè)務(wù)的流程,并將這些業(yè)務(wù)流程文檔化后與客戶進(jìn)行討論,對描述錯誤或不準(zhǔn)確不精確的進(jìn)行修改,最終讓客戶進(jìn)行確認(rèn)。從個人認(rèn)為,對業(yè)務(wù)處理過程了解的完整性和準(zhǔn)確性非常重要。雖然對數(shù)據(jù)來說都是查增刪改傳,但具體業(yè)務(wù)都是分為若干步驟,每個步驟都有其業(yè)務(wù)名稱,同一步驟可能對多個數(shù)據(jù)集進(jìn)行不同操作,需要調(diào)查了解清楚才能設(shè)計出適合各流程業(yè)務(wù)節(jié)點用戶業(yè)務(wù)特點和習(xí)慣的軟件,使開發(fā)出來的軟件更受歡迎。當(dāng)然在進(jìn)行軟件概要設(shè)計時,要盡量排除業(yè)務(wù)流程的制約,即把流程中的各項業(yè)務(wù)結(jié)點工作作為獨立的對象,充分考慮他們與其他各種業(yè)務(wù)對象的接口,在流程之間通過業(yè)務(wù)對象的相互調(diào)用實現(xiàn)其業(yè)務(wù)流程,這樣,在業(yè)務(wù)流程發(fā)生有限的變化時,就能夠比較方便地修改系統(tǒng)程序而實現(xiàn)新的需求。
對于各項業(yè)務(wù)的調(diào)查可以通過對以下資料的收集整理分析,這些資料來自各種各樣的項目干系人:遵循的標(biāo)準(zhǔn)、組織發(fā)放的工作手冊、作業(yè)流程、有關(guān)業(yè)務(wù)的上級通知、有關(guān)業(yè)務(wù)的辦事指南、辦理業(yè)務(wù)時需要填寫的登記表、各種相關(guān)的統(tǒng)計報表及通過其他途徑收集的類似系統(tǒng)的介紹、技術(shù)資料等等。
3、可視化需求調(diào)研,引導(dǎo)各種客戶挖掘他們的需求
很多客戶因為自己缺乏計算機(jī)知識,無法提出完整準(zhǔn)確、隱含的或潛在的需求。但若這些需求不能滿足將導(dǎo)致用戶的不滿。因此需求調(diào)研分析人員應(yīng)善于想用戶所想,不要害怕用戶的需求多,不但要確定明確的需求,還要善于用啟發(fā)的方式與用戶探討隱含的或潛在的需求,并結(jié)合各種調(diào)研分析技術(shù)挖掘超出客戶期望的令人興奮的需求。這就要求需求調(diào)研分析員要盡快完整地熟悉相關(guān)業(yè)務(wù),從而能夠站在用戶的立場看待軟件需求,想用戶所想,做好業(yè)務(wù)與計算機(jī)之間的橋梁。利用可視化需求調(diào)研的方法可以很好地啟發(fā)用戶深入挖掘潛在的需求。可視化需求調(diào)研就是使用圖表等工具來啟發(fā)引導(dǎo)用戶清楚地敘述需求,并且使需求更加全面完善。
對于高層領(lǐng)導(dǎo),可以提供系統(tǒng)總體框架圖;對于業(yè)務(wù)管理人員,可以用業(yè)務(wù)流程圖來描述新舊系統(tǒng)的業(yè)務(wù)流程;對于客戶中的技術(shù)人員,可以用數(shù)據(jù)流圖、實體關(guān)系圖或UML中的各種圖形對系統(tǒng)進(jìn)行各種角度的描述;而對于業(yè)務(wù)管理人員、客戶中的技術(shù)人員、以及各層次各流程中的用戶,畫出用戶界面圖來進(jìn)行需求挖掘,是個比較有效的溝通方式。
這里特別說明一下用戶界面的重要性。用戶界面的設(shè)計按理來說是軟件設(shè)計的責(zé)任,當(dāng)然客戶自己對界面有特別提出要求的除外。但是,如果把它提前到需求調(diào)研時(緊接著原有系統(tǒng)調(diào)研分析和系統(tǒng)模型完成之后)與客戶進(jìn)行討論,則可以大大改善需求調(diào)研的效果。因為這時客戶對于將來的系統(tǒng)還沒有一個形象上的概念,或者有一個模糊的預(yù)想的概念需要表述、驗證、明晰化、完善化。從我們后來的項目先做界面和用戶交流的經(jīng)驗看(系統(tǒng)原形應(yīng)該在需求分析的時候開發(fā)人員在分析師的指導(dǎo)下完成真實環(huán)境中的開發(fā),當(dāng)然開發(fā)只是界面的功能模擬,沒有底層代碼的實現(xiàn)),畫出用戶界面草圖與客戶進(jìn)行討論,可以大大激發(fā)他們提供更為準(zhǔn)確全面的需求,而且這些界面在后期的開發(fā)中也可以利用。原來收集資料,描述業(yè)務(wù),說明系統(tǒng)模型到了山窮水盡的時候,這種方法可以達(dá)到柳暗花明又一村的效果。因此,所謂需求就是“當(dāng)你按下各種相關(guān)按鈕(或輸入各種相關(guān)命令)時系統(tǒng)做什么”,所謂設(shè)計就是“當(dāng)你按下各種相關(guān)按鈕(或輸入各種相關(guān)命令)時系統(tǒng)怎么做”。需求的最終目的實際上是完整準(zhǔn)確地描述系統(tǒng)需要的各種接口或“界面”,及它們的相互關(guān)系或與外部環(huán)境的關(guān)系,如界面中的某個按鈕按下去時,可能產(chǎn)生新的界面、新的按鈕、或者調(diào)用其他軟件硬件完成某些功能。自頂向下,把這些界面及涉及到的數(shù)據(jù)描述清楚,就是一份不錯的需求。
4、與其他項目小組成員共同協(xié)作、持續(xù)完善系統(tǒng)需求
需求文檔完成之后,并不是萬事大吉,把它扔給后面的設(shè)計人員就了事了。作為項目干系人之內(nèi)的項目組其他成員,對需求的有效性也起到某種程度的驗證作用。雖然軟件項目的生命周期按照各種開發(fā)模型有不同階段的劃分,但每個階段的結(jié)束不是簡單地把階段工作成果塞給下一階段的成員就可以了。特別是高科技的軟件開發(fā)項目,上一階段的工作成果往往要通過多次的溝通才能更為清晰地被下一階段成員接受,其有效性、合理性也要被下一階段的工作所檢驗,通過檢驗有時也有必要對上一階段的工作結(jié)果進(jìn)行相應(yīng)的調(diào)整,需求更是如此。因此,無論是同一階段不同人員之間,或是不同階段人員之間都應(yīng)根據(jù)需要相互協(xié)作,相互配合,共同完成軟件開發(fā)任務(wù)
5、《功能規(guī)格說明書》,這個是我們項目中最大的失誤,致使后來客戶的改動讓我們很被動。《功能規(guī)格說明書》反映了客戶提出的所有需求功能,我們也是按照《功能規(guī)格說明書》來開發(fā)的。后期客戶的變化都可以和《功能規(guī)格說明書》對比,具體怎么變更按照我們的變更流程來做。《功能規(guī)格說明書》作為產(chǎn)品需求的最終成果必須具有綜合性:必須包括所有的需求。開發(fā)者和客戶不能作任何假設(shè)。如果任何所期望的功能或非功能需求未寫入軟件需求規(guī)格說明那么它將不能作為協(xié)議的一部分并且不能在產(chǎn)品中出現(xiàn)。并且注意以下幾點:
(1)完整性
每一項需求都必須將所要實現(xiàn)的功能描述清楚,以使開發(fā)人員獲得設(shè)計和實現(xiàn)這些功能所需的所有必要信息。不能遺漏任何必要的需求信息。遺漏需求將很難查出。注重用戶的任務(wù)而不是系統(tǒng)的功能將有助于你避免不完整性。如果知道缺少某項信息,用“待確定” 作為標(biāo) 準(zhǔn)標(biāo)識來標(biāo)明這項缺漏。在開始開發(fā)之前,必須解決需求中所有的“待確定”項。
(2)正確性
每一項需求都必須準(zhǔn)確地陳述其要開發(fā)的功能。做出正確判斷的參考是需求的來源,如用戶或高層的系統(tǒng)需求規(guī)格說明。若軟件需求與對應(yīng)的系統(tǒng)需求相抵觸則是不正確的。只有用戶代表才能確定用戶需求的正確性,這就是一定要有用戶的積極參與的原因。沒有用戶參與的需求評審將導(dǎo)致此類說法:“那些毫無意義,這些才很可能是他們所要想的。”其實這完全是評審者憑空猜測。
(3)可行性
每一項需求都必須是在已知系統(tǒng)和環(huán)境的權(quán)能和限制范圍內(nèi)可以實施的。為避免不可行的需求,最好在獲取需求(收集需求)過程中始終有一位軟件工程小組的組員與需求分析人員或考慮市場的人員在一起工作,由他負(fù)責(zé)檢查技術(shù)可行性。
(4)要性
每一項需求都應(yīng)把客戶真正所需要的和最終系統(tǒng)所需遵從的標(biāo)準(zhǔn)記錄下來。“必要性”也可以理解為每項需求都是用來授權(quán)你編寫文檔的“根源”。要使每項需求都能回溯至某項客戶的輸入,如使用實例或別的來源。
(5)劃分優(yōu)先級
給每項需求、特性或使用實例分配一個實施優(yōu)先級以指明它在特定產(chǎn)品中所占的分量。如果把所有的需求都看作同樣重要,那么項目管理者在開發(fā)或節(jié)省預(yù)算或調(diào)度中就喪失控制 。
(6)無二義性
對所有需求說明的讀者都只能有一個明確統(tǒng)一的解釋,由于自然語言極易導(dǎo)致二義性,所以盡量把每項需求用簡潔明了的用戶性的語言表達(dá)出來。避免二義性的有效方法包括對需求文檔的正規(guī)審查,編寫測試用例,開發(fā)原型以及設(shè)計特定的方案腳本。
(7)可驗證性
檢查一下每項需求是否能通過設(shè)計測試用例或其它的驗證方法,如用演示、檢測等來確定產(chǎn)品是否確實按需求實現(xiàn)了。如果需求不可驗證,則確定其實施是否正確就成為主觀臆斷,而非客觀分析了。一份前后矛盾,不可行或有二義性的需求也是不可驗證的。
(8)一致性
一致性是指與其它軟件需求或高層(系統(tǒng),業(yè)務(wù))需求不相矛盾。在開發(fā)前必須解決所有需求間的不一致部分。只有進(jìn)行一番調(diào)查研究,才能知道某一項需求是否確實正確。
(9)可修改性
在必要時或為維護(hù)每一需求變更歷史記錄時,應(yīng)該修訂文檔。這就要求每項需求要獨立標(biāo)出,并與別的需求區(qū)別開來,從而無二義性。每項需求只應(yīng)在文檔中出現(xiàn)一次。這樣更改時易于保持一致性。另外,使用目錄表、索引和相互參照列表方法將使軟件需求規(guī)格說明更容易修改。
(10)可跟蹤性
應(yīng)能在每項軟件需求與它的根源和設(shè)計元素、源代碼、測試用例之間建立起鏈接鏈,這種可跟蹤性要求每項需求以一種結(jié)構(gòu)化的,粒度好的方式編寫并單獨標(biāo)明,而不是大段大段的敘述。
6、 需求變化
項目的需要變化是肯定有的,而且變化一般都很頻繁,我們怎么應(yīng)對客戶的這種需求變化呢,以不變應(yīng)萬變。首先在前期的需求調(diào)研要做好,盡可能的替用戶考慮,達(dá)到功能質(zhì)量滿足最大化。需求調(diào)研前期的《目標(biāo)與范圍》和需求調(diào)研末期的《功能規(guī)格說明書》都要跟客戶簽字確認(rèn),這樣既能保證我們所理解的需求就是客戶所要的,也使得項目末期跟客戶驗收時有據(jù)可依。在項目中期是發(fā)生需求變更是很常見的,這時要做好需求變更管理流程。需求變更表,小的變更自己掌握,客戶要求的變更有開發(fā)人員和設(shè)計人員共同商討后提交項目經(jīng)理,項目經(jīng)理預(yù)估變更損耗工程時間,在一定階段一起提交給客戶,大的變更直接提交客戶,并且要把需求變更對項目產(chǎn)生的影響讓客戶知道,把球盡可能的踢給客戶,讓客戶在進(jìn)度、功能、資源三者中取舍出一個平衡來。對需求進(jìn)行分類評級,關(guān)鍵部分不能改動的做特別確認(rèn)(如系統(tǒng)架構(gòu)等,如果改變等于從頭再來)。同時完成客戶簽字確認(rèn),當(dāng)然如果能將這部分寫成合同細(xì)節(jié)中去是最好。以下是我認(rèn)為變更的步驟:
第一步:客戶提出變更內(nèi)容
-
客戶提交的變更必須基于書面形式
-
客戶提交的變更必須有充分理由
-
如果變更被拒絕,對業(yè)務(wù)的負(fù)面影響
-
如果變更被接受,對業(yè)務(wù)的正面幫助
第二步:為能否實現(xiàn)變更作評估
-
從實現(xiàn)方式上考慮新的變更可否實現(xiàn)
-
對于較復(fù)雜的情形,輔以簡單的說明。欲詳述,可作附件處理
-
對于簡單情形,例如頁面布局更改,則無須說明
第三步:可以實現(xiàn)看進(jìn)度
-
進(jìn)度幾乎是絕大部分項目關(guān)注的第一要素
-
對于活動級別的進(jìn)度影響
-
對于項目整體工期的影響
第四步:變更成本
-
人力相關(guān)的變更成本
-
是否需要額外的項目組成員
-
項目組需要增加的工時數(shù)
是否正常工時(工作日加班、節(jié)假日加班)
非人力成本
第五步:質(zhì)量和風(fēng)險
變更對質(zhì)量的多方面影響
-
分階段影響(需求、設(shè)計、編碼、測試、維護(hù))
-
可靠性、安全性、可維護(hù)性、可用性等
可能對團(tuán)隊士氣的負(fù)面影響
-
可能引發(fā)的間接任務(wù)對工期的負(fù)面沖擊
-
開發(fā)方的成本負(fù)擔(dān)可能超出力所能及的范圍
第六步:需求變化的確定
6.2 架構(gòu)設(shè)計
撰寫詳細(xì)設(shè)計是一個逐步細(xì)化、深入的過程。沒有人能一次就設(shè)計出完美的東西,需要及時的溝通,包括與客戶的反饋,與其他項目組成員的討論,這樣有助于降低開發(fā)時偏離需求的風(fēng)險。也就是說,在開發(fā)之前題,是建立在設(shè)計者的想法有客戶的確認(rèn)和開發(fā)人員的理解的基礎(chǔ)之上設(shè)計撰寫人必須與系統(tǒng)分析員反復(fù)討論,以透徹理解用戶需求;
一項需求可能有多種方式實現(xiàn),設(shè)計者必須與系統(tǒng)分析員確定該需求將采用何種方式實現(xiàn),將達(dá)到何種效果,以消除將需求映射為設(shè)計的歧義;討論過程中還可能會發(fā)現(xiàn)需求有不完備甚至錯誤的地方,在需求重新確定后設(shè)計者需修正設(shè)計。設(shè)計文檔必須寫清楚各個模塊/接口/公共對象的定義,列明程序的各種執(zhí)行條件與期望的運行效果,還要正確處理各種可能的異常。此外設(shè)計文檔應(yīng)該遵循一定的寫作模式與版面風(fēng)格,使用統(tǒng)一的術(shù)語或慣用語,使得小組成員很容易理解。以上這些活動綜合起來將是一個很細(xì)致、很耗時的工作過程。就個人所知,一些公司的詳細(xì)設(shè)計通常是由程序主管或少數(shù)核心的程序員撰寫的,他們通常也是系統(tǒng)架構(gòu)的主要作者或維護(hù)者。因為他們在開發(fā)團(tuán)隊中技術(shù)最為精湛,對架構(gòu)最為熟悉,他們最有資格評價現(xiàn)有架構(gòu)是否能適應(yīng)新的用戶需求,采用何種方式實現(xiàn)需求對架構(gòu)的沖擊最小。但是由少數(shù)人來負(fù)責(zé)所有的詳細(xì)設(shè)計可能造成開發(fā)過程中的瓶頸甚至是設(shè)計的錯誤。當(dāng)任務(wù)比較集中的時候,設(shè)計者可能忙得透不過氣,而負(fù)責(zé)實現(xiàn)的同事反而在等米下鍋,比較清閑。于是為了讓自己不成為拖累進(jìn)度的“罪人”,某些設(shè)計者就會采用一種快捷方式來交付設(shè)計:他們會與系統(tǒng)分析員進(jìn)行初步的討論,然后撰寫一份粗糙的但仍然叫做詳細(xì)設(shè)計的文檔,把它交付給負(fù)責(zé)實現(xiàn)的同事,再通過討論、即時通工具、電子郵件等方式解答對方提出的疑問。但由于詳細(xì)設(shè)計本身不完備,他們不得不花費更多的時間和精力與負(fù)責(zé)實現(xiàn)的同事溝通;而且他們卻很可能忘了把這些交流的成果更新到詳細(xì)設(shè)計中去!(或許是他們太忙,沒有足夠的時間,又或許是他們認(rèn)為既然產(chǎn)品已經(jīng)實現(xiàn),那么詳細(xì)設(shè)計也就不必維護(hù)了。)其結(jié)果很可能是當(dāng)產(chǎn)品開發(fā)出來后,我們才發(fā)現(xiàn)它跟用戶要求的完全兩樣!原本在詳細(xì)設(shè)計階段就應(yīng)該發(fā)現(xiàn)的需求漏洞與在那時應(yīng)該確定的技術(shù)方案在實現(xiàn)階段甚至測試階段才暴露出來,而這時大家往往有木已成舟的感覺,改動的難度比設(shè)計階段高數(shù)倍甚至十倍以上,畢竟任何再牛的人都有自己的局限。
對于以上問題我提出全員設(shè)計,全員設(shè)計的含義就是把詳細(xì)設(shè)計的工作進(jìn)行適當(dāng)?shù)胤纸猓阉鼈兎謹(jǐn)偟叫〗M內(nèi)其它同事身上,讓大家都參與設(shè)計。這可以說明如下:
當(dāng)一組用戶需求基本確定下來后,程序主管需要估計需求的相關(guān)性、需求的優(yōu)先級、設(shè)計的難易程度、設(shè)計的工作量等,將該組需求分解為一或多項設(shè)計任務(wù),并指定給適當(dāng)?shù)耐隆⑴c設(shè)計的每個人必須負(fù)責(zé)至少一項設(shè)計的撰寫任務(wù)。設(shè)計者從系統(tǒng)分析員處獲得詳細(xì)的用戶需求,并與系統(tǒng)分析員反復(fù)溝通以透徹理解用戶需求。他還要分析系統(tǒng)架構(gòu)及產(chǎn)品的已實現(xiàn)與/或已規(guī)劃部分,理解架構(gòu)的設(shè)計理念,理解產(chǎn)品不同模塊之間的協(xié)作關(guān)系,理解架構(gòu)與產(chǎn)品之間的約束和依賴。當(dāng)然對系統(tǒng)架構(gòu)和產(chǎn)品的分析不可能窮盡每一個細(xì)節(jié),只要分析與即將開發(fā)的模塊相關(guān)的內(nèi)容即可。
一項設(shè)計任務(wù),它可能需要多個程序員完成。比如用戶界面或網(wǎng)頁由某位或某組同事負(fù)責(zé),而業(yè)務(wù)邏輯組件則由另一位或另一組負(fù)責(zé),數(shù)據(jù)庫部分則又由其它同事負(fù)責(zé)。設(shè)計者必須考慮他們的立場,以各方面都相對容易理解的方式寫清楚主要的模塊/接口/對象定義,明確相應(yīng)的調(diào)用規(guī)則與主要邏輯處理。如果某項設(shè)計任務(wù)所涉及的內(nèi)容太專業(yè)化,設(shè)計者并不熟悉相關(guān)的內(nèi)容(比如某位C#程序員并不熟悉如何編寫一個存儲過程),他可以用描述性的文字說明該部分的設(shè)計要求,并知會相關(guān)的同事補(bǔ)充。其它同事在補(bǔ)充時可以對這些描述性的文字重新整理,以更加確切地表達(dá)設(shè)計內(nèi)容,更符合文檔的書寫慣例。在設(shè)計文檔完成后,設(shè)計者必須把他提交給程序主管或由程序主管指定的程序員審閱。個人推薦由其它程序員而不僅僅是程序主管來審閱。不用擔(dān)心等待多個人的審閱意見是否可能導(dǎo)致一份設(shè)計滯留很久。大家可以并行地工作,不必是A審閱后才能B審閱。可以交叉審閱,即A的設(shè)計由B、C審閱,B的設(shè)計由A、C審閱等。審閱意見可以用多種方式(如討論、即時通工具、電子郵件)反饋給設(shè)計者,設(shè)計者負(fù)責(zé)匯總這些意見并修正設(shè)計。以個人的經(jīng)驗而言,通常設(shè)計交付審閱后半天內(nèi)就可以收到反饋意見了。設(shè)計經(jīng)過反復(fù)地修正直至沒有人再提出修正意見,這時就可以由程序員實現(xiàn)了。以個人的經(jīng)驗而言,一份設(shè)計通常兩、三輪反饋后就可以定稿了。如果多次反饋后仍不能定稿,極有可能是:
a)需求尚未明確,各個方面(包括客戶、系統(tǒng)分析員或設(shè)計者)對需求的看法不統(tǒng)一
b)技術(shù)或系統(tǒng)架構(gòu)存在嚴(yán)重的限制,無法用較方便的方式實現(xiàn)
全員參與設(shè)計好處、風(fēng)險與不適用的團(tuán)隊如下:
6.2.1 全員設(shè)計可以帶來以下明顯的好處
1.有助于平衡工作量,加快開發(fā)進(jìn)度。詳細(xì)設(shè)計的任務(wù)分解后,程序主管或核心程序員可以有更多的時間處理其它的事務(wù),比如關(guān)注軟件的開發(fā)質(zhì)量或改善系統(tǒng)架構(gòu)。詳細(xì)設(shè)計的撰寫任務(wù)分解后它們可以并行地撰寫,這將極大地提高設(shè)計撰寫的進(jìn)度,節(jié)約時間。
2.有助于培養(yǎng)程序員的大局觀。每位撰寫設(shè)計的程序員不再僅僅只關(guān)心自己負(fù)責(zé)實現(xiàn)的模塊,他必須從更高的層次考慮和理解設(shè)計。
3.有助于加強(qiáng)同事之間的交流與協(xié)作。設(shè)計者需要與系統(tǒng)分析員、其它程序員、審閱者進(jìn)行反復(fù)的交流和溝通,實際上每份設(shè)計都是多人協(xié)作的成果。更多的溝通有助于集思廣益,有助于避免一、兩個人的傾向性意見導(dǎo)致錯誤的設(shè)計。每位設(shè)計者都需要對自己撰寫的設(shè)計負(fù)責(zé),他還要向其它同事的設(shè)計提供審閱意見或技術(shù)建議,彼此的工作是互相支持和依賴的,這有助于減少“只掃自家門前雪,不管他人瓦上霜”的想法。
6.2.2 推行全員設(shè)計的潛在風(fēng)險
1.在某種意義上,全員設(shè)計可能增加交流的成本。兩個人之間有一條交流途徑,三個人之間最多有三條,四個人之間最多有六條。途徑越多,信息量就越大,而這些信息不見得都是有用的信息。詳細(xì)設(shè)計的任務(wù)分解后,不可避免地有更多的人參與交流和溝通,大家要花更多的時間來理解他人的想法,也可能要花更多的時間向他人闡述自己的觀點。特別是在并行撰寫詳細(xì)設(shè)計的過程中,系統(tǒng)分析員反而可能成為另一個瓶頸了。但從總體上來看,在設(shè)計階段花費適當(dāng)?shù)拇鷥r發(fā)現(xiàn)更多的問題,比在實現(xiàn)階段或測試階段再發(fā)現(xiàn)問題,仍然是劃算的。
2.分解后的詳細(xì)設(shè)計可能引入沖突的設(shè)計內(nèi)容。由于設(shè)計由不同的程序員撰寫,他們考慮問題的角度和思維的方式不可能完全一致,這增大了不同的設(shè)計內(nèi)容之間的計算口徑或交互方式不一致的可能性。這需要設(shè)計者們盡可能遵循一致的設(shè)計原則,也需要審閱者們盡可能找到這些不一致的地方。
3.并不是所有的程序員都適合參與設(shè)計。很明顯,例如剛?cè)肼毜耐戮筒贿m合參與設(shè)計,他們對系統(tǒng)架構(gòu)還缺乏足夠的認(rèn)識。另外兼職的同事也不適合參與設(shè)計,他們的工作方式可能無法保證及時提交設(shè)計文檔與參與討論等。
6.3 溝通
在項目的開發(fā)過程中,在團(tuán)隊中的成員之間以及和客戶之間是一個不斷的交流和溝通的過程。我們的開發(fā)過程最好是一個迭代式的開發(fā)過程(尤其是國內(nèi)的項目)。這樣我們可以盡早發(fā)現(xiàn)開發(fā)出來的功能是不是符合客戶的需求,以免開發(fā)完了,客戶說這個不是我們需要的后果。
6.4 計劃執(zhí)行控制
制定系統(tǒng)得整個計劃,任務(wù)的劃分以及分配工作,跟蹤任務(wù)的進(jìn)度,使我們的項目進(jìn)度在控制范圍之內(nèi)。
6.5 風(fēng)險管理
風(fēng)險是隨著項目的不同階段變化的,不同的階段風(fēng)險是不同的,我們必須分析我們當(dāng)前面臨的風(fēng)險的數(shù)量、影響程度等,以及怎么去解決這些風(fēng)險。
6.6 測試
測試工作目前在國內(nèi)的中小公司做的都不太好,但是從我們做項目或者產(chǎn)品必須重視測試工作,把握好質(zhì)量關(guān)。
6.7 驗收為目的的思想
在開發(fā)過程中,內(nèi)部管理還要注意的一點是時刻強(qiáng)調(diào)以驗收為目的的思想,每個任務(wù)的最終可交付成果一定要是可以被檢查的,比如,【界面要求:美觀大方、簡潔明快】,這個要求我就不知道如何檢查。所以,給開發(fā)小組布置任務(wù)的時候就要考慮如何檢查結(jié)果,比如我見過一個計劃,里面有一個任務(wù)【開發(fā)人員熟悉EJB編程】,這個任務(wù),除了讓這些人去參加一些專業(yè)認(rèn)證考試,否則,結(jié)果很難被檢查。所以,時刻考慮如何檢查結(jié)果、如何向客戶交付是項目經(jīng)理一直要注意的事情,我聽說有些老項目經(jīng)理拿到項目是倒排計劃的,即首先看如何驗收和驗收標(biāo)準(zhǔn),然后決定工作計劃。很多項目開始了很久,還不知道如何驗收,那么這個項目出問題的可能性就很大了。做項目就是為了驗收,我們的角色不是研究機(jī)構(gòu),我們的目的就是在付出那么多勞動后得到結(jié)果。