限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410

  1. class Foo {


  2. boolean foo() {


  3. ...


  4. }


  5. }

那么最好通过加一个过渡模块来实现:

  1. class FooAdaptor {


  2.     private Foo foo;


  3.     boolean foo() {


  4. return foo.foo().isEmpty();


  5.     }


  6. }

这样做的好处是修改函数时不需要改动所有调用方,烂代码的特征之一就是模块间的耦合比较高,往往一个函数有几十处调用,牵一发而动全身。而一旦开始全面改造,往往就会把一次看起来很简单的重构演变成几周的大工程,这种大规模重构往往是不可靠的。

每次模块级别的重构都需要精心设计,提前划分好哪些是需要修改的,哪些是需要用兼容逻辑做过渡的。但实际动手修改的时间都不应该超过一天,如果超过一天就意味着这次重构改动太多,需要控制一下修改节奏了。

1.2.4.工程级别的重构不能和其他任务并行

不安全的重构相对而言影响范围比较大,比如:

我更建议这类操作不要用IDE,如果使用IDE,也只使用最简单的“移动”操作。这类重构单元测试已经完全没有作用,需要集成测试的覆盖。不过也不必紧张,如果只做“移动”的话,大部分情况下基本的冒烟测试就可以保证重构的正确性。

这类重构的目的是根据代码的层次或者类型进行拆分,切断循环依赖和结构上不合理的地方。如果不知道如何拆分,可以依照如下思路:

优先按部署场景进行拆分,比如一部分代码是公用的,一部分代码是自己用的,可以考虑拆成两个部分。换句话说,A服务的修改能不能影响B服务。

其次按照业务类型拆分,两个无关的功能可以拆分成两个部分。换句话说,A功能的修改能不能影响B功能。

除此之外,尽量控制自己的代码洁癖,不要把代码切成一大堆豆腐块,会给日后的维护工作带来很多不必要的成本。

案可以提前review几次,多参考一线工程师的意见,避免实际动手时才冒出新的问题。

而这类重构绝对不能跟正常的需求开发并行执行:代码冲突几乎无法避免,并且会让所有人崩溃。我的做法一般是在这类重构前先演练一次:把模块按大致的想法拖来拖去,通过编译器找到依赖问题,在日常上线中把容易处理的依赖问题解决掉;然后集中团队里的精英,通知所有人暂停开发,花最多2、3天时间把所有问题集中突击掉,新的需求都在新代码的基础上进行开发。

如果历史包袱实在太重,可以把这类重构也拆成几次做:先大体拆分成几块,再分别拆分。无论如何,这类重构务必控制好变更范围,一次严重的合并冲突有可能让团队中的所有人几个周缓不过劲来。

1.3.重构的周期

典型的重构周期类似下面的过程:

在正常需求开发的同时进行模块内部的重构,同时理解工程原有代码。

在需求间隙进行模块级别的重构,把大模块拆分为多个小模块,增加脚手架类,补充单元测试,等等。

(如果有必要,比如工程过于巨大导致经常出现相互影响问题)进行一次工程级别的拆分,期间需要暂停所有开发工作,并且这次重构除了移动模块和移动模块带来的修改之外不做任何其他变更。

重复1、2步骤

1.3.1.一些重构的tips

只重构经常修改的部分,如果代码一两年都没有修改过,那么说明改动的收益很小,重构能改善的只是可维护性,重构不维护的代码不会带来收益。

抑制住自己想要多改一点的冲动,一次失败的重构对代码质量改进的影响可能是毁灭性的。

重构需要不断的练习,相比于写代码来说,重构或许更难一些。

重构可能需要很长时间,有可能甚至会达到几年的程度(我之前用断断续续两年多的时间重构了一个项目),主要取决于团队对于风险的容忍程度。

删除无用代码是提高代码可维护性最有效的方式,切记,切记。

单元测试是重构的基础,如果对单元测试的概念还不是很清晰,可以参考使用Spock框架进行单元测试。

2.改善性能与健壮性2.1.改善性能的80%

性能这个话题越来越多的被人提起,随便收到一份简历不写上点什么熟悉高并发、做过性能优化之类的似乎都不好意思跟人打招呼。

说个真事,几年前在我做某公司的ERP项目,里面有个功能是生成一个报表。而使用我们系统的公司里有一个人,他每天要在下班前点一下报表,导出到excel,再发一封邮件出去。

问题是,那个报表每次都要2,3分钟才能生成。

excel每次打开都要配置进度_excel打开时配置进度

我当时正年轻气盛,看到有个两分钟才能生成的报表一下就来了兴趣,翻出了那段不知道谁写的代码,发现里面用了3层循环,每次都会去数据库查一次数据,再把一堆数据拼起来,一股脑塞进一个tableview里。

面对这种代码,我还能做什么呢?

做了这些之后,界面只需要不到1s就能展示出来了,不过我要说的不是这个。

后来我去客户公司给那个操作员演示新的模块的时候,点一下,刷,数据出来了。那个人很惊恐的看着我,然后问我,是不是数据不准了。

