分享

最全代码治理知识体系

 过河卒冲 2020-01-02

1.问题

  • 1、代码管理是什么,包含哪些内容?

  • 2、如何建设合适的代码仓库,如何规范治理代码仓库?

  • 3、如何应用版本控制工具,选择合适的分支策略,适应不同的开发模式?

  • 4、项目开源需要注意哪些环节?

  • 5、编码规范又有哪些通用的准则,如何使用工具提升效率?

  • 6、代码审查的意义是什么,如何进行有效的代码审查?

  • 7、代码审查需要检查哪些清单,有哪些步骤?

2.关键词

代码管理,编码规范,代码审查,源码,仓库,版本控制,修订,冲突,分支,合并,脚本,权限,提交规范,提交,工具,开源,编码准则,版权,命名,注释,规约,扫描工具,漏洞,流程,审查步骤

关注公众号《云时代架构》,回复“代码”获取最全代码治理知识体系思维导图

3.全文概要

本文试图在代码领域里面建立一套完整的知识体系,涵盖了代码管理中的仓库建设与治理,版本控制的操作与原理,在夯实代码管理服务的基础上,谈谈如何编写出规范靠谱的代码,介绍一系列业界推崇的编码规范,然后再介绍代码评审的一套方法论。在代码管理,规范,评审三大环节形成闭环,解释了代码上下游的知识结构,从而对代码运营有进一步的理解。

4.代码管理

不管初级程序员还是骨灰级的老IT人,最熟悉的莫过于趁手的开发环境IDE和代码。代码甚至是一种信仰般的存在,犹如空气一样,程序员离不开代码,但是对于代码的保护,好像都不能说出个所以然。我们有时候会听说某团队因为代码托管的机器故障而导致整个团队垮掉的新闻,这个时候可能你会觉得这个事件离你很远。但是换个角度来说,如果要从零开始来搭建一套代码管理的系统和一系列的规范流程,是否可以很胸有成竹的办到?

4.1代码资产

在软件行业,代码是重要的产出,也是企业组织的核心资产,体现了IT人员的产出,那么如何保护核心资产就是一个重要课题了。正因为代码是核心资产,犹如我们理财一样对财富进行管理,对代码的管理同样需要遵循科学的方法论来操作。

4.4.1 定义

首先我们回想一下常见的一种场景,辛辛苦苦码了两小时的文档由于断电化为乌有,即使已经保存了但是反复修改后已经找不到初稿的代码,这时候就有如下的版本管理雏形:
programmer_v2019111201.doc
programmer_v2019111202.doc
programmer_v2019111203.doc
这个时候就需要我们祭出代码管理整套方法论了,我们需要对代码管理下一个定义,然后厘清代码管理的边界,才能更好的聚焦在核心功能上面,我们引用维基百科的定义如下,

  • 源代码管理

A source code manager (SCM) is a software tool used by teams of programmers to manage source code.SCMs are used to track revisions in software. Each revision is given a timestamp and includes the name of the person who is responsible for the change. Various revisions may be compared, stored, and merged with other revisions.

源代码管理器(SCM)是程序员团队用来管理源代码的软件工具。SCM用于跟踪软件中的修订,每个修订都有一个时间戳,并包括负责更改人员的姓名。可以将各种修订版本与其他修订版本进行比较,存储和合并。

4.4.2 问题

最朴素的谈源码管理其实就是要保证源码存在,能用且好用,源码管理一方面是要确保代码不会丢失,也就是要避免删库跑路的极端情况出现,先总结一下代码管理过程中常见的问题:

  • 没有源代码管理工具

  • 实施了不可靠的代码管理工具

  • 用户没有经过系统培训学习,无法发挥工具的优势

  • 复杂的分支会导致用户使用过程出现错误操作

  • 沟通不良和团队合作不够密切导致代码出现偏差

4.4.3 目标

无论是编写简单的应用程序还是大型软件开发上的协作,源代码管理都是软件开发生命周期的重要组成部分。它可以跟踪代码更改,还可以检查需要回滚使用的代码修订历史记录。使用源代码管理,可以与团队合作或隔离代码并进行更改,而不会妨碍团队成员所做的更改,直到代码准备就绪为止。同时可以知道谁进行了更改以及这些更改是什么,甚至故障排除也变得很容易。源代码管理有助于简化软件开发流程。针对上节遇到的问题,我们制定了明确的目标:
整体来讲就是提高整个团队的生产力,可量化个体的产出。有效的源代码管理意味着可以同时管理多行代码开发。这也意味着可以通过多种方式提高代码质量。代码管理的目的是提供完整的可追溯性,以便确切地知道谁更改了代码,并能够在必要时撤消更改。

4.4.4 原则

现在已经制定了清晰的目标,我们还需要遵循一些业界长期积累下来有效的原则,来避免代码管理中出现的疏漏和弯路。

原则:

  • 架构设计,分支模式需充分论证

  • 代码创建,分支流程需严格执行

  • 代码提交,注释意图需精确说明

  • 冲突出现,分支合并需按序解决

4.4.5 功能

源代码管理我们需要选择合适的软件系统来实现我们的管理意图,通常代码管理系统包含的基本功能:

  • 权限控制

  • 修订记录

  • 版本控制

  • 备份还原

  • 钩子操作

  • 分支合并

  • 归档回溯

  • 更改跟踪

4.2仓库建设

上一节我们在理论上认识了代码管理的概念,从代码的资产化到出现问题和解决问题的思路目标,还有列举管理系统的常用功能,本节将回到实践层面介绍如何搭建一套代码管理系统,及需要注意的方面。

4.2.1代码工具

常用的代码管理工具如下:

  • GitHub

  • GitLab

  • BitBucket

  • SourceForge

  • Beanstalk

  • Apache Allura

  • AWS CodeCommit

  • Launchpad

  • Phabricator

  • GitBucket

  • Subversion

其中代码管理系统又分为集中式和分布式:
集中版本控制所有用户更改和提交都必须通过中央服务器,集中版本控制的好处是很容易理解,还有更多的GUI和IDE客户端。缺点是它取决于对服务器的访问,这可能会比较慢,因为来自客户端的每个命令都必须通过服务器,分支和合并策略很难使用。
在分布式版本控制中,每个用户都有自己的整个存储库以及文件和历史记录的副本。好处是:更强大,更高效的变更跟踪,无需中央服务器,除了共享存储库之外,大多数功能都可以在脱机模式下工作,分支和合并策略更加容易和可靠。缺点:暂时想不到,可能功能比较强大,学起来时间长一点。

