讲师介绍

杨周

CODING DevOps 架构师

CODING 布道师

连续创业者、DIY/Linux 玩家、知乎小 V,曾在创新工场、百度担任后端开发。十余年一线研发和带队经验,经历了 ToB、ToC、O2O、国内、出海各种项目,见证了云计算时代的诞生,擅长研发最佳实践:Code Review、DevOps、Git Workflow、敏捷开发、架构、极客办公硬件。

背景

随着 ToB(企业服务)的兴起和 ToC(消费互联网)产品进入成熟期,线上故障带来的损失越来越大,代码质量越来越重要,而「质量内建」正是 DevOps 核心理念之一。而且提高代码质量的最佳实践,不只适合新项目,也为老项目提供完善的渐进式方案。

常见代码质量问题

  • 英语拼写错误
  • 泄露密码
  • 无效注释
  • 魔法数字
  • hard code(写死)
  • 缩进等代码风格问题

如何解决代码质量问题

Code Review

第一步是锁定主干,禁止直接提交,采用多分支开发。先拉取一个分支,修改代码并推送分支,然后发起一个合并请求,请同事进行代码评审了。比较高级的技巧是推代码时自动创建一个合并请求,合并后临时分支被自动删除。

创建合并请求后,需要把链接发给同事进行评审,这也是敏捷开发倡导的一个理念——高效沟通。一般选择直接通过企业聊天工具通知同事,如果不及时通知,可能同事好几天才会看到,耽误项目进度。收到合并请求后,请尽量做到当天评审,不要拖延。

需要注意每次提交代码只提交最小粒度的一件事,即「原子性提交」,而不要把几件事做完一次性提交。比如有三件事,其中一件是修 Bug,结果修的有问题要回滚。如果三件事分三次提交,就可以轻松回滚有问题的,另外两个正确的不受影响;而一起提交的话就没法回滚。

Code Review 一定是在每次代码合并进去之前进行评审,发现问题减少故障,如果错误的代码已经合并上线了,这个时候再看就叫「故障反思会」而不叫「Code Review」,就没有意义了。

Lint 代码规范的增量检查

Lint 叫代码静态扫描程序,各种语言对应的 Lint 程序是不同的,对应的规范也不同:

  • Lint 的使用时机

1、在 IDE 里实时运行,边写边检查,这样是最方便的,缺点是需要每个人都进行配置。

2、Git commit 提交代码时检查:每个 Git 项目都有 .git/hooks 目录,修改里面的 pre-commit 脚本,即可在提交代码时进行拦截检查。缺点是可被删除。

3、最可靠的就是服务端检查。当代码推送到服务器上时,进行持续集成检查,这种方式非常可靠且不会被删除,缺点就是不如本地那么及时。

这三种方式一般结合使用。

  • 增量检查

老项目的规范问题往往很多,一次清理干净需要耗费大量人力,而且一次改动的代码越多,风险就越高,可能导致线上故障,尤其是缺乏自动化测试的项目。

所以建议使用增量检查。如果同学们对 git 命令熟悉的话就很好理解,增量检查就是 git diff。在本地提交时 git diff 可以拿到所有新增的、修改的和删除的文件,只要把删除的文件排除掉,把别的文件挑出来,传递给 lint 程序就可以了。同学们一定要熟悉 Linux 命令、git 命令,不要一直用 git 的图形界面,那你就很难掌握这些内容。

