对话 Eclipse 之父、《设计模式》作者 Erich Gamma

2016 年 6 月 1 日,北京香格里拉饭店,微软中国开发者峰会上,我见到了 VS Code 的负责人,当时的微软杰出工程师 Erich Gamma,那个时候,他更负盛名其实还是因为 Eclipse 和《设计模式》,他非常地 Nice,随身带了很多 VS Code 的贴纸,给我分享了很多,并眉飞色舞地演示着说可以贴在脑门上。如今 4 年过去了,每每回忆起这段采访时,总会不由陷入思考,有些话当时没有充分理解,而后却意味悠长。在此分享对话全文。

对话 Eclipse 之父、《设计模式》作者 Erich Gamma

微软在开源领域的一些举措和看法

Erich Gamma: 开源的发展速度非常惊人,尤其是微软。五年前谈到开源的时候,整个 Windows 没有什么开源的东西。这五年来我们发生了很大的变化,现在微软内部也有了很多流程与方法,能够让我们的工程团队去使用开源。

五年前,我们的律师一听到开源,第一反应就说“NO”,但现在律师也在帮助我们更好地往开源上做努力了。我们知道开源领域有很多争议,特别是 License 的部分,有些“License”也许存在一些灰色地带。然而在微软,我们的工程部门和法律部门都在帮助我们更加合规地做开源项目,比如 GPL。现在,在他们的帮助下,我们能够清楚地了解哪些东西是我们能够用的。

虽然是开源,但事实上对微软对我们所提供的开源元件是负责任的。微软对开源技术的应用横跨多个不同的产品线。我们内部对整个开源的元件都做了详细的记录,来帮助开发者和产品团队,让他们避免陷入到一些 License 问题里。我们很多开源的元件都有数据库去记录它用在哪个产品里,能够实现正向和反向的追踪。比如有的开源的元件造成一些问题,我们可以很清楚地对相关产品进行迅速准确的修正。

大家都非常清楚开源能够带来的利益,但是要从闭源走向开源,其实背后必须花费相当大的投入才能做到刚刚所说的完整性。虽然我们付出了很多的努力,但微软开源之后,确实得到了来自业界和社区的认可。

微软爱开源,不只是说我们今天用了很多开源的东西,事实上我们也做了非常多的贡献。就像是给和拿的关系,这也是一个很重要变化。我们不仅有完整的流程去使用现在的开源技术,也有完善的过程把我们开源的东西开放出来给别人使用。

另一个值得庆幸的是,透过开源这样一个合作机制,比如我们把东西放在 GitHub 上,可能跟另一个公司在产品研发上进行更为密切的合作。公司之间因为开源的分享、给和拿的机制,合作关系更为紧密。我们的工程团队也帮助某些公司去做黑客松,帮助他们运用微软的开源技术进行改进和创新。(例如:微软全球开发平台事业部,协助网易公司,采用开源的.NET CODE 平台,进行新一代的手游产品开发,获得更好的效能与更低的开发成本)

  • NET Core 的跨平台特性让.NET 框架得以运行于 Linux 系统环境中,因此可以在跨平台开发场景中,实现前后端的开发一致性,提升开发效率。

  • 网易游戏最新推出的移动游戏《绝代双骄 OL》在开发过程中即得到了.NET Core 的支持。这款游戏采用了同样是.NET 基金会成员的 Unity 引擎开发,并通过.NET Core 框架实现了在网易 Linux 服务器平台上的顺畅运行。以前,用 C#语言开发的游戏要在 Linux 服务器上运行,需要大量的转换工作来实现前后端的对接。而现在,.NET Core 直接实现了前后端的一致性开发,从而将人员和时间减少了 30%,而且其单服务器支持 1 万人同时在线游戏的性能,也很好地满足了游戏运行的需求。

所以当整个走向开源之后,我们的生意可以持续不断地得到伙伴和客户的支持,我们能够持续跟踪,这是我们持续改进的很重要的基础。这是从我的观点出发,微软从闭源走向开源的过程中,我们付出的努力,我们得到的收获,以及我们自己也觉得很棒的合作模式。

