Kevin Moore 是 Google 的 Dart 与 Flutter 产品经理。即便在 Google 待了 11 年,他仍然首先把自己看作一名工程师。他的专长在 Web 技术领域,尤其是为 JavaScript 和 WebAssembly 开发编译器。
Kevin Moore 在推动 Dart 用于生产级 WebAssembly 应用方面发挥了关键作用。凭借深厚的技术洞察与前瞻视野,他主导发布了 Dart 3.3,引入了全新的 JavaScript 互操作模型,显著增强了 Dart 开发者的工具链。
除了技术上的敏锐,Kevin Moore 也是一位战略型的思考者。他成功地把 Dart 与 Google 的 AI 服务整合起来,推出了 AI Dart SDK,让开发者能够把生成式 AI 能力无缝集成到 Dart 与 Flutter 应用中。
在 GOSIM CHINA 2024 上,Kevin Moore 带来了题为《Flutter:Google 面向移动端、Web 与桌面的单代码库 UI 工具包》的精彩演讲。会后,GOSIM Open AGI Forum 独家邀请 Kevin Moore 与 CSDN 资深技术编辑王启隆(Eric Wang)进行专访,他分享了对 Flutter 演进的思考,以及自己作为产品经理的心路历程。
对话亮点:
-
产品经理管的不是人,而是产品。我的职责是制定策略、把控功能的发布节奏。
-
开发 Flutter 和 Dart 的关键挑战,是打造一个更好的 Web 应用模型——让共享的应用能在各平台上无缝运行。在提升交互性的同时改善 Web 编程体验,是我们的核心关注点。
-
Flutter 最令人印象深刻的特性之一是热重载。它对开发者来说是颠覆性的:编辑代码就能立刻看到更新,不必等 10 秒、一分钟甚至更久去做完整重建。
-
跨平台支持是个艰难的挑战,但我们团队致力于提供卓越的开发者体验。我们确保应用加载快速、支持热重载,并保持一流的性能。
-
我对 WebAssembly 特别兴奋。它已经在浏览器中产生了巨大影响,潜力还远未见顶。
-
Flutter 与 Dart 社区是我们最宝贵的财富之一。他们友好、热情、投入。我鼓励开发者参加线下聚会或线上讨论。
-
初学者常常花太多时间看教程。只靠被动接收来学习——就像只听一门语言却不开口练习——进步会很慢。你需要开始动手做项目。
-
我们优先保持接近原生的性能。相比 Android 和 iOS 的原生开发套件,我们在坚持高性能标准的同时,着重解决跨平台兼容性。
1. 从实验到突破:Dart 到 Flutter 的演进
Eric Wang: 您的第一门编程语言是什么?您是怎么成为程序员的?
Kevin Moore: 我的第一门编程语言是 BASIC,具体来说是 GWBASIC,它随 MS-DOS 一起分发,大概是 DOS 4 或 DOS 5 那个版本。我很幸运,高中大概九年级的时候就在一家公司找到了工作,接触了微软的 Active Server Pages(VBScript)。那标志着我在微软技术栈上的职业起点,之后我用 BASIC 工作了很多年。大学里我学了 C、C++ 和 Java。后来我对 C# 产生了浓厚的兴趣,用起来非常享受,这基本上定义了我职业生涯的走向。
Eric Wang: 开始做 Flutter 时,最初的目标是什么?
Kevin Moore: 我大约在 2013 年加入 Google,进的是 Chrome 部门。那里有很多团队在做高效而有趣的实验,其中一些后来演变成了 HTTP/2 和 HTTP/3。他们围绕 Chrome 做了一系列开发,大多是把应用转成 PWA(渐进式 Web 应用),还在研究 Native Client 项目,那个项目后来演变成 asm.js,而这项技术最终变成了 WebAssembly。
Dart 和 Flutter 当时都是独立的实验性项目。最初的设想是:我们能不能做得比 JavaScript 更好?后来问题演变成:我们能不能超越 DOM?能不能造出一套比 DOM 更干净、更易维护、更好的 API?结果是,Dart 和 Flutter 都没有被纳入浏览器标准,但各自发展一段时间之后,它们最终合流了。
回到 Flutter 和 Dart 最初的愿景,重点在于如何构建一个更好的 Web 应用模型——一个跨平台可用的共享应用模型。我们如何改善 Web 编程体验,并借助这个平台提升交互式的网络体验?在很多方面,我们仍在朝这个愿景努力。这一切始于移动优先的思路,而有意思的是,所有部分最后严丝合缝地拼成了一个完整的体系。
Eric Wang: 您提到在 Google 工作了 11 年。在做 Flutter 之前,您在 Google 团队里担任什么角色?
Kevin Moore: 刚加入 Google 时,我在 Dart 团队做 Dart 开发专家,那时的 Dart 还处在非常早期的阶段。
早在 2000 年代初,我在微软工作,开发过一套 UI 工具包——WPF,即 Windows Presentation Foundation。有些人可能听说过 XAML,一种基于 XML 的布局工具。现在回想起来挺有意思的:20 年前,在 JSON 出现之前,XML 统治一切。
当我从以 Windows 为中心的技术转向 Web 技术时,我被“开放”深深吸引——开放标准、Web 协作与开源。这与 20 年前微软的立场形成鲜明对比,不过我要说明,微软此后在开源参与上取得了长足进步。
我想要一门更像 C# 的语言,因为我花了大量时间在 .NET 和微软技术上,但我希望它能用于 Web 开发。就在那时我遇到了 Dart,它正是我要找的东西。有意思的是,微软后来推出了 TypeScript,与 Dart 相似,但在某些方面,Dart 的实现感觉更合理。
我很欣赏 Dart 在语言设计上达到的稳健程度。它有非常严格的安全机制,同时又支持 Web 开发,也就是说它可以被编译成 JavaScript。Dart 还允许对原生代码做优化,这让它非常契合 WebAssembly,而它在 JavaScript 环境中的表现也相当出色。
Eric Wang: 能谈谈 Dart 对 Flutter 成功的重要性吗?Dart 的哪些独特之处增强了 Flutter 的能力?
Kevin Moore: Dart 与 Flutter 之间有着非常强的协同效应。Flutter 的一个关键特性是用 Dart 来定义 widget,而为了简化 Flutter 的开发流程,团队对 Dart 做了多项改进。比如我们移除了某些新关键字来精简语法,还花了大量时间改进集合的内联定义与表达式处理。
Dart 引入了多种特性,比如 switch 表达式和泛化的模式匹配,显著提升了 Flutter 的开发效率。我们处在一个高度迭代的开发周期中,投入了大量时间改进 Dart,尤其是那些能改善 Flutter 开发者体验的方法。
2. 热重载最受欢迎,但跨平台支持充满挑战
Eric Wang: 你们用 Flutter 的 GPU 具体想解决什么问题?
Kevin Moore: 我主要和 Web 团队合作,最初有一个基于 Skia 的渲染器。Chrome 在它运行的所有地方都使用 Skia 引擎,它可移植性很强,能在 Android、桌面、Linux 等平台上工作。
我们最初的目标是解决性能问题、消除卡顿。为了实现平滑的字体、曲线和阴影,团队开始使用着色器,并借助 GPU 加速来渲染。事实证明,这些技术在平滑边缘、光栅化字体、实现模糊效果等处理上非常有效。Impeller 项目的目标,是看我们能否预编译着色器、更智能地处理它们,从而带来更快的启动速度并避免卡顿。我们意识到,通过重写整个图形栈,我们可以充分发挥 GPU 的能力。
在八月的发布中,我们预览了在 Flutter 中探索 3D 效果的可能性。我所在的 Web 团队致力于确保它能在离线环境中运行。它支持 Android、iOS、Mac、Windows 和 Linux。我们把它叫作“Brandon”,并发布了一个包,我们称之为 3D 或 Flutter scenes。能够做 3D 动画和创作实在令人兴奋,这也是我希望 Flutter 能带我们抵达的地方。从一个以 2D 为中心的框架走向 3D,绝对令人激动——有挑战,但非常有意思!
Eric Wang: Flutter 开发过程中你们面临的最大技术挑战是什么?是怎么克服的?
Kevin Moore: 我们在达成目标方面做得相当不错。但 Flutter 的一大挑战,是把跨平台支持真正变为现实。这确实是个难解的问题,所以团队把重心放在提供优秀的开发体验上。开发者需要快速加载应用、实现热重载,并保持出色的性能。
当你试图同时处理多项任务、追求多个目标时,事情就复杂了。这也是为什么我们在 Web 上使用两个独立的 JavaScript 编译器:一个面向快速编译,服务于迭代开发;另一个做全局分析,生成高效的 JavaScript 代码。这是个更复杂的问题,需要专注的投入来确保它顺畅运行,让开发者在构建过程中保持高效,同时交付高性能的终端应用。
Eric Wang: 您最引以为豪的 Flutter 特性是什么?为什么?背后的关键考量是什么?
Kevin Moore: Flutter 有很多很酷的特性,但我最自豪的是热重载。它太受欢迎了,其他项目也在尝试实现类似的东西,比如 Rust 的编译器等等。
对开发者来说,能在应用运行时编辑它并立刻看到变化,而不必等待重新加载或重新运行,这背后的实现极其复杂。它在桌面、iOS、Android 等平台上都能工作。以我们今天的运行时环境和语言设计来说,这是一项颇具挑战的任务。事实上,团队正在积极地把这项能力带到 Web 上,这也让 Flutter 拥有了关键的差异化优势。
Eric Wang: 热重载是对整体开发体验影响最大的特性吗?还有哪些特性对开发体验有深远影响?
Kevin Moore: 热重载对开发体验绝对至关重要。能够直接编辑代码,而不必等 10 秒、一分钟甚至两分钟去重建,这是颠覆性的。光是能快速迭代这一点就很棒!
除此之外,Flutter 在跨平台一致性上表现出色。无论你部署的是 Web 应用、Android 还是 iOS,它们看起来都能做到像素级一致。widget 在不同平台上的渲染可能略有差异,但在所有平台上几乎完全相同。Flutter 在保持高稳定性和高性能的同时,交付了近乎完美的像素一致性,带来极佳的开发者体验。这确实是 Flutter 独特而有价值的优势之一。
Eric Wang: Flutter 与市场上其他框架的区别在哪里?你们用什么策略保持领先地位?
Kevin Moore: 我们的优势在于尽最大努力保持接近原生应用的性能。相比 Android 和 iOS 的原生工具包,我们优先解决跨平台兼容性。有意思的是,当涉及摄像头、麦克风、视频、访问通讯录或位置信息这些功能时,用户在原生设备和 Web 上的体验是一致的。
我们在 Impeller 项目上的投入带来了显著的性能提升,尤其是在 WebAssembly 上,把 Web 性能推向了接近原生应用的水平,这是一次重大突破。我们也在 GPU 与 3D 能力上大量投入,以确保充分利用设备的特性。
我们的竞争优势还来自对编程语言的持续投入。我们正在推进宏(macro)功能的支持,计划在 2025 年发布,团队也在持续改进 3D 能力的性能与用户体验。
3. 原生应用还是 Flutter 应用:“我们拒绝二选一!”
Eric Wang: 团队如何处理用户反馈?能否举例说明用户意见如何显著影响了项目方向?
Kevin Moore: 我们非常重视用户反馈,也努力保持互动。我们所有代码都托管在 GitHub 上,在那里跟踪 issue。我们也活跃在 Discord、Reddit 和其他社交平台上。我们有几个论坛聚集了非常活跃的用户,他们可以直接给出反馈。这样的例子有很多。
最近我们就根据用户反馈在 Dart 中引入了一个特性:用户希望通过 super.x 传递参数,而不必再向父类重复传一遍,以减少错误、提升代码可读性。我们采纳了这个建议并很快实现了它。现在所有人都从那条反馈中受益。
此外,Flutter 的开源属性意味着许多用户会主动修复自己遇到的 bug,由此产生了大量社区贡献。这非常棒。
Eric Wang: 有些 Flutter 应用的用户更偏好原生应用的体验,而不是 Flutter 的。你们如何平衡这一点?
Kevin Moore: 我们最大的努力,就是避免“你必须二选一”这种虚假的对立。团队致力于两者兼顾。我们完全可以在不牺牲任何一方的前提下,既提供优秀的开发者体验,又构建高性能的运行环境。没有理由不能同时支持两者:既给出出色的开发体验,又实现跨平台。
原生工具包有很多优势。但对于大多数用户交互和应用体验来说,大部分代码是可以共享的。像从 Android 迁到 iOS 那样把整个项目从头重写,在很多方面都是低效的。因此团队的目标是提供卓越的开发体验、真正的高性能,以及代码共享。用户不该被迫在两者之间做取舍。
Eric Wang: 你们如何决定发布节奏?会优先做哪些功能?
Kevin Moore: 我们现在高度依赖数据驱动的决策。参照过往的发布规律,我们遵循一个稳定的节奏。我们通常不会提前公布具体的发布日期,但会保持稳定的模式。这种做法让很多事情变得可控,尤其是在假期和 Google 每年的春季活动期间。
有一个重要的事实:Dart 和 Flutter 的主分支始终是稳定的。对于 Google 内部的应用,比如 Google Earth、Google Classroom 和 Family Link,我们用的不是稳定版,而是开发版。这些版本在发布前已经在内部使用和测试了数周,也就是说它们经历了 Google 各应用中数以万计的内部测试,质量非常高。
稳定版发布主要关注的是 API 稳定性。我们力求把 API 的变动降到最低。如果你用的是 Flutter 或 Dart 的 beta 版或开发版,API 可能会在更新之间发生变化。但一旦稳定版锁定,API 在一段时间内就会保持稳定。这让我们能够持续维持较高的发布质量。通常我们会保持大约三个月的 API 稳定期,以确保发布不会对用户体验产生负面影响。
至于发布日期,团队有一套成熟的流程来处理实验性特性和其他事项,让我们既能快速推进,又能保持高稳定性并确保规律发布。
4. WebAssembly 的潜力与 Flutter 的未来
Eric Wang: 展望未来,您认为技术行业的哪些趋势会对 Flutter 的发展产生最大影响?
Kevin Moore: 我对 WebAssembly 非常感兴趣。我相信它在浏览器中已经是一股巨大的力量,而且只会继续壮大。比如你在 Google Earth 上看到的 3D 地图,就是由 C++ 驱动的 WebAssembly 实现的。
WebAssembly 的影响会从浏览器延伸到服务端。许多公司正在推进浏览器之外的 WebAssembly 实现,Dart 团队也在密切关注这一进展。就我个人而言,我对此感到兴奋。
嵌入式编程的复兴同样引人入胜。像 RISC-V 这样提供完全开放、可扩展架构且实现成本更低的技术,尤其耐人寻味。2024 年夏天,LG 的 WebOS 将成为第一个支持 Flutter 的主流平台。这将是 Flutter 在 WebOS 上的主要开发重点,看到它进入嵌入式领域令人兴奋。此外,丰田也正在其车载信息娱乐系统上运行 Flutter。
看到 Flutter 跑在这么多不同类型的设备上,真的很令人激动。这与我们最初的愿景一致——为不同类型的设备开发应用,而不必从头重写整个应用。代码共享是件好事。虽然应用在所有平台上未必能完全一致,但能为如此广泛的设备复用绝大部分代码,是一项重大优势。我相信 Flutter 完全有能力抓住这些机会。
Eric Wang: 您认为 Dart 未来与 AI 结合有哪些可能性?
Kevin Moore: Google 在 AI 上投入巨大。我们有许多可以在设备上运行的 API,无论是在 Chrome、Android 还是云端,我们与这些都有很好的接口。
大多数 AI 方案依靠 HTTP 和 JSON 来调用 API。你只需通过 API 发起请求就能调用强大的语言模型,AI 在后台完成工作。对 Flutter 而言,与 AI 交互时,重点在于渲染像素、呈现 UI——无论是图像还是视频,AI 的处理过程对 Flutter 基本是透明的。
作为开发者,我们能从中获益良多,无论是查看错误报告、崩溃报告、分析数据,还是辅助写代码。我们仍在探索那些对程序员极其有用的更通用的服务。
Eric Wang: Flutter 团队为这些趋势做了哪些准备?采取了什么行动?
Kevin Moore: 团队目前正在推进端侧 AI 应用,在边缘设备上使用大语言模型(LLM)。Google 已经开始把 Gemini Nano 集成进设备。这个趋势正在增强,Flutter 开发者将需要思考如何把 Flutter 应用与设备上的 AI 模型结合起来。
Flutter 有许多独特的特性,其中一些还没有公开。开发者主要需要考虑的是——无论使用 TypeScript、Kotlin、Rust、Dart 还是其他语言——如何高效地访问设备服务。
Chrome 正在努力让 LLM 在浏览器环境中运行,Android 也在移动设备上推进各种能力。我们会与这些服务充分集成,实现与后端服务和设备服务的通信。
Eric Wang: Flutter 目前已支持多种平台和设备。你们有计划支持更多硬件设备或操作系统吗,比如智能手表或车载娱乐系统?
Kevin Moore: Flutter 已经可以在 Pixel Watch 这类 Android 设备上运行。我自己还没试过,但团队正在这方面努力改进。
加入 WebAssembly 是个有意思的方向,因为我们把 Web 视为一个平台目标。不过,如果同时存在 JavaScript 和 WebAssembly 两个编译目标,可能会带来一些冗余。
丰田在做汽车相关的技术,其他团队也在专注嵌入式方向的工作。我们希望开发者不必为定制平台维护一个单独的 Flutter 分支。团队管理层清楚这个问题,我们的目标是让它变得更容易。
5. 产品经理在 Google 的角色,以及给 Flutter 初学者的建议
Eric Wang: 作为产品经理,能否分享一次您在面对挑战时不得不调整策略的经历?团队遇到困难时,您反思过自己的领导风格吗?
Kevin Moore: 作为 Google 的产品经理,我一直把自己看作工程师。我热爱编程。也许我该少花点时间写代码,多花点时间处理文档和邮件,那更符合产品经理的角色。
当你以工程师身份工作时,面对的是代码复杂度、功能蔓延、稳定性和功能丰富度这些挑战,你必须在这些权衡之间做出选择。
而作为产品经理,你面对的是更宏观的决策。比如:我们是该专注于做一系列小功能、修一些小 bug,还是该集中精力解决重大 bug,或者在新技术上投入更多?一个典型的例子是为 Dart 和 Flutter 增加新的编译器工具链以支持 WebAssembly,那是一项艰巨的任务。现在我们在思考如何优化现有技术,避免积累过多技术债,并确保在增加新功能的同时质量不下滑。
排期、外部客户需求、早期采用者对新技术的反馈,这些因素都需要考虑。这些挑战非常有意思。我享受与客户互动,看到他们对 WebAssembly 这类技术的兴奋。这确实是从程序员角色向管理角色的一次转变。
Eric Wang: 在中国有一种说法:程序员到了 35 岁就得决定是继续写代码还是转做管理。您怎么看?如果换作是您,会怎么处理?
Kevin Moore: 作为产品经理,我并不直接管人,我管的是产品本身。我的职责更多在于策略、确保功能整体如期发布,以及管理产品的交付。
团队里有专注于编译器开发的杰出工程师。我的角色是处理排期、决定如何发布功能、以及如何向用户传达技术上的变化。我还必须确保性能改进是值得的。作为产品经理,我的工作是把技术挑战转化为可执行的战略计划。这需要通过与工程师和合作团队的沟通来协调各方意见,确保产品顺利推进。
Eric Wang: 对刚开始接触 Flutter 和 Dart 的人,您有什么建议?有推荐的学习资源吗?
Kevin Moore: 欢迎加入!Flutter 和 Dart 最宝贵的财富之一就是我们的社区——它极其友好且充满热情。无论是 Reddit、Discord 还是其他社交平台,乃至本地的 Google 社群,都有许多 Flutter 相关的社区活动。我建议参加社区聚会,或者在线上与他人交流。
作为初学者,我的建议是做一个真实但简单的东西。比如做一个简单的游戏。很多初学者上来就想做一个新的社交平台或者搞一个大项目,但我建议从简单的项目开始,逐步积累经验。就我个人而言,我喜欢做小游戏,因为它们的规则很直白。所以,从小项目开始,并积极参与社区。
Eric Wang: 初学者常犯哪些错误?您有什么建议帮他们避开?
Kevin Moore: 我认为最重要的是尽快开始做真实可用的项目。人很容易在看视频教程上花掉大量时间,但如果只看不做,那就像只靠听录音来学中文——进步会很慢。你需要行动起来,开始动手构建。越早确定一个项目、越早着手做一件让你兴奋的事,就越好。你可能会遇到障碍,但你会发现有人愿意帮忙,这正是社区的魅力所在。越早开始,就越早遇到并解决问题,而这对学习极有帮助。
Eric Wang: 问题就到这里。感谢 Kevin Moore 带来这场富有洞见的讨论,也感谢所有观看的开发者,我们下期再见!
作者 | Harper Zhuo
采访 | 王启隆 Eric Wang
编辑 | 何苗
出品 | GOSIM 开源创新汇
