
.NET技术发展历览
值此《程序员》百期专题,中国首届.NET技术大会(http://confer-ence.softcompass.com)也刚刚于2月底落下帷幕,很高兴接获杂志社邀请谈谈.NET技术这些年的发展,以及.NET技术大会期间和一些与会朋友的交流和思考心得。
谈技术发展,时间是一个重要的考察维度。任何技术是重大创新,抑或是昙花一现,时间是最好的裁判。在快速变化的IT界,9年并不是一个短暂的时间,作为判断一项技术的尺度已足够。我依然记得2001年亲身参加Bill Gates 在上海贵都酒店举办的技术峰会上向中国软件业发布.NET技术时候的情景(此前2000年6月,微软向全球发布自己的.NET战略,并于2002年2月正式推出.NET Framework 1.0RTM版本)。自此之后,我作为一名技术人员亲历了中国技术社区对.NET 从最初的热捧,到接下来的质疑,再到后来的拥抱,及至今天的些许迷乱。本文中,笔者将以“历史回顾”、“而立之年”、“未来展望”作为三个观察窗口,回顾9年来.NET所走过的风风雨雨,与读者朋友一起体味技术变迁的纷繁趣味,也希望能给后来者带来一些有益的启发。
历史回顾——.NET作为开发平台取得了战略性的成功
1..NET创始之背景
如果我们把镜头拉回到.NET 诞生前,即1997年至2000年这段时间,此时的微软刚刚从由Yahoo! 和Netscape 所掀起的互联网浪潮的打击中站稳脚步。就在人们认为微软将在互联网领域继续延续帝国之路时,一向危机感甚重的Bill Gates 却坐立不安。
首先是SUN公司于1995年推出的Java 语言,借着互联网的大潮迅速风靡,到1997年已经形成了包括 IBM、Oracle、 Apple等众多巨头在内的 Java 联盟。从发展势头来看,Java 越来越不像一门编程语言那么简单。由于使用虚拟机隔离了操作系统平台,其“一次编译,处处运行”的特性对于应用软件开发商来说具有巨大的诱惑力。如果任其发展下去,Java 极有可能在操作系统之上构建一套全新的应用程序平台。如果这样的平台为主流的应用软件开发商所采纳,Windows 操作系统相较于 Linux、Unix 等其他操作系统的优势将大大降低。那不仅将一举粉碎 Windows 作为操作系统王者的地位,而且将彻底颠覆微软其他应用软件所依赖的平台优势,极有可能动摇微软的“国本”。这自然引起了对“平台战略”有深刻认识的Bill Gates的极大警觉。1997年3月,由Bill Gates亲自拍板制定初期的应对战略:“微软开发的Java 只能在Windows上运行” ——此时的微软也是与SUN签订Java 许可协议的联盟开发商之一。SUN 很快发现了这一搅局行为,决定收回微软公司的Java 开发许可,于是两家公司开始对簿公堂。
另一方面,微软凭借握有OLE/COM和MFC的核心技术优势,刚刚平定与当时 Windows 平台的几大开发工具厂商 Borland、Symantec、Watcom(当时与微软并列有 C++四大天王之美称)之间的C++工具/框架大战。由程序天才Anders Hejlsberg(即日后的C# 之父)操刀的开发工具 Delphi,和在 C/S 方向异军突起的PowerBuilder,却在RAD组件开发领域又燃起了另一场针对Visual Basic 的战火。虽然借助Windows 平台和COM组件的原创技术优势还可以抵挡住此番对VB的围攻,但此时微软已经有点力不从心。如果任由这样的态势继续下去,更多类似Anders Hejlsberg 的天才还会冒出来,类似的工具/框架/组件战争还会层出不穷地上演,而且很有可能延续为类似 Java 所发起的平台战争,从另外一个方向达到架空Windows 操作系统的目的。
当此之时,经过几大战场的拼杀,微软自身在技术体系的发展上也有些乱了阵脚。从语言(VB、C++、VJ++)到框架/组件(Win32、MFC、COM、DCOM、ATL、ASP 等)到应用架构(桌面应用、C/S应用、B/S应用等),各自为战,杂乱无章——虽然中间微软曾经尝试使用 WindowsDNA 的概念来统一这些技术,但这种统一仅限于名词创新。真正从技术本质来讲,这些众多技术体系仍然是一盘散沙,难以有效整合,协同作战。这种状况不仅导致开发社区的混乱,就是连微软自身的很多技术人员也矛盾重重,争论与迷茫此起彼伏。
此时的微软,可谓腹背受敌,迫切需要一套全新的开发平台来一劳永逸地平息所有的战火、纷扰和迷茫,从而永续地支持Windows 系统之上的应用软件开发(包括微软自己的产品和其他开发商的产品)。就在微软与SUN开打Java 官司之时,微软便启动了这项旨在创建新一代软件开发平台的宏伟战略,并于1998年圣地亚哥的PDC大会上公布了.NET最初的内核。显然,最初的演示并没有引起技术界的兴趣。很多人认为那不过是COM的下一个版本而已。
几乎与此同时,微软受到美国司法部反垄断调查,到1999年愈演愈烈,关于拆分微软的呼声此起彼伏。2000年1月Bill Gates 辞去CEO职位。当时很多评论分析Bill Gates 辞去CEO之后的下一步就离退休不远了,微软帝国也会逐渐衰落。但是大多数评论者所忽略的一点是Bill Gates 正在以退为进全力构筑微软的下一代软件平台战略。事实上,Bill Gates 辞去CEO的同时,便披挂上阵担当了CSA(首席软件架构师)一职,亲自指挥对微软生死攸关起决定性的巅峰之役,那便是.NET平台战略。当2000年6月,Bill Gates以CSA的身份向全球正式发布.NET战略时,许多人已经开始听到“猛虎真正的咆哮了”。
2..NET取得成功的核心
虽然微软对.NET 倾注了巨大的心血和希望,但是刚开始人们并不买账。很多人还醉心于Windows DNA 编制的虚幻中——包括老牌COM权威DonBox 还在竭力澄清COM is not dead(参见Don Box 于2000年12月写的文章《Is COM Dead?》),但是整个微软平台已不可逆转地驶上了.NET之路。事实上,即便连Don Box 本人于2002年出版的《Essential .NET》的序言中也开始大谈.NET相较于COM的诸多好处了。
不过.NET 在推广初期却遭遇到了两大困惑。第一个困惑在于微软采用的.NET代号。由于同时期互联网的大热,微软在.NET 平台中对XML WebServices 倾注了过多的期望,这样很有互联网感觉的“.NET”最终胜出成为了最响亮的技术代号。虽然互联网是.NET 诞生的一大背景,但是.NET平台的精髓却实际上与互联网的关系并不大——事实上XML Web Services后来在.NET平台中发挥的真正作用十分有限。.NET 的核心精髓在于其作为组件级的统一开发平台,以高复用和高效率来灵活地支持各类软件开发的需求。这是.NET 在日后得以在各个开发领域大受欢迎的关键。互联网领域的编程只是其作为编程平台的一个分支而已。
第二个困惑在于微软将.NET标签同时贴在“开发平台”和“应用软件”上。由于微软对.NET 倾注了太多的希望,以至于初期的时候,微软将.NET 标签几乎打在所有的产品上。这不管对用户、业界、还是微软自己,都造成了一个不大不小的困扰。以至于很快业界便有许多质疑声音“我们并没有感受到.NET的存在啊?”“微软自己使用.NET 开发了什么产品?”……事实上,这确实是微软初期市场策略的失误。.NET 自创始开始就是一个组件级的软件开发平台,将其影响力延伸到应用软件产品线中并不是一个明智的策略。很简单,普通用户并不关心这个软件是否使用.NET 开发,或者由于它使用了.NET 开发而具有什么样的功能。普通用户关注的是“应用层面”的问题,而.NET 真正解决的是“开发层面”的问题。后来微软也意识到了这个问题,大概在2005年前后,微软便逐渐撤销了向所有产品贴.NET标签的做法,而改为将.NET回归到开发平台上来。

深入了解.NET技术的必读书《Essential.NET》
这两大原因让.NET 在推广初期遇到很多困惑,甚至导致一部分人发出“.NET失败”的言论。最典型的事件是2005年初Richard Grimes 在著名的 Dr. Dobbs Journal 上发表的《Mr.Grimes’ Farewell》表明其看衰.NET 的判断。这篇文章在当时的.NET 社区引起很大争论,但是就其内容来看,这篇文章只是对.NET 一些技术细节凌乱的指点,缺乏系统的、战略面的思考。
时间轮回到2009年,我们再来看.NET,一切似乎尘埃落定。除去微软早期不恰当地将.NET 部分寄托于XML Web Services 的愿望落空之外,.NET 作为组件级的软件开发平台,无可争议地取得了巨大成功。笔者认为.NET平台成功之核心有以下三点:
第一,.NET 把微软重新拉回到了“平台为王”的战略级竞争优势上来。可以说,正是这一“平台为王”的战略思想使得微软能够冲破20世纪90年代中后期在编程语言、工具、框架、组件等领域的“纷扰战火”和“重重迷雾”,一举“平定万乘”。.NET 平台推出之后,之前在 Windows 平台上与微软激烈酣战的一大批极具实力的开发语言/工具/组件/框架公司纷纷丢盔弃甲、缴械投诚——败得最惨的莫过于著名的 Borland,在为微软贡献了包括 Anders Hejlsberg 等一大批天才程序员之后,变卖家产,彻底退出开发语言/工具/组件/框架市场,转做 ALM 来给微软打下手,实在令人扼腕。.NET一战之后,在Windows 平台领域再无语言/工具/组件/框架级的挑战者出现,Windows 后院从此安享太平。
另一方面,.NET 平台的创立彻底狙击了 Java 开发平台向Windows 系统蔓延的战火,断送了 Java 以虚拟机平台架空Windows 系统的梦想。拥有了.NET的微软,对Java自然毫不留情。从此Java基本被隔离在微软平台之外,偏安一隅。随着硬件价格急剧降低、性能不断上升(摩尔定律),Windows在企业服务器市场不断扩张,与.NET里应外合,不断蚕食Java 在企业级应用的领地。
第二,.NET 平台在创立之时,背后就有一个庞大的商业模式和产品线的愿景在支撑。微软通过.NET 这一统一的组件平台,有效地实现了产品家族之间的粘合,改变了之前“各自为战,凌乱散漫”的态势,打通了各个软件之间的孤岛,将它们整合到一个战车上来,从此互相策应,互相支援。这也是为什么现在许多企业一旦粘上微软的产品,就再也甩不掉的原因。微软2000年之后,在企业级应用软件市场的突飞猛进,没有.NET的支撑,几无可能。
第三,微软另一个值得称道的是在使用.NET 横扫天下之后,又迅速利用.NET 建立起了一个规模庞大的Ecosystem。从此一大批中小软件公司在.NET 平台上繁衍生息,帮助微软一起维持着.NET生态的繁荣。建立软件Ecosystem是“平台为王”战略的自然延续,这在微软一向是驾轻就熟。
将前面3点总结概括,可以得出微软在.NET 上取得成功的秘诀,即:
(1)软件开发平台战略;
(2)自身成熟商业模式与完整产品线支持;
(3)与合作伙伴构建强大的Ecosystem。
这三大秘诀相辅相成,缺一不可。事实上,这三大秘诀是微软自Windows 平台之后就成功总结的法宝,.NET平台只是该战略在新的IT生态环境下的第二次复用罢了。

.NET logo的变化
3.竞争对手Java
谈.NET不能不提其强有力的竞争对手Java。.NET作为战略级的软件开发平台为微软带来了巨大成功,而同样作为成功“ 战略级软件开发平台”的Java,却为什么没有为SUN带来商业上的巨大成功呢?
我记得2001年在上海贵都酒店Bill Gates的自由问答环节,有观众提到类似“.NET如何抵挡Java咄咄逼人的竞争”之类的问题时,Bill Gates的回答中充满了对Java的轻蔑。要知道Java在2001年时可是如日中天,.NET 只不过是一个新生儿。当时许多评论都将.NET 当作微软帝国颓败中的一次苟延残喘——微软当时正遭遇着美国司法部的反垄断审查,Bill Gates 也因此刚辞去了CEO职务。不过,之后的发展却出乎许多论者的预料。在.NET和Java 交手的近10年时间里,微软借助.NET 平台构筑的平台优势,陆续推出重量级产品,稳居 IT 业霸主地位,并不断扩大自己的势力范围。而SUN却在Java 迷雾中一跌再跌,从当初最高达2000亿美元的市值,至本文写作时,竟然缩水到30多亿美金,并接二连三传出可能被收购的消息。
上一节笔者曾总结微软在.NET 上取得成功的三大秘诀。笔者认为SUN没有在Java 上取得巨大成功(甚至落败)的核心原因在于 SUN 只做到了第(1) 点:软件开发平台战略和第(3) 点:与合作伙伴构建强大的Ecosystem,而没有做到第(2) 点,即SUN在 Java 平台上一直没有为自己构建起成熟的商业模式和完整的产品线支持,可谓功亏一篑。
总体而言,Java 从1995年开始以Applet在互联网领域一炮走红,到1999年迅速调转战略方向构建起跨平台的J2EE企业级开发平台标准,这段时间内,SUN的总体战略和执行都很不错,给整个软件开发领域带来了一阵旋风,也给微软带来极大的颠覆性震撼。但是此后随着微软的快速清醒,并于2000年6月推出.NET平台之后,SUN 便在竞争中迷失了自己的方向。麦克利尼(SUN 公司创始人)不去思考如何围绕 Java 平台构建起核心的商业模式和产品线,而只是天真地认为只要控制了 Java 平台的标准与规范,拉起Oracle、IBM等兄弟联盟,就具备了与微软争霸天下的资本。在2000年之后,SUN除了忙于制定标准与规范收取许可费,和微软打打嘴仗之外,不知道都做了什么——SUN 在 Java 平台领域没有一款像样的中间件,服务器、数据库,甚至连 JVM 也长期落后于竞争对手,连个像样的IDE都开发不出来。即使后来在千呼万唤中羞羞答答地登台,大部分基本都是难以上台面的作坊产品,无法承担大规模的企业级应用。这对一个软件开发平台的缔造者来说真是一个莫大的讽刺。直到几年后,SUN才发现Java 联盟中大部分兄弟都赚得金钵满盆,只有自己赔上了巨大的研发费用,最后却穷得叮当响。甚至到2007年SUN竟然还挖空心思导演出“以Java作为SUN公司的股票代码”这一偏离商业核心的滑稽之作——说实话,当时我听到这个消息时,就已经开始感受到了 SUN 的穷途末路了。仅仅想靠“Java 的名气”,而不是扎扎实实的商业模式和产品线来提振股价的做法,在IT业是难以为继的。
不过,回头想想,这也有情可原。Java当初的走红本来连SUN自己都莫名其妙,要SUN快速围绕Java 平台建立起强大的商业模式和产品线,也许有些勉为其难。事实上,了解 Java 历史的人都知道Java 在1995年前后的走红实在是有点阴差阳错。Java 最初被开发为嵌入式设备的软件支撑系统(Java 的前身Oak),但随后偶然的被SUN 的工程师搬移到互联网上,并“莫名其妙”的风靡全球。既然当初 Java 的创新和走红就有些“莫名其妙”,那么之后在该创新上获取巨大商业成功也自然有些“虚无缥缈”。对比SUN当时的竞争对手微软,在.NET 创始之初就对其上的商业模式和产品线 进行了战略级的规划,之后稳扎稳打,步步为营,到今天在.NET 平台上的收获可谓“硕果累累”。
SUN 后期另外一个错误的战略在于拥抱开源。在硬件价格不断走低,整个 IT 业都以软件和服务的形式来构建自己的商业模式时,拥有强大通用软件开发平台Java的SUN却以软件开源来带动自己的服务器硬件销售作为战略,与历史背道而驰。开源听上去很有诱惑,很受公众欢迎,但是在开源上构筑一个公司的商业模式如同在浮沙之上构筑高台。事实上,纵观 IT 业,只有那些在其上找不到巨大商业模式的技术或产品,才被迫选择了开源。君不见, Oracle 天天喊支持开源,Oracle 何时会将其核心数据库产品开源呢?IBM也一副拥抱开源的姿态,IBM的WebSphere 何时真正开源呢?我真的想不出SUN拥抱开源的战略动机,我甚至怀疑SUN这样做是否仅仅为了和其死对头微软斗气?如果一家公司以和竞争对手斗气来制定战略的话,那就太不明智了——特别是又不幸选择了微软作为竞争对手的话。当然,这么说并非贬低开源的价值。开源自有开源的技术价值,但是开源不能成为一家公司的商业模式。事实上,Java除了来自.NET的正面攻击之外,冲击Java 最后防线的正是Ruby 、Python等开源产品和框架。
如果我们对比SUN在Java上的战略和微软在.NET上的战略,就会发现一些很有意思的问题。SUN是自己先忙着制定规范,然后让别人来做产品(雷锋精神),而微软是先做产品,然后根据自己的产品再制定规范(平台战略)。微软为什么一个产品推着推着,到了后期就成了巨无霸平台了(Office、SharePoint、SQL Server 等数不胜数),与这种平台思维有非常大的关系。
当然就技术而言,不管SUN最后结局如何,Java 依旧是一项非常成功的技术,SUN在IT业仍然有它不可磨灭的历史地位。SUN能够将 Java 从嵌入式设备领域一路拉扯成人,和合作伙伴最后将Java 打造成为一个强大的通用软件开发平台,与 C/C++、.NET 三分天下,令人尊敬。但是从SUN公司当初的出发点来讲,SUN 在Java上倾注的巨大创新和希望最后落败,SUN从当初傲视群雄,与微软争霸天下的硅谷明星企业跌落到今天提心吊胆被收购的命运,结果也实在惨烈。
在 IT 业,大致有两类创新,以及围绕这些创新的公司。一类是创新始终围绕核心商业模式开展,创新与商业相互驱动,螺旋上升,微软是这方面的典型代表。另一类创新往往是不经意间的石破天惊,创世之初不为钱不为利,这些创新刚开始往往没有思考清楚核心商业模式,如果后期战略补救不及时,大多最后都是为别人做了嫁衣,自己落得个孤苦伶仃被收购或破产的命运。技术创新如果没有清晰的商业模式做依托,先驱往往会成为先烈。SUN是这方面的典型代表,除了为之叹息之外,有时候想想真的很可爱,也许这也是IT业的一大魅力所在吧!
.NET与Java另外一个经常被喋喋不休的是有关“抄袭”的话题。许多至今仍对.NET 无法释怀的Java 拥趸一直认为是.NET抄袭了Java才取得了成功。其实虚拟机、元数据、垃圾收集等这些.NET平台的核心机制在Java之前早已有之,并非Java 独创。就笔者从与 Jeffrey Richter、BradAdams 等前辈那里交流了解到的信息,虽然.NET谈不上抄袭Java,但是微软开发.NET确实是在以下两方面得到了重大启发:
1.在Java 之前,微软的技术精英一直认为经过虚拟机抽象之后的Managed Code(包括其中的中间语言与JIT编译、垃圾收集、元数据等关键机制)相较于Native Code的性能是无法接受的,但是 Java 的成功让微软放弃了这种性能担心。一方面 ManagedCode的性能并没有因为虚拟机抽象就有大的损失,另一方面些微的性能损失换来的却是开发效率和复用性的极大提升。

2.在Java之前,微软整个技术体系“各自为战、杂乱无章”。微软从 Java 身上看到了统一开发平台的巨大优势,同时也认识到自身割裂的技术体系所隐藏的巨大战略风险。Java 的成功极大地加速了微软下大力气“统一软件开发平台”的雄心壮志。
从这个意义上来讲,如果没有Java作为借鉴和启发,.NET至少要晚几年才可能出现。这种从竞争对手那里得到借鉴和启发,然后利用后发优势追赶超越,是科技业的常态,我们没必要对此耿耿于怀。█