人物采访 / T SALON

编辑内容

老驴谈研发质量与团队协作:把设计、评审和上线连接起来

回顾 2022 年 T Chat 首期同一视频的两个分 P,覆盖设计文档、设计评审、代码评审、上线检查,以及老驴对技术氛围、技能拓展、工作选择和沟通能力的看法。

T Chat 第 1 期老驴分享研发质量与团队协作的访谈封面
T Chat 第 1 期老驴分享研发质量与团队协作的访谈封面

本期视频发布于 2022 年。文中的技术状态、个人经历与观点均为当时情况。老驴分享的是个人经历,不代表 Google 的公司政策。

代码质量并不只在敲下代码时决定。一个需求为什么要做,是否考虑过其他方案,谁检查设计与实现,上线会影响哪些人,都可能改变最终结果。

2022 年 T Chat 首期,老驴把这些问题组织成四个连续步骤:设计、设计评审、代码评审和上线检查。随后,他与主持人讨论开放的技术氛围、从 iOS 转向其他技术领域的经历,以及工作选择与沟通。原视频包含两个分 P:第一段约 20 分钟,第二段约 21 分钟。

技术分享:质量来自一系列可以讨论的决定

开始实现之前,先把目的与可选方案说清楚

老驴先解释为什么重视流程。团队在快速发展时,容易把注意力放在尽快做出功能,却没有把设计和检查环节建立起来。等到实现过程中才发现前面的判断有问题,修改成本就可能变大。

他把设计理解为回答一组具体问题:要做什么,怎样做,为什么要做,以及是否存在其他选择。其中,为什么有时应该最先回答,因为它需要开发者与产品或负责人确认,技术工作究竟服务哪个目标。

他紧接着把抽象需求往下拆:业务方说要一个功能,工程师不能只拿到名称就动手,还要确认按钮按下后实际发生什么、数据从哪里来、结果给谁看。把这一层写清楚,后续才有依据比较不同方案。主持人在后半场说,写文档比写代码还难,正因为文档阶段要先完成这类设计判断。

列出替代方案也很重要。一个人容易停留在自己熟悉的实现路径中,把能做出来误认为最适合当前需要。先比较不同选择,再决定采用哪一种,有助于让取舍显性化,而不只是把第一个想到的办法写进代码。

写下来,才能让别人真正参与设计

需求有时来自比较抽象的业务表述,需要进一步转化为可以实现和验证的行为。老驴强调,把想法写下来是这个过程的一部分:留在脑海里的方案,别人难以检查;形成文字与图示后,才有共同讨论的对象。

他介绍自己的文档顺序。先用一小段说明背景,因为读者未必了解项目;随后尽早放出整体架构或流程图,让对方能够迅速理解这件事如何运作;最后再进入具体实现细节。

详细部分要说明数据如何流动,新增能力对延迟、耗电等资源使用的影响,以及准备怎样上线。后端服务可能要说明部署到哪里,移动应用则要考虑通过应用商店发布;若涉及多人协作或改变故障响应约定,也要交代开发环境和相关人员的责任。不是每个项目都需要一样长的文档,但评审者必须看清完整的交付过程。

尽早分享,让反馈发生在容易调整的时候

老驴建议团队形成共同模板,但模板的价值在于提供统一的阅读顺序,而不是追求好看或复杂。更关键的是分享时机:当主要框架已经形成,就可以请相关人员参与,不必等所有文字都打磨完再第一次公开。

反馈对象也不应只限于同样写代码的同事。产品、设计、所依赖的团队,以及会受到此次改动影响的人,都可能看到作者忽略的问题。越早知道这些意见,就越有机会在投入大量实现工作之前调整。

在线文档是他特别重视的工具,因为它把分享、评论、回应和修改放在同一个地方。推荐的重点是共同查看和持续讨论的能力,不是某一个产品品牌。它也不能替团队消除全部沟通成本,仍然需要有人解释、回应和作出决定。

例如作者把框架写到足以讨论时,就可将链接发给产品、设计和依赖团队;有人在对应段落留下问题,作者可以就地回应,再改同一份材料。它减少的是“各拿一份文件、意见散在聊天里”的往返成本。主持人问到开发提效工具时,老驴没有先推荐编辑器插件,而是再次选了在线文档,也把代码评审工具与上线邮件放在这条协作链中。

设计评审,要有明确参与者与结果

完成初步设计后,评审让其他人帮助检查思路。老驴希望不同意见能够明确提出,而不是因为不在同一个小组就不参与。依赖关系往往跨团队,遗漏一方的意见可能使问题留到更晚才暴露。

他并不认为每次评审都必须另做一套幻灯片。如果设计文档已经有清晰的流程图与说明,围绕它讨论即可。团队也可以约定相对固定的评审时间,让有需要的人提前登记主题,使讨论有稳定的入口。

但有固定会议还不够,评审必须有结果。产品同学请团队确认需求时,结果可能是一份得到认可的需求文档;概念还早时,先确认方向即可;详细设计评审结束,才应形成可以指导开发的版本。若讨论的是阶段目标,则应写明里程碑和交付项。重要的是知道这次讨论解决了什么,而不是会后各自保留一套理解。

主持人后来追问文档是否会拖慢开发,老驴的回答补充了这里的判断:把结构在文档里改动,比在实现中反复推倒更容易。他以自己对设计和实现投入时间的感受说明这一点,并没有把比例当作团队必须执行的制度。

代码评审既检查逻辑,也传播对工作的理解

进入实现阶段,代码评审让问题有机会更早被别人看见。老驴回忆,自己曾在代码里被一个计算顺序问题困住;同事在评审中指出后,他仍花了十几分钟当面讨论才转过弯。评审记录能发现问题,直接沟通则能帮人跳出固定想法。

评审同时帮助同事理解彼此的工作。它不仅是找错,还会让代码的结构、约束和选择被其他人看见,减少关键实现只由一个人掌握的情况。统一风格的要求,也需要通过具体检查才能落地。

他进一步区分可读性与逻辑两个关注点。可读性涉及同一种语言中共同遵循的表达方式,不一定只由当前业务小组负责;逻辑检查则需要理解这项工作的目标,最好了解前面的设计讨论,才能判断实现是否满足需求。

例如,一位熟悉 Swift 风格的同事能够指出命名和表达上的问题,却未必知道这次改动为什么要调整某条业务路径;参与过设计评审的人更容易检查实现有没有偏离目标。老驴由此提出不同层次的评审者,而不是让同一人凭一次浏览包办所有判断。

这种区分帮助团队选择合适的评审者,也提醒人们不要把样式一致当成代码已经正确。熟悉语言风格与理解业务逻辑,是两种可以互补的能力。

上线检查,让数据、计划与影响能够被追踪

最后一个步骤是上线之前的检查。老驴关心此前实验是否符合预期、是否有完整的上线计划,以及相关依赖方是否知道这次变化。功能可以运行,与它适合按当前方式发布,仍需要分别判断。

计划还应回答何时发布、先覆盖哪部分范围,以及哪些团队会受到影响。实验结果若与预期不同,不能仅因为代码已经完成就略过。

他特别重视通过文档或邮件保留信息,使参与者能够打开链接检查数据、计划和结果。仅有一次口头讨论,容易遗漏细节,也不便于之后追踪。这一建议的核心是留下可核对的依据,而不是把所有需要实时沟通的情况一概排除。

面对难以接受的意见,先想清沟通目标

四个步骤都依赖沟通,因此分享最后回到人与人之间的反馈。老驴举了代码评审的例子:当对方提出许多自己不理解的意见时,很容易把注意力放到不满上,甚至认为对方在阻碍自己。

他的办法是先分清主要目标与情绪。希望推动代码在合适条件下提交,就应围绕意见的理由、要解决的问题和可接受的修改展开,而不是让争论变成输赢。这个区分并不要求接受所有意见,而是帮助双方把讨论带回具体工作。

他在现场把这种冲突拆成两个目标:主要目标是让代码在满足要求后顺利提交,次要目标是发泄被批评的不快。如果先要求对方解释意见、核对它针对的是逻辑还是表达,再商量怎样修改,双方仍在解决代码问题;若先争辩对方是否“故意卡我”,很容易偏离主线。老驴没有说必须同意每条评论,重点是先把不满与需要完成的工作分开。

他也分享阅读沟通材料对自己的帮助,认为先明确目的,会改变看待反馈的方式。这为前面的设计评审和代码评审补上了一个条件:流程存在之外,参与者还需要有讨论分歧的能力。

成长对谈:开放、动手与理解工作环境

开放的氛围,体现在如何处理意见

第二段开场,主持人问怎样建立技术氛围。老驴用开放概括自己的看法:技术问题尽量讲清楚,愿意分享,也允许别人提出不同意见。

对有道理的反馈,应尝试找到可以改进的部分并落实。这里的分享不限于正式技术演讲,也包括日常讨论和对方案的建议。只有大家愿意公开问题,前半场提到的评审才更容易成为实际帮助,而不是形式上的步骤。

技能拓展,从实际需要与动手开始

谈到技能变化,老驴回顾自己从 iOS 转向后端等工作的经历,接触过 Objective-C、Swift、Java 和 C++ 等不同语言,当时也在关注 3D 渲染。

他鼓励开发者不要因为新语言或新领域而先产生排斥。围绕具体任务动手,在过程中阅读已有代码、了解别人怎样处理相似问题,能够逐步建立需要的知识。这里不是说任何技术都能在短时间内精通,而是提醒人们给实际尝试一个机会,避免把陌生直接等同于无法进入。

提高效率,不只是在编辑器里更快

当主持人问工具推荐时,老驴再次选择在线文档。他将其与前面的四步流程联系起来:设计和讨论需要共享材料,代码评审使用能够展示改动与反馈的工具,上线检查则需要可追踪的书面记录。

