在一個管理混亂的軟體公司裡,如果某個程式員能大喊大叫並且幹勁十足,那他就能成為一名程式經理。微軟公司在選擇經理人員時,總是把他們的技術知識和運用技術去賺錢的能力放在首位。程式經理一般就是程式員隊伍中最聰明的那個傢伙。比爾·蓋茨曾這樣描述聰明人[Cusumano1996]:
聰明人一定反應敏捷,善於接受新事物。他能迅速進入一個新領域,給你一個頭頭是道的解釋。他提出的問題往往一針見血、擊中要害。他能及時掌握所學知識,並且博聞強記,他能把本來認為互不相干的領域聯絡在一起使問題得到解決。他富有創新精神與合作精神……
好的程式經理應該具備以下幾個條件:
一、技術水平是程式員隊伍中的最進階別
每個程式員骨子裡頭都有一股傲氣,如果你不能技壓群雄,他們就不會聽你指揮。一個技術水平較差的人被任命為程式經理真是個悲劇,就象一個略有權勢的太監,表面上有人對他點頭哈腰,背後卻被人鄙視。
二、能做最多且最難的工作
程式經理編程要快且好。別人要幹一天的活,他半天就能做完,這樣才會有精力去搞管理。程式經理應負責系統分析、系統設計這類最難的開發工作,並指導不同水平的程式員把各自的工作做好。如果人手不夠,程式經理要能同時幹幾個人的活。
三、有人格魅力
軟
件開發是智力創作過程,你不能指望僅通過執行規章制度來產生好的作品。很多軟體公司的程式經理都不是管理專業出身的,他們也不可能為了搞好管理而成天玩弄
心機。技術出色的程式經理一般少有心術不正的,所以管理的重點應是“以身作則”、“公正待人”。如果程式經理在上班時趴在桌上睡覺,其他程式員也會這樣
幹。如果程式經理髮現有兩個程式員趴在機器旁睡覺,不能只對其中一個大聲吼叫:“你一編程就想睡覺,看看人家,在睡覺時都想著編程。”
如果管理者沒有人格魅力,就沒有人信服你,團隊就不會有凝聚力,烏合之眾不可能開發出優秀的軟體。
有一名市場營銷員和一名程式員都在新聞發布會上發言,將一項新技術的訊息公佈於眾。
市場營銷員說:“這項技術比電話、晶體管和原子彈三項發明加起來對世界文明的影響都要大。”
程式員說:“這項技術在有限的領域內,在有限的程度上,解決了一些技術性的問題。”
有人問一個數學家,一個物理學家和一名程式員:“一個盒子有幾個面?”
數學家回答說:“有六個面,因為盒子是長方體。”
物理學家回答說:“有12個面,分為6個外表面和6個內表面 。”
程式員回答說:“只有兩個面,裡面放電路板和硬碟,外面放顯示器和鍵盤。”
目前即使最先進的電腦也不具備智能,程式員的基本工作就是把複雜的問題轉化為電腦能處理的簡單的程式。如果一個問題複雜到連程式員自己都不能理解,他就無法編出程式讓更笨的電腦來處理。所以程式員信奉“簡單——實用”主義。
廢話大師有句名言:“如果我令你過於輕鬆地明白了,那你一定是誤解了我說的話。”
故事一
不
久前我回到西北那所讀了六年多的大學,驚奇地發現校園裡房前屋後長滿了待收割的小麥!這所大學是從事電子科技的,種小麥幹啥呀?朱總理曾講過:“目前國家
糧食充足,再來三年自然災害也不怕。”現在國泰民安,似乎用不著“深挖洞,廣積糧”。我素知學校提創勤儉節約、自力更生,但與其種小麥還不如種蔬菜呢。老
同學告訴我,種小麥是為了應付“211”工程(為21世紀選拔100所重點大學)的檢查團,因為“211”工程有較高的綠化指標。偏偏檢查趕在冬天,那時的西北極難長草。我那所大學本來就人多地少,地上一長草馬上就會被談戀愛的學生給折磨死。一到冬天,整個校園就光禿禿一片。用小麥綠化校園可謂千古絕筆,檢查團的那些權貴人士早已五穀不分,豈知所見的“草坪”乃是麥田。
檢查工作要預防被檢查者弄虛作假。
工
作在第一線的軟體開發人員是程式員和程式經理,他們決定著軟體的命運。良好的程式員隊伍和出色的管理是軟體項目成功的必要條件。管理不是管制,不是去卡住
人家的脖子,因為程式員不是一群野鴨子。管理的目的是讓大家一起把工作做好,並且讓各人獲得各自的快樂和滿足。當一個組織被出色地領導時,僱員甚至不知道
他們已被領導。在項目完成時,他們會自豪地說:“看看我們通過努力取得的成績吧”。所以管理者不能老惦記著自己是一個官,而應時刻意識到自己是責任的主要
承擔者。
要讓軟體項目失敗很容易,只要符合下列條件之一即可:
(1)專案經理對軟體一無所知;
(2)技術負責人對編程不感興趣;
(3)真真編寫代碼的程式員是臨時僱用的。
如果上述三個條件同時具備,就請放心失敗好了。
聯想集團領導人柳傳志曾說:“沒錢賺的事我們不幹;有錢賺但投不起錢的事不幹;有錢賺也投得起錢但沒有可靠的人選,這樣的事也不幹。”柳傳志為決策立了上述準則,同時也為可以行性分析指明了重點。
有一位程式員忙著編寫程式,經理問他還需要多久才能完成。
“明天就可以完成。”程式員立即回答。
“我想這是不切實際的,實話實說,到底還要多少時間?”經理說。
“我還想加進一些新的功能,這需要花兩個星期。”程式員想了一會兒說。
“即使這樣也期望過高了,只要你編完程式時告訴我一聲,我也就滿足了。”經理說。
幾年以後,經理要退休了。在他去退休午餐會時,發現那位程式員正趴在機器旁睡覺:可憐的傢伙整個晚上都在忙於編寫那個程式。[James 1999]
有句名言:“人分四類——人物,人才,人手,人渣。”
如果一個軟體公司裡上述四類人齊全了,那麼最好的分工是讓“人物”當領導,“人才”做第一線的開發人員,“人手”做行政人員,“人渣”負責行賄。
李敖曾說過:“當你沒法扶一個人上馬時,也許應該拉他下馬”。
唐僧曾說:“妖要是有了仁慈之心,就不再是妖,是人妖。”(《大話西遊之大聖娶親》)
G先生是正人君子,不防小人,實在不是現代的商人。我和他成了忘年交。G先生第一次見到我時問我工資幾何,我答曰:“300元,夠買幾本書。”G先
生甚為著急:“這樣的條件怎麼能生活?你就搬到我家來住吧,我家條件好,你可以安心地學習,將來可為國家多作貢獻。”後來他幾次相邀,我就看在國家的份上
住入他家。自從讀中學以來,我第一次享受食來張嘴,不用洗衣的奢侈。唯一的麻煩是我得向很多朋友解釋:“我不是被別人養起來了,是為了國家的利益,不得已
才這麼做的。G先生是男的不是女的,並且沒有待出嫁的女兒。”
軟體的需求會變化嗎?
答:據曆史記載,沒有一個軟體的需求改動少於三次。唯一隻改動需求兩次的客戶是個死人。這個可憐的傢伙還是在運送第三次需求的路上被車子撞死的。[Cline 1995]
由於客戶大多不懂軟體,他們可能覺得軟體是萬能的,會提出一些無法實現的需求。有時客戶還會把軟體系統分析人員的建議或回覆給想歪了。
有一個軟體人員滔滔不絕地向客戶講解在“資訊高速公路上做廣告”的種種好處,客戶聽得津津有味。最後,心動的客戶對軟體人員說:“好得很,就讓我們馬上行動起來吧。請您決定廣告牌的尺寸和放在哪條高速公路上,我立即派人去做。”
進行需求分析不象情人之間的浪漫做法——“讓我摸摸你的頭髮,感覺它是什麼顏色。”我們要圍繞兩個核心問題開展需求分析:(1)應該瞭解什嗎?(2)通過什麼方式去瞭解?
瞭解需求的方式有好幾種:
(1)直接與客戶交談。如果分析人員生有足球主筆的那張“大嘴”,就非常容易侃出需求。
(2)有些需求客戶講不清楚,分析人員又猜不透,這時就要請教行家。有些高手真的很厲害,你還沒有開始問,他就能講出前因後果。讓你感到“聽君一席言,勝讀十年書。”
(3)有很多需求可能客戶與分析人員想都沒有想過,或者想得太幼稚。要經常分析優秀的和蹩腳的同類軟體,看到了優點就盡量吸取,看到了缺點就引以為戒。前人既然付了學費,後人就不要拒絕坐享其成。
系統設計的四方面內容:體繫結構設計、模組設計、資料結構與演算法設計、使用者介面設計。如果將軟體系統比喻為人體,那麼:
(1)體繫結構就如同人的骨架。如果某個傢伙的骨架是猴子,那麼無論怎樣餵養和美容,這傢伙始終都是猴子,不會成為人。
(2)模組就如同人的器官,具有特定的功能。人體中最出色的模組設計之一是手,手只有幾種動作,卻能做無限多的事情。人體中最糟糕的模組設計之一是嘴巴,嘴巴將最有價值但毫無相干的幾種功能如吃飯、說話、親吻混為一體,使之無法平行處理,真乃人類之不幸。
(3)
資料結構與演算法就如同人的血脈和神經,它讓器官具有生命並能發揮功能。資料結構與演算法分布在體繫結構和模組中,它將協調系統的各個功能。人的耳朵和嘴巴雖
然是相對獨立的器官,但如果耳朵失聰了,嘴巴就只能發出“啊”“嗚”的聲音,等於喪失了說話的功能(所以聾子天生就是啞巴),可人們卻又能用手勢代替說
話。人體的資料結構與演算法設計真是十分神奇並且十分可笑。
(4)使用者介面就如同人的外表,最容易讓人一見鐘情或一見噁心。象人類追求心靈美和外表美那樣,軟體系統也追求(內在的)功能強大和(外表的)介面友好。但隨著生活節奏的加快,人們已少有興趣去品味深藏不露的內在美。如果把Unix系統比作是健壯的漢子和婦人,那麼Windows系統就象嫵媚的小白臉和狐狸精。想不到Windows系統竟然能興風作浪,佔去大半市場。有鑒於此,我們應該鼓勵女士多買化妝品(男士付錢)以獲得更好的介面。
很多程式員經不起“繼承”的誘惑而犯下設計錯誤。
一隻公雞使勁地追打一隻剛下了蛋的母雞,你知道為什麼嗎?
因為母雞下了鴨蛋。
編程大師說:“任何一個程式,無論它多麼小,總存在著錯誤。”
初學者不相信大師的話,他問:“如果一個程式小得只執行一個簡單的功能,那會怎樣?”
“這樣的一個程式沒有意義,”大師說,“但如果這樣的程式存在的話,作業系統最後將失效,產生一個錯誤。”
但初學者不滿足,他問:“如果作業系統不失效,那麼會怎樣?”
“沒有不失效的作業系統,”大師說,“但如果這樣的作業系統存在的話,硬體最後將失效,產生一個錯誤。”
初學者仍不滿足,再問:“如果硬體不失效,那麼會怎樣?”
大師長歎一聲道:“沒有不失效的硬體。但如果這樣的硬體存在的話,使用者就會想讓那個程式做一件不同的事,這件事也是一個錯誤。”
沒有錯誤的程式世間難求。[James 1999]
測試的目的是為了發現儘可能多的缺陷。一個成功的測試樣本在於發現了至今尚未發現的缺陷。
我要替程式員們總結關於改錯的幾點思想方法:
(1)要有勇氣。東北有個林場工人,工作勤奮,一人能幹幾個人的活。前三十年是伐樹勞模,受到周總理的接見。忽有一天醒悟過來,覺得自己太對不起森林,決心補救錯誤。後三十年成了植樹勞模,受到朱總理的接見。此大勇也。
編程大師曾說:“哪怕程式只有三行長,總有一天你也不得不對它維護。”
傻是內因,被騙是外因。傻子碰到好人未必能做出好事,傻子碰到另一個騙子就會做出另一件傻事。