作为 Staff 工程师,我是怎么找到值得解决的问题的
文章摘要
作者 Lalit Maganti 是 Google 的 Senior Staff 工程师,做的是 Perfetto(性能调试工具)。这篇文章起因于他带的一位资深工程师的提问:「你是怎么找到值得做的问题的?」那位工程师正想往 Staff 迈,意识到这个岗位不只是把分配下来的活干好,还得参与决定团队和组织该建什么。有人建议他在日历上专门划出时间「思考大局」,他试了,觉得没什么效果。
作者的回答是:他几乎从不靠盯着白纸「战略性思考」找到好问题。他的做法是当一块海绵——听日常的噪音流,吸收别人正在遇到的问题,让它们沉在脑子后面。时间一长,有些自己淡去了,另一些之间开始浮现出联系,最终他就看清了到底是什么在拖慢大家、以及他或他的团队能做什么。他见过很多工程师从没试过这条路:他们等经理或 lead 来指出机会,然后靠解决最难的被分配问题来证明价值——这条路确实也能升职,但他职业生涯里印象最深的项目,全都是他找到并解决了一个领导们还没意识到存在的重要问题。他明确加了一个前提:他的经验主要来自大公司的基础设施和开发者工具团队,工程师对路线图有很强的自下而上的自主权;在更自上而下的环境里,这种做法的空间可能小得多。
文章分四步。第一步是「吸收问题,而不是需求」。 人们爱聊自己面临的困难——在会议、聊天串、演示和邮件里解释工作为什么难、抱怨什么拖慢了他们、描述他们希望能做到什么。只要跟他的领域有交集,他就顺着线头往下拉,比如问「如果有 X,能解决你的问题吗」,或者指向自己负责的产品里的某个已有功能问覆盖了多少场景。用户经常直接要一个特定方案而不是解释根本问题,他不会照单全收,而是一直挖到明白对方到底想达成什么、以及现有产品为什么不行。作为一个天生的内向者,这种「环境式聆听」特别适合他——他不需要为了找点子把日历塞满投机性的会议,正常的一周里流经身边的有用信息本来就极多。但当某个问题值得深挖时,他会转为主动:坐到那个团队旁边看他们走一遍工作流和正在查的 bug,可能的话自己上手查几个,「亲眼看到问题,更容易把团队真正需要的东西和他们嘴上要的方案区分开」。他还会专门去找那些视野比他更广的人——负责关键系统的、跨多个团队的、对下游有深刻洞察的——约 1:1 或喝咖啡,问他们最近碰到什么有意思的问题;这些人往往已经在好几个地方见过同一个现象并开始连线,能让他在模式识别上抢先一大步。
第二步是「让问题堆积」。 他被「动作太快」坑过好几次:被某个声音大的团队的需求打动,建好了功能,然后看着他们几乎不用——他们的优先级变了,或者那个需求本来就来自一次已经不重要的一次性调查。一个团队当下多热切,跟这个功能相对于产品其他需求有多重要,是两回事。这教会他让潜在问题堆着:按他这种听法,攒下的问题远多于他能解决的,而且不是所有都值得行动。等待可以是一种超能力——等待意味着同一个问题可能在不同团队独立冒出来(说明优先级更高),或者表面看起来不同的问题其实形状相同(一次能覆盖多个场景),又或者,正如他痛苦学到的,提需求的团队其实压根没那么在乎。他自己是记在脑子里、下次再听到就重新审视;他认识的另一些工程师会更系统地写下来。机制是个人选择,关键是让未解决的问题留存足够久,好让更多证据积累起来。
第三步是「找到共同的形状」。 等待只帮他收集证据,还得判断这些问题是否真的相关、有没有什么能一并解决。Perfetto 是个好例子:它在时间线上用一行行「轨道」显示系统活动记录,两年里不断有团队要一些很小很具体的 UI 改动——一个想要命令把自己偏好的轨道钉在顶部,下一个团队想要同样的功能但针对完全不同的一组轨道;还有的想让 Perfetto 打开时就缩放到记录的某一段,或者显示自定义聚合;有几个团队等不及,用 bookmarklet 调 Perfetto 内部 UI API 搭了复杂的变通方案。攒够之后他脑子里照例是一团乱麻:需求本身、各自的约束、一堆半成形的方案。他学会了不在书桌前硬憋方案,而是在伦敦漫无目的地长时间散步——不刻意去逼的时候,联系反而更容易出现。最后他意识到的是:这些团队真正想要的都不是他们要的那个功能,每个团队想要的是按自己的工作流个性化 Perfetto,同时不把自己的选择强加给所有人;底层需求不是某一个功能,而是扩展 UI 的能力。他形容这种连接终于「咔哒」一声接上时是这份工作里最好的感觉之一:几个别扭的需求塌缩成一个想法,而且打开了任何单个需求都没暗示过的可能性。但他紧接着警告:正是这种时刻最需要小心,因为共同形状只是一个假设,优雅不等于证据。他举了自己近期的一次翻车:他曾坚信给 Perfetto 的 trace 查询做一套透明缓存能同时解决大 trace 分享和重复查询两个问题,直到写 RFC 和做原型时才发现优雅是个谎言——两个问题需要的其实是完全不同的方案;他不情愿地把设计一分为二,两半后来都各自上线了(重复查询靠内存里保温的会话解决,重新打开靠导出成快速加载格式解决)。
第四步是「先压力测试再开建」。 走多远取决于他有多确信这个想法可行、以及人们是否真的想要。如果足够有用且风险足够低,他就直接动手,发改动、顺便知会经理;如果不确定能不能成或要花多少力气,就做一个用完即扔的原型,它能暴露失败点,也给别人一个具体的东西来反应;如果想法很大但他被说服了,就投入全部——数周或数月的工作,加上在其他工程师和团队之间建立支持这件苦差事。整个过程中他不只是在说服别人,也在说服自己:如果别人看不到他看到的价值,或者撞上重大技术墙,他宁愿现在放弃,也不要建一个没人用或者变成维护噩梦的东西;有时候想法站得住但时机不对,他就先搁着,等它成为组织优先级的那天再出手。而当一个想法立住了,他也不一定非得是那个实现它的人——可能他做、可能团队里别人做、也可能它改变的是整个组织的关注点;找到并塑造正确的问题,即便不拥有实现,也能产生影响。Perfetto 的扩展性想法值得全力投入:他们本来就在做插件来模块化 UI,但插件不够——团队必须把插件代码全部开源,这对很多内部场景行不通。所以在动手建任何东西之前,他先把问题和提案带给了经理、队友和客户团队,最终写了两份 RFC、开了若干次 1:1、做了几次分享,边收反馈边打磨。最后他设计并实现了 macros 作为「轻量级扩展」——不写插件就能自动化 UI 操作,而 extension servers 让团队可以分享自己的 macros。与其自己实现每一个被要求的功能,他们把「让团队自行适配 Perfetto」的能力给了出去;如今 Google 内部有几十个团队在用 macros 和 extension servers,另有几家公司也在内部使用 extension servers。
最后一节讲这个循环怎么自我强化:他每走一遍这个流程就更容易一次。当他对别人的问题表现出真正的兴趣、问出有用的问题或帮忙解决了,对方会记住,于是开始更早来找他、把他拉进与其他遇到相关问题的人的对话里。这给了他更宽的组织视野,更容易发现模式、造出人们真正需要的东西,而解决其中一个问题又把他带进更多对话——循环继续。这些成功积累出的是来自长期守护的那种信任:早期他必须亲手把很多想法变成现实,来证明自己的判断可靠;久而久之,经理和组织开始更看重他对「什么重要」的评估,让他不必拥有每个项目也能影响路线图。他特意指出这与「成为 Staff 工程师意味着用会议和协调取代技术工作」的说法不同:对他来说,对话是他所建之物的输入,而不是最终产物。结论回到那位被辅导的工程师:找到值得解决的问题并不与这份工作的其余部分割裂,它来自足够长久地参与别人的工作,久到看见任何单个需求都无法呈现的东西。
HN 评论精华
这条帖子拿到 589 分。讨论并没有停留在文章方法论本身,而是几乎立刻分岔成两条更大的辩论:一是「找不到问题」这件事本身是不是大厂特有的奢侈问题,二是工程师自主权在整个行业是否正在系统性萎缩。
- 最热的反驳来自创业公司视角。9dev:「有趣的是居然有人会有这种烦恼。我职业生涯大部分在创业公司,一贯的体验是待解决的问题远远多于我醒着的时间能完成的。所以我不是去找问题,而是评估哪些最紧急、哪个方案能一次解决好几个。」ryandrake 也说他待过的每个地方 bug 数量都是修复能力的三四倍,而且净增长,「从来不缺问题可解,只是大多数地方不给工程团队自主权去解决关键问题,永远是功能塞塞塞和改版,然后 bug 越堆越高」。underdeserver 出面调和:大公司同样从不缺问题,重点在于找到那些既难到初级工程师独立搞不定、又真正为公司或用户创造价值的问题。tikhonj 补充:已知问题很多,但未知或未被识别的问题也很多,其中一些的杠杆率远高于已知问题,「当海绵」这套照样有用。SkyPuncher 则给了创业公司的反面注解:理论上要解决的问题很多,但在你有合理把握客户在乎之前,大多数都不值得解决。
- 第二热的是自主权在萎缩这条线,起点是 wpasc 抓住文章里那句「一个前提」(作者声明自己所处环境有很强的自下而上自主权)追问:整个行业的趋势是不是工程师自主权越来越少、越来越自上而下?他猜测技术文化正从「技术主导」转向「产品/管理/商业主导」,工程师变成完成业务目标的零件——「全是假设,只有轶事证据」。回帖几乎一边倒地印证。geodel:「资历越深我的自主权反而越少……十年前我可以自己决定什么时候在家办公,做几个有意思的项目再拿给经理事后追认;今天同样的事我得跟经理解释并走正式审批。」mcv 讲了个对照实验:八年前他以自由职业者身份加入某项目,自由度极高,选技术栈、设计每一部分,团队围绕他搭建,用巨大的自由度快速造出了好东西;一年多前他以雇员身份回到同一家公司带技术上同一个团队,一切都变了——层级森严、自上而下、自由极少、繁文缛节和办公室政治遍地、节奏拖沓。sandeepkd 的判断更直接:作者能点出这个前提是好事,因为大多数公司/团队/人并不在这种模式下运作;细节里藏着的事实是作者有能力做他想做的事,这要么意味着他靠过往成绩挣到了足够的政治声望,要么意味着他跟管理链条高度一致——「这条建议对行业里更大的一块恐怕不实用」。gofreddygo 补了另一层:自上而下的大公司还有文章完全没提的另一类问题——政治、地盘意识和历史包袱;在大公司里,找到问题和技术方案相比之下微不足道,真正吃力的是搞清楚你的才华会得罪谁、谁是这些问题的既得利益者、他们的汇报链和激励结构,以及用他们和他们老板能完全听懂的术语来包装方案的艺术。
- hinkley 贡献了一条很有画面感的自白:在管控型公司他会「搞地下工作」,但这种潜伏最多撑三年就得走人,否则会因为「让整个工程团队变得更高效」而被 PIP——他们不知道他到底在干什么,但知道自己不喜欢,而且手里有一堆能佐证自己想法的数字。「像木工自己做治具一样,不管公司想不想要,我总是造自己的工具。在支持性的环境里我大声地做和分享;不在时,就在午饭时间、关起门来、在紧急事故时掏出来,或者一声不吭地塞进 CI 流水线。」他说真正让他困惑的是不是所有人都这么做——「我们这行的全部意义就是把可重复的任务写成代码,而只有大约六分之一的人会对自己工作里最枯燥最易错的部分这么做,这荒谬得让我抓狂」。
- 另一条实质性的分歧关于「Staff 该不该还写代码」。intoXbox 说出了很多人的处境:技术积累深意味着他能又快又好地把短期问题当需求解决掉,但花大量时间去理解别的团队的挫折很耗时,「我不喜欢当那个光说不练、不推代码不发功能的人」。zbentley 的回复被广泛认同:关键的认知是,那些他知道自己能很快解决的问题,恰恰是他该让别人去解决的——他一两天能干完的,别人一两周也能干完并从中学到东西,而且那个尺寸的活多半不需要他自诩的质量标准;Staff 的时间花在「难以识别、且合适方案不显然」的问题上回报高得多,「我拿的薪水是为了做资深工程师做不了或还做不了的事,以及示范和带教他们做到;我做得更快更好并不重要」。boulos 从管理者角度给出了平衡:他同样不喜欢 IC 序列上的「纯说话者」,常鼓励这类人转 Director+;但反面是陷在细节里太深的人——解决零散小问题是保持对现场脉搏感知的好办法,可如果彻底陷进去,你很可能是在逃避领导责任。他坦言自己的工作风格是潮起潮落的,有些月份几乎提交不了代码,另一些月份可以去做没人会做的事,「我更喜欢后者,但我尊重我的工作需要前者;很多你看到整天在说话的人,是真的相信那是对他们时间最负责任的用法,他们未必个人喜欢这样」。DenisM 引用他的「太爷爷老板」的说法:招顶尖工程师是有可重复流程的——打电话给招聘方、接上面试流水线、两个月后拿到指定数量;但招一个能识别正确问题并推动其解决的人没有可重复流程,所以一旦找到这种人,就会把他推向那些没有明显成功配方的事,并把他从有配方的事上拉开。
- dirtbag__dad 给出了一套可直接抄的实操手册:对非工程团队,一是混进他们所有的支持或公开 Slack 频道,留意突发的抓狂时刻和持续的「杂活失明」;二是每月和团队负责人开一次 45 分钟的会,让他们列出到底什么最烦。对技术团队,他几乎每一次交付都要么固化一个新模式(或为一个新模式添砖)、要么改善 CI/CD 速度或检查项,「除了具体 bug 修复,我做的每件事都要有力量倍增效果,否则就是在浪费我的力气」。他还补了一条关于说服的经验:当你有指标和图表来论证时间花得值时,说服组织会容易得多——哪怕是个 bug 满天飞的功能或者业务依赖的重管道,只要能证明它在伤害客户并最终伤害利润,争论范围就变得没那么重要了,因为你在用非技术人员的语言说话。
- 也有几条尖锐的元评论。ricksunny 注意到文章里的「一个前提(One caveat)」结构和对「形状(shape)」的引用都是典型的 Claude 用语,因此他把这篇文章当作 AI 生成来读——「可能仍有有趣有用的东西可说,也可能没有,但比起文字本身,我更想看 Maganti 用来产出这些散文的提示词序列」。ronnier 提出了另一个不受欢迎但被认真讨论的观点:科技行业整体臃肿,大规模裁员对大多数公司其实没什么影响;团队人少意味着上下文切换更少、开发者拥有更多,问题会直接摆在眼前不用去找——他在多家大厂见过太多人活不够干,于是靠制造会议和写文档这类浪费时间的事来填满时间,而经理和总监想要臃肿的大团队,人头越多越好要资源和升职。teiferer 对「写文档是浪费」这句强烈反对:「我希望人们能写更多更好的文档,把跟讨论缩进和变量命名一样多的时间投进去写细致的文档……结果因为这种态度,文档永远很烂甚至根本不存在。这正是 LLM 这么受欢迎的原因之一——它们告诉你的正是文档存在时你会在里面找到的东西,只是 LLM 只覆盖『是什么』,不覆盖『为什么』。」