对话微软开源技术子公司资深总监 Gianugo:关键在于互操作性

阅读数:1237 2013 年 7 月 30 日

话题:微软语言 & 开发架构

Gianugo Rabellino 差点成为一个律师。在大学实习的时候,Gianugo 对法律工作的理解被颠覆,转而投向了程序员的行列,并成为了开源社区的活跃份子。在开源界活跃的 20 年间,他做过技术支持,做过 CTO,成立过自己的公司,并在 Apache 社区中的数个项目中被推选为 committer 和副主席。2010 年,他加入了微软。

现在,Gianugo 是微软开源技术公司(Microsoft Open Technologies, Inc, 微软全资子公司)的资深总监。MS Open Tech成立于 2012 年 4 月,其前身是微软的互操作性部门。根据公司官网的说明,MS Open Tech 的目的主要是“在微软与非微软技术之间搭起桥梁,通过开放标准和开放源码提升互操作性”。MS Open Tech 在 HTML5、Hadoop、Eclipse 等开源技术与 Windows、Azure、Visual Studio 等微软产品之间构建项目,并提供了 VM Depot 服务,为公共领域提供 VM 镜像共享的平台。

一个开源界的资深人士为何会加入微软?MS Open Tech 又是一个什么样的组织,它的目的和职责都有哪些?InfoQ 中文站近日跟 Gianugo 进行了一次交流,了解到一些以上问题的答案。

InfoQ:Gianugo,先跟大家做一下自我介绍吧。

Gianugo:我是来自 MS Open Tech 的 Gianugo。MS Open Tech 是一个独立的子公司。我在 2010 年 10 月加入了微软,到现在已经快三年了。一开始,我加入的团队是互操作性团队,这个团队后来分离出来,成为了现在的 MS Open Tech 子公司。Open Tech 的成立是为了进一步推动开放——在我们看来,这包括开放源码,开放标准与互操作性。

互操作性团队到现在已经有 7 年的历史。虽然名字变了,不过做的事情是差不多的。成立独立的公司,意味着我们更加敏捷,更加轻便,能够更好的适应快速响应的挑战——在开源领域,快速响应就是一切。

加入微软之前,我创办了 Sourcesense Europe BV 公司——欧洲最大的开源服务供应商之一。我同时为 Apache 工作——这是一个基于志愿者模式的组织。顺便说一句,Apache 基金会的主席最近也加入了 MS Open Tech。我呢,是个副主席。所以这也挺有意思的:这相当于他在 MS Open Tech 里给我报告,而我在 Apache 里向他报告。

当然了,Apache 是个志愿者模式的社区,也就是说,你在里面想干啥都行,并没有公司一样的等级划分,也没有老板规定你要做这做那的。我们有各自的职责——Apache 基金会的主席承担发言人的职责,同时要做一些行政执行方面的工作,比如签发支票之类的。每一个项目都报告给委员会,这样只是为了确保委员会了解项目的进程。

委员会的任务在于确保 Apache 社区的健康。社区是他们唯一关心的对象。好的代码来自好的社区。Apache 的座右铭就是:社区大于代码。这很有意思,因为它是个事实。

InfoQ:这挺有意思。MS Open Tech 在开源这方面主要是跟随 Apache 的文化么?

Gianugo:MS Open Tech 毕竟是个公司,它具有公司所具备的所有属性。不过,参与社区是我们的主要工作之一。我在开源领域已经工作了 20 年,在这个过程中,我深刻的意识到,开放源代码只是整体中的一部分,还有很多其他的东西。在 MS Open Tech,我们必须了解这一点。对我来说,重要的不是我们做什么,而是我们怎么做。

InfoQ:其他很多公司也有开源技术中心等对开源方面的投入。他们的做法是,雇一些工程师到公司内部,让这些工程师参与社区项目,将自己的代码贡献给上游。上游的 committer 或 maintainer 会审查、提交他们的代码,而他们往往来自不同的公司。MS Open Tech 也是这样的运作方式吗?

Gianugo:还有比这些工作更重要的事情。将代码贡献给上游,相当于请求其他人为你维护代码。这就好像是你送给人一份礼物,但这份礼物会加重别人未来的工作量。你必须以正确的方式去做这个请求,而不是直接将代码扔到墙的另一边,仅仅因为它是开源的,就认为这个项目应该接收这段代码。实际上,很多代码提交是被项目拒绝掉的。正确的做法应该是跟社区进行沟通,让他们知道你来了,你会留下,而不是扔下代码就走人。这是开源过程中很重要的一部分。

我们一直在复盘我们的贡献。如果我们贡献一段代码,那是因为我们认为它很重要,所以我们会继续贡献,而不是打了就跑。