访问 CODING 帮助文档( https://help.coding.net/ ),搜索「增量检查」,即可看到完整的配置代码。

Git workflow

单兵作战的时代就如上图所示,一个人提交代码,不需要什么工作流,一直往主干里提交就可以。而现在多人协作做项目时,每个人都往主干里提交就会产生冲突。如下图所示,多分支开发,每个需求每个 Bug 都拉一个小分支,开发完毕再合并进主干里。

有两种常用的工作流,第一种最简单叫:Feature branch workflow(需求分支工作流)。可以从下图中看到主分支里拉下来两个分支,一个做登录,一个做支付。登录做完就合并进去,后续有个短信的 bug 修复了,也合并进去后就发布了,但支付功能还在开发,这时就会出现问题。本来登录和支付要一起上线,表示同一时期同一阶段的两个功能相互有依赖,结果因为线上的短信 bug 修复,就把登录先带上线了,这就导致了问题,所以大项目不适合用这种模式,而是使用第二种。

简易 Git Flow 是双分支的开发模式,除主分支外还有一个 develop 分支。Develop 分支对应敏捷开发里的迭代,每次迭代都会创建一个 develop,这次迭代里的所有功能开发完都合并到 develop,而不会合到主干上。主干保持随时可发布的状态,有 Bug 就在主干上修,等这次迭代全部结束,再把 develop 合到主干上。

Fork

Fork 不是工作流,团队协作一定不要用 Fork。Fork是专门用于开源项目的。当我们试图修改开源项目时,由于没有创建分支的权限,只能把这个项目复刻(官方翻译)成为自己的项目,然后再在自己的项目里拉分支,修改代码,最后发起一个跨项目的合并请求,合并到作者的开源项目里,如果后面还想再开发的话,需要再同步过来。所以 Fork 仅仅用于开源协作,完全不适合团队协作,同学们千万不要搞错,具体的文档可以扫码进行查看。

结语

最后总结一下代码质量的升级路线。从最原始的提交主干不检查代码,不检查规范,到锁定主干进行人工检查,然后人工检查太累,希望能做自动检查,把尽量多的东西都做成自动检查。但有些东西是自动检查做不了的,比如代码里使用了拼音,语法没有报错;或者英文单词用错,比如用户的「积分」应该使用points 而不是integral。所以不能看见自动化检查过了,就直接同意合并,这是不负责任的做法,一定要进行人工检查。

经过这个流程,同学们的代码就会非常干净漂亮,团队协作的风格也一致了。一般会挑一个知名的业界大厂的代码规范,而不要自己发明规范,这样不仅不能服众,而且以后再参加开源项目的话,难以和业界保持一致。

点击观看课程回放

关于 CODING,了解更多

CODING DevOps 代码质量实战系列第一课:代码规范与 Git Flow的更多相关文章

  1. CODING DevOps 代码质量实战系列第二课: PHP 版

    讲师介绍 杨周 CODING DevOps 架构师 CODING 布道师 连续创业者.DIY/Linux 玩家.知乎小 V,曾在创新工场.百度担任后端开发.十余年一线研发和带队经验,经历了 ToB.T ...

  2. CODING DevOps 代码质量实战系列最后一课,周四发车

    随着 ToB(企业服务)的兴起和 ToC(消费互联网)产品进入成熟期,线上故障带来的损失越来越大,代码质量越来越重要,而「质量内建」正是 DevOps 核心理念之一. <DevOps 代码质量实 ...

  3. CODING DevOps 微服务项目实战系列第一课,明天等你

    CODING DevOps 微服务项目实战系列第一课<DevOps 微服务项目实战:DevOps 初体验>将由 CODING DevOps 开发工程师 王宽老师 向大家介绍 DevOps ...

  4. CODING DevOps 线下沙龙回顾一:DevOps 代码质量实战

    11 月 22 日,由 CODING 主办的 DevOps 技术沙龙系列「质量」专场在上海圆满结束.在活动现场,四位来自腾讯等知名企业的技术大咖们分享了研发质量与效能的实战经验,与观众们共同探讨如何采 ...

  5. CODING DevOps 微服务项目实战系列第二课来啦!

    近年来,工程项目的结构越来越复杂,需要接入合适的持续集成流水线形式,才能满足更多变的需求,那么如何优雅地使用 CI 能力提升生产效率呢?CODING DevOps 微服务项目实战系列第二课 <D ...

  6. CODING DevOps 系列第一课:基于开源工具链打造持续交付平台

    当下软件发展趋势 当今 IT 行业发展中比较流行的几个技术,首先是微服务化,将原有的一个系统拆分成多个,意味着有多个系统需要构建.测试.部署和运维. 第二个是敏捷开发模式,需求粒度更细化,要求一个可独 ...

  7. Java秒杀系统实战系列~商品秒杀代码实战

    摘要: 本篇博文是“Java秒杀系统实战系列文章”的第六篇,本篇博文我们将进入整个秒杀系统核心功能模块的代码开发,即“商品秒杀”功能模块的代码实战. 内容: “商品秒杀”功能模块是建立在“商品详情”功 ...

  8. 读Effective Objective-C [提高OC代码质量总结笔记第一篇:熟悉OC]

    一.OC特性 OC 为 C 语言添加了面向对象特性,是其超集; OC 使用动态绑定的消息结构,也就是,在运行时才会检查对象类型; 接收一条消息后,究竟应执行何种代码,由运行期环境来决定,而非 编译器; ...

  9. selenium实战学习第一课

    #-*- coding:utf-8 -*- __author__ = "carry" from selenium import webdriver from selenium.we ...

随机推荐

  1. 什么是Hexo博客

    Hexo 是一个基于nodejs 的静态博客网站生成器,作者是来自台湾的Tommy Chen. 特点: 不可思议的快速 ─ 只要一眨眼静态文件即生成完成 支持 Markdown 仅需一道指令即可部署到 ...

  2. 00_02_使用Parallels Desktop创建Windos7虚拟机

    准备工作 如果要看图片的准备过程请参考该链接 需要注意的是给CPU配置为一个核,内存分配1024M 硬盘空间划分为60G 操作系统安装设置 注:windows系统设置一般都是"下一步&quo ...

  3. Python os.major() 方法

    概述 os.major() 方法用于从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field).高佣联盟 www.cgewang.com 语法 major( ...

  4. PDOStatement::fetchObject

    PDOStatement::fetchObject — 获取下一行并作为一个对象返回.(PHP 5 >= 5.1.0, PECL pdo >= 0.2.4)高佣联盟 www.cgewang ...

  5. 7.12 NOI模拟赛 探险队 期望 博弈 dp 最坏情况下最优策略 可并堆

    LINK:探险队 非常难的题目 考试的时候爆零了 完全没有想到到到底怎么做 (当时去刚一道数论题了. 首先考虑清楚一件事情 就是当前是知道整张地图的样子 但是不清楚到底哪条边断了. 所以我们要做的其实 ...

  6. 6.10 省选模拟赛 小C的利是 高斯消元 矩阵行列式

    LINK:小C的利是 想起来把这道题的题解写了 .一个常识:利是在广东那边叫做红包. 关于行列式的题目 不过我不太会23333..口胡还是可以的. 容易想到10分的状压.不过没什么意思. 仔细观察要求 ...

  7. 要做重试机制,就只能选择 DelayQueue ?其实 RabbitMQ 它上它也行!

    原文链接:要做重试机制,就只能选择 DelayQueue ?其实 RabbitMQ 它上它也行! 一.场景 最近研发一个新功能,后台天气预警:后台启动一条线程,定时调用天气预警 API,查询现有城市的 ...

  8. 洛谷3月月赛div2 题解(模拟+数学+贪心+数学)

    由于本人太蒻了,div1的没有参加,胡乱写了写div2的代码就赶过来了. T1 苏联人 题目背景 题目名称是吸引你点进来的. 这是一道正常的题,和苏联没有任何关系. 题目描述 你在打 EE Round ...

  9. property补充

    property补充 # class Foo: # @property # def AAA(self): # print('get的时候运行我啊') # # @AAA.setter # def AAA ...

  10. Python turtle库的画笔控制说明

    turtle.penup() 别名 turtle.pu() :抬起画笔海龟在飞行 turtle.pendown() 别名 turtle.pd():画笔落下,海龟在爬行 turtle.pensize(w ...