研发效率破局之道
葛俊
前Facebook内部工具团队Tech Lead
立即订阅
3343 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要关注研发效能?
免费
研发效能综述 (3讲)
01 | 效能模型:如何系统地理解研发效能?
02 | 效能度量:效果不好甚至有副作用,怎么回事?
03 | 效能度量:如何选对指标与方法,真正提升效能?
研发流程 (7讲)
04 | 流程优化:怎样才能让敏捷、精益真正为我所用?
05 | 代码入库前:Facebook如何让开发人员聚焦于开发?
06 | 代码入库到产品上线:Facebook如何使用CI/CD满足业务要求?
07 | 分支管理:Facebook的策略,适合我的团队吗?
08 | DevOps、SRE的共性:应用全栈思路打通开发和运维
09 | 信息流通:让团队高效协同,让产品准确击中目标
10 | 答疑篇:反对996并不是反对奋斗
工程方法 (10讲)
11 | 研发环境:Facebook怎样让开发人员不再操心环境?
12 | 代码审查:哪种方式更适合我的团队?
13 | 代码审查:学习Facebook真正发挥代码审查的提效作用
14 | 质量与速度的均衡:让“唯快不破”快得更持久
15 | 开源:从Phabricator的开源历程看开源利弊
16 | 高效上云:如何用云计算来提高效能?
17 | 测试左移:测试如何应对新的开发模式?
18 | 蓝绿红黑灰度发布:这些五颜六色的发布到底怎么用?
19 | 不再掉队,研发流程、工程方法趋势解读和展望
20 | 答疑篇:如何平衡短期收益和长期收益?
个人效能 (11讲)
21 | 高效工作:Facebook的10x程序员效率心法
22 | 深度工作:聚焦最有价值的事儿
23 | 效率工具:选对用对才能事半功倍
特别放送 | 每个开发人员都应该学一些VIM
24 | VIM:如何高性价比地学习VIM的实用技巧?
25 | 玩转Git:五种提高代码提交原子性的基本操作
26 | Facebook怎样实现代码提交的原子性?
27 | 命令行:不只是酷,更重要的是能提高个人效能
28 | 从工作场景出发,寻找炫酷且有效的命令行工具
29 | 1+1>2,灵活的工具组合及环境让你的工作效率翻倍
30 | 答疑篇:关于价值导向和沟通
管理和文化 (6讲)
31 | 业务目标和技术目标两手抓:怎样打造高效团队?
32 | 从Netflix公开的著名PPT谈硅谷公司文化
33 | Facebook企业文化:工程师文化是创造力引擎
34 | Facebook工程师文化实践三大支柱之一做感兴趣的事
35 | Facebook工程师文化实践三大支柱之二拥有信息和权限
36 | Facebook工程师文化实践三大支柱之三绩效调节
结束语 (1讲)
结束语 | 超越昨天的自己,享受成长的快乐
研发效率破局之道
登录|注册

05 | 代码入库前:Facebook如何让开发人员聚焦于开发?

葛俊 2019-09-02
你好,我是葛俊。今天,我将与你分享优化流程中,代码入库前的开发流程。
代码入库之前的开发活动,主要包括编码、调测调优、静态检查、自动化测试、代码审查等。这是开发者编写代码的步骤,自然是提高研发效能的关键环节。
图 1 本地开发流水线
提高开发者编写代码的效能,关键在于让开发者不受阻塞、不受不必要的干扰,从而全身心地聚焦在产品开发上。我把这种不受阻塞的开发状态叫作持续开发
一个团队如果能够做到持续开发,那么它的有效产出自然会很好。而对于个人开发者而言,持续开发能够帮助我们把精力集中在技术本身,对技术和个人能力的提升都大有裨益,所以是一种很好的开发体验。
在我看来,持续开发的基本原则主要包括两条:
规范化、自动化核心步骤;
快速反馈,增量开发。
接下来,我们就一起看看这两条核心原则吧。

规范化、自动化核心步骤

