阅读更多
随着时间的推移,软件项目会变得越来越大,项目中组件之间的依赖关系也会变得越来越错综复杂,项目的维护也会变得越来越困难。

Plumbr(Java内存泄露检测器)开发团队的一篇博文揭示他们这个项目在开发过程中,其代码复杂性是如何演变的。

本文中的这些代码依赖图是该团队在项目开发过程中使用Structure 101来生成的。通过Structure,开发者可以定义一个规则来约束代码之间的交互和依赖关系,从而简化开发和重构过程中的代码复杂度管理。但在Plumbr项目一开始,并没有使用Structure,只使用了其中的Restructure产品来可视化项目中的依赖。但在后面项目越做越大时,团队才开始考虑使用Structure。

Restructure使用如下两个指标来表示代码的质量:

  • Tangle(混乱度):用来表示代码构件(比如包、类)之间的关系是否错综复杂
  • Fat(肥胖度):用于表示单独的类、包是否庞大且杂乱
严格来说,并不是Tangle和Fat数值小就意味着你的代码库比较好。但是这两个指标确实能为你的代码优化工作带来一些帮助,比如规模较小的单个代码片(Fat数值小)更容易让人理解,依赖关系少(Tangle数值小)的代码更具可预测性,这样的代码中的bug就会更少,代码也更容易维护。

下面就来看看Plumbr项目代码的复杂性的演变。

故事始于2011年初,那时刚开始创建代码库。从下面的截图中可以看到,代码的Tangle数非常低(图左上角色谱中的小黑点),可以说这为将来的开发工作打下了一个坚实的基础。但实际情况是,项目团队仅仅只写了几千行源代码,还没来得及写更多东西。



但是只过了6个月,就呈现出了不同的画面。如下图所示,Fat数依然很低,但是依赖关系已经开始变得混乱(看小黑点的纵坐标轴)。



又过了6个月,可以看到项目代码Fat数依然很低,Tangle数依然很高。但是你可以看到一些包(allocation、io、lifecycle)现在已经从混乱的代码库中独立了出来。其实,该团队在这个时期的后段使用了Structure 101来管理代码。



又过了半年时间,事情似乎走向了极端。现在除了依赖关系异常混乱外,代码的Fat情况也相当严重。这时项目团队开始全面使用Structure 101产品来分析下面这张图片,并问自己一些有实际意义的问题,比如:

  • 为什么report代码要依赖一个引用包?
  • 为什么在文件系统工具和日志包之间有这么一个强周期性依赖?
当然,即使没有Structure 101这个工具,也应该问自己一些类似的问题。但不可否认,该工具对问题进行了可视化,对于优化代码有很大的帮助。



发现问题后,项目团队就开始采取措施进行优化。下面这张图片大约是半年前的,可以看到,所有添加的新代码已经变得整洁,比如同级组件(fs、http等)之间的依赖关系现在已经得到了改善。



下面这张图片是一周前的。虽然代码库比半年前增长了25%,但是Tangle数已经成功地从39,000减少到了16,000,代码变得更加整洁、结构更加自然了。另外,项目团队的开发水平也有了一定的提高。



结论

项目代码复杂性的管理要贯穿项目始终,这样到项目后期,维护起来也不会特别困难。或者你可以制定一些依赖规则,然后在开发过程中强制执行。

这个故事是一个很好的样本,展示了一个小团队如何在一个相对短的时间内创建一个混乱的代码库。你也可以设想一下,如果一个10人开发团队开发一个预期寿命为10年的项目,最终的项目依赖关系图会是什么样的呢?

英文原文:Managing code complexity
  • 大小: 151 KB
  • 大小: 224.4 KB
  • 大小: 235.4 KB
  • 大小: 280 KB
  • 大小: 405.4 KB
  • 大小: 361.3 KB
5
2
评论 共 8 条 请登录后发表评论
8 楼 damoqiongqiu 2013-08-05 14:13
确实是个好东西
7 楼 amonlei 2013-08-05 05:43
重构!!!!前提是有足够多的单元测试用例覆盖
6 楼 dwangel 2013-08-02 16:00
好东西,但是要花钱
5 楼 laoji 2013-07-31 23:24
laoji 写道
extjhyh 写道
学习了

