`
dvbrn65v
  • 浏览: 13947 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

不要困在自己建造的盒子里――写给.net程序员

 
阅读更多

不要困在自己建造的盒子里――写给.net程序员
2011年02月26日
  此文章的主旨是希望过于专注.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的程序员可能是悲剧,但从没脱离过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的水平也大幅提升了!
  【精彩评论】
  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开关,这也是对标准的篡改,也没好到哪儿去。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics