如何防止代码腐烂

很多团队都有这个问题,一个项目的代码本来开始设计得好好的,一段时间以后,代码就会变得难以理解,难以维护,难以修改。为什么?我一直在思考这个问题。

  让我们先看一个人的情况。

  1. 程序员的成长

  新手的代码

  新手的代码没有经验,基本不考虑代码设计,代码规模稍稍大一点则自己就乱了。

如何防止代码腐烂

  进阶者的代码

如何防止代码腐烂

  小规模的时候

如何防止代码腐烂

  大规模的时候

  进阶者已经知道如何设计代码,懂得代码规则,但一般局限于一个模块。规模一大,模块间的调用就会比较混乱,难以维护。

  有经验者的代码

如何防止代码腐烂  有经验者的代码,模块内部代码整洁,模块之间层次清晰,有设计模式,有成熟的体系。可以保持长期的代码整洁。

  那么一个团队里面会出现什么情况呢?似乎,我们只要让一堆有经验的人来开发,那么代码必然不会出什么问题。可惜,事实不是这样。

  2. 背景

  代码风格的多样性

  有这样的。

如何防止代码腐烂  也有这样的

如何防止代码腐烂

  放眼一看,会发现不同的代码风格,不同的设计思想,不同的设计理念。每个程序员都有自己的代码个性。

如何防止代码腐烂

  团队层次的差异

  一个团队内部有新人,有熟手,有牛人。一个设计好的架构可能会变坏。

如何防止代码腐烂

  3. 原因

  风格的融合

  当程序员A和程序员B在一起的时候,会有如下变化

如何防止代码腐烂

  原本整洁的代码变得不整洁了。

  进度的压力

  进度导致了“飞线”的产生,未经设计的代码在时间的借口下产生了。

  多个人修改一个模块

如何防止代码腐烂

  4. 本质

  所有代码腐烂问题的本质是沟通问题。其表现又都可以统一为修改别人的代码。

  当一个程序员在没有沟通的情况下,修改另一个程序员的模块的代码的时候,他可能不理解此模块的设计思路,代码结构,逻辑结构,于是按自己的想法去修改,虽然看起来解决了眼前的问题。但是留下了一个不稳定因素。此因素可以通过重构来解决。但是,大家都非常的“忙”,谁也没有空时间去 Review 代码,去沟通我改了你的哪里的代码。所以不稳定的因素越来越多,导致了代码的腐烂。

  最快腐烂的代码,一定是很多人在修改的代码,相反,长期由一个人来维护的代码,就不会那么容易腐烂。因为一个人不存在沟通的问题,他修改代码的时候,明确的知道自己应该怎样去修改,怎样让代码更整洁。

  5. 解决

  就一个办法,多沟通。

  当你工作的时候需要修改别人的代码的时候,应该先找这个人沟通。说清楚需要改动的逻辑,然后尽量让他来修改。这样可以保证一块代码是由一个人维护,这样成本最少。

  如果此人真的太忙,没有时间,那么你必须说明你的计划,让他做一个建议,最好能让他给你讲讲此模块的设计思路,代码设计,逻辑设计,现在的问题,以后的计划。保证你修改的代码都是合理的。

  最理想的状态就是整个团队的思想是高度统一的,N个人可以像一个人那样去工作。这个需要团队长期的磨合。

  你可以会想到,我们制定一个规范不就可以了么?纸面上的规范通常是不起作用的,成功团队的规范是在整个团队达到一个很高的水平以后总结的经验。与其说执行规范,不如说是学习经验。MFC 的代码像是由一个人写出来的,Office 所有产品都像是一个人做出来的。这就是高度的统一。我们把微软的规范搬过来,不一定就有效果。

  代码的腐烂都是由于没有深入理解的情况下修改别人的代码导致的。

  总结一下:

  • 解决的方法就是任何修改之前确保经过深入的沟通。
  • 简单的规则是一个模块仅允许一个人维护。
  • 理想的状态是整个团队思想高度统一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git branch 分支

Git自学之路(四)- git branch 分支 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一…

大数据分析如何创建最佳的移动应用用户体验

2019独角兽企业重金招聘Python工程师标准>>> 如今,越来越多的人使用移动应用程序。而移动应用将在未来成为一个价值数十亿美元的产业。大数据可以帮助企业构建最佳的用户体验。 多年来,开发移动应用程序的技术一直在不断发展,这实…

Jstorm+Spring+mybatis整合