再后来,我又加了一个功能,那个模块每次打开之后都会显示一个进度条,上面的标题是“正在校验数据……”,进度条走完大概要1分钟左右,我跟那人说校验数据计算量很大,会比较慢。当然,实际上那60秒里程序毛事都没做,只是在一点点的更新那个进度条(我还做了个彩蛋,在读进度的时候按上上下下左右左右BABA的话就可以加速10倍读条…)。客户很开心,说感觉数据准确多了,当然,他没发现彩蛋。

我写了这么多,是想让你明白一个事实:大部分程序对性能并不敏感。而少数对性能敏感的程序里,一大半可以靠调节参数解决性能问题;最后那一小撮需要修改代码优化性能的程序里,性价比高的工作又是少数。

什么是性价比?回到刚才的例子里,我做了那么多事,每件事的收益是多少?

我现在遇到的很多面试者说程序优化时总是喜欢说一些玄乎的东西:调用栈、尾递归、内联函数、GC调优……但是当我问他们:把一个普通函数改成内联函数是把原来运行速度是多少的程序优化成多少了,却很少有人答出来;或者是扭扭捏捏的说,应该很多,因为这个函数会被调用很多遍。我再问会被调用多少遍,每遍是多长时间,就答不上来了。

所以关于性能优化,我有两个观点:

优化主要部分,把一次网络IO改为内存计算带来的收益远大于捯饬编译器优化之类的东西。这部分内容可以参考Numbers you should know;或者自己写一个for循环,做一个无限i++的程序,看看一秒钟i能累加多少次,感受一下cpu和内存的性能。

性能优化之后要有量化数据,明确的说出优化后哪个指标提升了多少。如果有人因为”提升性能“之类的理由写了一堆让人无法理解的代码,请务必让他给出性能数据:这很有可能是一坨没有什么收益的烂代码。

至于具体的优化措施,无外乎几类:

让计算靠近存储

优化算法的时间复杂度

减少无用的操作

并行计算

关于性能优化的话题还可以讲很多内容,不过对于这篇文章来说有点跑题,这里就不再详细展开了。

2.2.决定健壮性的20%

前一阵听一个技术分享,说是他们在编程的时候要考虑太阳黑子对cpu计算的影响,或者是农民伯伯的猪把基站拱塌了之类的特殊场景。如果要优化程序的健壮性,那么有时候就不得不去考虑这些极端情况对程序的影响。

大部分的人应该不用考虑太阳黑子之类的高深的问题,但是我们需要考虑一些常见的特殊场景,大部分程序员的代码对于一些特殊场景都会有或多或少考虑不周全的地方excel每次打开都要配置进度,例如:

excel每次打开都要配置进度_excel打开时配置进度

常规的方法确实能够发现代码中的一些bug,但是到了复杂的生产环境中时,总会出现一些完全没有想到的问题。虽然我也想了很久,遗憾的是,对于健壮性来说,我并没有找到什么立竿见影的解决方案,因此,我只能谨慎的提出一点点建议:

3.改善生存环境

看了上面的那么多东西之后,你可以想一下这么个场景:

在你做了很多事情之后,代码质量似乎有了质的飞跃。正当你以为终于可以摆脱天天踩屎的日子了的时候,某次不小心瞥见某个类又长到几千行了。

你愤怒的翻看提交日志,想找出罪魁祸首是谁,结果却发现每天都会有人往文件里提交那么十几二十行代码,每次的改动看起来都没什么问题,但是日积月累,一年年过去,当初花了九牛二虎之力重构的工程又成了一坨烂代码……

任何一个对代码有追求的程序员都有可能遇到这种问题,技术在更新,需求在变化,公司人员会流动,而代码质量总会在不经意间偷偷的变差……

想要改善代码质量,最后往往就会变成改善生存环境。

3.1.1.统一环境

团队需要一套统一的编码规范、统一的语言版本、统一的编辑器配置、统一的文件编码excel每次打开都要配置进度,如果有条件最好能使用统一的操作系统,这能避免很多无意义的工作。

就好像最近渣浪给开发全部换成了统一的macbook,一夜之间以前的很多问题都变得不是问题了:字符集、换行符、IDE之类的问题只要一个配置文件就解决了,不再有各种稀奇古怪的代码冲突或者不兼容的问题,也不会有人突然提交上来一些编码格式稀奇古怪的文件了。

3.1.2.代码仓库

代码仓库基本上已经是每个公司的标配,而现在的代码仓库除了储存代码,还可以承担一些团队沟通、代码review甚至工作流程方面的任务,如今这类开源的系统很多,像gitlab(github)、Phabricator这类优秀的工具都能让代码管理变得简单很多。我这里无意讨论svn、git、hg还是什么其它的代码管理工具更好,就算最近火热的git在复杂性和集中化管理上也有一些问题,其实我是比较期待能有替代git的工具产生的,扯远了。

代码仓库的意义在于让更多的人能够获得和修改代码,从而提高代码的生命周期,而代码本身的生命周期足够持久,对代码质量做的优化才有意义。

限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410