InfoQ:比如说,对于 Azure 的 Eclipse 插件这个项目,整个流程是怎样的呢?

Gianugo:这个项目跟上面说的情况不同,因为这是个我们自己运作的项目。对这个项目来说,我们进行开发和分发,同时我们欢迎社区人士为这个项目贡献补丁。我们自己就是这个项目的维护者。所以,这个项目主要是看其他人是不是愿意参与进来。如果有人带了一个很大的特性过来,这个特性会加重我们的工作量,那我们需要做一个评估:这希望加入的 20000 行新代码是否有这个价值,让我们愿意处理这里面可能包含的 bug——或者应该说,肯定会包含的 bug。

一个更贴切的例子是我们在 WebKit、Blink 和 Firefox 上的贡献。我们根据他们的规则贡献代码。对于 Hadoop 和 Linux 内核也是同样。

在 Linux 内核这个领域,不乏自己开发驱动、分发驱动的公司,有些驱动甚至还是二进制的。我们也可以这样做,但我们没有。我们去找到了 Linux 内核社区的维护者,向他们了解我们应该做的。一段代码进入内核的流程非常复杂,需要进入测试分支,需要让一位维护者审核你的代码,需要回应他们的各种反馈,比如“我们不是这样处理系统调用的”,或者“我们不是这样处理空格的”。不管怎么说,这是别人家。各家有各家的家规,我们需要遵守。如果要成为 Linux 世界的好公民,WebKit 世界的好公民,Node.js 世界的好公民,我们就必须遵守他们的规则。这是参与社区活动的原则。

InfoQ:从 MS Open Tech 的官网来看,过去一年大概有 60 个项目左右,还有不少被归档的项目。

Gianugo:是的。正如我所说,我们在这块已经做了 7 年,所以项目是做过很多。

InfoQ:公司现在有多少人了?

Gianugo:70 个左右。这是比较合理的团队尺寸。另一方面,我们有一个叫 MS Open Tech Hub 的项目,通过这个项目,微软母公司的工程师可以临时加入 Open Tech,参与开源项目。这些人都加起来,人数就很多了。

对于我们做的事情,可以参考这个例子:目前,ASP.NET 的大部分代码都开源了,这是 MS Open Tech 的工作成果之一。开源的部分包括 MVC、ASP.NET 网页,Entity Framework,Razor 模板引擎,Actor FX,RX,TX 等等,差不多是全部了。

同时,这个项目接受来自外部的贡献,这意味着微软之外的用户可以给.NET 提交补丁,如果补丁被接受,下一个版本的微软.NET 产品中将会包含这些补丁。如果你去ASP.NET 的 codeplex 页面查看,就能够了解整个流程是怎样的。签署一个贡献者协议,就可以提交补丁。我们现在已经有为数不少的外部贡献者了。ASP.NET 已经是一个社区项目。

InfoQ:可以说,MS Open Tech 主要的工作就是两个:给现有的开源项目贡献代码,以及将微软的现有项目开源。

Gianugo:正是如此。这是一个趋势。这样做的原因有很多:将我们的技术更多的开源,会吸引社区的兴趣;参与更多的社区项目,可以使我们的产品也能支持这些技术,提供给我们的客户。Azure 和 Hadoop 就是这个关系。

InfoQ:你当时为什么决定加入微软?

Gianugo:因为我看到了这个趋势。你听过我的故事就明白了。

长话短说,我的故事是这样的:我在很多开源项目里做过贡献:Firefox,很多 Apache 的项目,PHP,等等。我是 Apache 软件基金会的成员,还被推选为副主席。总的来说,可以说我是个不错的开源开发者。

最初,我是一个律师。我在学校念的是法律,不是工程。在学校念完法律之后我才发现,我并不想做一名律师。所以,我不得不“重新创造”自己。但是呢,我又没有足够的资源再去读一个学位。这时候,我在开源界学到了我需要的一切。社区是个非常神奇的存在。想想看,一个意大利小村庄里的失意少年,这一天还在想着,“完了完了,我这辈子就要做一个律师了”,结果过了一天,我就在跟 HP、IBM 和 Sun 的一群工程师们谈天说地了,谈论的话题是一个叫做 Linux 的新鲜玩意儿。这种协作感深深地打动了我。

为什么加入微软?因为我看到微软在开源领域的投入越来越多。更重要的是,他们做事的方式是完全对路的。

