针对firelong在前贴《C与C++社区混战,C#会重蹈覆辙吗?》http://www.cnblogs.com/firelong/archive/2010/06/20/1761357.html 中发布的博文,评论者众。似乎触动了.NET社区每个人的奶酪——我那么喜欢C#的那些特性,firelong凭什么指责它们,大呼小叫的屎盆子便扣将过来。
Firelong既然写了帖子就有充分的技术原理依据,和工程实战依据。没有动谁奶酪的意思,只是善意提醒。也不会怕扣屎盆子。更不是为了博眼球,骗点击量——firelong儿子都四岁了,早过了穿奇装衣服、批黄头发吸引人注意的年龄了。
Firelong只想与大家好好讨论问题,事实上firelong是个C#多年的研究派和实战派,对C#的感情比大多数人更强。只是firelong已经嗅到了C#发展道路上的一股歪风邪气(新功能!新功能!再来一个新功能!cool,cool,很cool!)。殊不知,编程语言是来解决软件问题的,不是一个功能集合的show场——可惜国内绝大多数.NET程序员(特别是老赵们)对语言还停留在这个认识水平上。这正是国内.NET技术社区总体相对其他技术社区(比如C++社区,比如Java社区)显得比较弱智的原因。而所谓的社区精英(老赵们)又不好好研究软件问题,而是天天告诉大家这个新功能cool,那个新功能niu的来骗取眼球。你看看人家C++社区和Java社区,早跳出了把玩语言新特性的阶段了,而是注重研究真问题。firelong看不下去国内.NET技术社区继续这样沉沦下去。这正是firelong决定写博呐喊的原因。
好了,言归正传,firelong讨论技术会严格遵循“摆事实,讲原理”的guidline,不会意气用事。
Firelong首先来谈性能问题,这是C#语言在不断塞入新功能后所带来的最严重的问题。其他问题firelong也会在后续的帖子中一一道来。由于性能问题比较复杂,firelong首先在这篇帖子中先“摆事实”,然后在后续的帖子中“讲原理”,firelong相信这样会把问题说透彻。
下面开始摆事实。也就是C#性能不好的事实。而且一定要是较为全面的事实,而不是拿一两款软件来说事(我也希望其他论者不要拿一两款软件说事)。我们从目前世界或者中国存在的几大类常用软件(不常用的软件不在firelong性能评价之列,因为不具代表性)开始来谈谈事实。
一、客户端软件
请大家告诉我Windows平台上有哪个流行的客户端软件是C#做的?
微软自家客户端:word, access, excel, outlook,IE,powerpoint, msnmessager,mediaplayer, groove, onenote, project, security essentials……
国外软件客户端:firefox, google chrome, photoshop, dreamweaver, illustrator, autodesk,quicktime,safari, ultraedit, adobe reader, acdsee…….
国内客户端:qq及各个家族产品, 迅雷,360,flashget, Foxmail,暴风影音,金山词霸,优化大师,傲游,电驴,pplive,ppstream,阿里旺旺,飞信(以前用过C#开发,后来受不了改回C++了)……..
任何一个领域,大家能找出哪怕1-5款在全世界或中国流行的客户端软件是用C#写的吗??? 请反方同学回答该问题。
其实不止飞信,firelong好几个朋友在腾讯、金山等公司做研发工作,他们都仔细评估过C#做客户端的性能问题,最后得出来的结论无一不是放弃C#。特别搞的是其中有一个公司的首席架构师就是从微软总部挖过来的,大家都以为他最支持C#,没想到他否定C#否定的最厉害。
就连VS 2010(这个就算我们程序员自己的客户端吧)也是C/C++做的(别把用.net搞了一点界面就说VS是.net做的,vs用.net做的少的可怜的代码量可以从GAC这里C:\Windows\assembly看microsoft.visualstudio开头的部分来得出自己的结论)
至于Windows操作系统——这算最大的客户端了吧!我压根就没期望这辈子能看到它用.NET开发!参见李开复博客:http://blog.sina.com.cn/s/blog_475b3d560100h4il.html ,注意其中几句话:
1. “盖茨定位的Windows Vista的三大目标是:支持新语言C#,所有操作系统软件都改用C#来写。因为C#语言的运行较慢,但是开发速度很快,这样微软不会落后于多人参与的开源Linux操作系统的发展。”
2. “因为技术的瓶颈已经到了极限,很多总监看到这个设想就倒吸了几口凉气:“技术难度太高了!C#这么慢,怎么能做操作系统啊?数据库不够快啊?怎么可能当做档案系统?””
3. "经过了三年的奋力拼搏,微软视窗团队的工程师们都已经疲惫不堪。但是,Windows Vista的成功却似乎遥遥无期。其实灾难早就在酝酿,因为大家在一开始就知道,这个伟大的计划实现起来,其执行难度实在是太大了!"
目前,我所知道的使用.NET做的算个稍微有点规模、有点含量的客户端,也就是Expression Studio(微软自己用WPF开发的)——firelong孤陋寡闻,如果大家知道更多的,请指出。千万别拿codeplex里面的玩具软件说事!你看看那里的软件除了将程序员作为用户,有多少软件是为真实的用户写的?别说.NET出来得晚,很多软件还没来得及用.NET做。.NET从2000年开始推出,到今天已经10年了,能干的话早该干了!
我本以为Expression Studio微软会用什么C#性能提升秘籍来搞,提振大家对C#的性能信心,希望研究学习学习。但是我真正跑了几次就郁闷了,我估计它几年后的命运和Windows Vista差不多。
有人说只拿客户端软件说事,不公平。那么我们来拿网站(当今世界上对人类最重要的软件就是网站了,对吧!)说说。
二、互联网软件
大家可以到这里来看:http://www.alexa.com/topsites Alexa全球前500大的网站,请数一数其中除了微软自己的网站为了dogfood的广告外,有几个是.NET开发的?——何况即便是微软自己的网站,也只是部分地用了.NET。
或者不相信Alexa的话,到这里:http://www.google.com/adplanner/static/top1000/ 看看google对全球前1000名的网站排名中,数一数有几个是.NET开发的?
如果你懒得看Alex或者Google的排名。我在这里贴出一些典型的网站,大家看看:
google.com,facebook.com,youtube.com,yahoo.com,live.com,wikipedia.org,baidu.com,blogger.com,msn.com,qq.com,twitter.com,yahoo.co.jp,google.co.in ,taobao.com,google.de ,google.com.hk ,wordpress.com,sina.com.cn,amazon.com ,google.co.uk,ebay.com,bing.com,163.com,youku.com,sohu.com,tudou.com,sogou.com,hao123.com,tianya.cn,kaixin001.com,alibaba.com………
你可别说其中用了一个Silverlight插件,就说那个网站是.NET开发的!
有人又说了,你别光拿用户看得见,摸得着的软件说事啊,C#做了好多用户看不见的软件啊。那我们来看看用户看不见的软件中最关键的部分:服务器软件。
三、服务器软件
1. 微软自家服务器:biztalk, sharepoint, exchange, ISA, OCS, Sql server……
2. 其他厂商的:oracle, websphere, weblogic, mysql, Sybase, db2, aphache, vmware……
行了不用把省略号写下去了吧。国内厂商,对不起这块没什么牛叉的服务器。
写到这里,我的问题出来了:C#自2000年问世以来,在全世界或者全中国,到底搞出来了几个响当当的,能拿出手的,亿万用户喜闻乐见的软件了? 别说C#还年轻,10年在技术界算老人了! 我相信立即会有一大堆人怒吼:企业应用啊!这就对了,firelong给企业应用的解释就是“即便性能不咋样,客户也可以接受的软件叫企业应用!”
四、给老赵的问题
最后一个问题提给老赵,老赵不是最近去了盛大吗?仍然在写.NET吧?老赵可不可以告诉大家盛大的核心游戏平台上的软件(服务端、或者客户端都可)是.NET写的吗? 如果是,我佩服五体投地。
如果不是,老赵能否向盛大CTO建议采用.NET来写盛大的游戏平台(服务端、或者客户端都可)。老赵在其中用linq给排排序(多优雅啊!),用reflection给动态加载加载(多灵活啊!),用dynamic和其他软件互操作操作(多方便啊!),用attribute给类标记标记(多曼妙啊!),用jit编译器让盛大的游戏跨跨平台(多牛叉啊!)???????
希望老赵不要回避这个真正的问题,千万别说游戏平台是系统内核底层应用,所以没有用C#——人家safe360是系统内核底层级软件,游戏软件可不是,游戏软件是典型的高级软件,游戏场景里面一大堆一大堆的object,不是正符合老赵等.NET拥趸口口声声的高级抽象吗???
如果老赵在盛大写的不是游戏平台上的软件,那么firelong烦请老赵告诉.NET社区自己在盛大写的软件是什么?很senior很senior的企业应用吧:)。
最后结语
所有所有这些软件压根没有用C#,或者经过调研、或者经过实际部署应用,但最后都放弃了C#的原因是什么???性能!性能!性能!
去年在上海参加.NET技术大会碰见.NET技术的大佬Jeffrey Richter,在论坛阶段我问了Jeffrey Richter两个问题:“1. .NET性能什么时候才能提上来? 2. 微软为什么自己的绝大多数软件都不用.NET开发?” Jeffrey Richter回答“1. 我相信我有生之年能看到 2. 微软自己主要用C/C++,但是鼓励开发者使用C#”。
听到Jeffrey Richter这两个回答,firelong当时有两个感想:
1. Jeffrey Richter看上去还很年轻,有生之年是1万年吗,兄弟们等得起吗(技术行业10年光景相当于1万年!不知道要埋葬多少技术!)
2. 微软真伟大,难的都留给自己,容易的都留给开发者,真伟大啊真伟大!
我想写到这里,大家应该理解我第一个帖子的缘由了。
醒醒吧,朋友们,别再在老赵们编织的“新功能!新功能!再来一个新功能!cool,cool,很cool!”的童话中写代码了,真正牛叉的编程语言就要编写出像IE、adobe reader,facebook,QQ这样亿万人使用的牛叉的软件出来!
如果你说用C#开发你们公司一个小asp.net网站,或者几百人使用的什么企业应用(firelong太讨厌企业应用这个词了,不就是读读数据库吗,搞那么神乎其神干嘛!),你说.NET性能很好,那我没话说。
但是,你要开发成千上百万,甚至几亿、几十亿用户都使用的软件、网站、或者服务器、中间件,你还坚持使用C#开发,除非你自己做老板!不过请记住:Larry Page,Sergey Brin,Mark Zuckerberg,JeffBezos ,Jack Dorsey、李彦宏,马云,马化腾,丁磊不会比你傻。
好了,Firelong本帖已经摆完了事实。请大家也先摆事实开始来PK。在PK之前希望大家遵循前贴:技术社区辩论的Guidlines & Patterns之倡议(http://www.cnblogs.com/firelong/archive/2010/06/21/1762054.html)。
下一帖firelong将“讲原理”,即解释C#性能为什么这么慢(也就是firelong最开始的帖子希望C#砍掉的那些语言构造存在什么样的性能问题)——firelong在项目中研究这些个问题2年多了,性能优化技巧也用了很多了,将在下帖中一一列出。
firelong已经酝酿好了,只待这个帖子供大家pk充分后再下笔。Firelong应该会在1星期内再写下一帖:C#会重蹈覆辙吗?系列之2:论C#性能问题之原理。
下面是firelong大作:
C与C++社区混战,C#会重蹈覆辙吗?
最近,Linux之父Linus Torvalds在事隔三年之后,又一次炮轰C++语言(见http://www.realworldtech.com/forums/index.cfm?action=detail&id=110563&threadid=110549&roomid=2 )。在国外技术社区掀起新一波的批判C++语言的狂潮。国内技术社区也不甘清净,csdn在这里(http://news.csdn.net/a/20100612/218785.html)也有非常热烈的讨论。国内C++的大牛网易的云风也加入论战(http://blog.codingnow.com/2009/01/the_new_c_standard.html)。
总结目前各方对C++的批判,主要观点如下:
1. 做系统底层编程(比如linux内核、网易游戏引擎),C++和C相比没有任何优势。因为底层编程不需要C++那么多的“面向对象抽象”
2. 做上层应用编程(比如CRM、ERP等企业应用),虽然需要“面向对象的抽象能力”,但C++过多的语言机制导致C++语言陷阱太多(特别是稍不留神就有内存泄漏),因此应该选用提供垃圾收集机制的语言。(Linus没说,但是基本指的是C#、Java几个主流语言)。
虽然这种说法有些太过绝对,但是firelong认为还是相当有道理的。特别是第2点,因为以前我们公司就有一个C++写得CRM项目,刚开始老板还让我们在C++上继续改,改了将近半年,全体人员都决定放弃了,转到现在的C#上。Linus这种观点出来后,C#社区好像很受鼓舞,我甚至在某个论坛上看到一些C#程序员在欢呼C#万岁了。但是firelong的问题是,C#语言真的完美了吗?仔细思考这个问题后,firelong认为并非如此。事实上C#语言现在一路狂奔,有点重蹈当年C++语言发展的覆辙。firelong将不成熟的思考写出来,与大家共同讨论。
firelong认为C#目前可能重蹈C++语言覆辙。微软从2002年C# 1.0开始,到2010年8年时间推到C# 4.0,平均每2年一个新版本。其中属于重大的语言特性有:泛型、Lambda表达式与linq、dynamic动态特性、并发编程。除了重大语言特性外,还有很多很多技巧语法。微软这样一路狂奔,只要是想出来的cool点子,都往C#语言里面加。 很多程序员也很追求cool的效果,瞧瞧看,我们C#语言又有XXXXXXXXX功能,你们Java、Python XXXXX有吗?
但问题是“新特性越多,语言就一定越强大吗?”,我们真的需要那么多cool特性的编程语言C#吗?
C++语言走到今天的墙途末路,众人踩踏的地步,跟C++语言过于臃肿的功能特性密切相关。 firelong这些年的编程经验表明,语言新特性对语言并非一本万利,而是可能会带来很多伤害:
1. 新特性加重了编译器的编译负担,编译效率低下。大家试试很多linq项目的编译速度就知道了。
2. 新特性加重了运行时的运行负担,运行效率低下,大家试试很多dynamic动态新特性的运行效率就知道了。
3. 新特性加重了程序员的心智负担,在写代码时必须考虑很多功能背后的影响,“顾前思后”就是C++程序员最后抛弃C++的一个很大的原因。大家回想一下现在在VS2010底下写C# 4.0程序,还有当初写C# 1.0程序的流畅性了吗?
有的朋友可能会说,那是firelong水平低,对这些新特性没有掌握好,所以要批判C#新特性。首先firelong水平不一定低(带一个10人的C#队伍已经近2年)。其次水平再高,也有心智负担。看看Linux之父Linus Torvalds和网易的云风等诸多国内外大牛批判,他们可都是响当当的C++技术大牛,难道是对C++各种特性不熟练所以才批判C++?
综上所述,firelong对微软C#编译器组有以下建议:
保留C#以下功能:
1. 面向对象
2. 接口
3. 构造器、字段、方法
4. 垃圾收集
5. 异常
6. 并发支持——这是firelong唯一投票支持的新特性,因为它在今后的项目太常用了。
7. 和其他语言的互操作(类似P/Invoke)——那些不适合C#做的,用其他语言来做,然后与C#互操作。
然后将研发精力投入C#语言的代码优化和内存收集优化上,让C#成为一门效率超高的语言,比那些华而不实的新特性重要得多!
删除C#以下功能:
1. 委托和事件(这些都可以用接口来做,参考Java)
2. 反射(反射用处很小,如果真想用反射,请用其他语言)
3. 特性(也可以用接口做,C++没有特性不是一样活得很好)
4. 属性、索引器、析构器(都是方法)
5. JIT编译(直接编译成native代码,完全没必要JIT,微软当初JIT是因为承诺跨平台,但是现在C#真的跨平台了吗?还是Windows上跑,Mono这种阿斗别提了。)
6. 泛型(没必要,用的很少)
7. Linq(去掉,还是用Sql语句+存储过程来的实际)
8. dynamic(去掉,真想dynamic,让ruby、python, f#等去做吧)
9. 还有更多。。。。大家来补充
firelong说得不一定对,但是firelong相信一个简洁、高效的语言,比那一堆华而不实的“新特性”要有用得多——语言最后的威力是“开发软件”,而不是“比拼新特性”。
为什么C语言至今仍是编程语言的王者?它满足了简洁、高效!而不是它有很多新特性。如果C#不这么做,将会有其他语言埋葬C#。就像C慢慢埋葬C++,Ruby慢慢埋葬Java一样。
当然微软C#编译器组不会听firelong的建议,但是如果这样下去,C#几年之后将比现在的C++更为臃肿,那时候批判C#的就不止firelong一个人了,恐怕也不仅仅是批判了。
非常想听听大家的意见。 P.S. 顺便做一个小调查,请大家回帖说一下自己主要在用C# 1.0,还是2.0,还是3.0,还是4.0?
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/firelong2010/archive/2010/06/23/5688783.aspx
感谢您的鼓励和批评,它将是我进步的动力