4.2.2仓库搭建

随时互联网高速发展的这几年,Git已经大大普及,甚至我们都无需再介绍SVN等集中式代码管理工具,直接就使用Git决定是明智的决定。而我们最熟悉的也莫过于GitHub的服务,对于公开的项目我们可以直接使用GitHub的服务的,但是对于企业仍需自己搭建一套代码管理系统,当然现在越来越多的中小企业直接选择上云托管代码。

常用的代码管理工具:

  • GitHub支持:导入Git,SVN,HG,TFS

  • GitLab支持:导入Git,从其他服务GitHub,Bitbucket,Google Code,Fogbugz轻松导入

  • Bitbucket支持:导入Git,CodePlex,Google Code,HG,SourceForge,SVN

如果只是实验室性质的或者微型公司起步阶段,那完全可以在本地机器机或者云上自建Git服务,按照官方指导就可以安装Git服务。

  • 安装Git

    $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
    $ sudo yum install git
  • 创建证书
    公钥导入后修改权限

    $ cd /opt/git/
    $ mkdir .ssh
    $ chmod 755 .ssh
    $ touch .ssh/authorized_keys
    $ chmod 644 .ssh/authorized_keys

但是对于一定规模上的团队就要考虑更加科学高效的协作方式了,由于只有GitLab是开源的,也是最广泛使用的开源系统,因此我们选GitLab作为案例来讲解,论服务GitLab已经非常完善了,而我们搭建需要重点关注的是灾备,热备和冷备,还有高可用方面的。
目前推荐的方式是基于docker+k8s,具体gitlab官网已经介绍的很详细,在这里就不赘述了。代码是企业的核心资产,所以保障核心资产的关键在于容灾备份以及自动应对各种突发情况,所以我们提出高可用的代码库。当然所有高度可用的解决方案都需要在成本/复杂性和正常运行时间之间进行权衡。想要的正常运行时间越长,解决方案就越复杂。解决方案越复杂,建设和维护所涉及的工作就越多。高可用性不是免费的,每个高可用性解决方案都应在成本与收益之间取得平衡。

整体参考如下架构(图片来源于Gitlab)

4.3仓库管理

在仓库完成建设后,就是如何科学使用了,好比物流仓库采用各种黑科技无人机建设出来后,如果没科学的规范和管理流程,一样无法实现高效的物流传输,所以本节我们介绍如何高效的使用代码仓库来管理组织我们的代码。

4.3.1分支管理

代码仓库从外部看无法就是拿来存代码的数据库,同时要很方便的追溯版本,说白了就是版本控制和代码文件存储。在不谈分支和规范的前提,我们使用Git代码库大可以在master上开发,然后频繁提交代码,后果就是代码版本杂乱无章,问题无法追踪到对应代码版本,经过前人探索,结合Git的功能特性,我们总结出来了分支策略,对应不同的的团队和不同的开发流程。目前比较流程的分支策略有:

  • Git Flow

  • GitHub Flow

  • GitLab Flow

Git Flow

Git Flow是此列表上最知名的工作流程,它基于两个主要分支:

  • master—该分支包含生产代码。所有开发代码都会master在某个时间合并到一起

  • develop—此分支包含预生产代码。功能完成后,它们将合并到开发中

在开发周期中,使用了各种支持分支:

  • feature-*—功能分支用于为即将发布的版本开发新功能。可能会从分支出来develop,必须合并为develop

  • hotfix-*-修补程序分支可以从分支,master并且必须合并到master和中develop

  • release-*—版本分支支持新产品版本的准备。它们允许修复许多小错误,并准备发布元数据。可以从分支develop合并到master和中develop。

优点:

  • 确保项目生命周期中任何给定时刻的分支状态干净

  • 分支的命名遵循系统的模式,使其更易于理解

  • 对大多数常用git工具的扩展和支持

  • 当生产中需要多个版本时是理想选择

缺点:

  • Git历史记录变得不可读

  • 持续交付和持续集成较为困难

  • 当需要在生产中维护单个版本时,不建议使用

随着持续部署的交付工作模式的兴起和发展,该模式已经被渐渐抛弃了。

GitHub Flow

GitHub Flow是一个轻量级的工作流程。它由GitHub在2011年创建,并遵循以下6条原则:

  1. master分支中的任何内容都是可部署的

  2. 新的开发任务需要创建从master检出的新分支,并给出描述性的名称

  3. 本地提交到该分支,并定期将新的代码推送到服务器上的同一命名分支

  4. 需要反馈或帮助时,或者分支可以合并时,需要打开pull request

  5. 在其他人查看并签署了该功能后,可以将其合并到 master

  6. 合并并推送到后master,应该立即部署

优点:

  • 它对于持续交付和持续集成非常友好

  • Git Flow的更简单替代

  • 当需要在生产中维护单个版本时,它是理想的选择

缺点:

  • 生产代码最容易变得不稳定

  • 当需要生产中的多个版本时,不建议使用

GitLab Flow

GitLab Flow是由GitLab在2014年创建的工作流程。它结合了功能驱动的开发和功能分支以及问题跟踪。GitLab Flow和GitHub Flow之间的最大区别是GitLab Flow中的环境分支

GitLab流基于11条规则:

  • 使用功能分支,不直接提交 master

  • 测试所有提交,不仅测试 master

  • 对所有提交运行所有测试用例

  • 在合并到之前master(而不是之后)执行代码审查

  • 部署是自动的,基于分支或标签

  • 标签是由用户而不是CI设置的

  • 版本基于标签

  • 每个人都从开始master,并以master为目标

优点:

  • 它定义了如何进行持续集成和持续交付

  • git历史记录将变得更整洁,更混乱,更易读

  • 当需要在生产中使用单个版本时,它是理想的选择

缺点:

  • GitHub Flow更复杂

  • 当需要在生产中维护多个版本时,它可能会像Git Flow一样变得复杂

One Flow

One Flow是一个提议的替代方案。要使用OneFlow,需要满足的主要条件是每个新的生产版本都基于先前的版本。One Flow和Git Flow之间最大的区别在于它没有develop分支。

优点:

  • git历史记录将变得更整洁,更混乱,更易读

  • 根据团队决定灵活

  • 当需要在生产中使用单个版本时,它是理想的选择

