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

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

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

.NET开发者必备的工具箱 热情不减!七款Swift应用开源项目推荐 如何给苹果提交Bug或功能需求? 深入钻研Augular两年 谈谈其究竟适用于哪些场合 唐巧:谈谈React Native 在Swift中,如何更优雅地处理网络返回数据? Spark生态系统解析及基于Redis的开源分布式服务Codis 阿里巴巴技术专家杨晓明:基于Hadoop技术进行地理空间分析 Bowery为什么放弃Node.js,转向Go? 《近匠》有了APM,用户快到碗里来——专访听云CTO Wood 联通WO+梦工厂唐敏:走进厦门 构建移动数字生态 HTML5 VS 原生,世界究竟是谁的? 完全开放 微软开源.NET Core的执行引擎CoreCLR Swift与Objective-C的兼容“黑魔法”:@objc和Dynamic 网络技术,从“数制”开始学起——跟随王达老师一步步学习 UPYUN CTO黄慧攀:UPYUN这些年,一段“刚好”的旅程 2015移动游戏重中之重:需成功把握1%付费用户的心 UNITE 2015 BEIJING 20大议题首爆 死路一条?智能硬件免费没有未来 APICloud推出“模块 Store” 公布APP创业 “Time to Market”战略 极路由加入海尔U+联盟 可跨品牌控制多款家居设备 《近匠》Amaze UI:做最懂中国程序员的开源HTML5框架 Testin CTO徐琨:要做测试领域的阿里云! TIOBE 2015年2月编程语言排行榜:JavaScript排名达历史最高点 机智云发布第二代GoKit开发板,兼容Arduino与Intel Edison 计算机视觉,让冰冷的机器看懂这个多彩的世界 昔日学霸反哺教育 打造教育领域今日头条 第三方DevOps实践报告发布 84%中国企业预将受益 《程序员必读之软件架构》作者Simon Brown:架构师与程序员的区别 Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化? 应用生与死:移动测试究竟该怎么搞? 快!快快!!来拿分呀!!!!!!!!一个简单问题。 WIN98与WIN2000共享一个OFFICE 2000??? 在Servlet中如何使用JavaBean(调用其中的方法)?主要是格式!如果网上有这方面的资料也可以告诉我,我急用,不胜感激!40分送上!(只有这些了) 请问各位:怎样才能知道某一个进程所占用的cpu比例,mem大小? 请问在恢复sql 7.0一个数据库文件时,出现Error 3624:这是什么意思?? 关于程序员考试 哪位知道怎么一行一行地读取文本文件呀!!!! 谁知道的,来帮我一下——有关网页浏览计时的问题 如何将数字变为字符串格式化输出? Websphere下使用连接池的一些问题 TNMUDP问题:怎样才能知道RemoteHost连接失败 ? 算法请教,我要调整一副黑白数字图的浓度,我是用直方图的方法好呢,还是先转成HLS在转回来好?若都不对,应该怎么做? 如何 在ASP中用ping 一个小问题 请用javascript VC++6是98年才出来的,为什么没有最新的ADO原生驱动,而通过ODBC的话速度太慢; 多媒体 谁有MPEG-4的资料! 如何实现类似资源管理器的分隔条 我是菜鸟,请教各位GG,MM?????? 我的计算字段怎么老要计算,而且经常有死循环,到底该注意些什么,在哪里控制? 如何取消鼠标右键菜单和使shift功能键无效?(紧急) 一个非常非常简单的一个问题 如何安装Jbuilder 5.0 ? 多媒体技术 chr(176)有什么用? 如何将3DMAX图片在vb窗口中显示 各位大侠,怎样取得复合数据窗口里面的嵌套表的Label名。 一个关于访问数据库很菜的问题 请教小波分解与重构,模极大值算法。 哪儿能找到com.ms.xml.*包? 动态类型判别 是怎么实现的,谁有小型模拟代码? 让程序自启动都有哪几种方式呀!各位发表发表吧!!!! sqlserver恢复问题! 有关STL的文章! 很简单的问题,送份啦!!! 求一个字符在字符串中的位置!? ********DBGrid和ADO怎样连接********* 在JBuilder 5.0中,我打开一个单独的java文件,怎么编译和运行他?用命令行方式是可以的 简单问题,applet??? 都说抽象类不能实例化,可是请看下面例子:(请大虾们解释) 谁有Borland App Server 4.51 注册码? Oracle中的奇特问题 快告诉我,如何取本机的静态IP地址。 数据库问题?得分率120%。对大虾而言 请教一个VC中包含DLL的workspace中 Link的设定问题! 程序员考试的成绩什么时候出来????? ********VC提取系统字体名称,然后将字体名称存入文本文件********* 我想让托盘图标实现动画效果,请问,能不能直接用动画图标啊?能的话就省事多了? 急!急!急!在html网页中怎样判断用户点击的对象,并利用脚本改变他的属性?给50分,决不食言! 在SQL*PLUS下怎样查看一个字段的属性,如是某一个字段是否为主关键字 DB2新手问题 钟乳石和石笋是长时间在特定地质条件下形成的.它们的主要成分是什么? 11号到17号元素具有两性物质的化学式 水浒传中各个英雄的外貌描写的句子,是要句子,越多越好,最好全部 一年级的一个造句题爷爷给小树穿上暖和的衣裳.小树给爷爷撑开绿色的小伞.我给__________._____给__________. 化学中什么物质的化学式最具有代表性?就是说我要的这个物质化学式最能代表化学!一个典型的物质! 一辆长20米的货车和一辆长6米的汽车正以20m/s的速度一前一后在平直公路上匀速行驶,两车相距25米,现在汽车以0.5m/s^2的加速度超车,汽车超过货车30米后才从超车道进入行车道,求:①汽车超车 一道一年级造句题前提是:屋顶像_____________大地像_____________(不能重复) 初中化学中能不能从化学式中判定物质呈什么性NA2CO3 碳酸钠 呈碱性的,因为有碳酸,所以我总是认为是酸性,诸如此类的问题,让我很苦恼,. 一辆长20m的货车和一辆长6m的汽车正以20m/s的速度一前一后在平直公路上匀速行驶,俩车相距25m,现汽车以0.5m/s²的加速度超车,汽车超过货车30m后才从超车道进入行车道;(1)汽车超车所用 用仿佛……仿佛造句一年级 天然气化学式为(),具有()性 你妹妹最喜欢什么电视节目的英文 轿车上凸下平近似流线型的设计,使它行驶时,底部比顶部受到的气流的压强小这句话有什么错误 把句子写完整1;新房的客厅很大.2东方明珠电视塔很高 用英语写【你最喜欢的节目】这句话 物理小车实验让小车从斜面上滑下后沿水平面运动,是为了使小车在竖直方向上受到的?力和?力相平衡,其作用效果相互抵消,相当于小车只受水平方向上的阻力. 一辆值勤的警车停在公路旁,当警员发现从他旁边以v=8m/s的速度匀速行驶的货车有违章行为时,决定前去追赶经过2.5s,警车发动起来,以加速度a=2m/s做匀加速运动,试问:1、警车要追赶多长时间才 你最喜欢的电视节目是什么?英语 在光滑的水平面上有一平板小车,M正以速度v向右运动.现将一质量为m的小块无初速地放在小车上.由于木块和小车间的摩擦力的作用,小车的速度将发生变化.为使小车保持原来的运动速度不变, 照例句写句子例:烟台的海,是一幅画,是一道广阔的背景,是一座壮丽的舞台.秦始皇兵马俑,是( ),是( ),是( ). 氯化钠的化学式 质量为5000kg的汽车在t=0时刻速度为v0=10m/s,随后以p=60000w的额定功率沿平直公路继续前进,经72s达到最大速度,该车受恒定阻力,其大小为2500N.求:(1)汽车的最大速度Vm;(2)汽车在72s内经过的路程x 一辆值勤的警车停在公路边,当警员发现从他旁边以8m/s的速度匀速行驶的货车有违章行为时,决定前去追赶,经过2.5s警车发动起来,以0.5m/s2 的加速度匀加速运动.问: 1、警车要多长时间才能追 氯化钠 小车从斜坡下滑时,所做运动不是匀速直线运动.明显的,前半段速度没有后半段快.为什么后半段速度比前半段快? 写一个既是比喻句又是夸张句的句子 氯化钠的化学式是什么 今天晚上12点之前必须给我答案 一辆值勤的警车停在公路边.当警员发现从他旁边以v=8m/s的速度匀速行驶的货车有违章行为时,决定前去追赶若警车最大速度为16m/s,多长时间可以追上?题目中还有2.5s后汽车发动 把句子补充完整:电视塔附近生长着( ) ()但() 造句小学一年级语文 英语翻译There are eleven beautiful globes of different sizes from the green grassland to the blue sky with two large globes. 在下列句子中填上“站立”的近义词,不能重复 1 电视塔()在对面的小山上 2 远远望去,群山( ),连绵不绝 一辆小汽车五分之四小时行了32千米,照这样的速度,这辆车八分之十一小时可行多少千米 一辆值勤的警车停在公路旁,当警员发现从他旁边以v=15m/s的速度匀速行驶的货车有违章行为时……一辆值勤的警车停在公路旁,当警员发现从他旁边以v=15m/s的速度匀速行驶的货车有违章行为时 按要求改写句子(四年级上册基础训练)1.谁也没有想到,一个孩子竟有如此的胸怀.(改为反问句).2.中国的孩子怎么会缺少生活乐趣呢?(改为陈述句).3.人类靠现代科学技术呼风唤雨.(改 一辆小轿车5分之4小时行驶60千米,这辆小轿车1小时行驶( )千米;行驶1千米需要( )小时. 一辆值勤的警车停在公路边,当警员发现从他旁边以v=8m/s的速度匀速行始的货车有违章行为时,决定前去追...一辆值勤的警车停在公路边,当警员发现从他旁边以v=8m/s的速度匀速行始的货车有违 稀硫酸的化学式 钟乳石形成过程,用化学式表示 钠和硫酸铜反应的化学式 关于稀硫酸的化学式关于稀硫酸的;证明‘银粉’的成分是铝不是银.这句话怎么写化学式?急求. 喀斯特地貌与钟乳石有什么区别 钟乳石的形成如题 钠与硫酸铜反应蓝色沉淀中混有黑色沉淀,黑色沉淀是什么,为什么会生成黑色难容物? 钟乳石是怎么形成的 翻译一个句子:“他七点钟回家,然后看电视里的早间新闻”用英语表示 钠与硫酸铜溶液反应为什么不生成单质铜,也就是为什么Na先和水反应再和硫酸铜反应?既然是溶液就应该是均一稳定的,应该是同时遇到才对。 钟乳石像什么呀比喻句 英语翻译你在干什么?我在看电视.我的弟弟正在游泳池里游泳.凯特的表弟正在吃晚饭吗?是的.感谢你的来信和照片.他正在等公共汽车. 求水浒传中描写人物外貌的句子(要15个) 一辆小汽车迎面与一大货车相撞,请问两辆车产生的加速度是一样大吗(物理) 仿写句子,与读书和看电视有关如果把阅读比喻成细嚼慢咽的宴席,荧光幕前的观赏就是便捷的快餐,是可口的零食.一样是吃的享受,韵味却不相同. 水浒传中描写武松外貌的句子 一列货车以28.8km/h的速度在平直铁路上运行,由于失误,在后面600m处有一列快车以72km/h的速度向它靠近.快车司机发觉立即合上制动器,但快车要滑行2000m才停止.判断两车是否相撞.(写出计算过程) 把上面的两个句子合并成一个句子:妈妈叫我.我看电视. 急求水浒传里描写神态的句子1000字 钟乳石的主要成分是什么 “你好我在看电视那” 这句话我想用外语句子怎么写 水浒传外貌描写30句速求,
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn