一、聚焦高杠杆率工作:
1、使用杠杆率衡量工作成效:
- 杠杆率 = 产生的影响/投入的时间,即时间投资回报率ROI。
- 不要通过更长的时间去完成更多工作,要将有限的时间投入到最有价值的工作上。
- 对大多数工作而言,80%的产出源于20%的工作,这20%工作就是高杠杆率的工作
2、提高杠杆率的三种方式:
(1)减少完成工作所需的时间
(2)增加该工作的产出
(3)转向杠杆率更高的工作
3、将精力投入杠杆点,而非易于完成的工作:
- 不要将高杠杆率的工作与易于完成的工作混为一谈,许多高杠杆率的工作也需要持续很长时间才能有较大成效。
比尔及梅琳达·盖茨基金会管理的资金达到了402亿美元的规模,也仍远远不足以解决世界上所有的问题。盖茨在2013年11月《连线》的一篇文章写道:“在价值数十万亿美元的全球经济体系中,任何慈善事业都显得微不足道。如果想要产生巨大的影响,你需要一个杠杆——投人1美元的资金或1小时的时间,就能产生百倍或千倍的社会效益。"对盖茨来说,这些杠杆点包括为麻疹和疟疾疫苗提供资金,每一剂疫苗的成本不到25美分,但这项工作却拯救了数百万人的生命。
二、优化学习方式:
1、掌握自己的经历,培养成长型思维模式:
- 关注自己影响范围之内的变化,不要浪费时间去指责无法控制的部分,以成长型思维模式看待失败和挑战,并将其视为学习的机会:
(1)固定型思维:能力是先天注定的,后天无法改变
(2)成长型思维:能力可以通过后天努力培养、提升自己的智力和技能,把挑战和失败视为学习的机会,在通向成功的道路上不轻言放弃
锻炼与陌生人对话技能的例子:
作者是个内向的人,尽管很乐意扩大社交圈,但确实不善于结识新朋友以及和他们寒暄聊天,所以拒绝与不认识的人一起喝咖啡,远离大型聚会,不参加社交活动,因为这些都让作者感到不自在。后来作者意识到,回避社交活动对于结识新朋友非常不利,而且这种状况不能自行改善。因此作者下定决心参加被邀请的或是碰巧遇上的所有社交活动,比如出现在全是陌生人的聚会上,和网上认识的人一起喝咖啡。虽然最初的好几次活动都以尴尬的沉默和难以持续的聊天告终,有时也花好几个小时去参加一些社交活动,离开时却没有与人建立起任何有意义的联系。但最终作者还是坚持了下来,如果搞砸一次谈话,就反思如何做出更机智的回应,并在下一次谈话中改进。努力练习讲更好的故事,因为成为有魅力的健谈者是一项可以习得的技能,并且随着时间的推移会越来你越熟练。最终重塑自我,结识新朋友,扩展人脉,扩展自己的舒适区
2、提升学习效率,学习存在复利效应:
- 学得越多,就越容易运用学过的知识和经验来学习新事物。把时间花在缺乏挑战的工作上,不仅错过了学习的机会,更是为未来的成长和学习付出了巨大的机会成本,等认识到智力投资会产生复利效应时,已经为错失长期复利付出了巨大的代价。当公司为一份轻松的、毫无挑战的工作向你支付薪水时,他们实际上是在付钱让你接受更低的智力增长率。
3、寻求利于学习的工作环境:
- 好的工作环境更有利于个人和职业的高速发展,选择新工作或新团队时可以考虑的6个因素:
(1)快速增长:在快速发展的团队和公司中,需要解决的问题往往超过可用的资源,这就提供了大量的产生巨大影响和增加责任的机会,这种增长也更容易吸引优秀人才加入以及组建强大的团队,从而创造出更大的增长,形成一个正向循环。另一方面,缺乏增长会导致公司或团队发展停滞和办公室政治,员工可能会因为没机会有限而恶性竞争,因此很难找到并留住人才
(2)培训:
(3)开放:不断从过去的错误中学习和调整,追求一种充满好奇心的组织文化,鼓励每个人提出问题,再结合开放的文化,让人们积极反馈和分享信息。
(4)节奏:快速迭代的工作环境提供了更短的反馈周期,也促使我们以更快的速度去学习,冗长的发布周期、复杂的产品发布审批和优容寡断的主管都会拖慢迭代效率;虽然激进的冒险精神和时常加班有助于提高学习速率,但不要让自己身心俱疲,要找到一种可持续的长期工作节奏
(5)人员:与更聪明、更有才华、更有创造力的人共事,意味着在身边有很多潜在的导师。和谁一起工作要比实际做什么工作对职业成长更为重要。
(6)自治:选择工作内容和工作方式的自由驱动着我们的学习能力,只要我们能够有效的利用这种自由。
4、将时间投到培养新技能的任务上:
- 每天抽出20%的时间对自己的成长投资(每天抽一两个小时要比每周抽出一整天更有效,因为可以培养每天学习的习惯),培养能够帮助自己有效工作的技能,比如钻研专业领域和专业工具,也可以是相邻学科,而不是把所有精力在花在追赶进度上。
(1)参加专业技能培训课程
(2)主动参与感兴趣项目的设计讨论,不要被动等待
(3)在不同项目类型的项目上工作
(4)确保团队中有更资深、可以请教的工程师
三、定期调整优先级:
1、待办事项清单:
- 人类大脑擅长处理信息,而不是存储信息,将大脑当做处理器,而不是存储器
2、工作任务清单的优先级:
- 估算会由于数据优先而导致出现很多偏差,加上每处理一项任务都会产生新的任务,这就意味着永远无法完成清单中的大部分积压事项,最终的结果就是,为了建立优先级排序列表而做的大量估算工作都被浪费了。
- 对工作任务清单的优先级排序的目标不是要对所有工作事项的优先级建立一张排序总表,因为排序所依据的信息都是不完整的;而是要根据当前所掌握的信息,不断将杠杆率最高的任务的优先级调至最高,因为估算出第100项任务比第101项任务的杠杆率更高,并没有实际上的作用。更简单高效的做法是,先确定一小部分重要目标,并挑选出实现这些目标所需要完成的初始任务,然后将当前正在进行的任务与待办事项清单上的其他任务进行两两比较。
3、关注直接创造价值的工作:
4、关注重要但不紧急的工作:
类别 | 紧急 | 不紧急 |
重要 | 第一象限 危机 紧急问题 临近截止日期 | 第二象限 计划和补救 建立合作关系 新机遇(求值) 个人发展 |
不重要 | 第三象限 中断手头工作 大部分会议 大部分邮件和电话 | 第四象限 上网 忙碌的工作 浪费时间的不良习惯 |
- 调高可以提升效率的长期投资的优先级,即使它们没有截止日期所以不紧急,第二象限的工作包括:规划职业目标、建立更牢靠的合作关系,阅读书籍和文章以提升专业能力,培养提升生产力和工作效率的学习习惯,构建新工具改进工作流程,提升基础设施的伸缩性等等。
5、守护创造者日程,限制同时进行的任务数量:
- 保留较大的连续的专注时间块,确保自己更容易进入“心流” 的专注状态,从而提升工作效率,将必要的会议安排在连续的时间而不是分散安排在一天中。并限制同时进行的任务数量,减少上下文的切换。
四、投资迭代速度:
1、持续部署:
- 迭代的速度越快,学到的东西就越多,如果为了避免错误而行动太慢,反而会错失很多机会
2、投资节省时间的工具:
- 如果某项任务必须需手动做两次以上,那么第三次就去编写一个工具
例如运营导入工具
3、缩短调试验证周期:
4、提升使用工具的技能:
- 在日常使用的开发环境中保持高效,比如熟练使用快捷键,安装有利于增效的插件
5、从整体上考虑迭代周期,不要忽视工程以外的瓶颈:
(1)对他人工作的依赖,比如各自工作优先级错位,处理与人有关的瓶颈时,沟通至关重要
(2)关键决策者的批准
(3)审查流程
五、正确度量改进目标
1、用指标推动进展:
(1)帮助专注于正确的事情
(2)防止问题复现
(3)推动进步,例如,使用应用的延迟作为指标
(4)衡量一段时间的成效
2、选择正确的度量指标来激励团队:
- 不同的指标会激励不同的行为,所以它是一个强大的杠杆
3、建立监控体系:
- 系统的复杂性越高,就越需要通过监控来确保不会盲目运行
4、了解有用的数字:
- 可以作为评估进度的基准,也可以帮助我们进行大概的推算
5、质疑数据的完整性、正确性:
- 正确的数据可以有力支持自己的论点,但所有的数据都有可能出现错误,或者被滥用、曲解,导致得出错误的结论,从而带来灾难性的后果。拥有糟糕的数据比没有数据更糟糕,因为我们会任务自己是对的,并作出错误的决定
六、尽早且频繁验证想法:
1、寻找验证工作成果的低成本方法:
(1)迭代地处理问题以减少浪费。每一次迭代都提供验证新想法的机会,快速迭代才能快速学习
(2)通过小型实验验证想法,降低大型实现的风险。投入少许额外精力,确认计划中的其余部分是否值得做
2、使用ABTest持续验证产品变化
3、当心“一人团队”:
- 一人团队增加了获得反馈过程中的阻力,而我们需要借助反馈来验证自己所做的事情是否可行。所以在单人项目工作时,要想办法定期征求反馈,避免最后推倒重做
4、建立决策反馈循环:
- 养成及时验证决策的习惯,不要做出决定后就继续前进,而应该建立反馈循环,以便收集数据并评估工作的价值和有效性
七、提升项目的估算能力:
1、使用准确的估算推动项目规划:
(1)将项目分解为细粒度的任务
(2)根据任务需要时间估算,而不是自己或者别人期望时间
(3)将估算结果视为概率分布,而不是最佳情况
(4)让实际执行人来估算
(5)谨防锚定偏差:在实际列出任务前,避免给出初步时间,会影响之后的估算
(6)使用多种方法估算同一任务
(7)当心“人月神话”
(8)根据历史数据验证估算结果
(9)使用时间盒限制任务范围:与其承诺一个项目研究需要三天,不如承诺3天后给出最大努力结果
(10)允许他人质疑估算结果
2、为意外情况留出预算:
3、设立具体的项目目标和可度量的里程碑:
(1)设定项目目标的作用:重要的筛选器,可以区分任务列表中的必选项和可选项,防止功能蠕变;也能让利益相关者认清目标,便于大家达成一致
(2)可度量的里程碑的作用:评估项目进度的检查点,跟踪进度,从而降低风险,有效地分配时间。使得我们能够达成一致,推迟一些不重要的任务,并减少在项目中无意识扩大项目范围的可能性,判断项目是否偏离正轨
4、及早降低风险:
- 越晚发现问题,失败的成本就越高。优先处理风险最大的领域,尽早发现未知因素,有助于减少估算结果与实际情况的差异以及项目中的风险。不要专注于做容易的事情,这会给自己带来能够按期交付的错觉
5、极为谨慎地对待重写项目:
- 增量式或分阶段重写系统是一项高杠杆率的活动,它在每一步都提供了额外的灵活性,虽然这种方式可能会增加额外的工作量,但能够显著降低风险。
6、不要在马拉松比赛的半程冲刺:
- 了解加班的限度,不要过早加班,导致最后团队精疲力尽;不要因为进度落后就不知所措的加班,只有确信加班能使我们按时完成项目,才需要加班
八、权衡质量与务实:
1、软件质量的价值:
- 软件的质量高,就能加快软件工程师创造价值的速度,如果在质量方面投资不足,则会阻碍我们快速行动
2、建立代码审查氛围:
- 建立可持续的代码审查流程,但需要权衡代码质量和开发速度
3、自动化测试:
- 自动化测试不适合在功能开发完成时,覆盖率就达到100%,最佳实践是在功能经过两到三个版本,且趋向于稳定时,自动化测试覆盖逐渐完善,且不作为硬性指标,由开发人员自行评估该功能是否需要作自动化测试。
- 专注于高杠杆率的测试,能有效帮助养成测试的习惯,因为相对于编写它们所花的时间,这些测试可以节省大量时间,这种投入产出的差异有利于编写更多的测试,创建良性的反馈循环,节省更多的开发时间,所以,从最有价值、最节省时间的自动化测试开始,然后逐步推进
4、偿还技术债:
- 不要盲目地偿还技术债,并非所有的技术债都值得偿还,要将有限的时间花在杠杆率最高的技术债上,用最少的时间,修复代码库中被调用最频繁的代码。如果将所有资源都用于偿还技术债的,就无法进行其他创造价值的工作。
九、最小化运营负担:
1、最大限度地减少运营成本,拥抱运营的简单性:
- 每一个额外的功能和新系统都代表着一栋额外的建筑,团队需要对其进行维护,甚至是灭火。开发成本并不会在产品发布时停止累积,事实上,这些成本正是从发布之时开始累积的。维持系统正常运行,扩展功能以支持更多用户,修复出现的错误,所有这些成本都会持续耗费团队的资源,即使在功能或系统发布之后也是如此。当团队规模较小的时候,最大限度地减轻这些负担是至关重要的。
2、构建可以快速试错的系统:
- 不要掩盖错误,不要将故障推迟到以后才发生,否则会使程序更难调试
3、机械任务自动化:积极将手动任务自动化执行以节省时间。
4、提升快速响应及恢复的能力:
- 为故障制定预案并演习,培养快速恢复的能力,无论什么事情,总会有出错的时候;当我们遇到问题时,在最急迫情况下试图找出问题的原因,最终的效果往往是不太理想的。建立对系统恢复的能力信心,就可以更大胆地前进
十、为团队成长投资:
1、帮助周围的人获得成功:
- 对于软件工程师职业,级别越高,公司越不会以个人贡献来衡量你的工作效率,而是以你对周围人的影响作为衡量标准。在职业生涯的早期就开始思考如何帮助同事取得成功,将帮你养成正确的习惯,反过来又会帮我们自己成功
2、设计好的入职流程:
- 在新工程师入职的第一个月,对他们每天进行一两个小时的培训,比在产品上花同样的时间所产生的组织影响要大得多。此外,最初为创建入职流程而投资的时间,会在每一个新加人的团队成员身上持续得到回报。入职培训对团队和公司都有好处,为团队的成功投资意味着你也更有可能成功。用心地培养新的团队成员,最终会使你能够更灵活地选择杠杆率更高的活动。团队的规模越大,成员的能力越强,意味着做代码审查就越容易,可以修复bug的人越多,能参与响应系统告警和提供支持的人越多,完成更大型项目的机会也就越多。 好的入职流程需要实现以下几个目标:
- (1)助新人尽快度过适应期
- (2)传授团队的文化和价值观
- (3)让新员工了解成功所需的广泛基础知识
- (4)通过社交方式让新员工融入团队
3、事后复盘汇聚集体智慧:
- 我们从每一次经历中学到的越多,能带入下一个项目中的经验就越多,成功的机会就越大