重构:最委屈的工程实践

重构误区

重构变成了业界最委屈的工程实践之一,管理层不支持,而程序员吃力不讨好。归根结底,是对「重构」错误地理解,给管理层带来很多负反馈。

将事情做好,还得正确地做事。重构是一个系统工程,不仅仅要求雄厚的软件设计素养,同时需要正确的做事方法。

大谬不然

谈及「重构」,管理层谈虎色变,错误地理解或实践重构,必然得不偿失,收效甚微。

  • 这个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

「没有坏就不修改」,技术债务与日俱增,最后穷途末路。相反地,应该遵循「童子军规则」,总是保持提交时的代码比签出时更整洁。决不容忍代码中的脏乱,绝不能倒退到坏习惯中去。

循序渐进

对重构理解越深刻,就越倾向于采用更小的,更安全的步骤。欲速则不达,步子不宜迈得太大,否则容易迷失自我,越挫越不勇,从而害怕重构,拒绝重构,从而使得系统腐败变质,陷入恶性循环。

关键还得靠人

招聘最优秀的人

重构需要高超的软件设计的技艺,给他们无法拒绝的收入,给他们自由,相信他们,他们一定不会让你失望的。

给管理层正反馈

快速迭代,持续反馈,让他们能够看到重构的价值,从而赢得管理层的支持。

寻找你的同盟者

找对合适的人,正确的人做正确的事;如果志不同道不合,是很难将事情做对做好。世界这么大,总会碰到一群追梦人,值得去付出努力和青春,因为大家都拥有一个共同的梦想:让软件更加简单,美好!

你可能感兴趣的:(重构)