挨踢專案求生法則——編碼篇

張傳波(Fireball)發表於2013-12-19

摘要

有一句古語“少壯不努力,老大做IT”,做IT確實挺悲劇的,但最悲劇的是做碼農(程式設計師)!爛程式碼直接產出來軟體,而爛程式碼是怎樣產生的呢?是爛程式設計師嗎?大部分程式設計師是追求進步和高質量程式碼的,往往是爛的管理方式、無節操的專案工期而導致程式設計師不知所措、疲於奔命、為趕工而寫程式碼。當加班成常態,你還跟我談什麼程式碼質量呢!

 

什麼叫挨踢專案?

IT專案,特別是軟體開發專案,都屬於“挨踢”專案的範疇。挨踢專案的幾大特點:
1.需求不確定。
2.技術不確定。
3.工期限死。
4.預算限死
兩大不確定和兩大限死,你想不“挨踢”都難!

 

“無節操”的加班

某公司有個加班龍虎榜,每週按照加班的總時長進行排名,加班時間最多的就是狀元,然後是榜樣、探花。其實沒有誰這麼變態要打進三強,但大部分人不想自己經常出現在榜尾,因為讓領導看見了不是很好,有可能會導致飯碗不保,所以只能“自覺”加班!於是加班成了家常便飯……

某創業公司的老闆搞了個“獎罰分明”的激勵制度,任務分派下來如果能提前完成,提前時間越多,獎勵越多;相反,如果任務推遲完成,推遲越多懲罰越多。結果大家都懂的,這些任務基本都是 mission impossible,“提前完成”需要人品大爆發,“推遲完成”是正常現象,程式設計師們的薪金都被扣得差不多了,再推遲的話就要倒貼公司了!

一個人一天當中,能高度集中精神的工作時間有多長呢?你可以自測一下,我的答案是6小時,偶爾可以爆發到7-8小時。

如果不用加班,按一天工作8小時算,如果其中有6小時能高度集中精神工作,其實已經很不錯了!

如果加班呢?我告訴你,原本還有6小時的高效工作時間,馬上就會減少!加班越長這6小時減少得越多,如果加班時間家常便飯,那麼這6小時就會變成零!

軟體研發不是體力活,是高強度的智力運動,希望管理者要清楚明白這個軟體研發的客觀規律,我們不能違背這個自然規律。低效率的加班只能是一種心理安慰(這個心理安慰只對領導有效),只能帶來更多的問題。

 

“奔放”的專案管理者

領導要K人,一般會把要K的物件叫進會議室,然後關上門來K,開門後就好像沒有發生過任何事情一樣,門外的人一律不知道發生了什麼事情。(PS:這裡說的K不是指打人噢,而是批評,俗稱罵人。)

但是有些領導很“奔放”,直接當眾K人,有些郵件K,但這個郵件會抄送專案組全體甚至全體員工!我運氣比較好,還沒有遇到過“奔放”老闆,但萬一你運氣好,遇到了被領導“奔放”地K了一頓,你會怎樣呢?當然你要這樣想:這個領導其實算不錯的了,在“陽光”下K你,如果他來“陰”的,豈不是更恐怖!

悶騷、靦腆、臉皮薄、心靈弱小,是程式設計師的特點,一般的程式設計師是接受不了“奔放”的管理模式的……

 

保命四招

如果你遇到“極端情況”,後面介紹的法則都不會適用,你要用的是這保命四招。

什麼是“極端情況”呢?

那就是類似前文提到的“無節操的加班”和“奔放的專案管理者”這些情況,當然不限於這些情況,因為沒有最慘只有更慘!

以下是保命四招: 

1)抱怨有益健康。

有人說抱怨沒有用,但如果不抱怨你會憋死,所以你需要宣洩,你可以約朋友吃飯喝酒齊齊訴苦,這樣才能有益身心。但要注意抱怨並不能解決問題,不要沉迷抱怨噢!

2)忍一時風平浪靜,退一步死無全屍。

工作中遇到不公想發作,你一定要用第二招:忍一時風平浪靜,退一步死無全屍!要忍但不要退,要用耍太極的方式來推擋一些事情,不要累死自己便宜了別人。

3)自我增值才是硬道理。

