本文作者:王森
台湾交通大学科技管理研究所
moli.mt88g@nctu.edu.tw
前言:
最近这半年的讲师生涯之中,遇到不少从VB转到Java的学生,绝大大部分的工程师或新进软体开发领域的朋友都会问:"我该学.NET 还是Java ?" "该学C# 还是Java ?"相关的主题在网路上可谓暗潮汹涌,随时可能擦枪走火,在发表本文之前, 自己把C# Spec 深入地读了一次 ,也大致研读了.NET的相关技术文章所以想想在此发表一心得,没有什么预设立场,请大家多多包含。也感谢洪志鹏先生愿意让这篇文章藉由Java周报发表。
本文适用对象:
"本文内容只适用一般工程师,特殊情况不算!"何谓特殊情况呢?以我个人为例,明明知道Delphi的原生语言是Object Pascal, 所以要用Object Pascal才能和Delhpi融为一体的感觉.可是,开发Project 的时候,我就是莫名其妙地喜欢用C++Builder.当"程式语言基本教义派"或"程式语言民族主义"遇到正常行为的时候,是怎么说也说不清的。(以上是李敖先生说的话,我只把关键字换了,希望不会被他告)另外一种特殊情况就是,如果您的思考方式与普通人不同,那么,本文亦不适用於您。
首先想讨论的是架构的问题:
笔者并没有深入研究过架构,也实在不清楚网路上诸位先贤所谓的架构指的是什么.但是我凭一个工程师的直觉可以笃定,".NET就根基架构上一定比Java的根基架构还要好!"因为.NET的推出比Java晚了近5年,中间还有J++与WFC的发展,如果搞了个比Java还鸟的东西,像话吗?只要Sun在这次帝国大反击之後,没有被MS弄得节节败退,从此消失於市场,相信它若干年後还会推出个比.NET还好的东西,然後若干年後MS又搞出一个更好的东西.事实上,科技的演进就是如此.所以谁强谁不强,纯粹是历史必然的结果.所以没有什么好争论的.至於将来谁会是市场的霸主,就看两家龙头太厂谁比较会行销,谁比较亲近工程师.虽然资讯界过去曾经好几次重复"好东西被干掉,次级品占领市场"的历史.但是仍然没有人敢断言。
其次是压宝谁的问题:
Sun的标语是"网路即电脑",所以在Java的策略上,Sun假设这个世界上充满异质平台,所以设计Java 的时候希望以单一一个Java程式语言为中心,让它可以在各种平台上执行.因此JVM要采stack machine的设计方式,因为不管你是谁,都可以实作出stack machine.但是这毕竟是一个不理想的世界,连Sun自己Solaris都要好几个patch才能使用新版的JDK.连Borland也花了三年以上的努力才让 JBuilder可以同时推出Windows , Linux , Solaris , Mac OS X 四种版本,可见"Write once, run anywhere"的理想真的有其实际上的难度.Borland除了证明Sun 的理想是有机会实现的礼运大同篇,也证明经过精心的架构设计和最佳化,加上工程师累积了许多经验後,仍然可以突破stack machine 先天上速度慢的原罪(虽然还是不理想,需要用很多RAM来填补理想).Sun把其官方工具JDK搞的很难用,网路上老是有人抱怨它是Java Developer Killer,虽然.NET Framework SDK一样难用,可是微软至少还有Visual Studio.NET如果说微软的Visual Studio.NET让工程师感觉像在开Benz,那么Forte就很像路上随便一台前方贴著Benz标记的烂公车.所以Sun实在需要多多加强.不过这也难怪,MS是纯软体起家,Sun是纯硬体起家,Sun做软体做不过MS是正常的事情.
反观MS,它假设世界上只有x86的CPU,或者广泛的说是Wintel 平台,并假设世界上存在许多会各种语言的工程师们.因为以此假设为策略中心,所以设计.NET的时候CLR可以针对x86 CPU 作最佳设计,有些指令甚至可以和op code达到1 to 1的mapping,所以速度自然跑的快.但是叫他移到SPARC或AS/400上就麻烦大了..就工程师的角度,自然会偏向.NET,因为选择很多(喔,这点有待商榷,後面会提到),但是就3rd party 厂商的利益和老板不想被特定平台绑死的观点来说,会偏向Java。
各位想, .NET的WinForm设计的那么漂亮,很可能累积了Anders离开Borland之後的许多好点子,如果.NET出来,Borland大概真的只剩下IDE可以做了.所以最後谁的利益胜出,很可能就会决定输赢,
因此笔者曰:"你想信耶稣就信耶稣,想信佛教就信佛教,你心中的神自然会带领你走向他口中的天堂."喔,对了,如果两边都要压宝的人当然没问题,但是请一定要小心,不要到时候上不了其中一个神所谓的天堂,却同时下了两个神口中的地狱啊!
再来是Programming Model的问题:
记忆中,上一次给我惊艳感觉的时候是Delphi出来的时候,让我第一次觉得写程式是很美好,很简单的事情,可是自从那次的美好经验之後,一直到目前为止,都没有任何新意让人有耳目一新的感觉,总让我觉得软体的开发方式是不是已经走到一个瓶颈了呢?Anders搞VCL的时候,Borland说它是VB Killer, Anders 搞.NET,MS 当.NET 是Java Killer,怎么每次Anders出现的时候都会出现杀手呢? 我建议以後改叫他enders算了,大家觉得如何?
总之,元件架构不管是VCL, JavaBean, WFC, .NET Framework,搞了搞去都是setXXX()与getXXX()那一套,进步也只是小迈步,不是大跃进.以前语言里头不支援,所以要搞特殊语法,现在搞个新语言来支援,然後把他标准化罢了.自从Jordon退休之後,NBA就变得有点不热闹了,但我还真希望既Anders之後,有新一代的鬼才提出另外让我们工程师轻松的Programming Model呀!!
最後是语言上的问题:
C#比Java复杂多了,多了很多关键字,让我觉得很复杂,先说型态好了,C#提供value type与reference type,value type还分成simple type ,enum type , struct type,reference type还分成class type , interface type , delegate type , array type.这些型态如果在配上传递参数时可以选用纯粹的by value , by reference(ref) , ouput(out) , parameter array感觉上还真是热闹哩!!c#之中我们还可以利用unsafe关键字对指标直接做存取.存取权限修饰字除了固有的public, protected , private之外,也加了internal , protected internal.在多型上,除了以前的virtual之外,也加了override关键字.喔,当然有人会说我何必庸人自扰,但是如果您的汽车有类似霹雳车可以Turbo的功能,我想任何有好奇心的人都会想找机会试看看他的极限在哪里,才不管会不会粉身碎骨.Java程式语言的功能有限,工程师遇到特定问题通常会找其他特定的解决方案,这么一来程式在维护上会比较容易.但是语言复杂了,同一件事情有好多种做法,自由度变大了,工程师发挥的好,就可以突破很多限制,实现自己梦想.但是维护上呢?
君不见有些天才可以用C简单几行程式写出求PI值的程式,但是有多少人看的懂?个人主义和团队合作之间是有一些gap存在。语言的简单与复杂之间,实在是个dilemma.如果程式语言里头都是宣告,回圈,函式呼叫这三种基本要素,那么要设计出很复杂,功能超强的程式语言都没问题的,不是吗?Sun大可在Java里头开始引进很多C++的功能,可是它没有,原因何在?C#的复杂度,如果加上operator和template,那么和C++可有的拼哩!
每次上Java课程时有好多好多的VB Programmer跟我说他无法提升上来,虽然我要负大部分的责任,但是我开始怀疑如何把VB Programmer提升到.NET的层级呢?我说的VB Programmer当然不是少数精通各种语言,用VB只是纯粹好玩的工程师,而是指目前台湾资讯业界的许多中坚分子和SOHO族,当然,有人会叫我去用VB.NET, COBOL.NET,问题是,大家有没有想过为什么C++那么强大,可是还是很多人喜欢用C ?为什么开始有人改用Java ?为什么虽然Pascal不是主流,可是大家还是喜欢用Delphi ?
现在打出MS的行销广告告诉所有工程师一个讯息:"各种语言的工程师都可以广纳在.NET之下."相信去参加过微软或其他研讨会之後的朋友,除了发现.NET很不错,很棒,有很多功能是自己过去梦寐以求的功能之外,也发现他们被MS骗了(有人跟我说他觉得他被MS抛弃了),因为他们发现过去学的根本没用,啥米VB.NET,要他去学那种VB,他宁愿去学C#,反正比起VB.NET的语法,C#也没难到哪里.
http://www.vbqa.com/discuss/vb.net/read.asp?id=11
这个论坛里头,ChrisTorng先生说的很好:"况且 vb.net与c#的相似度,依我看比vb.net与vb6的相似度还高…^_^"
任何语言,要能够在CLR上发挥功能,就必须符合CLS的规范,意思就是说,VB.NET不会因为它的前面有VB两个字,就可以让过去用VB的朋友仍然有著绝佳的生产力.如果语法没有扩充,您相信VB.NET写的component可以被C#用吗?我是指"优美的用法",而不是旁门走道绕了一大圈之後的用法.MS在.NET Framework SDK beta 2里头,据说把VB改回来了,虽然不知道修正的幅度多大,那么这个新生代的VB可以发挥多少CLR的能力呢? 大家就拭目以待罗!
我只能打个比喻,同样的马力,扭力以及内部装潢,载女朋友的时候你要用的车子是长的像BMW的样子? 还是长的像电子花车?用VB用到很精通的情况之下,所以的工程师都会发现,要打破任督二脉,就必须去了解COM,否则永远无法突破,这个在.NET里头一样适用,要发挥.NET的能力,最後一定往C#走.所以要在.NET上发展程式,我绝对选原生语言C#,不会用VB.NET.因为,车子也不会因为他长的像飞碟,就可以不用轮子行走呀!
那么,同样是交通工具,台北车站到天珑,你会选飞机还是计程车?所以有些事情,在Windows平台上,Java或许做得到,但是做起来很复杂又不美观的时候,我用.NET.写GUI程式的时候我会选VB或Delphi,至少不会像JBuilder和Visual.NET一样,只是个简单的GUI,改了点property,竟然跑出一大堆让我不知道从何改起的程式码.每次看到这些无聊又重复的程式码,让我久久无法言语。
结语:
不管是大陆还是台湾的工程师,都存在著"广义中国人"的劣根性,东西还没出来,就可以诸多猜测,跟我们电视上那些算命的半仙没啥两样..而且,大家还真喜欢算命耶!难怪我妈看到我在读The Art of Computer Programming的时候跟我说,程式设计师和巫师没啥两样,只不过他们靠乌龟壳和咒语,而我们靠的是程式语言.我们总是人家在煮米粉,我们再喊烧,一大堆会写病毒的高手,一大票善於破解的高手.但是就是做不出世界级的软体.当然,这也骂到我自己了,但是我真的是对软体业没啥贡献就是了。
非官方观点,欢迎大家来信讨论.
moli.mt88g@nctu.edu.tw