寫(xiě)給.NET程序員,不要困在自己建造的盒子里
此文章的主旨是希望過(guò)于專(zhuān)注.NET程序員在做好工作、寫(xiě)好.NET程序的同時(shí),能分撥出一點(diǎn)時(shí)間接觸一下.NET之外的東西(例如10%-20%的時(shí)間),而不是鼓動(dòng)大家什么都去學(xué)最后什么都學(xué)不精,更不是說(shuō).NET不行或勸大家放棄.NET。恕我愚鈍,此主旨在文中表達(dá)不夠清楚,看評(píng)論中很多朋友誤解了,特此說(shuō)明。
另外,本文中的觀點(diǎn)并不全部是我個(gè)人的想法,相當(dāng)一部分來(lái)自我以前聊過(guò)天的某些大牛,他們很多來(lái)自微軟、百度、騰訊等知名企業(yè),并且很多已經(jīng)成為技術(shù)骨干,我曾經(jīng)從他們那里受益匪淺,于是我把他們的指教結(jié)合自身的經(jīng)驗(yàn)和理解寫(xiě)成此文。這就是此文的來(lái)源。
在給這篇文章起標(biāo)題的時(shí)候,我斟酌了很久,因?yàn)槲覀€(gè)人是反對(duì)使用".NET程序員"、"C++程序員"或"PHP程序員"這類(lèi)簡(jiǎn)單粗暴的方式為程序員做劃分的。但是客觀確實(shí)存在一個(gè)現(xiàn)象,就是很多程序員會(huì)為自己設(shè)置一個(gè)無(wú)形的界限,將自己與某種語(yǔ)言或平臺(tái)硬綁定到一起,例如我這里所指的".NET程序員"。請(qǐng)注意這與"術(shù)業(yè)有專(zhuān)攻"是不同概念的,有自己專(zhuān)攻的平臺(tái)或領(lǐng)域這很正常,但是有很多人偏執(zhí)地將自己與某個(gè)語(yǔ)言或平臺(tái)緊緊捆綁,而忘記了自己首先是一名程序員,然后才使用某種語(yǔ)言,他們偏執(zhí)于平臺(tái)并陶醉于自己建立的盒子里,而不愿主動(dòng)去接觸一些盒子外的事物,最終使得自己無(wú)法進(jìn)步。
從我個(gè)人的觀點(diǎn)看,本文中".NET程序員"是指具有如下特點(diǎn)的程序員群體:
● 學(xué)習(xí)、工作的技術(shù)范圍均局限于.NET平臺(tái)及衍生,對(duì).NET之外的技術(shù)沒(méi)有主動(dòng)接觸或?qū)W習(xí)的欲望。
● 不斷學(xué)習(xí)各種.NET平臺(tái)上的庫(kù)或框架,如ADO.NET,ASP.NET MVC,WPF,Silverlight,WCF,WP,EF,NHibernate……
● 工作無(wú)法脫離Visual Studio,習(xí)慣于圖形化的工作環(huán)境。
● 時(shí)常抱怨微軟的技術(shù)更新太快,微軟開(kāi)發(fā)平臺(tái)包辦太多以至于自己身價(jià)貶值。
● 對(duì)面向?qū)ο?、設(shè)計(jì)模式、軟件架構(gòu)等東西具有極大的熱情,寧可花大量時(shí)間編造各種"設(shè)計(jì)模式小故事"也不愿花點(diǎn)時(shí)間了解一點(diǎn)新鮮的東西(如Unix下的IPC)。
● 對(duì)Java頗有微詞,覺(jué)得C我根本用不到,至于PHP?它能做到的.NET都能做到,認(rèn)為用Linux的大多在裝逼,而Lisp、Lua、Eiffel神馬的都是浮云,我管它們干什么。
● 認(rèn)為面向?qū)ο笳Z(yǔ)言就是程序設(shè)計(jì)語(yǔ)言的代名詞,命令式編程深入骨髓,不太了解函數(shù)式語(yǔ)言或契約式語(yǔ)言是什么。
● 用.NET很多年了,但感覺(jué)自己沒(méi)什么突破,沒(méi)什么進(jìn)步,成天就搞些增刪改查的勞什子。
● 經(jīng)常討論或思考.NET或Java或C或其它語(yǔ)言哪個(gè)好,搞哪個(gè)更掙錢(qián)這種問(wèn)題。
如果您有超過(guò)3項(xiàng)符合上述特征,我想我們可以聊一聊,因?yàn)閾?jù)我的觀察,感覺(jué)博客園上這類(lèi)朋友還是挺多的。
希望我能做到旁觀者清
有一個(gè)事實(shí)我想先和大家澄清一下,其實(shí).NET只是我的業(yè)余愛(ài)好。由于博客園主要偏重于.NET平臺(tái),且園子里的朋友對(duì)面向?qū)ο?、架?gòu)之類(lèi)的頗感興趣,所以我寫(xiě)了很多關(guān)于.NET及架構(gòu)方面的文章(如果您注意觀察,會(huì)發(fā)現(xiàn)我博客里這類(lèi)文章正減少并趨于消失),其實(shí)相對(duì)于設(shè)計(jì)、架構(gòu)這類(lèi)東西,我個(gè)人更感興趣的是具體的科學(xué)與技術(shù),例如各種編程語(yǔ)言的原理、應(yīng)用及實(shí)現(xiàn)擴(kuò)展,操作系統(tǒng)原理,網(wǎng)絡(luò)編程,通信協(xié)議,算法與數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)挖掘,機(jī)器學(xué)習(xí),分布式等等;語(yǔ)言方面我比較喜歡的是PHP、Python、Lisp等;而編程方面我更推崇Unix下的編程哲學(xué)和編程方法;我愛(ài)vim勝過(guò)VS無(wú)數(shù)倍。
因此,.NET和C#我一直是作為業(yè)余愛(ài)好來(lái)發(fā)展的,希望這沒(méi)有讓任何人覺(jué)得沮喪。很多朋友加我QQ或MSN問(wèn)我關(guān)于.NET的問(wèn)題,我經(jīng)常答不上來(lái),很多人或許覺(jué)得我不近人情,但我其實(shí)是真的答不上來(lái)。例如我在博客中寫(xiě)過(guò)一系列關(guān)于ASP.NET MVC的文章,很多人是沖那系列文章加我的,但是其實(shí)ASP.NET MVC我只在beta版時(shí)擺弄過(guò)兩個(gè)星期,然后就再也沒(méi)有碰過(guò),所以后來(lái)很多朋友問(wèn)我想關(guān)問(wèn)題我是真的答不上來(lái)。
所以,在博客園這個(gè)以.NET和架構(gòu)之類(lèi)為主的社區(qū),我算是半個(gè)旁觀者吧,我看到園子里很多朋友都把自己禁錮在自己創(chuàng)造的盒子里,所以我希望以旁觀者的身份,給這些朋友提幾個(gè)建議。
每半年接觸并學(xué)習(xí)一門(mén)語(yǔ)言
有許多人通常覺(jué)得只要把一門(mén)語(yǔ)言學(xué)會(huì)學(xué)精就行,這個(gè)想法我覺(jué)得對(duì)了一半。一個(gè)程序員應(yīng)該有一門(mén)精通的語(yǔ)言,但是還要不斷學(xué)習(xí)新的語(yǔ)言(當(dāng)然不能太頻繁),倒不是為了以防哪天萬(wàn)一用到這門(mén)語(yǔ)言,而是接觸學(xué)習(xí)不同的語(yǔ)言會(huì)拓展程序員的視野。
如果你一直用C#,試試Lisp,你會(huì)驚嘆于還有這樣寫(xiě)程序的方式,嗯?看來(lái)我得去學(xué)學(xué)Lamda演算;試試Python,你會(huì)驚訝于還有如此小巧優(yōu)美的東西;試試Lua,你會(huì)發(fā)現(xiàn)原來(lái)語(yǔ)言還能嵌入其它語(yǔ)言,要不要為WOW寫(xiě)個(gè)外掛試試?試試Eiffel,你會(huì)發(fā)現(xiàn)還有契約式編程這種方法,嗯?什么?Java上有iContract,那我要不要為.NET實(shí)現(xiàn)一個(gè)?隨著這種學(xué)習(xí)過(guò)程,你的思維自然就被拓展開(kāi)了,而不是滿(mǎn)腦子的Class、Object、MVC、OO……
其實(shí)學(xué)習(xí)語(yǔ)言不一定是學(xué)習(xí)沒(méi)聽(tīng)說(shuō)過(guò)的,許多您聽(tīng)到耳朵長(zhǎng)繭卻從來(lái)沒(méi)有深入學(xué)習(xí)的"老朋友",如C、PHP,如果您細(xì)心學(xué)下來(lái),也會(huì)得到許多意外的收獲。
例如在學(xué)C的過(guò)程中,你會(huì)發(fā)現(xiàn)不可能脫離Unix環(huán)境而把C學(xué)好,你會(huì)接觸POSIX和System V,你會(huì)主動(dòng)深入學(xué)習(xí)進(jìn)程、線(xiàn)程、信號(hào)、I/O、IPC,你會(huì)接觸TCP/IP協(xié)議。你會(huì)發(fā)現(xiàn)要學(xué)好C還要理解計(jì)算機(jī)組成原理,你還會(huì)發(fā)現(xiàn)原來(lái)還有大小端這個(gè)東西。
深入學(xué)習(xí)PHP,你會(huì)發(fā)現(xiàn)PHP遠(yuǎn)不僅僅是一個(gè)做Web的腳本語(yǔ)言那么簡(jiǎn)單,你會(huì)了解到它SAPI、PHP Compiler和Zend Engine的優(yōu)美結(jié)構(gòu),你會(huì)發(fā)現(xiàn)有opcode,你會(huì)發(fā)現(xiàn)PHP渾身都是擴(kuò)展點(diǎn),你可以擴(kuò)展功能,擴(kuò)展Compiler和Zend Engine,甚至可以完全實(shí)現(xiàn)自己的編譯和運(yùn)行邏輯。你會(huì)了解APC是如何緩存opcode,APD是如何跟蹤PHP的運(yùn)行。
每次學(xué)習(xí)一門(mén)語(yǔ)言,你會(huì)發(fā)現(xiàn)這不是一門(mén)語(yǔ)言,而是一個(gè)嶄新的新大陸,里面有太多讓人興奮和新奇的東西,而如果你執(zhí)意禁錮在".NET盒子"里,你就永遠(yuǎn)不會(huì)知道這些。
主動(dòng)突破自己 接受更多挑戰(zhàn)[!--empirenews.page--]
如果什么東西都是用到才學(xué),代碼都是有用才寫(xiě),那我只能非常抱歉的說(shuō)你還不是個(gè)程序員,而只是個(gè)代碼工人。程序員應(yīng)該有主動(dòng)出擊的意識(shí),應(yīng)該對(duì)自己未接觸的領(lǐng)域有無(wú)限向往。幸運(yùn)的是,互聯(lián)網(wǎng)上的財(cái)富實(shí)在太多了,你應(yīng)該盡其所能去接觸學(xué)習(xí)未知的東西,而不要總想我學(xué)習(xí)這個(gè)東西能不能換來(lái)錢(qián)給孩子買(mǎi)尿布和奶粉。你可以有很多借口,但是我想說(shuō),借口想找總是有的,時(shí)間想找也總是有的,還是看自己到底要什么。不要一邊躺在盒子里一邊又抱怨自己沒(méi)有進(jìn)步。
例如Google Publication,這里有世界最優(yōu)秀的Google工程師們理論和實(shí)踐的總結(jié),來(lái)讀讀這些偉大的論文吧,看看這個(gè)偉大的公司和一群偉大的人都干了些什么,了解一下Map Reduce是怎么回事,如果了解了你自然想去試試Hadoop,還有Bigtable和GFS,哦!太震撼了,原來(lái)存儲(chǔ)數(shù)據(jù)也有這么多講究,不是放硬盤(pán)里或通過(guò)Insert插入數(shù)據(jù)庫(kù)就行了。也許這些英文論文讀起來(lái)很困難,但是我想一周一篇的要求并不高(我現(xiàn)在仍然保持著一周讀兩篇論文的習(xí)慣)。要知道,最新、最嚴(yán)謹(jǐn)?shù)臇|西都在論文里,如果你只是通過(guò)書(shū)本或社區(qū)學(xué)習(xí),那么你永遠(yuǎn)不會(huì)知道今天在計(jì)算機(jī)科學(xué)與技術(shù)的領(lǐng)域又發(fā)生了哪些令人震撼的事情,出現(xiàn)了哪些新奇的東西。
不要太懶惰,你寫(xiě)增刪改查寫(xiě)累了嗎?Come on!有沒(méi)有想過(guò)自己寫(xiě)一個(gè)小型的httpd?當(dāng)然你需要先去學(xué)習(xí)HTTP協(xié)議(rfc2612),試試能不能寫(xiě)一個(gè)PHP的SAPI擴(kuò)展令你的httpd處理PHP腳本。有沒(méi)有想過(guò)自己用lex和yacc實(shí)現(xiàn)一個(gè)自己的小語(yǔ)言,也不是完全沒(méi)用,也許你已經(jīng)對(duì)你的領(lǐng)域業(yè)務(wù)邏輯爛熟于胸,那么去實(shí)現(xiàn)一個(gè)自己的領(lǐng)域語(yǔ)言吧。?。∥乙W(xué)習(xí)編譯原理、形式語(yǔ)言與自動(dòng)機(jī)……咦,這東西還挺有意思的,去看看計(jì)算理論去……如果到了這里,你已經(jīng)開(kāi)始接觸計(jì)算機(jī)的數(shù)學(xué)本質(zhì)了,而你的層次將會(huì)得到升華。
學(xué)習(xí)就是這樣,主動(dòng)突破自己,給自己一些挑戰(zhàn)性的任務(wù),生活才有趣。成天困在.NET的盒子里,我們還有臉?lè)Q自己為程序員嗎?
脫離IDE 玩玩純文本與shell
從沒(méi)用過(guò)IDE的程序員可能是悲劇,但從沒(méi)脫離過(guò)IDE的程序員絕對(duì)是悲??!
你有沒(méi)有覺(jué)得自己越來(lái)越不像個(gè)"編程序"的而越來(lái)越像"堆程序"的。好的,即使在工作時(shí)你離不開(kāi)IDE,那么業(yè)余時(shí)間讓你的IDE滾蛋,等等,你改用Notepad?氣死我了你!試試vim或Emacs,體驗(yàn)一下用純文本寫(xiě)程序,用gcc編譯連接的樂(lè)趣。你會(huì)發(fā)現(xiàn)"yyp"比"選中一行,Ctrl+C,點(diǎn)擊下一行起始位置,Ctrl+V"簡(jiǎn)單的多,你會(huì)發(fā)現(xiàn)按一下"0"比按20次"左箭頭"省事的多。等源程序多了,也許你會(huì)想去學(xué)習(xí)Makefile的寫(xiě)法。你會(huì)莫名其妙地發(fā)現(xiàn)自己更懂編譯和連接過(guò)程了。
相信我,用純文本和shell寫(xiě)程序比用IDE酷多了,想吸引女孩子嗎?你去問(wèn)問(wèn)你們班或你們公司最漂亮的女生,她也會(huì)這么想。重要的是,這種酷不是"裝B"的酷,而是有效率的酷。什么?你已經(jīng)受不了IDE了……
接受更多的編程哲學(xué)與學(xué)習(xí)方式
注意我是用的"接受"而不是用"改變",你不需要改變什么,寫(xiě).NET程序很好,不過(guò)你可以適當(dāng)吸取一下其它領(lǐng)域的編程哲學(xué)與學(xué)習(xí)方式。可以說(shuō)Windows(特別是.NET)程序員和Unix程序員思考問(wèn)題的方式大不相同,如果現(xiàn)在需要一輛汽車(chē),Windows程序員會(huì)建立一個(gè)從冶鐵到裝配的"All in one"汽車(chē)制造基地;而Unix程序員會(huì)去分別建立采礦場(chǎng)、冶鐵廠(chǎng)、設(shè)計(jì)公司、材料制造廠(chǎng)、機(jī)械制造廠(chǎng)和裝配廠(chǎng)。我不想討論他們各自的優(yōu)缺點(diǎn)(因?yàn)楹苋菀紫萑霟o(wú)謂的宗教紛爭(zhēng)),但是對(duì)于你來(lái)說(shuō),了解一些其它的編程哲學(xué)對(duì)你沒(méi)有壞處。
另外就是學(xué)習(xí)方式,例如你要學(xué)習(xí)PHP,請(qǐng)千萬(wàn)不要去書(shū)店購(gòu)買(mǎi)各種《21天精通PHP》或《PHP編程寶典》,你應(yīng)該首先打開(kāi)Google,找到PHP官網(wǎng),然后去官方文檔哪里尋找學(xué)習(xí)資源。網(wǎng)上還有各種wiki,mailing lists和社區(qū),請(qǐng)不要放棄這些資源。然后同時(shí)你可以去Amazon看書(shū)評(píng),然后小心而謹(jǐn)慎地選擇一本相關(guān)的書(shū)籍(影印版最優(yōu),翻譯版其次)。
一個(gè)人想突破自己不容易,關(guān)鍵在于自己有沒(méi)有突破的意愿。衷心希望有一天,您的腦中不再被ASP.NET,ASP.NET MVC,WCF,WPF,ADO.NET,Silverlight,EF……而占滿(mǎn),如果到了那一天,你會(huì)發(fā)現(xiàn),咦?!我.NET的水平也大幅提升了!