微软开源故事 | 开启 .NET 开源革命

如今,在微软构建开源软件是很正常的一件事——但早在2007年,我开始在微软工作时,情况并非如此。我们花了几年的时间才找到正确的方法,顺利开启了微软的开源之路。但是,如今我们已取得胜利,可以面带微笑地回首先前所面临的诸多挑战。我要讲述的故事是微软首个成功的开源项目,以及该项目如何为我们今天所处的位置铺平了道路。

90 年代后期,我就职于一家名为 Mustang Software 的创业公司,该公司构建的软件用于跟踪公司收到的所有电子邮件是否得到及时回复。在该创业公司于 2000 年被出售之前,我带领我的团队到奥兰多参加微软开发专家大会,大会引入了 ASP+(最终成为 ASP.NET Web 堆栈)和 C#。我和我的团队在会议上安装了预览版,我立即就爱上了 .NET。我继续在后续工作中使用 ASP.NET。


1Brad Abrams和Scott Guthrie关于Atlas的博客文章

然后在2006年,微软将 CodePlex 设置为源代码共享地。CodePlex 上的一个原始 Web 项目的代号为 Atlas,现在称为 AJAX 控件工具包。Atlas 是微软有史以来构建的首批开源项目之一,围绕 Atlas 的讨论非常激烈,对 Atlas 也产生了深厚的兴趣。正是 Brad Abrams 和 Scott Guthrie 关于 Atlas 的博客文章让我觉得我想参与微软正在研发的工作。

我给 Brad 写了一封电子邮件,对博客文章进行回应 — 不到一分钟,他就回复了!第二天,我们通过电话进行了交谈,一周之内,我就在微软园区进行了面试。突然,我就从阳光明媚的加利福尼亚州搬到天气变幻无常的华盛顿州雷德蒙德。

我加入了 Brad Abrams 的团队,负责所有 ASP.NET 工作。此外,我还负责全新的 Silverlight,它是将本机 .NET 开发引入浏览器的初步尝试,刚刚发布了第 1 版。ASP.NET MVC 处于早期原型阶段,虽然偶尔用作招聘工具,但仅在内部试用,它深深地影响了 Phil Haack,他于2007年10月加入团队。Scott Hanselman 大约也是在这个时候加入了微软,尽管他加入了其他团队。


2ASP.NET MVC是ASP.NET团队对Ruby on Rails大受欢迎的回应


众所周知,ASP.NET MVC 是 ASP.NET 团队对 Ruby on Rails 大受欢迎的回应——始于2004年,由独一无二的 David Heinemeier Hansson 作为 Basecamp 的一部分进行开发。到2007年,最新版本的 Mac OS X 已附带 Ruby on Rails!“模型-视图-控制器”模式与 Rails 基架的组合大大减少了 Web 开发人员需要编写的管道代码量,使得 Forms-Over-Data 网页令人愉快,Web 开发人员喜欢使用它。

ASP.NET MVC 也是对 ASP.NET Web 窗体遭受的批评的一种回应。ASP.NET Web 窗体的构建旨在将所有这些 Windows 窗体开发人员聚集到 Web 上 — 而无需学习太多东西。ASP.NET Web 窗体做到了这一点,众多新的 Web 开发人员都使用它创建网站。但经过几年的发展,很明显 ASP.NET Web 窗体也存在一些问题:向开发人员隐瞒网络本质的过程意味着背后一些丑陋的问题。

例如,在 ASP.NET Web 窗体页面上 C# 代码和 HTML 的混合方式使其难以构建单元测试。如果无法测试,久而久之,大型网站的维护和修改工作会变得更加困难。如果您确实创建了测试,这些测试大部分是运行 UI 的功能测试 — 即使是在今天,这也是一种脆弱的测试构建法。对网页的任何更改都很可能会中断该页面的所有测试。

ASP.NET MVC 的早期原型令人印象深刻,足以让 Scott Guthrie 决定将其在德克萨斯州奥斯汀举行的首届 ALT.NET 大会上首次公开亮相。ALT.NET 运动源于一群充满激情的开发人员,他们喜欢使用 .NET,但他们认为开源工具应是该因素的一个重要组成部分。


3在微软历史上的那个时候,“非我发明症”甚嚣尘上

