Software Engineering at Google
软件开发是团队的努力。要在工程团队或任何其他创造性合作中取得成功,你需要围绕谦逊、尊重和信任的核心原则重新定义你的行为。
人们害怕别人看到和评价他们正在进行的工作。从某种意义上说,缺乏安全感是人性的一部分——没有人喜欢被批评,尤其是那些没有完成的事情。认识到这个主题让我们看到了软件开发中一个更普遍的趋势:缺乏安全实际上是一个更大问题的征兆。
在内心深处,许多工程师暗中希望被视为天才。这种幻想是这样的:你会被一个了不起的新概念所震撼。你消失数周或数月躲在洞穴中,努力实现你的理想。然后世界上「发布」你的软件,用你的天才震撼每个人。你的同龄人对你的聪明感到惊讶。人们排队使用你的软件。名利自然随之而来。
人类有寻找领导者和榜样的本能,崇拜他们,并试图模仿他们。我们都需要英雄来激发灵感,编程世界也有自己的英雄。「科技名人」已经几乎被神化,我们都想写一些改变世界的东西,比如 Linux 或者设计下一种优秀的编程语言。
事实证明,这种天才神话只是我们缺乏安全感的另一种表现。许多程序员害怕分享他们刚刚开始的工作,因为这意味着同行会看到他们的错误,知道代码的作者不是天才。
如果你把所有的时间都花在独自工作上,增加了不必要失败的风险,耽误了你的成长潜力。尽管软件开发是一项需要高度集中精力和独处时间的深度智力工作,但你必须权衡协作和审查的价值(以及需求!)。
如果你对世界隐瞒你的牛逼想法,并在未完美之前拒绝向任何人展示,那么你就是在进行一场下注巨大的赌博。早期很容易犯基本的设计错误。你冒着重新发明轮子的风险。而且你也失去了协作的好处:注意到你的邻居通过与他人合作而效率有多高?这就是人们在跳入深水区之前将脚趾浸入水中的原因:你需要确保你在做正确的事情,你在做正确的事情,而且以前从未做过。早期失误的可能性很高。你越早征求反馈,这种风险就越低。记住**「早失败、快失败、经常失败」**这句经得起考验的至理名言。
巴士因子:团队里因巴士撞倒的多少人,会导致项目失败。
你的项目中的知识和技能分散程度如何?如果你是唯一了解原型代码工作原理的人,你需要会受到良好的工作保障,但如果你被公交车撞倒,项目就完蛋了。但是,如果你与同事合作,你的巴士因子就翻了一番。如果你有一个小团队一起进行设计和制作原型,情况会更好——当团队某个成员消失时,项目不会被孤立。记住:团队成员可能不会被公交车撞到,但其他不可预知的事件仍然会发生。有人可能会结婚、搬走、离开公司或请假照顾生病的亲属。确保每个责任领域除了一个主要和一个次要所有者之外,至少还有可用的文档,这有助于确保项目的成功,提高项目的成功率。希望大多数工程师认识到,成为成功项目的一部分比成为失败项目的关键部分要好。
当前 DevOps 对技术生产力的理念明确了这些目标:尽早获得反馈,尽早进行测试,尽早考虑安全和生产环境。这一切都与开发人员工作流程中的“左移”思想捆绑在一起;我们越早发现问题,修复它的成本就越低。
「隐藏」归结起来就是:独自工作比与他人一起工作具有更高的内在风险。即使你可能害怕有人窃取你的想法或认为你不聪明,你更应该担心浪费大量时间在错误的事情上。
在编程领域,孤独的工匠极其罕见,即使他们确实存在,他们也不会在真空中完成超人的成就;他们改变世界的成就几乎总是灵感迸发、团队英勇努力的结果。一个伟大的团队能够出色地利用它的超级明星,但整体总是大于各部分的总和。但打造一支集合多个超级明星球队是极其困难的。让我们把这个想法用更简单的话来说:软件工程是一个团队的努力。
你不能通过隐藏和准备你的秘密发明来改变世界或取悦数百万计的用户。你需要和其他人一起工作。分享你的愿景,分工,向别人学习,创建一个出色的团队。
- 支柱1:谦逊 你不是宇宙的中心(你的代码也不是!)。你既不是全方位的,也不是绝对正确的。你愿意不断提升自我。
- 支柱2:尊重 你真诚地关心与你一起工作的人。你善待他们,欣赏他们的能力和成就。
- 支柱3:信任 你相信其他人有能力并且会做正确的事情,你可以让他们在适当的时候牵头。
不要低估社交游戏的力量。这不是欺骗或操纵人们;这是关于建立关系来完成事情。关系总是比项目更长久。
我们普遍认为,如果你没有遭遇过失败,你就没有足够的创新或承担足够的风险的能力。失败被视为一个黄金机会,可以在下一次尝试中学习和改进。事实上,人们经常引用托马斯·爱迪生的话说:「如果我发现有一万种方法不能成功,我就没有失败。我并不气馁,因为每一个被抛弃的错误尝试都是向前迈出的另一步」。
从错误中学习的关键是通过进行根因分析和撰写「事后总结」来记录你的失败,在谷歌(和许多其他公司)成为事后总结(国内成为复盘)。要格外小心,确保 「事后总结」文件不只是一份无用的道歉、借口或指责的清单,这不是它的目的。正确事后总结应该总是包含对所学到的内容的解释,以及作为学习经验作为后续的改进落地。然后,确保事后总结可以随时查阅,并确保团队真正贯彻执行所建议的改变。好的故障复盘要让其他人(现在和将来)知道发生了什么,避免重蹈覆辙。不要抹去你的足迹——让它们在道路上照亮给那些追随你的人!
一个好的事后总结应该包括以下内容:事件的简要概述事件的时间线,从发现、调查到解决的过程事件的主要原因影响和损害评估一套立即解决该问题的行动项目(包括执行人)。一套防止事件再次发生的行动项目经验教训
要想让别人正确地听取你的意见,你首先需要倾听别人的意见。最好在下定决心或坚定地宣布决定之前进行倾听——如果你不断地改变主意,人们会认为你不坚定。
从长远来看,承认自己犯了错误,或者根本不在你的能力范围,都会提高你的地位。事实上,表达脆弱性的意愿是一种谦逊的外在表现,它表明了责任感和承担责任的意愿,也是你信任他人意见的信号。作为回报,人们最终会尊重你的诚实和力量。有时,你能做的最好的事情就是说,「我不知道」。
在模棱两可中茁壮成长即使在环境不断变化的情况下,也能处理相互冲突的信息或方向,建立共识,并对问题做出改进。重视反馈谦虚优雅地接受和给出反馈,理解反馈对个人(和团队)发展的价值。走出舒适区 能够设定宏伟的目标并去追求,即使有来自他人的抵制或惰性。
客户第一 对谷歌产品的用户抱有同情和尊重,并追求符合其最佳利益的行动。
关心团队 对同事抱有同情心和尊重,并积极主动地帮助他们,提高团队凝聚力。
做正确的事 对自己所做的一切有强烈的主人感;愿意做出困难或不易的决定以保护团队和产品的完整。
几乎任何规模的软件工作的基础都是一个运作良好的团队。尽管软件开发者单打独斗的「天才神话 」仍然存在,但事实是,没有人能够真正地单干。一个软件组织要想经受住时间的考验,就必须有一种健康的文化,植根于谦逊、信任和尊重,围绕着团队而不是个人。此外,软件开发的创造性要求人们承担风险并偶尔失败;为了让人们接受这种失败,必须有一个健康的团队环境。