在现有的jstorm框架下,有一个需求:jstorm要对接mysql数据库的实时读取数据, 通过bolt处理,可能要调用service层的框架,最后保存到数据库。 在网上寻找了一下,发现storm集成spring的资料非常少,有…

上海云栖:金融政企行业的CDN最佳实践

2019独角兽企业重金招聘Python工程师标准>>> 摘要: 在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享,为上海的嘉宾介绍CDN的解决方案与技术服…

lunix基本命令

安装lunix 批量创建文件 whoami查看当前用户 sudo adduser lilei创建用户 groups lilei 查看用户所属用户组 sudo usermod -G root lilei 赋予root权限 sudo deluser lilei --remove-home ls -l 显示目录的文件 ls -a 显示隐藏文件 PWD 获取当前目录 cd .. 返回上层目录 cd 进入…

开启Swarm集群以及可视化管理

为什么80%的码农都做不了架构师?>>> 在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口同一个局域网内主服务器上安装Portainer容器安装Portainer容器执行: docker run -d -p 9000:9000 --restartalways …

python基本语法:序列

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 序列的基本操作: 2.用例: 3.序列包含字符串、元组、列表。

IMDb、烂番茄、MTC、各种电影行业评分名字整理

这篇不是技术文章,就是对总是看到但是不知道具体是什么的一些电影名词、评分、来源,学习一下。 IMDb 互联网电影资料库(Internet Movie Database,简称IMDb)是一个关于电影演员、电影、电视节目、电视明星和电影制作的在…

iOS应用:成功就像中彩票,大半开发者亏本

移动是座大金矿,从来都不乏一飞冲天的成功故事(Draw Something、愤怒的小鸟等)。但是大家往往只看到光鲜的一面,对于移动开发者来说,现实是残酷的,根据市场营销机构App Promo的一项调查,绝大多数…

python基本语法:元组

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 元组说明: 元组和列表类似,只不过元组和字符串一样是不可变的,即你不能修改元组。 元组通过圆括…

python基本语法:列表(列表和元组的区别)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.基本说明 2.用例: 3.列表类似于java中的list. 与元组不同,定义单个元素对象时不用加逗号,且元素值…

用JSONObject解析和处理json数据

本文中主要介绍JSONObject处理json数据时候的一些常用场景和方法。 (一)jar包下载 所需jar包打包下载百度网盘地址:https://pan.baidu.com/s/1c27Uyre(二)常见场景及处理方法 1、解析简单的json字符串:1  …

手机、平板、PC与智能电视实现数据大统一

进来,由 Ubuntu 手机原型设计引发的风波(数据大贯通),越演越烈,给人的感觉是“大雨欲来,风满楼”。这是什么事情呢? 根据4月12日透露出的一份Ubuntu手机的功能设计示意图,人们纷纷猜…

PL SQL导入导出sql/dmp文件

导出步骤:1、tools ->export user object (导出的是建表语句(包括存储结构),选择选项,导出.sql文件2、tools ->export tables-> SQL Inserts 选择选项导出指定某些表.sql文件按照如图所示的勾选,成…

Python 中使用help()命令后如何退出

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 如图在 help 界面时,想要回到原本书写界面,按 q 就可以了,网上也有的说可以 Ctrl d ---------…

轻松理解—继承成员访问控制机制

在我们学习面向对象程序设计的时候,那么这个继承成员访问控制机制您必须对其有深入的了解,达到熟练掌握的目的;要不也许这点知识你不过关,你对这点知识还抱着半信半疑的感觉,那么你一旦碰到这个问题,你的第…

iPhone iPad 各种控件默认高度

iPhone和iPad下各种常见控件的宽度和标准是一样的,所以这里就用iPhone说明。 以下是常见的几种控件的高度。Statusbar,Navigationbar和Tabbar的宽度极其图标大小。 下表是更为详细的参数,包括了Statusbar,Navigationbar、Tabbar、toolbar和Keyboard等等 …

Map.putAll方法——追加另一个Map对象到当前Map集合

该方法用来追加另一个Map对象到当前Map集合对象&#xff0c;它会把另一个Map集合对象中的所有内容添加到当前Map集合对象。 语法 putAll(Map<? extends K,? extends V> m) m&#xff1a;一个Map集合对象。 典型应用 本示例创建一个Map集合对象&#xff0c;为它添加一…

PLSQL的表窗口开启(不小心把PLSQL的表窗口关了,在哪里打开)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 菜单条---工具---浏览器。