要让开发者聚焦于开发,就必须把研发流程中可以自动化的步骤尽量自动化。因为一般不可能完成所有步骤的自动化,所以我推荐的方式是:分析关键路径上的活动,以及耗时较长的活动,然后投入精力优化这些步骤。
首先,我们需要明确具体的开发步骤有哪些。我将其归纳为以下三大步:
获取开发环境,包括获取开发机器、配置环境、获取代码等。
在本地开发机器上进行开发,包括本地的编码、调测、单元测试等。
代码入库前,把改动提交到检查中心(比如 Gerrit),再进行一轮系统检查,主要包括代码检查、单元测试、代码审查等,通过之后再入库。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《研发效率破局之道》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • 极客不落🐒
    搭车推荐 IntelliJ 下的效率神器插件 JRebel,可以免手工重启,快速生效文件改动最新效果。
    http://plugins.jetbrains.com/plugin/4441-jrebel-for-intellij

    作者回复: 多谢分享!看来你是工具达人呀 :)
    我没有用过这个插件,从描述看来不错!

    2019-09-04
    6
  • Jingxiao
    作者背景这么强,课这么好,只有这么点订阅真是可惜
    2019-09-03
    5
  • 日拱一卒
    1. 在开发环境方面,你有没有尝试过在 Docker 里面进行开发?你觉得这种方式的好处是什么,弊端又是什么呢?
    在之前的项目中有用过Docker来搭建开发环境,主要是一些中间件,例如后端数据库,solr,elk等。带来的好处是每个开发人员可以很快在本地搭建一套开发环境,彼此不会有冲突,不好的地方是Docker文件和镜像的维护,需要额外的精力。


    2. 有些开发者喜欢写好一个比较大的功能单元,然后再一口气调测。你觉得这样做的好处和坏处,各是什么呢?
    这种做法的好处是写代码的时候可以更加专注,不好的地方是如果开发人员经验不够,这种方式就会变为调试驱动开发,反而会降低效率。
    不同的人会有不同的开发方法,我认为并没有普适所有人的方法,对于经验非常丰富的开发人员来说,怎样做都会得心应手。想一想纸带编程时期,哪有什么单元测试。

    作者回复: @日拱一卒 你的最近几个comments都很棒!都说到点子上了 :)

    2019-09-13
    3
  • 追忆似水年华
    我的开发方式可能比较另类,也比较不合规。公司买的是阿里云的 Windows 服务器,我现在常常都是直接通过远程桌面连接到服务器上,用 VSCode 开发前后端项目。前端用 Vue 全家桶,后端用 Node.js + nodemon,有改动之后立刻生效,最大的好处就是快,见效快 😂
    之所以这样做,是因为我们公司就俩开发,一人负责一大摊子事,所以常常用各种野路子,怎么方便怎么来,哈哈。

    作者回复: 我觉得你的这个方法很好!👍👍👍

    一个小提醒,在快的同时留意有没有因为快而导致问题,最终反而变慢了。如果出现这种情况,就进行调整。

    2019-09-03
    1
    3
  • Geek_1988
    如果工程比较大,编译需要很久的话,自动编译并重启服务是不是就不太合适了?

    作者回复: 如果你能够做到很快时间自动编译完成并重启服务,那就很棒。当然这可能需要做比较多的优化,以及可能使用一些Hacky的办法。当然如果做不到,或者投入太大,那也就确实不合适了。

    2019-09-02
    2
  • 我来也
    监听文件变动并重启服务的事情我做过。

    当时是用lua开发的一个项目,lua本身还是支持热更新的,不需要重启进程.

    我就在代码逻辑中定时扫描文件的变动情况,有过变动且最近5秒未再变时就热更新加载代码。
    (因为在网络传输文件的过程中,如果文件没传完,就开始了重载流程,就会出现语法错误。)

    这样我用vim在服务器上开发时,只要一保存,就触发了重载。
    另外我会单独开一个终端在tail日志,如果有问题,可以及时的发现。

    从这也能看出,我喜欢小步走。

    作者回复: 这个要赞!自己实现一个系统。有没有推广到团队中给其他成员使用?

    2019-10-26
    1
    1
  • 电线杆儿
    @在开发环境方面,你有没有尝试过在 Docker 里面进行开发?你觉得这种方式的好处是什么,弊端又是什么呢?
    #好处:A节约开发资源(多个开发人员共用一台docker开发机器,基于容器的资源隔离,抽象成多个开发机,提高单台机器的使用率)B快速搭建(新来的开发同事可以迅速创建一套或多套开发环境,基于镜像的一致性,保证环境创建过程中不踩坑,节约项目融入时间,同时,如果环境遭到破坏,或开发机不可用,可以迅速迁移到其他docker开发机)C轻松构建(很多时候出了搭建开发环境,还要搭建构建环境,通过docker提供的各种工具镜像,可以实现轻松构建自己的代码)缺点:A资源控制(对于性能要求高的服务,docker开发环境不如独立开发机性能高,虽然使用cgroup技术,但是docker还是会占用部分资源,对于独立性要求高的开发不利) B镜像构建(从传统方式到docker开发,需要构建基础镜像,代码、日志要持久化出来,通过sftp与IDE实现实时保存更新,基础镜像如果不够灵活,使用中会遇到问题)C需要了解docker命令(对没接触过docker的有一定的学习成本,并且查看日志,和启动服务等操作会变得跟传统方式不同)D网络限制(docker默认采用bridge方式提供小二层网络,比较抽象,对于需要独立IP资源的服务不友好,当然可以更改网络模式,但是需要整个公司的网络支持)
    @有些开发者喜欢写好一个比较大的功能单元,然后再一口气调测。你觉得这样做的好处和坏处,各是什么呢?
    #好处A功能完整(这样一个功能可以根据项目需求周期来决定要不要该功能整体,如果较小的功能单元,后期可能会根据项目需求不断调整,经验不足就会对项目其他功能造成影响)坏处A需求见效慢(开发周期长,问题暴露滞后,不利于敏捷开发,可能会错过需求的最佳上线周期)B项目返工修复困难(单元大,设计的模块多,如果有BUG,修复起来很难)C不利于持续交付(如果要走持续交付路线,就要频繁上线,尽可能的优化上线流程,如果很久才开发一个功能并上线,即便有问题,也会觉得是个例)

    作者回复: 分析相当透彻。👍👍👍

    2019-10-15
    1
  • robincoin
    怎么用线上的数据给开发人员进行开发测试呢

    作者回复: 前面有人问过,这一部分我也不是特别了解细节。但是知道主要原则大概有几个:
    1. 数据库中都有特定的Field指出是否是测试数据,这使得测试数据和生产数据共存在一个数据库
    2. 数据能够快速恢复。这个是基本
    3. 强大的监控。开发人员账号触碰到生产数据,如果是TA本人不应该有权限的,必须要有任务ID才能有Access。这些行为都会被记录下来。一旦发现不合规操作马上非常严格的处理。比如辞退。

    2019-09-15
    1
  • 大河
    Docker开发对于前后端没有分离的项目来说,前端会省去大量的搭建项目的时间,直接使用后端搭建好的环境,然后去提交代码进行联调。

    作者回复: Docker 在这些方面的确非常灵活。不知道你有没有注意到一个有些极端的例子:有一些工具,因为安装比较麻烦,干脆提供一个Docker镜像,使用的时候直接运行一个docker命令。而且速度也还不错。

    2019-09-09
    1
  • Marco
    老师,有自动化的一套工具介绍吗?

    作者回复: 你们是什么技术栈?

    2019-09-05
    2
    1
  • 师傅又被抓走了
    采用虚拟机作为个人开发机------这个比较高效,值得学习!

    作者回复: 管理起来方便 :)

    2019-09-04
    1
  • 许童童
    老师,数据那一块怎么管理呢,比如初始数据

    作者回复: 如果数据量不是特别大的话,可以吧初始数据作为代码放到代码仓里面,比如一个SQL文件。在环境设置的脚本中调用它进行初始化。当然也可是使用二进制。

    如果数据量特别大,可以把它放到共享文件夹中。初始化脚本挂载之后使用它进行初始化。

    这样能太满足你的举起需求吗?

    2019-09-02
    1
  • David Xing
    👍
    2019-10-18
  • Marvin
    1、使用docker对前端或者硬件需求较苛刻的开发不是很友好,好处是开发环境搭建迅速零维护。2、较大功能单元,不利于单元测试,不利于后期维护,不利于工作拆解,不利于发现问题,好处是功能相对集中,持续开发时间较长。

    作者回复: 👍👍👍

    2019-09-02
收起评论
14
返回
顶部