【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

访谈:Kotlin 在 Pinterest 的逆势生长

  • 2018-10-09
  • 本文字数:3696 字

    阅读完需:约 12 分钟

InfoQ 最近采访了 Pinterest 核心 UI 团队的 Android 工程师 Christina Lee,讨论了 Pinterest 对 Kotlin 的采用情况、Pinterest 在采用过程中面临的挑战、从中总结的主要经验教训、从 Java 过渡到 Kotlin 的技巧,以及她即将在 KotlinConf 2018 上进行的演讲主题 Representing State: the Kotlin Edition

InfoQ:请你简单介绍一下自己和你在 Pinterest 的角色(特别是在支持采用 Kotlin 方面)。

Christina Lee:我是 Christina,Pinterest 核心 UI 团队的一名 Android 工程师。几年前,我所在公司被 Pinterest 收购,我也因此加入了 Pinterest。在之前那家公司,我有多年完全自由使用 Kotlin 的经验。因此,当我开始加入 Pinterest 时,很自然地将这种经验和热情带入我的新工作中。在 Pinterest 的几个星期内,我被授权在我当时负责的功能上试用 Kotlin(Android 的视频支持)。这项工作以及一些相关的内部倡导工作,最终导致我们的 Android 应用程序大量使用 Kotlin。今年,我们的新策略是将 Kotlin 作为 Android 的首选开发环境。

InfoQ:Kotlin 的哪些方面促使你成为 Kotlin 倡导者?

Lee:Kotlin 并没有彻底偏离 Java,因为它们都为 JVM 生成字节码。它之所以如此好用,是因为它本质上是内置了最好的编程实践的另一个 Java 版本,用它做对事情比做错事更容易。开发人员能够快速、自信地进行编码,并消除了使用 Java 时所需的大量工作。因为编码就像写作一样,是一种富有表现力的艺术形式,有了这样的工具,你就可以清楚、快速、准确地表达自己的想法。当你将其与行业领先的语言工具和互操作性以及 JetBrains 团队表现出的全面而深思熟虑的语言领导力相结合时,很难不爱上它。

InfoQ:Pinterest 在采用 Kotlin 期间面临了哪些组织层面的挑战?Pinterest 是如何克服这些挑战的?

Lee:在采用 Kotlin 期间我们遇到的最大挑战之一是持续出现的 Kapt(Kotlin 注解处理器)和其他与构建相关的问题。CI 构建环境经常出现错误,并且在本地切换分支时经常出现构建失败,因为构建状态未能被正确清除。因为这些问题的存在,有些高级工程师甚至提议放弃这门语言。采用一门年轻的编程总是会伴随着日益增长的痛点——Kapt 本身存在固有的 big——而这些 bug 不是我们自己能够解决的。随着 Kapt 和相关构建工具得到改进,这类问题也得到了解决,但在很多工程师的心目中,Kotlin 已经与构建不稳定性联系在了一起,他们对这门语言有了偏见。

不过,有一部分原因是第一次采用新技术时都不可避免会出现的盲点。这些是我们有能力在内部解决的问题,我们通过培训来解决这些问题。比如,我们在编译时会遇到的一个常见的问题,即开发人员会忘记导入语句或者犯了一些与 Kotlin 无关的错误,但 Kapt 在 Android Studio 中输出信息的方式导致很难在构建输出中找到这些错误。教会他们可以在哪里找到真正的编译时错误,这样以后他们就可以自己找到这些错误。为了解决这类问题,我们的团队专门设立了几个 Slack 频道,专门用于询问有关 Kotlin 或构建的问题,并开创了一个先例,即欢迎提出任何问题,这些问题都会得到回应。向团队讲授 Kapt 等新组件的工作原理、有用的错误信息类型以及从哪里开始寻找解决方案,这对缓解 Kotlin 的痛点大有裨益。

InfoQ:你是如何说服你的团队使用 Kotlin 重新构建整个 Android 代码库的?

Lee:在 Pinterest,我们的策略是优先使用 Kotlin,但并不是只能用 Kotlin。也就是说,所有的 Pinterest Android 开发人员必须知道如何阅读、编写和理解 Kotlin,因为它是我们公司主要的 Android 开发语言,所有新代码都必须使用 Kotlin 编写。不过,我们也强调,不要去转换那些没有合理理由去转换的现有 Java 代码。这背后有双重的逻辑。首先,“如果没有 bug,就不要去修复它”。如果某些代码可以正常运行,而你修改了它,可能会破坏现有的行为。除非将代码转换为 Kotlin 有明显的 ROI,否则最好让工作组件继续不受干扰,直到有必要引入其他变更。其次,将 Pinterest 代码库中的每个文件都转换为 Kotlin 需要大量的时间,这是一笔巨大的投入。在我们看来,花费开发人员这么多时间可能得不偿失。

