写代码如同打扫屋子,有句话叫一屋不扫何以扫天下。如果单个的一个模块代码都不能管好,如何成就一个完善的软件系统?

今天我们来说说,一个代码模块的代码是如何一步步腐化变质,到最后程序员都不愿意去维护它,然后要么重构,要么废弃换新模块的?

代码是有一定的周期的,这个没有错。为什么有的代码跑上几十年任然好用,而现在互联网公司的很多代码,每年都要做好几次重构?

一个成立2年的互联网公司,做一个支付系统,可以做了4-5代,每次重构,这样的代价有多大?

如何才能让原有的代码生命周期更加长,而不增加很多的学习维护成本,开发一次使用更久呢?

大部分程序员是没有很多机会从0开始搭建一个新程序的,更多的时候是接手别人写的代码。有代码移交还好一点,往往因为各种因素,这些因素你懂的,没有产品文档,没有设计文档,没有程序说明,程序里可能连注释都没有。

然后,程序员更新换代又极其的快,互联网时代,程序员在一个公司的平均年资也就1年多,程序就又被传给下一任维护者。

很大可能的情况是,最终到你手里的程序各种问题,却能实现基本的功能需求,但代码内部各种问题让程序员总有一个冲动,重构它。今天不想说重构的问题,而是从根源角度分析,程序为什么会变成这个样子?

一、什么是程序的腐化?

  什么是一个软件的质量?一个分类标准是软件外部质量与软件内部质量的统一,外部质量是对外表现是否正常,内部质量是对后续开发有没有坑,就是我在这里说的软件有没有腐化。

内部质量标准有:可维护性,灵活性,可移植性,可重用性,可测试性,可理解性(摘录自代码大全)。不符合以上标准都可以称之为代码腐化,形象的理解就是一个苹果,从内部开始烂了,烂到原本应该负责内部代码的程序员拒绝去维护了。

二、代码腐化的原因

  没有代码会是init commit的时候就开始腐化的,腐化都是循序渐进的,要一个过程。我总结了一些代码腐化的原因:

1、没有统一标准,或者没有严格执行

① 统一标准之代码规范

每个程序员都是有自己的审美的,例如即使是缩进长度这种代码里不影响任何功能的东西,有的喜欢空4格,有的喜欢2格。有的喜欢黑色的编程背景,有的喜欢白色的编程背景。有的喜欢if后直接跟上左括号,有的就喜欢另起一行。代码规范还是要有的,包含各种格式定义,大小写规范,命名规范等。

像Baidu,Google这样的公司还有构建时的自开发的检查工具,所以常常一个资深程序员第一次开发的代码要花上1-2天才能提交通过。

代码规范的混乱,直接导致代码可读性的降低。可读性直接影响后续的生产力。一个程序员天天对着看不顺眼的代码,怎么可能高效?

② 统一标准之基础规范

  除了代码规范外,项目命名,通讯方式,基本的程序框架,后端Java的springboot,sprintMVC,前端的angular,vue,react等都需要统一,还有统一的基础环境(eureka,elk,redis,apigateway等)。

不统一的后果是各种部署,管理,编码的低效。

例如搭一个jenkins,然后部署服务A用的Maven,服务B用的gradle,就导致编译代码写2套,如果写一套基本一样的,当然会快一些。

我统计的java代码中可以统一的部分(包含但不限于)Http调用格式,统一用content-type:application/json,response也统一要求这样。

例如标准的maven目录的结构:

  项目命名方式:com.(公司名).(开发组名).(系统名).(模块名)

例如:com.omniprimeinc.cosmetic.application.server;

③ 统一规范之公司统一框架

  刚才说的统一,很多是从公司层面的统一,如果大家都只用springboot,都沿用统一的后端框架,前端统一用angular。

那么这个时候,为了方便统一,就需要有代码相关的脚手架工具,直接生成基本的统一项。这样一个工具的好处是可以直接一键完成许多基础工作,并完成了底层的统一工作。

2、多头维护

  代码腐化的一个很重要的因素是多头维护,甚至是多代维护。一个公共项目,多个开发团队都在维护,那就很难统一标准。初始版本有一个架构,然后换了一个架构,开发更是换了几批。

人多手杂说的就是这样的情况。任何开发团队接手一个旧项目时,其实都是有学习和适应的成本的。频繁的变更开发人员带来的坏处就是反复的人为制造这个成本,其次就是有几率丢失之前的一部分标准和架构规划。

