天天看點

不要困在自己建造的盒子裡——寫給.NET程式員(附精彩評論)   希望我能做到旁觀者清   每半年接觸并學習一門語言   主動突破自己 接受更多挑戰   脫離IDE 玩玩純文字與shell   接受更多的程式設計哲學與學習方式

此文章的主旨是希望過于專注.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和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盒子”裡,你就永遠不會知道這些。

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

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

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

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

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

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

  【精彩評論】

  Jacky Song:真正的程式員肯定不會限定在.net平台,程式員就是為了解放生産力,提高工作效率而生的,其實除.net以外,還有其他很好玩的技術或工具,比如你所說的編輯器之神vim,無論是windows平台還是linux平台,都是其它編輯器無法比拟的(誰用誰知道)。腳本的話python, php, 以及各平台的shell, 這些都是可以大大的提高工作效率。總之,計算機就是一門藝術,越往裡面研究越覺得它是劃時代的奇迹,這玩意太神奇了!!

  toEverybody:我認為改變一下公司的技術會眼界很寬,如學C#, 再學一下Delphi, 再了解一下C++, 再了解一下PHP.....

  微生物:其實本質上還是要問這樣一個問題,你真的是一個合格的程式員嗎?你真的打算一直做程式員嗎?

  FlyDragon:思想的認識升華到你這個層次需要時間和好的引導。真正埋頭于技術,而不參與社群交流的人很難走出自己的瓶頸!

  朝_夕:部落客的觀點正好描述了我目前的狀态,作為一個以.net 技術來混煩吃的技術人員來說,當我掌握的.net 技術越高深,在工作中展現的價值就越大,獲得的報酬就越多,使我不得不專注于.net 的技術;但微軟的技術更新得那麼快、那麼多,對于我這個資質比較普通的腦袋來說,實在是有心無力……目前趁着工作任務比較少,學習了下python, 和用下Linux,釋放下滿腦都是.net的大腦。

  JaiHo:很高興我已經和VS無關了,曾經一次裝VS快一個小時後,我就不再用了,以前用VS學C++和C,後來發現很多問題,就用gcc編譯器了。我已經脫離IDE了,工作以來還未用IDE,感覺純文字編譯器vim很好。

  llzhzhbb:執拗于一個平台和刻意使用多個平台其實本質上沒差别,都是認為鐮刀的意義大于麥子。

  午後的小睡:相比微軟,當蘋果程式員吧。蘋果對架構的推出和更改非常謹慎,修改文法更是謹慎,是以蘋果的系統基本上都是增添API,不會像.net那樣,微軟今天一個架構,明天又一個,沒完沒了的往C#裡添加各種語言特性,讓你把本來應該學習先進的開發算法和方法的時間全浪費在語言和架構的鑽研裡了。

   hogface:技術眼界不斷的擴張是必須的,我倒是認為我們做技術的不應該總在技術層面晃,可以多多了解其他行業的運作規則。我們會擷取很多資訊,有助于我們的程式設計。中國多數的程式員的歸宿在哪裡呢?當你30歲了還在寫代碼,而對其他行業不了解,那你的職業壽命到頭了。簡單适用的技術應用于行業運作才是我們程式員的價值提現,也是能夠生存下來的關鍵。看看開心網,優酷,凡客誠品等。都是成功的案例,一味談技術在中國多數人是沒希望,沒飯碗的。

  Keven Wang:有時候現實和我們的願望還是有很大的差距的。不過我很支援樓主的觀點。畢竟我們不可能一輩子做程式員。在應用中學習,在學習中應用。帶着任務性的學習是最快的。 

  Jeffrey Zhao:

引用午後的小睡:相比微軟,當蘋果程式員吧。蘋果對架構的推出和更改非常謹慎,修改文法更是謹慎,是以蘋果的系統基本上都是增添API,不會像.net那樣,微軟今天一個架構,明天又一個,沒完沒了的往C#裡添加各種語言特性,讓你把本來應該學習先進的開發算法和方法的時間全浪費在語言和架構的鑽研裡了。

