[摘要]最近这半年的讲师生涯之中,遇到不少从VB转到Java的学生,绝大大部分的工程师或新进软件开发领域的朋友都会问:"我该学.NET 还是Java ?" "该学C# 还是Java ?"相关的主题在网路上可谓暗潮汹涌,随时可能擦枪走火,在发表本文之前, 自己把C# ...
最近这半年的讲师生涯之中,遇到不少从VB转到Java的学生,绝大大部分
的工程师或新进软件开发领域的朋友都会问:"我该学.NET 还是Java ?"
"该学C# 还是Java ?"相关的主题在网路上可谓暗潮汹涌,随时可能擦枪
走火,在发表本文之前, 自己把C# Spec 深入地读了一次 ,也大致研读了
.NET的相关技术文章所以想想在此发表一心得,没有什么预设立场,请大
家多多包含。
本文适用对象:
"本文内容只适用一般工程师,特殊情况不算!"
何谓特殊情况呢?以我个人为例,明明知道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
……