缺点:

  • 对于具有持续交付或持续部署的项目,建议不要使用它。

  • 功能分支使Continuos集成更加困难

  • 当需要在生产中维护单个版本时,不建议使用

因此,这是一些最知名的分支工作流程,根据团队的需要,还存在许多其他工作流程,比如阿里的AoneFlow模式,AoneFlow大大简化了分支管理成本,开发步骤如下:

  • 开发新需求,从主干创建特性分支(feature分支)

  • 提测时通过合并特性分支,形成发布分支(releases分支)

  • 发布到线上正式环境后,合并相应的发布分支到主干(基线操作)

  • 主干添加标签,删除该发布分支关联的特性分支(feature分支)

4.3.2规范治理

仓库管理的核心分支策略我们介绍完,那么大方向上只需要根据自身团队规模来选择合适策略就足以保障流畅的开发过程,但这个只是我们说的硬件配套,但是代码治理还得深入到细节规范,才能“长治久安”。本节我们介绍代码治理的一些规范和守则,做好了这些软设置,对代码资产也是一种保值升值的体现。

权限管理

首先我们要保证代码是安全的,就需要对权限做控制,分别为一下粒度按需进行分配。
Gitlab用户在组中有五种权限:

  • Guest:可以创建issue、发表评论,不能读写版本库

  • Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限

  • Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限

  • Master:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限

  • Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限

Gitlab中的组和项目有三种访问权限:

  • Private:只有组成员才能看到

  • Internal:只要登录的用户就能看到

  • Public:所有人都能看到

提交规范

代码资产是由一行一行代码堆积而成的,而其中最关键的就是我们在分支工作中向代码库提交一行行的代码。那么这个时候就需要对代码提交这个动作进行约束,而且这种约束不宜繁杂,毕竟这个操作是程序员日常频繁的动作,复杂了不容易执行,所以我们必须制定简明且可复用的约束来保证每次提交的代码质量。
提交信息包含着本次提交代码的意图,是问题回溯和版本管理,代码合并的重要参考信息。
通常有几个类型:

  • 功能:一项新功能

  • 修复:一个错误修复

  • 文档:仅文档更改

  • 样式:不影响代码含义的更改(空白,格式,缺少分号等)

  • 重构:既不修正错误也不增加功能的代码更改

  • 性能:改进性能的代码更改

  • 测试:将缺少或修正现有的测试

  • 其他:更改构建过程或辅助工具和库,例如文档生成

定义好提交代码意图的类型后,记下来要关注的是提交信息的内容,通常需要指定好格式,包含表头,内容,脚注,当然这个并没有固定的格式,根据团队业务特点实现即可,但是如果包含信息量较多的情况,很难保证程序员每次都能按规范来提交,那么这个时候用工具实现自动化就很有必要了,这里我们介绍conventionalcommits提供的脚本来实现commit message的自动生成,由于篇幅限制这里就不展开说明,具体可以上官网根据指示安装。

提交准则

我们选择了科学的分支策略,权限管理分配好,同时提交信息也工整规范,但也耐不住一天提交个二三十次,或者憋了好几天提交一次那种,或者更甚的提交的代码不全导致编译问题之类,所以指定提交准则就是要规避这些问题,让代码提交有一个良好的频率和质量保障。

我们对可提交代码大概分为以下标准:

  • 编译通过:没有语法错误,引用包完整,提交文件集完整

  • 运行通过:代码运行通过没有异常抛出

  • 单测通过:单元测试通过,逻辑完整

  • 验证通过:缺陷修复完毕,可上线级别

编译通过 < 运行通过 < 单测通过 < 验证通过
那么提交代码的准则就是要达到最低标准,依次递增完善业务对应的代码逻辑,直至上线。上面讲的标准是代码的提交标准,在这个标准的限制内,提交粒度按照最小可用原则,当然如果出现一个最小功能的代码需要几天才提交,说明对业务拆解不合理,这方面还需要依赖架构和模块的合理设计才能完成。

以上就是代码仓库管理的一些规范和准则,做好了这些前提后,后面就按部就班即可,也就是前人种树后人乘凉,战略上调整好方向,下一节讲的就是战术上怎么用好版本控制工具。

4.4工具应用

提代码管理的时候很多同学会直接谈版本控制,而忽略了上文包含的分支策略,代码准则等规范,而这节我们介绍的是版本控制工具的核心原理和使用技巧,鉴于现在Git的流行程度,我们大可以直接跳过即将进入博物馆SVN。上文已经介绍了代码仓库的搭建步骤包括Git服务的安装和分布式服务的部署,本节主要从版本控制的原理,分支管理和核心操作技巧三个方面进行介绍。

4.4.1底层原理

在学习底层原理之前,我们思考下如果自己动手来写个版本管理软件,该如何入手?

数据结构

我习惯把复杂的东西通过生活经验直观的转换为简单容易的理解,刚接触Git那会,对比SVN的使用确实有很多新的知识和技能需要学习,虽说现在SVN那套基本也忘光了,但是我们还是需要从根基上了解Git是个怎样的东西。从简单的逻辑出发,版本控制无非就是记录每次操作,提供操作对比差异,也就是把数据看作对文件系统的快照流,每次提交更新时,对相关文件制作一个快照并保存这个快照的索引。这一点跟SVN记录变更的增量有所差别。

大白话来讲Git是一个软件,启动运行时在操作系统里面起来一个进程,作用用于内容寻址,本质是是一个管理文件的进程,更进一步讲Git其实就是个数据库,只不过存储的内容是文件。本质是Git也是一个非典型的nosql数据库,这里我们类别MongoDB这样的数据库,因为Git底层就是通过key-value的方式来存储文件和寻址的,非常朴素的结构,而核心就是如何科学的组织这一堆KV键值对的关系。

先来看一个空代码库里面有什么东西

