遇高人不可交臂而失之 2003年我加入CSDN,6年之后離開(kāi)。在2003年之后,我的技術(shù)身份就很難界定了。曾經(jīng)有個(gè)朋友稱我為“技術(shù)文化人”——不以軟件開(kāi)發(fā)為生,但整天都在拿軟件開(kāi)發(fā)來(lái)說(shuō)事,與這個(gè)行業(yè)的整體關(guān)系可能比任何一個(gè)具體的程序員或者架構(gòu)師都更密切。聽(tīng)上去像是一種恭維,又好像是暗諷,似乎我是站在戲臺(tái)下面帶頭起哄的票友。其實(shí)在我看來(lái),我與一線技術(shù)人的根本區(qū)別,在于關(guān)注的問(wèn)題不同:他們關(guān)心的如何做好軟件,我關(guān)心的是如何做好軟件人。更確切的說(shuō),我關(guān)心的問(wèn)題是,對(duì)于一個(gè)普通的程序員來(lái)說(shuō),如何能夠通過(guò)軟件開(kāi)發(fā)這一職業(yè),實(shí)現(xiàn)精神上的自由,獲得專業(yè)上的成就,生活上的安全感,以及對(duì)未來(lái)的信心。當(dāng)然,這是很高的目標(biāo),在任何社會(huì)、任何時(shí)代、任何行業(yè),最終都只有一部分人能夠到達(dá)這個(gè)境界。但是,我確實(shí)是曾經(jīng)把這當(dāng)成工作的中心,畢竟人的問(wèn)題才是最根本的問(wèn)題。所以,我在這篇文章里想講述的,并不是個(gè)人的那一單流水賬,而是我自己所見(jiàn)所聞所經(jīng)歷的一些點(diǎn)滴片段,其目的也是希望能夠就“做好軟件人”這一命題,對(duì)自己的感悟做一點(diǎn)概括與很多同齡人相比,我接觸電腦的時(shí)間比較晚,一直到1996年,我才開(kāi)始學(xué)習(xí)電腦操作。最初我的目標(biāo)很簡(jiǎn)單,就是打打字,畫(huà)畫(huà)圖,打打游戲,看看影碟。如果說(shuō)想寫(xiě)程序的話,主要也就是用來(lái)應(yīng)付一些專業(yè)課,確實(shí)沒(méi)有在程序設(shè)計(jì)上深究的想法。但初步學(xué)會(huì)了一點(diǎn)編程基礎(chǔ)之后,意識(shí)到編程并不復(fù)雜,我就不能自禁地在編程學(xué)習(xí)上投入越來(lái)越多的時(shí)間,并最終決定放棄本專業(yè),轉(zhuǎn)行軟件開(kāi)發(fā)。后來(lái)我了解到,很多同齡人都跟我有相似的“轉(zhuǎn)行”經(jīng)歷。而之所以我們會(huì)放棄自己的專業(yè)優(yōu)勢(shì),串行到軟件開(kāi)發(fā)領(lǐng)域,“興趣”固然是一方面原因,而更重要的原因,恐怕還是當(dāng)時(shí)的時(shí)代潮流在九十年代中后期,隨著PC的普及和互聯(lián)網(wǎng)的出現(xiàn),國(guó)內(nèi)高校中計(jì)算機(jī)和軟件開(kāi)發(fā)成為顯赫一時(shí)的潮流,“電子化”、“信息化”勢(shì)不可擋地涌入各個(gè)專業(yè)領(lǐng)域,給幾乎所有成熟行業(yè)帶來(lái)了巨大的沖擊。社會(huì)上對(duì)于軟件開(kāi)發(fā)人才的需求突然增加,待遇也有明顯優(yōu)勢(shì)。再加上美國(guó)克林頓時(shí)期的“高科技浪潮”、“新經(jīng)濟(jì)繁榮”的光環(huán),以及微軟、Borland、金山、江民等等成功傳奇,使得人們普遍對(duì)于計(jì)算機(jī)和軟件行業(yè)的未來(lái)產(chǎn)生了過(guò)于樂(lè)觀的預(yù)期。很多人都覺(jué)得,只要搞了軟件,成功是唾手可得的在這種大潮流之下,學(xué)校里能擺弄電腦,特別是會(huì)寫(xiě)程序的學(xué)生,特別受老師的器重,在就業(yè)市場(chǎng)上也有特別的優(yōu)勢(shì),一個(gè)個(gè)器宇軒昂,盛氣凌人。今天聽(tīng)起來(lái)可以當(dāng)笑話,但當(dāng)時(shí)我認(rèn)識(shí)的本校和外校的同學(xué)當(dāng)中,至少有三個(gè)人信心滿滿地宣稱自己要做中國(guó)的比爾蓋茨,其他的人呢?很多只是沒(méi)有說(shuō)出來(lái),心里的夢(mèng)想是一樣的。在這樣的一種狂熱氛圍之下,一旦你學(xué)會(huì)寫(xiě)程序,就不可避免地開(kāi)始在腦海里編制各式各樣的美夢(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ō)并沒(méi)有成真,反而是當(dāng)年大家并不熱衷的公務(wù)員、國(guó)企等去處,靠著似乎取之不盡的公帑和用之不竭的公權(quán)成為高通脹時(shí)代的幸福特區(qū),這不得不說(shuō)又是當(dāng)初沒(méi)有想到的。影視視頻制作于是很多人在失意之余,經(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è)火了,就過(guò)去撈一把,明天看到那個(gè)有上升趨勢(shì),就沖過(guò)去占個(gè)位置。然而事實(shí)已經(jīng)證明,我們所處的這個(gè)時(shí)代,是一個(gè)外部環(huán)境變動(dòng)不居,復(fù)雜性不斷加劇的時(shí)代。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)歷過(guò)一段咬牙堅(jiān)持的低谷。沖過(guò)低谷,就能夠獲得別人無(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開(kāi)發(fā)一些DOS下的結(jié)構(gòu)計(jì)算和簡(jiǎn)單的有限元程序,然后用Visual Basic去寫(xiě)一些例子水平的Windows程序,照著書(shū)上的例子用匯編語(yǔ)言調(diào)用DOS的INT 21h中斷。但很快,我就感到不滿,我意識(shí)到自己對(duì)于編程這個(gè)領(lǐng)域知之甚少,完全是盲人瞎馬,無(wú)法確定自己是在朝什么方向前進(jìn)。今天的年輕學(xué)生很難理解當(dāng)時(shí)我所有的這種不安全感,深度學(xué)習(xí)FPGA實(shí)現(xiàn)基礎(chǔ)知識(shí)0FPGA擊敗GPU和GPP,但處于我當(dāng)時(shí)的環(huán)境,走錯(cuò)路的風(fēng)險(xiǎn)是現(xiàn)實(shí)存在的。身邊沒(méi)有什么高手可以請(qǐng)教,更沒(méi)有互聯(lián)網(wǎng)來(lái)開(kā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í)候在我出沒(méi)的范圍之內(nèi),有三四家上規(guī)模的計(jì)算機(jī)專業(yè)書(shū)店。沒(méi)課的下午和周末的大塊時(shí)間,就成了我的閱讀時(shí)間。我?guī)缀趺恐芏家状?,站在?shū)店的角落里,一讀就是半天。書(shū)店里一排排的書(shū)柜,在我看來(lái)就是了解軟件開(kāi)發(fā)這個(gè)行業(yè)的一幅幅地圖,不管是有關(guān)的、無(wú)關(guān)的,看得懂的、看不懂的,聽(tīng)說(shuō)過(guò)的、沒(méi)聽(tīng)說(shuō)過(guò)的,我都不放過(guò)。逐漸的,我的大腦里出現(xiàn)了一副軟件開(kāi)發(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ì)軟件開(kāi)發(fā)領(lǐng)域的全局性的理解,多年之后,這種理解成為我在CSDN工作的主要優(yōu)勢(shì),也使我對(duì)于行業(yè)發(fā)展的趨勢(shì)形成了自己的觀點(diǎn);另一方面,過(guò)于關(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ō)是基于“抬頭看路”所得出的正確決策。影視視頻制作而之后過(guò)早的從C過(guò)渡到C++,則應(yīng)該說(shuō)犯了一個(gè)錯(cuò)誤。C語(yǔ)言的小巧、明快、圓滿和強(qiáng)大,迄今無(wú)出其右。由于其語(yǔ)言簡(jiǎn)捷,沒(méi)什么可學(xué)的,學(xué)習(xí)者的旺盛精力將很快“被迫”轉(zhuǎn)向真正有價(jià)值的東西——算法、數(shù)據(jù)結(jié)構(gòu)、編譯、圖形、系統(tǒng)編程,等等。我后來(lái)認(rèn)識(shí)的很多高手,就是因?yàn)樵缱吡藥撞剑?ldquo;沒(méi)聽(tīng)說(shuō)C++”,就在C上下了苦功夫,“埋頭趕路”,反而“因禍得福”練成了很強(qiáng)的動(dòng)手能力,而能有一方成就。而我過(guò)早進(jìn)入C++之后,在C++的語(yǔ)言里打了幾年的滾,反而對(duì)于算法、編譯、匯編語(yǔ)言等基本領(lǐng)域投入不夠,基礎(chǔ)沒(méi)有打牢,離開(kāi)學(xué)校之后不得已花了很多倍的精力來(lái)彌補(bǔ)。現(xiàn)在回想起來(lái),這就是專注不夠的教訓(xùn)到后來(lái)我在CSDN工作的時(shí)候,這方面的體會(huì)就更深。那幾年里,為了能夠與各路高手平等交流,我?guī)缀跎娅C了所有重要的技術(shù)領(lǐng)域,研究了大多數(shù)熱門的技術(shù)概念,影視視頻制作閱讀之廣,嘗試之雜,遠(yuǎn)遠(yuǎn)超過(guò)一般軟件開(kāi)發(fā)者的需要。正因?yàn)檫@種“博”,使我對(duì)于各技術(shù)派別以及各主要企業(yè)之間的關(guān)系和沿革能夠了然于心,從而對(duì)于行業(yè)發(fā)展形成自己的見(jiàn)解。這對(duì)于我在CSDN的工作來(lái)說(shuō),固然是一種必要,但是其實(shí)身處其中,甘苦自知。俗話說(shuō)“樣樣皆通,必然樣樣稀松”,廣泛涉獵的代價(jià)就是深入不夠,我對(duì)此可謂有切身之痛反而是到了現(xiàn)在,我可以在業(yè)余時(shí)間以平和的心態(tài)深入研究自己喜歡和擅長(zhǎng)的領(lǐng)域,便又可以享受“埋頭趕路”、不聞世間紛擾的充實(shí)與快樂(lè)了我在初步掌握C語(yǔ)言之后不久,就一步踏進(jìn)C++。C++復(fù)雜的語(yǔ)法、強(qiáng)大多樣的抽象機(jī)制、奇妙的各種語(yǔ)言現(xiàn)象,極大地滿足了我的好奇心和求知欲。我買了好幾本書(shū),幾乎是手不釋卷地每日暢游于其中。我不想過(guò)多渲染當(dāng)年學(xué)習(xí)C++的艱辛,其實(shí)對(duì)于語(yǔ)言本身,我并沒(méi)有花多長(zhǎng)時(shí)間就形成了一個(gè)大概的認(rèn)識(shí)。接下來(lái)比拼的是什么!但是C++的真正挑戰(zhàn)在于從“知”到“行”。我最突出的印象是在當(dāng)年學(xué)習(xí)計(jì)算機(jī)圖形學(xué)時(shí),老師布置了一個(gè)大作業(yè),我信心滿滿地希望用最新掌握的Visual C++在Windows下來(lái)完成。那時(shí)候我已經(jīng)熟悉Win32 SDK開(kāi)發(fā),在窗口過(guò)程(wndproc)之中援引定義好的一組類,就可以完成手上的工作。構(gòu)思起來(lái)似乎很容易,但是一下手就發(fā)現(xiàn)腦子非常亂,要設(shè)計(jì)哪些類,在類與類之間建立什么樣的關(guān)系,是不是使用模板,選擇似乎非常多,而似乎每一條路都有優(yōu)勢(shì),也有問(wèn)題。以我當(dāng)時(shí)的經(jīng)驗(yàn),完全沒(méi)有選擇的依據(jù)。勉強(qiáng)下手之后,很快遇到了一系列的問(wèn)題,產(chǎn)生了一連串新想法,進(jìn)一步動(dòng)手寫(xiě)出一堆新的類,就這樣,我在問(wèn)題的外圍架床疊屋地打轉(zhuǎn),幾乎寫(xiě)了一個(gè)小小的Windows圖形類庫(kù),但好像代碼越多,距離要做的具體事情反而越遠(yuǎn),心里越發(fā)虛。到了即將交付任務(wù)的日期,我已經(jīng)積累了一大堆沒(méi)有測(cè)試過(guò)的類代碼,結(jié)果可想而知,當(dāng)最后我終于將任務(wù)代碼寫(xiě)完之后,編譯運(yùn)行的結(jié)果就是程序崩潰。在進(jìn)行了幾個(gè)小時(shí)的調(diào)試之后,我喪失了耐心和信心,于是推翻全部代碼,轉(zhuǎn)而用C風(fēng)格重寫(xiě)了整個(gè)程序。這一次效果非常明顯,僅僅熬了一個(gè)通宵就完成了一份高分作業(yè)當(dāng)時(shí)這件事情對(duì)我的刺激很大,在一種羞辱的感覺(jué)中,我強(qiáng)烈地意識(shí)到我的C++水平其實(shí)非常低下,于是我就到處尋找能夠提高C++水平的書(shū)。很自然的,MFC就被我納入視線之中當(dāng)時(shí)正值MFC處于其頂點(diǎn),書(shū)店里介紹MFC的書(shū)不但數(shù)量多、篇幅大,而且那行文的派頭也最足,給我的印象,好像MFC就是軟件開(kāi)發(fā)皇冠上的明珠,掌握了它就可以俯瞰眾生。所以我買了好幾本大部頭的MFC書(shū)來(lái)啃。老實(shí)說(shuō),如果抱著知其然而不知其所以然的心態(tài)去學(xué)習(xí)MFC,其實(shí)也并不是那么困難的事情。在微軟強(qiáng)大的開(kāi)發(fā)環(huán)境支持之下,照著書(shū)上的例子多做多練,朱茵二次初戀什么時(shí)候上映 二次初戀電影免費(fèi)資。上手并不難。但對(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è)巨大的斷層,讓我覺(jué)得MFC完全是另一門語(yǔ)言。我花了不少心思去猜測(cè)、分析,并試圖閱讀MFC的源代碼,但是那時(shí)候的能力還非常淺薄,完全無(wú)法理解MFC的奧秘,也無(wú)法彌合那個(gè)斷層。很多次,我都不禁灰心地想,也許自己并不是寫(xiě)程序的料,或者不是搞C++的料,或許應(yīng)該放棄。我只站在那里翻了五分鐘,就被其中的內(nèi)容“雷”得頭皮發(fā)炸——這本書(shū)不但正中靶心地直接打到我的興趣點(diǎn)上,而且語(yǔ)言之優(yōu)美,內(nèi)容布局之巧妙,都是前所未見(jiàn)。記得那本書(shū)的價(jià)格不菲,我當(dāng)時(shí)著實(shí)負(fù)擔(dān)不起,于是找同學(xué)借了錢也要把它買下來(lái)。在接下來(lái)的幾個(gè)星期里,我每天捧著這本書(shū)反復(fù)琢磨到深夜,感覺(jué)所獲得的長(zhǎng)進(jìn),比前面幾年都要多。當(dāng)時(shí)我就想,如果有朝一日,能夠結(jié)識(shí)這位侯先生就好了幾年之后,這本書(shū)的第二版以《深入淺出MFC》為名發(fā)行,暢銷海內(nèi),終于有更多的人得以見(jiàn)識(shí)這本技術(shù)圖書(shū)。