時(shí)勢(shì)可用而不可恃
與很多同齡人相比,我接觸電腦的時(shí)間比較晚,一直到1996年,我才開始學(xué)習(xí)電腦操作。最初我的目標(biāo)很簡(jiǎn)單,就是打打字,畫畫圖,打打游戲,看看影碟。如果說(shuō)想寫程序的話,主要也就是用來(lái)應(yīng)付一些專業(yè)課,確實(shí)沒有在程序設(shè)計(jì)上深究的想法。但初步學(xué)會(huì)了一點(diǎn)編程基礎(chǔ)之后,意識(shí)到編程并不復(fù)雜,我就不能自禁地在編程學(xué)習(xí)上投入越來(lái)越多的時(shí)間,并最終決定放棄本專業(yè),轉(zhuǎn)行軟件開發(fā)。后來(lái)我了解到,很多同齡人都跟我有相似的“轉(zhuǎn)行”經(jīng)歷。而之所以我們會(huì)放棄自己的專業(yè)優(yōu)勢(shì),串行到軟件開發(fā)領(lǐng)域,“興趣”固然是一方面原因,而更重要的原因,恐怕還是當(dāng)時(shí)的時(shí)代潮流。
在九十年代中后期,隨著PC的普及和互聯(lián)網(wǎng)的出現(xiàn),國(guó)內(nèi)高校中計(jì)算機(jī)和軟件開發(fā)成為顯赫一時(shí)的潮流,“電子化”、“信息化”勢(shì)不可擋地涌入各個(gè)專業(yè)領(lǐng)域,給幾乎所有成熟行業(yè)帶來(lái)了巨大的沖擊。社會(huì)上對(duì)于軟件開發(fā)人才的需求突然增加,待遇也有明顯優(yōu)勢(shì)。再加上美國(guó)克林頓時(shí)期的“高科技浪潮”、“新經(jīng)濟(jì)繁榮”的光環(huán),以及微軟、Borland、金山、江民等等成功傳奇,使得人們普遍對(duì)于計(jì)算機(jī)和軟件行業(yè)的未來(lái)產(chǎn)生了過于樂觀的預(yù)期。很多人都覺得,只要搞了軟件,成功是唾手可得的。
在這種大潮流之下,學(xué)校里能擺弄電腦,特別是會(huì)寫程序的學(xué)生,特別受老師的器重,在就業(yè)市場(chǎng)上也有特別的優(yōu)勢(shì),一個(gè)個(gè)器宇軒昂,盛氣凌人。今天聽起來(lái)可以當(dāng)笑話,但當(dāng)時(shí)我認(rèn)識(shí)的本校和外校的同學(xué)當(dāng)中,至少有三個(gè)人信心滿滿地宣稱自己要做中國(guó)的比爾蓋茨,其他的人呢?很多只是沒有說(shuō)出來(lái),心里的夢(mèng)想是一樣的。在這樣的一種狂熱氛圍之下,一旦你學(xué)會(huì)寫程序,就不可避免地開始在腦海里編制各式各樣的美夢(mèng),在這些美夢(mèng)的誘惑下,“串行”就成了理所當(dāng)然。
如今,我們這一批“串行生”中,有不少已經(jīng)成為中國(guó)IT產(chǎn)業(yè)的骨干,從這個(gè)意義上講,似乎實(shí)現(xiàn)了當(dāng)年的愿望。但I(xiàn)T產(chǎn)業(yè)在中國(guó)卻縮水為一個(gè)競(jìng)爭(zhēng)激烈、外部估值嚴(yán)重下調(diào)的普通行業(yè)。曾經(jīng)的美夢(mèng),對(duì)絕大部分人來(lái)說(shuō)并沒有成真,反而是當(dāng)年大家并不熱衷的公務(wù)員、國(guó)企等去處,靠著似乎取之不盡的公帑和用之不竭的公權(quán)成為高通脹時(shí)代的幸福特區(qū),這不得不說(shuō)又是當(dāng)初沒有想到的。于是很多人在失意之余,經(jīng)常“悔不當(dāng)初”地設(shè)想,如果自己當(dāng)年不轉(zhuǎn)行,或者如今已經(jīng)在某機(jī)關(guān)爬到處長(zhǎng)的位置,如何如何。
我不以為然。
不可否認(rèn),當(dāng)年我們這么一批人轉(zhuǎn)行IT,有很大的跟風(fēng)投機(jī)的成分。對(duì)于這個(gè)行業(yè)以及其發(fā)展趨勢(shì),缺乏基本的了解和積累,對(duì)于自己的發(fā)展也缺少基本的定位和構(gòu)想,而是看到這個(gè)行業(yè)的火爆,就迫不及待地想沖進(jìn)去分一杯羹。進(jìn)入這個(gè)行業(yè)之后,很多人也繼續(xù)保持投機(jī)的心態(tài),今天看到這個(gè)火了,就過去撈一把,明天看到那個(gè)有上升趨勢(shì),就沖過去占個(gè)位置。然而事實(shí)已經(jīng)證明,我們所處的這個(gè)時(shí)代,是一個(gè)外部環(huán)境變動(dòng)不居,復(fù)雜性不斷加劇的時(shí)代。就拿IT產(chǎn)業(yè)內(nèi)部的這點(diǎn)事情來(lái)說(shuō),我在CSDN的六年,說(shuō)長(zhǎng)不長(zhǎng),說(shuō)短不短,而風(fēng)潮的變化何等激烈!最初,企業(yè)應(yīng)用市場(chǎng)中.NET與Java之爭(zhēng)是所有人關(guān)注的中心,誰(shuí)知Google的崛起掀開Web 2.0大幕,一時(shí)之間人人都想著“做網(wǎng)站、賺大錢”。Web 2.0泡沫還未散去,云計(jì)算和移動(dòng)又成為顯學(xué),引得無(wú)數(shù)人趨之若鶩。這還是相對(duì)較大的趨勢(shì)變化,更具體地看,軟件工程領(lǐng)域里從CMM到敏捷,J2EE領(lǐng)域里從EJB到SSH,編程語(yǔ)言領(lǐng)域中從Java、C#到動(dòng)態(tài)語(yǔ)言再到Erlang、Scala等新生代語(yǔ)言,還有無(wú)數(shù)飄起來(lái)又迸碎的肥皂泡,如果是追風(fēng)潮,只會(huì)無(wú)所適從。因此,在這個(gè)時(shí)代,我們已經(jīng)不能基于對(duì)外部環(huán)境的簡(jiǎn)單預(yù)期來(lái)制訂自己的規(guī)劃,只有打好基礎(chǔ),積累優(yōu)勢(shì),守時(shí)待勢(shì)。換句話說(shuō),時(shí)勢(shì)可以“用”,而不可以“恃”。我認(rèn)識(shí)的成功的技術(shù)人,或多或少都經(jīng)歷過一段咬牙堅(jiān)持的低谷。沖過低谷,就能夠獲得別人無(wú)法企及的積累,時(shí)機(jī)一到,便能勢(shì)如破竹。
從這個(gè)意義上說(shuō),今天去羨慕公務(wù)員,就跟當(dāng)年投機(jī)IT一樣。當(dāng)年不假思索地認(rèn)為搞軟件就能發(fā)大財(cái),今天則堅(jiān)信公權(quán)力的揮霍可以長(zhǎng)期持續(xù)下去,一樣的盲目,一樣的篤信。但時(shí)勢(shì)的變化,孰能逆料?
抬頭看路,埋頭趕路
我最初迷上編程,也就是用Turbo C 2.0開發(fā)一些DOS下的結(jié)構(gòu)計(jì)算和簡(jiǎn)單的有限元程序,然后用Visual Basic去寫一些例子水平的Windows程序,照著書上的例子用匯編語(yǔ)言調(diào)用DOS的INT 21h中斷。但很快,我就感到不滿,我意識(shí)到自己對(duì)于編程這個(gè)領(lǐng)域知之甚少,完全是盲人瞎馬,無(wú)法確定自己是在朝什么方向前進(jìn)。今天的年輕學(xué)生很難理解當(dāng)時(shí)我所有的這種不安全感,但處于我當(dāng)時(shí)的環(huán)境,走錯(cuò)路的風(fēng)險(xiǎn)是現(xiàn)實(shí)存在的。身邊沒有什么高手可以請(qǐng)教,更沒有互聯(lián)網(wǎng)來(lái)開拓視野,我甚至從老師那里得到諸如“DOS將會(huì)永遠(yuǎn)是主流”、“Visual Basic將取代C語(yǔ)言”、“C++將被Visual C++淘汰”之類的“專業(yè)建議”。這些糟糕的經(jīng)驗(yàn)讓我強(qiáng)烈的不安,所以我決定,在進(jìn)入這個(gè)行業(yè)之前,要先對(duì)它有一個(gè)基本的認(rèn)識(shí)。我的方式,就是大量的、廣泛的閱讀。
那時(shí)候在我出沒的范圍之內(nèi),有三四家上規(guī)模的計(jì)算機(jī)專業(yè)書店。沒課的下午和周末的大塊時(shí)間,就成了我的閱讀時(shí)間。我?guī)缀趺恐芏家状?,站在書店的角落里,一讀就是半天。書店里一排排的書柜,在我看來(lái)就是了解軟件開發(fā)這個(gè)行業(yè)的一幅幅地圖,不管是有關(guān)的、無(wú)關(guān)的,看得懂的、看不懂的,聽說(shuō)過的、沒聽說(shuō)過的,我都不放過。通過如饑似渴的閱讀,我了解到,除了DOS和Windows 95之外,世界上還有Windows NT和UNIX,了解到Win32不是Windows 3.2,COM跟.com不是一回事,VBA也不是Visual Basic Advanced,了解到Delphi正在跟Visual Basic激烈競(jìng)爭(zhēng),了解到C/S體系結(jié)構(gòu)的含義,也明白了當(dāng)時(shí)仍然走紅的FoxPro將很快被SQL數(shù)據(jù)庫(kù)所取代。逐漸的,我的大腦里出現(xiàn)了一副軟件開發(fā)領(lǐng)域的全景地圖,盡管今天看來(lái),這幅地圖非常不精確,也并不全面,但是對(duì)當(dāng)時(shí)的我來(lái)說(shuō),已經(jīng)可以用它來(lái)為自己的學(xué)習(xí)導(dǎo)航了。
事實(shí)上,這段時(shí)間的經(jīng)歷對(duì)我正反兩方面的影響都非常深遠(yuǎn),一方面,我由此形成了對(duì)軟件開發(fā)領(lǐng)域的全局性的理解,多年之后,這種理解成為我在CSDN工作的主要優(yōu)勢(shì),也使我對(duì)于行業(yè)發(fā)展的趨勢(shì)形成了自己的觀點(diǎn);另一方面,過于關(guān)注大格局,使我少了埋頭鉆研的恒心,對(duì)關(guān)鍵領(lǐng)域深入不夠,這又成為我的遺憾。
我后來(lái)在CSDN工作的時(shí)候,曾經(jīng)用“抬頭看路”和“埋頭趕路”這兩個(gè)狀態(tài)來(lái)描述一個(gè)程序員理想的學(xué)習(xí)周期。“抬頭看路”,就是專門拿出一個(gè)時(shí)間段,把所關(guān)注行業(yè)的大趨勢(shì)看清楚,并結(jié)合自己的情況,設(shè)定目標(biāo)和計(jì)劃。“埋頭趕路”,就是在目標(biāo)和計(jì)劃設(shè)定清晰之后的一段時(shí)間里,把自己封閉起來(lái),“兩耳不聞窗外事”,不再關(guān)心行業(yè)的風(fēng)云紛擾,而是踏踏實(shí)實(shí)實(shí)現(xiàn)自己的目標(biāo),形成特長(zhǎng)。
拿我自己的例子來(lái)說(shuō),我那時(shí)拒絕了計(jì)算機(jī)專業(yè)課老師主攻Visual Basic的建議,果斷地選擇C語(yǔ)言作為自己的主攻方向,應(yīng)該說(shuō)是基于“抬頭看路”所得出的正確決策。而之后過早的從C過渡到C++,則應(yīng)該說(shuō)犯了一個(gè)錯(cuò)誤。C語(yǔ)言的小巧、明快、圓滿和強(qiáng)大,迄今無(wú)出其右。由于其語(yǔ)言簡(jiǎn)捷,沒什么可學(xué)的,學(xué)習(xí)者的旺盛精力將很快“被迫”轉(zhuǎn)向真正有價(jià)值的東西——算法、數(shù)據(jù)結(jié)構(gòu)、編譯、圖形、系統(tǒng)編程,等等。我后來(lái)認(rèn)識(shí)的很多高手,就是因?yàn)樵缱吡藥撞剑?#8220;沒聽說(shuō)C++”,就在C上下了苦功夫,“埋頭趕路”,反而“因禍得福”練成了很強(qiáng)的動(dòng)手能力,而能有一方成就。而我過早進(jìn)入C++之后,在C++的語(yǔ)言里打了幾年的滾,反而對(duì)于算法、編譯、匯編語(yǔ)言等基本領(lǐng)域投入不夠,基礎(chǔ)沒有打牢,離開學(xué)校之后不得已花了很多倍的精力來(lái)彌補(bǔ)?,F(xiàn)在回想起來(lái),這就是專注不夠的教訓(xùn)。
到后來(lái)我在CSDN工作的時(shí)候,這方面的體會(huì)就更深。那幾年里,為了能夠與各路高手平等交流,我?guī)缀跎娅C了所有重要的技術(shù)領(lǐng)域,研究了大多數(shù)熱門的技術(shù)概念,閱讀之廣,嘗試之雜,遠(yuǎn)遠(yuǎn)超過一般軟件開發(fā)者的需要。正因?yàn)檫@種“博”,使我對(duì)于各技術(shù)派別以及各主要企業(yè)之間的關(guān)系和沿革能夠了然于心,從而對(duì)于行業(yè)發(fā)展形成自己的見解。這對(duì)于我在CSDN的工作來(lái)說(shuō),固然是一種必要,但是其實(shí)身處其中,甘苦自知。俗話說(shuō)“樣樣皆通,必然樣樣稀松”,廣泛涉獵的代價(jià)就是深入不夠,我對(duì)此可謂有切身之痛。
反而是到了現(xiàn)在,我可以在業(yè)余時(shí)間以平和的心態(tài)深入研究自己喜歡和擅長(zhǎng)的領(lǐng)域,便又可以享受“埋頭趕路”、不聞世間紛擾的充實(shí)與快樂了。
遇高人不可交臂而失之
我在初步掌握C語(yǔ)言之后不久,就一步踏進(jìn)C++。C++復(fù)雜的語(yǔ)法、強(qiáng)大多樣的抽象機(jī)制、奇妙的各種語(yǔ)言現(xiàn)象,極大地滿足了我的好奇心和求知欲。我買了好幾本書,幾乎是手不釋卷地每日暢游于其中。我不想過多渲染當(dāng)年學(xué)習(xí)C++的艱辛,其實(shí)對(duì)于語(yǔ)言本身,我并沒有花多長(zhǎng)時(shí)間就形成了一個(gè)大概的認(rèn)識(shí)。但是C++的真正挑戰(zhàn)在于從“知”到“行”。我最突出的印象是在當(dāng)年學(xué)習(xí)計(jì)算機(jī)圖形學(xué)時(shí),老師布置了一個(gè)大作業(yè),我信心滿滿地希望用最新掌握的Visual C++在Windows下來(lái)完成。那時(shí)候我已經(jīng)熟悉Win32 SDK開發(fā),在窗口過程(wndproc)之中援引定義好的一組類,就可以完成手上的工作。構(gòu)思起來(lái)似乎很容易,但是一下手就發(fā)現(xiàn)腦子非常亂,要設(shè)計(jì)哪些類,在類與類之間建立什么樣的關(guān)系,是不是使用模板,選擇似乎非常多,而似乎每一條路都有優(yōu)勢(shì),也有問題。以我當(dāng)時(shí)的經(jīng)驗(yàn),完全沒有選擇的依據(jù)。勉強(qiáng)下手之后,很快遇到了一系列的問題,產(chǎn)生了一連串新想法,進(jìn)一步動(dòng)手寫出一堆新的類,就這樣,我在問題的外圍架床疊屋地打轉(zhuǎn),幾乎寫了一個(gè)小小的Windows圖形類庫(kù),但好像代碼越多,距離要做的具體事情反而越遠(yuǎn),心里越發(fā)虛。到了即將交付任務(wù)的日期,我已經(jīng)積累了一大堆沒有測(cè)試過的類代碼,結(jié)果可想而知,當(dāng)最后我終于將任務(wù)代碼寫完之后,編譯運(yùn)行的結(jié)果就是程序崩潰。在進(jìn)行了幾個(gè)小時(shí)的調(diào)試之后,我喪失了耐心和信心,于是推翻全部代碼,轉(zhuǎn)而用C風(fēng)格重寫了整個(gè)程序。這一次效果非常明顯,僅僅熬了一個(gè)通宵就完成了一份高分作業(yè)。
當(dāng)時(shí)這件事情對(duì)我的刺激很大,在一種羞辱的感覺中,我強(qiáng)烈地意識(shí)到我的C++水平其實(shí)非常低下,于是我就到處尋找能夠提高C++水平的書。很自然的,MFC就被我納入視線之中。
當(dāng)時(shí)正值MFC處于其頂點(diǎn),書店里介紹MFC的書不但數(shù)量多、篇幅大,而且那行文的派頭也最足,給我的印象,好像MFC就是軟件開發(fā)皇冠上的明珠,掌握了它就可以俯瞰眾生。所以我買了好幾本大部頭的MFC書來(lái)啃。老實(shí)說(shuō),如果抱著知其然而不知其所以然的心態(tài)去學(xué)習(xí)MFC,其實(shí)也并不是那么困難的事情。在微軟強(qiáng)大的開發(fā)環(huán)境支持之下,照著書上的例子多做多練,上手并不難。但對(duì)于我來(lái)說(shuō),越是使用MFC,我就越是不滿。第一,我不明白MFC為什么要這么設(shè)計(jì),特別是那個(gè)Document/View,到底有何奧妙,第二,我看不懂MFC里那許許多多奇怪的宏,第三,我不知道MFC是怎么跟我熟悉的Windows API環(huán)境結(jié)合起來(lái)的,或者更具體的說(shuō),MFC是怎么能夠把Windows巨大的switch消息處理結(jié)構(gòu)拆接到一個(gè)個(gè)類的消息處理成員函數(shù)的。簡(jiǎn)單的說(shuō),我完全無(wú)法把MFC與我熟悉的C++連接起來(lái),兩者之間似乎存在一個(gè)巨大的斷層,讓我覺得MFC完全是另一門語(yǔ)言。我花了不少心思去猜測(cè)、分析,并試圖閱讀MFC的源代碼,但是那時(shí)候的能力還非常淺薄,完全無(wú)法理解MFC的奧秘,也無(wú)法彌合那個(gè)斷層。很多次,我都不禁灰心地想,也許自己并不是寫程序的料,或者不是搞C++的料,或許應(yīng)該放棄。
就在我為這些問題感到困惑和郁悶的時(shí)候,在一個(gè)陰天的下午,我在一家書店的柜臺(tái)上發(fā)現(xiàn)了一本裝幀普通的新書,書名是《深入淺出Windows MFC程序設(shè)計(jì)》,作者侯俊杰。我只站在那里翻了五分鐘,就被其中的內(nèi)容“雷”得頭皮發(fā)炸——這本書不但正中靶心地直接打到我的興趣點(diǎn)上,而且語(yǔ)言之優(yōu)美,內(nèi)容布局之巧妙,都是前所未見。記得那本書的價(jià)格不菲,我當(dāng)時(shí)著實(shí)負(fù)擔(dān)不起,于是找同學(xué)借了錢也要把它買下來(lái)。在接下來(lái)的幾個(gè)星期里,我每天捧著這本書反復(fù)琢磨到深夜,感覺所獲得的長(zhǎng)進(jìn),比前面幾年都要多。通過這本書我了解了一個(gè)完全超過我之前層面的C++的世界,也把作者的名字牢牢記住。當(dāng)時(shí)我就想,如果有朝一日,能夠結(jié)識(shí)這位侯先生就好了。
幾年之后,這本書的第二版以《深入淺出MFC》為名發(fā)行,暢銷海內(nèi),終于有更多的人得以見識(shí)這本技術(shù)圖書的典范之作,也認(rèn)識(shí)了這位侯捷先生。不過這個(gè)時(shí)候我對(duì)于C++的關(guān)注點(diǎn),已經(jīng)從面向?qū)ο蟮膽?yīng)用框架轉(zhuǎn)向泛型和STL,相反,對(duì)于MFC我有了更多批判的看法。在2000年底,我動(dòng)手翻譯了STL之父Alex Stepanov的一個(gè)長(zhǎng)篇訪談,大約兩萬(wàn)多字,翻譯之后發(fā)表在CSDN網(wǎng)站上。后來(lái)又轉(zhuǎn)載到《程序員》雜志上。因?yàn)檫@篇文章,我得以認(rèn)識(shí)了CSDN的掌門人蔣濤,并且經(jīng)他介紹,終于認(rèn)識(shí)了心儀已久的侯先生。
與侯先生的相識(shí),是我C++學(xué)習(xí)生涯的一個(gè)重要的轉(zhuǎn)折點(diǎn)。當(dāng)時(shí)侯先生也已經(jīng)將注意力轉(zhuǎn)向泛型和STL技術(shù),并且在《程序員》雜志上發(fā)表了著名的《C++大系》系列文章,為國(guó)內(nèi)的C++學(xué)習(xí)者打開一片全新天地。與侯先生剛剛認(rèn)識(shí)不久,他就通過當(dāng)時(shí)《深入淺出MFC》的編輯周筠女士,向我贈(zèng)送了好幾本“C++大系”中的重要作品。我至今還能回憶起打開那個(gè)大包裹時(shí)興奮得幾乎要暈厥過去的感覺,也還能清楚得記得那其中的內(nèi)容:Scott Meyers的Effective C++和More Effective C++,Bjarne Stroustrup的The C++ Programming Language,Matt Austern的Generic Programming and the STL,Nicolai Josuttis的The C++ Standard Library和那時(shí)剛剛出版的Andrei Alexandrescu成名作Modern C++ Design。一下子有了這么多經(jīng)典,我?guī)缀鯊U寢忘食的閱讀、試驗(yàn),遇到困難,就用郵件向侯先生請(qǐng)教,在侯先生的指導(dǎo)之下,僅僅短短的幾個(gè)月,我對(duì)于C++的理解便上了一個(gè)大臺(tái)階。特別是Scott Meyers的兩本書,對(duì)我的作用可以說(shuō)是醍醐灌頂、脫胎換骨。在那之后,侯先生又邀請(qǐng)我與他合譯The C++ Standard Library,以共同合作的方式給我另一個(gè)層面的教益。在那之后幾年里,侯先生總會(huì)時(shí)不時(shí)的給我?guī)椭完P(guān)懷,幫我購(gòu)買珍貴的資料,關(guān)心我的事業(yè)和生活。與侯先生的交往,套用一句俗話,“千言萬(wàn)語(yǔ)說(shuō)不盡”,但如果可以概括的話,可以歸為八個(gè)字:知遇之恩,師生之情。至今,這段回憶對(duì)我來(lái)說(shuō),是深藏心底里的一份溫暖,也是一份歉疚。侯先生曾寄希望我走入技術(shù)寫譯和培訓(xùn)的行業(yè),并幾次為我創(chuàng)造這樣的機(jī)會(huì),但是我卻最終沒有從命。雖然多為國(guó)內(nèi)現(xiàn)實(shí)所限制,卻也少了報(bào)答先生的機(jī)會(huì)。
實(shí)際上侯先生不光幫助了我一個(gè)人,在七八年前,我們這群在內(nèi)陸的C++愛好者中,先后直接受到侯先生幫助的有數(shù)十人,其中有不少與我保持聯(lián)系。據(jù)我的觀察,這些人中的大部分都有著還算不錯(cuò)的發(fā)展。而如果算上侯先生圖書的讀者,侯先生幫助的人何止十萬(wàn)眾。一個(gè)人的貢獻(xiàn),可至于斯!
所以每當(dāng)我總結(jié)這段歷史的時(shí)候,就會(huì)不禁感嘆,對(duì)于一個(gè)學(xué)習(xí)者來(lái)說(shuō),高人的點(diǎn)撥確實(shí)可以令人“頓悟”,走到一個(gè)全新境界。因此,遇高人不可交臂而失之。我也知道,像侯先生這樣品質(zhì)和才情的高人畢竟是極少,但我認(rèn)識(shí)的大部分技術(shù)高手,其實(shí)都是可師之人。如果能夠放下身段,認(rèn)認(rèn)真真向高人請(qǐng)教,那么對(duì)于自己的成長(zhǎng)和發(fā)展,都將有莫大的好處。
文武之道
在技術(shù)這個(gè)行業(yè)觀察思考了多年之后,我認(rèn)為我發(fā)現(xiàn)了程序員實(shí)現(xiàn)事業(yè)發(fā)展的一個(gè)關(guān)鍵原則,那就是在編程技術(shù)上保守一點(diǎn),而在專業(yè)及行業(yè)領(lǐng)域進(jìn)取一點(diǎn)。我稱之為“技術(shù)組合的文武之道”。有趣的是,這個(gè)“文武之道”,恰好與一般程序員的實(shí)踐相反——大部分程序員在編程技術(shù)上比較激進(jìn),卻疏于在行業(yè)領(lǐng)域下功夫。
我最早注意到這個(gè)問題,是在研究生實(shí)習(xí)期間。在研究生的第二學(xué)年,我被導(dǎo)師派往清華同方參與一個(gè)大型專業(yè)軟件項(xiàng)目的開發(fā),體驗(yàn)到了真實(shí)環(huán)境下的團(tuán)隊(duì)軟件項(xiàng)目開發(fā)。這個(gè)項(xiàng)目由于脫離具體的條件,目標(biāo)過高,與同時(shí)期很多雄心勃勃的科幻項(xiàng)目一樣,最終都以失敗告終,但是這段經(jīng)歷卻使我受益良多。正是在這個(gè)專業(yè)項(xiàng)目的開發(fā)當(dāng)中,我重新認(rèn)識(shí)了領(lǐng)域知識(shí)與編程技術(shù)之間的主次關(guān)系。
項(xiàng)目本身的目標(biāo)是開發(fā)建筑工程企業(yè)的ERP系統(tǒng),第一階段的任務(wù)是形成概預(yù)算自動(dòng)計(jì)算功能,其中涉及大量的圖形繪制、對(duì)象建模、數(shù)據(jù)存儲(chǔ)等我非常感興趣的技術(shù)內(nèi)容。在參與這個(gè)項(xiàng)目的初期,我非常興奮地設(shè)想過一個(gè)雄心勃勃的技術(shù)方案:用VC/MFC為開發(fā)工具,自主開發(fā)圖形庫(kù)和建筑構(gòu)件類庫(kù),支持3D可視化建筑建模,并且用類似對(duì)象數(shù)據(jù)庫(kù)的方式進(jìn)行持久化,等等。然而真正進(jìn)入這個(gè)項(xiàng)目,我發(fā)現(xiàn)項(xiàng)目主管并沒有帶領(lǐng)我們沖向這些令人興奮不已的技術(shù)高峰,而是一個(gè)會(huì)接著一個(gè)會(huì)的分析需求,研究當(dāng)時(shí)的概預(yù)算規(guī)范,了解有關(guān)領(lǐng)域知識(shí)。這個(gè)冗長(zhǎng)繁瑣的過程,讓我大失所望。然而更令人郁悶的還在后面,當(dāng)項(xiàng)目進(jìn)入到編碼階段時(shí),項(xiàng)目主管竟然選擇Visual Basic作為開發(fā)工具,而數(shù)據(jù)庫(kù)服務(wù)器更是非常陽(yáng)春的Jet DB,也就是Microsoft Access。我對(duì)此強(qiáng)烈不滿,幾次醞釀之后,終于找到項(xiàng)目經(jīng)理,反應(yīng)我的想法。這位項(xiàng)目經(jīng)理是清華的畢業(yè)生,已經(jīng)通過Visual C++的MCSD認(rèn)證,是當(dāng)時(shí)極為罕見的技術(shù)人才,在聽了我的想法之后,他陳述了自己的看法。他說(shuō),這個(gè)項(xiàng)目是一個(gè)專業(yè)軟件,主要的困難和障礙都集中在專業(yè)領(lǐng)域,而在編程技術(shù)本身,無(wú)論是VB還是Jet DB,都足以在現(xiàn)階段滿足要求。在這樣的情況下,如果選擇MFC或者其他更酷的技術(shù),無(wú)疑會(huì)大大增加技術(shù)實(shí)現(xiàn)的難度,純屬是毫無(wú)意義的自找麻煩。他的原則,就是盡可能用可實(shí)現(xiàn)項(xiàng)目需求的最簡(jiǎn)單的技術(shù)來(lái)完成任務(wù),因?yàn)榧夹g(shù)越簡(jiǎn)單,項(xiàng)目風(fēng)險(xiǎn)就越低,團(tuán)隊(duì)開發(fā)的管理成本就越小。
事實(shí)上,當(dāng)年我驕氣很盛,并沒有被說(shuō)服,反而覺得他缺少冒險(xiǎn)精神。但是他對(duì)于編程技術(shù)與領(lǐng)域知識(shí)之間輕重關(guān)系的闡述,確實(shí)也引起了我的思考。而且在項(xiàng)目實(shí)踐中我也確實(shí)發(fā)現(xiàn),相對(duì)于變化多端的概預(yù)算規(guī)則,在屏幕上畫個(gè)3D的房子并不是這個(gè)項(xiàng)目的關(guān)鍵。在一起工作的專業(yè)程序員們,似乎很快就可以完成類似這樣的任務(wù),但是面對(duì)復(fù)雜的業(yè)務(wù)規(guī)則,他們就莫名其妙,非常無(wú)助了。
畢業(yè)之后,我的第一份工作是在聯(lián)想做掌上設(shè)備的軟件開發(fā),在那里我也觀察到相同的問題。在聯(lián)想,我搞了一些編程技術(shù)上的創(chuàng)新,把SGI STL和 Boost的幾個(gè)組件移植到Windows CE平臺(tái)上,并自己寫了一個(gè)遠(yuǎn)程設(shè)備的軟件調(diào)試庫(kù),還為幾個(gè)自主軟件設(shè)計(jì)了非常符合設(shè)計(jì)模式精神的架構(gòu)。但是所有這一切都沒有得到大家的認(rèn)可,大家關(guān)注的中心,是新設(shè)備的產(chǎn)品特色,軟硬件配置,營(yíng)銷重點(diǎn),成本控制,項(xiàng)目實(shí)施等等。領(lǐng)導(dǎo)和同事們對(duì)于我的這些努力,既沒有鼓勵(lì),也沒有反對(duì),而是任我自便,我當(dāng)時(shí)對(duì)此確實(shí)是大有“懷才不遇”的抱怨。但幾年之后,當(dāng)我有了更多的職業(yè)積累、更廣闊的視野和更成熟的心態(tài)之后,我才能更客觀地反思自己在聯(lián)想期間的經(jīng)歷。其實(shí),無(wú)論是手機(jī)、掌上電腦還是平板電腦,消費(fèi)電子類產(chǎn)品的開發(fā)當(dāng)然是以產(chǎn)品設(shè)計(jì)、營(yíng)銷規(guī)劃和工程控制為中心,這才是這個(gè)行業(yè)的關(guān)鍵領(lǐng)域知識(shí)。相比之下,什么STL,設(shè)計(jì)模式,完全不是重點(diǎn)。如果我當(dāng)時(shí)的心態(tài)更成熟一些,能夠主動(dòng)學(xué)習(xí)和掌握消費(fèi)電子產(chǎn)品的產(chǎn)品設(shè)計(jì)專業(yè)知識(shí),讓自己的編程技術(shù)能夠?yàn)榻M織的整體目標(biāo)服務(wù),那么我今天的職業(yè)發(fā)展可能會(huì)是完全不同的另一番模樣。
進(jìn)入CSDN之后,我的所見所聞就更多了。大量的技術(shù)高手,把主要精力放在“改善程序員開發(fā)體驗(yàn)”的事情上,比如新潮酷派的語(yǔ)言,漂亮的開發(fā)環(huán)境,方便的代碼生成和魔術(shù)般的設(shè)計(jì)抽象,倒是能贏得程序員圈子里的一片叫好聲,但是卻得不到客戶的認(rèn)可。反而是很多團(tuán)隊(duì),由于對(duì)應(yīng)用理解到位,用普通的技術(shù)為客戶創(chuàng)造了巨大的價(jià)值。比如我認(rèn)識(shí)的一家企業(yè),經(jīng)過深入交流和分析之后,發(fā)現(xiàn)移動(dòng)財(cái)務(wù)審批是客戶沒有提出來(lái),但卻非常需要的功能,于是用簡(jiǎn)單可靠的技術(shù)手段,實(shí)現(xiàn)了這個(gè)功能。客戶非常興奮,大加贊賞,甚至破天荒地將其在全國(guó)各地的中層干部召集到北京,專門針對(duì)這個(gè)功能進(jìn)行培訓(xùn)。
這些經(jīng)歷和見聞,逐漸使我意識(shí)到了領(lǐng)域知識(shí)與編程技術(shù)之間的主次關(guān)系。事實(shí)上,從客戶和管理者的角度來(lái)看,你使用什么先進(jìn)的編程技術(shù)并不重要,重要的是你的軟件能夠正確地做好該做的事情,你是否能對(duì)所解決的現(xiàn)實(shí)問題有深刻的認(rèn)識(shí),有所洞見,有所創(chuàng)新。很多時(shí)候,在程序員圈子里被追捧的新概念、新思想和前衛(wèi)技術(shù),實(shí)際上并沒有經(jīng)過時(shí)間和實(shí)踐的檢驗(yàn),存在很多問題,過于積極地引入它們,對(duì)于客戶的利益,反而是一種危害。真正能夠意識(shí)到這個(gè)問題的開發(fā)者,在編程技術(shù)本身上會(huì)趨向于穩(wěn)妥保守,不急于追新趕潮,寧可做一個(gè)后知后覺分子。但在行業(yè)領(lǐng)域,他們則完全是是另一個(gè)姿態(tài),積極進(jìn)取,敢于創(chuàng)新和嘗試,總是殫精竭慮地思考如何為客戶提供更合用的功能,更高的價(jià)值。在我所見范圍之內(nèi),凡是這樣做的,不論是企業(yè)還是個(gè)人,也無(wú)論是在企業(yè)應(yīng)用市場(chǎng)還是在消費(fèi)類市場(chǎng)中,都能夠更快的走向成功。
正是基于這個(gè)認(rèn)識(shí),我在很多場(chǎng)合都提出程序員要懂行業(yè),或者重視領(lǐng)域知識(shí)。我相信,如果能夠掌握好編程技術(shù)和行業(yè)知識(shí)之間的文武火候,作為程序員個(gè)體,無(wú)論是在企業(yè)中服務(wù),還是自己創(chuàng)業(yè),成功會(huì)相對(duì)容易些。
結(jié)語(yǔ)
2009年,我開始了一段新的人生嘗試,究竟將走向何方,尚未可知。但對(duì)于我來(lái)說(shuō),作為“軟件文化人”的這段經(jīng)歷,已成為我生命中的一段充滿精彩與遺憾的篇章。當(dāng)然,現(xiàn)在還遠(yuǎn)遠(yuǎn)沒有到正式總結(jié)時(shí)候,這段旅途對(duì)于我的意義,可能也尚未真正揭示出來(lái)。我在這里用了這樣一種松散的手法,隨意收集了幾個(gè)片段和感悟,由于漏掉了許許多多幫助過我的人,這篇東西是不可以稱為“成長(zhǎng)故事”的。但寫下來(lái)的這幾個(gè)散片,倒也確實(shí)是我有感而憶,有感而發(fā)。不知道過幾年以后,再讀到這些,是否又會(huì)有不同的看法?那就不得而知了,到那時(shí)再說(shuō)吧。
作者簡(jiǎn)介
孟巖,現(xiàn)就職于IBM中國(guó)公司企劃傳播部。曾任CSDN和《程序員》雜志技術(shù)總編。
聯(lián)系客服