$ ls -l
total 56
-rw-r--r-- 1 linzhenhua staff 6 11 14 18:38 COMMIT_EDITMSG
-rw-r--r-- 1 linzhenhua staff 23 11 14 16:16 HEAD
-rw-r--r-- 1 linzhenhua staff 41 11 14 18:40 ORIG_HEAD
-rw-r--r-- 1 linzhenhua staff 137 11 14 16:16 config
-rw-r--r-- 1 linzhenhua staff 73 11 14 16:16 description
drwxr-xr-x 13 linzhenhua staff 416 11 14 16:16 hooks
-rw-r--r-- 1 linzhenhua staff 118 11 14 18:40 index
drwxr-xr-x 3 linzhenhua staff 96 11 14 16:16 info
drwxr-xr-x 4 linzhenhua staff 128 11 14 16:23 logs
drwxr-xr-x 22 linzhenhua staff 704 11 14 18:38 objects
drwxr-xr-x 4 linzhenhua staff 128 11 14 16:16 refs
-rw-r--r--@ 1 linzhenhua staff 174 11 14 18:36 sourcetreeconfig

在创建一个git代码库的时候会自动初始化一个.git目录,这个也是Git数据包含的全部内容,而我们只需关注:HEAD 文件、(尚待创建的)index 文件,和 objects 目录、refs 目录。这些条目是 Git 的核心组成部分。

  • objects 目录存储所有数据内容

  • refs 目录存储指向数据(分支)的提交对象的指针

  • HEAD 文件指示目前被检出的分支

  • index 文件保存暂存区信息

组织结构

弄清楚Git数据库的数据结构后,我们关心的是Git如何对数据进行读写。接下来我们可以试着创建一个git代码库,然后进行最原始的操作

  • 写文件:git hash-object -w filename

  • 读文件:git cat-file -p sha-id

通过简单的两行命令,我们就实现了Git的底层操作,确实简单,这个也实现了文件的读写,我们看到hash-object这个命令就是以键值对的方式存储,返回一个sha-id作为文件的唯一标识。

接下来我们介绍一下键值对中object的类型,其实也很好理解,如果全是一堆键值对毫无关联的散落在objects的目录下,那么寻址肯定是很低效而且不可管理,所以我们需要对文件的组织方式进行研究。其实也很简单,就是通常的数据结构,目前对文件的格式有两种类型:blob和tree。普通的文件是blob,tree类型就是组织blob形成的树状文件。

(图片来源Git官网)

从上图我们可以知道Git的文件结构就是由tree类型的文件串起来的。
而git的文件模式可以分类为:指定的文件模式为 100644,表明这是一个普通文件。其他选择包括:100755,表示一个可执行文件;120000,表示一个符号链。

快照管理

弄清楚Git文件库包含什么,并且知道文件如何关联起来后,这个时候只能静态的存储工作文件,这节我们弄清楚不同版本之间是如何关联起来。其实想想也是很简单的事情,无非就是每次提交都把有变更的文件使用快照保存起来,我们用快照这个词说明每次提交都有一个新的版本,当然这样你会怀疑是不是多次提交后Git库会变得冗余。其实我们不需要担心这个问题,因为Git会判断那些没变更的文件,存放的是文件的“地址指针”,寻找的时候通过指针链来找到具体的文件内容,如下图呈现了多次提交产生的快照。
这个时候我们还有提起另外一个文件管理结构,称为提交对象持久化文件,里面记录一个顶层的树文件,代表当前项目的快照。然后每一次提交都需要包含上一次提交的文件sha_id,这样就形成一条指针链,可以追溯到历史的每一次提交。

linzhenhuadeMacBook-Pro:git-test linzhenhua$ git update-index --add --cacheinfo 100644 8d0e41234f24b6da002d962a26c2495ea16a425f hello.txt
linzhenhuadeMacBook-Pro:git-test linzhenhua$ git status
On branch master

No commits yet

Changes to be committed:
(use 'git rm --cached <file>...' to unstage)

new file: hello.txt

linzhenhuadeMacBook-Pro:git-test linzhenhua$ git write-tree
07ed5a7aebb914e3a02edf6d622b82d364037e3c

(图片来源git官网)

工作区域

了解了以上的知识储备后,我们可以很轻松的区分Git的工作区域,我们用一张图来概括即可。

4.4.2分支操作

在我们学习了Git底层工作原理后,再来理解分支会有很大的帮助。同时我们在仓库管理一节也明确了开发分支的策略,相当于在战略层面确定了分支的模式,本节是战术上介绍分支运用的过程。
分支存在的理由是可以把任务从开发主线上分离开来,以免影响开发主线。在很多版本控制系统中,生成新分支需要完全创建一份源代码副本,这是一个低效的过程而且会耗费很多时间。而我们知道Git使用文件指针可以很好的解决这个问题。

创建分支

分支创建只需要一个很简单的命令

$ git branch new

Git背后是怎么创建新分支的呢?其实很简单,它只是为你创建了一个可以移动的新的指针,这会在当前所在的提交对象上创建一个指针,所以速度很快。

切换分支

切换分支其实就是在.git/HEAD文件里面指定工作区域的分支,可以随时切换,结构如下图

合并分支

多个分支最终总是需要合并后再发布,这个时候就需要把多个分支的指针合并起来。

4.4.3命令脚本

最后一步就是介绍命令脚本了,但是本文不是针对Git的专有教程,不打算全面仔细的讲解所有脚本,篇幅限制而且大家去官网查询脚本操作手册即可。本节重点介绍核心的几个脚本的使用方法。由于现在git客户端工具也已经有很长足的改善了,很多同学可能直接在Git的UI客户端直接操作,但了解这些核心脚本还是很有帮助的。

reset

很多时候我们需要对提交过的代码进行回滚,默认调用git reset具有的隐含参数—mixed和HEAD。这意味着执行git reset等同于执行git reset —mixed HEAD。以这种形式HEAD指定的提交。代替HEAD任何Git SHA-1提交哈希都可以使用。

  • hard
    这是最直接,最危险且最常用的选项。通过后,—hard“提交历史记录”引用指针将更新为指定的提交。然后,将暂存索引和工作目录重置为匹配指定提交的索引。对暂存索引和工作目录的任何未确认更改,将重置为匹配提交树的状态。这意味着存放在暂存索引和工作目录中的所有待处理工作都将丢失。

  • mixed
    这是默认的操作模式。ref指针将更新。暂存索引将重置为指定提交的状态。从暂存索引撤消的所有更改都将移至工作目录

  • soft
    当—soft参数传递,裁判指针更新和复位停在那里。暂存索引和工作目录保持不变。

revert

如果git revert是撤消更改的“安全”方法,则可以将其git reset视为危险的方法。确实有失去与一起工作的风险git reset。Git reset永远不会删除提交,但是,提交可能会变成“孤立的”,这意味着没有从引用访问它们的直接路径。通常可以使用来找到并还原这些孤立的提交git reflog。Git运行内部垃圾收集器后,将永久删除所有孤立的提交。默认情况下,Git配置为每30天运行一次垃圾收集器。使用此工具时必须小心,因为它是可能会丢失工作的仅有的Git命令之一。

cherry-pick

git cherry-pick是一个功能强大的命令,它允许通过引用选择任意Git提交并将其附加到当前工作的HEAD上。Cherry Picking是从分支中选择提交并将其应用于另一个的行为。git cherry-pick对于撤消更改很有用。假设一次提交在错误的分支进行提交的,则可以切换到正确的分支,然后选择提交应属于的位置。

下面我们介绍下cherry-pick的一些使用场景:

  • 团队合作
    通常,团队会发现在相同代码中或周围工作的单个成员。两个产品部门之间可能存在一些共享代码。A团队开发人员可能会创建B团队需要的数据结构。而B团队也可以通过git cherry-pick来选择A团队提交的数据结构代码,说白了就是复用代码。

  • 缺陷修复
    发现代码缺陷后,尽快将修补程序提供给最终用户非常重要。例如,假设开发人员已开始开发新功能。在进行新功能开发期间,确认一个先前存在的错误。此时创建了一个明确的提交来修补此错误。可以将新提交的修补代码直接挑选到master分支中,也就是将有效代码挑出来合并到master中。

下面演示下如何使用git cherry-pick,先假设我们有一个具有以下分支状态的存储库:

    a - b - c - d   Master
\
e - f - g Feature

git cherry-pick用法很简单,可以像这样执行:

git cherry-pick commitSha

在此示例中,commitSha是提交引用。可以使用找到提交记录git log。首先,我们确保我们在master分支机构上工作

git checkout master

然后,使用以下命令执行cherry-pick:

git cherry-pick f

一旦执行,我们的Git历史将如下所示:

    a - b - c - d - f   Master
\
e - f - g Feature

f提交已成功进入功能分支Cherry Picking是一个功能强大且方便的命令,在某些情况下非常有用。但并不是用来代替代替git merge或git rebase。

rebase

rebase是将更改从一个分支集成到另一个分支的方法。rebase将所有更改压缩到单个“补丁”中。然后将补丁集成到目标分支中。rebase是两个Git实用脚本之一,专门用于将代码变更从一个分支集成到另一个分支。另一个变更集成实用程序是git merge。合并始终是向前移动的更改记录。rebase本身有2种主要模式:“手动”和“交互”模式。

stash

git stash暂时隐藏对工作副本所做的更改,以便我们可以处理其他内容,然后再返回并稍后重新应用它们。

  • 储藏变更
    可以自由进行更改,创建新的提交,切换分支以及执行任何其他Git操作。然后回来,准备好后重新应用储藏的变更。

值得注意的是,该存储区在Git存储库本地;推送时,存储的资源不会转移到服务器。通常在以下场景会使用到:

  • 重新应用隐藏的更改

  • 隐藏未跟踪或忽略的文件

  • 管理多个存储

  • 查看隐藏差异

  • 部分藏匿处

  • 清理储藏变更

4.5开源管理

关于开源项目,开源是促进生产力的核动力,相信很多同学都是开源社区的簇拥,或多或少参与过开源项目的建设。至于如何开源一个项目,也是技术人毕生的一个追求,开源一个项目很简单,可能发布在Github上面就可以了,但是要做出一个规范的开源项目,并且能提交到类似Apache基金会上的就不是那么容易了。
这里我试图学习一下开源的大致步骤,抛砖引玉一起来关注开源的领域。

4.5.1设定目标

目标可以帮助我们弄清楚该做什么,不该说什么,以及在哪里需要别人的帮助,为什么我要开源这个项目?这个问题没有正确的答案。您可能为一个项目或具有不同目标的不同项目有多个目标。

4.5.2开源许可

开源许可证可确保其他人可以使用,复制,修改和回馈我们的项目,而不会造成影响。它还可以保护我们免受棘手的法律问题困扰。启动开源项目时,必须包含许可证。当然法律工作没有多大的乐趣,不过我们可以将现有许可证复制并粘贴到代码库中,MIT,Apache 2.0和GPLv3是最受欢迎的开源许可证,但还有其他选择。在GitHub上创建新项目时,可以选择许可证。包括开源许可证将使我们的GitHub项目成为开源。

4.5.3自述文件

自述文件所做的不只是解释如何使用我们的项目。他们还解释了为什么我们的项目很重要,以及用户可以使用它做什么。在自述文件中,尝试回答以下问题:

  • 这个项目做什么?

  • 为什么这个项目有用?

  • 该如何开始?

  • 如果需要,可以在哪里获得更多帮助?
    除此之外还可以使用自述文件回答其他问题,例如如何处理捐款,项目目标是什么以及有关许可证和署名的信息。

4.5.4贡献准则

CONTRIBUTING文件将告诉我们的用户如何参与您的项目,可能包括以下信息:

  • 如何提交错误报告(尝试使用问题和拉取请求模板)

  • 如何提出新功能

  • 如何设置环境并运行测试

  • 对项目的路线图或愿景

  • 贡献者应如何我们联系

4.5.1行为守则

最后,行为准则有助于为项目参与者设置行为的基本规则。如果要为社区或公司启动一个开源项目,那么这特别有价值。行为准则能够促进健康,建设性的社区行为,从而减轻维护者的压力。

4.5.6项目命名

选择一个易于记忆的名称,理想情况下,可以让我们对该项目的用途有所了解。在项目的整个生命周期中,会包括很多事情:自述文件,教程,社区文档,对问题的响应,甚至是新闻通讯和邮件列表。无论是正式文档还是随便一封电子邮件,我们的写作风格都是项目品牌的一部分。

4.5.7发布清单

文档:

  • 项目有一个具有开源许可证的LICENSE文件

  • 项目具有基本文档(README,CONTRIBUTING,CODE_OF_CONDUCT)

  • 这个名称很容易记住,可以对该项目的用途有所了解,并且不会与现有项目冲突或侵犯商标

  • 问题队列是最新的,已明确组织并标记了问题
    代码:

  • 项目使用一致的代码约定并清除函数/方法/变量名称

  • 明确注释了代码,记录了意图和极端情况

  • 修订历史记录,问题或提取请求中没有敏感材料(例如,密码或其他非公开信息)
    人员:

  • 已与法律部门交谈和/或了解公司的IP和开源政策

  • 您已经与法律部门进行了交谈

  • 有人致力于管理社区互动

  • 至少两个人对该项目具有管理权限

5.编码规范

如果从唯物层面,代码管理我们已经梳理了整个流程,按不同层次进行了阐述,这可以理解为物质层面的管理。至于代码写得好坏我们全然没提到,空有代码管理是不够的,所以我们在这节要重点介绍编码规范,在精神层面对代码进行约束,从而提高代码资产的价值。

由于编码语言和语言模式各有不同,需要兼顾不同语言的特点,所以这里并不打算长篇累牍的介绍不同语言的编码规范,而是抽象出大部分共同需要关注的关键点。

5.1编码准则

通常成熟的软件开发组织会希望程序员保持某种定义良好的标准编码风格,即编码标准。刚开始可能不同企业有不同的标准,但是随着业界现在企业的引领和实践,慢慢的会形成业界通用的一些基本规范,但是这种非事实标准的编码准则无法强制执行,但是对我们指定科学的编码准则也是很有意义的:

  • 编码标准使不同工程师编写的代码具有统一的外观

  • 提高了代码的可读性和可维护性,降低了复杂性

  • 有助于代码重用,并且有助于轻松检测错误

  • 促进了良好的编程习惯

  • 并提高了程序员编码效率

  • 有助于在早期阶段检测代码错误

  • 能通过工具自动化监测代码缺陷

5.2版本规范

进入编码之前我们会给项目工程分配版本,版本不仅仅是区分不同阶段的软件产品,好的版本定义可以传递更多高质量有效信息。通常版本号会呈现出以下格式:
主版本号.次版本号.修订号

版本号递增规则如下:

  • 次版本号,做了向下兼容的功能性新增

  • 修订号,做了向下兼容的问题修正

  • 先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸

具体的版本号变化规则我们可以参考语义化版本Semantic Versioning给出的一些规则。使用语义化版本控制的软件必须(MUST)定义公共 API。该API可以在代码中被定义或出现于严谨的文件内。无论何种形式都应该力求精确且完整。

  • 标准的版本号必须采用 X.Y.Z 的格式

  • 标记版本号的软件发行后,禁止改变该版本软件的内容

  • 主版本号为零(0.y.z)的软件处于开发初始阶段,一切都可能随时被改变

  • 1.0.0的版本号用于界定公共API的形成

  • 修订号Z(x.y.Z | x > 0)必须在只做了向下兼容的修正时才递增

  • 次版本号Y(x.Y.z | x > 0)必须在有向下兼容的新功能出现时递增

  • 主版本号 X(X.y.z | X > 0)必须在有任何不兼容的修改被加入公共API时递增

以上只是列举了语义化版本常用的一些规则,更多规则可以前往官网阅读。

5.3文件规范

编码的独立单元通常是以文件来划分,那么如果对文件进行规范也是非常重要,一份代码文件通常由文件名,后缀,文件编码格式,版权信息,等一系列元素组成,本节我们将详细剖析一个文件需要注意的那些规范

5.3.1文件名称

首先当然是文件名称,通常源代码文件由它包含的顶级类的大小写敏感的名称以及扩展名组成,如果文件里面有多个类的话则以主类的名称为主。

5.3.2文件编码

通常源文件都是以UTF-8编码,对于其余的非ASCII字符,使用实际的Unicode字符,该选择仅取决于使代码更易于阅读和理解的方法,尽管Unicode会在字符串文字之外进行转义,并且强烈建议不要使用注释。

5.3.3版权信息

在规范好文件名称和编码后,最新开始的应该是文件的许可或版权信息。定义好法律文书等信息后就是文件的头部说明文本。为了更好地理解和维护代码,不同模块的头应遵循一些标准格式和信息。标头格式必须包含多数企业使用的格式:

  • 模块名称

  • 创建模块的日期

  • 模块作者

  • 修改历史

  • 有关模块功能的模块简介

  • 模块中支持的不同功能及其输入输出参数

  • 模块访问或修改的全局变量

5.3.4文件规格

文件规格主要是现在文件文本的列宽和行数限制。Java代码的列数限制为100个字符。“字符”表示任何Unicode代码点。除非另有说明,否则超出此限制的任何行都必须进行换行。通常,有几种有效的方法可以对同一段代码进行换行,需要参考不同语言的语法规则,但是硬性规定的就是100个字符就必须强制换行,以免降低可读性。

5.4命名规范

最重要的一致性规则是命名管理. 命名的风格能让我们在不需要去查找类型声明的条件下快速地了解某个名字代表的含义: 类型,变量,函数,常量,宏,等等。我们大脑中的模式匹配引擎非常依赖这些命名规则。命名规则具有一定随意性, 但相比按个人喜好命名, 一致性更重要,命名的时候尽可能遵循一些原则,尽可能使用描述性的命名,别心疼空间,毕竟相比之下让代码易于新读者理解更重要。不要用只有项目开发者能理解的缩写,也不要通过砍掉几个字母来缩写单词。

5.4.1命名规则

常用的命名规则有以下三种命名法:

  • 匈牙利(Hungarian)命名法:匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等

  • 骆驼(camel)命名法:骆驼式命令法,正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字

  • 帕斯卡(pascal)命名法:与骆驼命名法类似,只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写

5.4.2命名空间

命名空间以小写字母命名,最高级命名空间的名字取决于项目名称,要注意避免嵌套命名空间的名字之间,和常见的顶级命名空间的名字之间发生冲突。顶级命名空间的名称应当是项目名或者是该命名空间中的代码所属的团队的名字。命名空间中的代码,应当存放于和命名空间的名字匹配的文件夹或其子文件夹中。同时注意,不使用缩写作为名称的规则同样适用于命名空间。命名空间中的代码极少需要涉及命名空间的名称,因此没有必要在命名空间中使用缩写。

5.4.3类名定义

所有编程相关的命名均不能以下划线或$结束,具体以业务相关的领域来参考命名。

5.4.4常量命名

常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。

5.4.5变量命名

有意义且易于理解的变量名可以帮助任何人理解使用它的原因。
局部变量应使用驼峰式字母命名,并以小写字母开头,而全局变量名称应以大写字母开头。常量名称只能使用大写字母形成,而且最好避免在变量名中使用数字。

5.4.6函数命名

