摘抄
卓有成效的工程师 埃德蒙·刘 43个笔记 前言 工作时间过长会导致工作效率降低并产生职业倦怠。当需要修复由于加班和疲劳所导致的错误时,工作产出甚至可能为负数。 他们可能很努力,但我们会认为那些使用更少的时间和资源,但取得同样成果的人更有成效 第一部分 树立正确态度 我还创建了一份入职培训计划,内容包括一系列共10个经常性的技术讲座和10个codelab 初创公司的成功更多取决于整个团队的成功,而不是工程师个体的成就,因此尽快培养出合格的工程师就是杠杆率最高的工作之一。 将这三个方式转化为三个问题,可以用来评估我们正在进行的工作:1.如何在更短的时间内完成这项工作?2.如何增加该工作产生的价值?3.是否有其他工作可以在当下创造更多价值? 你可以通过以下三种方式提高会议的杠杆率:1.将会议时长设置为半小时,而不是1小时,以便在更短的时间内完成同样的工作量。2.为会议准备一份议程并设立一组目标,在会前分发给与会者,使会议上的讨论更加集中且更有成效。3.如果没有必要召开线下会议,就用电子邮件来代替,原本用于会议的时间可以用来构建某个重要的功能。 如果你是一名产品工程师,准备为公司的旗舰产品开发一个面向客户的新功能,可以通过以下方式提高开发时间的杠杆率:1.把开发或测试过程中人工完成的工作部分自动化,以便更快地迭代。2.根据任务对所发布产品的重要性确定其优先级,从而使最终发布的产品的价值最大化。3.与客户支持团队交流,深入了解客户最大的痛点,并利用这些痛点信息开发一个新功能,以更少的投入产生更大的价值。 如果你是一名性能工程师,负责诊断并修复网络应用程序中的性能瓶颈。当产品团队推出新产品和新功能时,应用程序的性能可能会下降,你的职责是保持或者优化应用程序的性能指标。可以提高杠杆率的方法包括:1.学习使用性能诊断工具,以减少识别每个应用性能瓶颈所需的时间。2.统计每个网页的性能和访问频率,以便优先优化访问量最高的页面的性能,从而增强每项性能优化措施的作用。3.与产品团队合作,从一开始就设计高性能软件。在产品开发过程中将应用程序的速度作为一项优先考虑的性能,而不是一个待修复的bug。 当你阅读本书时,要时刻牢记这句话:专注于高杠杆率的工作 招聘是经理和工程师的头等大事 2 精益求精,优化学习方式 如果我搞砸了一次谈话,就会反思该如何做出更机智的回应,并在下一次谈话中改进。我努力练习讲更好的故事,因为我坚信,成为有魅力的健谈者是一项可以习得的技能,并且随着时间的推移我会越来越熟练。那一年是我重塑自我的一年,我不仅结识了很多好朋友,拓展了人脉,而且还扩展了自己的舒适区 们通常会严重低估微小变化对增长率的长期影响。 当公司为一份轻松的、毫无挑战的、朝九晚五的工作向你支付薪水时,“他们实际上是在付钱让你接受更低的智力增长率。等你认识到智力投资会产生复利效应时,已经为错失长期复利付出了巨大的代价。他们没有让你获得一生中最好的机会,而是得到另一件可怕的东西:……安于现状。”11 要想让自己获得长远的成功,就必须把自己当成一家初创公司或者是一款测试版产品,一个需要每天进行投资和迭代的半成品。12 另一方面,缺乏增长会导致公司或团队发展停滞和办公室政治,员工可能会因为机会有限而恶性竞争,因此很难找到并留住人才。 细致规范的入职流程表明,该组织将新员工的培训放在首位 就职业成长和工作幸福感而言,和谁一起工作要比实际做什么工作更为重要 √面试官看起来比你更聪明吗?√有人能教你什么技能吗?√你的面试是否严谨全面?你想和面试官一起工作吗?√人们是倾向于一个人在项目上工作,还是以团队的方式合作? 我们应该抽出20%的时间对自己的成长投资。每天抽出一两小时要比每周抽出一整天更有效,因为这样可以养成每天学习新技能的习惯。一开始我们的工作效率可能会下降(如果不把时间浪费在上网或是其他分心的事情上,工作效率可能不会有太大变化),但从长远来看,这项投资会让我们更有成效。 确保团队中有比你更资深的、可以请教的工程师。如果没有,请考虑更换项目或团队。这将有助于提高你剩余80%时间内的学习速率。 3 定期调整优先级 在明确表达了这些“实施计划”的学生中,71%的人提交了论文。 计划会在特定的场景或信号(如果)与你应该实施的行为(就)之间建立联系”。一旦触发了信号,随后的行为则会“在没有任何意识的情况下自动发生 第二部分 执行,执行,再执行 如果某个任务必须手动做两次以上,那么第三次就去编写一个工具 熟练使用自己最喜欢的文本编辑器或IDE 至少学习一种高效的高级编程语言。 熟悉UNIX(或Windows)Shell命令 多用键盘,少用鼠标 自动化手动工作流程。 在交互式解释器上测试新想法。 6 尽早且频繁验证想法 构建自己的A/B测试框架可能会让人望而生畏。幸运的是,有许多现成的工具可以用来测试关于产品的假设。免费或开源的A/B测试框架包括Etsy的featureflagging API31、Vanity32、Genetify33和Google Content Experiments34。如果想要获取更多工具和支持,可以使用Optimizely35、Apptimize36、Unbounce37、和Visual Website Optimizer38等按月付费的软件。鉴于通过A/B测试可以学到很多东西,所以这是一项非常值得的投资。 7 提升项目估算能力 尽可能让真正负责某项任务的人去做实际的估算工作。 第三部分 构建长期价值 时间最好花在什么地方?是用于增加单元测试覆盖率还是设计更多产品原型?是用于审查代码还是编写更多代码?鉴于高质量代码带来的收益,为自己和团队找到一种务实的平衡会有极高的杠杆率。 一些团队成员甚至构建了一个名为Barkeep的开源代码审查工 9 最小化运营负担 像沃尔什一样,我们也可以编写成功脚本,将决策过程从高风险和高压力的场景转移到更可控的环境中。我们可以降低被情绪影响判断以及被时间压力加重心理负担的频率。作为软件工程师,我们甚至可以对自己的反应编程,把它们写成脚本, 10 为团队成长投资 从Ooyala学到的最大的教训是,为员工提供积极、顺畅的入职体验是非常有价值的。 传统上,谷歌、微软、Facebook和亚马逊等许多大型科技公司,都要求工程师候选人在白板上回答算法和编程问题。这些教科书式的问题可以评估候选人的计算机科学基础知识,但通常无法衡量他是否真的能在工作环境中完成工作。 在新工程师入职的第一个月,对他们每天进行一两个小时的培训,比在产品上花同样的时间所产生的组织影响要大得多 有一种常见的误解,认为成为唯一一个负责项目的软件工程师会增加个人的价值。毕竟,如果没什么人知道你所知道的,那么你的知识的稀缺性就会转化为更高的需求和价值,对吧?然而,我的经验是,共享代码所有权不仅有利于自己,也有利于整个团队。随着资历的增加,作为软件工程师你的责任也会增加。你将成为更多项目的负责人,其他工程师也会更频繁地向你咨询。虽然这会让你感觉良好,甚至可能会增加你的工作安全感,但这也是需要付出代价的。 当你成为某个项目的瓶颈时,你就失去了处理其他工作的灵活性。你必须频繁地处理高优先级的bug,因为你的专业知识使你能够更快地修复它们。如果你是唯一一个对工作系统有完整了解的人,当系统出现故障时,你会发现自己是第一道(或唯一的)防线。你的大部分时间都花在响应问题、维护系统、调整功能或修复系统中的错误上,而这仅仅因为你是知识最渊博的人,这样一来你就很难找到空闲时间去学习和构建新的事物。在团队中找到可以满足这些需求的其他成员,能让你有更多自由去专注于其他高杠杆率的活动。这就是我们提倡通过教学和指导对团队进行投资,从而获得长期回报的一个关键原因。 共享代码所有权将“巴士因子”(bus factor)增加到1以上 避免出现一人团队。 •互相审查对方的代码和软件设计。 •团队成员轮流承担不同类型的任务和职责。 •保持代码的可读性和高质量。 •举办关于软件设计决策和架构技术的讲座。 •为软件编写文档,不管是高层的设计文档还是代码注释均可。 •将完成工作所需的复杂工作流程或不明显的变通方法用文档记录下来。 •投入时间教授并指导其他团队成员。 那么,最优秀的工程师希望在未来的公司里找到什么呢?根据数百次的面试和交谈,我发现卓越的工程师文化有以下特点: 1.优化迭代速度。 2.坚持不懈地推动自动化。 3.构建正确的软件抽象。 4.通过代码审查来关注高质量代码。 5.在工作中相互尊重。 6.建立代码的共享所有权。 7.对自动化测试投资。 8.提供实验时间,不管是工作时间的20%,还是黑客马拉松。 9.培养一种学习和持续改进的文化。 10.聘用最优秀的人。 附录A 每位软件工程师都应该阅读的10本书 •《人件》(Peopleware: Productive Projects and Teams):作者是软件顾问汤姆·迪马可与蒂莫西·利斯特。这本书于1987年首次出版,作者通过对项目和团队中许多动态因素的研究,提出了一系列由实际研究所支持的观点。有些内容虽然有点过时,但这本书提出了许多蕴含智慧结晶的观点,比如强制加班会如何破坏团队的凝聚力,以及在编程时听音乐会如何干扰我们的专注力。《人件》促使我开始思考如何建立有效的工程团队和卓越的工程师文化。 •《极客与团队:软件工程师的团队生存秘籍》(Team Geek: A Software Developer's Guide to Working Well with Others):由布赖恩·W·菲茨帕特里克(Brian W.Fitzpatrick)和本·柯林斯-萨斯曼(Ben Collins-Sussman)合著。在这本书中,两位创建了谷歌芝加哥工程办公室的谷歌人分享了如何与软件工程师融洽合作的经历和见解。它涵盖如何与经理或害群之马式的团队成员打交道的策略,并讨论了领导团队的模式与反模式,对任何成长中的软件工程师来说都非常值得阅读。 •《格鲁夫给经理人的第一课》(High Output Management):安德鲁·S·格鲁夫著。格鲁夫是英特尔前首席执行官,正是他向我介绍了杠杆率,我现在用来分配时间的方法也是他所推荐的。不要因为书名中的“管理”一词就退避三舍。作者关于如何提高产出的建议既适用于管理者,也适用于他所说的“技术经理”——类似高级软件工程师这样的人,他们掌握着组织中大量的宝贵知识。 •《搞定:无压工作的艺术》(Getting Things Done: The Art of Stress-Free Productivity):作者是大卫·艾伦(David Allen)。这本书详细描述了管理待办事项以及任务清单的具体方法。虽然我并不赞同艾伦的所有观点,但书中一些可行的工作方式确实令我耳目一新。如果你没有一个好的工作流程来确定任务的优先级并完成任务,这本书可以提供最初的参考。 •《每周工作4小时》(The 4-Hour Workweek: Escape 9-5,Live Anywhere,and Join the New Rich):作者为蒂莫西·费里斯。无论你是否真的认同费里斯所倡导的那种极端的生活方式,这本书都能教会你两件事。首先,它展示了通过不断调整工作的优先级,并且专注于充分利用强项的倍增效应,可以实现无限的可能。其次,它使人们认识到创建可持续的弱维护系统的重要性。这是在工程中经常被忽视的一点,我们倾向于用最新的、诱人的技术去构建新功能,却不一定考虑到了未来的维护成本。 •《高效能人士的七个习惯》(The 7 Habits of Highly Effective People: Powerful Lessons in Personal Change):作者为斯蒂芬·R·科维。事实上,我并不喜欢科维的写作风格,其中大部分内容都有点过于抽象且松散,但书中观点的持久影响力弥补了这点不足。从科维的第三个习惯“要事第一”中,我了解到人们往往会忽视重要但不紧急的任务,并花很多时间去处理诸如电子邮件、电话和会议等可能紧急但根本不重要的任务。我从这个习惯中获得的一个关键启示就是,要明确地规划时间来对自己进行投资,比如学习新技能、维护人际关系、阅读书籍等。 •《清醒:如何用价值观创造价值》(Conscious Business: How to Build Value Through Values):作者是弗雷德·考夫曼(Fred Kofman)。考夫曼在Facebook和谷歌等公司担任过领导力研讨班导师,他的书改变了我与他人进行高难度谈话时采用的方式。通过简单的语言和精心构建的假设,考夫曼证明了我们经常将事实与自己对事实的解读混为一谈,从而导致无效的沟通。只有将事实与故事分离开来,我们才能真正地进行那些高难度谈话,并实现沟通所要达成的目标。 •《高效能人士的思维方式》(Your Brain at Work: Strategies for Overcoming Distraction,Regaining Focus,and Working Smarter All Day Long):作者是戴维·罗克(David Rock)。在这本通俗易懂的书中,罗克将对大脑功能的研究与克服大脑的局限性更有效工作的可行性建议结合在一起。例如,这本书告诉我,因为优先级排序是一项困难但杠杆率高的活动,需要耗费大量的认知精力,所以最好在一天工作开始的时候进行。 •《心流:最优体验心理学》(Flow: The Psychology of Optimal Experience):作者是米哈里·契克森米哈赖,一位匈牙利教授,当今世界积极心理学领域的领军人物。他在这本书中总结了自己多年来关于什么让人感到满足和有动力的研究。主要原则包括快速的反馈循环、适当的挑战水平和不被干扰打断。考虑到我们在工作上要花费无数时间,在我们从某个工作转到另一个工作,从一个项目换到另一个项目时,充分认识到这些原则是非常有价值的。 •《成功,动机与目标》(Succeed: How We Can Reach Our Goals):作者为海蒂·格兰特·霍尔沃森(Heidi Grant Halvorson)。他探讨了思考目标时可以采用的不同框架,以及如何最优地设定目标以增加成功的机会。对目标采取乐观/悲观的态度什么时候会有所帮助?应该思考为什么要实现某个目标,还是思考实现它需要哪些步骤?我们是否应当设想一下实现某个目标后可能会获得什么,或者如果未能实现目标可能会失去什么?事实证明,根据目标的类型,设定目标时的不同心理会显著影响我们成功的机会。 推荐关注的博客 1.博客名:theeffectiveengineer 这是我的个人博客,我在这里撰写有关工程习惯、提升生产率的技巧,以及领导力和文化方面的内容。 2.博客名:kalzumeus 这个博客的作者帕特里克·麦克肯齐(Patrick McKenzie)经营着自己的软件公司,并且写了许多关于职业、软件咨询、SEO和软件销售的优秀长篇文章。 3.博客名:katemats 博主凯特·马苏德拉(Kate Matsudaira)曾在微软和亚马逊等大公司以及初创公司工作过,她在博客中分享了关于技术、领导力和生活的建议。 4.博客名:randsinrepose 博主迈克尔·洛普(Michael Lopp)曾在网景、苹果、Palantir和Pinterest等公司的管理职位上工作多年,并撰写了关于科技生活和工程管理的文章。 5.博客名:softwareleadweekly 博主奥伦·艾伦伯根(Oren Ellenbogen)策划了一份关于工程领导力与文化的高质量的通讯周刊。 6.博客名:calnewport 博主卡尔·纽波特(Cal Newport)是乔治敦大学计算机科学助理教授,专注于提供基于证据的建议,以实现成功而充实的人生。 7.博客名:joelonsoftware 博主乔尔·斯伯斯基(Joel Spolsky)是Stack Exchange的联合创始人,在他的博客文章里有各种各样的编程箴言。 8.博客名:martinfowler 博主马丁·福勒(Martin Fowler)是《重构》一书的作者,他撰写了关于如何最大限度地提高软件团队生产力的文章,并对常见的编程模式进行了详细的总结。 9.博客名:pgbovine 这是计算机科学教授菲利普·郭(Philip Guo)的博客,他全面且坦诚地撰写了大量文章,描述了他本人在研究生院学习和工作后的经历。
微信读书
说明 · · · · · ·
表示其中内容是对原文的摘抄