[IT 男人幫 -11/03] 幾個軟件研發團隊管理的小問題

 http://www.cnblogs.com/wanghui9072229/archive/2011/03/18/1988477.html

 

最近在與一位總經理交流的時候,他談到他們公司的軟件研發管理,說:“我們公司最大的問題是項目不能按時完成,總要一拖再拖。”他問我有什麼辦法能改變這個境況。從這樣一個問題開始,在隨後的交談中,又引出他一連串在軟件研發管理中的遇到的問題,包括:

 

. 現有代碼質量不高,新來的開發人員接手時寧願重寫,也不願意看別人留下的“爛”代碼,怎麼辦?

. 重構會造成回退,怎樣避免?

. 有些開發人員水平相對不高,如何保證他們的代碼質量?

. 軟件研發到底需不需要文檔?

. 要求提交代碼前做Code Review,而開發人員不做,或敷衍了事,怎麼辦?

. 當有開發人員在開發過程中遇到難題,工作無法繼續,因而拖延進度,怎麼解決?

. 如何提高開發人員的主觀能動性?

 

其實,每個軟件研發團隊的管理者都面臨着或曾經面臨過這些問題,也都有着自己的管理“套路”來應對這些問題。我把我的“套路”再此絮叨絮叨。

 

1. 項目不能按時完成,總要一拖再拖,怎麼改變?

 

找解決辦法前,當然要先知道問題爲什麼會出現。這位總經理說:“總會不斷地有需求要改變和新需求提出來,使原來的開發計劃不得不延長。”原來如此。知道根源,當然解決辦法也就有了,那就是“敏捷”。敏捷開發因其迭代(Iterative)和增量(Incremental)的思想與實踐,正好適合“需求經常變化和增加”的項目和產品。在我講述了敏捷的一些概念,特別是Scrum的框架後,總經理也表示了對“敏捷”的認同。

 

其實仔細想想,這裏面還有一個非常普遍的問題。對於產品的交付時間或項目的完成時間,往往由高級管理層根據市場情況決策和確定。在很多軟件企業中,這些決策者在決策時往往忽略了一個重要的參數,那就是團隊的生產率(Velocity)。生產率需要量化,而不是“拍腦門子”感覺出來的。敏捷開發中有關於如何估算生產率的方法。所以使用敏捷,在估算產品交付時間或項目完成時間時,是相對較準確的。Scrum創始人之一的Jeff Sutherland說,他在一個風險投資團隊做敏捷教練時,團隊中的資深合夥人會向所有的待投資企業問同一個問題:“你們是否清楚團隊的生產率?”而這些企業都很難做出明確的答覆。軟件企業要想給產品定一個較實際的交付日期,就首先要弄清楚自己的軟件生產率。

 

2. 現有代碼質量不高,新來的開發人員接手時寧願重寫,也不願意看別人留下的“爛”代碼,怎麼辦?

 

這可能是很多軟件開發工程師都有過的體驗,在接手別人的代碼時,看不懂、無法加新功能,讀代碼讀的頭疼。這說明什麼?排除接手人個人水平的因素,這說明舊代碼可讀性、可擴展性比較差。怎麼辦?這時,也許重構是一種兩全其美的辦法。接手人重構代碼,既能改善舊代碼的可讀性和可擴展性,又不至於因重寫代碼帶來的時間上的風險。

 

從接手人心理的角度看,重構還有一個好的副作用,就是代碼重構之後,接手人覺得那些原來的“爛”代碼被修改成爲自己引以自豪的新成就。《Scrum敏捷軟件開發》的作者Mike Cohn寫到過:“我的女兒們畫了一幅特別令人讚歎的傑作後,她們會將它從學校帶回家,並想把它展示在一個明顯的位置,也就是冰箱上面。有一天,在工作中,我用C++代碼實現了某個特別有用的策略模式的程序。因爲我認定冰箱門適合展示我們引以爲豪的任何東西,所以我就將它放上去了。如果我們一直對自己工作的質量特別自豪,可以驕傲地將它和孩子的藝術品一樣展示在冰箱上,那不是很好嗎?”所以這個積極的促進作用,將使得接手人感覺修改的代碼是自己的了,而且期望能夠找到更多的可以重構的東西。

 

3. 重構會造成回退,怎樣避免?

 

重構確實很容易造成回退(Regression)。這時,重構會起到與其初衷相反的作用。所以我們應該儘可能多地增加單元測試。有些老產品,舊代碼,可能沒有或者沒有那麼多的單元測試。但我們至少要在重構前,增加對要重構部分代碼的單元測試。基於重構目的的單元測試,應該遵循以下的原則(見《重構》第4章:構築測試體系):

- 編寫未臻完善的測試並實際運行,好過對完美測試的無盡等待。測試應該是一種風險驅動行爲,所以不要去測試那些僅僅讀寫一個值域的訪問函數,應爲它們太簡單了,不大可能出錯。

- 考慮可能出錯的邊界條件,把測試火力集中在哪兒。扮演“程序公敵”,縱容你心智中比較促狹的那一部分,積極思考如何破壞代碼。

