2个动作,让研发效率提升120%,代码减少50%

简介I0k每天发布大量与生活相关的资讯平台

本文以云智慧数字化运维数据平台DODB产品为例,由云智慧研发团队通过分析对比产品历史版本与新版本中的Java代码行数、Java文件个数、代码注释占比、发布包大小、组件依赖等关键数据,找寻出历史版本开发过程中存在的代码、项目管理及开发人员等方面问题,最终梳理总结出改造代码、制定规范等可提升研发效能的有效方法。I0k每天发布大量与生活相关的资讯平台

一、数据对比I0k每天发布大量与生活相关的资讯平台

通过下方图表数据可以看出,在新版本中,代码注释占比降低了近150%,项目分支数减少了近100%,其他各项数据也均有了明显的变化。I0k每天发布大量与生活相关的资讯平台

代码行数统计I0k每天发布大量与生活相关的资讯平台

过去

I0k每天发布大量与生活相关的资讯平台

现在

I0k每天发布大量与生活相关的资讯平台

代码注释比例I0k每天发布大量与生活相关的资讯平台

过去 现在

sonar扫描I0k每天发布大量与生活相关的资讯平台

过去

I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

展开全文
I0k每天发布大量与生活相关的资讯平台

现在

I0k每天发布大量与生活相关的资讯平台

数据汇总对比I0k每天发布大量与生活相关的资讯平台

指标 过去 现在 对比结果
项目module数量 12 8 减少33%
代码总行数 174252 136484 减少22%
Java代码行数 90310 50719 减少44%
Java文件个数 982 583 减少41%
代码注释占比 3% 7% 提升133%
sonar-bugs数量 92 0 减少100%
对外http接口数量 160 100 减少37.5%
对外dubbo接口数量 100 25 减少75%
发布包大小 226M 170M 减少25%
项目分支数 300(参考) 20 减少93%
写入性能(单条10K) 88W/min 187W/min 提升113%
组件依赖 ignite、vertx 删除ignite、vertx 5.3.1以redis替换ignite,彻底删除vertx
微服务 1 3 5.3.1支持服务以存储模块或者非存储模块独立运行
I0k每天发布大量与生活相关的资讯平台

通过上述各项数据的对比分析,本章节对历史版本开发中存在的代码、项目管理、开发人员等各方面问题进行了回顾分析,详细可查看下文:I0k每天发布大量与生活相关的资讯平台

代码侧问题I0k每天发布大量与生活相关的资讯平台

项目module数量多,部分不再使用的模块仍存在;I0k每天发布大量与生活相关的资讯平台

各module模块没有统一的包名区分,导致大量全限定名一致的类存在,加载顺序不一致引发各种问题;I0k每天发布大量与生活相关的资讯平台

项目中存在大量不再使用的代码块,增加了新人的学习成本及排查问题难度;例如dubbo接口,外部仅使用25个,对外提供了100个;I0k每天发布大量与生活相关的资讯平台

项目中重复代码较多,相似业务复制粘贴现象较严重,维护成本较高;I0k每天发布大量与生活相关的资讯平台

重复造轮子较多,如HttpclientUtil等;I0k每天发布大量与生活相关的资讯平台

注释率不够,大量代码无注释,无测试用例;I0k每天发布大量与生活相关的资讯平台

Vertx框架改造为SpringBoot容器不彻底,仍有众多Vertx逻辑和Springboot共存;I0k每天发布大量与生活相关的资讯平台

增加新模块需要写很多sql,需要手动编写Controller、Service、Dao层的“基础”代码;I0k每天发布大量与生活相关的资讯平台

项目依赖ignite组集群,导致服务是有状态的,大多人员对ignite不熟悉,导致解决问题较困难;I0k每天发布大量与生活相关的资讯平台

项目module数量多,部分不再使用的模块仍存在;I0k每天发布大量与生活相关的资讯平台

各module模块没有统一的包名区分,导致大量全限定名一致的类存在,加载顺序不一致引发各种问题;I0k每天发布大量与生活相关的资讯平台

项目中存在大量不再使用的代码块,增加了新人的学习成本及排查问题难度;例如dubbo接口,外部仅使用25个,对外提供了100个;I0k每天发布大量与生活相关的资讯平台

项目中重复代码较多,相似业务复制粘贴现象较严重,维护成本较高;I0k每天发布大量与生活相关的资讯平台

