/*
* 這是 《構建之法》 第三版的草稿
*/
3.2 軟件工程中的幾種思維誤區
正如我們在第一章講的那樣,軟件有很多特性,軟件開發有它自己獨特的規律,如果不了解這些特性,軟件工程師就會產生不符合實際的想法,在開發過程中走很多彎路。軟件的模塊之間存在着各種復雜的依賴關系,由於軟件的不可見性和易變性,依賴關系很難定義清楚,並得到及時的維護和修復。對依賴關系的兩種極端態度都會導致可笑的行為,並且無一例外地引起延遲交付。
被依賴關系束縛:一種極端是過於悲觀,不想修復,出了問題都賴在相關問題上面,下面是工程師果凍和項目經理大牛之間的對話[XZ1] :
木桶有一個洞, 咋辦啊, 大牛?
修哇,果凍!
用啥來修啊, 大牛?
用粗麻繩把它堵上, 果凍!
麻繩太長, 咋辦啊, 大牛?
用刀砍短啊, 果凍!
刀太鈍, 咋辦啊, 大牛?
磨刀啊, 果凍!
磨刀石太干, 咋辦啊, 大牛?
拿木桶去取水啊, 果凍!
木桶有一個洞,咋辦啊,大牛?
不分主次,想解決所有依賴問題:另一種極端是過於積極,想馬上動手修復所有主要和次要的依賴問題,然后就可以“完美地”達到最初設定的目標,而不是根據現有條件找到一個“足夠好”的方案。我們還可以看一個小飛的故事:
小飛早上醒來之后,發現宿舍的哥們都出門學習去了,他想起昨晚下決心要和哥幾個一起每天去圖書館自習,連續奮斗一個月迎接考試!他拎着書包出門,發現自行車輪胎氣不足,於是就去找隔壁宿舍的果凍同學借打氣筒,果凍說他的打氣筒昨天拿去她女朋友荔荔那里去了,但是他們倆昨晚吵架了,打氣筒還在荔荔的宿舍里。小飛說我可以去拿!果凍說最好帶個小禮物去;小飛問帶什么禮物呢?果凍說荔荔說過她想要手織的圍巾,小飛想氂牛毛的圍巾最好了,於是小飛就開始剪氂牛的毛[XZ2] 。
過了大半天,同學們自習回來了,看到小飛,就問:你為啥要追着氂牛跑啊?小飛摸了摸臉上的汗水,喃喃地說,我也忘了, 我本來是要去上自習的…
過早優化:既然軟件是“軟”的,那它就有很大的可塑性,可以不斷改進,放眼望去,一個復雜的軟件似乎很多模塊都可以變得更好。一個工程師在寫程序的時候,經常容易在某一個局部問題上陷進去,花大量時間對其優化,無視這個模塊對全局的重要性,甚至還不知道這個“全局”是怎么樣的。這個毛病早就被歸納為“過早的優化是一切罪惡的根源”:
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
Yet we should not pass up our opportunities in that critical 3%. A good programmer will not be lulled into complacency by such reasoning, he will be wise to look carefully at the critical code; but only after that code has been identified[XZ3] .
王屋村軟件學院的小飛同學在下雨的時候經常打着一把很精巧的小雨傘,和同學們一起匆匆趕路。同學們提醒他:
小飛,你這雨傘太小了,你的褲腿都濕了!
但是小飛還是打着這把小雨傘。幾年過去了,在畢業酒會上,大家又談起這個故事。小飛紅着臉解釋了原因:
我原來想,如果有女朋友的話,兩人在雨中打着很小的雨傘,她就會靠我近一些。現在我還是單身,我想起了“過早優化是煩惱的根源”。
過早擴大化/泛化(Premature Generalization):
軟件的”軟” 還表現在它可以擴展, 在寫一個程序的時候,需要某個函數可以處理整數類型和字符串類型的信息。有程序員往往靈光閃現-- 哎,能不能把類型抽象出來,讓這個函數處理所有可能的類型?這樣不就一勞永逸了么?有些軟件本來是解決一個特點環境下的具體問題,有程序員一想,我們能做一個平台,處理所有類似的問題,這樣多好啊!這樣的前景的確美妙,程序員的確需要這樣的凌雲壯志,但是要分清楚必要性,難度和時機。本書8.8.1 提到的畫扇面就是一個很好的例子。
王屋村的程序員這幾種錯誤做法放在一起,就構成了下面這個靚麗的風景線:
(在3.2 后面加一段)
3.3 軟件工程師的職業發展
21 世紀以來,中國大陸每年招收六百萬大學生,其中的百分之十是在學習各種IT 相關的專業(計算機科學與技術、計算機工程、計算機軟件、軟件工程、管理信息系統等)。扣除讀研究生(最終大部分也會走上工作崗位)、出國等分流,同時考慮到培訓機構給就業市場貢獻的大量勞動力,每年大致有四十萬到六十萬左右的“軟件工程師”進入工作崗位。他們都是以什么樣的心態對待這一職業的呢?在工程師抱怨這個行業的同時,我們可以由低到高,看看人們對職業的態度有哪些等級:
1. 臨時的寄托或工作 ( Temporary Work)
在大學你會看到很多人選IT專業的原因和“熱愛”沒有什么關系,有些人是因為專業調劑來到這里,有些人是因為要拿一個文憑作為敲門磚(例如,跨專業考上軟件專業的研究生,然后計划以碩士的資格去考公務員)。 他們處於低動力, 低技能的狀態.
2. 工作 (Job)
這就是一個能掙錢養家的營生,如果別的營生更賺錢,那就會跳到別的地方去。一些人留在這個職業,只不過是因為他不會做別的。這些人會經常問“軟件開發做到35歲以后怎么辦”這樣的問題。當然,如果了解和體會了軟件開發的投入和回報的關系, 這些人的心態會進步到下一個階段.
3. 職業 (Profession)
在工作的基礎上,能加上職業道德,職業規划。只有在這個層次上可以開始談有意義的“職業發展”。他們對“30歲以后”、“35歲以后”都有一定的打算。
4. 投身的事業 (Commitment / vocation )
把軟件項目相關的目標作為長期的承諾,碰到困難也不退縮,一直堅持到完成任務。
5. 理想的呼喚(Calling)
一些人覺得這是理想的呼喚,通過軟件可以改變世界,他們主動尋找機會,實現自己的理想。
很多讀者會問, 我怎么知道這個工作就是我的事業, 或是理想的呼喚呢? 我上課、上班不用心,正因為這不是我想投身的事業,我想投身什么我也不知道,但是肯定不是正在學習的軟件工程!
這些讀者可以參考一下 Emanuel Derman 的故事,他從小喜歡物理,認為這就是“理想的呼喚”,在名校拿了理論物理的博士學位之后,非常想做“純物理”研究,很看不起應用物理,更不用說其他工作了。但是由於經濟和能力的原因,他不得不去一般的大學做物理老師,和家人兩地分居,郁郁不得志。在35歲的時候(很多中國IT人士認為是程序員的職業終點),他改行做了貝爾實驗室某不太重要部門的程序員,在那里領悟到了編程的優美和挑戰;幾年后他跳槽去華爾街證券公司做程序員,第一個項目是把交易員用的命令行程序改造為GUI 的程序(聽起來也不是很高大上),也經常被資深的交易員呼來喚去,令人不爽。但是他堅持學習金融知識,做各種金融分析,逐漸成長為金融風險研究的專家,部門總經理(也被公司解雇過);最后在實踐中把金融,數學,和軟件融合在一起,在這個新領域提出了有廣泛影響力的新模型,被評為金融界的“年度金融工程師”。他最后去一流大學開創了金融工程 (Financial Engineering) 這門學科。他回顧自己的職業經歷時說:
回首當年,我(的態度)的確是錯了。任何事情,當你仔細探究,你就會理解它的量和質;當你對一個領域的神韻足夠了解,並開始連接這個領域的表現形式和實現細節的時候,任何一個領域都是會變得引人入勝的[XZ4] 。
再多說一句,這么多年之后,大家發現交易員的工作逐漸被程序和程序員取代了。
如果我們對職業有認真的態度,那就能發現很多證明個人能力的方式。
[XZ2]尾注:剪氂牛毛(Yak Shaving)是在國外編程編程界小范圍流行的術語,描述為了間接地幫助實現一個目標,而做的一些次要而且和目標無關的工作。其中一個解釋:http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html
[XZ3]尾注:來源於Donald Kunth 的論文 Structured Programming with go to Statements, ACM Computing Surveys, Vol 6, No. 4, Dec. 1974 (p.268).
[XZ4]尾注:故事來自《My Life as a Quant: Reflections on Physics and Finance》作者Emanuel Derman. ISBN 0470192739. 翻譯的文字出自其中第六章。Emanuel Derman的個人網站: http://www.emanuelderman.com