qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          軟件項目“免坑”指南

           “誰也無法改變現狀,唯有無數程序員血灑大地,才能使項目重建天日。”這一點也不夸張,軟件項目做爛了就是個坑,參與者也不過是填坑的。就像是在魔獸世界戰場遇到國家隊一樣,你贏也贏不了,出也出不去。

            一、坑有多深?

            當我們進入一個項目時,通過不斷觀察我們可以發現我們的項目到底是不是一個坑。造坑的項目,往往具有某些“臭味”,以下是我的一些認識,這些“臭味”即是項目健康狀態不佳的明顯標志:

            ● 編碼規范形同廢紙,代碼質量低下。每個項目都有編碼規范,但真正嚴格實施卻是另一回事。太多的項目把編碼規范作為形式的存在,沒人在乎讓開發人員寫出“人能讀懂的程序”,注釋和命名也成了開發人員的隨心所欲。project上永遠只有開發任務,而幾乎找不到單元測試的時間和代碼審查的時間。在高壓進度之下的項目,顯得如此山寨。當我們還在抱怨自己工資低的時候,就先看看我們的程序還能稱作OOP嗎。

            ● 缺乏文檔或文檔質量低下。前 期文檔很重要,不論是框架的API使用手冊,還是需求或設計文檔,以及各種既定流程的規范,不同種類的模板及核對表,等等這些文檔,對于項目來說都是非常 重要的資源。而往往有些項目,這類文檔就是交由非軟件行業的人員來編寫,或者前期根本不打算在文檔上浪費時間。這就導致了,缺少相關文檔或文檔質量低下, 在軟件構建過程中,開發者和團隊,不得不為這種“表面工程”的產物而糾結。甚至會退回到前期準備工作,完成所需的文檔。有些文檔可以在后期補,但有些必須在前期進行準備,以保住團隊降低風險,減少缺陷引人的幾率并提高編碼質量,如果前期這類文檔沒有做好,那么就會像考前不復習一樣,自食惡果。

            ● 無盡的需求變更,永遠追不上的進度。這 是最常見也是最可怕的,因為無論怎樣,我們都無法完成它。客戶可能認為改個程序,就像改個Excel一樣簡單省事,甚至會使用可動用的一切權利和資源來推 行變更。好吧,我承認這樣的客戶我遇到過很多。當我向客戶解釋過變更的代價并提供備選方案后,也就只能等待客戶的選擇了,這多少有些運數的成分,但也是無 奈之舉。

            ● 僅僅靠加班應對進度落后。進度落后并不可怕,可怕的是僅靠加班來追趕進度。這是問題的 關鍵,長時間的趕工仍然無法趕上進度,這只意味著項目有某種更深層次的問題,已經不是單開趕工可以解決的了。留意那些長時間加班的項目,他們往往在管理上 存在很大問題,發現這些問題,在你成為PM時,不要犯類似錯誤。

            ● 溝通無門。如果你在一個“叫天 天不應,叫地地不靈”的項目里,那你最好省心吧。項目中溝通很重要,但總有些項目,領導的工作太忙,人就是找不到,發出去的郵件就是沒人回,遇到問題就是 自己扛。在這樣的項目里也有一些好處,比如鍛煉自己的自學能力,以及磨練意志與根性。不過這些,也都是我的自嘲。低效的溝通將導致不必要的返工,這才是我 所痛恨之處。我最為惱火的一段經歷是,甲方要進行變更,開了一周的會沒人通知我,我的小組在這一周里完成了原計劃的數個需求并進入到測試階段, 但這些需求均被砍掉 。本來只有甲方告知是可以調整進度開發其它模塊的,但最終演變為資源的浪費。可見,溝通是多么的重要。

            ● 沒人關心質量。因 為軟件構建屬于專業領域,客戶并不具備相應領域的知識,由于這種信息不對稱,助長了軟件的質量低下。我們開發的軟件可以是“低等級高質量”的,但不能夠是 “高等級低質量”的。但是,太多的項目不在注重編碼質量,這與軟件構建的復雜度有關,也與整個行業的風氣有關。但不管何種原因,提高代碼質量仍然應該作為 團隊的努力方向。團隊應該獎勵那些,編寫高質量代碼的程序員。如果你的團隊獎勵的是那些,“BUG殺手”(每天修改上百個BUG),而冷落那些缺陷檢出數 量很低的程序員,那么,你的PM是個不懂技術的,至少我本人認為,任何有技術背景的PM都應該獎勵那些正在保持職業操守,認真對待需求,保證代碼質量的程 序員。他們為項目付出了更多,更多的異常處理, 更多的測試調試,更多的檢查,更多的重構,雖然他們的進度并不快,但他們引人的缺陷數量很少。每個做過開發的人都會在質量和進度上做出取舍,而我敬佩那些 選擇質量程序員,因為他們才是真正拿開發當事業的人。在此,向所有努力提高代碼質量的程序員致敬!

            ● 沒人為缺陷買單,沒人為自己的成果負責。需 求產出了低質量的文檔,設計沒有進行充分的迭代,開發可以怎么簡單怎么寫,測試可以隨意測測,沒人為自己的成果中的缺陷買單,除了項目經理,他為項目承擔 唯一責任。當項目組所有人員都在混時,就是在給自己挖坑。這種缺陷的堆積,會像放射性元素在食物鏈中的堆積一樣,早晚項目會因此而崩潰。

            ● 過高的離職率。這 個是最明顯的“臭味”,這說明我們的同行已經在這里無法忍受了。它所帶來的惡略影響不光體現在可用資源的減少,還體現在對成員士氣的極大影響。如果不及時 改善,這將是一個非常惡性的循環,當往一個進度落后的項目中添加資源只會使進度進一步落后,而非正離職導致必須補充新的資源,資源從入職到培訓都會對對團 隊產生震蕩,并降低現行團隊的生產力。一個頻繁處于形成階段的團隊,很難要求其有什么凝聚力,團隊問題將會凸顯,尤其是在溝通上,在項目忙的時候很少能照 顧到新人。花費在對新人進行培訓,和與其溝通上的時間,很可能得不償失。

            ● 團隊中的不良情緒。不 同團隊開始扎堆并相互敵視,例如開發組認為設計組是一幫搞業務的白癡,根本不懂編程;測試組認為開發組的人就是垃圾,BUG提交了多少便還是無法關 閉;PM開始抱怨,自己的成員不配合;成員開始抱怨,PM是個純管理沒資格指揮內行做事。等等,諸如此類的怨念會在團隊中積累,并以某個導火索為契機爆 發。面對現實吧,至少,我遠沒有自己想象的那樣高尚。我承認我曾經會和別的程序員說:“你看XX他們寫的代碼...什么呀...”,這樣的話。在過去我也 吐槽過別人代碼,這種做法是錯誤的,我為此表示歉意。現在,如果有必要,我會說代碼有缺陷,但絕不會說他的代碼不好。我希望,我們能彼此尊重。對于技術人 來說,不尊重他的成果就是不尊重他的人,所以我還是建議PM在管理工作中,多用“缺陷”,少用“不行”、“不對”。但是,項目中也總是有些人,靠鄙視別人 的成果來彰顯自己的實力。這些人,有,但很少。至少我遇到的很少,遇到過幾個,讓他們的話語成為你學習的動力吧。我曾經被人諷刺UI做的太丑,之后我學會了SL和FLEX;被人鄙視基礎太差,之后開始閱讀《CLR Via C#》;我朋友被人嘲笑過數據庫設計,現在人家也開始買書深造。團隊中就是這樣,我們無法管住別人的嘴,但我們可以管住自己的。少說多聽,一鳴驚人,乃上上之策。不要受情緒的影響,保持一個平靜的心。

            ● 沒有項目或階段的后評價。不 對項目的階段進行后評價,也意味著沒人在乎你到底干了些什么,所有人都只是進度是否完成,而沒有對完成的好壞進行評價。這也意味了,僅靠做好你的工作,你 是無法得到領導的重視的。最終只有那些加班時間最長的程序員被領導認可。而能力強,口碑好的成員也只能在團隊和客戶中間留下傳說。

            二、誰在造坑?

            軟件項目涉眾眾多,造坑的多為項目實施團隊內部,而究其原因也是多方面的,但是始終離不了項目的四個維度——時間、范圍、成本、質量。很多時候 客戶并不具備軟件項目的實施經驗,而實施團隊為了迎合客戶意愿,也會多多少少的在這四了維度上做文章。資源、時間不足,輕質量重功能,往往成為造坑的契 機。所以,不用懷疑,造坑的往往是我們自己。很難理解,真正挖出大坑的人,最后也是填坑的人。一個人很容易被外部事務所左右,就如“同假的多了,真的到成 假的了一樣”,多數人不愿意在一個新環境中表現得特立獨行。但也有老的程序員對我說過:“當別人做錯了,你就不要跟著去做!”所以,我認為工作就是工作, 不需要我們在其中融合多少興趣,也不要求我們有過多的付出,但對于工作的成果則要求我們認真的對待。俗話說:“拿多少錢,辦多少事!”如果多少有些團隊意 識,能夠對自己的工作負責,那至少在意識上,我們能給自己少造些坑。

            三、如何免坑?

            (一)清除盲區

            以下觀點,僅是我對軟件項目中一些錯誤認識的歸納:

            ● 寫出能用的程序就行啦!我們應該首先清楚我們做的是什么,一個成熟的團隊產出的可交付成果應該包括軟件 編程產品,相關文檔,項目實施過程中的經驗教訓已經其它一些非形式的成果(培訓)。這里,我們必須清楚的認識到,我們所開發是是編程產品,而不是我們個人 的技術實踐或大學的畢設。對于編程產品,我們必須認識到,其是產品級別的,必須保證質量,必須提高用戶體驗,必須考慮系統的諸多特性或維度。這一過程遠比 我們自己寫個程序要復雜的多。設計需要不斷地進行迭代;開發人員需要遵守嚴苛的規范,編寫大量的注釋和大量的異常處理;測試人員需要不斷地進行各種重復測 試,但是正是這種全局的規范,全體團隊的不懈努力,才保證了我們的編程產物可以稱之為產品。所以,一定要明確,我們要完成的是一個產品,而不是一個畢業設 計,它不是一個人的技術實踐,而是整個團隊傾注精力去完成的最佳成果。我們可以輕松的實現客戶的某些需求,但需求背后的某些東西,需要我們認真對待,比如 安全性和性能等。實現功能的程序誰都會寫,而寫出高質量的程序的才是真正的藝術。

            ● 盡快開始編碼吧!軟件構件是一個精心設計的過程,其前期準備十分重要。在后期修復缺陷的成本要遠遠高于前期。因此,在項目執行前,前期的規化十分必要。在前期每發現一個缺陷,都會為后期節省大量的成本。

            ● 需求怎么變了!沒有不變的需求。

            ● 進度落后了就招人唄!這是種典型的錯誤認識,《人月神話》中已經說明的很清楚了——往一個進度落后的項 目中注入資源,只會使進度進一步落后。雖然,這本著作成為PM必讀之作,其思想也被業界所廣泛認可,但是,還是會有很多管理者單純的認為,通過注入資源能 解決問題。對于這些人,只能讓實踐來檢驗真理了。

            ● 軟件質量保證是測試的工作!這是一種逃避責任的說辭。如果把代碼質量比喻為減肥,那么測試無疑是一個磅秤,減肥工作還是要有開發人員來完成。所以,不要將代碼質量都寄希望于測試工作上。即使是大規模的用戶測試,其錯誤檢出率也不足五成。而真正挑起代碼質量重擔的是代碼審查。

            ● 程序員你8小時就寫了這么點代碼?讓開發人員將全部時間都花在編碼上是不可能的。開發人員需要時間預讀 文檔,需要與相關干系人進行溝通,需要花時間來搜索資源。此外,可能還需要編寫文檔,參加會議,培訓以及處理個人事務等等。這些時間都會無情的奪走編碼的 時間。程序員大約有近似20%的時間甚至更多會用在與編碼無關的事情上(不算上班或聊QQ),所以不要錯誤的以為每個程序員每天能寫8小時的程序。

            ● 你今天寫了這么多行代碼真有效率!編碼不是在掃地,比誰掃的面積大。不能單純用行數來評價開發人員的工作量。評判的標準應該結合模塊的復雜度,編碼的缺陷檢出量以及最終交付時可用代碼的比例(實踐表明,我們報廢了大量的無用代碼)。

            ● 他今天把自己100多個BUG都改了,我們得在組里表揚下他!在我看來這樣的領導不跟也罷,這就是讓人 相當無語的行為。好的開發者在提交測試前,覺得會對自己的代碼進行走查和調試,甚至使用單元測試工具,因此其代碼的缺陷檢出量很小。這樣的程序員,才值得 被表揚。而那個一天改了自己100多個BUG的人,作為管理者應該想想,流程哪里錯了,需要進行改進。

            ● 設計我來定,開發你閉嘴!這樣的例子也不少,這種做法有一種聽起來非常合理的理由——保證項目架構的概 念完整性。其解釋為,如果將設計人員從開發人員剝離,那么就可以將架構的概念完整性統一,因為設計人員的數量比開發人員是數量要少的多,更容易統一認識。 而這樣做的項目組,也默認地認為設計組的技術實力要明顯高于開發組。他們往往從開發組中選擇優秀的設計人員到設計組,但也會有走眼的時候。其一,硬手沒有 被提拔。這時候多半是硬手對設計不滿,并對團隊管理層產生質疑,并想法設法進行溝通。如果處理的好,可能硬手會被重視,如果溝通無門,那之后,可能會充斥 著抱怨和不滿,以及人際關系的惡化。有些強硬些的可能會選擇拒絕不合理的設計或更為極端的是離職。走眼的另一種情況是,挑的人干不了設計。這樣往往就是讓 他鍛煉,而不是撤換(彼得原理——每個人都會被晉升到他不適合的崗位)。這就郁悶到極點了,設計者將會與相應的數名開發人員進行一場曠日持久的暗戰。其 中,已經不只是個人的抱怨,甚至會演變成成員集體的士氣低落,并最終促成小組的重組。我認為,有必要將開發人員納入設計活動。應該參考開發人員的意見,其 原因有三:其一,開發人員對實現相當熟悉,往往發現設計中的不足;其二,通過授權開發者參與設計,能讓其感受到認同感,提升其參與項目的欲望,和責任心; 其三,讓開發參與設計,可以對設計人員進行儲備,在需要時作為備選資源使用。

            ● 客戶(領導)說必須完成,我也沒辦法!這就是“領導一句話,勞動人民跑斷腿!”這是非常典型的加班借 口。軟件構建過程如同耕種,你每次只處理它的一小部分,一點一點的加到整個系統,使系統一點一點的“生長”。這也暗示了,工作應該按部就班,正如春種秋收 一樣,各個環節有強硬的邏輯存在。所以,我們必須學會對不合理的要求說“不”。這里并不是說要拒絕客戶的需求,而是指應該向客戶說明情況并提出相應的備選 方案以供參考。例如通過通過削減范圍來達到按時完工的目的。PM需要向客戶說明情況,并向其提供幾套可行的解決方案,以促成項目向良性發展。

            ● 我是領導我來排進度!工作進度的安排不能是領導的單方決策,而應該參考做了解這項工作的人的意見。

            ● 系統上線了,項目就算結束了!只有當可交付成果成功移交,項目進行的相應的收尾工作,項目的經驗教訓文檔被總結和歸納,一個項目才算真正意義上的完成。

            (二)參考建議

            ● 做好前期準備。前期準備很重要,如果在開始構建之前認真的地進行適當的準備活動,那么項目會運作的良 好。充足的準備防止我們制造一個錯誤的產品。前期工作的好壞,多少會為這個項目的成功和失敗打下基礎。即使進入構建階段,如果我們發現前期工作做的不好, 也完全有理由退回去。前期準備工作和核心目標就是降低風險——一個好的項目規劃者能夠盡可能早地將主要的風險清除掉,以使項目的大部分工作能夠盡可平穩地 進行。目前,對后期影響最嚴重的風險是糟糕的需求分析和項目規劃,因此準備工作就傾向于集中改進需求分析和項目規劃。

            ● 預先行其事,必先利其器。用軟件武裝團隊提高生產效率,例如:版本控制,錯誤跟蹤,信息發布,自動發布,CASE工具,調試工具,測試工具,文檔管理,代碼生成工具等等。

            ● 分析項目類型,在管理和構建之間找尋平衡。商業系統、使命攸關的系統、性命攸關的系統在整個項目階段具備不同的控制粒度。需要根據項目的具體類型來確定管理的嚴謹程度,避免“過度控制”或“控制不足”。

            ● 需求必須被凍結。需求必須被凍結,如果需求不能凍結,那么誰來了都沒有用。再強的團隊也無法完成一個無盡的任務。

            ● 變更必須走流程。正確應對變更,變更并不可怕,可怕的是失控的變更。以下建議希望對讀者有所幫助:

            在構建期間處理需求變更

            1、核對需求,評估質量:如果需求不夠好,停下來,把它做好再開始。

            2、確保每一個人都知道需求變更的代價:讓客戶知道需求辦更并不像在Excel上進行幾個修改那樣容易,“進度”和“成本”是你最有力的武器。

            3、建立一套變更控制程序:固定的變更控制程序讓你知道在什么時候處理變更,讓客戶知道你會處理他們的提議。

            4、使用能適應變更的開發方法:迭代與增量。

            5、放棄這個項目:如果以上提議沒有一條奏效,需求變更極其頻繁,那么,評估你的項目,考慮放棄它吧,繼續下去你只會越陷越深。

            6、注意項目的商業案例:性價比,沒必要滿足超出項目成本的需求。

            ● 關于加班。做IT的加班是很正常的,但加班要加的有意義,而且不應該長期加班。必須針對關鍵路徑上的工 作進行趕工,而不是做些無法加快整體進度的工作。而且,應當安排調休,而不是支付加班費。其主要原因也是我不贊成加班的原因——疲勞更容易引人缺陷。加班 無疑會使人疲勞,每個人都想盡快結束手上的工作后回家休息。在長期疲憊的情況下,人員的工作效率會下降,士氣會低落,非正常離職率增加,最重要的是疲憊的 團隊很難保證軟件的質量,缺陷在不知不覺中引人,在后期無疑會為此付出代價。項目的總成本和周期,都會隨著引人缺陷的數量的增加而倍增,而且發現的越晚越 嚴重。

            ● 做好版本控制和配置管理。版本控制和配置管理是必須有的,即便是再小的項目也不能忽視,必須加以重視,一旦版本混亂,多多少少會對構活動造成影響。所以,平時不要偷懶,管理好每個基線。

          posted on 2012-04-26 09:22 順其自然EVO 閱讀(192) 評論(0)  編輯  收藏 所屬分類: 管理方向

          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西峡县| 沙田区| 浦江县| 浮梁县| 元氏县| 天峻县| 临沭县| 广元市| 敖汉旗| 繁昌县| 安岳县| 巫山县| 阿瓦提县| 通辽市| 建平县| 永康市| 新巴尔虎左旗| 商洛市| 浦北县| 上虞市| 武平县| 焉耆| 内丘县| 阳曲县| 洛隆县| 荔浦县| 宝丰县| 阳城县| 遵义市| 阜新| 姜堰市| 昭觉县| 牙克石市| 沙河市| 长岛县| 固始县| 万宁市| 柳州市| 上林县| 河南省| 邹平县|