防止代码变质的思考与方法

yuruky 2012-12-29 09:55:22
1、软件长期运营存在什么问题
一个大规模的客户端软件的生命周期中,我们可以把它分为两个比较粗的时期。一个是前期的搭建软件的时期,即从无到有的时期;第二个是搭建完成之后, 进入的一个稳定的运营时期。第二个时期才是最关键的,在这个时期我们会持续的迭加需求,持续的优化功能,而且第二个时期也是代码在慢慢变质的时期。
在这个时期,你可能会发现:我们的软件慢慢出现模块耦合严重,牵一发而动全身;每个版本都会涌现出老功能的BUG,你没动过的模块也会出BUG;或者改了一个小问题了,带出来很多其他问题;缺乏扩展性,往老模块加新功能非常痛苦;程序的崩溃率越来越高;新员工接手老模块经常不能理解原来的设计思想而改坏;移植一个DLL到另一个软件时,发现必须连带也移植十几个DLL。本文将分享对于这些问题的思考与方法。
2. 软件的积木模型
一个运营型的客户端软件,做出来就是为了长期运营,需要不断的迭加功能。而不是做出来,两三年就重写一次。那么这样一个软件就像堆积木一样。一个软 件刚开始写了两千行代码,感觉设计得非常好,模块化扩展性都非常好,性能也非常快,都能很好的面向运营。写了两三年之后,就会出现像这种积木一样的结构, 很容易崩塌。所谓重构,形象的说,可以看做是某个积木不稳定,要往里塞一塞。那么整个开发过程,就是一个不断迭代、不断优化、不断重构的过程。对于我们这个积木模形,有什么办法不让一些木条跑出来,这也是我们需要想的思路。我们是不是可以先围四面墙,然后在墙里面再去塔积木?

3. 导致代码变质的两大因素
团队中总是会存在这样那样的问题,这些问题最终总是影响到我们的代码朝着不良的方向发展。对于这些因素,我可以将它们抽象为两大类。一类是人的因素:比如架构设计不合理,需求没考虑清楚,项目进度压力,沟通问题,缺少文档、培训,等等。另一类是时间的因素:比如人员的变动,需求的长期迭加和变更, 等等。人的因素是由于人本身的素质或疏忽导致,时间因素是由于时间的长期推进导致,即使人的素质很高也必然会出现时间因素的问题。
4. 代码变乱的微观原因
在上述两大类因素的长期作用下,最终会导致代码越来越乱。如果从微观的角度来剖析,这跟依赖有着很大的关系。代码的变乱,根本原因就是由于太多不良依赖或者模块失去单一性所致。我们来看一下依赖是如何产生的。
1). 依赖的方式
如下图所示,如果组件A依赖于B,B依赖于C,A也是隐含的依赖于C的。组件A不能单独使用,必须同B和C一起使用。在现实的代码中,可能存在着非常长的依赖链。

依赖的方式也可能是多种多样的,单向依赖、双向依赖、环状依赖或者一个依赖于多个。下图也是一些示例,现实的代码中可能是由各种依赖方式组成的非常复杂的网状结构。

2). 依赖的变化
在两大类因素的作用下,依赖会发生变化。最常见的变化应该是依赖的箭头越来越多,网状结构变得越来越复杂。如果没有增加新的组件,下图中左边的图往 往会变成右边的图。起初设计好的很好的代码,可能是左边的样子,模块具有很好的独立性和可移植性。随着时间、需求、人的变化,很可能由开发人员很随意的一 行代码,就变成了右边的图,一条红线就出来了。两个模块变成相互依赖,上面那个模块就不再有独立性和可移值性。
我们的代码从设计之初到现在,中间经过了几年的时间,代码变得越来越乱很大的原因是因为这种红线的持续出现。本来有很多独立性很好的模块,变成了错综复杂的网状结构。

前面是没有引入新组件的情况,如果引入了新组件,必然会引入新的引赖,那么就要好好的去界定,引入的新组件是属于哪个层面的。像下面第一个图,新引入的组件依赖于原来两个组件是在最上层,第二个图新引入的组件是在中间层,第三个图新引入的组件被另外两个组件依赖在最底层。

引入新组件,其实应该做好充份的考虑,而不是让开发人员随意的引入。需要充份思考引入的新组件应该放在哪一层面才是最合理的,才有利于以后的扩展和移植。
可能读者会遇到这种情况,一个功能编译没有问题,测试也没有问题,发布后一两年也没有问题。当我们要把这个功能移植出来的时候,才发现问题大了。你想移植一个组件到另一个软件时,必须连带也移植十几个组件。

...全文
261 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
freeman_zxt 2013-01-10
  • 打赏
  • 举报
回复
说点个人体会, 在开发中,应重点考虑两点,一是可维护性,二是可读性, 这二点相辅相成, 用一个现在比较时髦的词,就是“可持续发展”。 一个函数三千行,那还有什么可读性,可维护性,别说让别人改,就是让原来写代码的人去改,都会出问题。
freeman_zxt 2013-01-10
  • 打赏
  • 举报
回复
每次修改BUG,每次添加新功能,都是一次很好的重构机会。 不能等到模块耦合严重了,缺乏扩展性了,再考虑重构,那时已经晚了。
yddd2011 2013-01-10
  • 打赏
  • 举报
回复
项目负责人垃圾,你想改都没有机会,多一事不如少一事。
赵4老师 2013-01-10
  • 打赏
  • 举报
回复
个人意见:重点不是函数有多少行;而是变量和函数命名与其对应的意义是否一目了然。
xiaoxiao8310 2013-01-09
  • 打赏
  • 举报
回复
我最近接手一个功能,一个函数快到三千行,直接崩溃。。。至于让我小改动啥,那真是步步谨慎,要不直接搞死。
jimette 2013-01-02
  • 打赏
  • 举报
回复
melos 2012-12-30
  • 打赏
  • 举报
回复
很好,很有同感
内容概要:本文档系统性地介绍了2024年最新提出的两种智能优化算法——青蒿素优化算法与霜冰优化算法(RIME)的原理、实现方法及其性能对比分析,并提供了完整的Matlab代码实现。文档不仅聚焦于核心算法的仿真与验证,还整合了大量前沿科研资源,涵盖微电网优化、风电功率预测、无人机三维路径规划、电动汽车调度、图像融合、负荷预测、通信信号处理、电力系统故障恢复等多个高价值应用场景。所有案例均基于Matlab/Simulink平台进行建模与仿真,强调算法在复杂工程系统中的实际应用能力,旨在为科研人员提供一套从理论到代码再到应用的完整复现体系。; 适合人群:具备一定编程基础和科研背景的研究生、高校教师及工程技术人员,尤其适合从事智能优化算法研究、新能源系统优化、自动化控制、电力系统调度、无人机导航与路径规划等相关领域的研究人员。; 使用场景及目标:①用于高水平学术论文的复现与创新性研究,提升科研效率与成果产出;②应用于复杂工程系统的建模仿真与智能优化设计,如多能互补系统调度、无人机避障路径规划、微电网能量管理等;③作为智能优化算法的教学与学习资料,深入理解现代元启发式算法的设计思想与实现机制。; 阅读建议:建议读者结合文档中提供的Matlab代码与Simulink仿真模型,按照目录结构循序渐进地学习与实践,优先选择与自身研究方向契合的案例进行代码复现,重点关注算法参数设置、收敛曲线分析与多算法对比实验部分,以全面提升算法应用与科研创新能力。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