在微软历史上的那个时候,非我发明症甚嚣尘上 — 非微软制造的软件往往都会大打折扣。很多客户都乐于只使用微软制造的工具,使这种态度得到了加强。当微软宣布正在构建自己的对象关系映射器(被称为“实体框架”)时,此方法就到了紧急关头。其他对象关系映射器解决方案(如 nHibernate)的倡导者对于构建另一个对象关系映射器、而不是支持现有解决方案感到恼火。这些倡导者成为 ALT.NET 的开端,到2007年10月,他们召开了首次会议。


4从一开始Scott Guthrie就说MVC将是开源的

在 ALT.NET 大会上,Scott Guthrie 概述了 ASP.NET MVC,这是 ASP.NET MVC 的首次公开亮相。Scott Hanselman 在 IronPython 中演示了用于 MVC 的构建控制器,Phil Haack 使用 IronRuby 进行了类似的演示。演示的所有内容都是原型代码,不会以当时展示的形式上市,但这是一个非常有趣的开始,每个人都希望开启微软的新时代。从一开始,Scott Guthrie 就说 MVC 将是开源的。

在 ALT.NET 大会召开的同一周,微软还将整个 .NET Framework 的源作为参考源打开了。现在,您可以在调试应用程序的同时进入 .NET Framework 基础代码。它不是我们今天所知道的开源,但它是走向开源的又一步。

MVC 和 Silverlight 也是网络团队“带外”发布的首批产品。.NET 和 Visual Studio 的每一个新版本都需要 24-36 个月才能实现 — 每个差不多需要一年的时间进行规划、编码和修复上市。很明显,此周期对网络世界,特别是 MVC 来说还不够快。毕竟,Ruby on Rails 每年都会推出一个新版本。

2007年12月,我们发布了 MVC 的社区技术预览版,为最近发布的 Visual Studio 2008 和 .NET 3.5 提供了基本工具(项目模板)。该预览版是 MVC 的第一个版本,任何人都可以下载并开始试验。

2008年2月,在 Mix 08 会议之前,新版 MVC(即 MIX 预览版)不仅增加了人们一直要求的一系列功能,而且还增加了大量新工具,包括直接支持开源测试框架,如 NUnit 和 MBUnit。

在 Mix 08 会议之后,MVC 本身的源代码也可供下载、编译并用于调试。这不是我们今天所认为的那样,也就是说,团队在编码时将代码提交至存储库。更准确地说,MVC 在内部开发,然后一部分代码被发送到 CodePlex。


5在CodePlex上与公众互动是实现开源项目之路上进行的早期透明度实验

移动 MVC 代码副本并在 CodePlex 上就其与公众互动是实现开源项目之路上进行的早期透明度实验,微软内部对此有很多担忧。目标是每隔几周推出一次更新,希望有一天可以每天推出一次更新。

大约是那个时候,我们遇到了一个有趣的问题。ASP.NET MVC 的关键部分是路由 — 能够将请求传递到控制器中。ASP.NET 动态数据的工作人员还将路由用于他们的技术,我们每个人都构建了自己的实现。事实证明,非我发明症甚至延伸到个人团队之中!我们花费了一些时间对路由的独特之处进行抽象,使其与基本代码区分开来,并到达一个路由引擎,当时作为 System.Web 的一部分。

此过程的副作用也是创建路由调试器。该调试器起初是一个私有工具,帮助我们了解新的共享路由模型的情况,最终也使与世界分享它变得有意义。

对代码版本命名也是一个有趣的问题。ASP.NET MVC 的初始版本被称为社区技术预览版。之后,我们将名称改为预览版,有些编号了,有些则没有。但是,由于起初无法频繁发布新代码,实现不了 CodePlex 每隔几周就有新代码这一目标,因此我们推出了 Source Refresh。过程有一些混乱,但我们不断学习 — 最终,预览版很快就发布了,备用名称也停止使用。


62008年9月,MVC的预览版5正式推出

2008年9月,MVC 的预览版 5 正式推出 — 该版本棒极了,但更重要的是 jQuery。早在2006年,Jon Resig 就开始将 jQuery 库用作一套紧凑的开源工具,简化在 JavaScript 中的工作,同时,CodePlex 上的许多人都认为,MVC 应该利用 jQuery 的工具。合并 jQuery 对微软来说是一个了不起的挑战 — 使用开源软件是一回事,创建开源软件却是另一回事,但是将开源库包括在产品内?太疯狂了!

