05 | 代码入库前:Facebook如何让开发人员聚焦于开发?
05 | 代码入库前:Facebook如何让开发人员聚焦于开发?
讲述:葛俊
时长15:12大小13.94M
规范化、自动化核心步骤
提高开发环境的获取效率
规范化、自动化化本地检查
建设并自动化代码入库前的检查流程
提供快速反馈,促进增量开发
灵活使用各种 Linter 和测试
建设并优化沙盒环境
使用实时检验工具
小结
思考题
赞 4
提建议
精选留言(21)
- Y0242019-09-04搭车推荐 IntelliJ 下的效率神器插件 JRebel,可以免手工重启,快速生效文件改动最新效果。 http://plugins.jetbrains.com/plugin/4441-jrebel-for-intellij
作者回复: 多谢分享!看来你是工具达人呀 :) 我没有用过这个插件,从描述看来不错!
13 - 技术修行者2019-09-131. 在开发环境方面,你有没有尝试过在 Docker 里面进行开发?你觉得这种方式的好处是什么,弊端又是什么呢? 在之前的项目中有用过Docker来搭建开发环境,主要是一些中间件,例如后端数据库,solr,elk等。带来的好处是每个开发人员可以很快在本地搭建一套开发环境,彼此不会有冲突,不好的地方是Docker文件和镜像的维护,需要额外的精力。 2. 有些开发者喜欢写好一个比较大的功能单元,然后再一口气调测。你觉得这样做的好处和坏处,各是什么呢? 这种做法的好处是写代码的时候可以更加专注,不好的地方是如果开发人员经验不够,这种方式就会变为调试驱动开发,反而会降低效率。 不同的人会有不同的开发方法,我认为并没有普适所有人的方法,对于经验非常丰富的开发人员来说,怎样做都会得心应手。想一想纸带编程时期,哪有什么单元测试。展开
作者回复: @日拱一卒 你的最近几个comments都很棒!都说到点子上了 :)
共 2 条评论8 - 追忆似水年华2019-09-03我的开发方式可能比较另类,也比较不合规。公司买的是阿里云的 Windows 服务器,我现在常常都是直接通过远程桌面连接到服务器上,用 VSCode 开发前后端项目。前端用 Vue 全家桶,后端用 Node.js + nodemon,有改动之后立刻生效,最大的好处就是快,见效快 😂 之所以这样做,是因为我们公司就俩开发,一人负责一大摊子事,所以常常用各种野路子,怎么方便怎么来,哈哈。展开
作者回复: 我觉得你的这个方法很好!👍👍👍 一个小提醒,在快的同时留意有没有因为快而导致问题,最终反而变慢了。如果出现这种情况,就进行调整。
共 2 条评论7 - 电线杆儿2019-10-15@在开发环境方面,你有没有尝试过在 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不利于持续交付(如果要走持续交付路线,就要频繁上线,尽可能的优化上线流程,如果很久才开发一个功能并上线,即便有问题,也会觉得是个例)展开
作者回复: 分析相当透彻。👍👍👍
5 - Jingxiao2019-09-03作者背景这么强,课这么好,只有这么点订阅真是可惜5
- robincoin2019-09-15怎么用线上的数据给开发人员进行开发测试呢
作者回复: 前面有人问过,这一部分我也不是特别了解细节。但是知道主要原则大概有几个: 1. 数据库中都有特定的Field指出是否是测试数据,这使得测试数据和生产数据共存在一个数据库 2. 数据能够快速恢复。这个是基本 3. 强大的监控。开发人员账号触碰到生产数据,如果是TA本人不应该有权限的,必须要有任务ID才能有Access。这些行为都会被记录下来。一旦发现不合规操作马上非常严格的处理。比如辞退。
3 - 我来也2019-10-26监听文件变动并重启服务的事情我做过。 当时是用lua开发的一个项目,lua本身还是支持热更新的,不需要重启进程. 我就在代码逻辑中定时扫描文件的变动情况,有过变动且最近5秒未再变时就热更新加载代码。 (因为在网络传输文件的过程中,如果文件没传完,就开始了重载流程,就会出现语法错误。) 这样我用vim在服务器上开发时,只要一保存,就触发了重载。 另外我会单独开一个终端在tail日志,如果有问题,可以及时的发现。 从这也能看出,我喜欢小步走。展开
作者回复: 这个要赞!自己实现一个系统。有没有推广到团队中给其他成员使用?
共 2 条评论2 - 于小咸2019-09-02如果工程比较大,编译需要很久的话,自动编译并重启服务是不是就不太合适了?
作者回复: 如果你能够做到很快时间自动编译完成并重启服务,那就很棒。当然这可能需要做比较多的优化,以及可能使用一些Hacky的办法。当然如果做不到,或者投入太大,那也就确实不合适了。
共 2 条评论2 - 大河2019-09-09Docker开发对于前后端没有分离的项目来说,前端会省去大量的搭建项目的时间,直接使用后端搭建好的环境,然后去提交代码进行联调。
作者回复: Docker 在这些方面的确非常灵活。不知道你有没有注意到一个有些极端的例子:有一些工具,因为安装比较麻烦,干脆提供一个Docker镜像,使用的时候直接运行一个docker命令。而且速度也还不错。
1 - Marco2019-09-05老师,有自动化的一套工具介绍吗?
作者回复: 你们是什么技术栈?
共 3 条评论1 - 师傅又被抓走了2019-09-04采用虚拟机作为个人开发机------这个比较高效,值得学习!
作者回复: 管理起来方便 :)
1 - 许童童2019-09-02老师,数据那一块怎么管理呢,比如初始数据
作者回复: 如果数据量不是特别大的话,可以吧初始数据作为代码放到代码仓里面,比如一个SQL文件。在环境设置的脚本中调用它进行初始化。当然也可是使用二进制。 如果数据量特别大,可以把它放到共享文件夹中。初始化脚本挂载之后使用它进行初始化。 这样能太满足你的举起需求吗?
共 2 条评论1 - 刘兆峰2022-07-30 来自北京团队目前使用华为云的DevCloud平台,代码提交时可以做到对全量代码仓库进行自动化检查,但是我期望是仅对本次提交的代码做检查,是否有这样的工具支持
- nate_luo2022-01-181. 我是做嵌入式开发的,编译的时候是用docker的。因为交叉编译环境依赖比较多,很多库还必须指定版本,做成docker是会比较方便,但仅限于编译使用,mount文件夹过去。 2. 嵌入式开发做单元测试也比较麻烦,一来C的单元测试就不如其他语言容易,二来交叉编译后的可执行文件必须加到板子上才能跑,我想知道葛老师有什么建议?
- Bravery1682021-07-10各种工具和基础设施的建设和优化真是一个需要长期投入和持续的过程。不过要做好了,也能产生很大的收益,能够赋能业务研发团队提高效率,加快产出。
- Learner2021-03-29写好一个比较大的功能单元似乎没任何优点,就是给让Dev逃避小步提交,快速迭代,持续集成
- Geek_b43d272020-11-09据说facebook有很多的外包测试人员啊。所以是不是还是有很多测试的?
作者回复: 没有啊。你在什么地方听到的消息?
- oliver2020-04-22采用docker作为个人开发机的话是否意思是在服务器上开一个docker?还是把docker模板文件拉下来到本机环境运行? 如果用docker开发。是否只能用vim,无法用idea之类的IDE了?
作者回复: 我是指把docker模板文件拉下来到本机环境运行。 在docker可以运行GUI IDE,并用vncserver 获取其图形显示。不过的确有些麻烦,而且可能性能不好。 另一个可能的办法是:1. docker中 mount host的文件夹;2. host 中运行IDE进行开发;3. 在docker中运行;4. 通过remote debugging的方式,使用host中的IDE对docker中的app进行调试。
- Joe Black2020-02-13发现解释性或者脚本型的语言做持续集成都比较方便,工具也多,但是像我们主要用C++的,好像没有这样的自动化工具链吧。老师对这个有经验或者建议吗?
作者回复: 脚本语言的确更方便一些,但是文章中的基本思路对C++一样适用,绝大部分实践对C++也是可以的。 C++比较挑战的地方应该是编写代码时实时反馈难一些,但是运行单元测试也是可以的,还是可以尽量做到快速反馈。
- David2019-10-18👍