我虽然是个.NET程序员,也略懂Java,但本文我会尽可能的写得中立些,这篇文章是写给我的一位朋友看的,前两天吃饭他问起是否要转Java(以前他们一直是.NET),当时呢我的观点并不中立,我说了很多.NET的好话(当然我是摆了不少事实的,我朋友也不是这么好忽悠的),但技术人员应该拿数据说话不是吗?其实这个话题是个非常老的话题,很多技术中层也回答过类似的问题,可能这些问题来自从高层、朋友或者网络,但我并没有看到过一篇很中肯的帖子来分析这个问题,于是我斗胆决定给大家开个头。
首先,引用一份Forrester Research公司的数据(虽然数据比较早),在2004年,Java在生产工具、电信、金融和保险领域比.NET强,而.NET在制造、零售批发、媒体、商业服务和公共服务领域比Java强。报告指出那些在IT方面有高预算的公司更倾向于使用Java,而相对预算较少的则更倾向于使用.NET。但很有意思的一件事情是超过半数的受访公司同时使用.NET和Java,要知道2004年的时候.net 2.0刚出来,就已经有这么多公司同时用两样了,我觉得现在的情况也没有明显变化,比如我现在的公司就是两样都用,当然一个团队通常只用一样,只是不同的团队可能会用不同的语言。
接着来说说跨平台。说到跨平台很多人可能想都不想就说,那肯定应该选Java,我一开始也是这么想的。其实时代在进步,.NET的跨平台能力正在不断增强,最有代表性的自然是Mono开源项目,相应的开发工具MonoDevelop也做的很出色。当然Mono的使用是存在局限性的,很多Windows固有的特性是没有办法使用的,例如COM, Win32 API等,但同时Mono提供很多上层封装,能够帮助我们忽略平台差异。就目前来看,Java在跨平台方面肯定是占优势的。
接着是性能比较。说实话如果我在这里给任何一方的语言下一个结论,估计双方的技术人员都要跳起来。性能这个问题在两种语言之间是很难进行比较的,理由很简单,因为平台不同、硬件不同、安装的软件也不同、使用的库也不同,太多的不确定因素导致无法在完全平等的条件下比较单个项目的性能。也许某个性能问题并非语言本身造成的,而是库函数造成的,这都是有可能的。我参考了一些评论认为,.NET程序的启动速度快于Java程序,这应该是有目共睹的,看看Ecllipse和VS的启动速度大家就明白了(虽然VS2010启动速度确实坑爹了点,还好VS2012打了个漂亮的翻身仗)。我个人感觉Java程序的运行速度确实不快,其实你看看很多大公司怎么玩Java的就知道了,他们拿Java做壳,内部全部用C++写,比如Oracle、IBM,要知道Java和C++的组合可是非常有名的。不过么回过头来想想微软也是如此,.NET主要做周边的应用,Windows核心还是C/C++的,不过最近几年微软也开始用.NET做很核心的东西,比如Visual Studio2010和2012就是用WPF 4.0写的。不过这个问题,没有结论,大家自己看着办吧,遇到这种没有标准的问题,适当忽悠也是必要的,其实能反驳.NET或Java性能不好的案例都很多,具体看场景。拿我的亲身经历来说,.NET的XML库的性能真的不是一般的差,相对来说Java的XmlBean更胜一筹。
再接下来,我们来看一下扩展性。这两种平台扩展性都很好,上层封装都支持最新的SOAP协议和Web service,自身还有自己的通讯协议,如Remoting和RMI。这恐怕是少数几个大家都能达成共识的观点,即Java和.NET扩展性都很好。双方阵营都有优秀的架构师们坐镇,确保了开发人员能够从架构层面对语言和平台进行扩展。只可惜国内现在.NET阵营的架构师不太给力,导致很多决策层放弃选择.NET(各位国内的.NET架构师听了不要不开心哦,我只是说事实,没有别的意思)。国外其实.NET和Java各分秋色吧,因为就语言本身的扩展性而言实在找不出有什么明显限制,关键还是看用它来干什么,还有就是架构怎么搭建。
然后是开放性,这一点恐怕.NET要完败于Java了,尽管近几年微软加大了对开源的支持力度,例如codeplex网站就搞得很红火,且通过与DeveloperMedia合作给开发人员带来了不少广告收入,但问题还是出在微软本身的开放性上,自家的.NET全部闭源,只有ASP.NET MVC开源。尽管Mono团队已经基本上可以说成功复制了.NET,但很多东西是从盒子外分析得出的,当然这是我的个人观点。Java的开放性不仅体现在其语言开源本身,更多的是来自第三方的支持力度,大量开源项目的支持,例如Apache基金会的顶级项目,如poi.apache.org,使得更多的公司愿意使用java开发,因为扩展成本可能要比.NET低不少,不需要万事亲历亲为。
最后,我们来看一下总体拥有成本(Total Cost of Ownership)。说实话,这是个很难回答和界定的问题,因为完全没有标准,有些公司更看重雇佣成本,有些则更看重设备成本或培训成本。来自stackoverflow评论中的一个观点认为Java的初期拥有成本相对于.NET要低,因为有大量的开源项目和工具可以帮助降低开发成本。.NET的产品前期都需要自行开发很多基础库,因为开源项目和第三方工具相对较少,这是.NET初期拥有成本高的原因。.NET的开发速度确实比Java快很多,特别是前期出样阶段,这得益于微软强大而简单的IDE,说句不好听的,就算不懂技术的项目经理也能自己用VS画个界面出来,你信吗?雇佣成本方面,随着C#的排名不断上升,.NET的雇佣成本会不断降低(其实原来就低,因为大部分使用.NET的公司不算特别有钱,除了微软),语言排名是个风向标,排名高的语言会得到高校的青睐,从而会有更多人才专向该语言,最典型的例子就是Pascal的排名,你看当年学校里Pascal多流行,现在排名里根本看不到,高校自然也放弃了。设备成本目前来看基本差不多,毕竟是语言,不是特别依赖硬件设备的。当然有人觉得Windows+SQL Server的组合授权费很高,这个也是不真的事实,这也是我朋友想换Java的原因之一,为了降低成本,也许你应该考虑用NoSQL或者MySQL作为备份方案,要知道高性能方案可都不是SQL Server和Oracle这种关系数据库搞出来的,你看看淘宝和新浪的架构就知道了。
最后给大家娱乐娱乐,这是一段搞笑的来自Java阵营的视频,结论么大家懂的,肯定是选Java,http://www.220.ro/funny/Microsoft-Vs-Java/Iw8nmDHL7Y/(需翻墙),注意2分43秒有亮点哦。
这篇文章只是个引子,欢迎更多的.NET和Java社区成员加入到讨论中,适当的争论和探讨是必要的,这样技术社区才能进步。
原文链接:http://www.cnblogs.com/tonyqus/archive/2013/01/15/java_vs_dotnet.html