当时,我还在运作着自己的公司,是个局外人。有一天我们要帮助微软做一个项目:创建一个开源库,可以用 Java 读写,打开 HTML 文件。我是在那个时候认识微软,并认识了我最终加入的团队里面的成员。当时我就发现,他们有很强的意愿去做正确的事,并且用正确的方式去做。所以,当我决定离开自己的公司,让它自己去成长的时候,微软给了我一个 offer,我感到很兴奋,就过去了。

微软有一点我很喜欢,就是他在开源这块有很清晰的界线。这年头,自称开源的公司多如牛毛,但实际上,很多公司的开源态度都很暧昧,他们的产品总是有那么一撮是不开源的,但他们又总是顶着开源的帽子行事。我们对于开源是很清晰的:这些是开源的,那些是商业的,就这么简单。清晰的界限非常重要。

InfoQ:这跟 Apache 许可协议有关么?微软对 GPL 协议总是有问题,你们是否总是倾向于 Apache 协议?

Gianugo:我们在 Linux 内核上贡献的代码自然是 GPL 的。对于我们发起的项目,Apache 协议是我们的最爱。不过,这并不妨碍我们在各类协议的项目中活动:BSD,GPL,乃至于AGPL。MongoDB 就是 AGPL 协议的。

当然了,协议只是工具,有各自的限制,优点和缺点。我们总是要想办法选择比较合适的。

InfoQ:那么,当你们进入一个新项目——比如 Hadoop 或者 MongoDB——的时候,设立的目标是什么呢?

Gianugo:首先,我们做这一切的最初原因,都是因为我们听从我们客户的声音,我们听从市场的声音。客户想要用某种技术。开发者们正在使用某些技术。我们的目标就是要让我们的客户和我们的开发者社区能够用上这些技术。

举个例子。我在这边参与的第一个项目差不多在两年半前,当时我们发现 Node.js 开始火了。所以我们就看看这个 Node.js 到底是什么东西,看了之后觉得这东西很有趣,有潜力。当时我们已经在琢磨 JavaScript 和 HTML 5 这档子事儿了,所以觉得这个东西真的不错。然后呢,我们试着在 Windows 上运行它,结果我们被惊呆了:这玩意儿压根在 Windows 上它就跑不起来!Node.js 仅仅是为 Linux 设计的。

于是我们跑到社区里,表示我们想要解决这个问题。社区方面的回应是标准的开源社区最佳回复:提交一个补丁吧。不过,他们说的更加具体:补丁你们随便发,不过,由于解决这个问题涉及到性能、可扩展性等,肯定要对原本的核心代码进行大手术,需要使用很多的 UNIX 语义,创建结构库等等。所以,无论你们做什么,请保证你们的补丁不会影响到 Linux 上的性能。这当然是很合理的要求。

几个月之后,我们和 Node 社区发布了一个叫做libuv的新平台,说白了就是可以让你在 Linux 和 Windows 上都能进行 event I/O。libuv 现在已经被不少其他的开源项目使用。有了这个之后,Node.js 在 Windows 上的性能提升了一个数量级,总算可以用了。有意思的是,与此同时,Node.js 在 Linux 上的性能也提升了 5%!当时社区发了一个声明说,这个新版本是首个可以在 Windows 上跑起来的版本,同时呢,它在 Linux 上也跑得更快了。这就是跟社区合作产生的力量。为什么说理解社区的运作机制那么重要,这就是原因。

所以现在呢,我们在 Azure 上可以提供 Node.js 的服务给我们的开发者。Azure 上现在可以用 PHP,可以用 Java,可以用 Python,可以用.NET,可以用 Node.js——我们为它们都提供了 SDK。而且,这些 SDK 都是开源的。而且,你可以给这些 SDK 提交补丁。而且,我们为这些 SDK 提供了开放的 RESTful API,全都有完备的文档。

在这家公司工作仍然令我很兴奋,因为我们在各方面做的路子都是正确的。

InfoQ:所以简单来说,你们的目标是两个:让微软的客户可以使用他们想要的各种技术;让其他技术领域的开发者可以在微软的平台上做开发。

Gianugo:是的。

看看我们现在所在的这间屋子:我们有这样多种类的设备,但它们打开网页的方式都是一致的。在今天,互操作性非常非常重要。市场上那些不重视互操作性的玩家最终都会被抛弃。客户有选择权,他们有权选择自己想用的技术,同时可用的技术又如此之多。你不可能将他们囚禁在一个技术领地里面。

曾经,我们有.NET 阵营,Java 阵营等等。你们做 QCon,QCon 大会上讲的编程语言何其多?分享的技术何其多?所以,我们必须要让不同的技术之间可以通话。

MS Open Tech 的使命是成为桥梁。互操作性是微软平台和非微软平台之间的桥梁。我们希望提供选择。有选择,客户才会来;没选择,客户就走了。