导读:这是我们结合在三个不同的播客内容。Jared Parsons 回顾了他在微软工作的二十年,包括他在 C# 开源方面所做的工作,希望对技术团队管理者有借鉴意义。
在微软工作 20 多年,贾里德·帕森斯(Jared Parsons)称自己在不断迈出胜利的脚步。
在最近的两个月时间, Parsons 出现在三个不同的播客上,他在X平台回顾了作为 Microsoft C# 编程语言首席开发人员领导团队的九年时光。
在《软件工程日报》播客中,Parsons 回忆起自己开源 C# 的经历,以及此后为了让开发者群体满意而实施的全部工作。
他讲述自己和这个编程语言的变迁,相信也有很多人都看到了变化。
早在 2004 年,C#发布周期是“大约在两到五年之间”,但是现在每年就会发布一次,而且 “Visual Studio 每年发布大约四次”,比以前加快了不少。
Parsons谈到,他记得一位新晋开发人员抱怨,错过了他们新功能开发的发布窗口。“过去,当我错过窗口时,我不得不等待五年。而现在却是不同时代的背景了。”
这一切都为编程语言的生命提供了独特的视角,不仅包括它如何变化,还包括如何促进、组织和优化等这些变化。
开放式架构
C# 于 2000 年在微软创建,并在 2014 年正式开源。
在 Azure DevOps 播客上,Parsons 确认整个编译器及其周围的“生态系统”(包括调试工具和 Visual Studio 的 C# 功能)现已全部开源。
《软件工程日报》的播客询问微软 2014 年转向开源是否影响了 Parsons 的工作。
他如此说道:
“非常大,在很多不同的层面上都有。不光只是转移到 GitHub 存储库,我自己也在改变一种一直非开源的文化……”
Parsons是实现这一目标的团队的一员,他记得“数月的工作只是为了撤销一些事件”。
比如,你的软件构建系统对内部系统有微妙的依赖关系吗?现在就要把它们撕掉……这一切都将是公开的。我们现在必须找到所有这些工具、这些库和这些服务的替代品。”
还有其它一些挑战:“要找到对开源不友好的代码,必须将其从系统中删除。就像是在米里挑沙子,‘不,不能发送那个库。这不是一个开源友好的库。我们必须转换并转移到这里。我花了几年时间才擅长在开源环境下建造,并处理这些双重创造。我们正在露天建造,但我们也为了运输目的而内部建造。”
它让产品变得更好了吗?哦,绝对是。
Parsons 指出,现在从其存储库安装全新的 C# 是多么的容易。“如果你想要贡献并且希望人们参与,那么构建和运行代码的入口点必须尽可能小。因此,我们非常刻意地公开了——重点强调‘我们如何让这一切变得容易?我们如何使其尽可能简单?......因此,就这方面而言,它绝对是一个更好的产品。”
对于 C#,新的编译器功能现在可以作为“预览”功能添加到 Visual Studio 中,并开始从大量实际用户那里获取反馈。
帕森斯在Rockin' the Code World上如此说道:
“这对我们来说是非常成功的事情,它让我们获得了大量的反馈…我们也总是发现,客户的创造力比我们想象的要高得多”。
他们非常重视这个过程。“当我们交付某些东西时,我们将承诺永远维护它。这些都是持续的决定。这有时也令人望而生畏。”
编译器作为API
编译器团队还有另一种方式支持更大的开发者社区。
Parsons 将编译器开发本身描述为“一件非常无聊的事情:它有一千多行代码,其中大部分都在与服务器对话……编译器团队到底是干什么?重点是我们的库和 API,围绕提供语义信息、语法树以及基本上允许人们在 C# 之上编写检查工具。”
Parsons 在 Azure DevOps 播客中解释说,“我们确实说构建了一个 API。我们有这个小型库,允许开发者检查代码、生成诊断信息,并且时不时地将一些代码发送到磁盘。C# 编译器就像调用库里的一千行代码。”
与此同时,“IDE 团队在我们的库之上构建了他们的全部体验,但没有特殊待遇。这有助于我们确保能够围绕该语言获得美好的工具体验。”
这会对整个 C# 生态系统会产生影响。
编译器最终还会支持插件——比如分析器,为用户自己的特定领域规则生成警告信息。Parsons 表示,它还支撑了微软的 Visual Studio 以及“微软周围的各种其他工具”,“整个 Visual Studio 体验都是作为 API 构建在编译器之上的。”
“奇怪的是,我们的第一份工作实际上是将我们自己视为一个库,并认真思考,我们如何帮助 IDE 团队为 C# 构建非常流畅且优美的体验?”
回顾这些年,Parsons 记得微软周围的人正在创建自己的工具来做分析、格式化和检查 C# 代码错误。
他如此描述说:
“我认为,我们在公司中发现了大约 10 到 20 个不同的 C# 解析器和绑定工具,其准确度各不相同。因此,在 2010 年左右,团队的一部分人花了几年时间将编译器重新设计为一种库方法,然后在其之上重建我们的 IDE 服务和批处理服务……这在当时是一个相当大的赌注,大约花了五到六年的时间才取得成果,但这绝对是该语言发展的一个转折点。”
是的很快,开发者们就发现了很大的优势。人们开始在他们的 API之上构建更多有用的东西了。
一个典型例子是基于浏览器的工具SharpLab,它允许用户编写和分析代码片段。“我们没有构建这个产品......这是他们构建它的其中之一,它现在是 C# 编译器团队最重要的工具之一!”
这次让Parsons想到了一个有趣的话题,他说:
“只有编译器的语言实际是个玩具。而编程语言是由支持它们的工具生态系统定义的,才能有机会成功。”
测试
该团队的一个重要任务便是进行大量严格的测试。
Parsons 指出说:
“这些操作取决于具体日期,但我们每天会更改 C# 编译器四到八次,当我们将拉取请求合并到 GitHub 时,大约四个小时内,我们就生成了一个新的编译器。大约八小时后,该编译器就构建出了 Visual Studio。”
在Rockin' the Code World中,Parsons 这样说道,“我们对每个 Pull 请求运行大约 750,000 次测试”,因为 C# 运行在许多不同的平台和架构上。
Parsons 还指出,当今许多 Microsoft 中的服务,甚至在 Azure 中,都是用 C# 编写的。因此,专注于提高绩效“可以为公司及客户带来巨大的乘数效应”。
“一个又一个的 .Net 版本为企业节省了大量资金,因为是这些大型 Azure 服务……当你将其扩展到大规模服务时,即使是一些微小的改进。数百万美元的差异将带来更大的效率和变化。”
语言设计的艺术
C# 的下一步是什么?
在《软件工程日报》上,Parsons 表示,“我们正在研究许多性能特性”,包括对Span(代表连续内存区域)的改进。
在过去的几个版本中,他们一直在“建立构建块”,以创建“C# 中的零分配开销变量参数调用格式,这是令人兴奋的事情。”
他们还希望发布一个新的“生产力”功能,具有隐式和显式的扩展,这个团队已经孵化了几年。
谈到什么最影响 C# 设计决策,Parson说:“我们实际上经常关注其他语言和生态系统,语言也是一个有竞争性的空间。”帕森斯甚至承认编译器设计很简单,难的是编程语言的美观好用。
在 Microsoft 编译器团队工作的 15 年中,他学会了如何教授编译器设计——他将其描述为本质上的“工程问题”。但成为一名优秀的语言设计师“是一件非常充满美学的事情……它是一门艺术。这个确实很难。”即使在 20 年后,帕森斯也提到“有些人有一种非常自然的天赋。有些人是可以被教导的。但有时,这绝对是一门艺术。”
幸福又充满希望的未来
在微信工作了 20 年后,是什么让Parson持续保持兴趣与投入?
在《软件工程日报》播客上节目即将结束时,Parsons回顾了这些年来他如何担任不同的角色,并且“有太多不同的问题需要解决。”除了担任 C# 编译器负责人之外,他还从事 .NET 基础架构方面的工作,甚至在这方面,“我们总是不断地改变正在从事的工作。”
无论是机器学习还是 AI、Office 编程还是提升 C# 的性能,“进入语言领域的好处之一就是我可以了解所有这些不同的问题。我可以获得这些有趣的小花絮,我可以将它们融入到我的一天中,一点点学习,然后继续获得下一个小花絮。
“.NET 团队非常有趣。我们有充满有趣的问题。我们有非常好的团队文化,这又是一个非常有趣的团队。”