【研发效能之道】个人效能实践

Posted by 王天一 on 2020-02-19

程序员个体如何高效地进行开发工作

Facebook的10x程序员效率心法

第一条原则:抽象和分而治之

把一个系统拆分为几个有限的子系统,每个子系统涵盖某一方面的内容,并将其复杂性隐藏起来,只对外暴露关键信息。所以,拿到一个任务之后,我们要做的首先就是进行模块的定义,也就是抽象,然后对其分而治之。

比如一个功能由一个前端开发者和两个后端开发者完成,整个研发过程至少涉及 3 个抽象和分而治之的操作:

  1. 前后端模块进行自然的拆分。这时,前后端开发者一定会一块儿认真讨论,明确前后端代码运行时的流程,后端需要提供的 API,以及交付这些 API 的时间。
  2. 两个后端开发者对后端工作进行拆分,确定各自的工作任务和边界。
  3. 每个开发者对自己负责的部分再进行抽象和拆分。

在这个过程中,一定要明确模块之间的依赖关系,尽快确定接口规格和可调用性。比如,在前后端的拆分中,常常会采用这几个步骤处理 API:

  1. 前后端开发者一起讨论,明确需要的 API。
  2. 后端人员会先实现 API 的 Mock,返回符合格式规范的数据。在这个过程中,后端开发者会尽快发出代码审查的要求给另一个后端和前端开发者,以确保格式正确。
  3. Mock 实现之后尽快推到主仓的 master 上 (也就是 origin/master),并尽快将其部署到内部测试环境,让前端开发者可以使用内部测试环境进行开发和调试。
  4. 这些 API 还不能面对用户,通常会先使用功能开关让它只对公司开发人员可见。这样的话,即使 API 的代码在 origin/master 上部署到了生产环境,也不会对用户产生影响。

第二条原则:快速迭代

  1. 不要追求完美,不要过度计划,而是要尽快实现功能,通过不断迭代来完善
  2. 在设计的实现中,尽量让自己的代码能够尽快运行起来,从而尽快地验证结果
  3. 为了能够快速进行验证,一个重要实践是设置好本地的代码检验
  4. 代码写好之后,尽快提交到主代码仓并保证不会阻塞其他开发人员

这是代码提交的原子性,可以保证主代码仓在理论上能够随时基于 master 分支上的任何提交,构建出可以运行的、直接面对用户的产品。在这种方式下,每个开发者在任何时候都可以基于 origin/master 进行开发,从而确保 Facebook 几千人共主干开发时分而治之能够顺利进行。

第三条原则:DRY

不要重复你自己

  1. 代码逻辑的重复,不仅仅是工作量的浪费,还会大大降低代码的质量和可维护性。所以,我们在开发时,需要留意重复的代码逻辑,并进行适当的处理。
  2. 流程的重复。比如测试中,我们常常需要重复地产生一些测试数据,运行完测试之后再把这些数据删除。最主要的办法是自动化。以重复的测试数据产生、删除流程为例,一般的做法是,编写脚本进行自动化,当然有些时候也需要写一些复杂的可执行程序来生成数据。

深度工作:聚焦最有价值的事儿

在任务多、干扰多的现状下,如何最高效地利用时间,去做最重要的事儿,同时有更多的时间来放松和享受生活。

深度工作这个概念,是由卡尔 · 纽波特(Cal Newport)提出的,指的是在无干扰的状态下,才能专注地进行的专业活动。这样的活动能够使个人的认知能力发挥到极限,从而让我们创造出最大价值,成为一个不可替代的人。

以终为始,寻找并聚焦最重要的任务

第一步,自己定义任务

预先计划好的任务的优先级常常会随着情况的改变而改变,而临时产生的任务很可能当时觉得很紧急,但实际上是可以推迟或者甚至不做的。我们根据当前情况决定要做的任务,就可以避免把时间花在低优先级的任务上。

第二步,聚焦目标,以终为始

其实就是在自己定义任务。因为时间有限,为目标服务的任务才最重要。常见的目标包括业务成功、帮助团队,以及个人成长这 3 个。如果能找到三者重合的任务就最好不过了。

第三步,无情的筛选,少即是多

“数字 3 原则”很有效,也就是强制把要做的事、要达到的目标,都限制在 3 个以内。

追根究底,寻找最高效的解决方案

产品经理决定如何在业务上满足用户需求,而开发人员就是,从产品经理手中接过任务,马上开始技术上的设计和实现。

这种工作方法我们很熟悉,但其实有很大的局限性。因为开发人员对技术实现最熟悉,如果我们能结合业务进行思考,追根究底,常常能对业务的解决方案做出一些改进,甚至是重新设计出更好的方案。而这样的改进,对个人研发效能的提高帮助非常大。

所以,开发人员也要对业务有一定的了解。面对任务的时候,多问几个 Why,并与产品经理和团队成员充分沟通,了解它到底要解决什么问题,只有这样,我们才能以解决问题为出发点,找到最高效的解决方案。

安排时间和精力,高效执行解决方案

用番茄工作法来记录深度工作时间

番茄工作法就是把时间划分为固定时长的工作时间和休息时间。一个番茄时间包含两部分,25 分钟的工作学习和 5 分钟的休息时间。当然25这个数字我个人想修改为1个小时。

番茄工作法的精髓是,在每一个工作时间段,避免干扰、全神贯注。因为只有精力高度集中,减少上下文切换,才能进入深度工作状态,进而最大程度地发挥我们的心智能力,提高个人效能。

用拥抱无聊来控制手机依赖

不知道你有没有这样的感受,当习惯一有空闲就使用手机之后,在工作中稍有一点空闲,或者是遇到比较难以处理的问题时,就会不自觉地想停下来看一看手机。我认为,这就是因为我们习惯了用手机来缓解紧张和压力而形成的条件反射,就是对手机的一种依赖。

发现了一个“拥抱无聊”的方法。具体来说就是,在一些非常碎片化的时间,不要因为无聊就马上抄起手机,去找一些有意思的东西放松或者学习,而是尝试适应无聊。无聊也是一种不错的状态,试着去享受它,不要让自己的大脑一直处于活跃状态。这样可以让我们得到休息,而且更重要的是,能够比较好地避免自己打扰自己的倾向。

用反向行事日历来确保休息和高效工作

我们在安排日程时,通常会把工作任务放到日历中,而不会把运动、休息、吃饭等非工作任务放入其中。反向日历正好相反,首先就是把这些非工作任务作为最为最高优先级放到日历中,然后再在剩余的时间中安排工作任务。

好处:第一,可以强制我们去休息和锻炼;第二,可以让我们更有紧迫感,提高工作效率

开发能力

个人效能影响最大的方面其实是自身的开发能力,如何提升开发能力至关重要但不在本文范围内

另外,效率工具如git/vim/命令行/ide都有自己最适合的组合,也是提升个人效能的一部分,在开发的过程中需要记得持续优化改善