今天在网络上搜到一篇关于程序员如何对待语言的文章。看完之后,感同身受。自从工作以来,参与了PS3,Xbox360,Wii,iPad等控制台游戏开发,也有相似的体会,却苦于文笔不佳,一直未能写出如此的笔录,实感惭愧。现在特转此文,已备今后继续学习体会之用。
来源:http://www.nowamagic.net/programlife/pl_OpenYourView.php
全文:
2011-02-24
不要困在自己建造的盒子里,写给.NET程序员。
我个人是反对使用".NET程序员"、"C++程序员"或"PHP程序员"这类简单粗暴的方式为程序员做划分的。但是客观确实存在一个现象, 就是很多程序员会为自己设置一个无形的界限,将自己与某种语言或平台硬绑定到一起,例如我这里所指的".NET程序员"。请注意这与"术业有专攻"是不同 概念的,有自己专攻的平台或领域这很正常,但是有很多人偏执地将自己与某个语言或平台紧紧捆绑,而忘记了自己首先是一名程序员,然后才使用某种语言,他们 偏执于平台并陶醉于自己建立的盒子里,而不愿主动去接触一些盒子外的事物,最终使得自己无法进步。
从我个人的观点看,本文中".NET程序员"是指具有如下特点的程序员群体:
有一个事实我想先和大家澄清一下,其实.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的水平也大幅提升了!