说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何管理和优化日益增长的代码复杂度?

HTML文档下载 WORD文档下载 PDF文档下载
随着时间的推移,软件项目会变得越来越大,项目中组件之间的依赖关系也会变得越来越错综复杂。那么如何对代码的复杂度进行管理并优化呢?Plumbr项目团队的做法或许可以为你提供一些参考。

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

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代码要依赖一个引用包?
  • 为什么在文件系统工具和日志包之间有这么一个强周期性依赖?

当然,即使没有Structure101这个工具,也应该问自己一些类似的问题。但不可否认,该工具对问题进行了可视化,对于优化代码有很大的帮助。


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


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


结论

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

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

英文原文:Managing code complexity

[CTO俱乐部第103期] 高德和四维图新技术高管谈地图导航的发展与挑战 Java 7爆最新漏洞,10年前的攻击手法仍有效 Twitter联合创始人Biz Stone谈Facebook用户体验 提倡零广告 英雄会:企业的人才漏斗 开发者的武林大会 一次错误估算带来的启示 苹果开发者中心被黑:开发者信息或被窃取 SIM卡加密存漏洞 将影响数亿计的手机用户 搜狗茹立云:探索引擎产品落地 浏览器+搜索模式会成主流吗? 大势所趋,IBM Acme Air至少使用Netflix的5个开源工具 【观察】跨越“朦胧期”的云计算:产业、核心技术、生态圈以及突破点 Rovio Account:平台化之路修成正果 甲骨文总裁马克•赫德采访实录:用软硬件集成一体机打垮对手 如何一步一步打造高可扩展性的应用程序? 用Java编程,请保持简洁! 从安全隐患带来的商机来看,Hadoop同样很美 三年增四倍:如今谷歌服务占北美互联网流量四分之一 决战低功耗?Intel明年推低功耗Xeon处理器 在软件架构上增加新功能的注意事项 90后的代码界“女神”李雪:在编程中找到自己的“灵魂” 大数据之路不乏荆棘,然则其中的机遇却高于一切 iPhone销量令人意外:苹果Q3财季净利69亿美元 同比下滑 励志:12位早起的IT大佬们让小伙伴们都惊呆了 独家:苹果5周年限免神作,BADLAND开发者访谈 10亿次订阅!苹果Podcast的里程碑 免费利器Unity 4.2正式发布 支持WP8、Win8和BB10 SDCC 2013:Pinterest首位中国籍工程师两场演讲议题确定 甲骨文公布中国首届“Duke选择奖”名单 Moco、X幻想、开源中国获奖 直接拿来用,10个PHP代码片段 编程的未来 数据将成为主角 OpenCL 2.0发布,带来更强悍的异构计算能力 代码审查方式大调查 辅助工具居首(信息图) 高分获取sql server相关资料的网站/电子书等 Going to die ActiveForm程序如何得到参数? The Glass Eye sqlserver+asp如何实现图像的存储和显示? Just plain stupid 关于main(int argc,char *argv[]) helpme 如何对vb源代码加密 讨论,关于Swing做的Applet! SUN前途堪忧! explorer007(KKcat):麻烦一下,请把你写的游戏TANK的源代码给我发一份(lyf545@263.net),谢谢!!!! sql server中删除一条记录不成功!? Bad Dream about a Coffin 我要用delphi作个学生管理系统,大家给点意见 有声卡,为何没有声音,具体操作如何?一定加分!!!! What a country ! 交流交流多线程程序的开发经验好吗? 谁有关于ejb方面的书或者资料推荐??一定给分 Women over 50 谁编个例程给我,这50分就是谁的了。题目不难,相信高手5分钟就能做完。 jdk1.3+jswdk1.0.1 的JAVAbeans .class文件要放哪啊????? God painted it 提问:猪真的很幸福吗?要求 wywq(幸福如猪) 回答。 哪位高手做过可视电话的? VB能不能实现“一个结构体类型的数组当参数传递 Forgotten Birthd Husbands Overheard Fine 有个在多线程中使用ADO的问题。请高手们帮忙。 Suede jacket 可能是installshield的Bug! 我想去北京找个工作,请大家帮帮忙,提供点信息! 装了“猫”为何还有630错误(电话线也接了)? excel 問題 各位:数据窗口有一检索变量,现在想retrieve出所有的记录,检索变量应该怎样赋值?谢谢! linux和windows是不是只能分别装在两个分区中 关于图像处理:如何使图像锐化与柔化? 帮帮我啦! 我在使用jdbc读取数据的时候,碰到了内存溢出的问题,怎么回事呀 哪里有餐饮系统的介绍?90不够的话,先欠着,多谢了! 在两个ASP程序之间怎么传递参数? ccl2000(不帅不酷的Goblin):其实你真的很酷很帅的。 大侠帮帮我啦(关于SQL语句的问题) 关于Vxd的编译问题 用VC编的程序,一运行就说“执行非法操作”,问题出在哪里?? SQL Server有病 一个关于api的简单问题 《易佳自定义报表》用后很失望 请教各位高手一个有关报表控件的问题? 小妹向大家请教!可不可以直接在本页的代码中改变该页面浏览时的属性? 家菲猫:惊悉你昨晚惨遭不幸,被窃大量钱物,今日一天无法和你联系上,估计手机和通信录已全部丢失,如果今晚无法来我处,明早8点以前请务必携猫 MM 赶到上海南站!!! MDI文档模板和应用程序调用问题请教,大侠请进! 现有一堆土豆,要测量它的密度.工具材料有:一个弹簧测力计,一团细线,一把厘米刻度尺和菜刀.现在请利用以上材料测出土豆的密度. 怎样快捷焊修燃油箱防止油箱爆炸? 同一主族的元素,原子半径与单质的熔沸点成正比, 一个弹簧测力计,一团线,一把厘米刻度尺和菜刀.利用这些工具测出土豆的密度(步骤,计算公式) 油箱长3.6米宽0.1米油的密度是0.85怎么去算油箱的容量和每0.1米油箱的容量 对于同一周期的主族元素,单质的熔沸点逐渐升高,请举例说明! 只有一个弹簧测力计,一团细线,一把厘米刻度尺和菜刀,怎么测土豆的密度? 油罐着火在什么情况下会爆炸? 非金属的气态氢化物的热稳定性和熔、沸点分别与什么有关? 密度为0.82的酒精配制步骤我需要配制密度为0.82的酒精该如何配制,具体步骤是怎么样的呀, 子弹内部是靠什么爆炸的不会是TNT吧,这种东西好象爆炸时没有烟,这种东西可以拿什么替换(可以通过合法渠道搞到的象汽油这种易燃易爆品)要成分状的 非金属氢化物的熔沸点越高,是不是可以说其越稳定?非金属氢化物的稳定性与什么有关? 自制葡萄酒前期酒精发酵动力不足,有什么办法可以激活酒精发酵 弹药爆炎弹二次爆炸什么意思怪是不是会受到两次攻击比如打下去100点伤害,然后有爆炸又100点伤害{我说的是增加的那百分之65攻击}具体点, 氢化物沸点 稳定性与金属性 非金属性的关系 自制葡萄酒必须两次发酵吗,只发酵一次可以吗? 子弹撞击子弹会爆炸吗?我们都知道当两辆车的时速都很快的时候 撞击在一起 汽车便会产生惊人的爆炸力 但那里头毕竟有发动机 石油 这些易燃的东西 如果是两颗子弹相撞呢?是否也会爆炸 单质熔沸点的高低怎么比较?规律 自制葡萄酒 二次发酵要不要密封?上个月21号做的,今天刚把渣滤掉.现在分装在几个洋酒瓶中,是塑料螺旋盖的,请问要不要拧紧? 子弹为什么可以爆炸啊? 元素周期表熔沸点的递变规律同一个主族是什么变化的?同一个周期是怎么变化的?我记得有一个主族熔沸点是先增大后减小,有吗?最好能给出图答的好可以再加分 油罐上为什么要装呼吸阀? 子弹焚烧时会不会爆炸 怎么从元素周期表中看氧化物熔沸点的大小 油罐呼吸阀日常检查和维护应注意哪些问题,怎样检查其是否正常工作? 子弹的燃烧爆炸需要外界的氧气参与吗?1,子弹内部火药燃烧是与(氧气反应)还是和(氧化剂反应的)?2,这些氧气或氧化剂来自哪里或储存在哪里?因害怕摆渡不给显示分白扔, 求元素的,半径大小,还原性,氧化性,熔沸点在化学元素周期表规律如题 油罐呼吸阀多少钱一只 子弹爆炸我有两颗未爆炸的实弹,在什么情况下会爆炸?很怕有意外 物体的熔沸点在元素周期表的规律是什么?说的简单些,我是高一的,告诉我规律就行了,不用说那种很难懂的定理的 油罐呼吸阀里加什么液体啊 “拆下轴承,浸在柴油或汽油中彻底清洗后,再用干净汽油清洗一遍,要注意哪些问题 元素氢化物的稳定性,沸点,还原性,酸碱性在元素周期表内呈现怎样的递变规律请帮我归纳下我还会加分 储存汽油和柴油的储存油罐怎么辨别油罐的质量,是否合格不泄油? 能用汽油洗轴承吗?我的悠悠球是天马神弓,正想洗洗轴承(因为睡眠时间才30秒)我一个朋友说可以用汽油来洗轴承的。我想知道的有以下几点。1、可以用汽油洗轴承吗?2、洗了以后会生 非金属氢化物稳定性与熔沸点有无关系 汽油密度,柴油密度,原油密度有相应的国家规定吗?不同标号汽油,不同号的柴油, 悠悠球可以用汽油洗轴承吗?怎么洗?雪鳞锋洗了有什么好处 比较两相邻元素的非金属性强弱可否用氢化物的沸点来判断?注意是相邻的两个元素 测量一种矿石的密度.现有器材小矿石块;天平【含砝码】;一个烧杯;足量的水;细线量筒是两种,还要比较可操作性或误差 在柴油库里面打电话,会不会发生爆炸.听说打电话会产生静电,油库容易着火,我们的是柴油库 汽油比柴油更容易着燃,为什么汽油机还需要点火? 测土豆密度.材料有一个弹簧测力计一团细线一把厘米刻度尺和菜刀1写出该实验步骤2土豆密度的计算公式3讨论:在密度的测定实践中,影响测定的主要因素有哪些? 静电引起燃烧爆炸的条件是什么? 柴油冻结是什么原因? 如和用量筒.刻度尺.小 刀.水桶.烧杯.水测土豆的密度 房间里突然爆炸,所有设备正常,只有静电爆炸的可能,请问什么能引起静电爆炸? 怎么分辨柴油型号有没有什么测量仪器?请各位高手给予解答!万分着急 谢谢了 用弹簧测力计,一团细线,一把厘米刻度尺和菜刀怎样测出土豆的密度谢谢 氧气有一定的压力,在有静电的情况下会爆炸吗.氧压机不漏油.阀门之间没有装防静电的东西.放空阀是开着的.准备去开出口阀时发生了爆炸.现场阀门烧的变形.他按照正常的操作开的.我同事 不同型号的柴油能不能混合使用 现有天平(含砝码)、量筒、烧杯、足量的水、小刀、细线和土豆,请从中分别选取适当的器材,设计两种测定现有天平(含砝码)、量筒、烧杯、足量的水、小刀、细线和土豆,请从中分别 一定空间,柴油燃烧为什么会爆炸是不是燃烧的气体无法散去,从而产生膨胀? 在元素周期表里,怎么判断熔沸点高低. 马铃薯的密度 电子油箱里的@怎摸写出来 元素周期表中单质熔沸点变化规律氢化物熔沸点变化规律 用一个弹簧测力计,一团细丝,一把厘米刻度尺和菜刀测土豆的密度.1.写出实验步骤2.土豆密度的计算公式3.在密度的测定实验中,影响测定准确性的主要因素有哪些?好的大大地加分! 汽车中油箱的结构组成是怎样的? 元素周期表中元素单质熔沸点规律.说明白点.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn