寫給.NET程式設計師:不要困在自己建造的盒子裡

Web開發者發表於2012-06-09

  此文章的主旨是希望過於專注.NET程式設計師在做好工作、寫好.NET程式的同時,能分撥出一點時間接觸一下.NET之外的東西(例如10%-20%的時間),而不是鼓動大傢什麼都去學最後什麼都學不精,更不是說.NET不行或勸大家放棄.NET。恕我愚鈍,此主旨在文中表達不夠清楚,看評論中很多朋友誤解了,特此說明。

  另外,本文中的觀點並不全部是我個人的想法,相當一部分來自我以前聊過天的某些大牛,他們很多來自微軟、百度、騰訊等知名企業,並且很多已經成為技術骨幹,我曾經從他們那裡受益匪淺,於是我把他們的指教結合自身的經驗和理解寫成此文。這就是此文的來源。

  在給這篇文章起標題的時候,我斟酌了很久,因為我個人是反對使用".NET程式設計師"、"C++程式設計師"或"PHP程式設計師"這類簡單粗暴的方式為程式設計師做劃分的。但是客觀確實存在一個現象,就是很多程式設計師會為自己設定一個無形的界限,將自己與某種語言或平臺硬繫結到一起,例如我這裡所指的".NET程式設計師"。請注意這與"術業有專攻"是不同概念的,有自己專攻的平臺或領域這很正常,但是有很多人偏執地將自己與某個語言或平臺緊緊捆綁,而忘記了自己首先是一名程式設計師,然後才使用某種語言,他們偏執於平臺並陶醉於自己建立的盒子裡,而不願主動去接觸一些盒子外的事物,最終使得自己無法進步。

  從我個人的觀點看,本文中".NET程式設計師"是指具有如下特點的程式設計師群體:

  ● 學習、工作的技術範圍均侷限於.NET平臺及衍生,對.NET之外的技術沒有主動接觸或學習的慾望。

  ● 不斷學習各種.NET平臺上的庫或框架,如ADO.NET,ASP.NET MVC,WPF,Silverlight,WCF,WP,EF,NHibernate……

  ● 工作無法脫離Visual Studio,習慣於圖形化的工作環境。

  ● 時常抱怨微軟的技術更新太快,微軟開發平臺包辦太多以至於自己身價貶值。

  ● 對物件導向、設計模式、軟體架構等東西具有極大的熱情,寧可花大量時間編造各種"設計模式小故事"也不願花點時間瞭解一點新鮮的東西(如Unix下的IPC)。

  ● 對Java頗有微詞,覺得C我根本用不到,至於PHP?它能做到的.NET都能做到,認為用Linux的大多在裝逼,而Lisp、Lua、Eiffel神馬的都是浮雲,我管它們幹什麼。

  ● 認為面嚮物件語言就是程式設計語言的代名詞,指令式程式設計深入骨髓,不太瞭解函式式語言或契約式語言是什麼。

  ● 用.NET很多年了,但感覺自己沒什麼突破,沒什麼進步,成天就搞些增刪改查的勞什子。

  ● 經常討論或思考.NET或Java或C或其它語言哪個好,搞哪個更掙錢這種問題。

  如果您有超過3項符合上述特徵,我想我們可以聊一聊,因為據我的觀察,感覺部落格園上這類朋友還是挺多的。

  希望我能做到旁觀者清

  有一個事實我想先和大家澄清一下,其實.NET只是我的業餘愛好。由於部落格園主要偏重於.NET平臺,且園子裡的朋友對物件導向、架構之類的頗感興趣,所以我寫了很多關於.NET及架構方面的文章(如果您注意觀察,會發現我部落格裡這類文章正減少並趨於消失),其實相對於設計、架構這類東西,我個人更感興趣的是具體的科學與技術,例如各種程式語言的原理、應用及實現擴充套件,作業系統原理,網路程式設計,通訊協議,演算法與資料結構,資料探勘,機器學習,分散式等等;語言方面我比較喜歡的是PHP、Python、Lisp等;而程式設計方面我更推崇Unix下的程式設計哲學和程式設計方法;我愛vim勝過VS無數倍。

  因此,.NET和C#我一直是作為業餘愛好來發展的,希望這沒有讓任何人覺得沮喪。很多朋友加我QQ或MSN問我關於.NET的問題,我經常答不上來,很多人或許覺得我不近人情,但我其實是真的答不上來。例如我在部落格中寫過一系列關於ASP.NET MVC的文章,很多人是衝那系列文章加我的,但是其實ASP.NET MVC我只在beta版時擺弄過兩個星期,然後就再也沒有碰過,所以後來很多朋友問我想關問題我是真的答不上來。

  所以,在部落格園這個以.NET和架構之類為主的社群,我算是半個旁觀者吧,我看到園子裡很多朋友都把自己禁錮在自己創造的盒子裡,所以我希望以旁觀者的身份,給這些朋友提幾個建議。

  每半年接觸並學習一門語言

  有許多人通常覺得只要把一門語言學會學精就行,這個想法我覺得對了一半。一個程式設計師應該有一門精通的語言,但是還要不斷學習新的語言(當然不能太頻繁),倒不是為了以防哪天萬一用到這門語言,而是接觸學習不同的語言會擴充程式設計師的視野。

  如果你一直用C#,試試Lisp,你會驚歎於還有這樣寫程式的方式,嗯?看來我得去學學Lamda演算;試試Python,你會驚訝於還有如此小巧優美的東西;試試Lua,你會發現原來語言還能嵌入其它語言,要不要為WOW寫個外掛試試?試試Eiffel,你會發現還有契約式程式設計這種方法,嗯?什麼?Java上有iContract,那我要不要為.NET實現一個?隨著這種學習過程,你的思維自然就被擴充開了,而不是滿腦子的Class、Object、MVC、OO……

  其實學習語言不一定是學習沒聽說過的,許多您聽到耳朵長繭卻從來沒有深入學習的"老朋友",如C、PHP,如果您細心學下來,也會得到許多意外的收穫。

  例如在學C的過程中,你會發現不可能脫離Unix環境而把C學好,你會接觸POSIX和System V,你會主動深入學習程式、執行緒、訊號、I/O、IPC,你會接觸TCP/IP協議。你會發現要學好C還要理解計算機組成原理,你還會發現原來還有大小端這個東西。

  深入學習PHP,你會發現PHP遠不僅僅是一個做Web的指令碼語言那麼簡單,你會了解到它SAPI、PHP Compiler和Zend Engine的優美結構,你會發現有opcode,你會發現PHP渾身都是擴充套件點,你可以擴充套件功能,擴充套件Compiler和Zend Engine,甚至可以完全實現自己的編譯和執行邏輯。你會了解APC是如何快取opcode,APD是如何跟蹤PHP的執行。

  每次學習一門語言,你會發現這不是一門語言,而是一個嶄新的新大陸,裡面有太多讓人興奮和新奇的東西,而如果你執意禁錮在".NET盒子"裡,你就永遠不會知道這些。

  主動突破自己 接受更多挑戰

  如果什麼東西都是用到才學,程式碼都是有用才寫,那我只能非常抱歉的說你還不是個程式設計師,而只是個程式碼工人。程式設計師應該有主動出擊的意識,應該對自己未接觸的領域有無限嚮往。幸運的是,網際網路上的財富實在太多了,你應該盡其所能去接觸學習未知的東西,而不要總想我學習這個東西能不能換來錢給孩子買尿布和奶粉。你可以有很多借口,但是我想說,藉口想找總是有的,時間想找也總是有的,還是看自己到底要什麼。不要一邊躺在盒子裡一邊又抱怨自己沒有進步。

  例如Google Publication,這裡有世界最優秀的Google工程師們理論和實踐的總結,來讀讀這些偉大的論文吧,看看這個偉大的公司和一群偉大的人都幹了些什麼,瞭解一下Map Reduce是怎麼回事,如果瞭解了你自然想去試試Hadoop,還有Bigtable和GFS,哦!太震撼了,原來儲存資料也有這麼多講究,不是放硬碟裡或通過Insert插入資料庫就行了。也許這些英文論文讀起來很困難,但是我想一週一篇的要求並不高(我現在仍然保持著一週讀兩篇論文的習慣)。要知道,最新、最嚴謹的東西都在論文裡,如果你只是通過書本或社群學習,那麼你永遠不會知道今天在電腦科學與技術的領域又發生了哪些令人震撼的事情,出現了哪些新奇的東西。

  不要太懶惰,你寫增刪改查寫累了嗎?Come on!有沒有想過自己寫一個小型的httpd?當然你需要先去學習HTTP協議(rfc2612),試試能不能寫一個PHP的SAPI擴充套件令你的httpd處理PHP指令碼。有沒有想過自己用lex和yacc實現一個自己的小語言,也不是完全沒用,也許你已經對你的領域業務邏輯爛熟於胸,那麼去實現一個自己的領域語言吧。啊!我要去學習編譯原理、形式語言與自動機……咦,這東西還挺有意思的,去看看計算理論去……如果到了這裡,你已經開始接觸計算機的數學本質了,而你的層次將會得到昇華。

  學習就是這樣,主動突破自己,給自己一些挑戰性的任務,生活才有趣。成天困在.NET的盒子裡,我們還有臉稱自己為程式設計師嗎?

  脫離IDE 玩玩純文字與shell

  從沒用過IDE的程式設計師可能是悲劇,但從沒脫離過IDE的程式設計師絕對是悲劇!

  你有沒有覺得自己越來越不像個"程式設計序"的而越來越像"堆程式"的。好的,即使在工作時你離不開IDE,那麼業餘時間讓你的IDE滾蛋,等等,你改用Notepad?氣死我了你!試試vim或Emacs,體驗一下用純文字寫程式,用gcc編譯連線的樂趣。你會發現"yyp"比"選中一行,Ctrl+C,點選下一行起始位置,Ctrl+V"簡單的多,你會發現按一下"0"比按20次"左箭頭"省事的多。等源程式多了,也許你會想去學習Makefile的寫法。你會莫名其妙地發現自己更懂編譯和連線過程了。

  相信我,用純文字和shell寫程式比用IDE酷多了,想吸引女孩子嗎?你去問問你們班或你們公司最漂亮的女生,她也會這麼想。重要的是,這種酷不是"裝B"的酷,而是有效率的酷。什麼?你已經受不了IDE了……

  接受更多的程式設計哲學與學習方式

  注意我是用的"接受"而不是用"改變",你不需要改變什麼,寫.NET程式很好,不過你可以適當吸取一下其它領域的程式設計哲學與學習方式。可以說Windows(特別是.NET)程式設計師和Unix程式設計師思考問題的方式大不相同,如果現在需要一輛汽車,Windows程式設計師會建立一個從冶鐵到裝配的"All in one"汽車製造基地;而Unix程式設計師會去分別建立採礦場、冶鐵廠、設計公司、材料製造廠、機械製造廠和裝配廠。我不想討論他們各自的優缺點(因為很容易陷入無謂的宗教紛爭),但是對於你來說,瞭解一些其它的程式設計哲學對你沒有壞處。

  另外就是學習方式,例如你要學習PHP,請千萬不要去書店購買各種《21天精通PHP》或《PHP程式設計寶典》,你應該首先開啟Google,找到PHP官網,然後去官方文件哪裡尋找學習資源。網上還有各種wiki,mailing lists和社群,請不要放棄這些資源。然後同時你可以去Amazon看書評,然後小心而謹慎地選擇一本相關的書籍(影印版最優,翻譯版其次)。

  一個人想突破自己不容易,關鍵在於自己有沒有突破的意願。衷心希望有一天,您的腦中不再被ASP.NET,ASP.NET MVC,WCF,WPF,ADO.NET,Silverlight,EF……而佔滿,如果到了那一天,你會發現,咦?!我.NET的水平也大幅提升了!

來源:伯樂線上

相關文章