Hello World
Spiga

Why Java Sucks and C# Rocks(4):泛型

2010-05-17 16:23 by 老赵, 3807 visits

Java 5.0和C# 2.0发布于同一年,各自添加了一个重要的特性:泛型。泛型可以让程序员针对泛化的数据类型编写相同的算法,这大大增强了两种语言的类型系统及抽象能力。不过即便是这看似相近的功能,Java和C#两者在语言实现和功能上也有很明显的区别,这甚至会形成编程方式上的不同。在这里可能需要事先打声招呼,因为在这个特定的话题上,语言和运行时的确是密不可分的,因此在这篇文章中我会涉及到相对较多的“运行平台”上的比较,而这点在整个系列中是我尽量避免的。不过您请放心,只此一次,欢迎监督。

Java的泛型:Type Erasure

Java语言里的泛型完全是由编译器实现的,JVM在这里不提供任何支持。因此Java泛型是所谓的“类型擦除(Type Erasure)式泛型”,因为代码中的类型信息在编译成bytecode之后便完全消失了,被“擦除”了。如果要说的具体一些,那便是说如下的代码:

// Java
public class MyHashMap<TKey, TValue> {
    private HashMap<TKey, TValue> m_map = new HashMap<TKey, TValue>();
    
    public TValue get(TKey key) {
        return this.m_map.get(key);
    }
    
    public void put(TKey key, TValue value) {
        this.m_map.put(key, value);
    }

    public static void main(String[] args) {
        MyHashMap<String, Integer> map = new MyHashMap<String, Integer>();
        map.put("Hello", 5);
        int i = map.get("Hello");
    }    
}

上面的代码简单地没有意义:我们开发了一个MyHashMap泛型类,封装了标准库中HashMap泛型类,并暴露出简单的get和set两个泛型方法。不过,这段代码在编译成bytecode之后其实就变成了下面的样子:

// Java
public class MyHashMap {
    private HashMap m_map = new HashMap();
    
    public Object get(Object key) {
        return this.m_map.get(key);
    }
    
    public void put(Object key, Object value) {
        this.m_map.put(key, value);
    }

    public static void main(String[] args) {
        MyHashMap map = new MyHashMap();
        map.put("Hello", 5);
        int i = (Integer)map.get("Hello");
    }    
}

事实上,这两段代码可以说是等价的。那么编译器在这里做了哪些事情呢?首先,它把标准库中的HashMap还原成本来面目:键和值都是Object类型的容器。同时,我们编写的MyHashMap类的泛型信息也消失了。最后,在使用MyHashMap的地方编译器为我们添加了类型转化的代码。这种做法的确在代码层面保证了类型安全,不过在运行时层面上和以前没有任何区别。

Type Erasure的缺点

有人说,如何实现有什么大不了的,只要Java语言也实现了和C#一样的泛型不就行了么。只可惜,Java语言在实际上带来了许多限制。如果您是一个C#开发人员,可能很难想象以下Java代码都是不合法的:

// Java
public class MyClass<E> {
    public static void myMethod(Object item) {
        if (item instanceof E) { // Compiler error 
            ...
        }
        E item2 = new E(); // Compiler error 
        E[] iArray = new E[10]; // Compiler error 
    }
}

由于JVM不提供对泛型的支持,因此对于JVM上支持泛型的语言,如Scala,这方面的压力就完全落在编译器身上了。而且,由于这些语言以JVM为底,Type Erasure会影响JVM平台上几乎所有语言。以Scala为例,它的模式匹配语法可以用来判断一个变量的类型:

// Scala
value match {
    case x:String => println("Value is a String")
    case x:HashMap[String, Int] => println("Value is HashMap[String, Int]")
    case _ => println("Value is not a String or HashMap[String, Int]")
}

猜猜看,如果value变量是个HashMap[Int, Object]类型的对象,上面的代码会输出什么结果呢?由于JVM的Type Erasure特性,以上代码输出的却是“Value is HashMap[String, Int]”。这是因为在运行期间JVM并不包含泛型的类型信息,HashMap[K, V]即是HashMap,无论HashMap[String, Int]还是HashMap[Int, Object]都是HashMap,JVM无法判断不同泛型类型的集合之间有什么区别。不过还好,Scala编译器遇到这种情况会发出警告,程序员可以了解这些代码可能会出现的“误会”,一定程度上避免了违反程序员直觉的情况发生。

但是Java的泛型实现相对于C#来说更明显的区别可能是在性能上。.NET 2.0引入了泛型之后,带来的显著优势之一便是性能上的提高。因为在写一些容器类,如List<T>,Dictionary<TKey, TValue>的时候,无须像Java平台里那样不断的拆箱装箱,这方面真正的泛型容器无疑具有性能优势。这篇文章便进行了这方面的讨论和比较。在评论中有人说,这方面可以通过使用特定类型的容器,如IntFloatHashMap来改进性能。但显然,这除了引入更多代码造成复杂度的提高之外,更加丧失了“泛型”本身的最大优势:抽象能力、泛化能力。试想,我们又该如何为不同的非泛型容器统一增加一些处理方法呢?而在.NET中,我们只要针对Dictionary<TKey, TValue>写通用的代码即可,运行时会为我们生成最优化的执行代码

之前我也谈到过,使用值类型在某些场景下——如并行计算时,对性能的影响十分显著。这方面JVM多核计算的专家Dr. Cliff Click也表达过类似的观点,您可以在他的文章中搜索“Value Types”相关的内容。不过,这更像是前一篇谈Java基础类型时该讨论的问题,现在权当一个补充吧。

C#与Java的常见编程方式

在C#中,我们时常会写一些这样的辅助方法:

// C#
public static class Retriever
{
    public static T TryGet<T>(IDictionary<string, object> dict, string key, T defaults)
    {
        object value;
        if (dict.TryGetValue(key, out value) && value is T)
        {
            return (T)value; 
        }
        else
        {
            return defaults;
        }
    }
}

由于.NET 2.0在运行时层面上对泛型提供了支持,因此事实上TryGet方法在调用时,泛型类型T也是方法体内获得的信息之一。于是,我们便可以在C#中便可以判断一个对象的类型是不是T。那么上面这代码可以如何使用呢?

// C#
var dict = new Dictionary<string, object>();

int intValue = Retriever.TryGet(dict, "UserID", 0);
string userName = Retriever.TryGet(dict, "UserName", "");

这个辅助方法常用于与JSON的互操作中。例如客户端传递过来一个JSON字符串,我们只能将其反序列成“字符串到Object类型的映射”,因为在C#或Java这种强类型语言中,我们只有这样才能统一数字、时间或是布尔值等多种类型。这使我们在获取值的时候,必须不断和“类型”打交道。还好,我们在TryGet里封装了“尝试获取”、“判断类型”、“返回默认值”等逻辑,便可以让代码变得简洁优雅了许多(只可惜现在还在谈C# 2.0,如果有了3.0的扩展方法之后会更漂亮)。

当然,这方面还是动态语言的优势比较明显。当然,C# 4.0的动态支持在这方面也可以大显神威——不过这是后话,暂且按下不表。

同样,在Java中我们无法创建泛型类型的数组:

// Java
public static <T> T[] convert(List<T> list) {
    T[] array = new T[list.size()]; // Compiler error
    ...
}

为了创建数组,我们必须将元素的类型(类似于.NET中的Type对象)作为方法的参数传进去:

// Java
public static <T> T[] convert(List<T> list, Class<T> componentType) {
    T[] array = (T[])Array.newInstance(componentType, list.size());
    ...
}

于是在使用时:

// Java
List<Integer> list = ...
Integer[] array = convert(list, Integer.class);

对于我这种习惯写C#代码的人来说,这又何必这么麻烦呢?幸运的是,在Java语言中,Class本身可以进行泛型约束,这样我们至少可以保证传入的Class对象和list的元素是相同类型的(否则无法编译通过)。这样的麻烦之处还有许多,例如最近我写的项目中有一个类似于克隆对象的方法,假设现也在Java中实现一下吧:

// Java
public static <T> T clone(T entity) {
    T copy = new T(); // Compiler error
    ...
}

只可惜我们无法这样创建一个泛型对象,我们最多只能这么做:

// Java
public static <T> T clone(T entity) throws Exception {
    T copy = (T)type.newInstance();
    ...
}

那么在C#中呢?我们完全可以添加针对构造函数的“泛型约束”来实现优雅高效(避免了反射)的代码:

