重构误区
重构变成了业界最委屈的工程实践之一,管理层不支持,而程序员吃力不讨好。归根结底,是对「重构」错误地理解,给管理层带来很多负反馈。
将事情做好,还得正确地做事。重构是一个系统工程,不仅仅要求雄厚的软件设计素养,同时需要正确的做事方法。
大谬不然
谈及「重构」,管理层谈虎色变,错误地理解或实践重构,必然得不偿失,收效甚微。
这个Bug,就是因为上次重构引入的;
这个模块再不重构,就彻底完蛋了;
系统性能太差,得重构一下;
还没坏就别动;
......
麻木不仁
优秀的程序员对软件设计中存在的坏味道具有敏锐的嗅觉。我所经历的团队,不是因为进度的约束限制重构的工程实践,而是由于缺乏坏味道的嗅觉,长期地麻木不仁。一日皮死麻木不仁,二日肉死针刺不痛,系统就这样每况愈下,腐朽变质了。
孤芳自赏
有的程序员,自我感觉良好,孤芳自赏;实际上,他们往往「不知道自己不知道」,而且这样的程序员心胸都很狭窄,代码犹如尊严一样,绝不容忍侵犯。
直到有一天,知道自己知道了,才觉得那么地无知和可怜。
高处不胜寒
他人笑我太疯癫,我笑他人看不穿。如果两个人没有共同的上下文,没有共同的背景,但硬是要谈到一块,两个人都会很尴尬,很痛苦。
我喜欢优美的软件系统,设计充满着简单的美感,每个软件的元素都是恰到好处,抽象而不至于复杂,直白而不流于形式。
华而不实
重构需要长期的「刻意训练」,并且要求具有良好的软件设计的素养。重构并不是将一种坏味道重构为另外一个坏味道,或者变得更加脆弱,更加复杂。
重构只是手段,关键在于软件设计的修为。只有练就雄厚的内功,方能游刃有余。
主次不分
重构是一个系统工程,如果没有目标,主次不分,很容易迷失自我,吃力不讨好。由点到线,由线到面,各个击破;关注优先级,优先解决最棘手,最重要的问题。
设计欠账
重构应该成为每天的面包和黄油,而不是等到程序变成一个大泥球(Big Ball of Mud),才集中人力实施大规模的重构。
交付压力成为拒绝重构最大的借口,重构并不难,关键在于良好的心态,及其持之以恒的工作态度。
至善至美
至善至美的系统是不存在,因为没有一个统一的标准来衡量。所以,重构一定要有一把尺子,知道自己走了多少,有多大,还离目标有多远。只有短迭代交付,通过正确的反馈渠道,才能赢得管理层的支持。
否则,重构往往变成了项目经理最讨厌的工程实践之一,因为他对重构带来的收益,感觉知之甚少。
重构的本质
「重构」本质是软件设计的过程。这可以从「重构」的定义,目的出发,结合「简单设计」的基本原则,很容易地看出两者是一脉相承的,并且拥有共同的价值观。
何谓重构
重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
前提
重构是一种「保持行为的等价转换过程」,它是在不改变软件可观察行为的前提条件下进行的软件过程。
目的:使软件更容易地被修改和理解
改进软件设计
使软件更容易理解
使软件没有冗余
重构与简单设计
「简单设计」的四个基本原则,并且重要程度依次减低:
通过测试:Passes all the tests
消除重复:Says everything OnceAndOnlyOnce
揭示意图:Expresses every idea that we need to express
没有冗余:Has no superfluous parts
重构与简单设计一脉相承,相互呼应。改进设计最重要的一个方向就是「消除重复」,确定所有事物和行为在代码中只存在一份表述,这正是优秀设计的根本;重构让代码变得更加容易理解,并准确地表达作者所要的;重构使设计保持简单,使用最少的元素表述软件的行为,避免不必要的复杂度。
重构原则
保持清洁
Try and leave this world a little better than you found it. - Robert Stephenson
「没有坏就不修改」,技术债务与日俱增,最后穷途末路。相反地,应该遵循「童子军规则」,总是保持提交时的代码比签出时更整洁。决不容忍代码中的脏乱,绝不能倒退到坏习惯中去。
循序渐进
对重构理解越深刻,就越倾向于采用更小的,更安全的步骤。欲速则不达,步子不宜迈得太大,否则容易迷失自我,越挫越不勇,从而害怕重构,拒绝重构,从而使得系统腐败变质,陷入恶性循环。
关键还得靠人
招聘最优秀的人
重构需要高超的软件设计的技艺,给他们无法拒绝的收入,给他们自由,相信他们,他们一定不会让你失望的。
给管理层正反馈
快速迭代,持续反馈,让他们能够看到重构的价值,从而赢得管理层的支持。
寻找你的同盟者
找对合适的人,正确的人做正确的事;如果志不同道不合,是很难将事情做对做好。世界这么大,总会碰到一群追梦人,值得去付出努力和青春,因为大家都拥有一个共同的梦想:让软件更加简单,美好!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。