- 當事情被公認應該會出錯時,別忘了檢查是否有異常如期被拋出。

- 不要因爲“測試無法捕捉所有Bug”,就不撰寫測試代碼,因爲測試的確可以捕捉到大多數Bug。

- “花合理時間抓出大多數Bug”要好過“窮盡一生抓出所有Bug”。因爲當測試數量達到一定程度之後,測試效益就會呈現遞減態勢,而非持續遞增。

說到《重構》這本書,其實在每個重構方法中都有“作法(Mechanics)”一段,在重構的實踐中按照上面所述的步驟進行是比較穩妥的,同時也能避免很多不經意間製造的回退出現。

 

4. 要求提交代碼前做Code Review,而開發人員不做,或敷衍了事,怎麼辦?

 

如果每個開發人員都是積極主動的,Code Review的作用能落到實處。但如果不是呢?團隊管理者需要一些手段促使其有效地進行Code Review。首先,我們採用的Code Review有2種形式,一是Over-the-shoulder,也就是2個人座在一起,一個人講,另一個人審查。二是用工具Code Collaborator來進行。無論哪種形式,在提交代碼時,必須註明關於審查的信息,比如:審查者(Reviewer)的名字或審查號(Review ID,Code Collaborator自動生成),每天由一名專職人員來檢查Checklist中的每一條,看是否有人漏寫這些信息,如果發現會提醒提交的人補上。另外,某段提交的代碼出問題,提交者和審查者都要一起來解決出現的問題,以最大限度避免審查過程敷衍了事。

 

博主Inovy在某個評論說的很形象:“木(沒)有賞罰的制度,就是帶到廁所的報紙,看完就可以用來擦屁股了。”沒有獎懲制度作保證,當然上面的要求沒有什麼效力。所以,當有人經常不審查就提交,或審查時不負責任,它的績效評定就會因此低一點,而績效的評分是跟每年工資漲落掛鉤的。說白了,可能某個人會因爲多次被查出沒有做Code Review就提交代碼,而到年底加薪時比別人少漲500塊錢。

 

5. 軟件研發到底需不需要文檔?

 

軟件研發需要文檔的起原可能有2種,一是比較原始的,需要文檔是爲了當開發人員離職後,企業需要接手的人能根據文檔瞭解他所接手的代碼或模塊的設計。二是較高層次的,企業遵從ISO9001質量管理體系或CMMI。

 

對於第一種,根源可能來自於兩個方面:

- 原開發人員設計編碼水平不高,其代碼可讀性較差。

- 設計思想和代碼只有一個人瞭解,此人一旦離職,無人知道其細節。

在編碼前寫一些簡單的設計文檔,有助於理清思路,尤其是輔以一些UML圖,在交流時也是有好處的。但同時,我們也應該提高開發人員的編碼水平增加其代碼的可讀性,比如增強其變量命名的可讀性、用一些被大家所瞭解的設計模式來替代按自己某些獨特思路編寫的代碼、增加和改進註釋等等,以減少不必要的文檔。另外推行代碼的集體所有權(Collective Ownership),避免某些代碼只被一個人瞭解,這樣可以減少以此爲目的而編寫的文檔。

 

對於第二種,情況有些複雜。接觸過敏捷開發的人都知道《敏捷宣言》中的“可以工作的軟件勝於面面俱到的文檔”。接觸過CMMI開發或者ISO9001質量管理體系的人知道它們對文檔的要求是多麼的高。它們看起來水火不相容。但是,它們的宗旨是一致的,即:構建高質量的產品。

 

對於敏捷,使用手寫用戶故事來記錄需求和優先級的方法,以及在白板上寫畫的非正式設計,是不能通過ISO9001的審覈的,但當把它們複印、拍照、增加序號、保存後,可以通過審覈。每次都是成功的Daily Build和Auto Test報告無法證明它們是否真正被執行並真正成功,所以不能通過ISO9001的審覈。但添加一個斷言失敗(類似assert(false)的斷言)的測試後,則可以通過審覈。

 

CMMI與敏捷也是互補的,前者告訴組織在總體條款上做什麼,但是沒有說如何去做,後者是一套最佳實踐。SCRUM之類的敏捷方法也被引入過那些已通過CMMI5級評估的組織。很多企業忘記了最終目標是改進他們構建軟件及遞交產品的方式,相反,它們關注於填寫按照CMMI文檔描述的假想的缺陷,卻不關心這些變化是否能改進過程或產品。

 

所以敏捷開發在過程中只編寫夠用的文檔,和以“信息的溝通、符合性的證據以及知識共享”作爲主要目標的質量體系文檔要求並不矛盾。在實踐中,我們可以按以下方法做,在實現SCRUM的同時,符合審覈和評估的要求:

 

- 製作格式良好的、被細化的、被保存的和能跟蹤的Backlog。複印和照片同樣有效。

- 將監管需要的文檔工作也放入Backlog。除了可以確保它們不被忘記,還能使監管要求的成本是可見的。

- 使用檢查列表,以向審覈員或評估員證明活動已執行。團隊對“完成”的定義(Definition of “Done”)可以很容易轉變爲一份檢查列表。