增加你的價值就是增加你的談判籌碼,這就是第三招。我曾經和領導直接電話對罵,我居然沒事,因為當時公司需要我完成這個專案,我有恃無恐!你可以嘗試在公司爆發一下,測一下你的價值,如果爆發完你沒事,說明你對公司的重要性不錯。但如果出事你不要找我噢!我當年敢幹這些出格的事情,是因為我年少無知、血氣方剛,並且自以為自己很牛B!自我增值讓你有更多選擇,能幫助你選擇更好的工作。

4)我只想將工作做好!——這不可取,因為這是你辛苦的根源。

在“極端環境”下,好的工作態度是不受歡迎的,只能變成折磨你自己!做好工作不是你一個人的事情,我們沒有這麼強大,我們只能順勢而為。很多事情我們改變不了,但我們能改變自己。我不是鼓勵消極的工作態度噢,這是在你因為各種原因還不能選擇更好的工作機會時的過渡方法,有好的工作環境時,你就需要重新樹立“我要將工作做好”的態度!

 

面對“極端情況”我也沒有什麼好招,前面的內容實在是太多負能量了,實在有點“兒童不宜”!

下面將會介紹“正常情況”,“正常情況”當然也會存在很多問題,但這些問題都是有機會解決的,後面的內容都是正能量滴,是“老少咸宜”滴噢!

 

犧牲質量能提升進度嗎?

專案管理基礎知識中提到,專案管理主要管成本、進度和質量,我們不可能用很低的成本、很快的進度和很高的質量來完成專案,也就算俗稱的“多快好省”地完成專案是不可能的。我們的軟體專案成本是卡死的,進度也是很緊的,所以我們只能稍微降低質量來保證進度,這樣的邏輯合理嗎?

實際工作中我們其實就是進度優先,但仍然有很多加班。忽視質量其實並不能帶來更快的進度,而是更多的加班!

我們為什麼會加班?我們的加班大部分原因是要返工,或者是前面沒有發現問題後期問題才爆發,簡言之就是前面工作質量不過關,導致後續更大的工作量。工作質量包括需求的質量、設計的質量、程式碼的質量等等。重視質量反而會加速專案進度!我們需要定下專案的基本質量要求,想清楚才動手,一步一個腳印地做好專案。

 

程式碼的重要性

我認為專案中是兩類文件是必須的,那就是需求和程式碼!有人可能會更絕,必須的文件只有一種,就是程式碼!沒有程式碼就編譯不出軟體,其他文件可以不要,但程式碼必須有。而程式設計師是寫程式碼的,非程式設計師是寫其他文件的,所以除了程式設計師,其他角色也可以一律不要。其實上述說法是成立的,我曾經試過只有我和另外一位程式設計師的情況下,不需要其他人就我們兩個程式設計師,我們就能做好一個軟體並且這個軟體的銷量還可以。

程式碼及程式碼的質量其實是相當重要的,但很多專案可能是這樣的一種現狀:不抓程式碼質量,軟體問題多多,但一抓程式碼質量,專案馬上就會死翹翹! 

如何解決上述困境呢,下面的求生法則可能有用! 

 

法則1:問題根源80%在於需求

程式設計師的工作職責是什麼?這個是單選題,你選擇哪個?

A)寫程式碼;
B)完成領導分派的任務;
C)實現自我價值;
D)實現客戶價值;

標準答案是:D

客戶價值就是通過需求來體現的,不要扎頭就寫程式碼,要弄清楚需求。需求文件其實是必須的,不過文件的載體和格式是不限的。

 

法則2:拒絕需求變更

某專案原定一個月釋出某版本,但這個版本延遲大半個月還是發不出來。原來客戶喜歡提需求變更,並且越接近釋出日期,變更的要求就越多,客戶希望這個版本包含的內容越多越好,而專案組為了不得罪客戶答應了這些要求。不要怕得罪客戶,要拒絕這樣的需求變更,我會跟客戶這樣說:歡迎需求變更,但這個版本不考慮,下個版本再考慮。

這個法則並不是要你拒絕所有需求變更,而是某個一迭代中要實現的需求是穩定的,不適合再改的。盲目順從客戶最終並不會讓客戶滿意,而程式設計師們因為要應對這些需求變更,需要反覆改程式碼,這樣是很打擊士氣的。

需求變更是不可能沒有的,我們需要:

1)檢討需求分析的工作質量,請留意法則1;
2)原則上要拒絕當前版本的需求變更,下個版本再考慮;
3)萬一遇到重大的需求變更確實需要馬上實施,那可以停掉當前版本重新規劃,一定不能用“逐步添油”的方式工作。(出現這種情況,通常是因為需求分析工作質量不過關導致的,所以法則1很重要啊!)

 