3、架构没有落地

  代码模块的功能设计规划,制定的标准,没有详细的落地。架构定了一套,开发没有严格执行。每天写代码这么忙,架构只管架构,不管细节。开发每天撸代码,只管功能,不管架构和代码质量(这个质量不是指功能实现上的质量,而是说严格执行各项统一标准的程度)。

甚至说,一个高层服务,不能调用同级服务,只能调用底层服务。因为开发的没有严格执行,甚至加了数据库连接,直接去取了数据库,这样的事一旦开了口子,就像黄河决堤,不可收拾了。

所以,以上说的是架构的落地落实很重要,让所有具体的开发参与者落实同一个标准。架构就需要落实相关的设计,相关的文档,相应的执行检查。

现实的情况从来没有靠文档解决一切问题的,可它能解决80%的问题,另外就尽量减少开发人员的变动,以减小换人带来的代码腐化问题。

三、防止代码腐化的建议:

✪ 代码规范标准化,统一化治理

  代码的内部质量其实很难保证,规范执行也更多的靠人治,甚至个别标准化的东西,只能通过代码层面去检验,无法通过测试或其他手段进行。

✪ 架构严格落地

  像前面说的标准,特别是自定义的标准,都需要落地。第一优先文档,第二是团队内部达成共识,第三是执行。

✪ 严格的codereview

  防代码的腐化执行是一个关键点,这个关键点就是codereview。在这个时间点,再次与开发强调标准的重要性,让开发知晓执行,让测试监督,让架构严格检查。对于不符合的,开发要再次去学习执行标准。

✪ 减少开发人员的变动

  如果一个团队内,原本标准就是统一的,团队内实行敏捷开发,任何一个开发都可以替代其他开发工作,那么两个人交换任务就没有问题。

如果团队内都不统一,这个变动就会严重影响开发,代码腐化的可能会变的很大。而团队间,标准统一的可能性比在团队内更难,要避免团队间的项目移交才是最优的方法。

✪ 代码模块架构Keep it Simple&Stupid,使用一眼就明白的架构

  现实世界中,业务需求永远的跑在技术需求前面,很可能架构相关的设计没有文档,没有说明,一旦架构师不在,原来的开发换人了,导致原先的标准和设计无法继续下去,一旦有交接,标准的丢失和架构的变化不可避免。这时,此条原则就能发挥作用。

  分层的概念很早就提出来了,为什么MVC的概念会这么受欢迎?我觉得是因为它足够傻瓜化。

✪ 定期清理维护

  如同像打扫房间一样,一段时间不打扫,自然会有边边角角的脏东西出来。那么有没有定期的去清理呢?还是不管他,每次看到地上的一团纸,都绕过,而不是去扔了?

定期的清理维护不单是一个维护代码的过程,更是一个重新梳理和统一标准的过程,让现有的开发和架构,再次的达成一致,以提高战斗力。

✪ 防止代码膨胀

  微服务概念的提出后,很好的解决了一个问题,我们的一个代码模块应该写多少大的问题?

一个模糊的建议是一个Sprint能重写的大小,如果更大,就应该要差分。有时候代码的清理维护工作也要以这个原则来处理,不能出现过大的代码模块。

因为过大的代码模块,首先带来的是程序的复杂度,让程序员理解起来要更多成本。其次,模块内部的耦合度必然也提高了,增加了难度。这时,需要的是切分出一个新模块出来。

四、总结

  代码腐化是程序开发的一个经典问题。代码内部质量的降低,外部质量确可以被客户接受。程序员经常想着,等业务没那么忙的时候,做点清理,做点模块局部的微重构。

我的经验告诉你,这些都是假的。

如果定下了定期清理,定期检查拆分,就必须立马去做。做这些事的优先级要远高于业务需求。 为什么呢?

想象一个程序C++的printf,里面的代码写的非常的烂,变量命名都是p,m,k完全不能直观理解含义,我们需要郑重的去处理这个模块的代码腐化问题吗?其实不需要,因为printf模块的代码需求,就是把输入的内容打印出来,永远都是这样,没有任何新需求,没有新需求就代表没有程序员需要深入内部去改它的代码,不需要改的代码,我们是没有动力去解决它的腐化问题的。

有必要经常深入解决腐化问题的代码,必然是业务需求很多,经常要变更的代码。不要等到它已经腐化到代码生命周期都快走到头了,才想起来去维护清理它,要经常维修一下,才能更好的让它发挥作用,不是吗?

最后,不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~

值得关注】我的 编程学习交流俱乐部  - 【点击进入】

程序也会过期,代码也会腐烂!建议这样做防止腐化!相关推荐

  1. lombok 生成代码_使用Project Lombok减少Java应用程序中的样板代码

    lombok 生成代码 对Java编程语言最常提出的批评之一是它需要大量的样板代码 . 对于简单的类尤其如此,该类只需要存储一些值就可以. 您需要这些值的getter和setter方法,也许您还需要一 ...

  2. 使用Project Lombok减少Java应用程序中的样板代码

    对Java编程语言最常提出的批评之一是它需要大量的样板代码 . 对于简单的类尤其如此,该类只需要存储一些值就可以. 您需要这些值的getter和setter,也许您还需要一个构造函数,覆盖equals ...

  3. 利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)

    作者 | Jose Garcia 译者 | 吴振东 校对 | 张一豪.林亦霖,编辑 | 于腾凯 来源 | 数据派(ID:datapi) 导读:本文将利用OpenCV,Python和Ubidots来编写 ...

  4. 中学再不学编程就晚了?MIT、JHU研究:程序员大脑思考代码的机制不对劲

    视学算法报道 转载自:机器之心 编辑:泽南.小舟 MIT.约翰霍普金斯大学的研究人员发现,思考编程并不像组织语言,但也不靠纯粹的逻辑.这是因为我们通常是在成年之后才开始学代码? 很多时候,我们认为优秀 ...

  5. 《编写高质量代码:改善c程序代码的125个建议》——建议3-5:避免使用浮点数作为循环计数器...

    本节书摘来自华章计算机<编写高质量代码:改善c程序代码的125个建议>一书中的第1章,建议3-5,作者:马 伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...

  6. 不发项目奖金,程序员怒删代码,被判 5 个月!

    整理 | 王晓曼 责编 | 伍杏玲 出品 | 程序人生 (ID:coder _life) 之前CSDN 报道过,一外国公司因缩减专利奖金,员工拒绝提交代码的故事:程序员怒了!你敢削减专利奖金,我敢拒绝 ...

  7. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...

  8. npm包管理机制引质疑:又一安装程序中发现恶意代码,开发者账户频遭劫持

    铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI npm行不行,包管理机制行不行? 最新的一次npm包被篡改事件,让开发者的这两个疑问更加强烈了. 最新中枪的是纯函数式编程语言Purescr ...

  9. 《编写高质量代码:改善c程序代码的125个建议》——建议2-6:防止无符号整数回绕...

    本节书摘来自华章计算机<编写高质量代码:改善c程序代码的125个建议>一书中的第1章,建议2-6,作者:马 伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...

最新文章

  1. python中的df是什么意思_在python中从df-h输出中选择特定列
  2. [翻译] Ruby Golf
  3. Carmaer 500W 逆变器初步测试
  4. centos 7 安装 mantisbt-2.12.0 —— 安装LAMP环境、安装mantisbt-2.12.0
  5. 成功解决Python中出现的TypeError: object of type 'zip' has no len()
  6. Python3 数字运算
  7. 一个微信公众号接入另一个微信公众号的内容
  8. MySQl Window Function Concepts
  9. Netty工作笔记0019---Selector API介绍
  10. 4.串口操作之API篇 CreateFile
  11. 矩阵的迹tr运算及矩阵求导公式
  12. 工频逆变器有哪些应用?工频逆变器、高频逆变器有何区别?
  13. cad lisp 管道截面_CAD计算材料截面特性插件-cad计算截面特性插件稳定免费版-东坡下载...
  14. 《炬丰科技-半导体工艺》衬底温度对ZnO薄膜的结构和光学特性的影响
  15. 恒流源驱动电路 随笔一
  16. 关于wireshark包体的中文解码
  17. 学习go语言的一些笔记(三)
  18. PCA主成分分析 提取主成分,过滤噪音
  19. 一个简简单单的许愿墙
  20. RB-tree性质理解

热门文章

  1. Centos 7开启3306端口
  2. 交通诱导信息发布系统服务器,高速公路交通诱导信息发布系统设计与实现
  3. 2006找工作总结 - 江苏移动zz
  4. android 实现View的背景色渐变动画
  5. 辨析|深度学习与机器学习的基本区别
  6. jquery如何设置占位隐藏_JQuery显示、隐藏div的几种方法简明总结
  7. UE5实现建筑剖切效果
  8. 第1周练习作业(java)
  9. 一名讲师讲述计算机专业的职业方向
  10. Streamsets 介绍