但是,开源并不是想做就能做到的。 对一般的企业我的建议是,你必须有一个完善的计划——如何选择哪些元件,针对每个元件的版本管理与集成测试,以及这些元件背后合规相关事宜。如果不能做到这些,那么大规模采用开源是一个非常有风险的事情。

微软都用了哪些开源的技术?

Erich Gamma: 在我自己所带领的项目 Visual Studio Code 里,就至少用了 1500 个开源的元件。这 1500 个元件里 90%是非常小的元件,包括 Node, Modules….很容易让我们的项目去使用。其中最大的元件是来自于谷歌的“Chromium Browser Support”的元件。谷歌是我们的竞争对手,但开源项目上最近又有很多合作。在开源项目里竞争和合作是非常有趣的,看起来公司间的业务是竞争关系,但在技术层面因为开源的关系,造成了这种合作的情形,也意味着在新的开源技术领域里,我们都在用对方开源的东西,但是我们搭建出来的东西在生意层面上会相互竞争。

微软为什么会从最初比较封闭的态度转变为现在对开源的积极拥抱?

Erich Gamma:其实开源对微软并不是新鲜事物,只是方法和心态上发生了变化。过去我们只是自己写,自己维护我们的产品,我们是贡献者,这并不是新的事情。现在则是我们用人家的,也告诉大家来用我们的产品。开源对我来说就是一扇门,打开了就可以接触到更多开发者。去年微软是排第一的 Docker 技术领域的贡献者。我们 Azure 的 SDK 也是开源的。(Azure SDK 的代码已经公开在 GitHub https://github.com/Azure/azure-sdk-for-net)

是什么吸引 Erich 加入了微软?2011年加入微软后第一次来到中国,这是不是意味着中国开发者市场在微软的战略上会有些不一样的变化?

Erich Gamma: 我 2011 年加入的时候,是因为微软给了我一个很吸引人的挑战:你能不能在浏览器里构建集成开发环境(IDE in Browser)。这一点对我非常有挑战,但是又很有吸引力。别的公司可能给我一个工作,但微软给我的是一个挑战,所以我决定加入。

讲一个非常有趣的例子,来告诉您中国开发者市场对于微软的重要性。我可以看到全球 Visual Studio Code 的下载人数,而且会定期查看它的变化。今年 2 月,Visual Studio Code 的成长趋势莫名其妙地下降了很多。我当时很着急,也很纳闷。但我的老板潘正磊女士(微软全球资深副总裁)则告诉我,“下降的原因不是你的产品做得不好,而是因为中国新年,他们在休假”。这件事也显示出了中国的开发者有多重要。我有跟很多来自中国的开发者交往,其中有一家中国的新创公司 Egret,跟我们合作很密切,他们在 Visual Studio Code 上开发从 Flash 转换成 HTM5 的游戏的开发工具、引擎,受到游戏开发者很大的欢迎。(http://www.egret.com/en/index.html)

从开源后到现在,对开发者和微软有了什么样的影响?

Erich Gamma: 我看到最大的贡献来自于效率的提升。当我们把 .Net Core 开源之后,有一大堆社区上的人帮忙看我们的代码,给出了很多改进意见。第二个就是说因为我们把 .Net Code 的源代码丢出来了,很多人会希望看看能不能让它在别的平台上跑,现在就在做这样的事。我们可以看到在 Linux、IOS,还有很多平台上,很多人在尝试能不能让.Net 跑起来。

现在 Visual Studio Code 的编辑器操作方式和以往编辑器的操作方式似乎完全不一样,但是和 Linux 上的工具却类似,这是为什么?

Erich Gamma: 在设计阶段就有这样的考虑,因为 Visual Studio Code 给的不是过去用 Visual Studio 的这群人,这群人更多是在 Mac、Linux 上做开发的。而他们要的是一个非常轻量级的,能够符合他们快速工作的东西,而不是 Visual Studio 这种比较重的比较完整的产品。我们是从给不同人群去用的角度出发的。一些资深的程序员更多地做解决方案的开发,他的项目有完整的内容、各种不同的东西,但对年轻的开发者,他们更有热情,但是做一些小的轻量级东西的开发,所以他们更喜欢这样的概念。

很多开发者是用很多不同的工具的,可能用 Visual Studio 做比较大的解决方案,但是用 Visual Studio Code 去做像 File Base 这些项目开发。这个使用行为就像是你打开笔记本,可以编辑一个文档,而 Visual Studio Code 就是让你拿来编辑代码的文档,是文档级别的编辑器。但是 Visual Studio 更多的是一个解决方案级别的 IDE。Visual Studio 是 IDE,Visual Studio Code 是以代码为中心的编辑器。如果你真的要用笔记本(notepad)去做代码编辑会很痛苦,因为你不知道到底字有没有拼错,Visual Studio Code 会很智能地帮助你分析代码是不是拼错了,因为它是专门针对代码的一个编辑器。Visual Studio Code 是我正在负责的项目,能够帮助开源的开发者去提高他们的生产力,除了在 Windows 上,在 Mac、iOS、Linux 上都可以使用。

Visual Studio Code 和 Visual Studio 是为了不的目的而开发的。Visual Studio 适用于开发比较大的解决方案,Visual Studio Code 则用于比较轻量级的开发,它的 Intelligence Sense 会很智能地帮助你分析代码是不是拼错了,以及协助你提升编程的效率。就我个人认为,对开发者如果没有这个东西,会受不了。

作为设计模式的作者之一,Visual Studio Code 用到了您的哪些程序设计思想。

Erich Gamma: 即使是 JavaScript 的开发,还是有一些设计模式是可以用到的。比如事件驱动的设计模式和异步编程模式,这两个事实上在 JavaScript 还是可以用的很好的设计模式。TypeScript 就更棒了,因为它是“强型别”的语言,所以 TypeScript 能够被应用于更多的设计模式当中。

TypeScript 是可以独立于 JavaScript 的使用还是支持 JavaScript。

Erich Gamma: 每一个 TypeScript 事实上都是 JaveScript 的程序。所以等于说 TypeScript 是基于 JavaScript 的基础所开发出来的改进的语言(Super Set),所有的语法的规范都是符合 JavaScript,彼此兼容。TypeScript 可以说是 JavaScript 在类别运用上的改进版。JavaScript 相对比较简单,因此,它不利于大型解决方案开发的用法。所以 TypeScript 主要是让基于 JavaScript 的大型编程更有效地去处理和开发。

刚才在会上也听到 TypeScript 是比 JavaScript 更安全。

Erich Gamma:效能上是没有差别的。TypeScript 其实会翻译成 JavaScript 执行。JavaScript 并没有这么多的要求,本身就是去跑,结果怎么样再说,但是 TypeScript 会拦截更多的错误信息,会有更多机会让你捕捉这些有问题的部分,从这个角度讲它是比较安全的。当它在做 TypeScript 转换成 JavaScript 翻译阶段之间,就已经在做安全性的错误的捕捉,JavaScript 怎么跑,TypeScript 出来的东西就怎么跑,所以效能是一样的。

JavaScript 比如我要呼叫一个功能,即使我拼错了,JavaScript 不会告诉我错了,但 TypeScript 会告诉我你现在呼叫了一个幽灵,不存在的东西,会拦截错误,更有效地帮助你做更好的代码编写。如果一千行,两个没有差别,我可能会用 JavaScript,5000 行,5 万行甚至 35 万行的代码,我就完全不会考虑要用 JavaScript。

相比 JavaScript,TypeScript 在国内开发者中有疑问的是,在具体开发实践中我们从何考证它的确拥有更好的效能?包括开发效率、稳定性等?

Erich Gamma:执行阶段两个效能是一样的,除了 TypeScript 本身捕捉,我很有信心我开发的 Visual Studio Code 能带来更多的帮助。对我来讲已经不是几倍的问题,你用另外的方法就可能会失败,用我的,代码的质量就会更好,维护的成本更低。TypeScript 可以更敏捷,最大的差别是能够让你重构,而 JavaScript 基本上不可能做这些事,从重构的角度来讲 TypeScript 是敏捷的编程语言。总之,这不只是开发效率的问题,是你能不能做的出来、是不是具备可维护性的问题。TypeScript 是大型项目的最佳选择,而且更安全。使用 Visual Studio Code 来开发,可以获得更好的开发效率。