谢谢,不错

真的不错,好文章
4 楼 laoji 2013-07-31 23:23
extjhyh 写道
学习了

谢谢,不错
3 楼 heqishan 2013-07-31 21:06
Structure 101 是收费的。。。。
2 楼 ahack 2013-07-31 13:28
试用了下非常不错
1 楼 414149609 2013-07-30 23:42
我们都用eclipse的osgi来管理他们的依赖关系

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 系统性能优化的十大策略(强烈推荐,建议收藏)

    分为上中下三篇,由浅及深的写了关于性能优化的方方面面,并不仅仅局限于代码层面,希望小伙伴们能有所收获。引言:取与舍软件设计开发某种意义上是“取”与“舍”的艺术。关于性能方面,就像建筑设计成抗震9度需要...

  • 什么是低代码(Low-Code)?

    本文总结了低代码领域的基本概念、核心价值与行业现状,带你全面了解低代码。 前言 如果选择用一个关键词来代表即将过去的 2020 年,我相信所有人都会认同是“新冠”。疫情来得太快就像龙卷风,短短数月就阻断了全...

  • 【技术积累】随着用户量日益倍增,服务端的技术架构改进方案

    当然,引入更多组件同时会提高系统的复杂度,不同的组件保存的数据需要同步,需要考虑一致性的问题,需要有更多的运维手段来管理这些组件等。 “ 引入更多组件解决了丰富的需求,业务维度能够极大扩充,随之而来的...

  • 麻雀算法的微电网优化调度附matlab代码

    随着能源需求的不断增长和传统能源资源的日益稀缺,微电网作为一种新型的能源供应和管理系统,正在受到越来越多的关注。微电网是由多种分布式能源资源(如太阳能、风能、储能等)组成的小型电网,可以独立运行并与主...

  • 万字长文科普:什么是低代码?

    一 、 前言在后疫情时代,究竟需要什么样的新技术,才能真正解放IT生产力,加速社会数字化转型,Make The World Great Again?我认为是低代码(Low-Code)。基于...

  • 后端接口性能优化分析-多线程优化

    其原因最根本的还是,每次数据库请求都会引入额外的网络开销和数据库连接管理开销,如果多次,性能会有一定的折扣,但是实际上批量查询并不像传的那么神,也会存在潜在的风险,比如说,可能会引入内存占用过高的问题...

  • 这10种神级性能优化手段,你用过几个?

    常见的有这几类问题,我们分别来看每种对应的解决方案: 针对前端、客户端的启动优化或首屏优化:代码和数据等资源的延时加载、分批加载、后台异步加载、或按需懒加载等等。 背压控制 - 限流、节流、去抖等等。...

  • 什么是低代码平台 low-code?

    简介:什么是低代码?我们为什么需要低代码?低代码会让程序员失业吗?本文总结了低代码领域的基本概念、核心价值与行业现状,带你全面了解低代码。 一 前言 如果选择用一个关键词来代表即将过去的2020年,我相信...

  • Zabbix 数据中心管理系统的架构设计理念、自动化技术实现、监控配置模板的应用方式、架构规模优化

    其中有些事件对大型数据中心运营和管理系统带来了巨大的挑战。网络设备故障、人员伤亡、供应商变化、软件更新等使得现有的大数据中心管理系统面临着难以克服的复杂性,而相应的管理人员也面临着极其艰苦的工作负担。...

  • 聊聊代码提交那些事

    为何要聊“代码提交”这么小的一件事情?随着团队人数越来越多,提交代码这件事,变得复杂起来。甚至极端一点说,任何复杂度的软件项目,也无非是要管好两件事情:需求和代码。

  • 基于SDN网络的优化技术和QoS研究分析(二)

    目前SDN网络性能优化可按照体系架构层面大致划分为控制平面的优化技术和数据平面的数据转发性能优化技术。 3.1 SDN控制平面的优化技术 控制平面是整个SDN体系结构的控制中心,负责维护全网状态信息,生成全网视图...

  • Linux进程调度策略的发展和演变--Linux进程的管理与调度(十六)

    日期 内核版本 ... Linux进程管理与调度 1 前言1.1 进程调度内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来.调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创

  • 性能优化的十种手段

    作者写了上中下三篇,由浅入深的写了关于性能优化的方方面面,并不仅仅局限于代码层面。我看了之后还是很有收获的,同时也惊叹于作者扎实的技术能力与思考能力。于是借花献佛,把作者的三篇整理合并之后分享给大家。...

  • 无线电能传输中电动汽车充电的Matlab与Maxwell仿真:线圈结构与补偿拓扑优化

    内容概要:本文详细介绍了无线电能传输技术在电动汽车充电中的应用,特别是在Matlab和Maxwell中的仿真过程。首先讨论了SS补偿拓扑的Matlab仿真,展示了如何设置线圈参数、进行谐振匹配以及通过相量分析判断软开关状态。接着探讨了Maxwell中DD线圈的3D电磁场仿真,强调了自定义网格划分和涡流场计算的重要性。随后,文章深入研究了多线圈阵列仿真,揭示了不同线圈布局对耦合系数的影响,并提出了LCC补偿拓扑的应用。此外,文中还分享了许多实用技巧,如避免常见错误、优化仿真参数以及处理实际测试中的问题。 适合人群:从事无线电能传输研究的技术人员、研究生及以上学历的研究人员。 使用场景及目标:适用于需要深入了解无线电能传输技术及其仿真的研究人员和技术开发者,旨在帮助他们掌握Matlab和Maxwell的具体应用,提高仿真精度和效率。 其他说明:文章不仅提供了详细的代码示例和仿真步骤,还分享了作者的实际经验和教训,使读者能够更好地理解和应对仿真过程中遇到的问题。

  • 用户增删改查功能的前端页面,添加了vue渲染代码

    用户增删改查功能的前端页面,添加了vue渲染代码。

  • 计算机课程设计相关资源

    计算机课程设计相关资源

  • 基于51单片机protues仿真的猜数字游戏(仿真图、源代码、AD原理图、流程图)

    基于51单片机protues仿真的猜数字游戏(仿真图、源代码、AD原理图、流程图) 猜数字游戏 1、通过随机数实现该游戏; 2、按下K1键启动游戏并随机生成一个0~9的数字 3、通过矩阵按键输入你的数字,输入数字小于随机生成的数字则显示小于该数,大于的时候显示大于该数,直到相等为止。 4、仿真图、源代码、AD原理图、流程图;

  • 基于MATLAB的FOC滑膜观测器与锁相环(MATLAB 2021b)实现及硬件移植注意事项

    内容概要:本文详细介绍了利用MATLAB 2021b搭建的FOC滑膜观测器(SMO)与锁相环(PLL)的仿真模型及其在M4硬件平台上的实现方法。文中首先展示了SMO的核心代码,解释了如何通过滑模面计算和符号函数处理来估算反电动势,并讨论了PLL用于速度提取的具体实现。接着探讨了仿真环境中直接0速闭环启动的效果以及实际硬件实现时所需的开环启动策略。此外,文章还分享了多个调试过程中遇到的问题及解决方案,如相位跳变、高频振荡、电流环参数调整等。 适合人群:从事电机控制研究的技术人员,尤其是对无感FOC感兴趣的工程师。 使用场景及目标:适用于希望深入了解FOC滑膜观测器和锁相环的工作原理并尝试将其应用于实际项目的开发者。目标是掌握SMO+PLL组合的设计思路和技术细节,同时了解硬件移植时需要注意的实际问题。 其他说明:文中提供了大量实用的代码片段和调试经验,对于想要快速入门或优化现有系统的读者非常有帮助。特别强调了仿真与现实之间的差异,提醒读者注意参数选择和滤波器设计等方面的不同之处。

  • 汽车美容员工手册.doc

    汽车美容员工手册.doc

Global site tag (gtag.js) - Google Analytics