作者:亚历山大同志 来源:博客园   酷勤网收集 2008-09-09

摘要
  个人多年来在使用.NET的时候的积怨,其实我到现在为止都挺厌恶微软给.NET设计的API,太恶心,尤其是Drawing下边的哪些API流露出浓重的MFC的味道。而且异常处理的机制也异常的混乱

写此文纯粹为了回复《.NET不死,为什么企业招聘都要java?》 一文。从01年以来,.NET从最初的2000beta2一路凯歌猛进到了2008,Framework从1.0一下子跃进到了3.5,从3.5以来 wpf,wcf,wwf,Linq,ASP.NET MVC,我们的感觉是.NET很好很强大,什么都有。但是.NET的程序员怎么就越来越不值钱了呢?很简单的对比,在我原来所在的一个公司里,有java的项目也有.NET的项目,做Java的程序员待遇普遍比做.NET的高出一大截。就程序员本质来说其实并没有多大的区别,那么问题就只能在.NET本身上头来找,所以就有了本文:Why .NET Sucks?

第一,一种技术是否值钱,首先取决与市场价值,当然对于C#或者Java这类应用领域非常一致的商用语言来说,其实越难学的也就是工资越高的。越难学的工资越高这句话绝对是话糙理不糙。难学说明了人力成本中的培训成本会比较高,所以这类技术人员的工资确实就要高一些。那么.NET的超级工具,让我们开发起来超级方便的超级工具:VS.NET其实就是制约我们工资提升的最大障碍,老板会理直气壮的告诉你,会用VS.NET拖拖拉拉就能开发的程序员量产起来快得很,就这点工资你不老实干就开掉你换一个,你后头还有好几个找不到工作的.NET程序员供我选呢。

其二,.NET提供给我们的发展空间太狭窄了(或许是我眼光太狭窄),罗列一下之前我提到过的:wpf,wcf,wwf,Linq,ASP.NET MVC,微软把什么都做了,留给我们的除了傻乎乎的拿起linq,wcf,wwf去吭叱吭叱的码格子堆代码,还剩下些什么呢?架构设计?那是少数人的事情毕竟也轮不到程序员。做业务分析?那也是少数派报告。不可能一个项目从头开始全部手写代码吧?这样是不是活回去了?java程序员从Struts到Spring到Hibernate可谓武装到了牙齿。整套下来还不要钱,觉得Hibernate不合适还可以换ibatis,apache下头一大队候补的佳丽,可谓是后宫佳丽3千,试问.NET又能够靠什么让六宫粉黛无颜色呢?前有JAVA的堵截,后头还有ROR,Python,PHP,一大群追兵,从标榜自己开发起来不是一般得快的ROR(不知道沉得是否也快),到标榜自己跑起来飞快的Python(豆瓣的神话造就了Python的急速传说),还有标榜自己光膀子不怕穿鞋,完全免费的PHP。再换句话说,我们就坚定不移的跟着微软走吧,那么除了拿着VS.NET做网站,我们还剩下了些什么事情做呢,那就怪不得人家招JAVA的人多了,用JAVA做工作流中间件的可以卖钱,你用.NET试试,人家直接跟你说我们用WWF了,还用花钱用你的?做个ORM,MVC框架能卖钱?到处都是免费的,微软自带的,绝对没有任何一个开发企业会为了ORM还是MVC什么的花一分钱,要用都用开源的,所谓微软这种大包大揽的行为极大的打击了开源团队的积极性,MonoRails还没说要收钱呢,微软就忙不迭的搞了个自己的MVC框架出来。看着Java下第三方厂商的中间件热火朝天的时候,还真不知道我们应该在.NET下做点什么能卖钱的。

其三是我个人多年来在使用.NET的时候的积怨,其实我到现在为止都挺厌恶微软给.NET设计的API,太恶心,尤其是Drawing下边的哪些API流露出浓重的MFC的味道。而且异常处理的机制也异常的混乱,既然有了异常处理的机制就用异常来解决问题嘛,结果有的通过返回bool来提示错误,有的通过错误标示的参数来返回错误,异常也没有声明的机制,结果很多时候在使用一些类的时候根本不知道有哪些异常需要处理,很多新手就很笼统的给个Exception了事,那么这个异常处理的机制还有什么用呢?习惯了JAVA的声明式异常之后会很迷惑于这种模糊的方式。

还有一个很搞笑的地方就是异常的抛出:throw ex,throw,throw new XXException("error",ex);一个会中断异常的堆栈,一个不会另一个也不会,这不是多此一举么,简直就是茴香豆的回有四种写法。直接让throw ex不会中断异常堆栈就行了何必还要多此一举呢?

-------------------------------------------------------原文------------------------------------------------------------------------------------

还有一个很搞笑的地方是,你在捕获到一个异常的时候还不能直接把它抛出去,还要new一个异常,把捕获到的异常作为InnerException包裹一次后才能抛出去,不然在调试的时候就跟踪不到真正出现错误的地方而是在直接抛出的那个地方中断了。

-----------------------------------------------------------------------------------------------------------------------------------------------

都到了3.5了都还没有提供对DynamicProxy的支持,结果现在.NET下的AOP看起来都还是那么怪异,实现起来也麻烦。

其实发了很多牢骚,说.NET Sucks也不过是气话,我们无法否认.NET是一个伟大的开发平台,无法否认微软是一个伟大的公司,不过.NEt再伟大,得到利益的始终是微软而不是广大的开发人员而已。

评论也精彩:

#1楼  2008-09-08 23:38 Cat Chen      

先回一句──你对.NET理解非常有限,使用错误的观点不足以支撑你的论点。

#2楼  2008-09-08 23:40 5207      

有道理,微软的。NET确实是个高生产力的东西,但是正是生产工具先进了,人的作用就简单了,现在50%的程序员是和工厂里的普工一样,而且现在软件公司对技术部门划的很简单就是生产,业务都是从市场部门或者咨询部门过来,研发部门没有业务深度的人员,也就难有业务精度的东西出来。

相比技术,其实任何一个软件产品其业务是才是灵魂,业务是技术不可能替代的。就如同C这个语言,难道几十年前的东西如今无生命力?C#都四个+了,呵呵,还是不及C语言,关键还是如何用好吧,毕竟本质没有变化!

#3楼  2008-09-08 23:41 Cat Chen      

你捕捉了Exception之后,不能直接throw出去,是因为你不知道几种throw写法的差别。你知道throw ex;和throw;的区别吗?throw ex;就是你所说的情况,把捕捉到的ex重新抛出,会破坏掉ex调用堆栈。但是throw;不会,这种写法让ex在保持调用堆栈的情况下继续冒泡。

是你不懂,而非.NET不行。是你能不能拿高薪,而非.NET能不能让你拿高薪。

#4楼  2008-09-08 23:43 Cat Chen      

另外,从你说话的态度看来,好像你觉得ASP.NET MVC是个收费的框架,既然有免费的就不会有人选择收费的。你连它是免费的都不知道,就不要去无理攻击它了。

#5楼  2008-09-08 23:45 Kai.Ma      

比较同意Cat Chen的观点。

#6楼 [楼主] 2008-09-08 23:47 亚历山大同志      

@Cat Chen
没说过ASP.NET MVC是收费的。
throw这个例子确实考虑欠周,但是缺乏对异常的声明和.NET api中对异常处理的混乱来说是确实存在的问题

#7楼  2008-09-08 23:55 Clingingboy      

只怪.net阵营还不够强大,学.net和学java的路不同,不得不承认java的程序员普遍比.net的素质高些一层,这是微软推广的战略所决定的,讨论这个问题的应该都不是初学者.我们还是从自身找问题吧.提高自己才是正道.

#8楼  2008-09-08 23:57 Clingingboy      

其实java开源给你太多的选择有时候反而不好

#9楼 [楼主] 2008-09-09 00:01 亚历山大同志      

@Cat Chen
看待问题的角度不一样也没有必要起争执,我的主题是.NET为什么让程序员越来越不值钱。我关注的是程序员个人价值的体现而不是一个技术是否优秀,没有充分的理由认为java就比.NET优秀多少,但是java这个到处是后妈的娃儿确实让程序员得到了比.NET这个有个强势的妈咪的娃儿,这已经充分证明了我的观点。某些技术细节的问题并不影响我的观点。同时感谢你帮我指出本文一个技术细节上的欠妥之处。

#10楼  2008-09-09 00:25 Kevin-moon      

高薪 取决与你的能力,而不是一门语言,
MS把编程变成简单,我觉得很好,这样提高开发速度.但是如果你只停留在运用上的话,可能最后就只剩下抱怨MS了.对于工具,先运用然后了解,最后掌握其思想.
对于初级的NET程序员来说,的确存在楼主说的问题,但也就只限制在这个级别上而已

#11楼  2008-09-09 00:30 Cat Chen      

@亚历山大同志
.NET不是让程序员不值钱,是让食物链底层的程序员不值钱,但是任何处于食物链底层的生物都不值钱!

Microsoft为什么赚钱?它不用.NET?为什么它用.NET写的VS2008能够卖那么贵?为什么它的VS2008团队能够领那样的工资,而一般的vendor不行?因为它处于食物链的顶端,这才是问题的本质。

所谓的食物链,就是谁需要花自己的钱来使用别人的工作成果。做.NET控件、组件、平台的公司,虽然给Microsoft吃,但同时也吃更小的vendor,所以一样赚不少的钱,这个你写文章时就没考虑进去吧?你考虑的就是消费别人做好的控件的那种底层生物,这有什么好说的,没办法顺着食物链往上爬,就肯定被别人吃,这跟语言和框架没有关系。

Java只是回避了食物链这么底层的一个分支,不估计这么小的vendor,希望vendor都是有一定体积的,这些vendor不是面向个人终端做零售产品的,而是面向企业的,要吃也要吃其它的企业,当然不能直接比较。

#12楼  2008-09-09 00:48 Anders Cui      

虽然.NET不是薪酬低的直接原因
却不能回避平均工资比Java低的事实

本文来自:http://www.cnblogs.com/Alexander-Lee/archive/2008/09/08/1287168.html

分类: .NET技术 Windows技术

上一篇:.NET不死,为什么企业招聘都要java?   下一篇:.NET 3.5 SP1的部分源代码