但这对使用 jQuery 来说是合情合理的。无论如何,在 MVC 中完善各项特性需要使用 jQuery 提供的大部分功能。为什么要重新创建轮盘(改变色调怎么样)?我们制作的许多不同的网络产品都可以利用 jQuery,以至于 Scott Guthrie 在他的博客上宣布,下一版 Visual Studio 将附带 jQuery,最终于2010年做到了这一点。

此时,早期版本的 Microsoft Azure 也在全球推出,我们尝试将 MVC 与 Azure 一起用作11月发布的 MVC 测试版的示例 — 它在洛杉矶举行的微软开发专家大会上作为演示展出。

2009年3月,MVC 的交付厂商版(第 1 版)在 Mix 09 会议上上市。我们在 CodePlex 上发布了带 MS-PL 开源许可证的代码。该许可证非常简短,今天被视为类似于 MIT 许可证(这是微软目前大部分时间都在使用的许可证)。开源促进会批准了 MS-PL 许可证,但该许可证在某些领域仍然存在争议 — 微软为什么要自己制作许可证?其中到底隐瞒了什么?当然,MS-PL 许可证没有任何棘手的问题,从长远来看使用它最终没有任何意义 — MIT 或 Apache 许可证也同样适用。但在微软内部,有些法律人士更乐意看到这样,但不理解为组织设置独立许可证的不利方面。


7jQuery添加到Visual Studio 2010中确实代表了一种新的风险

法律团队而言,在 Visual Studio 2010 中添加 jQuery 确实代表了一种新的风险——如果添加到 jQuery(包含 GPL 类型的许可证)的代码会影响 Visual Studio 其余部分的许可会怎么样?当时,对 GPL“自由拷贝”法的担忧意味着法律人士认为它具有“传染性”。将 GPL 许可软件并入具有传统版权(如 .NET)的软件将侵犯版权。

如今,似乎这些担忧有些过度,但这些是处理过以下类似诉讼案件的法律人士:Microsoft Word 中意外地含有一些代码,导致从全球各地的商店货架上删除了 Word 的物理机器。该主张成本很高——2009年,我们仍上市了大量软件。

为了缓解 jQuery 的法律问题,我们实施了大量程序。我们构建了工具,使用这些工具测试 jQuery 源代码的出处——这些工具将查找代码并检查所有许可。只有一次,我们发现参与者添加了一些 GPL 许可代码 — jQuery 工作人员甚至都不知道这件事!根据 MIT 许可证,jQuery 被许可用于商业用途,jQuery 中的 GPL 许可代码是没有意义的。


8我们*永远*不应该改变第三方开源库的许可证

就在 Visual Studio 2010 发布之前,我接到了法律部的一位律师的电话 — 法律意见书认为,Microsoft 软件包中提供的任何代码(包括 jQuery)都应获得 MS-PL 许可证的许可。我被拉进一个电话会议,在会议上,我强烈主张(说了一些难听的话)我们*永远*不应该改变第三方开源库的许可证。MIT 和 MS-PL 非常类似,这一点并不重要——像那样更改许可证实在是太粗鲁了。这样做没有得到什么有意义的好处,反倒对我们作为开源支持者的声誉造成了重大损害。

最终,我们的法律团队接受了此次开源之旅,当 Studio 2010 发布时,jQuery 的捆绑版与其原始的 MIT 许可证相关联。Visual Studio 2010 还包括 ASP.NET MVC 第 2 版、Silverlight 4 以及其他大量出色的工具。

此版本奠定了基础,成为我们如何在微软开源的榜样项目。当 ASP.NET 团队开始规划跨平台的主要新版本时,我们很自然地与社区合作,公开地构建新版本。最终,这项工作扩展成 .NET Core 以及 .NET Foundation 的成立,以支持 .NET 平台上的开源协作。

(要了解有关 .NET Foundation 历史的更多信息,请查看 Beth Massi 的帖子:建立开源 .NET Foundation)。

回顾过去,看看我们如何尝试开源,学到一些经验教训,并继续使用有效的方法进行构建也是一件很有意思的事情。如果当时没有做那些工作,我认为我们不会有今天所取得的成就。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值