你搞笑,obj-c的年年加新特性。蘋果系統增加API,微軟就不是了?

  蘋果出一個GCD,你們嗷嗷叫好。微軟加一個TPL,你們就說備援。兩個tmd是一種東西好不好。

  要說學習先進的開發方法和算法和理論,學C#絕對比obj-c有價值,如今obj-c的興起完全是iPhone等等在商業上的成功。

  你談比賺錢倒也罷,你比“長進”,這不是扯蛋麼。

  午後的小睡:

  @Jeffrey Zhao

  您不是個C/C++程式員,不知道微軟的開發工具是多麼郁悶的東西,我這裡不是怪微軟,因為微軟的鎮山之寶是Windows,如果允許程式員在Windows下寫的程式可以随便移植到别的平台上,對微軟來說那是緻命的。是以當初IE擅自修改HTML的支援搞得Web開發人員暈頭轉向,它不去支援OpenGL,卻去搞D3D,它擅自修改Java,JDC不高興它才搞的C#,不光是開源軟體,任何平台中立的标準微軟都一定要單開一套,所謂Mono的跨平台也是個笑話,我問過很多用過的人都不建議使用它,都是說不到萬不得已,用.net還是遷移到Windows平台上好。

  我以前寫Cygwin/Mingw/Linux的程式,想用個IDE提高效率,用了下VS,一看它生成的模闆程式就放棄了,微軟連STD C++都不放過,你對C++生成托管代碼或者什麼架構我無所謂,如果在文法級标準支援的有差異,甚至另立新文法挖空心思逼迫程式員轉用微軟獨有的東西那就沒法忍受了。

  Obj-C不過是C/C++的擴充,它不像微軟從文法級變更了C/C++,你可以使用所有既有的庫和标準代碼,實際上除了圖形界面相關的部分,根本沒必要寫Obj-C的代碼,蘋果的新Obj-C前端CLang也沒有對C/C++在文法級做變更,而是強調遵從标準。蘋果修改Objc-C從來隻修改它擴充的那部分,從來不會對C/C++本身動手術,這就是差別。

  總之,追蹤微軟的東西是最累人的,到處是Windows粘合陷阱,稍不留神寫的東西就變成了Windows依賴,哪怕是某些明明是邏輯公共的部分,當然,如果發誓隻給Windows平台寫程式是另一回事。

  @午後的小睡

  說obj-c是c++擴充?無語啊,隻是c擴充而已。VC++不支援C++标準?求證。

  IE的标準問題,那是Web标準看IE不爽故意定成不一樣的,請厘清先後順序。

  微軟現在一直擁抱标準,請更新您的思路,還D3D,Java呢,什麼年代的事情。

  擴充之類的誰都再做,IE有擴充,Opera有擴充,Mozilla有擴充,WebKit有擴充。而且你不也說,obj-c是c的擴充麼,呵呵。

  至于說mono是笑話的人,要麼本來就看和.NET有關的東西不爽,要麼是不知道mono現在是多牛。

  午後的小睡:  

  @Jeffery Zhao

  obj-C還包括obj-C++,它不過是C/C++文法上加了Smaltalk類文法擴充(所有用@符号開始的部分),我愛用C++和STL,天天在用。XCode目前用的是gcc和g++前端,将來CLang對C++标準支援達标了,将會替代gcc前端,參見www.llvm.org。

  VC++對标準支援的爛,這個所有用過VC++的人都知道,據說到了2008比較好了,但是到了2010就是另一番天地了。你現在用VS2010生成一段C++ HelloWorld,你去給C++程式員看,他肯定說,這是什麼C++?這是.net代碼吧。

  SnowDreamist:

  OpenGL本身就有問題,他更适合于工業級别的渲染但對于計算機遊戲的支援并不到位。Mono現在做的很強,我想你才是沒有用過mono的人,不得不說,在SL5推出之前,MoonLight的硬體加速要比SL4,微軟官方的性能要好,你都視而不見嗎?Cygwin我裝了一個小時沒有完成果斷殺掉程序了。雖然我也很喜歡Linux的指令行和那些漂亮的小工具,工作效率很高,但是這并不足以成為謀生手段。至于C++标準,簡直就是笑話。我在學習編譯原理的時候,老師就說C++是為編譯器作者創造的一門語言,而不是程式設計人員。C++用的很多,但不能說明C++就是一門優秀的語言,他太複雜了,讓機器自動生成吧。Gcc的作者同樣抛棄了#pragma開關,這也是對标準的篡改,也沒好到哪兒去。

  ocean:

  有些跑題了。

  真正的主題應該是專注于一項技術,培養自己的特長,增加自己的核心競争力。而不應該每樣技術都去學,最後搞得沒有一樣精通,也沒有核心競争力。多學一些,多看一些,多關注一些是好事,但是不要颠倒次序,一定要專注。

  至于語言哪個好如個不好,這個争論起來就大了,就像你用VS寫程式,卻非要在Linux上跑,這就是蛋疼的事情,你選擇了.NET,當然應該基于微軟的平台。你選擇了iphone平台,那你完全可以用object-c,什麼樣的平台上有什麼樣的技術,選對平台,選對技術也是一種能耐。用linux,不用php而用asp.net就是蛋疼,用windows,不用.NET而用java也很蛋疼。

  雖說跨平台是好事,我這麼多年見過這麼多大企業,還真沒見過有企業把自己的應用從一個平台遷移到另外一個平台的,别說從linux遷移到windows,就是從同樣在unix/linux下将websphere遷移到到weblogic的都沒看到。一個大型應用一旦運用起來,再去遷移基礎平台本身而是蛋疼。

  嗯嗯,obj-c對c語言的擴充,WebKit,Firefox,Opera對标準的擴充都是先進生産力。IE的擴充就是邪惡。蘋果對obj-c每年都加新特性就是發展生産力,C#兩三年一次就是追逐新技術。我懂的。

  話說我不寫C++,但我身邊寫C++的人太多了,從VS 2008轉到VS 2010的人也很多。而且太多C++項目在Windows下是使用VC++編譯器,在*nix下面用gcc,按你的說法,我實在了解不了這種情況是怎麼回事。

  你不妨先說說,有空我也問問那些C++程式員。

引用迂腐啊迂腐:

2.為什麼.net能輕易實作的東西,您要去用php做,您是在炫技術麼?

  不說别的,今天我還真聽說了公司裡某個項目是這個情況,嘿嘿。

  用VC++6.0确實能讓一些不太符合C++标準的代碼編譯通過,不過這也要看程式員了,如果程式員比較遵循标準,也同樣可以用VC++6.0寫出完全規範的代碼來,這點還是用 VC++ 2010吧,VC++ 2010支援最新的C++标準,不過這樣也帶來了更新的一個問題,原來一些在VC++6.0下寫的不太規範的代碼,在VC++ 2010上就編譯不過去了。

  至于IE的擴充,更多的基于曆史問題,因為标準的定制太慢,導緻IE不得已自己定了很多東西。同時在10幾年前,網頁編輯器,特别是所見即所得的編輯器,很多都不符合标準,是以導緻做出來的網頁大多不符合标準。畢竟做網頁的不是程式員,并不懂什麼标準,甚至很多html裡面都有錯誤,比如漏掉反标簽,或者反标簽錯位等等。為了更好的容錯性,IE可以很完美的将這些頁面顯示出來,這實際上是程式健壯性的一種表現。我們在計算機課程上都學過,程式健壯性是很重要的,就是在使用者錄入錯誤的時候能夠有正确的提示或者修正,舉個例子,比如我們現在寫程式,會經常将使用者輸入的全角的數字替換成半角的數字,因為如果你提示使用者不能用全角輸入數字,那使用者可能并不清楚什麼是半角什麼是全角,健壯性在于我能夠很好的修正使用者輸入的這些錯誤。對于html這麼複雜的東西,如果沒有自動修正就等于很多網頁都看不了,是以在早期,這種做法是可取的。很多東西要從曆史的角度去看,問題産生都和起産生的背景相關。

  争哪種技術好很無聊。廠商玩壟斷也好,玩革新也好,那是廠商的事情,我很簡單,我為錢工作,雖然我也喜歡鑽研技術。我不會為了反微軟而反微軟,應該明白一件事情,反微軟的平台壟斷,是為了賺錢!因為,市面上平台越多,越混亂,搞開發的人才好賺錢,才意味着更多的機會,平台間競争越多,大廠商才會為了吸引我們這些小開發者進行讓利,一旦誰獲得了統治地位,開發人員必然會同質化,開發人員的價值就低了,至于什麼節省社會資源,哪種技術更優秀之類的P話,能比進你錢包裡的錢實在?蛋糕就那麼大,廠商占的多了,咱們開發人員自然占的就少了,部落客的意思可以這麼了解,一旦發現某塊蛋糕自己能分的越來越少了,必須能立刻跳到另一塊蛋糕上去!

  szse:

  W3C就是個笑話。至于OpenGL和D3D之争,遊戲業同時做過兩種東西的人怕是還真沒有站在OpenGL這邊的。标準的不等于就是好的,标準協會歸根結底還不是一群大頭搶話語權?

  Hunts.C:

  可惜很多人都不是真正的程式員,是以你善意的提醒,閱聽人不多。很大一部分軟體開發從業人員并沒有給自己加上程式員的社會屬性,并以此出發,作為未來數年甚至是數十年的努力方向。僅僅是年少無知時被忽悠學了這個學科,或是一些非主觀的原因最終從事了這個行業的工作,如今難以脫離。在這片神奇的土地上,做真正的自己是不容易的,你懂得。是以請不要失望,繼續分享你認為有意義的觀點。    

  chenkai:

  最近很忙都沒有時間寫博。說到一門技術專業程度上來,個人認為大部分程式員都局限在企業的選擇之上。當然這也無可厚非,但是我曾經無數次強調過一個程式員職業修養來說,開放是很重要的。這也是我考察其他程式員一個"另類"的标準, 技術範圍、程式設計思想、視野的開放等等,這也無疑也成就不同程式員各自的夜郎之國。不得不說這是一個很現實也很悲哀的事情。但願你的提醒能喚醒更多的程式員同行....

  Qinw:

  很好,和我的學習方向一緻,這就是大師的學習方式,金字塔學習法。我現在也一直在學習其他語言,像ruby,python C/c++, 彙編等,發現這個世界原來是那麼大,那麼精彩,最主要的是讓我激情源源不,但現在脫離IDE我的技術還不行,玩過,但我經常崩潰而死。

  東風31:

  非常棒的文章。也許,在國内,隻有這種興趣,這種孜孜不倦的探索與追求,才能在技術領域 make a difference.

  一傑:

  對于本文的了解,不對的請指點:其主要宗旨是多接觸行業内的事物,開拓思維,才能深入其本質,不隻是從微觀的角度分析與了解自有的語言(不僅是.NET程式員);隻有宏觀的看待事物才能更好的把握住好的方向;

  學習或使用語言也是一種投資;從投資學的角度說:就是所有的雞蛋放在一個籃子裡,風險很高,因為誰也不能保證你的籃子是永久存在的或品質優良;多關注周圍的籃子,就可以發現自有籃子的不足,才可以修補目前籃子的不足;當然也可以換一隻更加優秀的籃子來投資,誰會害怕有更好的收益呢?

  空明流轉:

  MSVC從2002開始,就開始對标準有很好的相容性了。你懂不懂為什麼VC6對标準相容不好啊?因為VC6在标準之前推出的。用的是當時标準的草案。VS2010?你看看GCC 4.5的Feature list,再看看C++1x的标準草案,你就懂了。

  老壞貓:

  實際上,感覺這裡很多喜歡不喜歡.NET的人其實并不了解.NET。一個真正的.NET高手要了解計算機體系的絕大部分知識,并能權衡利弊,妥善運用。大部分還不熟練.NET的人企圖淺嘗辄止學其他語言,不僅起不到樓主所謂集思廣益的效果,反而狗熊掰包谷一樣一事無成。

  李曉強:

引用Jacky Song:真正的程式員肯定不會限定在.net平台,程式員就是為了解放生産力,提高工作效率而生的。其實除.net以外,還有其他很好玩的技術或工具,比如你所說的編輯器之神vim, 無論是windows平台還是linux平台, 都是其它編輯器無法比拟的(誰用誰知道)。腳本的話python, php, 以及各平台的shell, 這些都是可以大大的提高工作效率。總之,計算機就是一門藝術,越往裡面研究越覺得它是劃時代的奇迹,這玩意太神奇了!!

  額,這個所謂的神器VIM不知道有沒有如下功能:

  1) 腳本智能提示,那種簡單的關鍵字提示的就别說了。(别說我菜,大多數情況下我還是記得API的,但是一個回車就能節約輸入的情況下,我覺得還是值的,而且作為一個Web開發人員,很無奈至少我需要同時使用CSS,HTML,JS,C#,VB.NET).

  2) 格式化代碼,我是個很懶的人,比如寫XHTML屬性懶得寫引号,寫C#,js之流的代碼不想手工用Tab鍵格式化代碼,是以我需要一種一個快捷鍵就能按照我設定的規則來格式化我的代碼的工具。(Ctrl+E,D VS中輕松搞定)

  3) 項目管理,額,現代的程式員,通常都是把自己的代碼分成各個項目來開發的。

  4) 版本控制和團隊協作工具(BUG管理,任務配置設定之類的)。

  ...

  如果沒有,請記住這句話:VIM和VS不具有可比性,一個隻是文本編輯器,另一個是IDE;一個是播種機,一個是聯合收割機...

  另外VS的快捷鍵用起來比VIM有效率多了,我用VS基本上不用滑鼠的。

  思考-總結:

  樓主,頂你,我覺得說的很有道理的。

  舉個例子說明下,很多人用nhibernate ,裡面的實體類,要麼繼承于接口,要麼是virtual的。但是java下,好像就沒有這個限制? 為什麼呢?其實深究下,能明白,java下都是virtual call, 而在.net, 為了提升效率,有call 和 virtual call 之分。 之後再看看 ioc 的實作原理,大概也能明白一些了。

  其實很多技術是相通,你在看别的技術的時候,可以帶着自己所熟悉的平台的問題, 去學習和去看,一是開闊了眼界,另外對你了解自己熟悉的平台有更深入的了解。

  讀書也是,很多人基本上看書和資料,都是走馬觀花,基本上看完就忘, 如果能做到帶着問題去看,或者看的時候能想着自己曾經遇到過的同類的問題,吸收新的知識,會更快更牢更紮實。

  哎,發現很多人罵微軟技術更新快的。這個IT本來就是個快速發展的行業,發展快總比發展慢要好吧,我覺得微軟發展的還是有點慢了。knect之類的技術要是早出現幾年多好啊,啥時候才能達到讓計算機擴充人的大腦的思維能力啊...比如我一個想法能夠查詢全中國的資料文獻。

  Jacky Song:

  @李曉強

  vs本身是集開發,編譯為一體的,但論文本編輯功能,vs能實作的,沒有vim搞不定的,vs搞不定的,vim同樣能搞定(智能提示,自動完成,列操作,文法高亮....) 都可以自己配,網上n多vim的牛比插件,你試用以後就知道他的強悍,vim在文本編輯器領域當之無愧是No.1。

  EricZhang(T2噬菌體) :

  呵呵,說起來還是Windows程式員和*nix程式員在思考問題方式上的不同。您作為Windows程式員,習慣使用大而全的東西。而*nix程式員習慣把小而靈巧的東西組合起來使用,例如您說到的版本控制,vim本身當然不會有,因為vim對*nix程式員來說就是編輯器,版本控制我們有svn和git啊,我們也可以通過配置(vim或emacs的可配置性和可擴充性超乎你的想象)将snv或git更友善地內建到vim中。至于代碼格式化,VS給你提供了有限的功能,而vim或emacs提供了無限的可能,隻要有需要,自己寫擴充腳本就行了,例如你在emacs下輸入“M-x sort lines”看看效果。至于您提到的智能提示啥的在vim中更是小菜一碟,插件遍地飛。最後,我絕不是說IDE不好,隻是說習慣了IDE的朋友抽點寶貴時間适當脫離IDE玩玩vim和shell會更好。

  額,這個各種編輯器啥的沒少玩,就是覺得忒麻煩了,生産力太低。在了解VS做了什麼的情況下,我覺得嘛,有奔馳,完全沒必要騎自行車。呵呵,個人意見。大家引入計算機就是為了降低難度,省點腦細胞,你要說我用個Emacs,VIM還得自己寫寫腳本擴充(何況格式化源代碼之類的擴充不是一兩百行代碼就能搞定的事兒),那還是有點不合适吧。

  @Jacky Song

  呵呵,自動完成,列操作,文法高亮這種就不說了,大家都有,沒啥好比較的。智能提示就不一樣了,VS的智能提示有類型推斷而且針對.NET 平台和JS的智能提示更是編譯性的,何況VIM那麼多擴充插件良莠不齊...WIN下使用VIM裝插件後,崩潰的不是一次兩次啊。不說了,個人意見,不過最牛的是VS可以在裝了一些插件後切換成VIM模式,完全可以滿足您的要求。

  Jeffery Zhao:

  其實吧,VIM的确是好東西,但是舉例子的時候一定要靠譜,比如文章裡寫的東西,直接ctrl+c,ctrl+v,和yyp是一個效果,不用選中該行的。光标到行首,也是一個home鍵搞定。VS也有快捷鍵,也可以擴充,用起來也可以不碰滑鼠。VS連VIM插件都有,也有不少人用,我也在用,既可以VIM又有智能提示。說到智能提示啊重構啊,在VIM要做到VS,NetBeans這種程度也是很難的,插件找不到好的(你說你不需要則是另一回事情了)。

  徐少俠:

  本質是同意樓主的說法的。問題是樓主的打擊面太大。尤其是那個IDE的說法。不過其實樓主說的很清楚,是在工作之餘去耍耍。耍過了,尤其是經曆了編譯的全流程。會學到和領悟到更多的。而工作的時候,快捷鍵的優勢足以将vi搞下去了。不用IDE,不是僅僅不用它,而是為了去體會平時更多我們不去體會的東西。

  llzhzhbb:

  我覺得程式員應該把自己經常考慮的問題作一下分析,哪些是和語言及平台相關的,哪些是和語言無關的。比如資料結構、通信、圖形、外接裝置等,絕大部分都和語言無關;嵌入式系統、驅動等,和語言及平台的關系較大,不過更多的還是與作業系統的知識有關。把問題的這些層面剝離之後,真正和語言相關的其實并不多。語言不過是提供了一個門,人們可以從這個門進去觀看大廳裡的東西,或者語言是一種交流的工具,人們隻是采用了這一種語言和某個龐然大物對話,而這些真正的交流對象,不會天然的歧視你從哪個門進入或者采用何種語言。

  gussing:

