当我加入谷歌(Google)大约14年前时,我认为这份工作主要是关于编写优秀代码的。我部分是对的。但是,我在这里待的时间越长,我就越意识到那些在这里表现出色的工程师并不一定是最好的程序员——他们是那些已经弄清楚如何在代码周围导航的人:人、政治、对齐、模糊性。
这些经验教训是我希望早些知道的。有些本可以让我避免数月的沮丧。其他的需要多年才能完全理解。没有一个是关于特定技术的——那些技术变化太快了,没什么意义。它们是关于那些一个又一个项目、一个又一个团队中不断出现的模式。
我分享这些,是因为我从其他工程师那里受益良多,他们也曾为我做过同样的事情。可以把这当作是我尝试回报的方式。
沉迷于某种技术并寻找应用它的地方是很诱人的。我也曾这样做。每个人都曾这样做。但是,创造最多价值的工程师们反其道而行:他们痴迷于深入地理解用户问题,并让解决方案从这种理解中产生。
用户痴迷意味着花时间处理支持票、与用户交谈、观看用户挣扎、不断问“为什么”直到你找到根本原因。真正理解问题的工程师通常会发现,优雅的解决方案比任何人预期的都要简单。
从解决方案开始的工程师往往会在寻找理由的过程中构建复杂性。
你可以赢得每一个技术争论,但仍然会失去项目。我曾经看到过才华横溢的工程师通过总是成为房间里最聪明的人而积累了沉默的怨恨。这种代价后来以“神秘的执行问题”和“奇怪的阻力”表现出来。
技巧不是在于正确,而是在于进入讨论以对齐问题,为他人创造空间,并对自己的确定性保持怀疑。
强烈的意见,弱地持有——不是因为你缺乏信念,而是因为在不确定性下做出的决定不应与身份绑定。
追求完美是令人麻痹的。我曾经看到过工程师们花费数周时间辩论某事物的理想架构,而他们从未建造过它。完美的解决方案很少仅仅从思考中产生——它是从与现实的接触中产生的。人工智能(AI)可以在很多方面帮助这里。
首先做它,然后做对它,然后做得更好。把丑陋的原型放在用户面前。写设计文档的凌乱第一稿。发布让你稍微感到尴尬的最小可行产品(MVP)。你将从一周的真实反馈中学习到比一个月的理论辩论更多的东西。
动力创造清晰度。分析瘫痪什么都创造不了。
写聪明代码的冲动几乎是所有工程师的普遍特征。这感觉像是能力的证明。
但是软件工程是当你添加时间和其他程序员时发生的事情。在这种环境中,清晰度不是一种风格偏好——它是运营风险的减少。
你的代码是给陌生人的一份策略备忘录,他们将在凌晨2点的停机期间维护它。优化他们的理解,而不是你的优雅。 我尊重最多的高级工程师已经学会用清晰度换取聪明才智,每次都是如此。
把你的技术选择当作一个有小“创新令牌”预算的组织。每次采用非标准的东西时花费一个令牌。你不能承担太多。
结论不是“永远不要创新”。而是“只在你被要求创新的时候才创新”。其他事情都应该默认为枯燥的,因为枯燥的东西有已知的故障模式。
“最适合这份工作的工具”往往是“最不糟糕的工具,可以完成很多工作”——因为经营一个动物园成为真正的税收。
早在我的职业生涯中,我相信优秀的工作会为自己说话。我错了。代码默默地坐在仓库中。你的经理在会议上提到你,或者不提到你。同事推荐你参加一个项目,或者推荐其他人。
在大型组织中,决定是在你没有被邀请的会议上做出的,使用你没有写的摘要,由有五分钟时间和十二个优先事项的人做出的。如果没有人在你不在场时能够阐明你的影响力,你的影响力实际上是可有可无的。
这不仅仅是关于自我推销。这是关于让价值链对所有人都可见——包括你自己。
我们在工程文化中庆祝创造。没有人因为删除代码而被晋升,即使删除代码通常比添加更能改善系统。每一行你不写的代码都是你永远不需要调试、维护或解释的代码。
在你构建之前,彻底探索这个问题:“如果我们什么都不做会发生什么?”有时候答案是“没有坏事”,这就是你的解决方案。
问题不在于工程师不能编写代码或使用人工智能来编写代码。问题在于我们太擅长编写代码,以至于我们忘记了问我们是否应该编写代码。
有足够多的用户,每一个可观察的行为都会成为依赖项——无论你做出了什么承诺。有人正在抓取你的API,自动化你的怪癖,缓存你的错误。
这产生了一个职业生涯级别的洞察:你不能把兼容性工作当作“维护”而新功能当作“真正的工作”。兼容性就是产品。
设计你的弃用作为带有时间、工具和同情心的迁移。大多数“API设计”实际上是“API退休”。
当一个项目拖延时,人们的直觉是责怪执行:人们没有努力工作,技术是错误的,没有足够的工程师。通常,这些都不是真正的问题。
在大公司中,团队是你的并发单元,但协调成本会随着团队数量的增加而呈几何级增长。大多数的缓慢实际上是对齐失败——人们正在构建错误的东西,或者以不兼容的方式构建正确的东西。
高级工程师花更多时间阐明方向、接口和优先级,而不是“编写更快的代码”,因为真正的瓶颈就在那里。
在一家大公司中,有无数的变量不在你的控制范围内——组织变革、管理决策、市场转变、产品转向。沉迷于这些会产生焦虑而没有代理权。
那些保持理智和有效的工程师专注于他们的影响范围内的事情。你不能控制是否会发生重组。你可以控制你的工作质量、你的回应以及你所学到的东西。当面临不确定性时,将问题分解成碎片,并找出可供你采取的具体行动。
这不是被动接受,而是战略性关注。花在你不能改变的事情上的精力是从你可以改变的事情上偷走的精力。
每一个抽象都是一个赌注,你不会需要了解它下面是什么。有时候你会赢这个赌注。但总是会有东西泄漏出来,当它发生时,你需要知道你站在什么基础上。
高级工程师即使堆栈变得更高,也会继续学习“更低级”的东西。这不是出于怀旧,而是出于对3点钟系统故障时的尊重。使用你的堆栈。
但要保留其潜在故障模式的工作模型。
写作强制清晰。当我向他人解释一个概念时——无论是在文档中、演讲中、代码审查评论中,甚至只是与人工智能聊天——我都会发现自己理解中的缺陷。向别人阐明某些东西的行为使其对我自己来说更容易理解。
这并不意味着你可以通过教学来学习如何成为一名外科医生,但在软件工程领域,这个前提仍然基本正确。
这不仅仅是关于知识的慷慨。这是一个自私的学习技巧。如果你认为自己理解了某些东西,尝试简单地解释它。你的理解不够深入的地方就是你会踩到的地方。
教学就是调试你自己的心智模型。
胶水工作——文档、入职、跨团队协调、流程改进——是至关重要的。但是,如果你不自觉地做这些工作,它可能会阻碍你的技术轨迹并让你筋疲力尽。陷阱是把它当作“帮助”而不是故意、有界限、可见的影响来做。
为其设定时间限制。轮流做。把它变成文档、模板、自动化。并使其可见为影响,而不是性格特征。
无价和不可见是一种对你职业生涯的危险组合。
我已经学会了对自己的确定性保持警惕。当我“赢得”得太容易时,通常有什么东西是错误的。人们停止与你争论,不是因为你说服了他们,而是因为他们已经放弃了尝试——他们会在执行中而不是会议中表达他们的不同意见。
真正的对齐需要更长的时间。你必须真正理解其他人的观点,纳入反馈,并有时公开改变主意。
短期内“正确”的感觉远远不如长期内与愿意合作的人一起构建东西的现实更有价值。
每一个你向管理层暴露的指标最终都会被操纵。不是出于恶意,而是因为人类会优化被衡量的东西。
如果你跟踪代码行数,你会得到更多的代码行。如果你跟踪速度,你会得到夸大的估计。
高级的做法是:对每个指标请求都配对。一个用于速度,一个用于质量或风险。然后坚持解释趋势,而不是膜拜阈值。目标是洞察力,而不是监视。
高级工程师说“我不知道”并不是表现出弱点——他们是在创造许可。当领导承认不确定性时,这发出一个信号,表明房间里是安全的,其他人也可以这样做。另一种选择是,人们会假装理解,问题会保持隐藏,直到它们爆发。
我见过一些团队,最高级的领导从不承认困惑,我也见过这种做法造成的损害。问题没有被提出来,假设没有被质疑,初级工程师保持沉默,因为他们认为其他人都明白了。
表现出好奇心,你就会得到一个真正学习的团队。
早在我的职业生涯中,我专注于工作,忽略了建立人脉关系。回想起来,这是一个错误。那些在关系上投入时间的同事——无论是在公司内部还是外部——几十年来都得到了回报。
他们第一个听到机会,能够更快地建立桥梁,获得推荐,和他们多年来建立信任的人一起创办了公司。
你的工作不是永恒的,但你的网络是。用好奇心和慷慨心对待它,而不是交易性的热情。
当你需要离开的时候,往往是关系打开了大门。
当系统变慢时,人们的直觉是添加:缓存层、并行处理、更聪明的算法。有时候这是正确的。但是我看到更多的性能收益来自于问“我们计算了什么不必要的东西?”
删除不必要的工作几乎总是比做必要的工作更快更有影响力。最快的代码是永远不会运行的代码。
在优化之前,先质疑这项工作是否应该存在。
最好的流程使协调更容易,失败更便宜。最糟糕的流程是官僚主义的戏剧——它存在不是为了帮助,而是为了在事情出错时分配责任。
如果你不能解释一个流程如何减少风险或增加清晰度,那么它可能只是开销。
如果人们花更多时间记录工作而不是做工作,那么一定出了严重的问题。
早期职业生涯中,你用时间换取金钱——这也没关系。但是到了某个时候,计算方法就逆转了。你开始意识到时间是不可再生的资源。
我看到高级工程师因追求下一个晋升级别而精疲力尽,他们优化了几百分之几的补偿。有些人得到了晋升。大多数人在之后想知道这是否值得他们放弃的东西。
答案不是“不要努力工作”。而是“知道你在交易什么,并有意地做出交易”。
专业知识来自于刻意的练习——将你的技能推向当前水平之外,反思,然后重复。多年来一直如此。没有浓缩版。
但是这里有一个乐观的方面:学习会随着创造新的选择而复利,而不是仅仅创造新的琐事。写作——不仅仅是为了参与,而是为了清晰度。构建可重用的原语。将疤痕收集成游戏手册。
把职业生涯当作复利,而不是彩票的工程师往往会走得更远。
二十一堂课听起来很多,但它们基本上归结为几个核心思想:保持好奇心,保持谦逊,并记住工作总是关于人——你正在为他们构建的用户和你一起构建的同事。
工程师的职业生涯足够长,可以犯很多错误并仍然取得成功。我最佩服的工程师不是那些做对了所有事情的人,而是那些从错误中学习、分享他们的发现并继续前进的人。
如果你刚刚开始你的旅程,请知道它会随着时间的推移而变得更加丰富。如果你已经深入其中,我希望其中一些内容能引起你的共鸣。