我們該如何開始進行項目管理
引言 誰應該對項目進行管理
項目管理的的文章和書籍到處都是,我也不敢在這班門弄斧。所以以下的文字主要關注從沒有管理到開始對項目進行一些管理這個過程,通常沒有進行管理或者很少進行管理的項目也不會特別大,所以本文并不一定適合大型項目。本文也不完全符合某***程或者標準,其中一些只是我個人的一些淺見,如果能拋磚引玉,那就再好不過了;如果哪里說的不對,肯定各位筒子們盡管拍磚。
作為項目組的成員之一,不論你是開發工程師,測試工程師還是數據庫工程師,你都對項目管理負有責任。在工作中,工程師應該精通自己的部分,優秀的工程師還應該熟悉別人的部分,實際情況中的工程師通常還需要在必要的時候(有人離開)頂上去做任何一個部分,此時,對項目的整體的把握至關重要。在參與到管理的過程中,也會提高自己的項目管理能力。其實,“項目管理”四個字重點不在管理,而在項目,當你的心在項目上,你就是管理者,項目就有可能因為你而成功;反之,即使你是個小角色,項目也可能因你而面臨失敗的危險。
(一) 我們需要什么樣的人
在前面的文字中,我提到項目中的人員。我個人通常喜歡稱項目的參與者為“工程師”,不管是開發,測試還是數據庫管理,還是需求分析,項目管理人員。工程師這個詞,其實包含了很多內容,不僅僅是壘代碼,而是要像做一個建筑工程一樣,考慮自己的部分對其他部分的影響,設計自己的部分,構建自己的部分,測試自己的部分,這是一個有機互動的過程,不是一個簡單機械運動。我要強調的是工程師是技術工種,不是熟練工種,作為項目組的一員,我們也要從內心去做一個技術工種而不是熟練工種。
基于以上的考慮,我認為項目組成員應該至少具備如下三個特征:
1, 具有本領域內基本的技術能力和學習能力。我堅信不知道開機按鈕在哪的同志確實干不了修理電腦的活兒,也不認為三天學不會hello world的程序員還有在這個領域生存的機會。
2, 專注于工作的精神。哪怕你工作一分鐘,也請專注的工作,專注的思考。專注成就價值,只有專注的做事情,才能有所斬獲。
3, 能夠與人溝通。眾所周知,溝通對于項目的成功有多么重要,所以溝通是項目組成員比不可少的素質之一。
工程師,還是代碼工人。你的選擇?
(二) 始終關注交付物--不管是項目經理還是開發人員(項目中的所有人)
項目一開始,我們就開始和客戶談需求。“汽車怎么賣跟我程序員有什么關系?如何讓你的客戶滿意又關我什么事?只要告訴我你要什么就行了嘛,廢話這么多”,很多程序員都這么想。
隨著這些我們并不關心的事情越談越多越談越深入,我們越不耐煩,越想早點兒結束,進入我們自己的代碼的世界。此時,我們忘記了真正重要的真正最核心的東西:我們要交付什么東西!此時你會說,我沒有忘記,我就是要做個B2B的電子交易平臺。沒錯兒,就是它,但是它是什么呢?包括什么呢?為什么是這樣的呢?將來有可能會變成什么樣呢?甚至這個平臺能為我們的客戶帶來什么呢?不知道你能回答上來多少。
我們的交付物---它可能是一個獨立工作的功能,可能是一個部署的方案,也可能是一個幫助文檔, 它才是值得我們一直關注并且必須要關注的東西。對于它,我們應該深入的去了解,它能干什么? 為什么要這么干或者能為客戶帶來什么?在整個項目中處于什么位置?關鍵的挑戰在哪里?何時交付最給力?最晚何時交付還能有效?如果沒能交付會有什么后果,還有替代方案嗎?
為了了解我們的交付物,我們必須深入的了解客戶的需求。當我說到需求,我不想你聯想到海量的客戶業務信息,雖然那也是我們需要了解的;我只想讓你去深入了解當前你在思考的交付物,以及跟它有關聯的業務接口,當然,還有它產生的影響。關注交付物的***好處就是能夠保證項目的交付,而最核心的技術就是學習客戶的業務—雖然我們是程序員,但其實我們應該是全才。
在此過程中,原型法是個不錯的主意。原型不一定是一個客戶看的東西,我不太看重那些重型的花費太多精力的原型。有時候,一個流程圖,簡單的幾行字,幾條描述業務的問題,一段與用戶關于功能點的深入短暫的交談,都是很好的原型。原型其實就是將你理解的東西,讓用戶理解,并得到用戶的反饋,不管用什么方式,只要達到這個目的,那你的原型就成功了。
***,一切關注交付物的努力都將迎來收獲的季節:驗收。項目組員可能關注交付物,而項目***可能更關注驗收。其實關注交付物,就是關注驗收,因為驗收就是由一系列的交付物組成。乍一看,驗收貌似就是一堆代碼或者一堆文檔,其實不然。驗收其實是一個過程,是一個從開始就需要得到關注的過程。在項目開始的計劃和設計階段,每一個交付物都應該有一個完成的標準,即做到什么時候為止,一切交付物都應該是可驗證的,而這種驗證方式應該得到客戶的認可。這些驗證方式可以是一些測試用例,也可以是一些其它的標準,但是必須得有,我們一切的工作都要圍繞這個驗證標準進行。要努力讓客戶相信:驗收就是跑完客戶已經簽字的測試用例,系統出現的錯誤在可以接受的范圍之內。我們并不是欺騙客戶,而是要客戶進行深度參與,讓它們意識到這些測試用例的重要性,從而更好的實現雙贏。
(三) 我們需要哪些文檔,工具和努力
軟件項目肯定離不了文檔和管理工具,如果您的項目還沒有它們,那么請從現在開始。那么文檔是不是越多越好呢?老話說的好,合適的才是***的。小而精的文檔和工具會讓我們事半功倍,大而全的文檔會讓我們疲于奔命,***迷失在文檔的海洋中。
我們寫代碼的都知道,錯誤的注釋比沒有注釋更可怕;同樣的,沒有及時得到更新的文檔比沒有文檔更可怕,因為文檔就是項目的注釋。那么我們是否有必要去更新那些我們根本沒有用到的文檔呢?很顯然,那是非常沒有必要的,是對資源的浪費。文檔說起來其實就是一個工具,是一個讓我們開發時有依據,可以追溯開發過程以及記錄開發結果的工具。我們只有用到它,它才有存在的必要。
那么文檔過于少或者干脆沒有文檔,不是更簡潔?我想說:不寫代碼不是更簡潔?玩笑歸玩笑,沒有文檔或者文檔太少會導致的問題大家可能也都遇到過:那就是過程不可追溯,有些非常重要的邏輯沒有記錄,需要用到時團隊成員各執一詞,甚至需要重新找客戶確認而是客戶認為我們不夠專業;有些非常重要的設計沒有記錄,導致代碼維護困難,以至于維護人員破口大罵開發人員寫的什么垃圾代碼做的什么垃圾設計。有些設計非常的巧妙,非常的值得學習,然而就是因為沒有留下記錄而被初學者如我一樣的人罵了N次。在反省自己不夠聰明時,是否也該讓寫代碼的人反省一下為什么沒能留下點兒記錄?
有一種觀點是***的設計就是代碼,意思是代碼就是設計,代碼應該非常的優秀,可讀性特別好,讓人一看就明白,我完全同意。如果代碼寫到這種程度,那文檔就真的沒用了。那么請自問,您是這樣嗎?如果是,沒文檔,沒問題;如果不是,請把重要的東西寫下來。那么,哪些是重要的呢?
哪些是必須的, 哪些是Optional的。對于哪些文檔更重要些,應該由項目的具體情況而定,特別是項目的大小,邏輯的復雜程度,人員的情況等等很多因素。在我做過的項目中,我個人認為最重要的一些文檔和工具如下所述:
1, 功能說明書(Functional Specification)------按獨立功能劃分優先級,每一條記錄都是一個可交付物,都是一個功能。整個文檔就描述了整個項目的交付功能和優先級。項目中的所有人,都應該關注這個文檔:測試用它來寫測試用例;開發人員用它來決定先開發哪個功能;PM用它來查看功能的完成和驗證狀態。它通常不應該內容過多(由項目規模決定),我覺得最多兩行字就可以描述一個獨立工作的功能,至于對這個功能的理解,應該由負責它的程序員來完成。
2, 核心流程圖。這個流程圖可能描述了用戶使用該系統的過程;也可能描述系統中數據的流轉;也可能描述表單的流轉。總之,它描述一個過程,這個過程對用戶來說非常重要。這個圖有時候也會被其它的圖,如順序圖代替。
3, 部署文檔。該文檔描述了該系統應該如何部署,它不一定非要是一個word文檔,也可能僅是一個bat文件而已。這個文檔應該描述該項目如何部署,步驟是怎么樣的,需要哪些文件,需要哪些硬件支持,以及需要注意什么。部署歷來都不太被重視,大家覺得只要東西做出來了,部署不就是放上去嗎?其實不然。在經歷了一定周期的開發后,開發過程中積累的配置,對環境的要求,在真正部署的時候很多就忘了,所以部署可能會花費很多沒必要的時間,我覺得這也是微軟要做daily build的原因之一,每天都build一個可用的版本,當然部署就沒有問題了。我們剛開始可能不需要每天都build一個版本,但最少要一周或者兩周部署一個版本吧。每次部署都整理一個自動化的腳本或者文檔,會讓你***上線的時候非常的從容。
4, 測試用例。我不是一個測試人員,測試也是我覺得一直沒有做到位的地方。客觀的說,我覺得用例應該花很大心思去編寫,就像用戶真正的在使用軟件一樣。項目應該在設計和開發的時候就以滿足用例為目標,而不是開發完了才想起來用例,去測試,發現問題再修改,回頭想想,這可能就是測試驅動開發產生的原因吧。我們知道用戶發現錯誤修改的成本高于我們自己發現的錯誤;同樣的,設計和開發階段就解決的問題成本也遠遠小于測試階段發現的。正是,問題發現的越早,解決起來就越容易,成本就越低。
5, Bug管理工具。這個管理工具可以是一個excel,當然,我并不推薦這么做,畢竟excel卻是不那么自動化。但是,只要比excel自動化一點點兒的信息系統就可以了,它需要可以記錄問題,可以傳截圖,這就夠了。我推薦使用bug tracker,這是個dotnet開發的開源的bug管理工具,其實也可以管理需求,是非常實用的。
以上五個是我認為最重要的,我覺得是項目開始進行管理的階段必不可少的;而下面幾個,則是大家視情況可選的。
6, 核心類圖。這個可能是可選的,因為有時候,類的關于沒那么復雜,也就沒有必要有這個圖;相反,則需要進行記錄。
7, 數據庫設計。數據庫設計文檔可能在review的時候用到。
8, 系統間接口圖。如果產品有若干個子系統,如web service等等,那么我認為需要一個描述系統間接口和交互關系的圖,這個圖應該在設計的早期就開發出來供大家使用并且隨時保持更新和關注。
有了文檔和工具,是不是就一切OK了呢?不對,就像大而全的文檔并不能幫助我們成功一樣,有了文檔并不代表項目就能成功,如何維護和使用這些文檔和工具是相當重要的。每個文檔都應該有人去維護,那么誰去做這個事呢?我認為項目經理應該經常拿著功能說明書開會,它也可以被看做是WBS的初級版本,可以被標注狀態和優先級;所有人都應該熟悉流程圖,并隨時提出對流程圖進行檢驗和review;應該指定一個人負責構建,這并不需要花費很多時間,但是需要細心和一些***主義精神;測試人員自然要維護好測試用例;每個人特別是開發人員,都應該有一種覺悟,那就是一旦想起了哪些重要的邏輯,不管是業務的邏輯還是系統的算法,都應該記錄到bug管理工具上。Bug管理工具完全可以記錄這些零散但卻重要的東西,以便將來方便查詢。
在這里我也是根據自己的經歷簡單的談了一些我的看法,這并不是金科玉律,我還得說,合適你的才是***的。
(四) 代碼規范的選擇
做開發不可避免的遇到代碼規范,從上學時就會學習到一些規范,但是每個公司都不同,那么我們到底要遵守哪些規范呢?我個人認為,一個合格的程序員應該可以隨時調整自己適應任何一種規范,這是一種職業素養和能力。而何時該遵循何種規范,這也有一定的原則。
1, 在現有系統(代碼)基礎上進行開發。這種情況下,我們應該盡量的去遵循原有系統的規范,不論是命名還是注釋。因為如果這時你非要按照自己的習慣寫,那么系統就會出現兩種完全不同風格的代碼,這對將來的維護是一種噩夢。但是,遵循原有規范不是遷就原有錯誤。如果發現原有的規范會造成一定的問題,就要立刻改正,不能裝傻充愣假裝看不見。
2, 新建團隊開發新的系統。新建的團隊中團隊成員可能來自不同的環境,對規范的選擇傾向一定是不完全一樣的,此時要怎么做呢?這時,項目的***應該組織大家一起做一個決定,討論如何定義變量,如何給控件取名等等。在出現意見不統一又誰都說服不了誰的情況時,項目經理應該做出明確的決定。此時選擇一種規范遠比同時遷就兩個人要來的好,不然造成新系統中存在兩種規范,同樣是維護的噩夢。
3, 穩定團隊開發新的系統。這種情況就容易得多,團隊穩定后團隊成員漸漸的了解了互相的習慣,互相學習后就更容易達成妥協。只要注意讓新加入的成員適應就可以了。
有人可能覺得代碼規范沒什么大不了,功能正確沒有bug不就行了?當然,如果沒有bug那肯定沒問題,然而一個系統運行到退休還沒有bug,哪位見過呢?我做了一些運維工作之后才漸漸了解到,不同風格的代碼讀起來就像是一會兒在赤道,一會兒在南極,非常的痛苦,有時甚至會造成系統很多的不一致,大大增加了維護的工作量。我們的目標之一不就是增加系統的可維護性嗎?
(五) review和重構
說到review,有些筒子可能立刻就想到了:吵架。確實,有的時候review真的可能演變成吵架,但是我們為了項目的成功,這個風險一定要冒,慢慢成熟以后,被人批評的次數多了,臉皮厚點兒就好了。;)玩笑歸玩笑,review確實是需要技巧的:在review別人的代碼時,要注意你的話語有時會傷害別人的自尊心,讓別人覺得你是在雞蛋里頭挑骨頭;在別人review你的代碼時,同樣的你也會覺得別人是在雞蛋里頭挑骨頭,傷害你的自尊心。這里我也沒有太多的技巧可言,一句話,換位思考,臉皮厚點兒吧。哈。
Review可能分成以下幾種:
1, 設計的review。說起review大家更多想到的是大家坐在一起邊侃大山邊看別人的代碼,其實設計的review是更加重要的和更加高級的,也是更有價值的,問題發現的早解決的代價就小嘛。在review別人或者自己的設計時,我們都能學到別人的設計理念,方法和技巧,這能大大提高團隊成員的能力。項目中的技術牛人,項目經理和技術骨干應該作為設計review的主力人員,多多談談自己的看法;同時也要注意尊重設計者的感情,讓大家都有收獲的同時,把項目做好。
2, 代碼的review。代碼review的形式可以多種多樣,兩個人坐在一起看看代碼也是一種review,也沒有必要非得所有人都湊齊。Review代碼的可以讓自己迅速成長,也能讓項目組成員熟悉別人的業務和代碼,以***程度減少人員變動造成的損失;同時也能讓代碼規范更加一致。
不管是設計review還是代碼review,都不一定要全部人員到場,這可能會浪費一些時間;但是設計的review最少要有一個技術骨干或者項目經理在場,否則review就會變成討論會進而升級成戰爭。
Review有時候也會被認為浪費時間,特別是很多程序員對review別人的代碼沒有任何興趣,也不愿意讓別人對自己的代碼說三道四。我想說,作為一個二十一世紀的軟件工程師,我們不但要善于對技術進行鉆研,更要善于把自己的技術傳播出去,也要善于通過別人的指點更快的提高自己的工作能力。這是一個開放的時代,是一個需要交流的時代,是一個迅速發展的時代,你慢,就就完蛋。
在review發現了很多問題之后,我們要怎么辦呢?對,重構。這幾年重構這個詞已經非常的火了,大家都說重構很重要,但是又有幾個人真正的去重構呢?有幾個人真正的不允許自己寫重復代碼呢?大家是不是還在說:“項目schedule太緊了,等有空了再優化吧”?我認為,這句話是有問題的,項目的總時間短,任務重,我們沒辦法;但是優化(重構)卻不會增加這種時間的壓力,相反的,重構會大大減少后續的開發和debug時間。因為重構后,出現的bug更容易被定為,更容易被fix;相反垃圾代碼引起的debug和fix bug的時間將遠遠大于重構的時間。
原文鏈接:http://www.cnblogs.com/wisdomsoft/archive/2011/08/16/2140148.html
【編輯推薦】