文 / 刘如鸿
2000年对于微软是颇有意思的一年,一方面终于迈入了21世纪,担心许久的千年虫问题也没有预想中的那样大面积爆发,通过Windows 95和Windows 98的成功,微软在桌面电脑市场取得了绝对垄断的地位。虽然官司不断,但通过IE捆绑策略也终于彻底打败了傲慢的Netscape,搭上了互联网班车。而Windows 2000的发布也结束了Windows 98和Windows NT两个平台互不兼容、互相掐架的问题,在全新的NT 5.0内核上,服务器和客户端操作系统终于得到了整合。至于办公软件领域,从Office 97之后已经睨视宇内,Lotus Note已经渐渐退出市场,再也没有了重量级的竞争对手。
可在开发工具领域,自从1998年发布Visual Studio 6.0之后,在语言的角度似乎已经止步不前,鼓吹多年的COM技术依旧令人称垢,极高的开发门槛加上本身的复杂性,使自家的VB始终不得其入。而在另一方面,1995年Sun公司推出的Java语言风生水起,因为其倡导“一次编程,到处运行”,加上面向对象、垃圾回收、健壮性等诸多优点,使得这个原本用来开发嵌入式设备和桌面应用的语言反倒在服务器开发领域异军突起。
反观微软本身,虽然Visual Studio 6.0号称做到了同一开发平台可以编写多种语言,可实质上只是不同语言、不同开发工具的大杂烩,不同语言之间是彼此孤立的,如果说和Java一样,只是同样做到了可视化开发,或许这就是Visual Studio的本意。
不管是出于进军中高端服务器市场的需要,还是对竞争对手战略防御的考虑,微软都需要一个全新的开发平台来锁定开发人员,使其能够在微软的平台上进行开发和提供服务,这不是令人晦涩的COM或者COM+,也不是Anders初到微软的作品WFC(可有多少人还记得当年的Visual J++?),也不会是VC++,因为令人绝望的MFC让大多人望而怯步,当然也不会是VB,它无法胜任相对底层的应用开发,当然,更加没有理由是Java平台,这不符合微软一直以来的风格。
Windows 2000推出之际,微软提出了一个NGWG(下一代的Windows服务)的愿景,除了作为市场宣传的噱头,一个模糊定位的概念并没有做到让多少人明白,对于当时已经全球领先的微软而言,需要一个全新的、充满想象力的平台来延续他们的成功。
2000年,在那年的6月22号,比尔·盖茨向全球宣布其下一代软件和服务,即Microsoft .NET平台的构想和实施步骤。新一代的Microsoft .NET家族产品和技术替代了此前“下一代Windows服务(NGWS)”的提法,它涵盖了帮助软件开发商构建下一代互联网服务和给予新一代智能互联网设备强大功能的软件。此外,微软还宣布了基于.NET平台的新产品计划,其中包括新一代的微软Windows操作系统、Windows DNA服务器、微软Office、MSN互联网网络服务、Visual Studio开发系统。
当时,许多人怀疑这是否是微软一次市场宣传的Buzz Word,微软是否会在未来的十年乃至二十年坚定地推进他们构筑的.NET战略。2000年微软的白皮书这样定义.NET:Microsoft® .NET 是Microsoft XML Web Services平台。XML Web Services允许应用程序通过Internet进行通信和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。Microsoft .NET 平台提供创建XML Web Services并将这些服务集成在一起之所需。对个人用户的好处是无缝的、吸引人的体验。
显然,微软把.NET战略真正押宝在了XML Web Services之上,时隔十年之后,我们可能会说当初微软的决策是极具远见和充满想象力的,可在当时,孰是孰非谁人定论。在平台正式推出之前,为了推进.NET,微软开展了一场声势浩大的Dotnetination(.NET化)的运动,几乎所有传统的、创新的、虚构的产品统统打上了“.NET”标签,最典型的莫过于2000年底推出的.NET Enterprise Server,本质上和.NET技术毫无关系,仅仅是因为这场声势浩大的宣传运动中,需要这样的铺垫罢了。
不可否认,微软在当时过分“夸大”了.NET战略,加之2001年推出的Windows XP并没有.NET的影子,于是渐渐有人怀疑微软用心不专,是否在逐步地放弃当初的信誓旦旦,所谓的.NET战略只是水花镜月。
2002年,一段时间的步履阑珊之后,2002年2月13号微软正式发布了Visual Studio .NET 2002,其中包含了.NET Framework 1.0,除了引入一门全新的语言C#之外,同时提供了对于Java的支持。也有人怀疑过微软当时推出J#的意图,现在看来不过是为了吸引更多的Java开发人员转投.NET怀抱罢了,而不是对于Java市场的有心经营,这个在后来的Visual Studio版本也得到了证明。
作为一个全新的开发平台,在语言方面,C#大量借鉴了Java的语法,同时保留了VB方面的诸多便利性。作为平台的重头戏ASP.NET,也传承了微软一直以来的可视化设计风格,允许开发人员以拖放方式开发Web应用,对于许多人来说是极具吸引力的,于是逐步有开发人员转投.NET怀抱。尤其是随着Borland的没落,越来越多的Delphi开发人员投向了.NET或者Java阵营。而在开发工具的支持上,.NET无疑是有巨大优势的。
可是.NET 1.0毕竟是全新的平台,许多类库是不成熟的。尤其是安全方面,如果反射看过当时的.NET Framework源代码,可以看到许多仓促的痕迹。另外也继承Windows一直以来的毛病,在7×24运行的场景下,还是“不靠谱”了一点儿,虽然相对于COM,已经好上许多,但依旧会出现一些“诡异”的场景。
2003年4月25日,曾被命名为Windows .NET Server的操作系统Windows Server 2003正式发布,同日发布了Visual Studio .NET 2003,并将.NET Framework的版本升级到了1.1.4322。这个四度易名的Windows操作系统内置了.NET Framework 1.1,同时IIS的版本升级到了6.0。相对于当初.NET战略的喧嚣,此时的微软对于.NET已经低调务实许多。除开发工具本身,对于微软而言,Windows Server 2003是一个非常重要的里程碑:一方面证实了Windows操作系统在企业级应用的能力,一方面.NET终于完成了和Windows操作系统的无缝集成,也真正意义上为开发人员提供了一套完整的.NET解决方案。
在这个版本的.NET Framework中,修正了大量1.0的Bug,性能和稳定性也得到了比较大的提高,与此同时引入了手机应用开发,包含了.NET Compact Framework。不管开发桌面应用,还是Web应用,或者是手机设备的应用,Visual Studio .NET提供了统一的开发语言和开发界面,使得开发人员能够在不同应用开发中自由切换。
随着.NET Framework的稳定,微软内部越来越多的产品采用.NET重新开发,或者提供了和.NET的无缝对接,这个也就是微软一直强调的“Connected”。所有的软件和产品都是可以互联的,其中莫过于2003年发布的Exchange 2003、Office 2003以及2004年发布的Biztalk Server 2004,允许开发人员使用.NET开发应用,并且做到了无缝集成。
在2003年拉斯维加斯的微软开发者大会上,微软首次展示了开发代号为“Whidbey”的下一代开发工具。与此同时展示了开发代号为“Yukon”的下一代数据库服务器,也就是后来的SQL Server 2005。令人惊艳的远不止这些,还有开发代号为“Longhorn”的下一代操作系统,在这个全新的操作系统中,包含非常重要的几个组件:
Avalon:图形渲染引擎,全新的XML定义语言XAML,使其可以用类似HTML的文本语言来定义界面,并提供了华丽的界面效果。
Indigo:通信子系统,这是微软为了解决异构通信协议而设计的,旨在希望通过它帮助开发人员以不同的方式提供服务和通信。
WinFS:文件子系统,现在看来,这是微软一个美丽的谎言,也是微软对于文件系统伟大的梦想。据说关于WinFS的概念设计早在2000年就被提出来,并希望应用于新一代的SQL Server。2003年虽然实现了技术原型,但终究因为无法克服的性能问题,微软不得不将计划搁浅。
与此同时,微软承诺提供一个.NET编程接口,叫着WinFX。可也正是从这次大会开始,微软不断跳票成了一种习惯。就如前面提到的,2004年之前微软发布的大多产品,都是部分甚至全部采用.NET重写,至少提供了开发方面的无缝支持,也就意味着开发人员可以使用C#或者VB.NET在微软平台上开发所有的应用。这里又不得不提Longhorn了,这个“长角”的犀牛似乎有些吹牛不用本钱,一次又一次地跳票,发布日始终无期,有消息说Longhorn考虑过全部用.NET重写,但这显然是疯狂、不切实际的想法。毕竟Windows的历史包袱太过沉重,另外在没有硬件支持的情况下,CLR运行效率在针对系统级方面的开发是否有性能问题还是要打个问号。
2005年,一切风调雨顺,两年前PDC大会给众多开发人员吊足了胃口的Whidbey和Yukon,终于在2005年11月7号姗姗来迟。一直以.NET命名的Visual Studio换成了Visual Studio 2005,同时将.NET Framework的版本升级到2.0,在CLR底层引入了泛型,同时为了方便开发人员,内置了一个用于开发调试的Web服务器,使得开发人员在开发过程可以更加方便地测试与部署。一般来说微软的产品到第三个版本才会稳定下来,.NET Framework也逃不过这个宿命。CLR并不是简单的类库方面的升级,而是全新的CLR,相对于1.1版本,运行效率和稳定性都有了大幅度的提高。
在开发方面,微软第一次兜售自己的软件开发方法学,Visual Studio为开发人员提供了全套的解决方案,使开发人员可以在不离开IDE的情况下完成团队协作。而在类库方面,引入了Web Parts、Membership、Master Pages、Theme等多个能够加快Web应用开发的技术。只是在这点,微软犯了一个不大不小的错误。一直以来微软开发工具的设计原则是“拖放操作”,而ASP.NET 2.0的许多技术也正是契合这样的设计思想,只是微软依旧按照桌面开发的设计思路去引导Web开发。世界已经改变,在浏览器市场,由于微软多年的不思进取,Firefox被逐渐接受,同时随着Web 2.0崛起,越来越多的网站设计师倾向于更加简洁的界面和更加丰富的用户体验,于是DIV+CSS和Ajax变得越来越流行。不管Web Parts也好,Membership也罢,虽然可以通过拖放很简单地完成一个业务功能,但是过于冗余的HTML生成加上自身模型的复杂,除了一些对性能和用户体验要求不是很高的站点,在Web开发上,开发人员更加愿意坚持手写HTML和使用简单的“控件绑定”。因为他们深信唯有如此,方可写出符合Web 2.0风格的Web应用,而Visual Studio 2005能够帮上的并不多,加上第一次集成了Visual Studio,开发工具的性能并没有得到很好的解决。不管如何,这是一个成功的Visual Studio版本。
同日发布的SQL Server 2005完全架构在.NET之上,并允许开发人员使用.NET编写存储过程和函数,并且因此了XML的数据类型,同时支持.NET编写的用户自定义类型(UDT),在这个版本的数据库上,.NET从之前的“Connected”变成了“Embed”。同时SQL Server 2005引入了激动人心的SOAP支持,这就意味着可以直接将数据库暴露成Web服务,从而提供给应用系统直接访问,为了方便开发人员进一步基于SQL Server进行开发和管理,SQL Server 2005引入了全新的管理界面——SQL Server Management Studio,并且和Visual Studio 2005的界面一致。
2006年,Longhorn操作系统的一次又一次跳票,几乎让所有人都失去了耐心,为了抚平抱怨不断的开发者社区,也是为了挽回些颜面,微软将WPF(图形渲染)、WCF(通信)、WF(工作流)和Windows Cardspace整合成代号为“WinFX”的.NET Framework 3.0,并于2006年11月6日发布。不过此WinFX并不是三年前提到的WinFX。不管如何,从某种程度来说,微软在三年前的开发者大会的承诺总算兑现了一部分,3.0并不是一个全新的.NET Framework,而是2.0的补充,之前提到过2.0在CLR层面脱胎换骨,但是在基础类库上依旧比较薄弱,随同2.0发布的许多新类库华而不实,并无法对开发者社区产生重大影响。而3.0的发布是对2.0框架的一个重要补充,它弥补了微软在企业级开发的软肋。
同年Biztalk Server 2006发布,如同SQL Server 2005的做法,这是一个完全用.NET编写的企业级平台,也是完全支持.NET的开发平台。
2007年1月30日,在一次又一次的跳票之后,微软终于全球发布了全新的操作系统——Windows Vista,或许是因为等待了太久,所以期望很高,失望也就更大。我想更多的是因为不断跳票,包括之前的过度许诺,加上对于硬件要求苛刻和驱动的不兼容,从上市的第一天开始Vista就恶评如潮。这个全新的操作系统理所当然地没有全部用.NET编写,因为这本就是天方夜谭。因为诸多的原因,大多企业并没有选择从XP迁移到Vista,而是持续观望,等待下一个版本的Windows。本希望如Windows XP那般成功的Vista注定是一个过渡的操作系统。
2007年11月19号,时隔.NET 3.0发布一年之后,微软发布了Visual Studio 2008,随同发布了.NET Framework 3.5。虽然在CLR上没有改变,依旧是作为2.0的一个扩展,但是在编程模型上,有了重大突破。如果说.NET之前都是处在追赶和模仿其他平台的阶段,那么3.5将是一个华丽转身,Linq和XLinq为开发人员带来了激动人心的编程体验。开发人员可以混合对象与数据,然后用同样的查询方式进行数据处理,更重要的是允许开发人员在任意环节进行扩展,许多Web 2.0网站或者开源框架都提供了Linq for XXX的Provider,从而帮助开发人员以一致的方式进行数据处理。
同年Exchange 2007和Office 2007发布,在企业级办公领域,微软拥有越来越强的竞争力,贯彻微软一致以来的作风,.NET编程在服务器端和客户端都得到了淋漓尽致的支持。
2008年2月,Windows Server 2008发布,随同一起的有IIS 7.0。之前的IIS访问.NET,都通过aspnet_isapi来转发的,也就是说并不是IIS天然支持ASP.NET,而直到IIS 7.0全新引入的管道模型,.NET终于成为Windows操作系统密不可分的一部分。
同年8月6号发布的SQL Server 2008,配套Windows Server 2008和Visual Studio 2008,立足于.NET技术,构成了完整的Windows应用解决方案。八年时间,从一个模糊不清的概念到如今的无处不在,这家全球最伟大的软件公司一直以来不遗余力地推进它的.NET战略。
翘动未来的可能
经过近十年的耕耘,微软创造了一个全新的软件开发平台,其中有浮躁、挫折,更有锐意进取。当年的小伙子Scott早就掌管了微软的开发工具事业部,或许他个人的成长历程犹如.NET的成长,喧嚣之后,云烟散尽,当年的.NET梦想已经照进现实,可是否如微软当初预期的成功,外界很难明了。
不过有一点可以肯定,微软通过.NET战略改变了软件开发格局,同样也改变了微软。这家以封闭保守著称的公司,一直以来对开源世界嗤之以鼻,这个状况从2005年之后逐步改观,毕竟开放的微软远比固执的微软更受欢迎。2006年5月启动的codeplex.com,是一个微软拥抱开放的重要标志。除了社区上的开源代码,微软也逐步地将一些内部的产品开源,著名的莫过于Enterprise Library和ASP.NET MVC,与此同时越来越多的开发经理和产品经理开始通过Blog和世界保持沟通。
临即发布的Visual Studio 2010,也带给了我们更多的期待,能够坚持十年去做一个事情已经很难得,未来的路很长,对于微软如此,对于开源世界亦如此。而对于我们每一个人,我想用《程序员》杂志的“技术改变世界,创新驱动中国”来作最后的总结。
有梦想,就有可能。
作者简介:
刘如鸿,擅长大型系统的架构与互联网产品设计,目前为支付宝上海研发中心架构师,专注于系统架构设计。
(本文来自《程序员》杂志10年04期)