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

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

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

“撒娇”的豌豆荚?被百度手机助手屏蔽太糟心! 【工具推荐】Pgcli—自动完成和语法高亮的Postgres命令行工具 CES 2015:挑一款机器人带回家? 夜行、睡眠与健康:CES 2015十款酷炫的可穿戴产品 Java 9中新的货币API 唯“简”不破,Apple Watch App的设计之道 Google Glass从X labs“毕业”,更换项目负责人 不进化,则消亡——互联网时代企业管理的十项实践 RedMonk 2015年1月编程语言排行榜:进击的Swift! 微信开放JS SDK,这场web巨变意味着什么? 盘点一些iOS开发技巧:Swift和Objective-C 2014年,那些“颜值”爆表的UI动画 《近匠》爱加密:谁说iOS应用不需要保护? SwiftColorArt:开源易用的Swift图片类库 人气爆棚 干货满满 中国电信天翼开放平台开放日圆满落幕 必须Mark!43个优秀的Swift开源项目推荐 治拖延、疗懒癌!安利12款提高工作效率工具 把ES6带进Node社区 Io.js 1.0.0正式发布 Java 2014:10个最热门、最具争议性的话题 回顾:2014年最流行前端开发框架对比评测 实例讲解SQL注入攻击 调试大规模服务器集群的五大策略 .NET编译平台Rosly将迁移到Github Wasai虚拟现实头盔与体验馆发布:虚拟现实的线下经济 订票系统不再瘫痪 阿里云确认与12306合作 Apple前工程师Warren Moore:Swift中Metal使用初体验 手把手教学:详解Swift中的iOS设计模式 见微知著,那些触动人心的应用细节设计(一) 设计优秀API七大要诀 需求 细节 BI项目成功的五大要素 BI项目成功的五大要诀 一个applet的问题!70分,在线等待 当字段的值为null时,怎样获取? 向各路高手求助,哪里有novell网操作方面的书籍或者资料 ********很久没来这了,我今天升级两颗星啦,心情高兴,大散分啦!******** 哪里有比较好的网上书店?(计算机类) 请看这句有什么问题 dll的路径常识,大家帮我回答一下 在Web Forms里用Windows Forms控件 大家想一想! 在校程序员的困惑 要把服務器放在家里.現有條件:ADSL,LINUX 7.3,國際域名一個.可以嗎?還要什麼設置?thx 怎样消除11001#socket错误? 如何得到文件的长度,很简单的问题 脚本错误? 物化视图的数据整理问题 如何实现把一个BMP等比例缩放. 强烈建议版主封掉 theHanOfCC(我流) 的ID,他是一个人渣!! 同意的请进来签名!!! 在校程序员的困惑 有关PB数据窗口的检索参数 哪里有比较多的计算机书籍下载,请推荐几个。 急~~~高分求救~! 谢谢duduwolf,请来领分 类似这样的字符串“Thu Sep 5 14:05:56 2002”,怎么转化为Date对象? 安装问题,很简单,小弟菜鸟,望各位兄长多多关照啦!谢了! MDI窗口出错 新手请教。如何在cgi程序中得到由url传递过来的值 ISA 2K发布多个WEB 服务器问题,(我都要疯了) 我的xp怎么不能装vc6.0?再线等待!(20分) 急~~~高分求救~! 请教各位师兄。这个可以实现吗? 向高手请教(如何把客户端的图片传到服务器?) 各位大虾.水晶报表的关键一步了.实现了我就可以水晶报表的打印了! 急急!!!!怎样才能取得java函数传过来的参数呢? %%%%非高手勿進%%% CSDN有些人素质太差! IShellFolder::GetDisplayNameOf 如何获得全名? 代理Type分别为transparent,anonymous,high anonymity,优劣? 为感谢computersim在大力相助,特奉送100分,快来拿啊 请教网上书店系统的设计思想和例子。 VC中使用FLASH的OCX控件如何取得Movie的原始大小,且如何按指定比例缩放?问题解决后必给分。 有关“隐藏”,“覆盖”的一些问题: 如何把A库中A表原样复制到B库中去? 怎样取得鼠标点击DataGrid控件时是哪一行,哪一列呢?(C#) ISA 2K发布多个WEB 服务器问题,(我都要疯了)高分求救 这个问题怎么办?? (ADO OPEN) Up 有分! 母亲生日,你觉得送什么礼物为好? 用c++ 写的 hello 程序在unix g++ 编译通过后,运行出错 如下几个初级问题要问,高手们请进-> SQLSERVER高手进来聊聊........ 怎样用代码实现两台电脑之间的文件传输? 哪位知道Microsoft Firewall Client 的下载地址? 缩写下文(去掉定语从句、宾语从句、插入语) Self reflection means stopping the mad rush of activityand calming yourself and your mind so your brain can evaluate(评价) the input it has already received.Some people prefer to do th 心功能分几级,是如何分级的? 将0.1mol两种气态烃组成的混合气体完全燃烧后得3.36L(标准状况)CO2和3.6gH2O.下面说法正确的是?A.一定有烯烃B.一定有甲烷C.一定没有甲烷D.一定没有乙烷为什么?请写出完整的解题过程, 怎么写reflection 小石潭记中全石以为底,以什么意思 硝酸铵 是酸还是碱书上 问我 它是碱 还是盐。 请高手帮忙写几句类似rush to the dead summer的英文,谢谢.要求:每句话包括一个季节,句式最好和例句一样,谢谢大家了. 卷石底以出 (<小石潭记>) 以 有没有便携式硬度计啊,谁知道有这样的吗 解决中小企业融资难意义在于? 会车灯是什么灯? 小石潭记写石,写树各有什么特点? 昨天老师给那个男孩颁奖 英语翻译 必须有award 汽车车灯灯泡问题想换对灯泡,谁知道飞利浦的银战士好还是欧司朗的夜行者好啊?我不想换氙气灯! 在古文中,"卷石底以出" 的 "以" 2个氮原子2个氢气分子亚铁离子氢氧根离子+2价的钙元素五氧化二磷写上以上的化学符号 这个车灯符号是指什么灯?如题. 请问如何调整生物钟?是这样的,放了一个月的暑假,生物钟比平时晚了很多,每天都是半夜1.2点才睡得着,要睡到白天12才醒.快要开学了,请问怎样调整过来啊?急!平常是晚上11:30左右睡觉,早上6 氢氧根离子.2个氢分子.亚铁离子.+2价的钙元素用化学符号表示. 现在还有哪些汽车车灯是跳灯的?哪些车带前跳灯的汽车,最好是实用的汽车. 怎么调整生物钟工作原因 长达一年的时候都是晚上4点多只有睡 中午12点才起现在换了份工作 每天早上需要8点起 可是晚上基本都是2点才能正常入睡 第2天起来精神不佳 请问怎么样才可以调 根据自己的理解描述一下计算机操作系统的作用及其重要性. 除铁除锰对地下水处理超标的问题?大神们帮帮忙 怎样快速的调整生物钟? 我想自己录唱歌想找一个简单操作的,但处理声音也较好,有很多功能的软件,谁有? 车灯的灯泡一般在多少瓦之间? 纤维素、固醇、酶、DNA共有的元素是?A:C/H/O/N/PB:C/H/O/NC:C/H/OD:O/H 生命有多长 怎么调节水的PH值?用什么?我主要用于除铁除锰的水处理中 快速调整生物钟的办法 各种鱼类的英文名今天要和老外去日本餐厅.谁能告诉我各种常见鱼类的英文名谢谢 第三节 元素周期表的应用【填表格】 纤维素、酶、RNA、ATP 哪个不含氮元素谢谢了, 生命有多长啊 There __an NBA basketball game in ten minutes.为什么选will be不选is going to have? 怎么样调整生物钟暑假整个生物钟都乱了.晚上要12点多才睡得着.早上最早也九点多醒.我有试过早早醒,可到晚上还是睡不着.实在是太郁闷了,要怎么调整哦? 个人认为现在的中学英语教学有一点问题.我们知道了一大堆“高级词汇”,却对生活中常见事物不知其英文名.请提供尽可能多的鱼类动物的英文名. 第三节 元素周期表的应用【只填第一个表格】第一竖行第一个:F 第一竖行2个:CL 第一竖行3个:Br 第一竖行4个: I 中国历史的朝代更替示意图 生命到底有多长其实生命只在呼吸间 There ( ) an NBA basketball game in two minutes.A.will be B.is going to be为什么不选A?急,说明理由 1岁小孩锰元素高怎么回事 高手帮起个英文名~(和“鱼”谐音的)英文高手帮忙给起个英文名吧,要求要和瑜字谐音~~~~~ their team is going to have a game__________our team 中国历史上为什么总会有朝代更替?中国历史上为什么总会有朝代更替,并且总有一些人在朝代更替后希望恢复原来的朝代? 黄狐狸鱼英文名 求 一氧化氮中氮元素的化合价 小孩锰偏高怎么办?患者信息:女 3岁 广东 惠州 病情描述(发病时间、主要症状等):锰偏高.想得到怎样的帮助:锰偏高怎么办?曾经治疗情况及是否有过敏、遗传病史:无 有木有和鱼或者三月有关的英文名字~ 已知一氧化氮气体与二氧化氮气体含有相同质量的氮元素,则这两种气体的质量之比是多少? 锰元素多少超标 喝水为什么会打噶 无机盐分哪些种类?这些种类的作用分别是什么? cuo与cu 如何分离如何分离CUO与CU 要操作 试剂 和化学方程式除杂 KNO3中 有BA(NO3)2 怎么办? 等质量的二氧化碳和一氧化碳,则两者所含氧元素的质量比是________. 分钟线的种类与作用分别是什么?本人只想具体的了解一些技术,与具体股票无关,只想单纯满足下求知欲,不懂者请不要发言,否则举报!诚意求教!可以简单介绍下, Cu(I)的化合物一般呈无色或白色,为什么? Self reflection means stopping the mad rush of activity and calming yourself and your mind 汉语意思Self reflection means stopping the mad rush of activity and calming yourself and your mind so your brain can evaluate the input it has already rece 制冷压缩机的作用是什么,如何分类 高中烃中H质量分数计算
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