重复造轮子较多,如HttpclientUtil等;I0k每天发布大量与生活相关的资讯平台

注释率不够,大量代码无注释,无测试用例;I0k每天发布大量与生活相关的资讯平台

Vertx框架改造为SpringBoot容器不彻底,仍有众多Vertx逻辑和Springboot共存;I0k每天发布大量与生活相关的资讯平台

增加新模块需要写很多sql,需要手动编写Controller、Service、Dao层的“基础”代码;I0k每天发布大量与生活相关的资讯平台

项目依赖ignite组集群,导致服务是有状态的,大多人员对ignite不熟悉,导致解决问题较困难;I0k每天发布大量与生活相关的资讯平台

没有强有力的规范无法支撑更多的成员高效的协同开发;I0k每天发布大量与生活相关的资讯平台

分支管理无规范,导致分支数过多,活跃分支数量少,几百个分支维护困难;I0k每天发布大量与生活相关的资讯平台

以分支形式交付,交付后分支仍有提交,导致追踪发版版本困难;I0k每天发布大量与生活相关的资讯平台

无代码管理规范,多次出现功能遗漏、多功能等导致分支回退;I0k每天发布大量与生活相关的资讯平台

没有代码review制度,无法保障代码质量,冲突强行解决的问题时有发生;I0k每天发布大量与生活相关的资讯平台

没有强有力的规范无法支撑更多的成员高效的协同开发;I0k每天发布大量与生活相关的资讯平台

分支管理无规范,导致分支数过多,活跃分支数量少,几百个分支维护困难;I0k每天发布大量与生活相关的资讯平台

以分支形式交付,交付后分支仍有提交,导致追踪发版版本困难;I0k每天发布大量与生活相关的资讯平台

无代码管理规范,多次出现功能遗漏、多功能等导致分支回退;I0k每天发布大量与生活相关的资讯平台

没有代码review制度,无法保障代码质量,冲突强行解决的问题时有发生;I0k每天发布大量与生活相关的资讯平台

大多成员对代码不够熟悉,或仅熟悉部分代码;I0k每天发布大量与生活相关的资讯平台

很多成员不敢修改代码,更不敢删除代码;打着不影响其它功能的旗号,复制粘贴大量的重复代码和逻辑,导致维护困难;I0k每天发布大量与生活相关的资讯平台

早期代码设计较为合理,随着人员不断增加,很多代码重copy轻设计,只求完成功能,不考虑维护性拓展性,毫无设计可言;I0k每天发布大量与生活相关的资讯平台

部分人员git不熟练,导致强行覆盖远程分支的情况时有发生,无权限管控;I0k每天发布大量与生活相关的资讯平台

大多成员对代码不够熟悉,或仅熟悉部分代码;I0k每天发布大量与生活相关的资讯平台

很多成员不敢修改代码,更不敢删除代码;打着不影响其它功能的旗号,复制粘贴大量的重复代码和逻辑,导致维护困难;I0k每天发布大量与生活相关的资讯平台

早期代码设计较为合理,随着人员不断增加,很多代码重copy轻设计,只求完成功能,不考虑维护性拓展性,毫无设计可言;I0k每天发布大量与生活相关的资讯平台

部分人员git不熟练,导致强行覆盖远程分支的情况时有发生,无权限管控;I0k每天发布大量与生活相关的资讯平台

全限定名完全一致的类I0k每天发布大量与生活相关的资讯平台

全限定名完全一致的类I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

重复造轮子I0k每天发布大量与生活相关的资讯平台

重复造轮子I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

三、解决问题方案I0k每天发布大量与生活相关的资讯平台

为解决产品历史版本开发过程中存在的代码、项目管理等各方面问题,云智慧研发团队制定了开发、接口等相关规范;同时,通过限制代码仓库权限等其他操作也保证了规范的严格执行。I0k每天发布大量与生活相关的资讯平台

制定相关规范I0k每天发布大量与生活相关的资讯平台

无规矩不成方圆,切实可行的规范是保障团队战斗力的前提。规范制定应本着提高团队水平,又不限制成员积极性为目标。I0k每天发布大量与生活相关的资讯平台

开发规范I0k每天发布大量与生活相关的资讯平台

DODB接口规范I0k每天发布大量与生活相关的资讯平台

开发规范实行计划I0k每天发布大量与生活相关的资讯平台

DODB版本tag命名规范I0k每天发布大量与生活相关的资讯平台

