不要困在自己建造的盒子里——写给.NET程序员(附精彩评论)

此文章的主旨是希望过于专注.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?气死我了你!试试vimEmacs,体验一下用纯文本写程序,用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的水平也大幅提升了!

-----------------------------------------华丽的分割线-----------------------------------------

  【精彩评论】

  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平台写程序是另一回事。

  Jeffrey Zhao:

  @午后的小睡
  说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的都没看到。一个大型应用一旦运用起来,再去迁移基础平台本身而是蛋疼。

  Jeffrey Zhao:

  @午后的小睡

  嗯嗯,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做,您是在炫技术么?

  不说别的,今天我还真听说了公司里某个项目是这个情况,嘿嘿。

  ocean:

  用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++程序员也是同样的现状)生存的土壤(哲学上又叫唯物史观):粗制滥造的设计,高耦合度成为主流,低水平的重复开发。有的程序员周末都没时间来看你的大作,还在加班做低水平的维护,这将耗尽他们的青春,你会不会觉得他们是闰土?试问这样的土壤怎么能生长出参天大树(林)?当然,这样的现状背后有它的原因的原因(哲学上又叫第一因)。

  curer:

  事实上,我觉得,如果你还有精力或是有不服输的精神,更应该再写一篇更加严谨的文章来解释自己的想法。没办法,谁让大家都是理科生呢。要知道我们可不是抱着看穿越小说的心态来看的。

上一篇:案例酷 | 云栖小镇: 如何解决城市停车“老大难”?


下一篇:微软允许欧洲*检查其软件的源代码