`

不要困在自己建造的盒子里

阅读更多

此文章的主旨是希望过于专注.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的水平也大幅提升了!

57
28
分享到:
评论
14 楼 tobewithwind 2011-03-25  
还是那句话,语言跟框架只是表达思想的方式,关键的还是思想.
所以楼主跟现在的我想法是一个方向的.
以前的我也只是向一门心思的学好语法.那都是外表....还好现在顿悟了..
13 楼 EldonReturn 2011-03-11  
lz啊,你得先解决自己的温饱问题再说。
12 楼 Dping 2011-03-07  
楼主分析的是楼主的思想,如果你全盘接收你就会变成第二个楼主,要有自己的思想才是关键。
11 楼 hastune 2011-03-07  
这样说也有点过了.

有时候天天写程序累得要死.哪会有那么多事哦
10 楼 javaliver 2011-03-03  
敢问下 。楼主以前方向是.Net 吧  。要说实话的 
9 楼 xieye 2011-03-02  
我的想法和作者不同,对于能力强的人来说,拓展思路是合适的,对于能力不强的人来说,把一件事做好更合适。
8 楼 sunsmooth 2011-02-28  
是呀,不仅是.Net,Java,包括Ror,Php等程序员,都应该有上面的所讲的突破自己的勇气。
7 楼 limcosln1andx 2011-02-26  
我总是很自豪的称自己是java程序员
下半年我打算自称java高级工程师
明年我打算称自己是java架构师
以后,我希望介绍自己是java艺术家,java诗人,java哲学家。
6 楼 cw550284 2011-02-25  
KimHo 写道
楼主说的那些人,基本是发论文,搞研究的(国内)
其实,真正的程序员,的确应该如文中所述

为什么生存,有时候是要放弃自己的想法
5 楼 KimHo 2011-02-25  
楼主说的那些人,基本是发论文,搞研究的(国内)
其实,真正的程序员,的确应该如文中所述
4 楼 422759366 2011-02-25  
个人意见:
这是你的学习方式, 拓宽视野,脱离IDE去了解底层的实现,了解更多的编程哲学。 现在的人爱XX 不要把自己的看法说的像真理一样。 其实你这种效率很低下···
3 楼 liuqiaolqa 2011-02-25  
很震撼,谢谢了,楼主
2 楼 kuchaguangjie 2011-02-25  
说得太好了,
绝对不仅是 .net 程序员,java 里无数的框架同样也让无数java程序员困在堆代码的圈子里,

:idea:  学习了 ~~~ 
1 楼 leogao_emcom 2011-02-25  
偶很认同你的观点!!

相关推荐

    盒子结构多层住宅楼工程施工组织设计方案-土木工程建造设计.zip

    《盒子结构多层住宅楼工程施工组织设计方案》是一个深入探讨土木工程建造设计的重要文档,它涵盖了从项目规划到施工实施的全过程。这份方案是针对盒子结构的多层住宅楼,这种结构在现代建筑中广泛应用,因其高效的...

    设计模式——建造者模式

    总之,建造者模式是一种强大的工具,它帮助我们在面对复杂对象构建时保持代码的清晰性和可维护性。通过分离对象的构建过程,我们可以更方便地控制构建逻辑,同时支持未来的扩展。在Java开发中,理解和应用建造者模式...

    建造者模式c++实现

    在C++中实现建造者模式,我们可以遵循以下步骤: 首先,我们需要定义一个抽象建造者(Builder)类,它声明了一系列创建产品部分的接口。这个抽象类通常不包含具体构建逻辑,而是作为子类实现的模板。例如: ```cpp...

    设计模式之建造者模式代码示例

    在Java编程中,建造者模式通常包括四个主要角色: 1. **产品类(Product)**:这是要创建的对象,通常具有多个属性,如复杂的对象结构。 2. **具体产品类(Concrete Product)**:实现产品类接口或抽象类的具体产品...

    c++ 建造者模式实例

    但是如果HR给他一张白纸,然后口头告诉他应该填什么什么,让他自己在白纸上 一项项的填上,这样就很容易出问题,首先他可能记不全所有的内容,其次填写的规范很难统一。再输入电脑肯定就是错误的数据。 所以HR应该...

    2015届高考语文人生哲理篇写作素材自己建造的房子

    这个故事寓意着我们对待生活的态度和投入,就像木匠建造房子一样,如果我们不用心去“建造”自己的生活,最终可能会困在自己制造的“粗糙房子”里。 这个故事向我们揭示了几个重要的知识点: 1. **生活态度决定...

    设计模式-建造者模式

    - 封装性:建造过程被封装在建造者类中,客户端只需要知道如何组合建造者,而不需要关心具体的构建过程。 - 可扩展性:添加新的产品类型或建造过程只需要增加新的具体建造者,原有代码无需修改,符合开闭原则。 - ...

    建造者模式实例

    文件`BuilderPattern1`和`BuilderPattern`可能是示例代码或者进一步的解释,它们可能包含一个完整的建造者模式实现,包括产品类、抽象建造者、具体建造者和导演类的代码,以及如何在客户端使用这些类的例子。...

    建造模式(代码)

    在"建造模式(代码)"的项目中,我们可以期待看到一个典型的建造者模式的实现。这个项目可能包含以下几个部分: 1. **产品类(Product)**:这是要构建的对象,通常具有多个组成部分或属性。在代码中,可能会有一个类...

    盒子结构多层住宅楼工程施工组织设计-土木工程建造设计.zip

    《盒子结构多层住宅楼工程施工组织设计》是一个深入探讨土木工程建造设计的文档,它主要涵盖了在实际建设过程中如何高效、科学地进行施工规划和管理。这份文档是针对建筑行业的专业人士,特别是对于高等教育阶段的...

    Java建造者模式源码

    Java建造者模式是一种设计模式,属于创建型模式,它的主要目的是通过隔离对象的构建过程和其表示,使得构造复杂对象的过程更加...无论是标准的建造者模式还是在实际项目中的变体,都能在创建复杂对象时发挥重要作用。

    设计模式之建造者模式

    在分析和设计阶段,合理地运用建造者模式可以避免在后期修改时对代码造成大面积的影响,从而降低维护成本。 在提供的压缩包文件“jianzaozhemoshi”中,可能包含了关于建造者模式的实例代码、讲解文档或者是相关的...

    原创:设计模式之建造者模式生动实例

    在Java编程中,这种模式经常用于生成对象,特别是当对象的创建过程较为复杂时,建造者模式能够提供一种更加灵活的方式来构造对象。 首先,我们来看一下建造者模式的基本结构。它通常包含四个角色:产品角色...

    java 建造者模式代码

    - 在 `Director` 类中,调用建造者的构建方法,按顺序组织构建过程,而不直接与产品交互。 - 客户端通过调用 `Director` 的方法,指定建造者并获取构建好的产品。 5. **优点**: - 封装性好,建造过程和表示分离...

    建造者模式.pptx

    ### 建造者模式详解 #### 模式介绍 建造者模式(Builder Pattern)是设计模式中的一种,主要用于创建复杂对象。此模式的核心在于将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。简单...

    建造者模式(java)

    建造者模式(Builder Pattern)是设计模式中的一种结构型模式,它在Java中广泛应用,用于创建复杂的对象。这种模式的主要思想是将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示形式。这...

    java 建造者模式

    在Java中,建造者模式通常包含以下几个角色: 1. **产品角色(Product)**:这是被构建的复杂对象,包含了多个部分或属性。 2. **建造者角色(Builder)**:定义了产品的构建接口,规定了构建各个部分的顺序,并负责...

    建造者模式

    建造者模式是一种设计模式,属于创建型模式,它在软件工程中被广泛应用,尤其是在复杂的对象构建过程中。在安卓项目中,使用Java语言实现建造者模式,可以极大地提高代码的可读性和可维护性,同时也方便对对象的构建...

    温室建造技术规范

    在建造日光温室时,需要严格按照上述规范执行,从场地的选择到墙体的建造,再到结构的细节处理,都有一系列的技术参数和施工要求。这些规定有助于确保温室能够达到预期的性能指标,如温室内的温度和光照条件,并保证...

    C#设计模式之建造者模式

    产品类通常包含多个组成部分,这些部分可以在建造过程中逐步添加。 2. **建造者接口(Builder)**: 定义了构建产品的抽象接口,比如`ActorBuilder`,它规定了如何构建产品的各个部分,但不直接创建产品对象。 3. *...

Global site tag (gtag.js) - Google Analytics