最近老赵对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此老赵这里也继续整理一下我对Java语言的观点,这样大家不必四处查看老赵的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看——得,双方在自说自话,这怎能辩明事理,您说呢?
在这里,老赵借用一下郑晖同学(再此强烈推荐一下他的《冒号课堂》系列,如此好文不该受到如此冷落)在《高阶函数、委托与匿名方法》中留下的评论,这可能也是目前为止最具体最集中的质疑了。老赵很喜欢,因为可以一条一条的应对,思路清晰。
质疑:Java固步自封?Java语言从1.0到即将的7.0,每次都有新的语法特征加入。C#作为后辈,起点高,对函数式、动态类型等的支持是Java所没有的,但不代表Java今后就不支持。
回应:首先,“Java语言从1.0到7.0,每次都有新语法加入”,就能代表它“不固步自封”了吗?固步自封,是说它改进不大,不顺应“历史潮流”。C#的很多特性Java没有,但不代表Java今后不支持——是啊,的确“能力”是肯定有的,但是有能力而不去做,难道这不是“固步自封”的最好证明?Java 7已经再一次把业界早已强烈要求的闭包特性排除在门外了,只是增加了一些例如“[]式下标”或“使用->而不是get/set访问属性”这样的简单语法糖,看看每次C#改进的力度,具有可比性吗?
质疑:此外,Java的小兄弟Groovy也是动态语言,与Java很容易集成。其他的如JRuby、Jython与Java的集成也不难。
回应:JVM上实现的Groovy、Ruby、Python语言实现,不是我想讨论的内容。我说的是Java语言,由语言的规约来确定。我说Java生产力低下,其实只是说Java这门语言在设计上特性缺失过于严重,而不评论所谓JVM的能力。而JVM上可以实现Groovy等高生产力语言,更是证明了JVM的能力是足够的,而Java有那么好的平台基础,却不愿意发展,这也是我说的“固步自封”的原因之一。
质疑:要知道,Java有更多的历史包袱,动辄在语法上作大改动,会牵连到大批用户。这是成熟和流行的代价。
回应:老赵想说的是,“改进语言”并不代表如Rails 2之于Rails 1.2,Python 3之于Python 2.5那样的“破坏性”改变。改进语言只要保持向前兼容,还会有什么问题吗?难道C#1.0到3.0的过程中破坏了以前的程序吗?很明显,C# 1.0中的所有语法到3.0还可以用,而.NET Fx 1.0编写出的应用程序在3.5上也基本能用。这不就是很好的证明吗?这样的升级无论是语言(包括语法和IL/Binary Code级别的指令)、框架/类库、亦或是平台都不会造成问题,为什么在Java上面就成为无法升级的理由了呢?Java为.NET证明了统一托管平台的成功,由此诞生了.NET,而.NET为Java证明了那么多有生产力的高级语法,社区也吵吵嚷嚷多年——Java又在做什么呢?
质疑:想想c++吧,十年还没有出一个新标准呢。另外,微软一直不肯提供C#在Windows平台之外的支持,算不算固步自封呢?
回应:最后说C++,十年还没有出一个新标准——我不知道,我不关心别人为什么做的不好,我不关心别人的缺点为什么就能成为我不向前看的理由。我不提C++的另一个原因,是因为我对它的了解程度还不够,说了怕别人笑话。还有说微软一直不让C#在Windows以外平台上支持,这是固步自封吗?这是微软的一贯策略而已,当然这个策略我也不会认为是好事,但是谁能告诉我为什么这就叫“固步自封”?难道没有看到mono已经越来越引人注目了吗?微软在这方面的确“封闭”,但可没有“固步自封”。
质疑:Java开发效率虽然比Ruby、Python低,但有丰富的类库、框架和开发工具,更何况Java语言更加严谨,程序员的风格较为一致,减少了许多可能的犯错机会。综合起来,其效率真的会比C#低吗?
回应:某个语言“功能强大”,便说它“混乱”,自己“能力不足”便说是“严谨”。说实话,我认为这是一个很可笑的理由——不过也不是第一次见到这样的说法。从Ruby流行开始就有这种说法了,每次我都看得无可奈何,一笑了之。记得之前哪位朋友在园子里说过类似的话:“人们都希望事物发展,但是一旦事物发展让自己感到难以控制,就会引起恐慌,并对其打压”。虽然当时是在说C#语法的升级,但是现在也恰好可以用在C#与Java方面。至于框架的强大——我知道这一点肯定会被拿出来提,因此每次说Java“坏话”时总归会强调一下Java这一优势,只可惜似乎又被忽略了。那么我再强调一次,我谈论的是Java语法的生产力,不是Java平台的生产力——平台上框架的强大,难道语言上就可以不进行改进了吗?难道进行了语言能力上的强化,用它编写的框架就会变少了吗?平台能力就减弱了吗?当一个事物要用其优势来为自己的劣势做掩饰的时候……老赵就不多说了。
质疑:“难以辩驳的事实”是从什么数据得来的?太夸张了吧?即使用C和C++,只要对语言足够的熟悉,也不致于寸步难行。若果真Java如此难用,Java早就被淘汰了,不劳你唱衰了。
回应:我错了,我举不出“数据”,但是以前的文章都已经给过“示例”,个中比较可以由大家自行体会。至于“寸步难行”……的确也是我夸张了,我错了,以后不随意用修辞手法了。至于Java是否难用,是否早该被淘汰,我想说的是,您又犯了“极端化”的逻辑滑坡错误了。Java的确难用,但是我并没有说他难用到以至于无法推广,无法使用的地步。Java也不是没有过“优雅”的时期,只是到现在来说已经太不够看了,而且还是那四个字“固步自封”。我也从来没说Java平台应该被淘汰了,老赵还眼馋它们上面那么多项目呢,而且平台的能力并不是一个“语法”一个因素就能“拖垮”的。那么多年下来,大家早有依赖性了,肯定会继续用Java。不过我想说,如果回到十几年前Java刚出现那会儿,出现一种各方面都和Java一样,唯一的区别便是拥有C#语法的语言,Java能否活到现在还是个问题。
质疑:“你可以说ruby某个功能1行就能做,而C#要5行,那么我可以补充一个类库,完成1 行的功能。而Java就做不到”为什么Java就做不到呢?能说个理由吗?“这也是为什么现在不少编程语言的书,都喜欢和Java做对比,因为Java的生产力的确是‘难以提高’”——这个说法十分站不住脚。什么语言都与Java比,那是因为Java是当今最流行的语言。等C#在流行度超过了Java,人们自然会找C#比。
回应:不知道郑同学说这句话的时候有没有看过我那篇文章中给出的链接——没看过也不要紧,现在我再整理一下。那篇文章是《从CSDN的趣味题学C# 3.0》,因为有朋友认为Python做字符串小游戏很顺手,于是老赵也就顺便使用C#实现了一下,体现以下C# 3.0的强大特性。这个字符串游戏挺有意思的,不如郑同学用Java也来玩一下?C# 3.0已经不同以往,引入了Lambda表达式、扩展方法、LINQ语法之后在很多方便已经不熟于Ruby、Python等语言,用来玩玩这种小游戏也丝毫不落下风。而且您还别认为这只是一个“玩具”,就在老赵《高阶函数、委托与匿名方法》这篇文章里就用Java来设法“模拟”了一把C#里轻易实现的功能,不知道郑同学对此如何感想——求求您不要告诉我这个例子实际生产中没有用,因为这并不是我乱想出来的,在函数式编程语言,或者Parallel Fx中早就大量运用了。我懒得“列举”出来了,原谅我吧。
至于“作对比”是因为“流行”还是“能力”原因,似乎有点微妙,在这里不多作讨论了。现在呢老赵想多谈谈为什么说“生产力的确是难以提高”——老赵忽然又想到当时初学Ruby时看的《Everyday Scripting with Ruby》一书中对Ruby的功能大家赞赏,尤其是它的正则表达式配合灵活强大的语法给我留下了无比深刻的印象。当时C#还处于2.0阶段,由于没有Lambda表达式和扩展方法的特性,C#在这方面远远落后于Ruby。不过不久之前刚好施杨同学刚好需要《实现一个项目需求》,要求把一个字符串中1存在的位置区间表现出来,例如“00101111110111101110 => 3, 5-10, 12-15, 17-19”,这时某位匿名大虾用Ruby给出了一段实现,很好很强大:
i=0;
"00101111110111101110"
.scan(/0+|1+/)
.map
{|s|
l=s.length;
i+=l;
s.to_i.zero? ? nil : (l>1 ? "#{i-l}-#{i-1}" : "#{i-l}")
}.compact * ", "
虽然在正则表达式的使用上略有缺陷,不过这段代码使用表达式配合map方法把Ruby的特点实实在在地表现了出来,很有典型意义。老赵一时兴起,也用C#实现了一把类似的:
String.Join( ", ", Regex.Matches("00101111110111101110", "1+") .Cast<Match>() .Select(m => m.Length == 1 ? m.Index + 1 + "" : String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length)) .ToArray())
嗯嗯,更好地利用了类库中正则表达式的功能,因此整体上更“函数式”一些,也更流畅了一些,不过基本思路是和之前的Ruby实现是一样的。不过好像……还是不够意思?没事,咱可以扩展嘛,简单扩展以后就可以变成这样了:
"00101111110111101110" .Scan("1+") .Select( m => m.Length == 1 ? m.Index + 1 + "" : String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length)) .Join(", ");
简简单单扩展10行代码,这边的实现便可以更进一步,这便是语言的能力,C#能做到,Ruby能做到,而老赵的Java造诣只能得出“Java无法实现”的结论了,又不知哪位兄台可以试试看?由于语言能力的缺乏,“无法提高”也已经是“不争的事实”了,还需要更多证据吗?其实老赵最近也常思考一个问题,那就是“语言和框架/类库”之间的关系以及重要性。目前老赵的结论是:语言与框架/类库相辅相成,但总体来说“语言 > 框架/类库”,因为框架类库可以在现有语言能力的基础上进行补充,新开发也好,从其他平台进行移植也好,都很难说是“能力”问题。但是语言难以由框架来增强,框架最多只能为“特定场景”增强,无法弥补“语言”上的整体能力缺失。关于这个问题,也欢迎大家和老赵一起来讨论。
质疑:楼主喜欢C#是你的事情,犯不着一而再、再而三地贬低Java吧?没有人反驳你,是因为园子里大多以.net技术为主,对Java不一定熟悉,而你在这里似乎又是个权威。但那不代表你说的都是正确的。本来你关起门来自说自话,我也不会费神去反驳。但既然放在首页,总要经得起推敲吧?尤其你还是个在园子里有影响的人,说话更要严谨。楼主听惯了太多的恭维话,我的话想必有些刺耳。先别急着反驳我,心平气和地想一想。一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格。
回应:这可真是“终极质疑”了,直接怀疑老赵的做事方式,我不爱听,必须好好解释一下。我贬低Java不是因为偏见,而是因为Java本身不争气;老赵也在很多公开场合(比如.NET技术大会或MSDN Web Cast的讲座时,还够正式吧)发表对微软的不满(比如Oxite这个绝佳的反面教材);此外,博客园给我带来那么多好处,老赵不也很有唱衰的欲望吗?——这是一贯做事方式而已,不搞“平衡”,一个东西某方面不好也不会非要帮它找理由来掩盖。当然我承认,里面可能会夹杂对C#的好感,但是至少我举出自认为非常恰当的实例来证明我的观点。老赵也知道弟兄们对我的厚爱,因此说话最多“偷懒”不会“随意”,说出来的话自认非常严谨,欢迎大家推敲,也欢迎郑同学在此继续推推敲敲——不过咱讨论问题不光要“讲道理”,还要“摆事实”不是吗?郑同学的质疑啥都好,条理清晰,就是缺少事实依据。对您这点要求不为过吧?这也不光是对您的要求,老赵现在这篇文章也够有诚意了是不?
老赵其实也做过1年多2年不到的Java程序员,也一直在关注Java(语言和框架)的发展,做出现在这样的判断绝不是图一时之快,而是长久以来积压的不满情绪。老赵同意“一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格”这样的说法,也是这样的做的。之前在QCon上还和一些朋友谈过我对混合编程的实践和热爱呢(我认为“混合编程”绝对是趋势),而作为一个山寨版的Web 2.0架构师,对于其他平台的各种技术必须得有足够多的了解啊。请大家相信老赵,老赵一直在关注其他各种语言/平台/框架(实际上我也一直在结合使用,上次北京俱乐部聚会中我也强调了这方面的重要性),绝对不是井底之蛙——就算还没有变成“王子”,不管怎么说也是个井外的蛙呢。
可惜,对于Java……不用多说了罢。
咳咳,好累,好累。大家也一起来讨论,也欢迎大家叫上Java的朋友一起来玩,转载到Java的阵地上也无不可。不过有些东西兄弟我说在前头,一些啥“语言不是关键,没有讨论必要”,“你个死胖子有什么资格评论这些个”或者“MVP鼓吹微软技术不可信”这类问题咱就先放放吧,大家在进行讨论的时候记得切中关键,并且看清老赵已经谈过的东西——咱也要遵循DRY原则嘛。
On 4月19日, 上午4时55分, "Jeffrey Zhao" <je...@live.com> wrote:
> 写了一篇容易引起吵架的文章,不过还是希望也能和TL的弟兄们一起讨论一下这个问题,喜欢Java的兄弟们多多包涵。(代码上有点小,您可以查看原文)
>
> 事理越辩越明,那么就来详细说说为啥老赵不喜欢Java*语言*
> 原文链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/04/19/why-i-do-not-li...
>
> 最近老赵对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此老赵这里也继续整理一下我对Java语言的观点,这样大家不必四处查看老赵的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看----得,双方在自说自话,这怎能辩明事理,您说呢?
>
> 在这里,老赵借用一下郑晖同学(再此强烈推荐一下他的《冒号课堂》系列,如此好文不该受到如此冷落)在《高阶函数、委托与匿名方法》中留下的评论,这可能也是目前为止最具体最集中的质疑了。老赵很喜欢,因为可以一条一条的应对,思路清晰。
>
> 质疑:Java固步自封?Java语言从1.0到即将的7.0,每次都有新的语法特征加入。C#作为后辈,起点高,对函数式、动态类型等的支持是Java所没有的,但不代表Java今后就不支持。
>
> 回应:首先,"Java语言从1.0到7.0,每次都有新语法加入",就能代表它"不固步自封"了吗?固步自封,是说它改进不大,不顺应"历史潮流"。C#的很多特性Java没有,但不代表Java今后不支持----是啊,的确"能力"是肯定有的,但是有能力而不去做,难道这不是"固步自封"的最好证明?Java 7已经再一次把业界早已强烈要求的闭包特性排除在门外了,只是增加了一些例如"[]式下标"或"使用->而不是get/set访问属性"这样的简单语法糖,看看每次C#改进的力度,具有可比性吗?
>
> 质疑:此外,Java的小兄弟Groovy也是动态语言,与Java很容易集成。其他的如JRuby、Jython与Java的集成也不难。
>
> 回应:JVM上实现的Groovy、Ruby、Python语言实现,不是我想讨论的内容。我说的是Java语言,由语言的规约来确定。我说Java生产力低下,其实只是说Java这门语言在设计上特性缺失过于严重,而不评论所谓JVM的能力。而JVM上可以实现Groovy等高生产力语言,更是证明了JVM的能力是足够的,而Java有那么好的平台基础,却不愿意发展,这也是我说的"固步自封"的原因之一。
>
> 质疑:要知道,Java有更多的历史包袱,动辄在语法上作大改动,会牵连到大批用户。这是成熟和流行的代价。
>
> 回应:老赵想说的是,"改进语言"并不代表如Rails 2之于Rails 1.2,Python 3之于Python 2.5那样的"破坏性"改变。改进语言只要保持向前兼容,还会有什么问题吗?难道C#1.0到3.0的过程中破坏了以前的程序吗?很明显,C# 1.0中的所有语法到3.0还可以用,而.NET Fx 1.0编写出的应用程序在3.5上也基本能用。这不就是很好的证明吗?这样的升级无论是语言(包括语法和IL/Binary Code级别的指令)、框架/类库、亦或是平台都不会造成问题,为什么在Java上面就成为无法升级的理由了呢?Java为.NET证明了统一托管平台的成功,由此诞生了.NET,而.NET为Java证明了那么多有生产力的高级语法,社区也吵吵嚷嚷多年----Java又在做什么呢?
>
> 质疑:想想c++吧,十年还没有出一个新标准呢。另外,微软一直不肯提供C#在Windows平台之外的支持,算不算固步自封呢?
>
> 回应:最后说C++,十年还没有出一个新标准----我不知道,我不关心别人为什么做的不好,我不关心别人的缺点为什么就能成为我不向前看的理由。我不提C++的另一个原因,是因为我对它的了解程度还不够,说了怕别人笑话。还有说微软一直不让C#在Windows以外平台上支持,这是固步自封吗?这是微软的一贯策略而已,当然这个策略我也不会认为是好事,但是谁能告诉我为什么这就叫"固步自封"?难道没有看到mono已经越来越引人注目了吗?微软在这方面的确"封闭",但可没有"固步自封"。
>
> 质疑:Java开发效率虽然比Ruby、Python低,但有丰富的类库、框架和开发工具,更何况Java语言更加严谨,程序员的风格较为一致,减少了许多可能的犯错机会。综合起来,其效率真的会比C#低吗?
>
> 回应:某个语言"功能强大",便说它"混乱",自己"能力不足"便说是"严谨"。说实话,我认为这是一个很可笑的理由----不过也不是第一次见到这样的说法。从Ruby流行开始就有这种说法了,每次我都看得无可奈何,一笑了之。记得之前哪位朋友在园子里说过类似的话:"人们都希望事物发展,但是一旦事物发展让自己感到难以控制,就会引起恐慌,并对其打压"。虽然当时是在说C#语法的升级,但是现在也恰好可以用在C#与Java方面。至于框架的强大----我知道这一点肯定会被拿出来提,因此每次说Java"坏话"时总归会强调一下Java这一优势,只可惜似乎又被忽略了。那么我再强调一次,我谈论的是Java语法的生产力,不是Java平台的生产力----平台上框架的强大,难道语言上就可以不进行改进了吗?难道进行了语言能力上的强化,用它编写的框架就会变少了吗?平台能力就减弱了吗?当一个事物要用其优势来为自己的劣势做掩饰的时候......老赵就不多说了。
>
> 质疑:"难以辩驳的事实"是从什么数据得来的?太夸张了吧?即使用C和C++,只要对语言足够的熟悉,也不致于寸步难行。若果真Java如此难用,Java早就被淘汰了,不劳你唱衰了。
>
> 回应:我错了,我举不出"数据",但是以前的文章都已经给过"示例",个中比较可以由大家自行体会。至于"寸步难行"......的确也是我夸张了,我错了,以后不随意用修辞手法了。至于Java是否难用,是否早该被淘汰,我想说的是,您又犯了"极端化"的逻辑滑坡错误了。Java的确难用,但是我并没有说他难用到以至于无法推广,无法使用的地步。Java也不是没有过"优雅"的时期,只是到现在来说已经太不够看了,而且还是那四个字"固步自封"。我也从来没说Java平台应该被淘汰了,老赵还眼馋它们上面那么多项目呢,而且平台的能力并不是一个"语法"一个因素就能"拖垮"的。那么多年下来,大家早有依赖性了,肯定会继续用Java。不过我想说,如果回到十几年前Java刚出现那会儿,出现一种各方面都和Java一样,唯一的区别便是拥有C#语法的语言,Java能否活到现在还是个问题。
>
> 质疑:"你可以说ruby某个功能1行就能做,而C#要5行,那么我可以补充一个类库,完成1 行的功能。而Java就做不到"为什么Java就做不到呢?能说个理由吗?"这也是为什么现在不少编程语言的书,都喜欢和Java做对比,因为Java的生产力的确是'难以提高'"----这个说法十分站不住脚。什么语言都与Java比,那是因为Java是当今最流行的语言。等C#在流行度超过了Java,人们自然会找C#比。
>
> 回应:不知道郑同学说这句话的时候有没有看过我那篇文章中给出的链接----没看过也不要紧,现在我再整理一下。那篇文章是《从CSDN的趣味题学C# 3.0》,因为有朋友认为Python做字符串小游戏很顺手,于是老赵也就顺便使用C#实现了一下,体现以下C# 3.0的强大特性。这个字符串游戏挺有意思的,不如郑同学用Java也来玩一下?C# 3.0已经不同以往,引入了Lambda表达式、扩展方法、LINQ语法之后在很多方便已经不熟于Ruby、Python等语言,用来玩玩这种小游戏也丝毫不落下风。而且您还别认为这只是一个"玩具",就在老赵《高阶函数、委托与匿名方法》这篇文章里就用Java来设法"模拟"了一把C#里轻易实现的功能,不知道郑同学对此如何感想----求求您不要告诉我这个例子实际生产中没有用,因为这并不是我乱想出来的,在函数式编程语言,或者Parallel Fx中早就大量运用了。我懒得"列举"出来了,原谅我吧。
>
> 至于"作对比"是因为"流行"还是"能力"原因,似乎有点微妙,在这里不多作讨论了。现在呢老赵想多谈谈为什么说"生产力的确是难以提高"----老赵忽然又想到当时初学Ruby时看的《Everyday Scripting with Ruby》一书中对Ruby的功能大家赞赏,尤其是它的正则表达式配合灵活强大的语法给我留下了无比深刻的印象。当时C#还处于2.0阶段,由于没有Lambda表达式和扩展方法的特性,C#在这方面远远落后于Ruby。不过不久之前刚好施杨同学刚好需要《实现一个项目需求》,要求把一个字符串中1存在的位置区间表现出来,例如"00101111110111101110 => 3, 5-10, 12-15, 17-19",这时某位匿名大虾用Ruby给出了一段实现,很好很强大:
>
> i=0;
> "00101111110111101110"
> .scan(/0+|1+/)
> .map
> {|s|
> l=s.length;
> i+=l;
> s.to_i.zero? ? nil : (l>1 ? "#{i-l}-#{i-1}" : "#{i-l}")
> }.compact * ", "
> 虽然在正则表达式的使用上略有缺陷,不过这段代码使用表达式配合map方法把Ruby的特点实实在在地表现了出来,很有典型意义。老赵一时兴起,也用C#实现了一把类似的:
>
> String.Join(
> ", ",
> Regex.Matches("00101111110111101110", "1+")
> .Cast<Match>()
> .Select(m =>
> m.Length == 1 ?
> m.Index + 1 + "" :
> String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
> .ToArray())
> 嗯嗯,更好地利用了类库中正则表达式的功能,因此整体上更"函数式"一些,也更流畅了一些,不过基本思路是和之前的Ruby实现是一样的。不过好像......还是不够意思?没事,咱可以扩展嘛,简单扩展以后就可以变成这样了:
>
> "00101111110111101110"
> .Scan("1+")
> .Select(
> m => m.Length == 1 ?
> m.Index + 1 + "" :
> String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
> .Join(", ");
> 简简单单扩展10行代码,这边的实现便可以更进一步,这便是语言的能力,C#能做到,Ruby能做到,而老赵的Java造诣只能得出"Java无法实现"的结论了,又不知哪位兄台可以试试看?由于语言能力的缺乏,"无法提高"也已经是"不争的事实"了,还需要更多证据吗?其实老赵最近也常思考一个问题,那就是"语言和框架/类库"之间的关系以及重要性。目前老赵的结论是:语言与框架/类库相辅相成,但总体来说"语言 > 框架/类库",因为框架类库可以在现有语言能力的基础上进行补充,新开发也好,从其他平台进行移植也好,都很难说是"能力"问题。但是语言难以由框架来增强,框架最多只能为"特定场景"增强,无法弥补"语言"上的整体能力缺失。关于这个问题,也欢迎大家和老赵一起来讨论。
>
> 质疑:楼主喜欢C#是你的事情,犯不着一而再、再而三地贬低Java吧?没有人反驳你,是因为园子里大多以.net技术为主,对Java不一定熟悉,而你在这里似乎又是个权威。但那不代表你说的都是正确的。本来你关起门来自说自话,我也不会费神去反驳。但既然放在首页,总要经得起推敲吧?尤其你还是个在园子里有影响的人,说话更要严谨。楼主听惯了太多的恭维话,我的话想必有些刺耳。先别急着反驳我,心平气和地想一想。一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格。
>
> 回应:这可真是"终极质疑"了,直接怀疑老赵的做事方式,我不爱听,必须好好解释一下。我贬低Java不是因为偏见,而是因为Java本身不争气;老赵也在很多公开场合(比如.NET技术大会或MSDN Web Cast的讲座时,还够正式吧)发表对微软的不满(比如Oxite这个绝佳的反面教材);此外,博客园给我带来那么多好处,老赵不也很有唱衰的欲望吗?----这是一贯做事方式而已,不搞"平衡",一个东西某方面不好也不会非要帮它找理由来掩盖。当然我承认,里面可能会夹杂对C#的好感,但是至少我举出自认为非常恰当的实例来证明我的观点。老赵也知道弟兄们对我的厚爱,因此说话最多"偷懒"不会"随意",说出来的话自认非常严谨,欢迎大家推敲,也欢迎郑同学在此继续推推敲敲----不过咱讨论问题不光要"讲道理",还要"摆事实"不是吗?郑同学的质疑啥都好,条理清晰,就是缺少事实依据。对您这点要求不为过吧?这也不光是对您的要求,老赵现在这篇文章也够有诚意了是不?
>
> 老赵其实也做过1年多2年不到的Java程序员,也一直在关注Java(语言和框架)的发展,做出现在这样的判断绝不是图一时之快,而是长久以来积压的不满情绪。老赵同意"一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格"这样的说法,也是这样的做的。之前在QCon上还和一些朋友谈过我对混合编程的实践和热爱呢(我认为"混合编程"绝对是趋势),而作为一个山寨版的Web 2.0架构师,对于其他平台的各种技术必须得有足够多的了解啊。请大家相信老赵,老赵一直在关注其他各种语言/平台/框架(实际上我也一直在结合使用,上次北京俱乐部聚会中我也强调了这方面的重要性),绝对不是井底之蛙----就算还没有变成"王子",不管怎么说也是个井外的蛙呢。
>
> 可惜,对于Java......不用多说了罢。
>
> 咳咳,好累,好累。大家也一起来讨论,也欢迎大家叫上Java的朋友一起来玩,转载到Java的阵地上也无不可。不过有些东西兄弟我说在前头,一些啥"语言不是关键,没有讨论必要","你个死胖子有什么资格评论这些个"或者"MVP鼓吹微软技术不可信"这类问题咱就先放放吧,大家在进行讨论的时候记得切中关键,并且看清老赵已经谈过的东西----咱也要遵循DRY原则嘛。
On Apr 19, 4:55 am, "Jeffrey Zhao" <je...@live.com> wrote:
> 写了一篇容易引起吵架的文章,不过还是希望也能和TL的弟兄们一起讨论一下这个问题,喜欢Java的兄弟们多多包涵。(代码上有点小,您可以查看原文)
>
> 事理越辩越明,那么就来详细说说为啥老赵不喜欢Java*语言*
> 原文链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/04/19/why-i-do-not-li...
>
> 最近老赵对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此老赵这里也继续整理一下我对Java语言的观点,这样大家不必四处查看老赵的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看----得,双方在自说自话,这怎能辩明事理,您说呢?
>
> 在这里,老赵借用一下郑晖同学(再此强烈推荐一下他的《冒号课堂》系列,如此好文不该受到如此冷落)在《高阶函数、委托与匿名方法》中留下的评论,这可能也是目前为止最具体最集中的质疑了。老赵很喜欢,因为可以一条一条的应对,思路清晰。
>
> 质疑:Java固步自封?Java语言从1.0到即将的7.0,每次都有新的语法特征加入。C#作为后辈,起点高,对函数式、动态类型等的支持是Java所没有的,但不代表Java今后就不支持。
>
> 回应:首先,"Java语言从1.0到7.0,每次都有新语法加入",就能代表它"不固步自封"了吗?固步自封,是说它改进不大,不顺应"历史潮流"。C#的很多特性Java没有,但不代表Java今后不支持----是啊,的确"能力"是肯定有的,但是有能力而不去做,难道这不是"固步自封"的最好证明?Java 7已经再一次把业界早已强烈要求的闭包特性排除在门外了,只是增加了一些例如"[]式下标"或"使用->而不是get/set访问属性"这样的简单语法糖,看看每次C#改进的力度,具有可比性吗?
>
> 质疑:此外,Java的小兄弟Groovy也是动态语言,与Java很容易集成。其他的如JRuby、Jython与Java的集成也不难。
>
> 回应:JVM上实现的Groovy、Ruby、Python语言实现,不是我想讨论的内容。我说的是Java语言,由语言的规约来确定。我说Java生产力低下,其实只是说Java这门语言在设计上特性缺失过于严重,而不评论所谓JVM的能力。而JVM上可以实现Groovy等高生产力语言,更是证明了JVM的能力是足够的,而Java有那么好的平台基础,却不愿意发展,这也是我说的"固步自封"的原因之一。
>
> 质疑:要知道,Java有更多的历史包袱,动辄在语法上作大改动,会牵连到大批用户。这是成熟和流行的代价。
>
> 回应:老赵想说的是,"改进语言"并不代表如Rails 2之于Rails 1.2,Python 3之于Python 2.5那样的"破坏性"改变。改进语言只要保持向前兼容,还会有什么问题吗?难道C#1.0到3.0的过程中破坏了以前的程序吗?很明显,C# 1.0中的所有语法到3.0还可以用,而.NET Fx 1.0编写出的应用程序在3.5上也基本能用。这不就是很好的证明吗?这样的升级无论是语言(包括语法和IL/Binary Code级别的指令)、框架/类库、亦或是平台都不会造成问题,为什么在Java上面就成为无法升级的理由了呢?Java为.NET证明了统一托管平台的成功,由此诞生了.NET,而.NET为Java证明了那么多有生产力的高级语法,社区也吵吵嚷嚷多年----Java又在做什么呢?
>
> 质疑:想想c++吧,十年还没有出一个新标准呢。另外,微软一直不肯提供C#在Windows平台之外的支持,算不算固步自封呢?
>
> 回应:最后说C++,十年还没有出一个新标准----我不知道,我不关心别人为什么做的不好,我不关心别人的缺点为什么就能成为我不向前看的理由。我不提C++的另一个原因,是因为我对它的了解程度还不够,说了怕别人笑话。还有说微软一直不让C#在Windows以外平台上支持,这是固步自封吗?这是微软的一贯策略而已,当然这个策略我也不会认为是好事,但是谁能告诉我为什么这就叫"固步自封"?难道没有看到mono已经越来越引人注目了吗?微软在这方面的确"封闭",但可没有"固步自封"。
>
> 质疑:Java开发效率虽然比Ruby、Python低,但有丰富的类库、框架和开发工具,更何况Java语言更加严谨,程序员的风格较为一致,减少了许多可能的犯错机会。综合起来,其效率真的会比C#低吗?
>
> 回应:某个语言"功能强大",便说它"混乱",自己"能力不足"便说是"严谨"。说实话,我认为这是一个很可笑的理由----不过也不是第一次见到这样的说法。从Ruby流行开始就有这种说法了,每次我都看得无可奈何,一笑了之。记得之前哪位朋友在园子里说过类似的话:"人们都希望事物发展,但是一旦事物发展让自己感到难以控制,就会引起恐慌,并对其打压"。虽然当时是在说C#语法的升级,但是现在也恰好可以用在C#与Java方面。至于框架的强大----我知道这一点肯定会被拿出来提,因此每次说Java"坏话"时总归会强调一下Java这一优势,只可惜似乎又被忽略了。那么我再强调一次,我谈论的是Java语法的生产力,不是Java平台的生产力----平台上框架的强大,难道语言上就可以不进行改进了吗?难道进行了语言能力上的强化,用它编写的框架就会变少了吗?平台能力就减弱了吗?当一个事物要用其优势来为自己的劣势做掩饰的时候......老赵就不多说了。
>
> 质疑:"难以辩驳的事实"是从什么数据得来的?太夸张了吧?即使用C和C++,只要对语言足够的熟悉,也不致于寸步难行。若果真Java如此难用,Java早就被淘汰了,不劳你唱衰了。
>
> 回应:我错了,我举不出"数据",但是以前的文章都已经给过"示例",个中比较可以由大家自行体会。至于"寸步难行"......的确也是我夸张了,我错了,以后不随意用修辞手法了。至于Java是否难用,是否早该被淘汰,我想说的是,您又犯了"极端化"的逻辑滑坡错误了。Java的确难用,但是我并没有说他难用到以至于无法推广,无法使用的地步。Java也不是没有过"优雅"的时期,只是到现在来说已经太不够看了,而且还是那四个字"固步自封"。我也从来没说Java平台应该被淘汰了,老赵还眼馋它们上面那么多项目呢,而且平台的能力并不是一个"语法"一个因素就能"拖垮"的。那么多年下来,大家早有依赖性了,肯定会继续用Java。不过我想说,如果回到十几年前Java刚出现那会儿,出现一种各方面都和Java一样,唯一的区别便是拥有C#语法的语言,Java能否活到现在还是个问题。
>
> 质疑:"你可以说ruby某个功能1行就能做,而C#要5行,那么我可以补充一个类库,完成1 行的功能。而Java就做不到"为什么Java就做不到呢?能说个理由吗?"这也是为什么现在不少编程语言的书,都喜欢和Java做对比,因为Java的生产力的确是'难以提高'"----这个说法十分站不住脚。什么语言都与Java比,那是因为Java是当今最流行的语言。等C#在流行度超过了Java,人们自然会找C#比。
>
> 回应:不知道郑同学说这句话的时候有没有看过我那篇文章中给出的链接----没看过也不要紧,现在我再整理一下。那篇文章是《从CSDN的趣味题学C# 3.0》,因为有朋友认为Python做字符串小游戏很顺手,于是老赵也就顺便使用C#实现了一下,体现以下C# 3.0的强大特性。这个字符串游戏挺有意思的,不如郑同学用Java也来玩一下?C# 3.0已经不同以往,引入了Lambda表达式、扩展方法、LINQ语法之后在很多方便已经不熟于Ruby、Python等语言,用来玩玩这种小游戏也丝毫不落下风。而且您还别认为这只是一个"玩具",就在老赵《高阶函数、委托与匿名方法》这篇文章里就用Java来设法"模拟"了一把C#里轻易实现的功能,不知道郑同学对此如何感想----求求您不要告诉我这个例子实际生产中没有用,因为这并不是我乱想出来的,在函数式编程语言,或者Parallel Fx中早就大量运用了。我懒得"列举"出来了,原谅我吧。
>
> 至于"作对比"是因为"流行"还是"能力"原因,似乎有点微妙,在这里不多作讨论了。现在呢老赵想多谈谈为什么说"生产力的确是难以提高"----老赵忽然又想到当时初学Ruby时看的《Everyday Scripting with Ruby》一书中对Ruby的功能大家赞赏,尤其是它的正则表达式配合灵活强大的语法给我留下了无比深刻的印象。当时C#还处于2.0阶段,由于没有Lambda表达式和扩展方法的特性,C#在这方面远远落后于Ruby。不过不久之前刚好施杨同学刚好需要《实现一个项目需求》,要求把一个字符串中1存在的位置区间表现出来,例如"00101111110111101110 => 3, 5-10, 12-15, 17-19",这时某位匿名大虾用Ruby给出了一段实现,很好很强大:
>
> i=0;
> "00101111110111101110"
> .scan(/0+|1+/)
> .map
> {|s|
> l=s.length;
> i+=l;
> s.to_i.zero? ? nil : (l>1 ? "#{i-l}-#{i-1}" : "#{i-l}")
> }.compact * ", "
> 虽然在正则表达式的使用上略有缺陷,不过这段代码使用表达式配合map方法把Ruby的特点实实在在地表现了出来,很有典型意义。老赵一时兴起,也用C#实现了一把类似的:
>
> String.Join(
> ", ",
> Regex.Matches("00101111110111101110", "1+")
> .Cast<Match>()
> .Select(m =>
> m.Length == 1 ?
> m.Index + 1 + "" :
> String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
> .ToArray())
> 嗯嗯,更好地利用了类库中正则表达式的功能,因此整体上更"函数式"一些,也更流畅了一些,不过基本思路是和之前的Ruby实现是一样的。不过好像......还是不够意思?没事,咱可以扩展嘛,简单扩展以后就可以变成这样了:
>
> "00101111110111101110"
> .Scan("1+")
> .Select(
> m => m.Length == 1 ?
> m.Index + 1 + "" :
> String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
> .Join(", ");
> 简简单单扩展10行代码,这边的实现便可以更进一步,这便是语言的能力,C#能做到,Ruby能做到,而老赵的Java造诣只能得出"Java无法实现"的结论了,又不知哪位兄台可以试试看?由于语言能力的缺乏,"无法提高"也已经是"不争的事实"了,还需要更多证据吗?其实老赵最近也常思考一个问题,那就是"语言和框架/类库"之间的关系以及重要性。目前老赵的结论是:语言与框架/类库相辅相成,但总体来说"语言 > 框架/类库",因为框架类库可以在现有语言能力的基础上进行补充,新开发也好,从其他平台进行移植也好,都很难说是"能力"问题。但是语言难以由框架来增强,框架最多只能为"特定场景"增强,无法弥补"语言"上的整体能力缺失。关于这个问题,也欢迎大家和老赵一起来讨论。
>
> 质疑:楼主喜欢C#是你的事情,犯不着一而再、再而三地贬低Java吧?没有人反驳你,是因为园子里大多以.net技术为主,对Java不一定熟悉,而你在这里似乎又是个权威。但那不代表你说的都是正确的。本来你关起门来自说自话,我也不会费神去反驳。但既然放在首页,总要经得起推敲吧?尤其你还是个在园子里有影响的人,说话更要严谨。楼主听惯了太多的恭维话,我的话想必有些刺耳。先别急着反驳我,心平气和地想一想。一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格。
>
> 回应:这可真是"终极质疑"了,直接怀疑老赵的做事方式,我不爱听,必须好好解释一下。我贬低Java不是因为偏见,而是因为Java本身不争气;老赵也在很多公开场合(比如.NET技术大会或MSDN Web Cast的讲座时,还够正式吧)发表对微软的不满(比如Oxite这个绝佳的反面教材);此外,博客园给我带来那么多好处,老赵不也很有唱衰的欲望吗?----这是一贯做事方式而已,不搞"平衡",一个东西某方面不好也不会非要帮它找理由来掩盖。当然我承认,里面可能会夹杂对C#的好感,但是至少我举出自认为非常恰当的实例来证明我的观点。老赵也知道弟兄们对我的厚爱,因此说话最多"偷懒"不会"随意",说出来的话自认非常严谨,欢迎大家推敲,也欢迎郑同学在此继续推推敲敲----不过咱讨论问题不光要"讲道理",还要"摆事实"不是吗?郑同学的质疑啥都好,条理清晰,就是缺少事实依据。对您这点要求不为过吧?这也不光是对您的要求,老赵现在这篇文章也够有诚意了是不?
>
> 老赵其实也做过1年多2年不到的Java程序员,也一直在关注Java(语言和框架)的发展,做出现在这样的判断绝不是图一时之快,而是长久以来积压的不满情绪。老赵同意"一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格"这样的说法,也是这样的做的。之前在QCon上还和一些朋友谈过我对混合编程的实践和热爱呢(我认为"混合编程"绝对是趋势),而作为一个山寨版的Web 2.0架构师,对于其他平台的各种技术必须得有足够多的了解啊。请大家相信老赵,老赵一直在关注其他各种语言/平台/框架(实际上我也一直在结合使用,上次北京俱乐部聚会中我也强调了这方面的重要性),绝对不是井底之蛙----就算还没有变成"王子",不管怎么说也是个井外的蛙呢。
>
> 可惜,对于Java......不用多说了罢。
>
> 咳咳,好累,好累。大家也一起来讨论,也欢迎大家叫上Java的朋友一起来玩,转载到Java的阵地上也无不可。不过有些东西兄弟我说在前头,一些啥"语言不是关键,没有讨论必要","你个死胖子有什么资格评论这些个"或者"MVP鼓吹微软技术不可信"这类问题咱就先放放吧,大家在进行讨论的时候记得切中关键,并且看清老赵已经谈过的东西----咱也要遵循DRY原则嘛。
--
Sent from my mobile device
Regards,
Linker Lin
linker...@gmail.com
我想不明白的是,为什么因为有某方面的优势,就不思进取了,呵呵。
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "Linker" <linker...@gmail.com>
Sent: Sunday, April 19, 2009 1:32 PM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
--
wing
wing9...@gmail.com
Hope is a good thing, maybe the best of things.
对于互联网应用,现在的开源产品那么多都是通过标准进行通信,为.net写个binding就ok了,又有多困难,又损失了什么,难道同为Linux平台下的ruby/python使用这些产品就不是靠各自的binding吗?
还有我倒不觉得python/ruby比C#生产力强多少,如果您以为C#是强化版的Java,那么还是觉得您可以再去了解一下C# 3.0或者就看看我文章里给出的链接也好。咱也不是凭自己感觉乱说
话,是不?
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "wing" <wing9...@gmail.com>
Sent: Sunday, April 19, 2009 3:57 PM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> java在国内用的最多的地方,都是企业应用,那些应用不需要那么多花哨的语言功能,要求开发快、工程性好、又够健壮,综合这几个,目前还没有可以替代java的,用ruby去做综合业务系统?就算你觉得好,客户愿意接受,也需要很长的时间,和ibm、oracle这样大佬的产品支持,而c/c++对开发人员的要求、工程性、健壮性上都不如java(嗯,很好的程序员可以用c开发出极好的系统,但问题是,没办法找到或没有成本雇佣那么多合格的c程序员)
On 4/19/09, Jeffrey Zhao <je...@live.com> wrote:
>
--
On 4月19日, 下午3时57分, wing <wing922w...@gmail.com> wrote:
> java在国内用的最多的地方,都是企业应用,那些应用不需要那么多花哨的语言功能,要求开发快、工程性好、又够健壮,综合这几个,目前还没有可以替代java 的,用ruby去做综合业务系统?就算你觉得好,客户愿意接受,也需要很长的时间,和ibm、oracle这样大佬的产品支持,而c/c++对开发人员的要求、 工程性、健壮性上都不如java(嗯,很好的程序员可以用c开发出极好的系统,但问题是,没办法找到或没有成本雇佣那么多合格的c程序员)
> 如果是互联网应用,除非支付相关的系统,会考虑使用java,可能用的更多的还是php,这时候语言的性能并重要,因为瓶颈不在这里,个人更喜欢python。 。。
> c#?不讨厌这门语言,选择合适的语言是架构师必须的工作,个人偏好最好不要带进来,但是我真不知道在哪里使用c#,企业应用?嗯,怎么把c#部署在unix上 ?除非你只给小企业做玩具,否则就别考虑dot
> net,想都别想。
> 做客户端?嗯,挺不错的,WPF很诱人,但是你要装上200多m的包,比我装个ubuntu还要花上更多的时间,因此我们的客户端最终还是vc。
> 互联网上用c#?那么多的开源产品都是linux的,基于window自己搞一套,除非是确实没能力搞linux,否则吃饱了用window来折磨自己?
> 仅仅从语言层次的比较,没多大意义,你很容易给java加上一些功能,这不难,sun确实不是一家好公司,如果java在ibm手里,情况会不同,但是仅仅从语 言层次比较,并没多大意义,如果这个角度,python、ruby都比c#强,但是从整个应用层面看,感觉C#更是黯淡,抛开偏好而言,我都很难找到地方使用它 ,当然这仅仅限于我的工作场景,很多地方还是可以用,不过至少说明C#绑定与ms的解决方案在很多地方是不适用的,这是致命伤。
> 从语言喜爱度来说,个人最喜欢的还是c和python,c++过于复杂,java过呆板,c#只不过是强化版的java,但是牺牲了跨平台为代价,做服务端不予 考虑,客户端还不如直接动用vc,至少对于我工作过的几家公司,是绝对不会考虑C#做解决方案的,我想这个层面的比较才是最重要的,语言的功能本身还是第二位的 。
>
> --
> wing
> wing922w...@gmail.com
谁都说编程重要的是思想。 但不通过特定的语言, 思想从何而来?
语言---- 或者更狭隘的说,语言特性----是重要的。
1. 好的语言特性, 将程序员的思想直接映射到代码。
说不需要语言特性的人, 不妨考虑一下: 既然程序最终的结果是CPU执行的机器码, 为什么我们不直接编写机器码?
甚至连机器码, 也是含有特性的, 比如对操作的抽象。
我们不能直接说, "唉, 你, 将那个电平调到低"。
你工作在哪个抽象层次上, 就需要特定抽象和一定程度的语言特性。
2. 好的语言特性, 能锻炼程序员的思想。
要体会到某种思想, 如果使用的语言供的想抽象层次跨度太大, 是很难深入体会的。
比如, 用汇编语言, 最清晰的是一条指令接一条指令编写。
用汇编写一个子过程, 也还能够胜任。
再往上的抽象, 汇编就很难胜任了。
有用汇编实现OO的, 但极少。 而且根本不适合。
可以说, 如果只用汇编, 常人一辈子都无法领悟比子过程更高的抽象。
这也就是我上面说的, 有些刀法, 必须有相应的刀才能练习。
而java, 就是一门特性进化缓慢的语言。
举个例子:
java和.net都有gc, 可以管理内存资源。
但是, gc导致不确定时间析构, 对非内存资源的管理又出现了问题。
从C#发布起, 到C#引入using语句, 用了多长时间?
从java发布起,到现在(至今仍没有对应物) 又有多长时间?
using 重要吗? 没有他我们确实也能写代码, 但是繁琐。
我们希望把时间花在解决问题上, 而不是一次又一次的重复某些机械劳动上----那些事应该交给机器去做。
而using就是把重复劳动交给机器去自动、无错、 高效的完成, 从而提高程序员的生产力。
using难实现吗? 当然不。 我一开始还存有误会, 因为我看见的using都是这样:
using ( R r = new R() ) { }
以为对using中的对象, CLR会不将其放在堆上, 从而有确定时间析构。
后来看见这样的写法:
R r = new R();
using (r) {}
才知道事情肯定不是这个样子。 然后才发现using的实现是如此简单, CLR根本无须修改, 只该编译器就够了。
显然, using也不会造成任何兼容性问题。
那为什么java直到现在也不肯加入?
此处以using为例, 并不是说using就是很好的。 毕竟是嵌套了try finally 块, 是否会造成其他问题我不太清楚, 还得请教老赵
了 ^_^
除开using类似的var dynamic 等也是很容易做到的功能。
相对于C#、 java就是一门固步自封的语言, 不肯加入新特性来提高程序员的生产力。
On 4月19日, 下午3时16分, "Jeffrey Zhao" <je...@live.com> wrote:
> 这你要看和什么比了。
>
> 就好比是说,刀法的确要比刀重要,但是也不能说一把宝刀的价值是不大的。
>
> Jeffrey Zhao
> Blog:http://jeffreyzhao.cnblogs.com
> Twitter:http://twitter.com/jeffz_cn
>
> From: junyi sun
> Sent: Sunday, April 19, 2009 3:05 PM
> To: pon...@googlegroups.com
> Subject: [TL] Re: 详细说说为啥我不喜欢Java"语言"{讨论}{技术}{Java}
>
> 这些语法层面上的东西真的那么重要吗?
>
> 2009/4/19 Jeffrey Zhao <je...@live.com>
>
> 这个我当然想的明白。
>
> 我想不明白的是,为什么因为有某方面的优势,就不思进取了,呵呵。
>
> Jeffrey Zhao
> Blog:http://jeffreyzhao.cnblogs.com
> Twitter:http://twitter.com/jeffz_cn
>
> --------------------------------------------------
> From: "Linker" <linker.m....@gmail.com>
On 4月19日, 下午3时57分, wing <wing922w...@gmail.com> wrote:
On 4月18日, 下午10时55分, "Jeffrey Zhao" <je...@live.com> wrote:
> 写了一篇容易引起吵架的文章,不过还是希望也能和TL的弟兄们一起讨论一下这个问题,喜欢Java的兄弟们多多包涵。(代码上有点小,您可以查看原文)
>
> 事理越辩越明,那么就来详细说说为啥老赵不喜欢Java*语言*
> 原文链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/04/19/why-i-do-not-li...
>
> 最近老赵对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此老 赵这里也继续整理一下我对Java语言的观点,这样大家不必四处查看老赵的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看---- 得,双方在自说自话,这怎能辩明事理,您说呢?
>
> 在这里,老赵借用一下郑晖同学(再此强烈推荐一下他的《冒号课堂》系列,如此好文不该受到如此冷落)在《高阶函数、委托与匿名方法》中留下的评论,这可能也是目 前为止最具体最集中的质疑了。老赵很喜欢,因为可以一条一条的应对,思路清晰。
>
> 质疑:Java固步自封?Java语言从1.0到即将的7.0,每次都有新的语法特征加入。C#作为后辈,起点高,对函数式、动态类型等的支持是Java所没有 的,但不代表Java今后就不支持。
>
> 回应:首先,"Java语言从1.0到7.0,每次都有新语法加入",就能代表它"不固步自封"了吗?固步自封,是说它改进不大,不顺应"历史潮流"。C#的很 多特性Java没有,但不代表Java今后不支持----是啊,的确"能力"是肯定有的,但是有能力而不去做,难道这不是"固步自封"的最好证明?Java 7已经再一次把业界早已强烈要求的闭包特性排除在门外了,只是增加了一些例如"[]式下标"或"使用->而不是get/set访问属性"这样的简单语法糖,看看 每次C#改进的力度,具有可比性吗?
>
> 质疑:此外,Java的小兄弟Groovy也是动态语言,与Java很容易集成。其他的如JRuby、Jython与Java的集成也不难。
>
> 回应:JVM上实现的Groovy、Ruby、Python语言实现,不是我想讨论的内容。我说的是Java语言,由语言的规约来确定。我说Java生产力低下 ,其实只是说Java这门语言在设计上特性缺失过于严重,而不评论所谓JVM的能力。而JVM上可以实现Groovy等高生产力语言,更是证明了JVM的能力是 足够的,而Java有那么好的平台基础,却不愿意发展,这也是我说的"固步自封"的原因之一。
>
> 质疑:要知道,Java有更多的历史包袱,动辄在语法上作大改动,会牵连到大批用户。这是成熟和流行的代价。
>
> 回应:老赵想说的是,"改进语言"并不代表如Rails 2之于Rails 1.2,Python 3之于Python 2.5那样的"破坏性"改变。改进语言只要保持向前兼容,还会有什么问题吗?难道C#1.0到3.0的过程中破坏了以前的程序吗?很明显,C# 1.0中的所有语法到3.0还可以用,而.NET Fx 1.0编写出的应用程序在3.5上也基本能用。这不就是很好的证明吗?这样的升级无论是语言(包括语法和IL/Binary Code级别的指令)、框架/类库、亦或是平台都不会造成问题,为什么在Java上面就成为无法升级的理由了呢?Java为.NET证明了统一托管平台的成功, 由此诞生了.NET,而.NET为Java证明了那么多有生产力的高级语法,社区也吵吵嚷嚷多年----Java又在做什么呢?
>
> 质疑:想想c++吧,十年还没有出一个新标准呢。另外,微软一直不肯提供C#在Windows平台之外的支持,算不算固步自封呢?
>
> 回应:最后说C++,十年还没有出一个新标准----我不知道,我不关心别人为什么做的不好,我不关心别人的缺点为什么就能成为我不向前看的理由。我不提C++的另 一个原因,是因为我对它的了解程度还不够,说了怕别人笑话。还有说微软一直不让C#在Windows以外平台上支持,这是固步自封吗?这是微软的一贯策略而已, 当然这个策略我也不会认为是好事,但是谁能告诉我为什么这就叫"固步自封"?难道没有看到mono已经越来越引人注目了吗?微软在这方面的确"封闭",但可没有 "固步自封"。
>
> 质疑:Java开发效率虽然比Ruby、Python低,但有丰富的类库、框架和开发工具,更何况Java语言更加严谨,程序员的风格较为一致,减少了许多可能 的犯错机会。综合起来,其效率真的会比C#低吗?
>
> 回应:某个语言"功能强大",便说它"混乱",自己"能力不足"便说是"严谨"。说实话,我认为这是一个很可笑的理由----不过也不是第一次见到这样的说法。从R uby流行开始就有这种说法了,每次我都看得无可奈何,一笑了之。记得之前哪位朋友在园子里说过类似的话:"人们都希望事物发展,但是一旦事物发展让自己感到难 以控制,就会引起恐慌,并对其打压"。虽然当时是在说C#语法的升级,但是现在也恰好可以用在C#与Java方面。至于框架的强大----我知道这一点肯定会被拿出 来提,因此每次说Java"坏话"时总归会强调一下Java这一优势,只可惜似乎又被忽略了。那么我再强调一次,我谈论的是Java语法的生产力,不是Java 平台的生产力----平台上框架的强大,难道语言上就可以不进行改进了吗?难道进行了语言能力上的强化,用它编写的框架就会变少了吗?平台能力就减弱了吗?当一个事 物要用其优势来为自己的劣势做掩饰的时候......老赵就不多说了。
>
> 质疑:"难以辩驳的事实"是从什么数据得来的?太夸张了吧?即使用C和C++,只要对语言足够的熟悉,也不致于寸步难行。若果真Java如此难用,Java早就 被淘汰了,不劳你唱衰了。
>
> 回应:我错了,我举不出"数据",但是以前的文章都已经给过"示例",个中比较可以由大家自行体会。至于"寸步难行"......的确也是我夸张了,我错了,以后不随意 用修辞手法了。至于Java是否难用,是否早该被淘汰,我想说的是,您又犯了"极端化"的逻辑滑坡错误了。Java的确难用,但是我并没有说他难用到以至于无法 推广,无法使用的地步。Java也不是没有过"优雅"的时期,只是到现在来说已经太不够看了,而且还是那四个字"固步自封"。我也从来没说Java平台应该被淘 汰了,老赵还眼馋它们上面那么多项目呢,而且平台的能力并不是一个"语法"一个因素就能"拖垮"的。那么多年下来,大家早有依赖性了,肯定会继续用Java。不 过我想说,如果回到十几年前Java刚出现那会儿,出现一种各方面都和Java一样,唯一的区别便是拥有C#语法的语言,Java能否活到现在还是个问题。
>
> 质疑:"你可以说ruby某个功能1行就能做,而C#要5行,那么我可以补充一个类库,完成1 行的功能。而Java就做不到"为什么Java就做不到呢?能说个理由吗?"这也是为什么现在不少编程语言的书,都喜欢和Java做对比,因为Java的生产力 的确是'难以提高'"----这个说法十分站不住脚。什么语言都与Java比,那是因为Java是当今最流行的语言。等C#在流行度超过了Java,人们自然会找C #比。
>
> 回应:不知道郑同学说这句话的时候有没有看过我那篇文章中给出的链接----没看过也不要紧,现在我再整理一下。那篇文章是《从CSDN的趣味题学C# 3.0》,因为有朋友认为Python做字符串小游戏很顺手,于是老赵也就顺便使用C#实现了一下,体现以下C# 3.0的强大特性。这个字符串游戏挺有意思的,不如郑同学用Java也来玩一下?C# 3.0已经不同以往,引入了Lambda表达式、扩展方法、LINQ语法之后在很多方便已经不熟于Ruby、Python等语言,用来玩玩这种小游戏也丝毫不落 下风。而且您还别认为这只是一个"玩具",就在老赵《高阶函数、委托与匿名方法》这篇文章里就用Java来设法"模拟"了一把C#里轻易实现的功能,不知道郑同 学对此如何感想----求求您不要告诉我这个例子实际生产中没有用,因为这并不是我乱想出来的,在函数式编程语言,或者Parallel Fx中早就大量运用了。我懒得"列举"出来了,原谅我吧。
>
> 至于"作对比"是因为"流行"还是"能力"原因,似乎有点微妙,在这里不多作讨论了。现在呢老赵想多谈谈为什么说"生产力的确是难以提高"----老赵忽然又想到当 时初学Ruby时看的《Everyday Scripting with Ruby》一书中对Ruby的功能大家赞赏,尤其是它的正则表达式配合灵活强大的语法给我留下了无比深刻的印象。当时C#还处于2.0阶段,由于没有Lambd a表达式和扩展方法的特性,C#在这方面远远落后于Ruby。不过不久之前刚好施杨同学刚好需要《实现一个项目需求》,要求把一个字符串中1存在的位置区间表现 出来,例如"00101111110111101110 => 3, 5-10, 12-15, 17-19",这时某位匿名大虾用Ruby给出了一段实现,很好很强大:
>
> i=0;
> "00101111110111101110"
> .scan(/0+|1+/)
> .map
> {|s|
> l=s.length;
> i+=l;
> s.to_i.zero? ? nil : (l>1 ? "#{i-l}-#{i-1}" : "#{i-l}")
> }.compact * ", "
> ...
>
> 阅读更多 >>
楼主想论证的观点是: java语言特性进化缓慢, 导致其生产力低下。
讨论语言特性就是讨论语言特性, 请不要扯到应用、 历史、 商业等方面上去好吗?
很多讨论最后不成样子, 就是因为大家太喜欢旁征博引。
如果楼上想讨论语言的综合比较, 不妨另外开贴?
"我们公司选用的是C++和C#。linux server用C++做,配置页面用C#做。client则有C++的也有C#的"
真有个性,为了搞几个配置页面,专门设台win server?
2009/4/19 OwnWaterloo <ownwa...@gmail.com>:
--
wing
wing9...@gmail.com
On 4/19/09, qiaojie <qia...@gmail.com> wrote:
> 再补充一下,我现在的3D引擎也在逐步跟 .net融合,底层采用C++,上层逻辑用C#,中间层用C++/CLI粘合。
>
>
>
> 2009/4/19 qiaojie <qia...@gmail.com>
>
>> 我不做web,但是据我说知web采用ASP.NET <http://asp.net/>
>> 的也不在少数。企业应用的话,可能会面临许多老系统的集成问题,这些老的系统可能构建与linux/unix和java上,确实不适合迁移到.net<http://xn--ihqs4hpvb5zoyr1bf7b184d2oa.net/>平台上,但是我看不出java
>> 相对于.net <http://xn--6kqx04am6u.net/>在“开发快、工程性好、又够健壮”上的优势。
>> 谈谈我在.net <http://xn--3dst7w237aa.net/>
>> 应用上的一些情况吧,前些年做过一些网游服务器的项目,最初是用java构建的(基于已有的系统做二次的开发),使用体验非常糟糕。后来就全面转向.net<http://xn--15q67dka234fyroyu0duwl.net/>
>> 平台,用下来效果还是非常理想的,在开发效率和稳定性上感觉都不错,其中用.net <http://xn--fiqw3fk98b.net/>
>> 开发的棋牌游戏平台也卖了有十几家客户了,运营的情况都比较错。
>>
>> 目前在做的项目是关于舞台控制系统的,原来的系统比较复杂,有很多子系统,完全基于linux,采用了c/c++/tcltk等混合开发,做了也将近十年了,在健壮性和可维护性上问题多多,原来的开发人员也早已不在,无法再继续开发下去。所以,
>> 新一代系统全面转向了.net <http://xn--4gqqmij22gkvehr0bxe0bwfdt72cjwq.net/>
>> 平台,主要是从降低开发周期和降低开发人员的门槛出发,目前在国内给我感觉小公司很难招到编程能力非常强的人,大部分程序员写不出合格的C/C++代码,而用脚本语言的话那更没有任何可读性和可维护性,要去维护别人写的脚本代码简直是噩梦。但是用C#的话经过一些简单的培训和学习还是基本可以满足要求的。
>>
>>
>>
>>
>> 2009/4/19 wing <wing9...@gmail.com>
>>
>>
>>> java在国内用的最多的地方,都是企业应用,那些应用不需要那么多花哨的语言功能,要求开发快、工程性好、又够健壮,综合这几个,目前还没有可以替代java的,用ruby去做综合业务系统?就算你觉得好,客户愿意接受,也需要很长的时间,和ibm、oracle这样大佬的产品支持,而c/c++对开发人员的要求、工程性、健壮性上都不如java(嗯,很好的程序员可以用c开发出极好的系统,但问题是,没办法找到或没有成本雇佣那么多合格的c程序员)
>>>
>>> 如果是互联网应用,除非支付相关的系统,会考虑使用java,可能用的更多的还是php,这时候语言的性能并重要,因为瓶颈不在这里,个人更喜欢python。。。
>>>
>>>
>>> c#?不讨厌这门语言,选择合适的语言是架构师必须的工作,个人偏好最好不要带进来,但是我真不知道在哪里使用c#,企业应用?嗯,怎么把c#部署在unix上?除非你只给小企业做玩具,否则就别考虑dot
>>> net,想都别想。
>>> 做客户端?嗯,挺不错的,WPF很诱人,但是你要装上200多m的包,比我装个ubuntu还要花上更多的时间,因此我们的客户端最终还是vc。
>>>
>>> 互联网上用c#?那么多的开源产品都是linux的,基于window自己搞一套,除非是确实没能力搞linux,否则吃饱了用window来折磨自己?
>>>
>>>
>>> 仅仅从语言层次的比较,没多大意义,你很容易给java加上一些功能,这不难,sun确实不是一家好公司,如果java在ibm手里,情况会不同,但是仅仅从语言层次比较,并没多大意义,如果这个角度,python、ruby都比c#强,但是从整个应用层面看,感觉C#更是黯淡,抛开偏好而言,我都很难找到地方使用它,当然这仅仅限于我的工作场景,很多地方还是可以用,不过至少说明C#绑定与ms的解决方案在很多地方是不适用的,这是致命伤。
>>>
>>> 从语言喜爱度来说,个人最喜欢的还是c和python,c++过于复杂,java过呆板,c#只不过是强化版的java,但是牺牲了跨平台为代价,做服务端不予考虑,客户端还不如直接动用vc,至少对于我工作过的几家公司,是绝对不会考虑C#做解决方案的,我想这个层面的比较才是最重要的,语言的功能本身还是第二位的。
>>>
>>> --
>>> wing
>>> wing9...@gmail.com
>>> Hope is a good thing, maybe the best of things.
>>>
>>
>>
>
--
On 4月19日, 上午4时55分, "Jeffrey Zhao" <je...@live.com> wrote:
> 写了一篇容易引起吵架的文章,不过还是希望也能和TL的弟兄们一起讨论一下这个问题,喜欢Java的兄弟们多多包涵。(代码上有点小,您可以查看原文)
>
> 事理越辩越明,那么就来详细说说为啥老赵不喜欢Java*语言*
> 原文链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/04/19/why-i-do-not-li...
>
> 最近老赵对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此老 赵这里也继续整理一下我对Java语言的观点,这样大家不必四处查看老赵的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看---- 得,双方在自说自话,这怎能辩明事理,您说呢?
>
> 在这里,老赵借用一下郑晖同学(再此强烈推荐一下他的《冒号课堂》系列,如此好文不该受到如此冷落)在《高阶函数、委托与匿名方法》中留下的评论,这可能也是目 前为止最具体最集中的质疑了。老赵很喜欢,因为可以一条一条的应对,思路清晰。
>
> 质疑:Java固步自封?Java语言从1.0到即将的7.0,每次都有新的语法特征加入。C#作为后辈,起点高,对函数式、动态类型等的支持是Java所没有 的,但不代表Java今后就不支持。
>
> 回应:首先,"Java语言从1.0到7.0,每次都有新语法加入",就能代表它"不固步自封"了吗?固步自封,是说它改进不大,不顺应"历史潮流"。C#的很 多特性Java没有,但不代表Java今后不支持----是啊,的确"能力"是肯定有的,但是有能力而不去做,难道这不是"固步自封"的最好证明?Java 7已经再一次把业界早已强烈要求的闭包特性排除在门外了,只是增加了一些例如"[]式下标"或"使用->而不是get/set访问属性"这样的简单语法糖,看看 每次C#改进的力度,具有可比性吗?
>
> 质疑:此外,Java的小兄弟Groovy也是动态语言,与Java很容易集成。其他的如JRuby、Jython与Java的集成也不难。
>
> 回应:JVM上实现的Groovy、Ruby、Python语言实现,不是我想讨论的内容。我说的是Java语言,由语言的规约来确定。我说Java生产力低下 ,其实只是说Java这门语言在设计上特性缺失过于严重,而不评论所谓JVM的能力。而JVM上可以实现Groovy等高生产力语言,更是证明了JVM的能力是 足够的,而Java有那么好的平台基础,却不愿意发展,这也是我说的"固步自封"的原因之一。
>
> 质疑:要知道,Java有更多的历史包袱,动辄在语法上作大改动,会牵连到大批用户。这是成熟和流行的代价。
>
> 回应:老赵想说的是,"改进语言"并不代表如Rails 2之于Rails 1.2,Python 3之于Python 2.5那样的"破坏性"改变。改进语言只要保持向前兼容,还会有什么问题吗?难道C#1.0到3.0的过程中破坏了以前的程序吗?很明显,C# 1.0中的所有语法到3.0还可以用,而.NET Fx 1.0编写出的应用程序在3.5上也基本能用。这不就是很好的证明吗?这样的升级无论是语言(包括语法和IL/Binary Code级别的指令)、框架/类库、亦或是平台都不会造成问题,为什么在Java上面就成为无法升级的理由了呢?Java为.NET证明了统一托管平台的成功, 由此诞生了.NET,而.NET为Java证明了那么多有生产力的高级语法,社区也吵吵嚷嚷多年----Java又在做什么呢?
>
> 质疑:想想c++吧,十年还没有出一个新标准呢。另外,微软一直不肯提供C#在Windows平台之外的支持,算不算固步自封呢?
>
> 回应:最后说C++,十年还没有出一个新标准----我不知道,我不关心别人为什么做的不好,我不关心别人的缺点为什么就能成为我不向前看的理由。我不提C++的另 一个原因,是因为我对它的了解程度还不够,说了怕别人笑话。还有说微软一直不让C#在Windows以外平台上支持,这是固步自封吗?这是微软的一贯策略而已, 当然这个策略我也不会认为是好事,但是谁能告诉我为什么这就叫"固步自封"?难道没有看到mono已经越来越引人注目了吗?微软在这方面的确"封闭",但可没有 "固步自封"。
>
> 质疑:Java开发效率虽然比Ruby、Python低,但有丰富的类库、框架和开发工具,更何况Java语言更加严谨,程序员的风格较为一致,减少了许多可能 的犯错机会。综合起来,其效率真的会比C#低吗?
>
> 回应:某个语言"功能强大",便说它"混乱",自己"能力不足"便说是"严谨"。说实话,我认为这是一个很可笑的理由----不过也不是第一次见到这样的说法。从R uby流行开始就有这种说法了,每次我都看得无可奈何,一笑了之。记得之前哪位朋友在园子里说过类似的话:"人们都希望事物发展,但是一旦事物发展让自己感到难 以控制,就会引起恐慌,并对其打压"。虽然当时是在说C#语法的升级,但是现在也恰好可以用在C#与Java方面。至于框架的强大----我知道这一点肯定会被拿出 来提,因此每次说Java"坏话"时总归会强调一下Java这一优势,只可惜似乎又被忽略了。那么我再强调一次,我谈论的是Java语法的生产力,不是Java 平台的生产力----平台上框架的强大,难道语言上就可以不进行改进了吗?难道进行了语言能力上的强化,用它编写的框架就会变少了吗?平台能力就减弱了吗?当一个事 物要用其优势来为自己的劣势做掩饰的时候......老赵就不多说了。
>
> 质疑:"难以辩驳的事实"是从什么数据得来的?太夸张了吧?即使用C和C++,只要对语言足够的熟悉,也不致于寸步难行。若果真Java如此难用,Java早就 被淘汰了,不劳你唱衰了。
>
> 回应:我错了,我举不出"数据",但是以前的文章都已经给过"示例",个中比较可以由大家自行体会。至于"寸步难行"......的确也是我夸张了,我错了,以后不随意 用修辞手法了。至于Java是否难用,是否早该被淘汰,我想说的是,您又犯了"极端化"的逻辑滑坡错误了。Java的确难用,但是我并没有说他难用到以至于无法 推广,无法使用的地步。Java也不是没有过"优雅"的时期,只是到现在来说已经太不够看了,而且还是那四个字"固步自封"。我也从来没说Java平台应该被淘 汰了,老赵还眼馋它们上面那么多项目呢,而且平台的能力并不是一个"语法"一个因素就能"拖垮"的。那么多年下来,大家早有依赖性了,肯定会继续用Java。不 过我想说,如果回到十几年前Java刚出现那会儿,出现一种各方面都和Java一样,唯一的区别便是拥有C#语法的语言,Java能否活到现在还是个问题。
>
> 质疑:"你可以说ruby某个功能1行就能做,而C#要5行,那么我可以补充一个类库,完成1 行的功能。而Java就做不到"为什么Java就做不到呢?能说个理由吗?"这也是为什么现在不少编程语言的书,都喜欢和Java做对比,因为Java的生产力 的确是'难以提高'"----这个说法十分站不住脚。什么语言都与Java比,那是因为Java是当今最流行的语言。等C#在流行度超过了Java,人们自然会找C #比。
>
> 回应:不知道郑同学说这句话的时候有没有看过我那篇文章中给出的链接----没看过也不要紧,现在我再整理一下。那篇文章是《从CSDN的趣味题学C# 3.0》,因为有朋友认为Python做字符串小游戏很顺手,于是老赵也就顺便使用C#实现了一下,体现以下C# 3.0的强大特性。这个字符串游戏挺有意思的,不如郑同学用Java也来玩一下?C# 3.0已经不同以往,引入了Lambda表达式、扩展方法、LINQ语法之后在很多方便已经不熟于Ruby、Python等语言,用来玩玩这种小游戏也丝毫不落 下风。而且您还别认为这只是一个"玩具",就在老赵《高阶函数、委托与匿名方法》这篇文章里就用Java来设法"模拟"了一把C#里轻易实现的功能,不知道郑同 学对此如何感想----求求您不要告诉我这个例子实际生产中没有用,因为这并不是我乱想出来的,在函数式编程语言,或者Parallel Fx中早就大量运用了。我懒得"列举"出来了,原谅我吧。
>
> 至于"作对比"是因为"流行"还是"能力"原因,似乎有点微妙,在这里不多作讨论了。现在呢老赵想多谈谈为什么说"生产力的确是难以提高"----老赵忽然又想到当 时初学Ruby时看的《Everyday Scripting with Ruby》一书中对Ruby的功能大家赞赏,尤其是它的正则表达式配合灵活强大的语法给我留下了无比深刻的印象。当时C#还处于2.0阶段,由于没有Lambd a表达式和扩展方法的特性,C#在这方面远远落后于Ruby。不过不久之前刚好施杨同学刚好需要《实现一个项目需求》,要求把一个字符串中1存在的位置区间表现 出来,例如"00101111110111101110 => 3, 5-10, 12-15, 17-19",这时某位匿名大虾用Ruby给出了一段实现,很好很强大:
>
> i=0;
> "00101111110111101110"
> .scan(/0+|1+/)
> .map
> {|s|
> l=s.length;
> i+=l;
> s.to_i.zero? ? nil : (l>1 ? "#{i-l}-#{i-1}" : "#{i-l}")
> }.compact * ", "
> ...
>
> 阅读更多 >>
楼上可以去看看pongda对讨论的几个建议。
btw: 我也是即不用C#也不用java的。
2009/4/19 wing <wing9...@gmail.com>:
On 4月19日, 下午9时16分, wing <wing922w...@gmail.com> wrote:
> 嗯,阁下意思是,不谈语言的应用环境,专门比C#和java的语言特性?这确实是java的弱点,该死的sun都快倒闭了,讨论这些有意义吗?
> 只需要把java没实现的都列出来就行了,如果可以满足C#ER的优越感,也算有意义了,不过我既不用C#,也不用java,就不参与这种剑气之争了。
>
> "我们公司选用的是C++和C#。linux server用C++做,配置页面用C#做。client则有C++的也有C#的"
>
> 真有个性,为了搞几个配置页面,专门设台win server?
>
> 2009/4/19 OwnWaterloo <ownwater...@gmail.com>:
On 4月19日, 上午4时55分, "Jeffrey Zhao" <je...@live.com> wrote:
> 写了一篇容易引起吵架的文章,不过还是希望也能和TL的弟兄们一起讨论一下这个问题,喜欢Java的兄弟们多多包涵。(代码上有点小,您可以查看原文)
>
> 事理越辩越明,那么就来详细说说为啥老赵不喜欢Java*语言*
> 原文链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/04/19/why-i-do-not-li...
>
> 最近老赵对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此老赵这里也继续整理一下我对Java语言的观点,这样大家不必四处查看老赵的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看----得,双方在自说自话,这怎能辩明事理,您说呢?
>
> 在这里,老赵借用一下郑晖同学(再此强烈推荐一下他的《冒号课堂》系列,如此好文不该受到如此冷落)在《高阶函数、委托与匿名方法》中留下的评论,这可能也是目前为止最具体最集中的质疑了。老赵很喜欢,因为可以一条一条的应对,思路清晰。
>
> 质疑:Java固步自封?Java语言从1.0到即将的7.0,每次都有新的语法特征加入。C#作为后辈,起点高,对函数式、动态类型等的支持是Java所没有的,但不代表Java今后就不支持。
>
> 回应:首先,"Java语言从1.0到7.0,每次都有新语法加入",就能代表它"不固步自封"了吗?固步自封,是说它改进不大,不顺应"历史潮流"。C#的很多特性Java没有,但不代表Java今后不支持----是啊,的确"能力"是肯定有的,但是有能力而不去做,难道这不是"固步自封"的最好证明?Java 7已经再一次把业界早已强烈要求的闭包特性排除在门外了,只是增加了一些例如"[]式下标"或"使用->而不是get/set访问属性"这样的简单语法糖,看看每次C#改进的力度,具有可比性吗?
>
> 质疑:此外,Java的小兄弟Groovy也是动态语言,与Java很容易集成。其他的如JRuby、Jython与Java的集成也不难。
>
> 回应:JVM上实现的Groovy、Ruby、Python语言实现,不是我想讨论的内容。我说的是Java语言,由语言的规约来确定。我说Java生产力低下,其实只是说Java这门语言在设计上特性缺失过于严重,而不评论所谓JVM的能力。而JVM上可以实现Groovy等高生产力语言,更是证明了JVM的能力是足够的,而Java有那么好的平台基础,却不愿意发展,这也是我说的"固步自封"的原因之一。
>
> 质疑:要知道,Java有更多的历史包袱,动辄在语法上作大改动,会牵连到大批用户。这是成熟和流行的代价。
>
> 回应:老赵想说的是,"改进语言"并不代表如Rails 2之于Rails 1.2,Python 3之于Python 2.5那样的"破坏性"改变。改进语言只要保持向前兼容,还会有什么问题吗?难道C#1.0到3.0的过程中破坏了以前的程序吗?很明显,C# 1.0中的所有语法到3.0还可以用,而.NET Fx 1.0编写出的应用程序在3.5上也基本能用。这不就是很好的证明吗?这样的升级无论是语言(包括语法和IL/Binary Code级别的指令)、框架/类库、亦或是平台都不会造成问题,为什么在Java上面就成为无法升级的理由了呢?Java为.NET证明了统一托管平台的成功,由此诞生了.NET,而.NET为Java证明了那么多有生产力的高级语法,社区也吵吵嚷嚷多年----Java又在做什么呢?
>
> 质疑:想想c++吧,十年还没有出一个新标准呢。另外,微软一直不肯提供C#在Windows平台之外的支持,算不算固步自封呢?
>
> 回应:最后说C++,十年还没有出一个新标准----我不知道,我不关心别人为什么做的不好,我不关心别人的缺点为什么就能成为我不向前看的理由。我不提C++的另一个原因,是因为我对它的了解程度还不够,说了怕别人笑话。还有说微软一直不让C#在Windows以外平台上支持,这是固步自封吗?这是微软的一贯策略而已,当然这个策略我也不会认为是好事,但是谁能告诉我为什么这就叫"固步自封"?难道没有看到mono已经越来越引人注目了吗?微软在这方面的确"封闭",但可没有"固步自封"。
>
> 质疑:Java开发效率虽然比Ruby、Python低,但有丰富的类库、框架和开发工具,更何况Java语言更加严谨,程序员的风格较为一致,减少了许多可能的犯错机会。综合起来,其效率真的会比C#低吗?
>
> 回应:某个语言"功能强大",便说它"混乱",自己"能力不足"便说是"严谨"。说实话,我认为这是一个很可笑的理由----不过也不是第一次见到这样的说法。从Ruby流行开始就有这种说法了,每次我都看得无可奈何,一笑了之。记得之前哪位朋友在园子里说过类似的话:"人们都希望事物发展,但是一旦事物发展让自己感到难以控制,就会引起恐慌,并对其打压"。虽然当时是在说C#语法的升级,但是现在也恰好可以用在C#与Java方面。至于框架的强大----我知道这一点肯定会被拿出来提,因此每次说Java"坏话"时总归会强调一下Java这一优势,只可惜似乎又被忽略了。那么我再强调一次,我谈论的是Java语法的生产力,不是Java平台的生产力----平台上框架的强大,难道语言上就可以不进行改进了吗?难道进行了语言能力上的强化,用它编写的框架就会变少了吗?平台能力就减弱了吗?当一个事物要用其优势来为自己的劣势做掩饰的时候......老赵就不多说了。
>
> 质疑:"难以辩驳的事实"是从什么数据得来的?太夸张了吧?即使用C和C++,只要对语言足够的熟悉,也不致于寸步难行。若果真Java如此难用,Java早就被淘汰了,不劳你唱衰了。
>
> 回应:我错了,我举不出"数据",但是以前的文章都已经给过"示例",个中比较可以由大家自行体会。至于"寸步难行"......的确也是我夸张了,我错了,以后不随意用修辞手法了。至于Java是否难用,是否早该被淘汰,我想说的是,您又犯了"极端化"的逻辑滑坡错误了。Java的确难用,但是我并没有说他难用到以至于无法推广,无法使用的地步。Java也不是没有过"优雅"的时期,只是到现在来说已经太不够看了,而且还是那四个字"固步自封"。我也从来没说Java平台应该被淘汰了,老赵还眼馋它们上面那么多项目呢,而且平台的能力并不是一个"语法"一个因素就能"拖垮"的。那么多年下来,大家早有依赖性了,肯定会继续用Java。不过我想说,如果回到十几年前Java刚出现那会儿,出现一种各方面都和Java一样,唯一的区别便是拥有C#语法的语言,Java能否活到现在还是个问题。
>
> 质疑:"你可以说ruby某个功能1行就能做,而C#要5行,那么我可以补充一个类库,完成1 行的功能。而Java就做不到"为什么Java就做不到呢?能说个理由吗?"这也是为什么现在不少编程语言的书,都喜欢和Java做对比,因为Java的生产力的确是'难以提高'"----这个说法十分站不住脚。什么语言都与Java比,那是因为Java是当今最流行的语言。等C#在流行度超过了Java,人们自然会找C#比。
>
> 回应:不知道郑同学说这句话的时候有没有看过我那篇文章中给出的链接----没看过也不要紧,现在我再整理一下。那篇文章是《从CSDN的趣味题学C# 3.0》,因为有朋友认为Python做字符串小游戏很顺手,于是老赵也就顺便使用C#实现了一下,体现以下C# 3.0的强大特性。这个字符串游戏挺有意思的,不如郑同学用Java也来玩一下?C# 3.0已经不同以往,引入了Lambda表达式、扩展方法、LINQ语法之后在很多方便已经不熟于Ruby、Python等语言,用来玩玩这种小游戏也丝毫不落下风。而且您还别认为这只是一个"玩具",就在老赵《高阶函数、委托与匿名方法》这篇文章里就用Java来设法"模拟"了一把C#里轻易实现的功能,不知道郑同学对此如何感想----求求您不要告诉我这个例子实际生产中没有用,因为这并不是我乱想出来的,在函数式编程语言,或者Parallel Fx中早就大量运用了。我懒得"列举"出来了,原谅我吧。
>
> 至于"作对比"是因为"流行"还是"能力"原因,似乎有点微妙,在这里不多作讨论了。现在呢老赵想多谈谈为什么说"生产力的确是难以提高"----老赵忽然又想到当时初学Ruby时看的《Everyday Scripting with Ruby》一书中对Ruby的功能大家赞赏,尤其是它的正则表达式配合灵活强大的语法给我留下了无比深刻的印象。当时C#还处于2.0阶段,由于没有Lambda表达式和扩展方法的特性,C#在这方面远远落后于Ruby。不过不久之前刚好施杨同学刚好需要《实现一个项目需求》,要求把一个字符串中1存在的位置区间表现出来,例如"00101111110111101110 => 3, 5-10, 12-15, 17-19",这时某位匿名大虾用Ruby给出了一段实现,很好很强大:
>
> i=0;
> "00101111110111101110"
> .scan(/0+|1+/)
> .map
> {|s|
> l=s.length;
> i+=l;
> s.to_i.zero? ? nil : (l>1 ? "#{i-l}-#{i-1}" : "#{i-l}")
> }.compact * ", "
> 虽然在正则表达式的使用上略有缺陷,不过这段代码使用表达式配合map方法把Ruby的特点实实在在地表现了出来,很有典型意义。老赵一时兴起,也用C#实现了一把类似的:
>
> String.Join(
> ", ",
> Regex.Matches("00101111110111101110", "1+")
> .Cast<Match>()
> .Select(m =>
> m.Length == 1 ?
> m.Index + 1 + "" :
> String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
> .ToArray())
> 嗯嗯,更好地利用了类库中正则表达式的功能,因此整体上更"函数式"一些,也更流畅了一些,不过基本思路是和之前的Ruby实现是一样的。不过好像......还是不够意思?没事,咱可以扩展嘛,简单扩展以后就可以变成这样了:
>
> "00101111110111101110"
> .Scan("1+")
> .Select(
> m => m.Length == 1 ?
> m.Index + 1 + "" :
> String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
> .Join(", ");
> 简简单单扩展10行代码,这边的实现便可以更进一步,这便是语言的能力,C#能做到,Ruby能做到,而老赵的Java造诣只能得出"Java无法实现"的结论了,又不知哪位兄台可以试试看?由于语言能力的缺乏,"无法提高"也已经是"不争的事实"了,还需要更多证据吗?其实老赵最近也常思考一个问题,那就是"语言和框架/类库"之间的关系以及重要性。目前老赵的结论是:语言与框架/类库相辅相成,但总体来说"语言 > 框架/类库",因为框架类库可以在现有语言能力的基础上进行补充,新开发也好,从其他平台进行移植也好,都很难说是"能力"问题。但是语言难以由框架来增强,框架最多只能为"特定场景"增强,无法弥补"语言"上的整体能力缺失。关于这个问题,也欢迎大家和老赵一起来讨论。
>
> 质疑:楼主喜欢C#是你的事情,犯不着一而再、再而三地贬低Java吧?没有人反驳你,是因为园子里大多以.net技术为主,对Java不一定熟悉,而你在这里似乎又是个权威。但那不代表你说的都是正确的。本来你关起门来自说自话,我也不会费神去反驳。但既然放在首页,总要经得起推敲吧?尤其你还是个在园子里有影响的人,说话更要严谨。楼主听惯了太多的恭维话,我的话想必有些刺耳。先别急着反驳我,心平气和地想一想。一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格。
>
> 回应:这可真是"终极质疑"了,直接怀疑老赵的做事方式,我不爱听,必须好好解释一下。我贬低Java不是因为偏见,而是因为Java本身不争气;老赵也在很多公开场合(比如.NET技术大会或MSDN Web Cast的讲座时,还够正式吧)发表对微软的不满(比如Oxite这个绝佳的反面教材);此外,博客园给我带来那么多好处,老赵不也很有唱衰的欲望吗?----这是一贯做事方式而已,不搞"平衡",一个东西某方面不好也不会非要帮它找理由来掩盖。当然我承认,里面可能会夹杂对C#的好感,但是至少我举出自认为非常恰当的实例来证明我的观点。老赵也知道弟兄们对我的厚爱,因此说话最多"偷懒"不会"随意",说出来的话自认非常严谨,欢迎大家推敲,也欢迎郑同学在此继续推推敲敲----不过咱讨论问题不光要"讲道理",还要"摆事实"不是吗?郑同学的质疑啥都好,条理清晰,就是缺少事实依据。对您这点要求不为过吧?这也不光是对您的要求,老赵现在这篇文章也够有诚意了是不?
>
> 老赵其实也做过1年多2年不到的Java程序员,也一直在关注Java(语言和框架)的发展,做出现在这样的判断绝不是图一时之快,而是长久以来积压的不满情绪。老赵同意"一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格"这样的说法,也是这样的做的。之前在QCon上还和一些朋友谈过我对混合编程的实践和热爱呢(我认为"混合编程"绝对是趋势),而作为一个山寨版的Web 2.0架构师,对于其他平台的各种技术必须得有足够多的了解啊。请大家相信老赵,老赵一直在关注其他各种语言/平台/框架(实际上我也一直在结合使用,上次北京俱乐部聚会中我也强调了这方面的重要性),绝对不是井底之蛙----就算还没有变成"王子",不管怎么说也是个井外的蛙呢。
>
> 可惜,对于Java......不用多说了罢。
>
> 咳咳,好累,好累。大家也一起来讨论,也欢迎大家叫上Java的朋友一起来玩,转载到Java的阵地上也无不可。不过有些东西兄弟我说在前头,一些啥"语言不是关键,没有讨论必要","你个死胖子有什么资格评论这些个"或者"MVP鼓吹微软技术不可信"这类问题咱就先放放吧,大家在进行讨论的时候记得切中关键,并且看清老赵已经谈过的东西----咱也要遵循DRY原则嘛。
再者,虽然没有调查数据,但是我在泛泛而谈吗?我总觉得批评之前看完文章是比较基本的要求吧。
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "Jack.Chu" <worki...@gmail.com>
Sent: Monday, April 20, 2009 9:29 AM
To: "TopLanguage" <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 要想令人信服,用数据来证明。泛泛而谈没有意义,沽名钓誉而已。
QCon上请来的国外大牛也谈论过这个问题,我只记得Martin Fowler并不认为动态语言是趋势,静态语言的缺陷明显。具体内容过一段时间应该会公开的。
Java社区讨论ruby真很多吗?那还叫java社区吗?
javaeye的确讨论很多,但是我很长时间以来不认为它是java社区了,这是个较为前沿的技术社区,不仅限于java。
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "wing" <wing9...@gmail.com>
Sent: Monday, April 20, 2009 1:25 PM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 仅仅从语言特性来讨论,我完全赞同楼主的看法,但是这可能并不是java本身的问题,而是sun的问题,事实上何止语言特性,sun的jvm性能,jsp/servlet的设计,最早期ide缺乏,swing、ejb、jsf...
作为我来说,除了开发客户端cs程序外,不会考虑ms的技术,并不是偏见问题,事实上我的水平远未到有资格bs
ms的水准,而是个人习惯、使用工具等等方面,对我来说已经不习惯win的开发习惯了,比如vs,我一直用不顺,即便我写win的c代码,都是用其他编辑器,仅仅用vs来调试,我想很多unxi下c程序员、java程序员也有类似的问题。
如果你让我学习php、perl或者ruby、python,我想我会很乐意,这是不是能解释java - > ruby的迁移问题?
当然如果楼主仅仅只是列举c#比java多了那些东西,而不涉及其他任何推论,那我又离题了,只是我不知道,这些有什么可讨论,java确实没有闭包、没有lambda、没有。。。。,长长的列表,参见javaer自己对jdk7的抱怨吧,这是无可辩驳的事实啊。
动态类型语言的灵活性, 是以”增加出错几率“为代价换取的。
就是在自然语言中,情况也是这样:
严谨的语法, 说话呆板, 但是不容易产生歧义。
灵活的语法相反。
我觉得它们之间应该是有各自的应用场合, 不会在所有场合都存在谁取代谁的必然关系。
对于大型项目使用动态类型语言的经验我没有, 不过老赵有篇文章, 叫《使用强类型的xxx》什么的。 也许能说明弱类型开发方便, 维护就有点噩梦了。
同时, ruby、python它们能动态, 也是靠元数据支持的。
C#、java也带有元数据, 也应该可以通过反射来进行类似的工作。
C#还加入了dynamic类型, 也许就能很大程度上支持动态语言的特性了??
2009/4/20 wing <wing9...@gmail.com>:
我同时订阅了博客园,blogjava, 现在都有想退的冲动 ……
退博客园的一个原因博客园的用户基本也能体会 ……
但是上面也有很多对新技术的讨论, 退了又有点舍不得……
而blogjava …… 真没什么新鲜东西 ……
通常都是2、3天, 看看标题, 然后全部标记为已读 ……
去订个javaeye? 或者别的?
2009/4/20 wing <wing9...@gmail.com>:
2、的确没有考虑效率,这是一个示例,用来说明语言特性而已。
3、这里哪个地方需要重用吗?为什么要考虑非字符串的情况?许多时候是不需要重用的,比如某个时候我说要从User对象里拿到id为5的用户,我直接users.Where(u => u.UserID ==5),你要说年龄大于20,那么
users.Where(u => u.UserID > 20)。不需要特别的重用,或者说,类库+编译器已经帮你重用好了。
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "mocibb" <xiaox...@gmail.com>
Sent: Monday, April 20, 2009 12:14 PM
To: "TopLanguage" <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 不觉得这样的代码好。
精辟! 一针见血!!!
2009/4/20 Mingli Yuan <mingl...@gmail.com>:
--
Any complex technology which doesn’t come with documentation must be the best
available.
Sent from Sydney, Nsw, Australia
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "xxmplus" <xxm...@gmail.com>
Sent: Monday, April 20, 2009 9:24 PM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 最新消息:Java以后就是Oracle的了
--
--
Bearice@Guilin, Guangxi, China
一头宅熊、坚定的反Microsoft主义者、开源支持者、P2P拥护者;
Google粉,FF粉,桂林米粉;翻墙运动爱好者,以及アナキズム;马勒戈壁驻桂办事处干事;最近添加眼镜属性(据说原因是很萌)。
--
http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=java&lang2=gpp&box=1
另外转老孟的一段博客:
"Java的执行速度在JDK1.4的时候达到了这样一个水平,就是对于一个一般水平的开发者来说,他写的C++程序已经不再比对等的Java程序跑得
更快了。随后的JDK 5.0和6.0进一步提高了执行性能,由不同的组织举行的多项评测结果表明,Java与C语言的整体执行效率差距在一倍以内,也
就是说,素以速度著称、并且为了速度放弃了很多东西的C语言,现在比装备齐全的Java只快不到一倍了。这还不算,如果考虑到新的计算环境,C语言的速
度优势有可能仅仅是一个错觉。因为,世界上只有很少的人有能力在多CPU计算平台上用C语言写出又快又正确的大程序,在这些人中间,又只有很少很少的人
有能力用C语言写出一个在大型的、异构的网络环境下能够充分发挥各节点计算能力的大规模并行程序。也就是说,你也许有能力把程序效能提高一倍,从而充分
发挥一台价值6000元人民币的PC的计算潜力,为客户节省1000元钱。但如果是在一个由1000台机器组成的大型异构网络并行计算的环境下,你写的
C程序恐怕性能还会远远低于对应的Java程序,更不要说巨大的后期维护成本,而由此带来的损失可能是1000万或者更多。"
http://blog.csdn.net/myan/archive/2007/01/14/1482614.aspx
之前对F#的感觉不错,只是F#易读难写,的确难写,各种符号太多,掌握不易。
因此也在考虑Boo,其中macro与编译器扩展特性比较吸引眼球。
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "Linker" <linker...@gmail.com>
Sent: Tuesday, April 21, 2009 1:35 AM
2009/4/21 Linker <linker...@gmail.com>:
--
企业应用:
虽然未必需要高级特性,但是高级特性并不代表不稳定,不工程,但是的确大大带来生产力。无论是操作系统、数据库还是.net平台在这方面已经丝毫不差了,无论安全性还是性能。十年前微软服务器端市场占有率几乎为零,那个时候无论*nix还是Java还是Oracle/DB2已经一统天下了,现在中小企业80%以上基于Windows平台,大企业里相当部分,记得是超过一半也是微软平台。
最好例子,纳斯达克,全部微软系统,别说不核心,数据库也是SQL Server。Sql
Server很强大,按照CPU数早就占据数据库市场大半江山,不过实在太便宜,和Oracle基本上是数量级的差距,所以销售额不行。你看看Oracle一直吹得是什么?就是销售额占有比例。微软最大劣势是市场,比如十几年前就稳定的各种银行系统,谁会去动它?但是我相信早晚要动的。国内市场好多银行也开始用微软系统了,看看招商银行网上银行是不是aspx?至于总是被人提到授权的价格,首先Oracle很贵咱已经说过了,难道企业本身不给IBM他们送服务费?微软操作系统授权算多少钱。
最后如果说跨平台,企业真关心跨平台吗?企业关心的是成本和效益,微软的统一平台威力有目共睹,例如Unified Conmmunication,在软件层面做整合,可以运用大量廉价硬件,大大减少成
本花费,随便找一台普通的电话/手机/服务器就可以。而且企业集成目前大都基于标准,不会是问题。
互联网应用:
能力就不说了,MySpace,纳斯达克都是典型案例,绝对足够。
成本可能是个问题,对于普通初创企业来说Sql Server肯定买不起。不过Windows
Server呢?一个OEM才多少钱?一个普通程序员的一个月工资而以,而开公司要招多少人?做多长时间?场地?当然朋友们不用指着企业版报价给我看,我们做互联网应用用Web Edition就可以了(最近微软在打算出更
便宜的)。不要说是“阉割版”,“要用就用功能完整的版本”是国内用户的坏习惯。微软技术的人力成本我不知道,我的感觉成本低,兄弟可以反驳,但是我想肯定没有人会说微软技术人才招聘难,使用昂贵。
互联网应用软件栈很长,asp.net/web server只占一小部分,其他东西很多:缓存,数据库,负载均衡,存储……大部分人比较都是说全部微软平台+全部*unix平台,我认为这是错误的,不合理的,要我我也不会这么做。如果真做大,一个F5的成本,是用*nix服务器就能省下的吗?Squid,Nginx关心后面的服务器到底是Windows还是*nix吗?mysql和memcached关心是asp.net还是ror在连接它吗?其实大家都是基于标准的协议进行通信,各自平台使用各自的binding而以。如果说一台运行着*nix的ror服务器连接另一台tokyo cabinet服务器大家觉得很正常,那么为什么用windows上运行asp.net连接tokyo
cabinet就觉得是天方夜谭了呢?大家走的难道不都是tcp,udp,http这种东西吗?
做技术,就应该各种东西一起上。我做微软平台也很喜欢*nix,相反的话……大家都看得到,呵呵。
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "wing" <wing9...@gmail.com>
Sent: Tuesday, April 21, 2009 11:42 AM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 这和动态语言不是一个级别的,讨论语言最终还是落到应用上,对于很多企业应用,并没有迫切要升级jdk,使用那些漂亮特性的需求,至少国内很多企业应用如此。
对于网络应用,如果瓶颈在于网络带宽,那么用i7代替p4,也不会有性能提高。比
较这样的性能,只能说,语言的性能不是真正的瓶颈。
Linker wrote:
> 从测试中,可以看出Java和写的一般的C程序比,性能已经不相上下。
> (Apache的C版本是有并发设计问题的。)
>
> 2009/4/21 Linker <linker...@gmail.com <mailto:linker...@gmail.com>>
>
> Mina 框架的性能测试
> http://mina.apache.org/performance-test-reports.html
>
>
> 2009/4/21 Linker <linker...@gmail.com
> <mailto:linker...@gmail.com>>
>
> http://mina.apache.org/
> 此框架的性能已经接近Apache的C版本。可见对Java性能的过度担心是
> 不必要的。
> 但是,我想,所有问题归根到底还是人的问题,要不怎么会有人用
> RakNet这种垃圾东东呢?
>
> 2009/4/21 wing <wing9...@gmail.com
> <mailto:wing9...@gmail.com>>
>
> 这和动态语言不是一个级别的,讨论语言最终还是落到应
> 用上,对于很多企业应用,并没有迫切要升级jdk,使用那些漂亮
> 特性的需求,至少国内很多企业应用如此。
> 但是对互联网应用来说,完全不同,楼上很多人说过,动
> 态语言的一些缺点,我承认都存在,但问题是如果在互联网这样的
> 环境,对于大部分应用,这些缺点并不是问题。
> 困境在于,企业级应用未必需要那么多漂亮特性,更看重
> 工程性、厂商支持、稳定这方面的东西,这方面java已经很不错
> 了。而对于互联网应用,更喜欢轻量、灵活的动态语言,当然,企
> 业级应用也会演化的,否则我们还在使用c++,但是这个过程会慢
> 的多,就如cobol还被使用一样。
> 作为企业级应用来说,微软只能做中小企业多,互联网来
> 说,喜欢用c#的只能说是微软控,C#那些漂亮特性,对大企业应用
> 来说,目前需求不大(好吧,我承认这个领域确实不思进取,但事
> 实就是如此),对互联网来说,还有更多好的,所以,除了客户端
> 我会考虑C#,其他方面我不知道在哪里可以用它,有且只有客户
> 端,对我而言就是如此,相对于java的种种缺点,C#只要一个缺点
> 就让我觉得java更可爱----绑定win平台,甚至绑定iis,还绑
> 定。。。。。(别和我说mono那东西)
> 我想在客户端使用C#写wpf,但是200多m的运行库,让我觉
> 得这东西想都别想了,反正我机器上没有这玩意儿,也没有这玩意
> 儿开发的软件。大家可以看看自己机器上有几个dot.net
> <http://dot.net>的软件。
>
> 2009/4/21 Linker <linker...@gmail.com
> <mailto:linker...@gmail.com>>:
> > 嗯,这些图刷新了我的看法。
> > 看来Java的运行速度已经很快了。
> > 比动态语言快很多。
> >
> > 2009/4/21 Shuo Chen <gian...@gmail.com
> <mailto:gian...@gmail.com>>
> >>
> >> Java 现在的效率一点也不低,虽然曾经低过。Java就算跟C++
> 比也最多慢一到两倍,不过内存消耗比较大:
> >>
> >>
> >>
> http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=java&lang2=gpp&box=1
> <http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=java&lang2=gpp&box=1>
> >>
> >> 另外转老孟的一段博客:
> >>
> >> "Java的执行速度在JDK1.4的时候达到了这样一个水平,就是对
> 于一个一般水平的开发者来说,他写的C++程序已经不再比对等的
> Java程序跑得
> >> 更快了。随后的JDK 5.0和6.0进一步提高了执行性能,由不同
> 的组织举行的多项评测结果表明,Java与C语言的整体执行效率差
> 距在一倍以内,也
> >> 就是说,素以速度著称、并且为了速度放弃了很多东西的C语
> 言,现在比装备齐全的Java只快不到一倍了。这还不算,如果考虑
> 到新的计算环境,C语言的速
> >> 度优势有可能仅仅是一个错觉。因为,世界上只有很少的人有
> 能力在多CPU计算平台上用C语言写出又快又正确的大程序,在这些
> 人中间,又只有很少很少的人
> >> 有能力用C语言写出一个在大型的、异构的网络环境下能够充分
> 发挥各节点计算能力的大规模并行程序。也就是说,你也许有能力
> 把程序效能提高一倍,从而充分
> >> 发挥一台价值6000元人民币的PC的计算潜力,为客户节省1000
> 元钱。但如果是在一个由1000台机器组成的大型异构网络并行计算
> 的环境下,你写的
> >> C程序恐怕性能还会远远低于对应的Java程序,更不要说巨大的
> 后期维护成本,而由此带来的损失可能是1000万或者更多。"
> >>
> >> http://blog.csdn.net/myan/archive/2007/01/14/1482614.aspx
> >>
> >> On Apr 20, 10:04 pm, chaoyan ma <chaoyan...@gmail.com
> <mailto:chaoyan...@gmail.com>> wrote:
> >> > 小白路过
> >> > java 效率太低了 好的地方是开源 支持多平台 这些每个人
> 都懂吧
> >
> >
> > --
> > Regards,
> > Linker Lin
> > linker...@gmail.com <mailto:linker...@gmail.com>
> >
>
>
>
> --
> wing
> wing9...@gmail.com <mailto:wing9...@gmail.com>
> Hope is a good thing, maybe the best of things.
>
>
>
>
> --
> Regards,
> Linker Lin
> linker...@gmail.com <mailto:linker...@gmail.com>
>
>
>
>
> --
> Regards,
> Linker Lin
> linker...@gmail.com <mailto:linker...@gmail.com>
>
>
>
>
> --
> Regards,
> Linker Lin
> linker...@gmail.com <mailto:linker...@gmail.com>
还有一点,在互联网上搞技术容易兴起腥风血雨的都是些Geek,微软的东西的确不适合Geek,因为自己动手丰衣足食的能力肯定不如开放平台。因此网络上指责微软的人最多,然后有人跟风,所以我说鄙视微软是一种流行。但我不觉得Geek们能够花那么多心思搞*unix,却搞不定Windows平台,因为我不觉得搞定Windows平台的人就有那么大本事——大家不愿搞而以。
而被微软老大宠坏的开发人员,的确能力比较弱,大家喜欢跟在微软屁股后面搞些新鲜事物,遇到吵架自然无法力敌。这当然不是好事,也不能推托微软的责任。微软是把技术作简单了,我们不能说这就是邪恶吧?更何况,这也根本和微软技术平台的能力没有什么关系。
早上有人留言给我说“我只是希望java的产品能够越来越广,能够垄断。开发效率低?开发效率低,代表要聘请很多的人,扩大就业机会。语言不进步?语言不进步,代表程序员的知识比较稳定,不需要总去接触新的东西,从而和建筑工程师一样。花十几年学东西,剩下的几十年,看看图纸收钱。体系复杂?体系复杂代表进入门槛高,可以不让街头的什么培训学校培训一年出来的人就能和我们平起平坐。”
没错,对他来说的确可能是好事,不过这真是正确的发展方向?
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "Jeffrey Zhao" <je...@live.com>
Sent: Tuesday, April 21, 2009 12:17 PM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
>
在 09-4-19,Jeffrey Zhao<je...@live.com> 写道:
> 写了一篇容易引起吵架的文章,不过还是希望也能和TL的弟兄们一起讨论一下这个问题,喜欢Java的兄弟们多多包涵。(代码上有点小,您可以查看原文)
>
> 事理越辩越明,那么就来详细说说为啥老赵不喜欢Java*语言*
> 原文链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/04/19/why-i-do-not-like-java.html
>
>
> 最近老赵对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此老赵这里也继续整理一下我对Java语言的观点,这样大家不必四处查看老赵的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看——得,双方在自说自话,这怎能辩明事理,您说呢?
>
> 在这里,老赵借用一下郑晖同学(再此强烈推荐一下他的《冒号课堂》系列,如此好文不该受到如此冷落)在《高阶函数、委托与匿名方法》中留下的评论,这可能也是目前为止最具体最集中的质疑了。老赵很喜欢,因为可以一条一条的应对,思路清晰。
>
> 质疑:Java固步自封?Java语言从1.0到即将的7.0,每次都有新的语法特征加入。C#作为后辈,起点高,对函数式、动态类型等的支持是Java所没有的,但不代表Java今后就不支持。
>
> 回应:首先,“Java语言从1.0到7.0,每次都有新语法加入”,就能代表它“不固步自封”了吗?固步自封,是说它改进不大,不顺应“历史潮流”。C#的很多特性Java没有,但不代表Java今后不支持——是啊,的确“能力”是肯定有的,但是有能力而不去做,难道这不是“固步自封”的最好证明?Java
> 7已经再一次把业界早已强烈要求的闭包特性排除在门外了,只是增加了一些例如“[]式下标”或“使用->而不是get/set访问属性”这样的简单语法糖,看看每次C#改进的力度,具有可比性吗?
>
> 质疑:此外,Java的小兄弟Groovy也是动态语言,与Java很容易集成。其他的如JRuby、Jython与Java的集成也不难。
>
> 回应:JVM上实现的Groovy、Ruby、Python语言实现,不是我想讨论的内容。我说的是Java语言,由语言的规约来确定。我说Java生产力低下,其实只是说Java这门语言在设计上特性缺失过于严重,而不评论所谓JVM的能力。而JVM上可以实现Groovy等高生产力语言,更是证明了JVM的能力是足够的,而Java有那么好的平台基础,却不愿意发展,这也是我说的“固步自封”的原因之一。
>
> 质疑:要知道,Java有更多的历史包袱,动辄在语法上作大改动,会牵连到大批用户。这是成熟和流行的代价。
>
> 回应:老赵想说的是,“改进语言”并不代表如Rails 2之于Rails 1.2,Python 3之于Python
> 2.5那样的“破坏性”改变。改进语言只要保持向前兼容,还会有什么问题吗?难道C#1.0到3.0的过程中破坏了以前的程序吗?很明显,C#
> 1.0中的所有语法到3.0还可以用,而.NET Fx
> 1.0编写出的应用程序在3.5上也基本能用。这不就是很好的证明吗?这样的升级无论是语言(包括语法和IL/Binary
> Code级别的指令)、框架/类库、亦或是平台都不会造成问题,为什么在Java上面就成为无法升级的理由了呢?Java为.NET证明了统一托管平台的成功,由此诞生了.NET,而.NET为Java证明了那么多有生产力的高级语法,社区也吵吵嚷嚷多年——Java又在做什么呢?
>
> 质疑:想想c++吧,十年还没有出一个新标准呢。另外,微软一直不肯提供C#在Windows平台之外的支持,算不算固步自封呢?
>
> 回应:最后说C++,十年还没有出一个新标准——我不知道,我不关心别人为什么做的不好,我不关心别人的缺点为什么就能成为我不向前看的理由。我不提C++的另一个原因,是因为我对它的了解程度还不够,说了怕别人笑话。还有说微软一直不让C#在Windows以外平台上支持,这是固步自封吗?这是微软的一贯策略而已,当然这个策略我也不会认为是好事,但是谁能告诉我为什么这就叫“固步自封”?难道没有看到mono已经越来越引人注目了吗?微软在这方面的确“封闭”,但可没有“固步自封”。
>
> 质疑:Java开发效率虽然比Ruby、Python低,但有丰富的类库、框架和开发工具,更何况Java语言更加严谨,程序员的风格较为一致,减少了许多可能的犯错机会。综合起来,其效率真的会比C#低吗?
>
> 回应:某个语言“功能强大”,便说它“混乱”,自己“能力不足”便说是“严谨”。说实话,我认为这是一个很可笑的理由——不过也不是第一次见到这样的说法。从Ruby流行开始就有这种说法了,每次我都看得无可奈何,一笑了之。记得之前哪位朋友在园子里说过类似的话:“人们都希望事物发展,但是一旦事物发展让自己感到难以控制,就会引起恐慌,并对其打压”。虽然当时是在说C#语法的升级,但是现在也恰好可以用在C#与Java方面。至于框架的强大——我知道这一点肯定会被拿出来提,因此每次说Java“坏话”时总归会强调一下Java这一优势,只可惜似乎又被忽略了。那么我再强调一次,我谈论的是Java语法的生产力,不是Java平台的生产力——平台上框架的强大,难道语言上就可以不进行改进了吗?难道进行了语言能力上的强化,用它编写的框架就会变少了吗?平台能力就减弱了吗?当一个事物要用其优势来为自己的劣势做掩饰的时候……老赵就不多说了。
>
> 质疑:“难以辩驳的事实”是从什么数据得来的?太夸张了吧?即使用C和C++,只要对语言足够的熟悉,也不致于寸步难行。若果真Java如此难用,Java早就被淘汰了,不劳你唱衰了。
>
> 回应:我错了,我举不出“数据”,但是以前的文章都已经给过“示例”,个中比较可以由大家自行体会。至于“寸步难行”……的确也是我夸张了,我错了,以后不随意用修辞手法了。至于Java是否难用,是否早该被淘汰,我想说的是,您又犯了“极端化”的逻辑滑坡错误了。Java的确难用,但是我并没有说他难用到以至于无法推广,无法使用的地步。Java也不是没有过“优雅”的时期,只是到现在来说已经太不够看了,而且还是那四个字“固步自封”。我也从来没说Java平台应该被淘汰了,老赵还眼馋它们上面那么多项目呢,而且平台的能力并不是一个“语法”一个因素就能“拖垮”的。那么多年下来,大家早有依赖性了,肯定会继续用Java。不过我想说,如果回到十几年前Java刚出现那会儿,出现一种各方面都和Java一样,唯一的区别便是拥有C#语法的语言,Java能否活到现在还是个问题。
>
> 质疑:“你可以说ruby某个功能1行就能做,而C#要5行,那么我可以补充一个类库,完成1
> 行的功能。而Java就做不到”为什么Java就做不到呢?能说个理由吗?“这也是为什么现在不少编程语言的书,都喜欢和Java做对比,因为Java的生产力的确是‘难以提高’”——这个说法十分站不住脚。什么语言都与Java比,那是因为Java是当今最流行的语言。等C#在流行度超过了Java,人们自然会找C#比。
>
> 回应:不知道郑同学说这句话的时候有没有看过我那篇文章中给出的链接——没看过也不要紧,现在我再整理一下。那篇文章是《从CSDN的趣味题学C#
> 3.0》,因为有朋友认为Python做字符串小游戏很顺手,于是老赵也就顺便使用C#实现了一下,体现以下C#
> 3.0的强大特性。这个字符串游戏挺有意思的,不如郑同学用Java也来玩一下?C#
> 3.0已经不同以往,引入了Lambda表达式、扩展方法、LINQ语法之后在很多方便已经不熟于Ruby、Python等语言,用来玩玩这种小游戏也丝毫不落下风。而且您还别认为这只是一个“玩具”,就在老赵《高阶函数、委托与匿名方法》这篇文章里就用Java来设法“模拟”了一把C#里轻易实现的功能,不知道郑同学对此如何感想——求求您不要告诉我这个例子实际生产中没有用,因为这并不是我乱想出来的,在函数式编程语言,或者Parallel
> Fx中早就大量运用了。我懒得“列举”出来了,原谅我吧。
>
> 至于“作对比”是因为“流行”还是“能力”原因,似乎有点微妙,在这里不多作讨论了。现在呢老赵想多谈谈为什么说“生产力的确是难以提高”——老赵忽然又想到当时初学Ruby时看的《Everyday
> Scripting with
> Ruby》一书中对Ruby的功能大家赞赏,尤其是它的正则表达式配合灵活强大的语法给我留下了无比深刻的印象。当时C#还处于2.0阶段,由于没有Lambda表达式和扩展方法的特性,C#在这方面远远落后于Ruby。不过不久之前刚好施杨同学刚好需要《实现一个项目需求》,要求把一个字符串中1存在的位置区间表现出来,例如“00101111110111101110
> => 3, 5-10, 12-15, 17-19”,这时某位匿名大虾用Ruby给出了一段实现,很好很强大:
>
> i=0;
> "00101111110111101110"
> .scan(/0+|1+/)
> .map
> {|s|
> l=s.length;
> i+=l;
> s.to_i.zero? ? nil : (l>1 ? "#{i-l}-#{i-1}" : "#{i-l}")
> }.compact * ", "
> 虽然在正则表达式的使用上略有缺陷,不过这段代码使用表达式配合map方法把Ruby的特点实实在在地表现了出来,很有典型意义。老赵一时兴起,也用C#实现了一把类似的:
>
> String.Join(
> ", ",
> Regex.Matches("00101111110111101110", "1+")
> .Cast<Match>()
> .Select(m =>
> m.Length == 1 ?
> m.Index + 1 + "" :
> String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
> .ToArray())
> 嗯嗯,更好地利用了类库中正则表达式的功能,因此整体上更“函数式”一些,也更流畅了一些,不过基本思路是和之前的Ruby实现是一样的。不过好像……还是不够意思?没事,咱可以扩展嘛,简单扩展以后就可以变成这样了:
>
> "00101111110111101110"
> .Scan("1+")
> .Select(
> m => m.Length == 1 ?
> m.Index + 1 + "" :
> String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
> .Join(", ");
> 简简单单扩展10行代码,这边的实现便可以更进一步,这便是语言的能力,C#能做到,Ruby能做到,而老赵的Java造诣只能得出“Java无法实现”的结论了,又不知哪位兄台可以试试看?由于语言能力的缺乏,“无法提高”也已经是“不争的事实”了,还需要更多证据吗?其实老赵最近也常思考一个问题,那就是“语言和框架/类库”之间的关系以及重要性。目前老赵的结论是:语言与框架/类库相辅相成,但总体来说“语言
>>
> 框架/类库”,因为框架类库可以在现有语言能力的基础上进行补充,新开发也好,从其他平台进行移植也好,都很难说是“能力”问题。但是语言难以由框架来增强,框架最多只能为“特定场景”增强,无法弥补“语言”上的整体能力缺失。关于这个问题,也欢迎大家和老赵一起来讨论。
>
> 质疑:楼主喜欢C#是你的事情,犯不着一而再、再而三地贬低Java吧?没有人反驳你,是因为园子里大多以.net技术为主,对Java不一定熟悉,而你在这里似乎又是个权威。但那不代表你说的都是正确的。本来你关起门来自说自话,我也不会费神去反驳。但既然放在首页,总要经得起推敲吧?尤其你还是个在园子里有影响的人,说话更要严谨。楼主听惯了太多的恭维话,我的话想必有些刺耳。先别急着反驳我,心平气和地想一想。一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格。
>
> 回应:这可真是“终极质疑”了,直接怀疑老赵的做事方式,我不爱听,必须好好解释一下。我贬低Java不是因为偏见,而是因为Java本身不争气;老赵也在很多公开场合(比如.NET技术大会或MSDN
> Web
> Cast的讲座时,还够正式吧)发表对微软的不满(比如Oxite这个绝佳的反面教材);此外,博客园给我带来那么多好处,老赵不也很有唱衰的欲望吗?——这是一贯做事方式而已,不搞“平衡”,一个东西某方面不好也不会非要帮它找理由来掩盖。当然我承认,里面可能会夹杂对C#的好感,但是至少我举出自认为非常恰当的实例来证明我的观点。老赵也知道弟兄们对我的厚爱,因此说话最多“偷懒”不会“随意”,说出来的话自认非常严谨,欢迎大家推敲,也欢迎郑同学在此继续推推敲敲——不过咱讨论问题不光要“讲道理”,还要“摆事实”不是吗?郑同学的质疑啥都好,条理清晰,就是缺少事实依据。对您这点要求不为过吧?这也不光是对您的要求,老赵现在这篇文章也够有诚意了是不?
>
> 老赵其实也做过1年多2年不到的Java程序员,也一直在关注Java(语言和框架)的发展,做出现在这样的判断绝不是图一时之快,而是长久以来积压的不满情绪。老赵同意“一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格”这样的说法,也是这样的做的。之前在QCon上还和一些朋友谈过我对混合编程的实践和热爱呢(我认为“混合编程”绝对是趋势),而作为一个山寨版的Web
> 2.0架构师,对于其他平台的各种技术必须得有足够多的了解啊。请大家相信老赵,老赵一直在关注其他各种语言/平台/框架(实际上我也一直在结合使用,上次北京俱乐部聚会中我也强调了这方面的重要性),绝对不是井底之蛙——就算还没有变成“王子”,不管怎么说也是个井外的蛙呢。
>
> 可惜,对于Java……不用多说了罢。
>
>
>
> 咳咳,好累,好累。大家也一起来讨论,也欢迎大家叫上Java的朋友一起来玩,转载到Java的阵地上也无不可。不过有些东西兄弟我说在前头,一些啥“语言不是关键,没有讨论必要”,“你个死胖子有什么资格评论这些个”或者“MVP鼓吹微软技术不可信”这类问题咱就先放放吧,大家在进行讨论的时候记得切中关键,并且看清老赵已经谈过的东西——咱也要遵循DRY原则嘛。
最直接的例子:OpenOffice主要是用C++写的。作为Sun做的产品,如果能够用Java做,肯定会用Java做的。
不用Java的原因是什么?主要就是Java太慢了。
任何语言都可以设计一些测试用例来说明他多快,这些专门设计的用例不能说明任何问题。
用C++写个函数:
int add(int a, int b)
{
for (int i = 0; i < 1000000; i++)
{
string ss = "i am foolish code";
}
return (a+b);
}
肯定比正常写的Java代码要更慢。
说Java快的同学,举一个Java快的大型应用出来吧。
Java开发效率比C++高,这是比较靠谱的。说Java运行比C++快,就不太靠谱了。
从我的实践中来看,我看到的Java应用大部分都是慢得跟蜗牛一样的。虽然很多应用即使慢得跟蜗牛一样也不要紧。
On 4月21日, 上午7时38分, Shuo Chen <giantc...@gmail.com> wrote:
> Java 现在的效率一点也不低,虽然曾经低过。Java就算跟C++比也最多慢一到两倍,不过内存消耗比较大:
>
> http://shootout.alioth.debian.org/u32q/benchmark.php?test=all〈=ja...
语言和平台为什么不能分开讨论?
Java语言提高会给平台带来坏处吗?
C#的高级特性是解决“特别问题”的吗?
Java十几年来改进那么少,现在这是对Java的强求吗?
因为“开源”(也没开源多少时间),所以不进取,进取少就是应该的吗?
再退n步讲,我也是第一次写这样的文章,也不是三天两头拿出来说一次——还是,事实上根本就不应该指出一个缺点狠狠批评一番?
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "李博渊" <nju.b...@gmail.com>
Sent: Tuesday, April 21, 2009 8:36 AM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 对于这个问题,我认为不能仅从语言的一辆个侧面来讨论语言的好坏。老赵一直强调java语法上的略势,并且咬住这点不放,有种"死盯别人缺点不放的感觉"。每种语言都有自己的优缺点,平台,语法,个个方面都是语言的一部分,评价语言应当综合考虑。
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "Eric.Wang" <wangsh...@gmail.com>
Sent: Tuesday, April 21, 2009 11:29 AM
To: "TopLanguage" <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 你被孟岩忽悠了。
你被孟岩忽悠了。
最直接的例子:OpenOffice主要是用C++写的。作为Sun做的产品,如果能够用Java做,肯定会用Java做的。
不用Java的原因是什么?主要就是Java太慢了。
2009/4/21 Linker <linker...@gmail.com>:
--
Any complex technology which doesn’t come with documentation must be the best
available.
Sent from Sydney, Nsw, Australia
我觉得很奇怪,我的文章从头至尾没有透露过“如果新作项目不应该选择Java”的意思,只是在批评Java语言。我文章里多次强调JVM的能力,Java开源项目的重要性,为什么好像总是被视而不见?再者……
语言和平台为什么不能分开讨论?
Java语言提高会给平台带来坏处吗?
C#的高级特性是解决“特别问题”的吗?
Java十几年来改进那么少,现在这是对Java的强求吗?
因为“开源”(也没开源多少时间),所以不进取,进取少就是应该的吗?
再退n步讲,我也是第一次写这样的文章,也不是三天两头拿出来说一次——还是,事实上根本就不应该指出一个缺点狠狠批评一番?
可是大家似乎都在说
楼主你不应该不喜欢Java“语言”
个人喜好大家都要管么?
另:
我也是用c#的
但是我也来说说我喜欢的java语言中的一个特性吧:
java需要在会抛出异常的方法上标注异常,我觉得这个要是c#也有该多好
这样我就不会忘记加try块了
2009/4/21 xxmplus <xxm...@gmail.com>
而是,一个事物固然有其优点,却让别人连其缺点都不能讨厌了,这个道理说不通,尤其是根本没有人要一棒子打倒整个事物。
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "Doyle" <doyl...@gmail.com>
Sent: Tuesday, April 21, 2009 2:38 PM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 楼主知识告诉大家 为啥不喜欢Java“语言”
我知道有家不小的公司,正在把后台系统从Java切换到C++。原因就是原先Java的后台系统太慢了。不要问我细节,我也不清楚细节。
On 4月21日, 下午2时22分, "Jeffrey Zhao" <je...@live.com> wrote:
> 如果比单台机器的计算密集应用,当然比不过C++,关键是这样的应用越来越少了。
>
> Jeffrey Zhao
> Blog:http://jeffreyzhao.cnblogs.com
> Twitter:http://twitter.com/jeffz_cn
>
> --------------------------------------------------
> From: "Eric.Wang" <wangshaoq...@gmail.com>
楼主知识告诉大家 为啥不喜欢Java“语言”
并且是在告诉大家为什么不喜欢的详细版本
可是大家似乎都在说
楼主你不应该不喜欢Java“语言”
个人喜好大家都要管么?
2009/4/21 qiaojie <qia...@gmail.com>:
2009/4/21 qiaojie <qia...@gmail.com>:
> exception specification是最傻的异常设计了,我最讨厌的就是java的这个特性
>
>
>
> 2009/4/21 Doyle <doyl...@gmail.com>
>>
>> 楼主知识告诉大家 为啥不喜欢Java"语言"
>> 并且是在告诉大家为什么不喜欢的详细版本
>>
>> 可是大家似乎都在说
>> 楼主你不应该不喜欢Java"语言"
>>
>> 个人喜好大家都要管么?
>>
>> 另:
>>
>> 我也是用c#的
>> 但是我也来说说我喜欢的java语言中的一个特性吧:
>> java需要在会抛出异常的方法上标注异常,我觉得这个要是c#也有该多好
>> 这样我就不会忘记加try块了
>>
>> 2009/4/21 xxmplus <xxm...@gmail.com>
>> >
>> > 这位朋友是不是中毒了??怎么一条接一条不停的发
>> >
>> > 2009/4/21 Linker <linker...@gmail.com>:
>> > > http://www.evermoresw.com.cn/webch/index.jsp
>> > > 大家看一下这个office.
>> > > 速度比WPS还要快一些。
>> > > 2009/4/21 Kenny Yuan <yuank...@gmail.com>
>> > >>
>> > >> 不想掺和别的,就想指出这个例子不靠谱
>> > >>
>> > >>
>> > >>
>> > >> OpenOffice是SUN买来的,不是SUN做的(不过SUN又被买了,哈,高兴)。"作为Sun做的产品,如果能够用Java做,肯定会用Java做的"这一条也太过武断了......
>> > >>
>> > >>
>> > >> 2009/4/21 Eric.Wang <wangsh...@gmail.com>
>> > >>>
>> > >>> 你被孟岩忽悠了。
>> > >>>
>> > >>> 最直接的例子:OpenOffice主要是用C++写的。作为Sun做的产品,如果能够用Java做,肯定会用Java做的。
>> > >>> 不用Java的原因是什么?主要就是Java太慢了。
>> > >>>
>> > >>
>> > >>
>> > >>
>> > >> --
>> > >> Kenny Yuan
>> > >> C++, UI, LISP, MMA, Psychology and Automobile.
>> > >> BLOG: CS巴别塔(Computer Science Babel)
>> > >> URL: http://blog.csdn.net/yuankaining/
>> > >>
>> > >>
>> > >
>> > >
>> > >
>> > > --
>> > > Regards,
>> > > Linker Lin
>> > > linker...@gmail.com
>> > >
>> >
>> >
>> >
>> > --
>> > Any complex technology which doesn't come with documentation must be the
>> > best
>> > available.
>> > Sent from Sydney, Nsw, Australia
>
>
--
2009/4/21 七夜 七连星 <qqw...@gmail.com>:
--
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "wing" <wing9...@gmail.com>
Sent: Tuesday, April 21, 2009 4:33 PM
To: <pon...@googlegroups.com>
Subject: [TL] Re: 详细说说为啥我不喜欢Java“语言”{讨论}{技术}{Java}
> 你说的c++是linux下的,还是window下的?如果linux下c程序员,我觉得即便讨厌java,肯定是因为慢或者其他什么,怎么也不会因为难用的原因吧,win下面我就不奇怪了。
2009/4/21 Jeffrey Zhao <je...@live.com>:
Jeffrey Zhao
Blog: http://jeffreyzhao.cnblogs.com
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "wing" <wing9...@gmail.com>
Sent: Tuesday, April 21, 2009 4:43 PM
我不知道exception specification存在的意义是什么?
会抛出什么异常是根据实现来决定的,通常定义接口的时候我不知道
也不关心会采用什么实现,所以无法确定会抛出什么异常,要把异常
写到接口函数里这不是一件非常糟糕的事情么?
是的,这个争论由来已久,很早以前就关注过。
经过我多年的编程实践,我得出的结论就是Checked Exception is Bull Shit.
Checked Exception可以增加程序可靠性的观点完全是扯淡, Checked
Exception只能让程序员抓狂,最后完全放弃使用。
早知道使用者会把这些异常转化成RuntimeException,那当初还要
设计这些异常类干嘛呢?还要在函数的签名里写上这些Checked Exception干嘛呢?在库里直接抛
RuntimeException不是更节省大家的时间么?
这个例子是不太恰当。虽然StarOffice后来是被SUN买下并继续开发的,但是最初确实是Star公司创建的。有个有趣的事实,Star公司想创
造一个跨平台的Office,但是他们选用了C++,而没有选用“号称可以跨平台”的Java。这不是很有趣吗?
前面有位童鞋举永中Office的例子,我对永中Office不太熟悉。不过应该不算成功的软件吧?希望熟悉永中Office的童鞋来介绍一下。
有人说:"它不是完全用Java实现的,从帮助中可以看出永中Office利用了Gtk+(一个跨平台的GUI库,用c实现)"。Java在永中
Office里面扮演的更多的可能是胶水的角色。
我用过几个Java写的桌面程序的,基本上都比较笨重。也接触过几个Java的后台,基本上都比较慢。这可能是我见识比较少的原因。能否请哪位童鞋列举
几个轻快的Java桌面,或者高效的Java后台,让我有机会扩展视野?
Mina不要了,http://mina.apache.org/performance-test-reports.html的测试我认为是在测硬件
IO。
On 4月21日, 下午2时26分, Kenny Yuan <yuankain...@gmail.com> wrote:
> 不想掺和别的,就想指出这个例子不靠谱
>
> OpenOffice是SUN买来的,不是SUN做的(不过SUN又被买了,哈,高兴)。“*作为Sun做的产品,如果能够用Java做,肯定会用Java做的*
> ”这一条也太过武断了……
>
> 2009/4/21 Eric.Wang <wangshaoq...@gmail.com>
On 4月21日, 下午5时45分, qiaojie <qiao...@gmail.com> wrote:
> 假设你要设计一个库,在库定义了完整的异常类层次,然后在函数签名上写上了会抛出什么什么异常,
> 从设计库的角度看是非常的完美,哪个函数会抛什么异常就定义的清清楚楚。然后有人开始用你的
> 库做业务逻辑了,当他调用库的某函数的时候碰上了xxx exception,但是他又不知道如何处理这个异
> 常,当然更不好意思在代码里try catch里了什么都不管,于是就只好改一下函数签名把异常往外抛,
> 然后依赖这个函数的其他代码又没法正常编译了,只好逐层往上修改,一直改到让人抓狂。于是大家
> 想了个办法,把Checked Exception统统catch了以后包装成RuntimeException抛出去,这下总算把
> Checked Exception引入的代码修改问题限制到最小范围内了,但是增加了一些丑陋的低层次try catch
> 代码,这还不算,原来库的设计者用心良苦设计的异常类层次全都退化成了原始的RuntimeException,
> 让设计良好的异常类全都打了水漂。早知道使用者会把这些异常转化成RuntimeException,那当初还要
> 设计这些异常类干嘛呢?还要在函数的签名里写上这些Checked Exception干嘛呢?在库里直接抛
> RuntimeException不是更节省大家的时间么?
> 所以Checked Exception存在的意义就是让库的设计者抛出一沱BullShit,然后让使用者去抓狂,最后用
> RuntimeException收拾这沱BullShit的。
>
> 2009/4/21 居振梁 <juzhenli...@gmail.com>
>
> > 我自己是倾向于写提供机制的程序,这种情况下会多一点Checked Exception,但是做纯粹的业务处理时,非常头痛这些Checked
> > Exception,因此我都在库里把他们转成RuntimeException。
>
> > 其实很多讨论最后都归结为“视情况或环境而定”。有时候真的想问一下,讨论的必要性何在?(当然这本身也是一个讨论)
> > 老赵的这篇文章也是如此。矛盾的是,论题本身的内容可以脱了具体的环境,但正要得出一个结论却不能脱离具体的环境。
> > 因而随着参与人数的增加而难以控制讨论的方向。
>
> > 这就是我不喜欢看到跑题的原因,甚至,引用一句话:回帖不看帖的人太恐怖了。
>
> > 2009/4/21 qiaojie <qiao...@gmail.com>
2009/4/21 Eric.Wang <wangsh...@gmail.com>:
--
我试过用Eclipse写代码,不太习惯这只是个人问题,可以慢慢熟悉,但是Eclipse缺乏一个好的UI编辑器。我们选Java或者C#是希望快速
的写一些公司自己使用的UI 程序(client and web),这些程序用C++做不划算。Eclipse慢尚可忍受,UI编辑器不够强大就不满
足我们的需要了。
C#和Java都不够快,所以写office基本上都是用C++来写(永中office另议)。
我接触的几个java后台应用都是金融电信方面的,对外提供socket方式的服务。响应慢,处理能力低。
On 4月21日, 下午6时06分, wing <wing922w...@gmail.com> wrote:
> Eclipse如何,虽然现在确实越做越大了,不过不装插件的话,不算慢,我觉得比vs好用,只是个人习惯,不要又引起新的争论。
> 没有跨平台的需要,是不会用java来写客户端的,office也不是c#写的吧?java的后台比较慢,指什么应用?如果web应用,瓶颈一般不会在这里的,吃内存倒是真的。
>
> 2009/4/21 Eric.Wang <wangshaoq...@gmail.com>:
>
>
>
> > @@~
>
> > 这个例子是不太恰当。虽然StarOffice后来是被SUN买下并继续开发的,但是最初确实是Star公司创建的。有个有趣的事实,Star公司想创
> > 造一个跨平台的Office,但是他们选用了C++,而没有选用"号称可以跨平台"的Java。这不是很有趣吗?
>
> > 前面有位童鞋举永中Office的例子,我对永中Office不太熟悉。不过应该不算成功的软件吧?希望熟悉永中Office的童鞋来介绍一下。
> > 有人说:"它不是完全用Java实现的,从帮助中可以看出永中Office利用了Gtk+(一个跨平台的GUI库,用c实现)"。Java在永中
> > Office里面扮演的更多的可能是胶水的角色。
>
> > 我用过几个Java写的桌面程序的,基本上都比较笨重。也接触过几个Java的后台,基本上都比较慢。这可能是我见识比较少的原因。能否请哪位童鞋列举
> > 几个轻快的Java桌面,或者高效的Java后台,让我有机会扩展视野?
>
> > Mina不要了,http://mina.apache.org/performance-test-reports.html的测试我认为是在测硬件
> > IO。
>
> > On 4月21日, 下午2时26分, Kenny Yuan <yuankain...@gmail.com> wrote:
> >> 不想掺和别的,就想指出这个例子不靠谱
>
> >> OpenOffice是SUN买来的,不是SUN做的(不过SUN又被买了,哈,高兴)。"*作为Sun做的产品,如果能够用Java做,肯定会用Java做的*
> >> "这一条也太过武断了......
>
> >> 2009/4/21 Eric.Wang <wangshaoq...@gmail.com>
>
> >> > 你被孟岩忽悠了。
>
> >> > 最直接的例子:OpenOffice主要是用C++写的。作为Sun做的产品,如果能够用Java做,肯定会用Java做的。
> >> > 不用Java的原因是什么?主要就是Java太慢了。
>
> >> --
> >> Kenny Yuan
> >> C++, UI, LISP, MMA, Psychology and Automobile.
> >> BLOG: CS巴别塔(Computer Science Babel)
> >> URL:http://blog.csdn.net/yuankaining/
>
> --
> wing
--
wing
wing9...@gmail.com
OpenOffice是SUN买来的,不是SUN做的(不过SUN又被买了,哈,高兴)。“作为Sun做的产品,如果能够用Java做,肯定会用Java做的”这一条也太过武断了……
如果你设计一个f, 需要表达:
直接调用者或者间接调用者需要处理——或者说只需关心——某些错误。
其他的错误, 由被调用者——f——处理。
那么exception specification是最适合不过的手段了。
exception specification是将这种责任区分, 直接写入“源代码”的一种强有力的方式。
而非写入文档这种间接的方式。
如果你设计一个f, 需要表达:
我(被调用者f)不知道会发生什么错误,直接调用者或者间接调用者必须处理全部错误。
那么, 不用exception specification就是了。
它的存在, 是为了满足上面的表达, 而不是这个表达。
同时, java还提供了另一个有力的表达: checked exception。
当需要表达:直接调用者必须立即处理这个错误的时候, 可以采用。
只是, checked exception容易被滥用, 造成:
直接调用者其实并不知道如何处理错误, 只能勉强抓出, 再重新抛出给间接调用者。
说实话, 我到希望exception specification和checked exception都被加入C++。
后者没有, 可能是担心被滥用, 需要它的情况确实不多。
前者在C++中也有缺陷:
1. 它是运行时检查, 而非java编译时检查
2. 当违反——因为是运行时检查——时, 应该采取何种措施, 标准描述并不清晰
3. 当exception specification和函数指针, 成员函数指针和在一起时, 那才叫混乱……
PS: 我对java经验不多, 没写过多少java代码。
如果对exception specification的理解有误, 还望qiaojie兄和其他兄弟指点。
比如:在java和C#中
1. exception specification是否可以省略?
2. exception specification是否是编译时检查,运行时绝不会违反?
3. java和C#都有平台调用机制
那么如果被调用函数抛出异常(这是被调用端的失误, 不应该将异常抛出模块边界)
java和C#将如何处理? 将其封装成java和C#认识的,并且在exception specification中列出的异常???
2009/4/21 qiaojie <qia...@gmail.com>:
java之父还非要强调其”可以增加程序可靠性“ ……
一个完全不考虑程序员感受的偏执狂……
2009/4/21 qiaojie <qia...@gmail.com>: