前言
在 2019年第五届 Gopher China 大会上,百度资深研发工程师陈肖楠进行了主题为《百度APP Go语言实践》的演讲,以下为演讲实录。
No.0
简介
我来自百度APP平台部,主要负责公司内规范建立和系统工具的开发。首先我将介绍一下我们公司的开发规范,然后针对这个规范,介绍我们在Go语言体系建设所做的工作;再针对这些体系建设,对其中三个项目展开详细的介绍。
这个是今天分享的大纲,主要分为以下四个部分:
Go开发规范
Go语言体系
依赖管理
代码检查
No.1
Go 开发规范
首先看一下我们公司的开发规范,上面这张图是从我们公司的一个项目中截出来的,我们公司每个项目都有这个图,我们称它为工程能力地图。这个图包含整个项目开发的所有阶段:需求、开发、代码准入、测试和上线验证五个阶段,每一个阶段下面的方框代表我们公司针对这个阶段所做的规范和标准,颜色代表这些项目在这些规范方面的得分,颜色越深代表规范遵循的越好,颜色越浅代表规范遵循的越不好。
这个规范目的是为了评价我们项目的质量,每一个规范都有对应分数和权重,我们以遵循的程度计算出一个分数,作为工程能力得分,分数越高表明项目质量越好,反之则差。那可能有人会问了,规范这么多会不会非常影响开发效率?我想这是肯定的,不过我们公司是比较注重质量的,质量跟效率之间本来有一个矛盾,但是我们会在保证质量的前提下,尽量提高开发效率,针对每一个规范我们都有对应的系统,或者是工具帮我们自动化完成一些工作。
Go语言在我们公司内相对而言是发展比较晚的,对我们来说还是一门比较新的语言。所以Go语言在这些规范过程当中有很多东西是缺失的。因此我们在做Go项目开发过程中,很多东西我们是没有办法做的。这就导致我们在做Go语言开发过程中质量和效率都没法得到很好的保证,这也是之前Go语言在我们公司内发展相对比较慢的原因。
下面我讲的就是我们团队针对这些规范所做的一些工作,也就是Go语言体系建设。下面这张图是我们目前在Go体系建设方面所做的一些工作,还包括这些工作在我们整个业务、系统当中他是处于什么样的位置。
首先看中间这一块,首先是一个接入层,然后到业务层,业务开发需要由我们公司统一的开发框架支持。而且我们的业务将会与我们公司内部的基础服务进行交互。图的右边是我们一个规范与模式。我们公司针对每一个语言都有一个语言的规范委员会,其主要的目的是来推进语言的编程规范。我们Go语言也有相应的编程委员会,给我们制定了代码的编写规范,这些规范包括一些社区的开源规范,也包括我们公司内部做得更详细、更严格的一些规范。
除了这个代码的编写规范,在实际业务开发过程中,我们还发现项目代码的组织方式和引用相对来说比较混乱,所以我们制定了代码组织和引用的指南,帮助大家规范这些代码整个开发的布局。
既然制定了规范,那我们就要遵循,否则这些规范就变成一纸空文,没有任何约束力。为了让我们规范落地,我们开发了每个语言都有的代码检查工具和工程效率工具,能够帮我们快速建立我们一个Go语言的应用,帮我们查找Bug提升开发效率;第二是依赖管理工具,解决代码相互之间的依赖,以及公司内部对于外部开源代码管理依赖问题;测试框架就是刚才Dave讲的,我们公司对于每一个项目单元测试覆盖率也要求,强制我们写测试,而且大家写单元测试的时候可能发现写业务的代码的时间还没有我写单元测试的时间长,所以单元测试本身非常耗时,于是我们就想把单元测试统一写法,或者自动生成测试,就像刚才Dave说的怎么写比较好,我们通过框架自动形成测试单元,这样既提高我们的工作效率,又使测试能够规范化。
这就是目前我们在Go语言体系建设方面做的或者正在做的工作。后面我针对这些工作当中比较重点的三个项目给大家做一下介绍,包括我们的开发框架、依赖管理以及代码检查。