- 使用敏捷項目管理工具。它其實就是開發程序和記錄的電子呈現方式。

 

總而言之,軟件研發需要文檔(但文檔的形式可以是多種多樣的,用Word寫的文字式的文件是文檔,用Visio畫的UML圖也是文檔,保存在Quality Center中的測試用例也是文檔),同時我們只需寫夠用的文檔。

 

6. 當有開發人員在開發過程中遇到難題,工作無法繼續,因而拖延進度,怎麼解決?

 

這也是個常遇到的問題。如果管理者對於某個工程師的具體問題進行指導,就會陷入過度微觀管理的境地。我們需要找到宏觀解決辦法。一,我們基於Scrum的“團隊有共同的目標”這一規則,利用前面提到的集體所有權,當出現這些問題時,用團隊中所有可以使用的力量來幫助其擺脫困境,而不是任其他人袖手旁觀。當然這裏會牽扯到績效評定的問題,比如:提供幫助的人會覺得,他的幫助無助於自己績效評定的提高,爲什麼要提供幫助。這需要人力資源部門在使用Scrum開發的團隊的績效評估中,儘量消除那些傾向個人的因素,還要包含團隊協作的因素,廣泛聽取個方面的意見,更頻繁地評估績效等等。

 

二,即使動用所有可以使用的力量,如果某個難題真的無法逾越,爲了減少不能按時交付的風險,產品負責人應當站出來,並有所作爲。要麼重新評估Backlog的優先級,使無法繼續的Backlog遲一點交付,先做一些相對較低優先級的Backlog,以保證整體交付時間不至於延長;要麼減少部分功能,給出更多的時間去攻克難題。總之逾越技術上難關會使團隊的生產率下降,產品負責人必須作出取捨。

 

7. 有些開發人員水平相對不高,如何保證他們的代碼質量?

 

當然首先讓較有經驗的人Review其要提交的代碼,這幾乎是所有管理者會做的事。除此之外,管理者有責任幫助這些人(也包括水平較高的人)提高水平,他們可以看一些書,上網看資料,讀別人的代碼等等,途經還是很多的。但問題是你如何去衡量其是否真正有所收穫。我們的經驗是,在每年大約3月份爲每個工程師制定整個年度的目標,每個人的目標包括產品上的,技術上的,個人能力上的等4到5項。半年後和一年後,要做兩次Performance Review,目標是否實現,也會跟績效評定掛鉤。我們在制定目標時,遵循SMART原則,即:

 

Specific(明確的):目標應該按照明確的結果和成效表述。

Measurable(可衡量的):目標的完成情況應該可以衡量和驗證。

Aligned(結盟的):目標應該與公司的商業策略保持一致。

Realistic(現實的):目標雖然應具挑戰性,但更應該能在給定的條件和環境下實現。

Time-Bound(有時限的):目標應該包括一個實現的具體時間。

 

比如:某個人制定了“初步掌握本地化技術”的目標,他要確定實現時間,要描述學習的途經和步驟,要通過將技術施加到公司現有的產品中,爲公司產品的本地化/國際化/全球化作一些探索,並製作Presentation給團隊演示他的成果,並準備回答其他人提出的問題。團隊還爲了配合其實現目標,組織Tech Talk的活動,供大家分享每個人的學習成果。通過這些手段,提高開發人員的自學興趣,並逐步提高開發人員的技術水平。

 

8. 如何提高開發人員的主觀能動性?

 

提高開發人員的主觀能動性,少不了激勵機制。不能讓開發人員感到,5年以後的他和現在比不會有什麼進步。你要讓他感到他所從事的是一個職業(Career),而不只是一份工作(Job)。否則,他們是不會主動投入到工作中的。我們的經驗是提供一套職業發展的框架。框架制定了2類發展道路,管理類(Managerial Path)和技術類(Technical Path),6個職業級別(1-3級是Entry/Associate,Intermediate,Senior。4級管理類是Manager/Senior Manager,技術類是Principal/Senior Principal。5級管理類是Director/Senior Director,技術類是Fellow/Architect。6級是Executive Management)。每個級別都有13個方面的具體要求,包括:範圍(Scope)、跨職能(Cross Functional)、層次(Level)、知識(Knowledge)、指導(Guidance)、問題解決(Problem Solving)、遞交成果(Delivering Result)、責任感(Responsbility)、導師(Mentoring)、交流(Communication)、自學(Self-Learning),運作監督(Operational Oversight),客戶響應(Customer Responsiveness)。每年有2次提高級別的機會,開發人員一旦具備了升級的條件,他的Supervisor將會提出申請,一旦批准,他的頭銜隨之提高,薪水也會有相對較大提高。從而使每個開發人員覺得“有奔頭”,自然他們的主觀能動性也就提高了。

 

上面的“套路”涉及了軟件研發團隊管理中的研發過程、技術實踐、文檔管理、激勵機制等一些方面。但只是九牛一毛,研發團隊管理涵蓋的內容還有很多很多,還需要管理者在不斷探索和實踐的道路上學習和掌握。

 

發佈了78 篇原創文章 · 獲贊 18 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章