一般来说, 函数名的每个单词首字母大写 (即 “驼峰变量名” 或 “帕斯卡变量名”), 没有下划线,第一个字母需小写。函数的长度不应太大,冗长的函数很难理解,冗长的函数应该分解为小的功能以完成小的任务。

5.5注释规范

注释虽然写起来很痛苦,但对保证代码可读性至关重要。下面的规则描述了如何注释以及在哪儿注释。当然也要记住:注释固然很重要,但最好的代码应当本身就是文档,有意义的类型名和变量名,要远胜过要用注释解释的含糊不清的名字。

5.5.1函数注释

注释,除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。函数声明处注释的内容:

  • 函数的入参出参

  • 参数是否可以为空

  • 是否存在函数使用上的性能隐患.

  • 如果函数是可重入的, 其同步前提是什么

  • 函数是否做了幂等处理

如果函数的实现过程中用到了很巧妙的方式,或者难以快速理解的逻辑,那么在函数定义处应当加上解释性的注释。

5.5.2变量注释

通常变量名本身足以很好说明变量用途。某些情况下, 也需要额外的注释说明。通常在复杂业务中,需要对上下文做一些说明。

5.5.3待办注释

对那些临时的,短期的解决方案,或已经够好但仍不完美的代码使用 TODO注释,这个时候我们强制用大写来标明注释。在随后的圆括号里写上名字、邮件地址、bug或其它身份标识和与这一 TODO 相关的文档。主要目的是让添加注释的人可根据规范的TODO格式进行查找。添加TODO注释并不意味着需要本人自己来修正,因此当我们加上带有姓名的TODO时,一般都是写上自己的名字。

5.5.4废弃注释

通过废弃注释(DEPRECATED)以标记某接口点已废弃。写上包含全大写的DEPRECATED注释,注释可以放在接口声明前,或者同一行。在DEPRECATED一词后,在括号中留下的名字,邮箱地址以及其他身份标志比如工号之类。修复后的代码应该不会再涉及废弃接口, 需要将该注释移除。

5.6代码规约

下面我们大致讲下编码过程中的一些约定习惯。

5.6.1符号

使用if/else/for/do/while语句,即使方法体是空的或只包含一个声明,开括号之前没有换行,开括号后换行,右括号前的换行符。仅在大括号终止一条语句或终止方法,构造函数构造方法或命名类的主体时,才在右括号后换行。

5.6.2缩进

每次打开新的块或类似块的构造时,缩进量都会增加两个空格。当块结束时,缩进将返回到先前的缩进级别。缩进级别适用于整个块中的代码和注释。正确的缩进对于提高代码的可读性非常重要。为了使代码可读,程序员应适当使用空格。下面给出了一些间距约定:

  • 在两个函数参数之间加逗号后必须有一个空格

  • 每个嵌套块应适当缩进并隔开

  • 程序中每个程序段的开头和结尾都应有适当的缩进

  • 所有花括号应从新行开始,并且花括号末尾的代码也应从新行开始

5.6.3空格

单个空白行也可能出现在它提高可读性的任何地方,例如在将代码组织为逻辑小节的语句之间。不鼓励在类的第一个成员或初始化程序之前,或在最后一个成员或初始化程序之后的空白行。

5.6.4列数

Java代码的列数限制为100个字符。“字符”表示任何Unicode代码点。除非另有说明,否则超出此限制的任何行都必须进行换行,

5.7工具应用

5.7.1命名工具

https://unbug./codelf/

5.7.2扫描工具

首推阿里巴巴代码规约扫描工具,具体参考官方文档https://github.com/alibaba/p3c/tree/master/idea-plugin

6.代码审查

如果说代码管理硬件设施,编码规范是主动出击,那么代码审查则是软件质量的后一道防线。本节我们将从代码评审的定义、意义、方法、步骤、度量等方面来介绍。

6.1定义

代码审查是指对计算机源代码系统化地审查,以编码人员直接相互评审的方式进行,其目的是在找出及修正在软件开发初期未发现的错误,评估代码质量,提升软件质量及开发者的技术,通常代码审查过程包括以下阶段:

  • 最佳实践,优化业务实现逻辑

  • 错误检测,查找代码逻辑错误

  • 漏洞扫描,识别常见的代码安全漏洞

  • 后门发现,检测可疑代码段以及集成到软件中的任何恶意代码

6.2意义

软件代码审查在软件质量中起着重要作用,代码审查可以由多个人在多个交付品的多个阶段进行。人员之间可以专注于特定的软件领域,也可以交叉审查提升自身编码能力。代码审查首先可以降低风险,因为即使是优秀的开发人员也会错过某些东西,因此多一层代码审查始终可以提升质量,也就是时间换质量。此外,在共同检查代码时,每个团队成员都可以提出更明智的解决方案,以提高项目的总体性能和代码质量。

6.2.1优势

团队代码审查有很多优点,整个团队的知识交叉学习,这将有助于及时沉淀知识库。同时关于代码可以发挥出多种观点看法,这将有助于提高代码和设计质量。团队审核的另一个重要优势是,初级员工有机会听取技术主管,经理或者架构师的意见,对于他们来说,这是一个很好的学习机会,可以了解他们的高年级同学的期望或者想法。
总之,代码审查是一个双向的学习过程。它有助于确保代码在整个系统中是对称的,并保持软件质量。
下面列出不同角色对于代码审查带来的作用:

  • 开发人员,将从编码角度进行研究,并将其与其他项目代码进行比较,借此来填补有开发人员的知识盲区。

  • 测试人员,把代码实现与测试用例进行比较,并确定开发人员是否实施了不属于测试用例的业务规则。

  • 架构人员,将从设计角度进行审查,并确保按照初始设计实施代码,检查最佳编码实践,设计原则以保护软件质量。

6.2.2劣势

当然,代码审查确实是一项耗时耗人力的工作,完全执行甚至占到项目开发的很大一部分时间,这对于紧急项目来说也是一项挑战。但这并不意味着我们可以忽略掉代码审查,相反这更加考验我们对项目的排期和对工具的使用还有流程的编排。后面会介绍到项目审查的核心步骤和提效的扫描工具。

6.3准则