开发设计模板I0k每天发布大量与生活相关的资讯平台

提测模板I0k每天发布大量与生活相关的资讯平台

会议规范I0k每天发布大量与生活相关的资讯平台

开发规范I0k每天发布大量与生活相关的资讯平台

DODB接口规范I0k每天发布大量与生活相关的资讯平台

开发规范实行计划I0k每天发布大量与生活相关的资讯平台

DODB版本tag命名规范I0k每天发布大量与生活相关的资讯平台

开发设计模板I0k每天发布大量与生活相关的资讯平台

提测模板I0k每天发布大量与生活相关的资讯平台

会议规范I0k每天发布大量与生活相关的资讯平台

工欲善其事必先利其器,规范里提供了相应的工具,用好可达到事半功倍的目的;同时有相关提交流程保障规范落地,不能让规范流于形式。I0k每天发布大量与生活相关的资讯平台

设置gitlab权限,保障强制代码review

禁止任何人向保护分支提交代码,必须走merge流程I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

merge列表界面I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

merge详情界面I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

完成后远程分支强制删除

I0k每天发布大量与生活相关的资讯平台

以tag追踪生产交付,要求测试交付时一定要有tag

I0k每天发布大量与生活相关的资讯平台

禁止删除tagI0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

标签tag列表I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

标签tag详情I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

四、如何对现有代码进行改造改造原则I0k每天发布大量与生活相关的资讯平台

不影响现有开发和交付进度,必须互不影响,类似于空中加油机,既要加油,飞机也不能停;I0k每天发布大量与生活相关的资讯平台

保证兼容性升级,改造后原有数据和业务不受影响;I0k每天发布大量与生活相关的资讯平台

对外接口(如dubbo)原则上不能修改,保证调用方功能正常,特殊情况可沟通配合(如dubbo方法重载必须修改);I0k每天发布大量与生活相关的资讯平台

不需要的代码一律删除,以后需要从历史版本找回,禁止批量注释掉代码;I0k每天发布大量与生活相关的资讯平台

代码设计要遵循 高内聚低耦合的原则,保证可重用性、移植性;I0k每天发布大量与生活相关的资讯平台

目标一致,改造循序渐进,保证充分测试。I0k每天发布大量与生活相关的资讯平台

不影响现有开发和交付进度,必须互不影响,类似于空中加油机,既要加油,飞机也不能停;I0k每天发布大量与生活相关的资讯平台

保证兼容性升级,改造后原有数据和业务不受影响;I0k每天发布大量与生活相关的资讯平台

对外接口(如dubbo)原则上不能修改,保证调用方功能正常,特殊情况可沟通配合(如dubbo方法重载必须修改);I0k每天发布大量与生活相关的资讯平台

不需要的代码一律删除,以后需要从历史版本找回,禁止批量注释掉代码;I0k每天发布大量与生活相关的资讯平台

代码设计要遵循 高内聚低耦合的原则,保证可重用性、移植性;I0k每天发布大量与生活相关的资讯平台

目标一致,改造循序渐进,保证充分测试。I0k每天发布大量与生活相关的资讯平台

对不再使用的代码直接删除,历史可在gitlog中查看,例如bdp-plugin-sdk、bdp-plugin-zabbix等模块直接删除;I0k每天发布大量与生活相关的资讯平台

集中解决重复造轮子的问题,对部分通用逻辑,如HttpClientUtils、db操作等使用已有工具类替换;I0k每天发布大量与生活相关的资讯平台

书写数据库代码繁琐,引入mybatis-plus操作mysqlI0k每天发布大量与生活相关的资讯平台

对不再使用的代码直接删除,历史可在gitlog中查看,例如bdp-plugin-sdk、bdp-plugin-zabbix等模块直接删除;I0k每天发布大量与生活相关的资讯平台

集中解决重复造轮子的问题,对部分通用逻辑,如HttpClientUtils、db操作等使用已有工具类替换;I0k每天发布大量与生活相关的资讯平台

书写数据库代码繁琐,引入mybatis-plus操作mysqlI0k每天发布大量与生活相关的资讯平台

<!-- mybatis-plus操作数据库 -->I0k每天发布大量与生活相关的资讯平台

<dependency>I0k每天发布大量与生活相关的资讯平台

<groupId>com.baomidou</groupId>I0k每天发布大量与生活相关的资讯平台

<artifactId>mybatis-plus</artifactId>I0k每天发布大量与生活相关的资讯平台

<version>${mybatis-plus.version}</version>I0k每天发布大量与生活相关的资讯平台

</dependency>I0k每天发布大量与生活相关的资讯平台

对外dubbo接口bdp-rpc和bdp-rpc-model合并为bdp-rpc-core对外提供,通过编译各调用方项目,删除未使用的接口 彻底删除vertx和ignite依赖

I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

对各module的功能和命名做了统一规范,对原有代码做统一修改调整

模块名称 功能 包名前缀
bdp-api Restful API和业务逻辑实现、只能被bdp-standalone依赖 com.cloudwise.bdp.api
bdp-base 业务对象和接口定义 com.cloudwise.bdp.base
bdp-commons 通用工具common util com.cloudwise.bdp.commons
bdp-pipeline pipeline数据处理实现 com.cloudwise.bdp.pipeline
bdp-rpc-core rpc接口声明及rpc实体类定义,不能依赖其它模块,对外rpc接口请慎重修改 com.cloudwise.bdp
bdp-standalone 主项目,DODB主入口类为DodbServiceApplication com.cloudwise.bdp.standalone
bdp-store-ck ClickHouse存取实现 com.cloudwise.bdp.store.ck
bdp-store-common 数据层存储接口声明 com.cloudwise.bdp.store.common
I0k每天发布大量与生活相关的资讯平台

调用gitlab-api对长期不活跃分支集中清理备份

/**I0k每天发布大量与生活相关的资讯平台

* github-apiI0k每天发布大量与生活相关的资讯平台

* https://github.com/help/api/api_resources.mdI0k每天发布大量与生活相关的资讯平台

*/I0k每天发布大量与生活相关的资讯平台

privatestaticfinal StringGITLAB_URL = "https://github.com/api/v4/projects/2393/repository";I0k每天发布大量与生活相关的资讯平台

privatestaticfinal StringPRIVATE_PARAM = "*****************";I0k每天发布大量与生活相关的资讯平台

/**I0k每天发布大量与生活相关的资讯平台

* 清理分支,已合并分支直接删除,其余删除前以tag形式备份I0k每天发布大量与生活相关的资讯平台

*/I0k每天发布大量与生活相关的资讯平台

@TestI0k每天发布大量与生活相关的资讯平台

publicvoidcleanBranches {I0k每天发布大量与生活相关的资讯平台

Map<String, Object> paramMap = Maps.newHashMap;I0k每天发布大量与生活相关的资讯平台

paramMap.put("private_token", PRIVATE_PARAM);I0k每天发布大量与生活相关的资讯平台

paramMap.put("per_page", 10086);I0k每天发布大量与生活相关的资讯平台

Stringbody = HttpUtil.get(GITLAB_URL + "/branches", paramMap);I0k每天发布大量与生活相关的资讯平台

List<Branche> branches = JSON.parseArray(body, Branche.class);I0k每天发布大量与生活相关的资讯平台

// 按最后一次提交时间由小到大排列I0k每天发布大量与生活相关的资讯平台

branches.sort(Comparator.comparingLong(o -> o.getCommit.getCommitted_date.getTime));I0k每天发布大量与生活相关的资讯平台

log.error("分支数量:{}", branches.size);I0k每天发布大量与生活相关的资讯平台

branches.forEach(item -> log.info("{}", item));I0k每天发布大量与生活相关的资讯平台

// 清理长期不活跃分支I0k每天发布大量与生活相关的资讯平台

.....I0k每天发布大量与生活相关的资讯平台

}I0k每天发布大量与生活相关的资讯平台

发布包进行瘦身I0k每天发布大量与生活相关的资讯平台

首先了解发布包是如何构建的,参看assembly.xml配置I0k每天发布大量与生活相关的资讯平台

发布包里有什么

I0k每天发布大量与生活相关的资讯平台

不要把配置文件重复打入jar包中

<plugin>I0k每天发布大量与生活相关的资讯平台

<groupId>org.apache.maven.plugins </groupId>I0k每天发布大量与生活相关的资讯平台

<artifactId>maven-jar-plugin </artifactId>I0k每天发布大量与生活相关的资讯平台

<configuration>I0k每天发布大量与生活相关的资讯平台

<includes>I0k每天发布大量与生活相关的资讯平台

<include>com/cloudwise/bdp/** </include>I0k每天发布大量与生活相关的资讯平台

</includes>I0k每天发布大量与生活相关的资讯平台

<archive>I0k每天发布大量与生活相关的资讯平台

<manifest>I0k每天发布大量与生活相关的资讯平台

<addClasspath>true </addClasspath>I0k每天发布大量与生活相关的资讯平台

<mainClass>${start-class} </mainClass>I0k每天发布大量与生活相关的资讯平台

<classpathPrefix>../lib/ </classpathPrefix>I0k每天发布大量与生活相关的资讯平台

</manifest>I0k每天发布大量与生活相关的资讯平台

</archive>I0k每天发布大量与生活相关的资讯平台

</configuration>I0k每天发布大量与生活相关的资讯平台

</plugin>I0k每天发布大量与生活相关的资讯平台

重点关注lib包,可从以下几个方面排查

重点关注过大的包是否是项目必须的I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

是否有重复依赖问题I0k每天发布大量与生活相关的资讯平台

*例如netty-all是众多netty-的合集,不要去重复依赖,如果版本不一致还会引发问题;I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

batik-all是batik-*的合集,排除各个子包I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

排查后通过相关插件追查依赖源,精确排除I0k每天发布大量与生活相关的资讯平台

<plugin>I0k每天发布大量与生活相关的资讯平台

<groupId>org.apache.maven.plugins </groupId>I0k每天发布大量与生活相关的资讯平台

<artifactId>maven-dependency-plugin </artifactId>I0k每天发布大量与生活相关的资讯平台

<version>${maven.dependency.version} </version>I0k每天发布大量与生活相关的资讯平台

</plugin>I0k每天发布大量与生活相关的资讯平台

1、开发人员应清楚依赖包是做什么的,不要不管三七二十一依赖一堆没用的包,无谓增加发布包大小,还会带来隐患;I0k每天发布大量与生活相关的资讯平台

2、代码审核时,依赖文件(maven工程的pom.xml文件)的修改需要重点关注,禁止随意引入和修改依赖;I0k每天发布大量与生活相关的资讯平台

3、各产品线可在统一各依赖版本的基础上,调整构建方式,大幅减小集成包的大小。I0k每天发布大量与生活相关的资讯平台

改造总结I0k每天发布大量与生活相关的资讯平台

优化不求一步到位,可逐步进行,目标明确即可; 复杂是一切问题的根源,能用一行代码解决的问题,就不用两行; 一切功能都是靠代码实现的,写好代码很重要,不能把写好代码当成一件小事,只是为了完成所需功能而堆砌代码很简单,但编写清晰易懂且能完成所需功能的代码并不简单; 你永远无法编写出“完美”的代码,要用工具和流程规范来保证这一切,要充分测试;

ENDI0k每天发布大量与生活相关的资讯平台

觉得不错,请点个在看I0k每天发布大量与生活相关的资讯平台

I0k每天发布大量与生活相关的资讯平台

也许你还喜欢

ups不间断电源原理分析

当前在电源市场上,所销售的电源类型较多,不同类型的电源,相应的功能与作用有所不同。在超

空间背景音乐怎么添加图文教程分享

怎样免费添加QQ空间背景音乐其实步骤也不多,很简单,主要有以下几个步骤,详情如下

万能转换器破解版怎么用?具体操作方

万能格式转换器是一款功能强大的格式转换软件,音频、视频、图片、光驱设备都可以通过万

rmvb转mp4格式转换器图文教程

在我们日常娱乐和日常工作中,现在网络上一些高清的视频一般都是rmvb格式的,而一些播放设

支付宝网络系统异常怎么解决

支付宝支付出现网络系统异常是因为IE浏览器设置Internet选项不恰当而导致的,去重新设置

win10蓝牙驱动破解版安装图文教程

win10蓝牙驱动怎么安装?请看下面具体操作方法。

微孔抛光镜面加工计数详解

一般来说,对于小孔微孔进行抛光,传统的加工方法可能会导致孔洞磨损,或者加工效果不理想。

短视频内容管理助手有哪些?怎么好用

随着短视频的普及,越来越多的人开始将大量的时间和精力投入到短视频的制作和分享中。因

模具设计学习知识分享

今天,我想谈谈我在模具设计CAD方面的一些心得体会。作为一个从事这个行业多年的工程师,

seo优化排名软件详细介绍

1. SEMrush SEMrush,一款广受好评的SEO神器,被誉为业内最佳的SEO分析工具。功能包括全