// C#
public static T Clone<T>(T entity) where T : new()
{
    T copy = new T();
    ...
}

不过在这里,我认为更重要的一点是,一但添加了泛型约束,用户便必须传入一个拥有默认构造函数的类型作为泛型参数,否则无法编译通过。这点在Java语言中并没有类似的东西,这意味着如果传入的类型不包含默认构造函数的话,就只能在运行时由newInstance方法抛出异常了。

事实上,在Java中“显示”传入类型参数的做法,不仅仅是冗余和麻烦,我认为这也会导致一些API设计上的问题。我在想会不会有这种情况,例如某个泛型方法,它在v1.0中的实现不需要从调用折那里得到一个类型信息,但是在v2.0的开发过程中,API的编写者忽然发现这个方法需要得到泛型类型的具信息才能进行功能上的改进——那么这时能否加上额外的参数呢?当然不行,这样就破坏了公开的API,会造成不兼容的情况出现。这实在是种难以两全的做法。

关于Java的Type Erasure特性,以及基于C#与.NET中泛型特性的常见编程模式(如泛型类型字典),在我之前的文章中也有过讨论,您可以将其(以及评论)作为本文的补充。

相关文章

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

79 条回复

  1. roy_hu
    199.111.222.*
    链接

    roy_hu 2010-05-17 19:32:58

    C#的泛型是不是F#作者Don Syme设计的?

  2. Snake
    120.42.197.*
    链接

    Snake 2010-05-18 01:06:03

    借此机会了解一下JAVA:-)

  3. 老赵
    admin
    链接

    老赵 2010-05-18 01:23:29

    @roy_hu

    嗯,Don Syme是主要设计者。

  4. 链接

    yiliang053674 2010-05-18 01:35:39

    作为一个C#er,由于各种原因要成为javaer,会不会很失败。

  5. _龙猫
    124.160.91.*
    链接

    _龙猫 2010-05-18 01:51:06

    Java这个做法看起来是有点偷懒的嫌疑。

  6. 老赵
    admin
    链接

    老赵 2010-05-18 02:02:23

    @_龙猫

    肯定不会是偷懒,而是权衡的结果。我以前认为是兼容方面的考虑,不过有牛人告诉我其实也并没有兼容。这我就不明白了,希望有高人可以指点一下。

    不过就结果来说,Java的泛型从设计和能力上,从C#或.NET的角度看来都是很不足的——更多问题我会在以后谈协变逆变时进行讨论。

  7. 老赵
    admin
    链接

    老赵 2010-05-18 02:04:09

    @yiliang053674: 作为一个C#er,由于各种原因要成为javaer,会不会很失败。

    失败不失败一般和干什么无关,和怎么干有关。就像我如果现在去写Java代码,我觉得我也不会是个失败的人。当然,我会很不爽,我会努力推动周围环境摆脱Java语言,如果推动不了那么就自己进行调整,比如换个事儿做什么的,呵呵。

  8. lee51076008
    222.82.90.*
    链接

    lee51076008 2010-05-18 03:29:56

    继续支持.......

  9. 架构之美
    123.129.249.*
    链接

    架构之美 2010-05-18 05:25:39

    我个人觉得老赵应该是一个底层的coder。目光不仅短浅,并且还特别固步自封。

    所有的事物,没有最好;只有最合适。编程语言也是一样,你觉得不行的,90%的情况下可能是不适合你的环境,另外10%是你对他不够足够的了解。

    Java作为一门编程语言来说,他可以跨平台运行,就意味着可以使用免费的linux。对于一个企业来说,就意味着可以省掉很多服务器的操作系统的license费用。

    Windows呢,从2K up 2k3,再up Server 8哪一项不要钱?

    另外,我觉得你的本意不是贬低Java。而是凤姐作风,引来围观吧?

  10. norm
    207.46.55.*
    链接

    norm 2010-05-18 05:51:10

    @架构之美

    请问.net为何不能在linux上跑?

  11. norm
    207.46.55.*
    链接

    norm 2010-05-18 06:03:28

    @架构之美

    另外我觉得你是个回帖不看贴的人,老赵这里关注的是语言本身。

  12. 老赵
    admin
    链接

    老赵 2010-05-18 06:04:13

    @架构之美

    全在说套话,没点新意,我估计你连操作系统的License价格都没有去了解过,我是做过Web 2.0项目的,做过了解和比较的,知道哪些贵哪些不贵。如果你真的觉得Java语言适合哪些环境,那么就具体说说?

    你说Java作为编程语言用就可以跨平台运行,那么为什么不可以去用Scala?我的目的写得那么明白:希望Java程序员转向Scala,不知道你是回帖不看贴,还是真的看不懂——还是以您的广阔的眼界还不知道有Scala这门语言吧?否则就不会连Java语言和Java平台/JVM都区分不开了。

    最后一点你也说错了,我的本意就是贬低Java,这点我毫不隐瞒。引来围观自然是需要的,否则我写给谁看?

  13. 链接

    clk_z 2010-05-18 07:26:29

    @架构之美

    如果老赵的目光短浅,不思进取,那么阁下就是鼠目寸光抑或是没有光,典型NC精锐分子。

    如果要反对请拿出真凭实据,但是从你的回复就可以看出来,你TM连文章都不看一眼就开始揣测人家的意图,你真是高瞻远瞩,心胸宽广啊!!

    引用老赵的话(大意):一个要靠.net程序员来帮你开拓视野的JAVA程序员,你是不是觉得很爽?

  14. 链接

    晓强 2010-05-18 08:08:38

    我低调几句,我是从java转向C#的,当然刚开始选java也是被人忽悠了,多多NB,多多强,微软那个.NET的鸟东西都是抄袭java的,于是乎我折腾啊折腾,折腾了N久,基于一个朴素的想法,我想做个小东西放到桌面上自己用用,Oh,My God!那速度真是惊人(就这都干号称C++的运行速度).--当时还在上学呢.后来一个偶然的机会结识了一些搞.NET的人,了解了一下C#语言,觉得语言上C#很优美,我以前在Java遇到的不爽的地方现在都爽了,于是乎格了系统装Visual Studio.

    我用C#不为别的,就因为它用着爽.我的感觉是:人在玩计算机,不是计算机在玩人.C#给我玩计算机的感觉.

  15. 老赵
    admin
    链接

    老赵 2010-05-18 08:21:54

    @晓强

    桌面应用到真不是Java的强项,这也怪不得Java语言或是Java平台。

  16. 老菜
    222.134.33.*
    链接

    老菜 2010-05-18 09:15:27

    啥人都有啊,楼上有个人本来就不懂吧,还不知道掩饰和低调,被人围攻了不爽吧。 别人围攻你,我就不点名了,同情一下弱者。 不知道你咋想的啊,啥都不懂,就敢出来回帖。回帖也就罢了,还特高调,直接敢说老赵目光短浅。你发狂也就罢了,可是连老赵的帖子你都没看(或者没看懂?),就敢口出狂言,啥人都有啊。

    先做人,再做事。你这做人风格,不敢恭维啊。你刚毕业吗?一般来说,刚毕业的人喜欢说自己精通这个,精通那个,什么都会。

  17. 链接

    装配脑袋 2010-05-18 09:30:11

    老赵这次比较怎么没有以前那么细致入微啊~ 是因为泛型涉及了CLR所以不能多说吗

  18. 老赵
    admin
    链接

    老赵 2010-05-18 10:00:26

    @装配脑袋

    有点想回避CLR的意思。关于泛型和类型系统,我以后会在结合协变逆变比较一下,脑袋觉得哪些地方可以再深入或细致一下嘛?

  19. youngz
    220.181.61.*
    链接

    youngz 2010-05-18 11:46:23

    5月的排名出炉了,java在n年后被c拉下榜首。

  20. 老赵
    admin
    链接

    老赵 2010-05-18 12:11:28

    @youngz

    上个月就这样了,不过我倒不关心这个。

  21. 横刀天笑
    125.39.108.*
    链接

    横刀天笑 2010-05-18 17:26:30

    @老赵

    对于泛型,那个《编程之魂》里貌似Anders有简单的一点说辞。

    是滴,这篇文章觉得写的不够细致,不牵扯CLR,还可以提提.Net的这种泛型具备类型推断的能力,而类型推断对后面的Linq等又是何其的有用,而Linq等几乎又带来新的编程风格...... 这个应该说说~~

  22. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-19 00:54:32

    @老赵

    全在说套话,没点新意,我估计你连操作系统的License价格都没有去了解过,我是做过Web 2.0项目的,做过了解和比较的,知道哪些贵哪些不贵。如果你真的觉得Java语言适合哪些环境,那么就具体说说?

    1. 你做过web2.0项目的网站的地址是什么?我看看是体验如何
    2. 无数人都比较过了,所以互联网上.net的网站不多
    3. 适合的环境很多,比如说.net现在稍微有名的框架都是java转过来的

    你说Java作为编程语言用就可以跨平台运行,那么为什么不可以去用Scala?我的目的写得那么明白:希望Java程序员转向Scala,不知道你是回帖不看贴,还是真的看不懂——还是以您的广阔的眼界还不知道有Scala这门语言吧?否则就不会连Java语言和Java平台/JVM都区分不开了。

    我感觉老赵你是个人英雄主义的开发,你有没有考虑过一个团队转向scala会遇到什么风险?

    你有没有看到那个编程排名的第一位为什么是C,而不是C++?

  23. 老赵
    admin
    链接

    老赵 2010-05-19 01:23:55

    @mcpssx

    我的很失败,不好意思,其实没脸给您看,现在也已经不做了,您暂时就先看看大众点评网吧?还有,成本和用户体验有什么关系?体验完全是设计和前端的活,我的网站前端做的无比差,几乎只支持IE。互联网上.NET网站不多是因为Server贵?找个靠谱点的分析来看看?你愿意的话我可以写文章分析一下为什么Windows Server对于Web 2.0系统来说并不贵。

    至于.NET稍有名的框架都是Java转过来的,首先这个命题是不对的,只是.NET的框架您不关心而已,现在我能想到的Java转来的框架也就是NHibernate了。其次就算NHibernate是Java转过来的,你知道现在有Fluent NHibernate所以使用起来方便无数吗?你以前说Hiberante的XML配置麻烦,因此有人开发了Fluent NHibernate,于是就可以几乎不需要配置,要配置也是使用漂亮的Fluent Interface。这就是语言限制发展的最好实例。Java限制的编程模型多了去了,基于C#可以实现漂亮的Reactive Programming,Async Programming,Functional Programming,Java都不行。当然你一定会说,这些东西没有意义,我无论说什么你都可以说没有意义。至于是不是真的没有意义,我以后的文章就会谈的。

    我不是个人英雄主义开发,我知道迁移到Scala会带来一定风险,但是我认为这是推动的时候了,不推动的话永远不会有人转向Scala,永远停留在Java上面。我从第一篇文章里就开始强调,我是在推动,没有说所有人应该“立即”使用Scala,否则就是XXX,但是我认为一定要考虑起来了。所以我批评Java,指出Java的问题所在。

    PS:其实你说的东西已经重复无数次了,我也已经回复无数次了,我不想继续和您纠缠下去。我一直希望中立的考虑问题,但是您的逻辑一直十分偏激,甚至在我不断强调之下,您还是不愿对一些东西,如LINQ或Fluent NHibernate进行必要的了解。这让我感到没有意思,因此我还是像以前说过的那样,我就有选择地回复您的说法吧。至于您想知道某些东西有没有意义,我在以后的文章里会详细讨论的,别着急。

  24. 老赵
    admin
    链接

    老赵 2010-05-19 01:27:56

    @横刀天笑: 是滴,这篇文章觉得写的不够细致,不牵扯CLR,还可以提提.Net的这种泛型具备类型推断的能力,而类型推断对后面的Linq等又是何其的有用,而Linq等几乎又带来新的编程风格...... 这个应该说说~~

    类型推断不是.NET的,是C#的,而且Java里也有类型推断,而且为“Java已有的功能”服务似乎已经足够了(其实从上面的代码里应该也能看的出来吧)。至于更细致的内容,自然要放到谈Lambda表达式和LINQ再说了,而且会拉上Java进行比较的。

    现在才刚刚踏入Java 5.0和C# 2.0时代,还在04-05年呢,别急,呵呵。

  25. 架构之美
    123.129.249.*
    链接

    架构之美 2010-05-19 03:10:34

    从市场占有率来讲,从大公司使用的语言来讲。java哪一项不是遥遥挺先?这年头,spring.net、nhibernate框架难道从java中移植过去的?

    java开源免费框架多如牛毛,替公司省了多少钱?

    Java语言本身确实发展有些慢,但是这并没有使java的光芒被遮盖。scale我了解得比你更多。

    Java要解决的不是for each之类的,而是一整套解决方案。Java只出标准,一般不出实现。不象ms,既当裁判又当运动员。

    光IIS和windows的漏洞就足够抛弃.net语言了。

    老赵,你继续努力,慢慢吠~

  26. 架构之美
    123.129.249.*
    链接

    架构之美 2010-05-19 03:21:35

    17.95%的份额和4.779%份额就说明了一切,群众眼睛是雪亮的。

    跟你说过多少次,Java要解决的不是foreach。

    HP、IBM、Bea、Oracle哪一个不是用java。

    没有听说Oracle要支持c#。。

    开发者大会上要讲的也只会讲Java或者与Java相关的。出去讲c#?会被人笑话的~

    招的一个.Net的程序,4年以上,多线程都不太懂。搞一个WebService异步调用,以为调用async就OK了。结果大并发情况下,服务器收到的数据全部一样。

    .Net封装的内容太多,源代码都不提供。。有啥bug在里面还不知道。

  27. 架构之美
    123.129.249.*
    链接

    架构之美 2010-05-19 03:27:27

    以后不能叫你老赵,叫你老凤就行了。喜被人围观!

    长得丑不是你的错,出来吓人就是你的不对了。

  28. 老赵
    admin
    链接

    老赵 2010-05-19 03:44:30

    @架构之美

    你既然知道有Scala这个东西,那就是在故意忽视我的观点了。我否定了Java的全部了?我否定的只是Java语言,我承认Java的生态环境很好,但你也无法因此来说明Java语言的缺点和弱势它就不是问题了。我针对的也是这点而已,我建议您先去看看我一开始的文章。

    您的逻辑也很古怪,居然用Oracle技术大会上只谈Java来说明Java比C#好。这纯粹是搞笑了,微软大会还只谈.NET不谈Java呢,这难道说明Java不如.NET?我都没有这样认为。至于语言份额之类的,比的是大环境,和我比的这个纵向方面是没有太大参考价值的。比如我以后也会Scala的优势,它在语言排行榜中占什么地方?但是它就是比Java强大,能够、也应该代替Java,排行关我什么事情。

    至于您说Hibnernate框架云云,我最乐意谈这个,因为这就是Java语言限制框架发展的最好示例,这点上面我已经谈过了。.NET方面因为C#优秀的语言特性,也出了许多开源框架,只是被您故意忽略掉了而已,而那些是Java语言方面不会有的。语言能力不够,没法移植过去。你知道.NET里面哪些是国际标准吗?你知道.NET哪些核心代码是公开的吗?

    总而言之,您是为了反驳我而反驳,我不参与这种无聊的活动。

  29. 链接

    clk_z 2010-05-19 03:46:34

    @架构之美

    典型的NC,你再牛B又如何? 老赵这一系列说过一句让你JAVA转C#了?JVM转.NET了? 人也只是比较了一下两个语言之间的优缺点,而人家也拿出事实证明了确实JAVA相对C#是落后的!

    那么你不同意你就应该拿出证据说JAVA不落后于C# 就说这个泛型吧,如果你觉得JAVA的实现更好更牛B,请你拿出事实依据,光扯理论光看什么排名有个毛用!

    明眼人都能看出来其实老赵是有一种恨铁不成钢的意思,希望JAVA更好的发展,但是JAVA却一直‘不思进取’!

    你这个SB一上来就一堆理论,连这点都看不懂,说你SB其实已经很恭维你了,不否认你是牛人,但是,更可能的是丫写代码已经把脑子写出问题了!

  30. billlo
    221.4.199.*
    链接

    billlo 2010-05-19 03:46:38

    @架构之美

    建議寫blog文反駁老趙,可以從你的觀點分析嘛. 每個語言的變更都有它身的考慮的.

  31. 老赵
    admin
    链接

    老赵 2010-05-19 03:47:52

    @billlo: 建議寫blog文反駁老趙,可以從你的觀點分析嘛. 每個語言的變更都有它身的考慮的.

    这种做法我万分支持,我也很想了解一下Java语言的设计思路,这方面我也一直有很多疑惑。

  32. 老赵
    admin
    链接

    老赵 2010-05-19 03:49:38

    @clk_z: 都能看出来其实老赵是有一种恨铁不成钢的意思,希望JAVA更好的发展,但是JAVA却一直‘不思进取’!

    类似的观点其实我已经说的很明白了,以前的文章里我也写过:Java语言让我远离Java平台,但Scala却让我有回到Java平台的冲动。我不信有谁无法理解这句话的含义。

  33. 架构之美
    123.129.249.*
    链接

    架构之美 2010-05-19 03:56:49

    @clk_z

    请注意你的用词。.net的程序员都是你这模样吗?

  34. 链接

    clk_z 2010-05-19 03:58:15

    @架构之美

    我只是说出了我自己想说的!和我是不是.NET程序员没有半毛钱关系! 那我是不是可以这样说:难道JAVA程序员的理解能力都你这样的么?

  35. 架构之美
    123.129.249.*
    链接

    架构之美 2010-05-19 03:59:08

    请问.net为何不能在linux上跑?

    请问你敢在生产环境上跑吗?

  36. 老赵
    admin
    链接

    老赵 2010-05-19 03:59:35

    楼上两位弟兄,不要纠缠用词了,双方都注意点就行了。上面两条回复我保留,以下再偏题的话就删了啊,呵呵。

  37. 架构之美
    123.129.249.*
    链接

    架构之美 2010-05-19 04:01:07

    Java有maven2非常优秀的项目管理工具,请问.Net有吗?

  38. 老赵
    admin
    链接

    老赵 2010-05-19 04:04:37

    @架构之美: 请问你敢在生产环境上跑吗?

    我2年多前就开始在生产环境上用了,现在开发的项目也有一大部分是基于mono的,希望一段时间以后有机会能让你了解到。使用mono的系统还有很多,比如Second Life之类的,都是生产环境,mono官网上都有。mono已经出现在各技术大会上了,包括微软组织的MIX10。现在社区里的项目基本都是支持mono的。说mono不成熟很正常,这是个相对的概念,但关键是要给出具体原因,否则就只是FUD。

    看我简介,我是打算推广mono的。话说我不是在组织.NET技术会议嘛,我会考虑加上这方面内容的,您感兴趣的话也欢迎到时候来交流一下。

  39. 老赵
    admin
    链接

    老赵 2010-05-19 04:08:02

    @架构之美: Java有maven2非常优秀的项目管理工具,请问.Net有吗?

    maven2是不错,我以前写.NET项目也尝试过一段时间,后来就用Team City了。这也是一个关键,你认为Java和.NET是分离的,我认为它们是合作的。看我的简介:致力于开源社区与微软平台的组合优化。

    此外,就算你举100个Java的项目出来,也无法证明Java语言不该被Scala替代。不知道我这样说你是否明白了。吃饭,回头再来讨论。

  40. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-19 04:11:36

    我的很失败,不好意思,其实没脸给您看,现在也已经不做了,您暂时就先看看大众点评网吧?还有,成本和用户体验有什么关系?体验完全是设计和前端的活,我的网站前端做的无比差,几乎只支持IE。互联网上.NET网站不多是因为Server贵?找个靠谱点的分析来看看?你愿意的话我可以写文章分析一下为什么Windows Server对于Web 2.0系统来说并不贵。

    1. 我说的体验不是光指用户体验
    2. 不是因为server贵,那就更说明问题了。这就说明是架构和语言有缺点。

    至于.NET稍有名的框架都是Java转过来的,首先这个命题是不对的,只是.NET的框架您不关心而已,现在我能想到的Java转来的框架也就是NHibernate了。其次就算NHibernate是Java转过来的,你知道现在有Fluent NHibernate所以使用起来方便无数吗?你以前说Hiberante的XML配置麻烦,因此有人开发了Fluent NHibernate,于是就可以几乎不需要配置,要配置也是使用漂亮的Fluent Interface。这就是语言限制发展的最好实例。Java限制的编程模型多了去了,基于C#可以实现漂亮的Reactive Programming,Async Programming,Functional Programming,Java都不行。当然你一定会说,这些东西没有意义,我无论说什么你都可以说没有意义。至于是不是真的没有意义,我以后的文章就会谈的。

    1. 让你误解了。我说的框架不准确,我其实是指lucent之类的东西。比如你现在用全文检索你用什么实现?
    2. 我看过fluent hibernate, 不过我连hibernate都不赞成。我一贯反对把关系模型又转成orm模型,多此一举。

    我不是个人英雄主义开发,我知道迁移到Scala会带来一定风险,但是我认为这是推动的时候了,不推动的话永远不会有人转向Scala,永远停留在Java上面。我从第一篇文章里就开始强调,我是在推动,没有说所有人应该“立即”使用Scala,否则就是XXX,但是我认为一定要考虑起来了。所以我批评Java,指出Java的问题所在。

    因为你这个理由不足以推动大家转型。你看看从c到java,从c到脚本语言都是一种很不同的风格。Scala虽然语法特性更多,但是

    1. 越多的东西越难掌握,对团队而言尤其如此。如果不是革命性的变化,很难替代现有的东西
    2. 衡量一个语言生产力的不光是语法,还有很多东西,比如厂家的支持,市场培训的力度,ide的生产力。

    PS:其实你说的东西已经重复无数次了,我也已经回复无数次了,我不想继续和您纠缠下去。我一直希望中立的考虑问题,但是您的逻辑一直十分偏激,甚至在我不断强调之下,您还是不愿对一些东西,如LINQ或Fluent NHibernate进行必要的了解。这让我感到没有意思,因此我还是像以前说过的那样,我就有选择地回复您的说法吧。至于您想知道某些东西有没有意义,我在以后的文章里会详细讨论的,别着急。

    不知道为什么你总认为我是不了解。我已经跟你说过了,你说的大部分东西我都看过。因为兴趣原因,我用的很多东西你可能还没看过,比如S-Plus/R语言,mathematics语言

    我十几年前就兼职做过MCT,专门培训微软的产品。我个人认为,其实微软的产品基本属于容易入门、深入很难而且很难长久的。我记得你在twitter上有个争论,好像反对你的很多都是很早就开始使用微软工具,这不是没有原因的。

  41. zhangronghua
    218.30.165.*
    链接

    zhangronghua 2010-05-19 04:41:49

    我当时就是因为觉得C#语法比java优雅才选择的C#,话说现在c#正处于高速发展的阶段, 而java则处于一个相对稳定的阶段,抛开平台只说语言,两者已不可同日而语了。 感觉好多的评论没有分清好老赵的限定:只比较语言,不说平台。

  42. 老赵
    admin
    链接

    老赵 2010-05-19 05:39:50

    @mcpssx

    不是因为server贵,那就更说明问题了。这就说明是架构和语言有缺点。

    失败的原因有很多,我可以告诉您我的失败是非技术造成的,技术很稳定,一直好好的跑着,一年多没去碰它了。我不认为您不了解项目成败的关键有哪些,您用Java等就没有失败的项目了吗?但您偏说我失败就是架构和语言的问题,我很无可奈何。所以我说您不愿意认真讨论。

    我说的框架不准确,我其实是指lucent之类的东西。比如你现在用全文检索你用什么实现?

    全文索引都是独立的服务,我用过Solr也用过Sphinx,我不去关心它们用什么实现的,这就是组合的力量啊。我说Fluent NHiberante是在举语言限制框架发展的案例,你觉得ORM没有必要,但是别人觉得有必要,对他们来说有个Fluent NHibernate就是有意义的。而且,Fluent是一种能力,可以用来NHibernate,我现在就用它来Mongo了。过一段时间我会写点文章讨论目前我围绕Mongo使用的辅助类库,您会看到的。

    不知道为什么你总认为我是不了解。我已经跟你说过了,你说的大部分东西我都看过。因为兴趣原因,我用的很多东西你可能还没看过,比如S-Plus/R语言,mathematics语言

    你了解的比我多很正常,但这不代表你就了解我讨论的东西。我说你不了解的原因,是因为你对LINQ的作用描述都是不正确的(跟LINQ初学者犯的错误毫无二致),还说VB的XML Literal比LINQ更常用,如果这不是你不了解,那么就是您在故意胡说了。具体如何评价LINQ,LINQ到底是什么,在平时的作用究竟有多少——看我以后的文章吧。

    我十几年前就兼职做过MCT,专门培训微软的产品。我记得你在twitter上有个争论,好像反对你的很多都是很早就开始使用微软工具,这不是没有原因的。

    他们都很就事论事,评价的是过去微软的情况,而不是现在的微软技术。你用十几年前的经验来说明现在,这是靠谱的做法吗?虽然经验很有用,但是通过“直觉”来判断新事物也是不合适的。

  43. 链接

    Ivony 2010-05-19 05:55:47

    @mcpssx @老赵

    其实我觉得你们俩的争吵,有点儿鸡同鸭讲的意思。

    其实都没错,老赵不是只说语言么,莫非mcpssx你真能找出Java语言优越于C#语言的若干理由?

    当然我也认同mcpssx的观点,一个语言烂不代表就要抛弃么,Java还是有很多可圈可点之处的,甚至于,语言的评判标准都不应该是唯一的。作为中国人,我很喜欢分析语,汉语就是么,这样我们可以自由组词。要换个德国人,恐怕就会有别的观点,汉语这什么破语言,没格、没态、没……。

    从老赵的观点来说,C#比Java先进,生产力高。mcpssx就说,是先进,但生产力不一定高,先进的语言还有很多。这样,是争不出结果来的。

    总而言之,软件行业已经走过了一招鲜吃遍天的时代,没有什么程序设计语言是全能的,在平台(JVM和CLR)的协助下,几乎所有的语言都得到了几乎相同的能力。这个时候再去强调语言的占有率什么的,显得有点不合时宜。

  44. 老赵
    admin
    链接

    老赵 2010-05-19 06:04:20

    @Ivony

    因为有了平台作保证,换一门语言并不会丧失生态环境,并不会损失历史积淀,反而很容易带来生产力的提高。在平台的协助下,已经给了开发人员选择语言的空间了,所以我最近对于语言的考虑也越来越多。

  45. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-19 06:45:44

    失败的原因有很多,我可以告诉您我的失败是非技术造成的,技术很稳定,一直好好的跑着,一年多没去碰它了。我不认为您不了解项目成败的关键有哪些,您用Java等就没有失败的项目了吗?但您偏说我失败就是架构和语言的问题,我很无可奈何。所以我说您不愿意认真讨论。

    我不是说你的这个项目失败,而是为什么互联网上使用.net的很少。根据你的说法,价格不是问题,语言特性又好,那失败的原因是什么?

    全文索引都是独立的服务,我用过Solr也用过Sphinx,我不去关心它们用什么实现的,这就是组合的力量啊。

    那是因为不是用.net实现的吧?

    我说Fluent NHiberante是在举语言限制框架发展的案例,你觉得ORM没有必要,但是别人觉得有必要,对他们来说有个Fluent NHibernate就是有意义的。而且,Fluent是一种能力,可以用来NHibernate,我现在就用它来Mongo了。过一段时间我会写点文章讨论目前我围绕Mongo使用的辅助类库,您会看到的。

    mongo本身就是面向对象的了,又拿来辅助一套意义不大。

    我说你不了解的原因,是因为你对LINQ的作用描述都是不正确的(跟LINQ初学者犯的错误毫无二致),还说VB的XML Literal比LINQ更常用,如果这不是你不了解,那么就是您在故意胡说了。具体如何评价LINQ,LINQ到底是什么,在平时的作用究竟有多少——看我以后的文章吧。

    sql就是面向集合的一种DSL,不知道你认为的linq又是什么?不知道你说的理解错误时指什么?

    据我看,.net项目中用了xml的,绝对比用linq来查询数据的多得多。所以使用xml literal的机会绝对比linq多,不知道你为什么认为这是胡说?

    已经fluent Nherbinate不写sql用了orm成了list,class了, 又要用linq来from table1 select ,我不明白这种反复变换的意义是什么?

  46. 老赵
    admin
    链接

    老赵 2010-05-19 07:24:22

    @mcpssx

    其实你我也只能知道那些最著名的项目,比如大众点评网,Stack Overflow,Plenty of Fish等等。对于一个成功的项目来说,他们一定是从一开始就没用.NET,而不是先用.NET,觉得不行,再换,于是成功的。失败的项目不是因为用了.NET而失败,动辄把项目失败归结于技术,其实只是在为自身的能力做开脱罢了。

    您对LINQ的理解错误,就是把它和SQL的作用看作“等同”、或是“近似”的东西了。于是你自然得出结论,XML使用的绝对比数据查询来的多。你这里的逻辑似乎是没错,不过你最一开始对LINQ的认知就有问题了——正像我之前说的,和LINQ初学者的认知错误如出一辙。事实上对于一个C#程序员来说,LINQ可谓天天用,而XML无论在绝大部分项目中都很不会是主要的部分。

    所以我说您对LINQ真的是不了解,虽然您以为已经完全了解了。同时,我也发现其实您不知道微软现在一些框架是如何使用LINQ的,否则您也不会看轻LINQ这个东西了。您说的越多,我反而越确信其实您不了解.NET领域的发展。

    至于您说Mongo是面向对象、或是基于对象、或是关于对象还是其他什么的,我又想说你没用过MongoDB了。这样吧,很多方面问题我们也已经讨论过很多次了,我不打算继续了。无论是LINQ、MongoDB还是Fluent NHibernate,今后我都会详细写的。我总是说您不了解这个那个,您也一定不乐意。而且现在双方都只是干瘪瘪的,我说有意义,你说没意义,实在不是我阐述观点的风格。

    所以您先等几天,别急。

  47. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-19 07:58:29

    @mcpssx

    其实你我也只能知道那些最著名的项目,比如大众点评网,Stack Overflow,Plenty of Fish等等。对于一个成功的项目来说,他们一定是从一开始就没用.NET,而不是先用.NET,觉得不行,再换,于是成功的。失败的项目不是因为用了.NET而失败,动辄把项目失败归结于技术,其实只是在为自身的能力做开脱罢了。

    1. 说的是互联网的普遍的情况
    2. 与能力没多大关系。不说操作系统之类的约束,那个Web Form架构天生就不适合什么互联网应用了。当然了,你可能要说mvc了,互联网不会等微软推出了mvc再开发网站

    您对LINQ的理解错误,就是把它和SQL的作用看作“等同”、或是“近似”的东西了。于是你自然得出结论,XML使用的绝对比数据查询来的多。你这里的逻辑似乎是没错,不过你最一开始对LINQ的认知就有问题了——正像我之前说的,和LINQ初学者的认知错误如出一辙。事实上对于一个C#程序员来说,LINQ可谓天天用,而XML无论在绝大部分项目中都很不会是主要的部分。

    1. sql的基础就是关系代数,我一直不明白你那个linq说非常不同,到底是哪里不同,你那个数学基础是什么?
    2. 天天用linq的C#程序员恐怕在盛大吧?我看要用xml和会用xml的.net程序员比linq那多的多。

    事实上,.net程序员大部分数据处理是来自数据库,为什么非要用linq,我颇感不解。php程序员根本就不用这些linq,也不见得生产力比.net低。

    所以我说您对LINQ真的是不了解,虽然您以为已经完全了解了。同时,我也发现其实您不知道微软现在一些框架是如何使用LINQ的,否则您也不会看轻LINQ这个东西了。您说的越多,我反而越确信其实您不了解.NET领域的发展。

    说实话,我一直对框架发展不大感兴趣,不仅仅是.net,而且包括java的。重要的是框架是否产生了什么重要产品,或者有明确证据证明开发更快了。

    我不知道你说的到底是什么框架?

    至于您说Mongo是面向对象、或是基于对象、或是关于对象还是其他什么的,我又想说你没用过MongoDB了。这样吧,很多方面问题我们也已经讨论过很多次了,我不打算继续了。无论是LINQ、MongoDB还是Fluent NHibernate,今后我都会详细写的。现在只是干瘪瘪的我说有意义,你说没意义,实在不是我阐述观点的风格。而且我总是说您不了解这个那个,您也一定不乐意。

    我这个对象风格是泛泛而谈,不是那么严格的。

    举个简单例子

    $person = array("name" => "joe");
    $people->insert($person);
    $joe = $people->findOne(array("_id" => $person['_id']));
    

    这已经orm了,为啥又要linq一把?

    我再举一个例子,现在mongodb的web管理平台有基于php的Opricot、phpMoAdmin。那么.net现在有什么类似的东西吗?

    光说语法好,框架好是没有用的。

  48. 老赵
    admin
    链接

    老赵 2010-05-19 08:15:48

    @mcpssx

    就先随便说说MongoDB吧,你的PHP之所以能这么做,是因为你使用的类库已经提供了一种类ORM映射了(当然更接近Active Record),它不是标准的MongoDB驱动,你可以看看Java和.NET下标准的MongoDB驱动是什么样的。还有一个原因是,php是动态语言,它直接声明一个array,就可以当对象用了。用Java或C#等静态语言就不一样了。我需要依赖Java,C#等静态语言的静态检查能力,又要能方便地进行查询,LINQ在这方面的作用很大。

    用一个侧面来说明问题吧,在Java那端,Hibernate一直是风平浪静地发展着。等移植到.NET上之后,立马出现了Fluent NHibernate和LINQ to NHiberante等等。而在Scala届现在也有这样的原型出现了,Java语言社区其实也一直对LINQ垂涎欲滴。如果不是生产力有所提高,为什么大家都那么热衷这方面呢?具体就不多说了,以后的文章里我会详细说的。

    至于什么是LINQ,LINQ和XML到底哪个用的多,还是等我下次具体说吧。如果要说框架的话,其实就是指PLINQ、DryadLINQ、Reactive Framework这些东西……

  49. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-19 08:21:23

    .net在互联网上不好用,原因很多

    1、操作系统和数据库的因素。当然老赵不承认,认为有mono,windows不贵等等等。

    2、webform模型是不适合互联网的,webform其实和jsf一样,都是复杂不好用的,封装过多。只是微软的可视化开发工具比sun强,命运比jsf好一点。

    3、.net其实在开源界是二等公民,举个例子,当初用berklyDB,就没发现有可用.net的api

    4、.net比php要复杂,又封装的太多,导致很多.net程序员都在高来高去,就是常说的拖控件,练框架。这不光是.net,还包括java程序员都有这个毛病。

    我以前就发现,php和asp程序员对html,javascript比.net和java要熟,因为后面两个都有大把框架要学习,什么asp .net ajax, asp .net dynamic, WCF, structs, spring, hibernate等等。

    其实web开发掌握好底层的sql, html, js, socket比那些东西简单的多,也容易控制的多。

    5、很多细节上php处理的很好。

    举个例子,我在.net项目和java项目都发现过因为没有关闭数据库连接导致资源不足的。但在php其实这不是问题,根据php的实现和页面的声明周期,资源都会被释放,你不写mssql_close,最后资源也会关闭

  50. 老赵
    admin
    链接

    老赵 2010-05-19 08:42:53

    @mcpssx

    其实有很多东西是一些思维观念还不太被人接受。例如,我做Web 2.0项目,就用Windows上跑ASP.NET,而数据无论是关系型的还是其他什么,都放在Linux上,应用程序一样能跑。但许多人的看法好像是用了ASP.NET就硬要SQL Server,其实MySQL才不会关心连接它的是Linux还是SQL Server。

    至于很多框架,你说的现象不是不存在,不过也是缺乏引导造成的。就好比我就不懂什么Dynamic,WCF等等,我只会.NET开发,HTML基础和ASP.NET,微软的各种框架其实都是一个纵向方面的增强,不是每个人都要去了解的。我觉得我就属于需要学习的东西不多,但是开发生活很美好的人。

    其实微软的技术不是没有问题,尤其是历史遗留问题。但你说的大部分问题我觉得不是技术上的。我现在做的其实就是在不断推广我的开发理念,以及如何正确地使用和看待微软技术,破除别人对微软技术的误解。其实不仅仅是微软技术,推广Scala和mono都可以算作是类似的事情。

  51. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-19 08:45:26

    @老赵

    就先随便说说MongoDB吧,你的PHP之所以能这么做,是因为你使用的类库已经提供了一种类ORM映射了(当然更接近Active Record),它不是标准的MongoDB驱动,你可以看看Java和.NET下标准的MongoDB驱动是什么样的。

    驱动可能有所不同,但是mongodb shell也是差不多orm的,因为nosql返回的结果本来就是类似的

    还有一个原因是,php是动态语言,它直接声明一个array,就可以当对象用了。用Java或C#等静态语言就不一样了。我需要依赖Java,C#等静态语言的静态检查能力,又要能方便地进行查询,LINQ在这方面的作用很大。

    依我看,根本不需要什么静态检查能力。php的array其实就是一个hash表,对于java和.net来说返回一个hash表也就足够了。

    我不喜欢hibernate的原因,就是要到处定义或者生成一个类和表相对应,麻烦。这些静态的类其实大部分是没有意义的,特别是表结构还经常会变化。

    用一个侧面来说明问题吧,在Java那端,Hibernate一直是风平浪静地发展着。等移植到.NET上之后,立马出现了Fluent NHibernate和LINQ to NHiberante等等。而在Scala届现在也有这样的原型出现了,Java语言社区其实也一直对LINQ垂涎欲滴。如果不是生产力有所提高,为什么大家都那么热衷这方面呢?具体就不多说了,以后的文章里我会详细说的。

    要我看,hibernate本来就没什么必要.更不要说什么linq to nhibernate了。

    你先把select * from table1 换成CTable1RecordList然后又from CTabel1RecordList select *,

    这简直是一种折磨嘛。要我看,直接从sql返回一个hash表的list足以。

    至于什么是LINQ,LINQ和XML到底哪个用的多,还是等我下次具体说吧。如果要说框架的话,其实就是指PLINQ、DryadLINQ、Reactive Framework这些东西……

    说实话,大家学习这么一大串东西,就为了写一个web页面或则说桌面程序,是不是有点牛刀杀鸡?如果你的数据量和算法复杂度已经大到了要用并行的地步,那不如去学matlab之类的东西。

    我重复一下,其实web开发应该是简单的,sql,html, js加一个模板生成就足够了。

  52. 老赵
    admin
    链接

    老赵 2010-05-19 08:52:18

    @mcpssx

    NoSQL分四大类,MongoDB只是属于其中一类“文档式数据库”,NoSQL怎么可能返回的都是一样的——这个随口说一下。

    如果你用Java和.NET,你肯定也不可能用哈希表,因为使用实在不方便。在php里你用哈希表,因为是动态语言,使用方便的缘故。你觉得不需要静态检查,不需要静态语言,这点和你觉得Hibernate没用一样,是你的个人观点。我,还有许多人,都是和您持不同观点的。这方面的讨论太多了,没有人能说服对方,我也就不继续讨论了。

    还有我从来没说过我在和你讨论Web开发,我说PLINQ、DrynadLINQ,Reactive Framework没有一个是针对Web开发的,它们都是纵向领域的框架(比如Rx用来开发交互式的应用,实在是太方便了,可以认为是种编程方式上的革新)。我以前也说过,C#也不是单为Web开发设计的,而你因此从Web角度(甚至只是在说Web表现这块)说C#的生产力、框架没有意义,这合适吗?

  53. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-19 09:10:22

    @老赵

    如果你用Java和.NET,你肯定也不可能用哈希表,因为使用实在不方便。

    我就是用hash表,crud的时候根据hash表来拼sql语句,select的时候返回一个hash表的list。

    在php里你用哈希表,因为是动态语言,使用方便的缘故。你觉得不需要静态检查,不需要静态语言,这点和你觉得Hibernate没用一样,是你的个人观点。我,还有许多人,都是和您持不同观点的。这方面的讨论太多了,没有人能说服对方,我也就不继续讨论了。

    1. 事实上,在php中取值a["field1"],在.net中也是a["field1"]
    2. 事实上,我没看到多少web网站使用了hibernate。

    还有我从来没说过我在和你讨论Web开发,我说PLINQ、DrynadLINQ,Reactive Framework没有一个是针对Web开发的,它们都是纵向领域的框架(比如Rx用来开发交互式的应用,实在是太方便了,可以认为是种编程方式上的革新)。

    事实上,现在用.net的90%都是web开发。而绝大多数java开发者用java本来也不打算开发桌面程序的,那C#开发桌面的时候语法比java强对他们有何意义?

    用微软的桌面开发更是一个悲剧,你应该用什么?用winform,wpf还是sliverlight?这又说道我前面说的微软动不动就全盘抛弃的做法。

    你说的很方便,但事实上根本就没多少这样的需求。哪个用java的要写这样的东西呢?

    我以前也说过,C#也不是单为Web开发设计的,而你因此从Web角度(甚至只是在说Web表现这块)说C#的生产力、框架没有意义,这合适吗

    合适,因为用php、java的本来也没打算写桌面程序。如果要说些后台程序,C#也没什么优势,lucent.net是抄lucent的而不是相反。

    为什么我只说web呢,因为这是讨论这个问题的大多数人的关注点。如果真要说数学算法,那就更与哪些什么linq无关了。

  54. 老赵
    admin
    链接

    老赵 2010-05-19 09:27:55

    @mcpssx

    我不与您进行纠缠了,实在没有底。我无论怎么说您都可以把问题泛化、特化、或偷换概念、或衍生,或盲目二分地进行应对。

    为什么这么说呢?举个例子:我现在很可怜Java平台那么多好框架,被Java这种语言给糟蹋了,如果JVM上有C#,我还真不信Lucene会是用Java写的。我也可惜.NET平台的生态环境不够好,导致C#那么好的语言被浪费了。而最终的结果,是导致一些和你一样观点的人,认为C#对Java的改进没有太大意义,这实在很悲哀。以后的文章中我会写清楚C#改进意义所在的。

    其实还是那句话,很多东西你做了基本的了解之后都不会有那么多,在我看起来十分莫名其妙的问题,所以还是等我后续的文章吧。

  55. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-19 09:30:35

    @老赵

    最重要的其实是结果,而不是中间过程。.net缺的就是结果。

    比如为什么现在mongodb的管理平台Opricot、phpMoAdmin现在是php的,而没有.net的?.net语法特性比php好,ide更好,还有fluent nhibernate, linq to mongodb等等等等,这些php都没有。但是没有结果啊。

    再举个例子,同样水平的人是扩展phpnuke容易,还是dotNetNuke容易?是扩展discuz容易,还是discuz NT容易?原因是什么?

    其实有很多东西是一些思维观念还不太被人接受。例如,我做Web 2.0项目,就用Windows上跑ASP.NET,而数据无论是关系型的还是其他什么,都放在Linux上,应用程序一样能跑。但许多人的看法好像是用了ASP.NET就硬要SQL Server,其实MySQL才不会关心连接它的是Linux还是SQL Server。

    其实不是思维问题,而是管理问题。作为个人爱好,这样是没有问题。但是作为公司就有问题了。比如说你,假如你有两个linux服务器,你会不会一台部署redhat,一台部署ubuntu?

    再举一个例子,为什么google限定用4种开发语言,难道是因为google工程师懂的语言不多吗?

  56. 老赵
    admin
    链接

    老赵 2010-05-19 09:48:32

    @mcpssx

    既然有了PHP开发的管理工具,要我也不会再做个.NET的了,呵呵。PHP这种东西多,我认为最重要的还是生态环境的关系,历史积淀多,用得人也多。你说的很多东西都不是语言的问题,不能用来证明语言好坏或是有没有意义,因为是生态环境问题。再举个例子,真要比Web开发,估计现在没有什么框架、语言等东西的综合生产力能高过RoR了。但是,PHP用的人还是多,现状如此。对我来说,我们要做的是推动RoR,而不是停留在PHP就满足了,当然对你来说可能就不会如此。

    你说的完全和我现在做的不矛盾,为什么还要我不断重复呢?我又没有说要.NET来代替Java平台,我是要用Scala代替Java语言,这损失了什么东西吗?Java平台的结果是好的,就不能再过程上更近一步吗?Java方面为什么不能吸取其他平台的先进经验?在我看来,换用Scala便是一种进步。

    说到现在,你唯一沾着边的就是说Scala复杂,IDE支持不好等等理由,因此说明不能替代Java语言。你的看法我都知道,我又不是唯语言特性至上的人,这些我都会讨论到的。

    Web Server和DB Server完全是独立的分离的,甚至是互相透明的。有两个Linux服务器集群,如果一个是Web Server统统用Ubuntu,一个作为DB统统用Redhat,甚至分别有两个团队管理,又有什么不可以?即便都用Ubuntu,Web Server和DB Server的软硬件配置和参数都很可能完全不同,即便都用Windows或同一发行版的Linux,管理方面也是大相径庭的。

    你说Google四种语言,我不知道他们的原因,我表示相当怀疑。即便真是这样,我猜也不是难以管理,而是为了控制成本。它们的应用都和它们的基础设施密切相关,而基础设施已经定下了,多支持一门语言就要多开发一整套类库。而且我也知道有许多系统选择多语言开发呢,比如Facebook用了C、C++、PHP、Java、Erlang;Twitter用了C、C++、Ruby、Java、Scala。难道它们都不怕出问题吗?

    处理得当,本来就不会有什么问题。系统划分,跨边界操作,基于标准协议的通信早就是几十年前就讨论和使用过无数遍的东西了。对于大系统来说,这种划分是必然的。一旦划分,便基本要独立、自治的系统了。

  57. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-20 00:24:52

    Steve将Rails移植到Javascript/Rhino

    为了提升google的开发效率,Steve努力尝试说服公司采纳Rails(包括Ruyb)作为开发工具,但是google不予采纳(google不想再增加支持的语言的数量)。Steve决定把Rails移植到JavaScript上去。这意味着一个google有可能在未来开源一个新的项目Rhino on Rails。

    限制语言的数量将使得开发人员对代码的贡献度更大,他们无需担心成为不熟悉的语法的牺牲。

    每一个公司正式支持的语言都是有成本的:基础架构的支持,文档,培训,代码冗余还有其它因素。虽然编程语言的核心语法都是大同小异,但是剩下的各自独特的语法就难以辨认,尤其是没有明确标准的动态语言,例如Perl,Ptthon,Ruby。Google非常谨慎的保持使用语言的数量。这样就可以构建大量对所用语言非常熟悉的专家。google目前只使用C++,Java,Python,javascript作为正式的产品开发语言。

  58. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-20 00:33:20

    真要比Web开发,估计现在没有什么框架、语言等东西的综合生产力能高过RoR了。

    ruby语言比较复杂,不可能流行超过php。几年前,我在javaeye就说过这玩意不可能流行过php,你看看现在国内ruby社区还有多少?

    其实也没有证据表明ror的生产力就一定超过了php,其实推崇ror的是来自java界,这其实是因为java界的ssh生产力低下,但是java界的人又不愿意转到他们认为比较简单跌份的php上,所以ror适逢其会。

    其实你看看javaeye自己发展的路程就知道了,他们开发中遇到了很多问题,都是要大牛来解决了。比如光ruby本身的内存泄露问题还有ruby的imagemagik的内存泄露问题就处理了好久。

    当然,就是因为他不成熟和复杂,才需要ThoughtWork这样的咨询公司。你用php开发哪里需要比ibm还贵的咨询公司了。

  59. 链接

    ydntlk 2010-05-20 03:25:04

    其实就老赵的结论而言,还是很显然的,应该没有什么异议。但是,从下面的评论来看,其实大家更关注的其实是这两个问题:

    1. 这些更优秀的语言特性(即使是“能够改变编程思维、或是引出额外的编程范式”的语言特性)到底能在多大的程度上改变生产力?如果这种改变与库、框架和整个生态环境所带来的优势或是和学习成本相比不够明显的话,那自然就没有人会关心。

    2. 这些特性的大多数是否是真的无法用库或IDE的扩展来弥补,比如xuwenhao举的那个lambda表达式的例子。

    如果这两个问题没能得到很好的解决(尤其是第一点),无论老赵怎样强调自己的论点是什么而不是什么,都难以避免大家会这样想,“C#语言更优秀。Huh?那又怎样?”。而在这两个问题中,老赵在“比较的意义和目的”中的论述还很不够。不过,这些问题如果不是在一个真实的环境中,而仅是靠几个三、五十行的例子也确实难以说清楚。

  60. xiaoetmac
    222.66.14.*
    链接

    xiaoetmac 2010-05-20 04:25:48

    问个题外话,scala的智能提示如何获得呢~我在eclipse中用scala plugin无智能提示~~~

  61. 老赵
    admin
    链接

    老赵 2010-05-20 05:18:55

    @xiaoetmac

    不行吗?我以前用过NetBeans,记得是有提示的,eclipse不该没有才对。

  62. 老赵
    admin
    链接

    老赵 2010-05-20 05:26:25

    @ydntlk: 如果这两个问题没能得到很好的解决(尤其是第一点),无论老赵怎样强调自己的论点是什么而不是什么,都难以避免大家会这样想,“C#语言更优秀。Huh?那又怎样?”。而在这两个问题中,老赵在“比较的意义和目的”中的论述还很不够。

    我讨论的还不够吗?我觉得我该说的东西都已经说过了,哪里还不够啊。我目前没有看到过超出我论述内容的质疑,因为遇到这种情况的话,我是会修改那第一篇文章的,呵呵。

    对于学习成本和生产力提高是否合适的问题,我会讨论到的。不过我也只能摆出事实,再给出我的观点了。每个团队都有自己的的情况,比如时间,比如人员能力等等,我不可能给出统一的答案的。我可以做的其实就是保持客观。

    至于这些特性是不是能够用IDE和库弥补,以后会讨论到的。而且有一点我觉得您不需要担心:大部分特性的确是十几行代码就能看出区别来的。而我引用的每一行代码都可以说是真实环境中的。

  63. 链接

    May 2010-05-20 10:53:40

    用通俗的话说,其实就是这样:

    就算你C#和.NET再有优点又如何?只要我们只强调用Java的人多,别人就会自然而然地认为Java才是首选,然后就会有更多的人加入我们的阵营,让更多的人认为Java是首选,这样.NET就一直翻不了身。

    .NET的优点是事实上存在的,尽管它不可能在所有方面都超过Java。 然而每当谈到.NET的优点的时候,总会有人说出像是“用.NET的少,所以.NET不好”这样的话……也许.NET诞生的时间并不短了,但从.NET诞生以来就不停地被“少,所以不好”“不好,就不用”“不用,所以少”这样的一个正反馈系统所影响。

    总是想说.NET不如Java的人,应该静下来思考一下到底是自己不知不觉地进入了这个正反馈系统,还是说只是因为某种原因不想承认.NET。

    老赵可以把我上面的两条删掉吗?我刚刚才注意到不登录是不能修改的。

  64. 老赵
    admin
    链接

    老赵 2010-05-20 11:09:24

    @May

    嗯,不过其实我写这些文章也不是想证明.NET优于Java平台,只是想证明C#语言优于Java语言,并且推动别人进行Java语言到Scala语言的转变。这点我从一开始就强调,评论中更是不断强调,只可惜许多人似乎一看到在说Java坏话,就热血上涌,不管三七二十一了。

    我很无奈。

  65. 链接

    NanaLich 2010-05-20 11:29:20

    有的时候我真觉得老赵你就是存心调戏那些爱冲动的Java使用者,故意让他们感觉你是在说Java坏话——结果实际上你还不是。

    WJSNCSR系列我从刚开始准备的时候就在关注,我自然是看得出你的目的不是证明.NET和Java平台谁优谁劣,但是看看下面的评论,似乎总是有不少的人有一种被害的危机感,然后马上就跳出来强调.NET如何地无法战胜Java平台……

    总这样的话我就不得不产生这样的想给“他们”敲敲警钟的想法了。 但是怎么说呢——就好像卷进了一个跳不出的怪圈一样,不管怎么做都还是会演变变成(某种意义上的)平台之争……

  66. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-21 02:00:27

    @老赵

    你提出推动从java到scala基本上是不可能的。

    你没有考虑一个团队同时使用两种语言的成本。

    现在学java的人可以不用C,那么你学了scala可以不学java吗?显然是不行的

    scala确实语法特性更多,那么java语言的语法是不是现在完成事情就很困难呢?应该也不是吧。

    所以说java是必学的,scala不是必须的。

    不像groovy,scala语言和java语法差异还是比较大的。

    你在一个.net团队中,你会不会因为有xml literal就同时使用vb .net和C#?

    你看google的四种产品开发语言,明显都是用在不同领域中的,在同一领域中,google不会同时选用两种语言。

  67. 老赵
    admin
    链接

    老赵 2010-05-21 02:45:42

    @mcpssx

    我又没说同一个项目用两种语言,要用就(某个项目)的完整团队在用。对于技术实力足够的小型团队,完全可以先开始用Scala。在刚过去的Scala Days里也有关于推动企业内部Scala使用的话题,所以这不是我一个人想做的。你说推动Scala基本是不可能的,就看你怎么理解“可能”这个词了。我自然不会期望Java消失,Scala独大。事实上对我而言,让20-30%的Java平台程序员使用Scala就成功了,即使还有超过70%的人在用Java。

    学了Scala之后,自然就会了解了Java,这又有什么关系。Java没有做不到的事情,但是太多事情是做不好的了。在我看来,Scala高级程序员比Java高级程序员(指精通语言)的生产力要高出许多,而Scala虽然比Java复杂,但也不会太复杂,比理解或设计一个框架类库JVM实现等要简单多了,许多时候更困难的事情都搞得定,为什么就不去用Scala呢?尤其是有余力的时候,我觉得先学Scala比先去了解JVM或某框架是如何实现的,对生产力的提高要重要的多。

    至于你说的Groovy和Java更接近,我同意。我之前也提过是其实是让Java团队走向Groovy或Scala,但就目前看来,还是Scala更能够完整的替代Java,以后我会讨论的。

  68. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-05-21 03:40:55

    @老赵

    你看看ruby、rails这几年在国内的发展趋势是越来越冷,你说的那个趋势是不太可能的。

    javaeye的robbin也算个能鼓动的了,我看也没鼓动起来。

    很多语言都是很美的,对牛人们是提高了生产力的,但是成为大众化的语言是很难的。

  69. 链接

    NanaLich 2010-05-21 13:19:41

    xml literal并不是一个好例子,其它的地方看起来没什么问题。

  70. 链接

    xiaotie 2010-05-23 10:35:22

    这是好事啊,哈哈哈哈。用的少,竞争少。开发效率高,赚钱快。闷头数钱,多爽啊,哈哈哈哈。当然,那些客户主导的项目除外。

    .NET的优点是事实上存在的,尽管它不可能在所有方面都超过Java。然而每当谈到.NET的优点的时候,总会有人说出像是“用.NET的少,所以.NET不好”这样的话……也许.NET诞生的时间并不短了,但从.NET诞生以来就不停地被“少,所以不好”“不好,就不用”“不用,所以少”这样的一个正反馈系统所影响。

  71. Duron800
    125.39.108.*
    链接

    Duron800 2010-05-24 14:45:20

    评论多是吵架,没劲。 说说文章里的多好,var在C# 2.0里有吗?那代码是不是该改一下?

  72. 老赵
    admin
    链接

    老赵 2010-05-24 15:41:57

    @Duron800

    var是C# 3.0里的东西。这方面……还行吧,问题也不算太大,就不改了,呵呵。

  73. 一切都是界面
    59.57.229.*
    链接

    一切都是界面 2010-06-22 07:21:16

    看到我眼睛都花了,你们这讨论没完没了的,又不对重点加颜色标注啊。 建议楼主的这个回复编辑区能加不同颜色区分重点文字。

  74. 链接

    草头蕾 2010-08-09 18:28:14

    赵哥,俺顶你。我本来看文章看的很爽,看到讨论都看不下去了,有些人根本没有用过就开始贬低。 程序员怎么一副“文人相轻”的样子。老赵,无聊回复就不要理了,时间应该花在多写博客上呵呵。

  75. fyhao
    118.101.146.*
    链接

    fyhao 2010-11-22 13:13:32

    看评论看到很烦。 支持Java阵营的人用的理论都是偏搏站不住脚。 老赵的文章只比较语言特性,就在这个语言特性上,请说说Java好过C#.NET的部分吧? 别说什么Java跳到.NET的。

  76. BlueTrees
    222.70.194.*
    链接

    BlueTrees 2010-12-14 06:33:12

    老赵,你吃了那么多的C#的语法糖,会不会觉得太腻了啊!对于高性能的程序,这些语法糖会不会给开发者造成更大的困惑而不是便利呢?

  77. 老赵
    admin
    链接

    老赵 2010-12-14 07:43:11

    @BlueTrees

    为什么会腻?语法糖就是帮助开发的,知道它是怎么回事就行了,不要老是拿高性能啊高稳定性出来吓唬人……

  78. 打倒狂妄
    218.242.204.*
    链接

    打倒狂妄 2011-09-09 08:41:46

    老赵,你举出几个大公司敢用Sclala代替Java的例子,我算服你了。要么是这领导太白痴,要么是他太有魄力

  79. 老赵
    admin
    链接

    老赵 2011-09-09 15:30:02

    @打倒狂妄

    不要以为你不知道就是世界上没有,懒得和你这种人说,要例子自己去搜,我刚还翻译过一些呢,就是不找给你看。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我