主持人补充,写文档的过程本身也在组织设计。老驴认为,如果实现过程中不断大幅返工,应回头检查之前是否把问题想清楚。他在对谈中用自己的时间分配感受强调设计的重要性,但这不构成所有项目都应遵守的固定设计与编码比例。

效率在这里被扩展为减少误解与重复修改,而不仅是完成同样一段输入所花的时间。

面试与工作方式,需要放回具体岗位

招聘话题中,老驴根据当时的经历,谈到算法与设计能力在一些面试中的重要性,也表达了自己对脱离实际工作的细节题的看法。这是个人观察,不是所有海外公司共用的面试标准,更不能据此忽略目标岗位所需要的领域知识。

主持人先问的是团队有没有招聘名额,以及应该准备什么。老驴并未确认一个今天仍可申请的岗位,而是从自己熟悉的面试方式谈算法和系统设计。他认为用题目检验基础可以,但追问与实际工作脱节的底层细节未必有价值;主持人则把它理解为先把专业基础打牢。这里是两人的判断,不是任何一家公司的正式题库。

讨论国内外工作差异之前,他明确说明自己没有国内工作的直接经历,因此难以作完整比较。他主要描述自己熟悉的环境:前期流程与设计讨论占用时间,整体迭代节奏也受这些安排影响。主持人则结合自己的管理经历补充另一种观察。

主持人听完流程后,先说自己对这种节奏感到羡慕,再从国内团队管理经验谈竞争和交付压力。老驴没有接过这句话去概括所有国内公司,反而回到自己能确认的经验:他所在环境的设计流程会占用时间,功能上线后也可能较少立即反复修改。两人的观察来源不同,不能简单拼成一张“国内与国外”的统一对照表。

双方共同强调的是负责人对团队的重要性。怎样理解需求、安排工作、向上沟通和管理预期,会直接影响成员的日常体验。求职时也可以反过来了解未来负责人如何思考问题,而不只是把自己放在被评价的一方。

主持人进一步解释“向上沟通”的具体作用:负责人若能向上级说清资源和优先级,就能为团队挡下部分互相冲突的要求。后面观众提出业务需求多、人手有限的问题时,两人又从具体排期继续讨论这一点。

工作地点的选择,也涉及生活安排

面对去海外工作的提问,老驴先让讨论回到个人与家庭:是否真正想清楚这种变化,对伴侣、孩子和生活意味着什么。随后,他根据当时所知讨论留学、内部转岗及直接申请海外岗位等路径,也提到公司在搬迁、手续和语言学习方面可能提供的支持。

他把路径分成留学后求职、先加入有跨国办公室的公司再争取内部转岗,以及直接申请目标地区岗位等几类。随后主持人追问公司能否帮助办理手续、搬迁和语言学习,老驴只按当时见过的情况说明不同公司可能提供不同支持。听众真正需要带走的是逐项核实具体岗位的资格、签证和生活安排,而不是把 2022 年某些路径视为长期不变的承诺。

这部分是 2022 年对谈的历史内容。文章保留决策时需要同时考虑工作与生活的观点,不沿用录播中的签证、抽签或公司支持细节作为今天的操作说明;实际条件要以具体国家、岗位及公司的现行信息为准。

主动性与日常感受

谈到团队成员的品质,老驴重视主动性:不仅在任务安排完成后执行,也能够发现问题,带着想法沟通,并主动学习完成工作需要的知识。主持人认同,这样的合作方式能减少负责人持续推着每一步走的负担。

对谈随后有一段轻松的湾区生活交流。老驴描述,身边经常遇到互联网公司的从业者,发布会里的道路和场景有时就是自己熟悉的环境;也谈到公司食堂等日常感受。这些个人片段补充了工作之外的生活画面,不代表对某个地区生活方式的统一评价,也不是今天的福利清单。

人手有限时,负责人要承担取舍

观众最后问到业务需求多、怎样提高人效。老驴没有把答案放在要求每个人做得更多上,而是回到优先级:资源有限时,不可能同时完成所有事情。负责人需要判断哪些工作更重要,并向相关方说明为什么某些需求要延后。

这与技术分享中的目的、设计和上线计划相连。只有团队知道为什么先做某件事、准备如何交付,个人效率才有明确方向。单纯把压力继续向下传,并不能替代对需求的取舍。

年龄、经验与转管理的讨论

关于年龄焦虑,老驴描述在自己所见的团队里,资深开发者并不少见,部分系统与底层领域尤其重视长期积累。他将话题引向具体工作需要什么能力,而不是给出某个年龄之后一定安全或一定受限的结论。

主持人随后问到跨语言环境中的管理工作。老驴认为,管理需要大量书面和口头沟通,非母语环境会带来额外挑战,需要持续练习理解、表达和协调。这也让整场对谈回到开头的主题:技术能力之外,能否把事情说明白、与人共同作出决定,会影响承担更大责任的方式。

查看本期原视频与分段信息:我在 Google 做研发 →