代码审查大方向必须遵守一些准则,下面列出一些需要注意的方向:

  • 可维护性:

    代码发布后持续相当长的时间内,应用程序力求花最少的精力来维护,而且应该易于识别缺陷和修复

  • 可读性:

    代码应该做到不言自明,在阅读代码的同时,可以读懂业务。

    为变量,函数和类使用适当的命名。

    如果某段代码需要花很多时间来理解,则意味着有重构的必要,或者至少编写清晰明了的注释。

  • 可测试性:

    代码应易于测试,有助于更快发现代码缺陷。

  • 可调试性:

    代码需合理封装且易于执行调试,不需额外编写脚本来调试业务功能。

  • 可配置性:

    将可配置值保留在适当的文件,按环境分类以便在不同环境执行代码无需手动操作或者变更代码。

  • 可重用性:

    充分合理复用现有代码,同时评估如何降低代码耦合性。

  • 可靠性:

    代码需要确保包含异常处理和错误记录机制。

  • 可扩展性:

    只需对现有代码进行最小的更改即可轻松添加增强功能,或者说一个组件应易于替换为更好的组件。

  • 安全性:

    验证,授权,针对安全威胁的输入数据验证,敏感数据加密

6.4流程

讲完代码审查需要关注的点之后,我们讲继续学习正确进行代码审查的姿势。

6.4.1审查方式

通常我们理解的代码审查就是一个程序员对另外一个程序员的代码进行阅读,进而探讨,得出改进建议或者缺陷修复清单。但是为了适应不同的团队和工作场景,我们先介绍几种不同的代码审查方式。

  • 电子邮件
    代码审查不一定实时在线讨论,对于全球化团队可能还有时差,所以首选的肯定是邮件方式,打破了时间的限制。一旦准备好代码审查,便会通过电子邮件将文件发送给指定的同事,这种方法比更传统的技术更灵活和更具适应性。

  • 结对编程
    作为极限编程的标志之一,这种编写软件的方法使开发人员并排在一起处理相同的代码,从而在彼此进行工作时检查彼此的工作,也相当于结对相互审查。对于高级开发人员来说,这是指导初级同事的好方法,并且将代码审查直接引入到编程过程中。但是,由于结对编程人员对业务的熟悉程度趋于相同,因此其他代码审查中可能会陷入重复陷阱。与其他方法相比,结对编程在时间和人员也将花费更多的资源。

  • 线下审查
    线下审查就是我们多数情况使用的一种方法,对于大多数开发人员而言,比结对编程更舒适,线下代码审查是最简单和直观的方法。一旦代码准备好了,就可以找到一个合适的同事在电脑面前检查代码,同时向他们解释为什么编写代码的缘由。但是如果缺少跟踪问题和记录审查纪要的机制的话,效果会打折扣。

  • 辅助工具
    没有比使用基于软件的代码检查工具更简单,更有效的方法来检查代码了,其中一些基于浏览器或无缝集成在各种标准IDE和SCM开发框架中。软件工具解决了上述方法的许多局限性,以清晰一致的顺序跟踪审查人员的评论和对缺陷的建议解决方案,从而使审阅可以异步和非本地方式进行,并且当有新评论进入时发出通知,将其指向初始编码员,并确保整个过程高效进行,无需开会,也无需离开办公桌。一些工具还允许审核和修订需求文档,生成关键指标的统计信息,输出代码审查报告。

当然随着软件行业的迅速发展,通常我们也会结合以上多种方式进行代码审查。

6.4.2审查流程

以下是代码审查中遵循的过程:

  • 开发人员将向整个团队介绍业务用例

  • 将回顾实现业务用例所遵循的设计

  • 审查小组将讨论和审查为实现业务用例而编写的代码

  • 将测试用例与业务逻辑中实现的业务规则进行比较

  • 在代码演练期间,相关人员都有机会了解所实现的逻辑

  • 数据脚本团队展示针对业务用例编写的测试用例

  • 数据库团队将审查数据库依赖性、表结构,初始数据脚本,升级脚本

  • 发布工程团队将讨论和审查对部署脚本的依赖性

6.4.3审查步骤

  • 长度:限制单次审查代码的行数,通常是少于400行代码
    具体可以根据团队千行代码bug率进行调整,如果审查200行代码时代码率超过平均水平,则需要重新评估代码审查是否符合准入标准。

  • 速度:通常审查代码速度应低于500L/h
    合理数量的代码审查,在有限的时间内以较慢的速度进行,是最有效的代码审查.

  • 时间:单次代码审查时间不要超过60分钟
    当人们在一段时间内从事任何需要集中精力的活动时,性能会在大约60分钟后开始下降。研究表明,在一段时间内休息一下可以大大提高工作质量。进行更频繁的审查应该减少进行此长度审查的需要。

  • 目标:设定目标并获取指标
    在代码审查之前,团队应决定如何衡量同行评审的有效性并提出一些切实的目标。比如检验率,缺陷率,在指标驱动的代码审查中,工具会自动收集数据,然后输出的代码审查报告来揭示代码审查过程发现的问题。

  • 注释:作者应该在代码审查之前进行必要的源代码注释
    注释应针对其他代码审查者,用以简化流程并提供更多的上下文信息,方便阅读者把精力投放在核心的业务逻辑上面。

  • 清单:代码审查前列出待审查的相关文件清单
    清单是消除常见错误和应对遗漏查找挑战的最有效方法,确保审核过程不漏掉文件或者脚本。

  • 修复:建立修复发现缺陷的过程
    确保缺陷已修复的最佳方法是使用协作代码审阅工具,该工具使审阅者可以记录错误,与作者讨论错误并批准代码更改。如果没有自动化工具,则在审查中发现的错误可能不会记录在团队的常规缺陷跟踪系统中。

  • 文化:建立积极的代码审查文化
    小组成员评审会给人际团队关系带来压力,通常也很难让每个工作都受到同伴的批评,也很难让管理层评估和衡量代码中的缺陷密度。因此,为了使对等代码审查成功,管理人员在对等审查中营造协作和学习的文化非常重要。

7.代码集成

好了,经历完代码管理,编码规范和代码审查三部曲后,基本我们已经把技术这座高楼的地基砂石捋了一遍,牢牢的把握如何管理代码的艺术。但是随着技术的日新月异发展,旧的开发流程也不断在变更,从传统的软件开发流程到敏捷开发,还有最近几年的DevOps,慢慢过渡到面向未来架构的GitOps。尽管生产力工具在不断的变革,但是关于代码的朴素哲学思想却是坚如磐石,那就是在高效和稳定中寻找平衡点。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多