InfoQ:Pinterest 在采用 Kotlin 时学到的最大教训是什么?

Lee:作为一个正常人,我也有一点叛逆性格。我不喜欢别人告诉我要做什么,所以我认为,在决定是使用 Kotlin 还是 Java 时,每个 Pinterest 的开发人员都应该参与做出决定。从技术角度来看,由于 Kotlin 与 Java 之间卓越的互操作性,这完全是有可能的,但它并未考虑到人性。人们不喜欢不确定性,当一个团队很容易形成不同的阵营(Java 团队、Kotlin 团队),那么有关 API 设计或可空性模式等问题的对话就很容易变成“我们与他们”之间的对立。通过让语言在公司内部有机地传播,我们最终达到了一个平衡点,大部分热衷于尝试使用新语言的开发人员都采用了这门语言,其他不感兴趣的开发人员可以选择退出。

如果时间足够,这种有机路径最终可能会改变所有开发人员,但在很长一段时间内,团队将处于分裂状态。当我们的平台负责人 Sha Sha Chu(与其他工程主管一起)决定将 Kotlin 作为首选语言时,我们担心人们会因为他们的选择被忽略而感到不安。我们针对这一过程进行了讨论,但在政策推出后,团队凝聚力和幸福感似乎大幅提升。根据这一经验,我认为 Pinterest 最大的经验教训是在探索的早期阶段要提供明确和直接的指导,以最大限度地减少团队处在分裂状态的时间。作为一个团队,我认为我们已经更加深入地意识到进行全面测试的价值,然后迅速回归单一的路径(要么完全放弃,要么全力以赴)。

另一个重要的经验是 Kotlin(尤其是早期)的构建有点不稳定,直到我们分配了足够的资源来监控和解决出现的问题(特别是与 CI 和 Kapt 相关的问题)。这些问题都不是不可克服的,但它们确实需要一些深思熟虑的调查,这些都需要占用工程师的时间。我们在开始时没有为此分配适当的资源,导致早期在诊断构建失败原因时所花的时间超过了预期。在为这个问题分配了专用的资源之后,我们就能够在相对较短的时间内修复问题。针对待命工程师的投入带来了巨大的回报,在未来推出新的框架部署时,我们可能会尝试做类似的事情。

InfoQ:关于从 Java 到 Kotlin 的转换,你有哪些有用的技巧可以分享?

Lee:关于 Kotlin 的入门(包括来自 Huyen Tue Dao 和我的演讲)现在有很多资源可参考,几乎任何学习方式都应该能够找到能够简化从 Java 过渡到 Kotlin 的内容。除了各种免费讲座和教程之外,IntelliJ 系列 IDE 也是最好的学习工具。它们提供了复制和粘贴 Java 代码并将其自动转换为 Kotlin 的功能。这样就可以粗略地知道 Java 概念将会被翻译成什么样的新语言,就像在学习新语言时,Google Translate 可以为你提供粗略的语言翻译。编辑器可能会给出一些不正确的建议,但这些建议仍然会带有有用的错误信息,可以在 StackOverflow 上轻松查找问题的答案。

此外,代码评审很关键。与大多数编程语言一样,在 Kotlin 中也有很多方法可以完成代码评审任务。随着人们逐渐加入 Kotlin 的行列,我们指定了特定的 Kotlin 评审人员检查来自新手的拉取请求。他们的作用不是判断底层代码的技术健全性,而是关注语言的使用方式以及它们是否符合最佳实践和我们推荐的风格指南。这些代码评审促进了组织学习的传播——写代码的人收到了建议,评审人员在提出问题和意见时必须更深入地思考语言本身,讨论内容被记录下来,其他团队成员可以阅读或参考它们。

InfoQ:你在 KotinConf 2018 的演讲内容是什么?你为什么要选择这个主题?

Lee:我今年在 KotlinConf 上的演讲是关于 Kotlin 语言特性如何让我们能够更轻松、更准确地定义应用程序的离散状态。我对这种定义良好的数据结构主题充满热情,因为它在代码评审和架构讨论中经常被忽略,但却是无数问题和错误的根源。要保持一间干净的房间的整洁是相对容易的,与之类似,在项目开始时投入时间来设置和维护逻辑数据结构可以更容易让代码做正确的事情,这对开发者来说是速度方面的胜利,对用户来说是稳定性方面的胜利。

InfoQ:感谢你抽出宝贵时间接受我们的采访。你还有什么想与 InfoQ 读者分享的吗?