引用午後的小睡:

VC++對标準支援的爛,這個所有用過VC++的人都知道,據說到了2008比較好了,但是到了2010就是另一番天地了。你現在用VS2010生成一段C++ HelloWorld,你去給C++程式員看,他肯定說,這是什麼C++?這是.net代碼吧。

  有的人就是分不清c++和c++/cli之間的差別。。。不過這個真怪微軟,搞c++/cli這麼廢的東西。。

  vs2010對c++标準的支援是最好的,沒有之一,具體請自行google

  @gussing

  我确實沒仔細看,我也知道不去理會那個自動模闆可以寫純C++,可能我真的是在FUD吧,不過我沒太理會編譯出來的代碼到底是CLI還是Native Code。不過, VS2010确實在某些方面和GCC4解釋的不太一樣,我記得在聲明會抛異常的函數時,是否需要列舉異常這個方面,兩個編譯器有一個就會吐警告,另一個不會,我當時懶得再去翻看标準文檔裡是怎麼叙述這一段了。VS2010就用了一下,印象是對C++文法進行了擴充,還提供了很多替代标準庫的東西進去,我記得很多年前Windows号稱posix标準完全相容,那個時候我水準差,怎麼也沒能順利的使用posix标準庫,最後程式與系統打交道的部分全使用的是Windwos API。還是那句話,不論是什麼,微軟一定會通過再發明一遍輪子的方法盡量讓你寫微軟工具粘合的東西。

  小魚仔:

  (╯▽╰)╭,.NET平台不夠好嗎?為什麼這年頭總有些人明明很簡單的東西(用C#實作)要用那些很複雜而且效率低下的語言或工具去實作呢?顯拽嗎?同為做一個項目,我用.NET一個星期,你用彙編做了兩年,我會認為你很牛逼嗎?誰說.NET的程式員就菜,Microsoft Press的英文原版書你看過多少(像《CLR via C#》),研究過多少進階程式設計?技術沒有好壞之分,隻有适不适合之分。每一種技術都有它最擅長發揮重要的地方,你沒看到人家卓越網那麼大的也是aspx堆出來的代碼,可咱們學校的教務網站也是ASP.NET寫的,但是超過一千人網上選課就崩潰了!那些做網站的老師還在抱怨C#太爛,還沒有某某...好呢?那你用記事本寫HTML去堆吧,我會覺得你真的很牛逼!你何不說我就在一台裸機上連續按0和1,一個上午一個作業系統就出來了,那你更牛逼了!學.NET沒有錯,它本身就是一把鋒利的刀,不要再去像其它語言一樣去磨了,但是你不能因為它已經夠鋒利了而放低對自己的要求,隻滿足于拖拖控件,那才是真正的讓人鄙視。真正的.NET龐大着呢。

  Ivony...:

引用EricZhang(T2噬菌體):“呵呵,說起來還是 Windows程式員和*nix程式員在思考問題方式上的不同。您作為Windows程式員,習慣使用大而全的東西。而*nix程式員習慣把小而靈巧的東西組合起來使用,例如您說到的版本控制,vim本身當然不會有,因為vim對*nix程式員來說就是編輯器,版本控制我們有svn和git啊,我們也可以通過配置(vim或emacs的可配置性和可擴充性超乎你的想象)将snv或git更友善地內建到vim中。至于代碼格式化,VS給你提供了有限的功能,而vim或emacs提供了無限的可能,隻要有需要,自己寫擴充腳本就行了,例如你在emacs下輸入“M-x sort lines”看看效果。至于您提到的智能提示啥的在vim中更是小菜一碟,插件遍地飛。”

  LZ再一次的把程式員人為的劃分陣營,這個習慣不好,必須指出。

  那麼來讨論問題。

  就說那個無聊的yyp,事實上VS也有很多插件,也能整個Zhuangbility插件來解決yyp的問題,那是不是VS也就成為神器了?

  開拓眼界是好的,不同平台的使用者習慣不同也是對的。但外國的月亮就是圓的這就不對了。

  順帶說yyp,一般一個标準的Windows使用者(我)是這樣做的:

  HomeShift + ↓ + Del + Ins + Ins。

  這不見得比yyp要繁瑣(事實上先要搞清楚自己在編輯狀态還是指令狀态和學習适應就要花掉一段時間),也不覺得會慢零點多少秒,其次,這個方法在VS、記事本、Word、或是現在這個部落格園的輸入框裡面都能用。請問那個神器要怎麼才能搞定?     

  huhuc:

  不要這麼急着發表自己看法,像yyp這樣的功能通過宏就可以實作,而且很多編輯器就自帶複制目前行功能,就算沒有,很多編輯器都可以寫插件的,就算還沒有,還可以像SQL Assistant那樣Hook視窗過程,或者通過發送Windows消息讀寫文本。設計模式這種書,千萬不要看,浮躁且膚淺。我買過一本2手,看了下目錄,和其它書一起論斤賣了。

  inhesoft:

  vim和vs不是一個級别的東西,不能相比,單純從編輯器的角度來看,vim是很好,個人感覺,vim并不太适合windows下程式設計,而是适合unix下程式設計,unix下程式設計,函數名都很短,一般推薦都用小寫,而windows下的.net和win32 api函數我都很長,還要分出大小寫,用起來就累了,各有各的長處。順帶說一句,vim的o相當與vs的下的shift+enter,不是有些同志說的ctrl+c。

  curer:

  你的本意是好的,但是在這篇文章中卻隐隐有把自己的觀點強加到所有.net開發者上。這種強盜邏輯是不是又掉入另一個盒子中了?每個人都有自己不同的經曆,把MS,Google大牛的例子生生的加在每個人身上合适麼?換句話,加在自己身上就肯定合适麼?呵呵,送T2一句話“求同存異”。 不管是大牛,還是菜鳥。都有我們值得學習的地方。和大牛對話能夠給出醍醐灌頂的暢快,和菜鳥對話則可以給我們發掘自己知識體系中的漏洞。和菜鳥對話,因為那是一種全新的角度。甚至在我看來比大牛對話更有收獲。因為不僅能夠收獲自己,還能和更多地人分享。

  你發現别人總是不能了解自己的意思,為什麼不反過來思考一些,這麼多人反對,是不是自己有不足?因為這篇文章的漏洞太多了,是不是應該抓緊機會重新回顧下?這種經驗類文章,本沒有對錯。隻是我們大部分都是典型的理科生,在隐隐的數學思維習慣支配下,你文章中隻要有漏洞,那麼你推出的結論就是大家不能接受的。更不說,這篇文章漏洞百出。

  可以準确的說,從這篇文章的本意來看,并不算是一篇有價值的。但是你卻可以反過來獲得更多的知識。想要成為大牛,關鍵是能不能包容别人的不同觀點,并從中吸收經驗。而不是消極的說“手賤,不該寫”這類消極的語言。呵呵,其實有這麼多人糾你的錯誤,自己反而應該感到幸福。真的,我已經很羨慕你了。

  fxs:

  作為一個已經使用4年的 Linux人,我之前一值是使用Ubuntu,在公司的時候,電腦也是裝的Ubuntu,裡面跑Virtualbox的xp做一些photoshop切圖的事情,後來煩Ubuntu不停更新,而且系統比較耗資源,換成debian一直用着。我用Linux不是為了裝B,而是習慣了,因為Xp經常中毒,而我又沒有錢買高配置的電腦,也忍受不了防毒軟體占據的資源,用了這麼久的Linux做過的PHP網站也很多了,并沒有像你說的那樣神乎其神,告訴你Linux其實一點都不好用,shell?這個玩意垃圾的要死,我這幾天寫個腳本來自動壓縮所有的js代碼,當然先是shell周遊js檔案,然後調用YUI的compressor,你以為shell多好用?連個子字元串查找功能都沒有,要剔除一些檔案,還得借助awk,不要鼓吹vim,我在伺服器上改東西必須用vim(難道指望用nano?),但是平常開發還是用Netbeans,别的不說,光是按Esc鍵都能讓你發火,因為早期的鍵盤是ESC鍵在現在的Tab鍵位置,是以很好按到,但現在你基本買不到這樣的鍵盤了。你鼓吹VIM,可見你并不熟練使用VIM。

  Linux/UNIX界的東西混亂的不是你能想像到的,我們公司伺服器有Debian, Freebsd, CentOS這三個系統,光是apache的配置檔案路徑,Freebsd, CentOS, Debian這三個系統都放置的不一樣,程式的安裝路徑更是亂七八糟,你真正整天跟這些個系統打交道,就能把你煩死。也隻有你不懂,或者隻懂個皮毛的時候,才會覺得Linux/UNIX有多麼高明,對于.NET不想多說,我之前寫過兩年的.NET,不喜歡那些懂點Linux/Unix的人在.NET界鼓吹Linux/Unix,并嘲笑.NET程式員,打魚的嘲笑種田的,實在是沒有什麼意思!

  你以為你懂那麼多語言術語就很牛了?程式員應該專一,而不是像你那樣博而不專,你跟我很像,你提到過的術語我都了解,還有很多你沒提到的我也了解,Haskell,Ocaml,你用過沒?Perl/Ruby/TCL腳本寫過沒?GTK+寫過沒?每半年學一種語言,到最後你就成了什麼都不會了,專一 一點吧!

  還有推薦你看一本書《UNIX痛恨者手冊》,UNIX界不是你想像中的那麼美好。

  省油的燈:

  先贊一個,這麼年輕就有如此見的,英雄出少年,了不起!每個人都困在盒子裡,是每個人思維的界限。不僅僅是自己建造的,也是企業文化和社會文化建造的。如果要批判的是一個群體,我認為關注國内程式員(其實C++程式員也是同樣的現狀)生存的土壤(哲學上又叫唯物史觀):粗制濫造的設計,高耦合度成為主流,低水準的重複開發。有的程式員周末都沒時間來看你的大作,還在加班做低水準的維護,這将耗盡他們的青春,你會不會覺得他們是閏土?試問這樣的土壤怎麼能生長出參天大樹(林)?當然,這樣的現狀背後有它的原因的原因(哲學上又叫第一因)。

  事實上,我覺得,如果你還有精力或是有不服輸的精神,更應該再寫一篇更加嚴謹的文章來解釋自己的想法。沒辦法,誰讓大家都是理科生呢。要知道我們可不是抱着看穿越小說的心态來看的。