卓有成效的工程师
第⼀部分 树⽴正确态度
1 聚焦⾼杠杆率⼯作
使⽤杠杆率衡量⼯作成效
提⾼杠杆率的三种⽅式
1.减少完成某项⼯作所需时间。
2.增加该⼯作的产出。
3.转向杠杆率更⾼的⼯作。
将这三个⽅式转化为三个问题,可以⽤来评估我们正在进⾏的⼯作:
1.如何在更短的时间内完成这项⼯作?
2.如何增加该⼯作产⽣的价值?
3.是否有其他⼯作可以在当下创造更多价值?
将精⼒投⼊杠杆点,⽽⾮易于完成的⼯作
2 精益求精,优化学习⽅式
培养成⻓型思维模式
我们要为⾃⼰可以改变的每个⽅⾯承担责任——从提⾼谈话技巧到掌握新的⼯程重点——⽽不是将失败和不⾜归咎于⾃⼰⽆法控制的事情;这意味着我们要掌控⾃⼰的经历;这意味着要对我们学习⽅⾯的经验进⾏优化,⽽不是优化那些毫不费⼒就取得成功的经验;这还意味着我们要提升学习速率。
提升学习速率
寻求利于学习的⼯作环境
1.快速增⻓。
√核⼼业务指标(如活跃⽤⼾数、年度经常性收⼊、产品销量
等)的周或⽉增⻓率是多少?
√你将负责的特定举措是否具有⾼优先级,并得到公司⾜够的⽀
持和资源以实现增⻓?
√公司或团队在过去⼀年的招聘⼒度有多⼤?
√团队中最优秀的成员成⻓为领导者的速度有多快?
2.培训。
√公司是否期望新员⼯⾃⼰找到问题并解决,或者有正式流程帮
助⼊职的⼯程师适应新环境?
√是否有正式或⾮正式的导师计划?
√公司采取了哪些措施来确保团队成员持续学习和成⻓?
√团队成员最近学到了什么新东西?
3.开放。
√员⼯是否知道不同团队⼯作内容的优先级?
√团队是否开会反思产品变更或功能发布的代价?他们会在发⽣
故障后复盘吗?
√如何在公司范围内记录和共享知识?
√团队吸取了哪些经验和教训?
4.节奏。
√快速⾏动是否体现在公司或⼯程价值观中?
√团队使⽤什么⼯具来提⾼迭代速度?
√⼀个想法从构思到获得批准需要多⻓时间?
√花在维护已有产品与花在开发新产品、新功能上的时间各占多
少?
5.⼈员。
√⾯试官看起来⽐你更聪明吗?
√有⼈能教你什么技能吗?
√你的⾯试是否严谨全⾯?你想和⾯试官⼀起⼯作吗?
√⼈们是倾向于⼀个⼈在项⽬上⼯作,还是以团队的⽅式合作?
6.⾃治。
√⼤家是否有拥有选择项⽬、开展项⽬的⾃主权?
√个⼈换团队或换项⽬的频率如何?
√在⼀年的时间⾥,⼀名员⼯可以在代码库的多⼤范围内⼯作?
√⼯程师是否参与产品设计的讨论并能影响产品⽅向?
将时间投到培养新技能的任务上
每天抽出⼀两⼩时要⽐每周抽出⼀整天更有效,因为这样可以养成每天学习新技能的习惯。
•学习公司⾥最优秀的⼯程师编写的核⼼抽象代码。
•编写更多的代码。
•研读内部可获取的任何技术和学习资料。
•掌握你所使⽤的编程语⾔。
•请公司⾥最严格的⼈审查你的代码。
•参加专业技能培训课程。
•主动参与感兴趣项⽬的设计讨论,不要被动等待。
•在不同类型的项⽬上⼯作。
•确保团队中有⽐你更资深的、可以请教的⼯程师。
•勇于学习⾃⼰不熟悉的代码。
持续学习
•学习新的编程语⾔及开发框架。
•学习市场需求旺盛的技能。
•阅读。
•加⼊讨论⼩组。
•参加讲座、⾏业会议和线下聚会。
•建⽴并维护⼀个强⼤的⼈际关系⽹。
•关注那些传授技能的博客。
•为教学⽽写作。
•拓展兴趣项⽬。
•培养业余爱好。
3 定期调整优先级
简单易⽤的待办事项清单
第⼀,它是⼯作的规范化描述;第⼆,⽅便查看。⼀个简单的总清单⽐各种各样的便利贴、记事本和电⼦邮件要好⽤,因为这些零散的载体很容易被放错地⽅,使⼤脑更难相信它们记载了全部的⼯作。有了这个总清单,只要有⼀点空闲的时间,我们就能快速地确定可以完成哪些任务。此外,如果想起⼀个新的任务,即使出⻔在外也可以直接把它添加到清单中,⽽不必费脑⼦记住它。
关注直接创造价值的⼯作
关注重要但不紧急的⼯作
守护创造者⽇程
限制同时进⾏的任务数量
⽤“如果……就……”计划对抗拖延症
培养调整优先级的习惯
第⼆部分 执⾏,执⾏,再执⾏
4 投资迭代速度
迅速⾏动,快速学习
Facebook⾸席执⾏官⻢克·扎克伯格(Mark Zuckerberg)在⾸次公开募股(IPO)时所写的信中提到了迅速⾏动的重要性。“迅速⾏动使我们能够开发更多东西,更快地学习知识,”他写道,“但是,⼤多数公司⼀旦成⻓起来,发展速度就会⼤⼤放缓,因为与⾏动缓慢导致错失良机相⽐,他们更害怕犯错……如果你从未打破常规,可能是因为你的⾏动速度还不够快。”13秉持⾼速迭代的信念是Facebook能够⾛到今天的关键因素。
投资节省时间的⼯具
缩短调试验证周期
熟练掌握编程环境
不要忽视⼯程以外的瓶颈
5 正确度量改进目标
⽤指标推动进展
⽤正确的指标激励团队
要找到这样的指标:⼀旦对其进⾏优化,就能最⼤限度地为团队带来影响。《从优秀到卓越》(Good to Great)⼀书的作者吉姆·柯林斯(Jim Collins)认为,优秀公司与卓越公司的区别在于,后者让所有员⼯朝着唯⼀的核⼼指标看⻬,他把这个指标称为经济分⺟(economic denominator)。
建⽴指标监控体系
采纳有⽤的数字
其他可能有⽤的数字或⾄少应该
随⼿可得的数字包括:
•注册⽤⼾数、每周活跃⽤⼾数和每⽉活跃⽤⼾数。
•每秒的请求数。
•数据存储的总容量。
•每⽇写⼊和访问的数据量。
•特定服务所需的服务器数量。
•不同服务或接⼝的吞吐量。
•流量的增⻓率。
•⻚⾯平均加载时间。
•流量在产品不同部分的分布情况。
•流量在不同⽹络浏览器、移动设备和操作系统版本上的分布情
况。
质疑数据的完整性
软件⼯程师可以很快就知道编写单元测试有助于确保代码的正确性;相⽐之下,仔细验证数据正确性的学习曲线往往要陡峭得多。在⼤部分场景下,团队发布⼀个产品或⼀个实验,并记录⽤⼾的交互,以收集不同的数据。数据最初看起来是可接受的(或者团队甚⾄
懒得检查),然后团队将注意⼒转移到其他地⽅。⼀两周后,当他们开始分析数据时,才意识到数据不正确,或者没有跟踪某些关键⾏为。当他们开始着⼿修复记录时,数周的产品迭代时间已经被浪费了——所有这⼀切都是因为他们没有主动去验证数据的准确性。
6 尽早且频繁验证想法
寻找验证⼯作成果的低成本⽅法
做少量的⼯作来收集数据,以验证项⽬假设和⽬标,从⻓远来看,这会减少很多⽆谓的浪费。
⽤A/B测试持续验证产品变化
A/B测试不仅可以帮助我们决定发布哪个产品版本,⽽且即使我们完全相信某个变更会改进指标,A/B测试也能告诉我们这个变更到底有多好。对这个改进进⾏量化,我们就可以知道继续在这个领域投资是否有意义。例如,对⼀项⼤型产品的投资只提⾼了1%的⽤⼾留存率,这意味着我们可能需要找到杠杆率更⾼的其他⽅向;⽽如果它能提⾼10%,就可以在这个⽅向加倍投资。如果不衡量影响,我们就不会知道⾃⼰处于什么状况
当⼼“⼀⼈团队”
•开诚布公,乐于接受反馈。
•尽早并经常提交代码进⾏评审。
•请求严厉的批评者审查代码。
•征求团队成员的反馈。
•先设计新系统的界⾯或API。
•在编写代码前先展⽰设计⽂档。
•如有可能,重新安排正在进⾏的项⽬,以便与同事共享⼀些上下⽂。
•在投⼊太多时间之前,征求对有争议的功能的⽀持。
建⽴决策反馈循环
不要做出⼀个重要的决定后就继续前进,⽽应该建⽴反馈循环,以便收集数据并评估⼯作的价值和有效性。
7 提升项目估算能力
我们总是在信息不⾜的情况下⼯作。因此,只有提⾼项⽬估算的准确性以及提⾼我们适应不断变化的需求的能⼒,项⽬规划才算是成功的。这两个⽬标对于⼤型项⽬尤其重要。
使⽤准确的估算推动项⽬规划
•将项⽬分解为细粒度的任务。
•根据任务需要的时间进⾏估算,⽽不是根据⾃⼰或别⼈的希望花多⻓时间进⾏估算。
•将估算结果视为概率分布,⽽不是最佳情况。
•让执⾏实际任务的⼈来做估算。
•谨防锚定偏差(anchoring bias)。
•使⽤多种⽅法估算同⼀任务。
•当⼼“⼈⽉神话”。
•根据历史数据验证估算结果。
•使⽤时间盒(Time Box)限制任务范围。
•允许他⼈质疑估算结果。
为意外情况留出预算
设定具体的项⽬⽬标和可度量的⾥程碑
及早降低⻛险
尽早发现未知因素,减少估算结果与实际情况的差异以及项⽬中的⻛险。不要先专注于做容易的事情,这会给⾃⼰带来能够按期交付的错觉。
极为谨慎地对待重写项⽬
不要在⻢拉松⽐赛的半程冲刺
构建⻓期价值
8 权衡质量与务实
建⽴可持续的代码审查流程
•尽早发现错误或设计上的缺陷。
•增加做代码变更时的责任⼼。
•为如何写好代码进⾏积极的⽰范。
•分享代码库的知识。
•增加⻓期的敏捷性。
利⽤抽象控制复杂性
•抽象将原始问题的复杂性简化为更易于理解的原语。
•抽象降低了应⽤程序的维护成本,使未来的改进更容易应⽤。
•抽象⼀次性解决难题,且解决⽅案可以多次使⽤。
⾃动化测试
偿还技术债
如果将所有资源都⽤于偿还技术债的利息,就没有⾜够的时间去创建新事物。要关注利息最多的技术债。
9 最⼩化运营负担
拥抱运营的简单性
•⼯程知识分散在多个系统中。
•复杂性的增加引⼊了更多潜在的单点故障。
•新⼊职的软件⼯程师在学习和理解新系统时,⾯临着更为陡峭的学习曲线。
•为改进抽象、库和⼯具所做的努⼒会在不同的系统中被稀释。
构建可以快速试错的系统
持续推进机械任务⾃动化
让批处理进程幂等
在发⽣故障时,这些特性使你更容易重试操作。
提升快速响应及恢复的能⼒
10 为团队成⻓投资
让招聘成为每个⼈的责任
设计好的⼊职流程
共享代码所有权
通过事后复盘汇聚集体智慧
建设卓越的⼯程师⽂化
1.优化迭代速度。
2.坚持不懈地推动⾃动化。
3.构建正确的软件抽象。4.通过代码审查来关注⾼质量代码。
5.在⼯作中相互尊重。
6.建⽴代码的共享所有权。
7.对⾃动化测试投资。
8.提供实验时间,不管是⼯作时间的20%,还是⿊客⻢拉松。
9.培养⼀种学习和持续改进的⽂化。
10.聘⽤最优秀的⼈。