Lee:Kotlin 最吸引我的是我不记得有哪个开发人员在彻底采用这门语言后有感到后悔的。我使用 Swift 的经历告诉我,人们喜欢这门语言,但由于构建时间、互操作性或语言版本迁移方面的问题,导致他们对切换到 Swift 感到遗憾。根据我的经验,批评 Kotlin 的声音主要来自那些尚未开始使用这门语言的人,而只有极少数是来自那些已经深入使用这门语言的人。有几个人跟我争论好几个月是否要采用 Kotlin,但是在转向 Kotlin 几个星期后,他们来到我的办公桌前,告诉我说,Kotlin 让他们再次激起了他们开发 Android 的热情。我知道,最初不愿意采用 Kotlin 的开发人员现在在抱怨他们需要切换回 Java 维护旧代码。在我看来,这种能够吸引最不情愿的开发人员的能力是对语言本身、围绕它的工具以及引导采用这门语言的团队的最好佐证。

有关 Pinterest 采用 Kotlin 的更多信息,请访问 Pinterest工程博客。读者还可以访问 InfoQ Java 主页,了解所有与 Java 相关的新闻。

查看英文原文 Kotlin Q&A With Christina Lee of Pinterest

2018-10-09 10:446923
用户头像

发布了 731 篇内容, 共 433.6 次阅读, 收获喜欢 1997 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

优化docker镜像的几种方法

运维研习社

Docker 镜像 优化技巧 5月日更

人生算法:做事要闭环

石云升

读书笔记 职场经验 5月日更 人生算法

如何用ABAP代码读取CDS view association的数据

Jerry Wang

CDS SAP abap CDS view

金融科技如何在产业互联网蓝海中扬帆远航?大数据、区块链与物联网应用被看好

CECBC

如何使用腾讯云提供的云主机

Jerry Wang

腾讯云 云主机 Cloud

会说话的ABAP report

Jerry Wang

SAP abap SAPGUI

CRM订单状态的Open, In process和Completed这些条目是从哪里来的

Jerry Wang

CRM SAP ERP abap

ABAP和Java里关于DEFAULT(默认)机制的一些语言特性

Jerry Wang

SAP abap Netweaver SAPGUI

ABAP git客户端的简单介绍

Jerry Wang

GitHub SAP abap

SAPGUI里实现自定义的语法检查

Jerry Wang

SAP abap SAPGUI 语法检查

如何使用SAP Cloud for Customer里的ABSL代码调用Web service

Jerry Wang

SAP C4C Cloud for Customer

S4HANA和CRM Fiori应用的搜索分页实现

Jerry Wang

CRM SAP Fiori SAP UI5 S/4HANA

设计千万级学生管理系统的考试试卷存储方案

俞嘉彬

观察者模式在One Order回调函数中的应用

Jerry Wang

CRM SAP abap

如何在Chrome development tool里查看C4C前台发送的未经 GZIP 压缩之前的请求细节

Jerry Wang

chrome SAP C4C Chrome开发者工具

S/4HANA for Customer Management里的搜索分页处理

Jerry Wang

CRM SAP abap S/4HANA

架构师训练营 作业四

开拓纪

ABAP宏的调试

Jerry Wang

调试 SAP abap macro

如何使用Putty登录安装在VirtualBox里的ubuntu

Jerry Wang

ubuntu windows 虚拟机

CRM, C4C和Hybris的工作流简介

Jerry Wang

CRM SAP C4C Hybris Commerce Cloud

那些年我用过的SAP IDE

Jerry Wang

ide SAP abap SAPGUI

在浏览器里使用SAPGUI里的SE80

Jerry Wang

JavaScript SAP abap Fiori SAP UI5

如何在ubuntu上安装virtualbox的driver module vboxdrv

Jerry Wang

ubuntu 虚拟机 vboxdrv 驱动

架构实战营 - 模块四作业

Sun

如何将iso文件安装到Virtual里的ubuntu去

Jerry Wang

Linux ubuntu windows 虚拟机 Windows 10

SAP Fiori里的List是如何做到懒加载Lazy load的

Jerry Wang

JavaScript SAP Fiori SAP UI5

如何使用代码获得一个function module的Where Used List

Jerry Wang

CRM SAP abap SAPGUI

高性能 JavaScriptの六 -- 老生常谈Ajax

空城机

JavaScript ajax 大前端 5月日更

如何证明CRM WebClient UI上的应用是有状态(Stateful)的

Jerry Wang

CRM SAP abap WebClient UI

如何给VirtualBox虚拟机的ubuntu LVM分区扩容

Jerry Wang

虚拟机 Cloud virtualbox CloudFoundry

ABAP的语法高亮是如何在浏览器里显示的

Jerry Wang

SAP abap SAPGUI 语法高亮

访谈:Kotlin在Pinterest的逆势生长_Java_Kesha Williams_InfoQ精选文章