法則3:程式設計師的工作需要有靈魂

我們先看看什麼叫程式設計師工作“沒有靈魂”:

1)不知道自己為什麼客戶服務;
2)不知道專案的遠景;
3)只有專案經理操心專案,而程式設計師以“打工”的心態工作;
4)程式設計師任何改進意見都聽不進,能寫完程式碼就阿彌陀佛了!

那怎樣才能讓程式設計師“有靈魂”呢?

1)讓程式設計師理解需求,至少自己做的部分要理解;
2)讓程式設計師先行自己估算自己的工作,專案經理給出指導;
3)尊重程式設計師的實際水平,想辦法讓他引爆小宇宙,而不是靠強壓。

 

法則4:寫程式碼也是在做軟體設計

程式設計師們會用“碼農”來自嘲自己,其實寫程式碼是高技術含量的活,寫程式碼其實同時也在做軟體設計工作,包括軟體的架構設計、詳細設計甚至是資料庫設計!

當你用開發工具規劃solution、project的時候,當你在project中劃分資料夾的時候,你其實就是在做架構設計;當你新建一些類檔案,思考類的職責並且在註釋中寫下來,當你寫下方法的定義(暫時沒有實現的程式碼)的時候,你其實就在做詳細設計;當你分析各種業務物件後,在資料庫中去建立表、欄位、表關係的時候,當你在程式碼中設計實體類的時候,你其實在做資料庫設計及實體類設計。

所以我們不是碼農,優秀的程式設計師其實也是優秀的軟體架構師、軟體設計師以及資料庫設計師!作為程式設計師來說,不要將自己定位為碼農,你可以站得高做得更好;作為程式設計師的領導來說,不要將程式設計師定位為低技術含量的工種,程式設計師其實是最重要最有技術含量的工種。

 

法則5:關注程式設計師的需要

問:工作了這麼久,領導找過你談心沒有?

答:有啊,經常“談心”呢!談工作,談進度,談缺陷,談做完了沒有!!

我說的“談心”是指領導和員工談員工的職業發展,讓員工說出他的想法,領導在公司層面給予支援和幫助。

程式設計師有什麼需要?無非是以下需要:

1)薪金的需要;
2)個人職業發展的需要;
3)生活上的需要。

薪金的需要通常是不能滿足的,作為程式設計師領導的你可能也對自己的薪金不滿,更談不上讓你去漲程式設計師的薪金了。但領導是不是可以問問程式設計師的職業需要呢,他想學什麼技術,做什麼型別的專案等等,在工作安排上給予一定的照顧呢?在生活上是不是可以允許程式設計師稍微彈性上班呢?有些家庭生活上的事情可以讓程式設計師先去處理一下,不用他請假更加不會扣他的工資,程式設計師沒有後顧之憂才能做好工作啊。程式設計師可能是地球上最善良的一類人,他們會滴水之恩湧泉相報!

 

法則6:男女搭配效率加倍

有些公司比較“變態”:不招聘女生,如果要招聘就一定要找已婚已育的!還冠上冠冕堂皇的理由:女生出差不方便啊!女生加班不方便啊!

有些領導比較“歧視”女生:女孩子嘛,不適合幹什麼技術活,做一下測試或QA就好了。

女程式設計師本來就少,加上以上的原因,更加是少上加少!

女生的威力特別是女程式設計師的威力是很強大的,不僅僅是這位女程式設計師自身的作用,更重要的是女程式設計師對男程式設計師發生的化學作用!如果男程式設計師原來的戰鬥力是10,如果有女程式設計師一同工作,那麼男程式設計師們的戰鬥力至少可以上升到15。所以那些老闆們太不會打算盤了,不要只看著女生生孩子的那段時間,請一位優秀的女程式設計師,絕對是一個超值的投資!

 

法則7:編碼規範不是擺設

問:你們有編碼規範嗎?

答:有!

問:誰能說出編碼規範中最有用的幾條要求?

答:……

不少公司的編碼規範是“空降”的,或者是你來到公司後就一直知道有編碼規範這回事,但一直沒有見過這份文件,更加沒有在工作中執行過。

“空降”的意思是所謂的參考業界標準“抄”過來的一份文件,或者從某CMMI多少級的公司中“抄”過來的文件,“空降”文件註定就是要被擺上神臺供奉,不能落地的。

