一个软件工程师的反思:关于重构

重构是什么?

重构,简单地说就是,在不改变软件的外在功能的情况下,对其内部结构做出调整,使其更容易理解、维护,调整和优化软件结构。

有个地方要特别注意,它和另外两种软件改动行为,性能优化和软件重写是不一样的。

所谓性能优化,就是指增强或者改善的功能,比如说提高系统的响应速度,减少系统占用的存储空间,既然提升了,改善了,就不叫“外在功能没改变”;不同于 软件重写,所谓重写就是抛弃原来的代码,另起炉灶。

因为重构,指的是在原有基础上做出调整和部分改写。不管是指对某个部分还是系统整体,重写都是“在废墟上堆建新城”,而重构则是“缝缝补补又三年”。

为什么重构?

不同的人,对重构的期望值是不一样的,各人有各人的的侧重点。而在那么多支持重构的理由中,其实归结起来就一点:代码难以理解,接手代码的人甚至是代码原作者都难以继续维护下去,消除BUG或者是新增功能。

而重构通过以下的一些手段,可以在很大程度上改观这种情况:

1.消除重复,重复是代码的大敌,重复不仅造成繁琐臃肿,浪费资源,更会造成修改不一致,容易出现错漏;

2.使代码,尤其是接口和结构梳理清晰,而清晰的代码更容易理解,也更容易定位BUG,找到合适的添加新功能的地方。

重构与我

我知道重构这个概念,应该和大多数人一样,源于 Martin Follwer的一本书 《重构:改善既有代码的技术》。

以后,如无特别注明,Martin Follwer 简称 MF。

我2011年毕业开始工作,第一家公司非常小,员工其实只有两人,而单片机下位机部分实际上是我一个人独立完成。那时候的我,C语法尚未纯熟,写程序更没章法可言,while(1)之类的东西...如今会被我痛骂,但这种事那时候我也是干得出来的。

那份工作,做了两年,实际上就只做了那么一个项目,整份代码从零开始,最后总共大概20K行,就单片机C部分而言,算是中等规模项目。如前所述,因为当时写程序毫无章法,而老板在这方面也差不多,谈不上什么指导,所以最后这20K行很是换乱,BUG越来越难,增加功能也越来越慢,维护地十分艰难。

另一个同事和我是一个学院毕业的,他和我当时半斤八两,所以也说不上什么交流,讨论,相互提高。进入职场的头两年,就是在这样的环境里度过。没有人可以告诉你其实代码应该这样写,你哪里错了,一切全凭自己领悟,自然是非常地苦逼,也非常地非主流。

所以,完全可以想象我第一次阅读这本书时的激动心情,就像武侠小说里那些被逼上绝路,突然喜获一本武功秘籍的情形。

但以那时候我的经验和能力,其实是完全驾驭不了的。所以在囫囵吞枣地读了几本关于软件开发思想(涉及 TDD、敏捷、极限编程)的书以后,激动兴奋了好一阵子后,并没有什么卵用,原来怎样写现在还怎样写,没有半点提高。

不仅如此,这些看起来很好很强大的思想,非但没有帮助,反而如同武侠小说里的 走火入魔——真正是各种杂七杂八的思想,方法,如同几道真气在体内乱窜。

这其中是有好些原因的:

1.工作/应用领域不一样:我是 单片机/C,大多数时候是 无OS裸机系统。而这些书绝大多数是java/C++,大多数应用是 windows/linux或者web应用。

而那时候的我,缺乏经验,也远没到能借他山之石可以攻玉的地步,因此,尽管我能大致看懂他们在说什么,但很难产生更多共鸣,难以模仿、照搬他们的解决方案和思路。

2.强调测试,尤其是更密集的单元测试,速度更快的自动测试。

说起来,测试桩,测试驱动(即对被测试内容的主调环境),以及利用数据模拟外设,这些思路和方法,我都是很清楚的。

但是,我却很少有足够的耐心和勇气,真的在我的工作代码里,花本来就已经很紧急的工作时限,去添加各种测试代码。

与其说我懒惰,不如说我不知道应该怎么去实际应用。看起来很美好,但落地却困难重重。

3.心理上过于希望,这些是万灵丹,能包治百病

我过于希望,重构(还有敏捷,极限编程等)会是一个解决这些问题的灵丹妙药,我没有过多考虑它的使用条件,副作用等等。但大师们早已告诉过我们:

软件界,没有银弹。

如果这句话,我们东方人不太好理解,那我翻译一下就是:

软件界,没有包治百病的万灵丹。

关于“银弹”这个说法,我个人的理解是,在西方传说里,吸血鬼是一种如同我们文化里鬼魂或者僵尸一样普遍的鬼魅存在,传说中,吸血鬼刀枪不入,唯独,怕银制的武器,比如银制的子弹,所以才有银弹一说。

4.我在试图做这些事情的时候,过于鲁莽,急躁

如同下面的统计和分析,重构不仅不是万灵丹,它更有其自身的不足和缺陷,然而,在我没有足够经验的情况下,又过于鲁莽、武断地试图去模仿这些工作,以至于画虎不成反类犬。甚至惹了不少麻烦(下面我即将写到我最近的一次尴尬经历)。

同时,又因为身边始终缺乏良好的沟通(后面我逐渐跳到开发人员更多的公司,然而我发现,似乎这方面的讨论一直都很困难)。

一方面,没有良好的沟通,一方面我又没有令人信服的实践和能力,因此,这件事情更加难往下做。我只好像地下党一样潜入地下,“偷偷摸摸”地做着我认为对的事情。但实际上这更加糟糕,它只会让我更加地鲁莽和急躁,而这是不可能把事情做好的。

以上种种,导致我最终

实际上,并没有真正了解太多重构这件事本身,在实施的过程也是非常的非主流,就像武侠片里那些上不得台面的无名小卒,即无法与人进行更多讨论,及时纠正自己,又深深希望重构能拯救人生,最终,就落得如此的尴尬场面。

(0)

相关推荐