差不多4年前,我在我的部落格上發表了一篇文章——《五年多一線開發經曆告訴我:軟體開發——幾乎不可能cooperate的工作》,地址:http://www.cppblog.com/guogangj/archive/2009/05/14/82909.html
我的觀點是:軟體開發工作是高度依賴腦力運動的工作,而高智商的程式員卻“一山難容二虎”,無法合作。當然了,斷章取義地把這話單獨寫在這裡必定會遭到很多人的反對意見,但如果誰仔細閱讀了我這篇文章之後,估計持反對意見的機率就小很多。直到去年(2012)我讀了《軟體隨想錄》之後,在裡面發現了一個觀點,正是我想表達的意思:
世界上只有一件事比你自己設計軟體更苦難,那就是一個團隊一起設計軟體。
這正是我想說的!
這幾年來我的遭遇正好也印證了這個觀點,大約就是三年前,我還在以前公司的時候,有一個新項目,要設計一種新的產品,涉及面很廣,並且沒有明確具體的產品定義,只有大概的,大老闆給出了很緊迫的時間,要求馬上弄出一種方案出來,開會我們也開了若干次,可進展極慢,尤其是我,我感覺我在這個項目中就是一個外人,根本融入不進去,因為在那個團隊中,我最年輕,在公司的資曆也最淺,自我認為“哪裡輪得到自己發言”?於是我有些怠工,而其他人也積極不去哪裡,可能大家都有這種感覺,反正一個人拍不了板,自己設計出來的東西也許最後也不被採納,於是積極性很低,直到我離開那公司,那個項目究竟用什麼方案,都沒有最後拍板,這是一個典型的用團隊去做設計的失敗案例。
在之後的日子裡,我有單幹過一些項目,也有團隊的合作,我漸漸總結出了一些規律,也漸漸明白如何去運作一個軟體Team Dev。
我不得不說,一個人的戰鬥還是頗有成效的,如果項目不大,一個人能應付得來,那讓一個人做,那樣效率還是最高的,因為不需要那麼多的溝通,相當於節省了溝通成本。
這個人從一開始就負責方案的設計,這個設計出來的方案由他一個人拍板即可,而領導只需要確認功能點即可,不能干預設計,因為如果乾預,就會降低這個負責人的積極性,使他產生一定的“挫折感”,漸漸覺得這個項目不是他的項目,於是開始怠工。
也許你會說:要是這個負責人能力不足,寫出來的東西完全不符合要求怎麼辦?必須還是得領導大量的參與才行啊。——我說不行,項目成功的最關鍵,還是先選對人,如果選了一個能力不足的人,後面領導再怎麼給他“指點江山”,都無濟於事,只會越指越亂,領導就是要學會放開,讓能力勝任的人去負責一個項目,這個負責人應該要負責整個項目的設計工作,在這一點上,一個人單乾和團隊並沒有什麼分別,那就是:設計工作始終一個人來做,這個人,就是項目的負責人。
軟體開發更類似於“藝術創作”類的工作,而不是科研,軟體行業從業多年的人一定清楚這點,程式員是“藝術家”,而不是“科學家”,我個人的職業能力偏向測試也正好是藝術型+工程型(職業能力偏向有6大類,藝術、科研、工程、社交、企業和事務),而且還是藝術型為主要能力偏向。如果把一個軟體項目看作是拍一部電影,那這個項目的負責人就是電影的導演,至今我沒見過由一個團隊充當一部電影導演的例子,而領導則是電影的投資人,投資人找導演,準備要拍一部怎樣怎樣的電影,然後由導演去執行,具體電影怎麼拍,如何編劇,如何設計情境和人物刻畫,這些都是導演的工作,你認為投資人應該幹預嗎?投資人要做的事情,就是選對導演,然後就就把腳翹到辦公桌上,再一手拿張報紙,一手端起茶杯,等著這部影片帶來的收益。
正如一部電影光憑導演一人之力,是無法完成的,很多稍微大一點的軟體項目,也沒辦法一個人單幹,這就涉及到了合作,我幾年前的部落格所說的“無法合作”,其實指的是設計工作無法合作,其它方面則是很需要合作的。
項目負責人,首先要做的事情,就是將一個項目的架構描繪出來,這是總體設計,(或稱“概要設計”),如確定使用什麼平台,什麼資料庫,什麼技術架構,劃分為多少模組……
根據項目的規模以及團隊的成熟度等級,接下來的工作可能就有些不太一樣,如果這是一個新的團隊,且只有兩三個人,那麼這位負責人恐怕就要做更多更細的工作,他得編寫項目的基礎代碼,規範編碼,可能還要負責給項目成員培訓業務及技術,培訓看起來是低效的事情,可如果真正把團隊建設好了,你會發覺培訓的開銷是值得的,當然我並不是說一定要到培訓教室,開啟投影儀,播放ppt這種方式,培訓可以發生在任何時候,在工作中一對一的指導,可能更為有效,這就需要這位“導演”有著紮實的基本功,精通技術,掌握業務,上能應付領導,下能建設團隊,還能根據實際情況適當調整項目開展的策略,隨時解決項目中所遇到的各種問題,這樣的人確實比較難找,但這是一個項目成功的關鍵。
那是不是說,需要一個“超人”來負責項目?這個“超人”凡事親躬,大大小小事情都要處處到位?當然不是,就如一個導演再怎麼厲害,也不可能掌握電影製作的全部細節,即使掌握,也不可能有那麼多的時間,導演必須清楚他是這部電影是設計者,他需要把一些工作交給更專業的人士去做,所以有了服飾設計、燈光效果、音響配樂、演員化妝、武術指導、電腦特效……等等專業人士的參與,導演對這些領域應該都有所瞭解,不可能完全陌生,否則就無法安排工作去實現自己的設計,但他一定需要這些專業人員的協助,這就是合作。
項目大到一定程度,就需要細分,把一個大的項目劃分為若干個小的項目,不變的是:同一個設計,只能交給一個人來做。
隨著團隊的發展,其中的一些組員可能也漸漸地顯露出了自己在“設計”上的才能,這個時候項目負責人就可以拆分出一些小的項目交給他去設計,一來可以減少自己的工作量,讓自己有更多的時間去思考大局,另一方面也很能激發組員的積極性,使得項目朝著良性的方向發展。
這就是軟體開發的合作方式。