有效有用的編碼規範可以很簡單,最開始的時候可以一頁紙就搞定!我們只需要總結出當前編碼中出現的問題,針對性地定出規範,只制定當前能執行的規範,不能執行的不要寫進去,這樣很快一頁紙的規範就可以定出來,並且大家都願意執行。規範不在於長短,不在於參考了什麼“偉大”的標準,關鍵是能不能執行!

所有的改進都應該遵循循序漸進、持續改進的原則,這樣一頁紙的規範將會逐漸新增更多的內容,這樣也表明了我們的程式設計水平正在持續提升。

 

法則8:提升程式設計基本功

有些程式設計師是寫不出排序演算法的,更悲劇的情況是在一堆數中找出最大的演算法也寫不出來。

兩個途徑解決程式設計基本功的問題:

1)把好入職關,增加程式設計基本功的筆試題。
2)增強程式碼評審。

程式碼評審應該在早期就做,高手評初手,評審主要目的不僅僅為了發現和解決問題,更重要的是提升程式設計師的水平。程式設計師水平提升後,評審就可以減少次數甚至不需要。

 

法則9:零缺陷意識

MSF(微軟解決方案框架)提到的“零缺陷意識”非常有價值!零缺陷程式碼可能真的很難寫得出來,但零缺陷意識必須有。

作為專案管理者來說,你要知道零缺陷的程式碼才能準確預測專案的進度;作為程式設計師來說,你要把這個當成基本的素養,對自己提出嚴格的要求,不要盲目求快,不要說反正後面有測試,如果程式有問題,那就是測試沒有做好。

作為程式設計師來說必須做到以下兩點的最基本質量要求:

1)你的程式能編譯通過;
2)你的程式能通過“冒煙測試”。

通過冒煙測試是指:

1)模擬使用者的最常見的正常操作,程式不會出錯。
2)點選所有能點選的按鈕、選單等,程式不會出錯。

這個冒煙測試是程式設計師自己做的,程式設計師們要自己擦乾淨自己的屁股噢!

 

法則10:避免“外包人頭”

某些大公司大國企為了所謂的降低研發成本,會使用一些“臨時工”,這些臨時工和正式工一同工作,通常正式工幹主要的崗位,而臨時工幹碼農的工作。這些臨時工是一些合作方公司以“外包人頭”的方式租給僱主公司,臨時工是合作方的正式員工,但在僱主公司那裡他們就是“臨時工”。

將軟體研發工作特別是編碼工作看成是低技術含量的事情,將程式設計師看成“工人”,這本身就是違背軟體研發特點和客觀規律的不合理做法!對於一些公司這樣的做法,我是強烈噴之的。這樣的做法其實不會降低成本,反而是增加不少成本。如果你是公司的管理層,強烈建議你不要採用這樣的做法,說得難聽一點,這是“反人類”的做法,而且這其實並不是“同工同酬”,其實是違法的做法。

試想一下,“臨時工”會有怎樣的戰鬥力?不是他能力不行,而是體制上的問題,他願意全力以赴嗎?軟體研發是高技術含量的團隊工作,不是靠人多就搞定的。假設企業原本打算使用100名臨時工,你不如招聘20名正式員工,20人的正式員工比100人的臨時工的工作效率會更高,但總成本節省不少。企業還可以將節省的成本拿一部分出來,用來提升大家的薪金,這樣整體效率會提升不少。

如果你的團隊中已經有“臨時工”了,你也無法改變領導層僱傭臨時工的用工策略,你該怎樣辦呢?

相信你在工作中已經能體會到,你是很難調動“臨時工”的工作積極性的,當然會有少數“臨時工”是不錯的。你可以參考“法則5:關注程式設計師的需要”,程式設計師是一種你對我好、我對你更好的善良物種。

 

小結

有那麼一句話:找老公就要找程式設計師!

這句話不太對,你當女程式設計師不存在啊,這句話應該是:找老公就要找男程式設計師!

那找老婆呢?女程式設計師!遇到單身女程式設計師,一定要儘早動手,因為她很搶手。

程式設計師們是可愛的群體,編碼是高難度高技術含量的活,希望我們的編碼工作能變成富有激情和戰鬥力的工作吧!

 

如果本文對你有幫助,麻煩點一下“推薦”啦,謝謝!

 

 

作者:張傳波

創新工場創業課堂(敏捷課程)講師

軟體研發管理資深顧問

CMMI首席專家

《火球——UML大戰需求分析》作者

軟體知識原創基地創辦人

相關文章