大话重构连载:遗留系统——软件工业时代的痛

我经常感到幸运,我们如今所处的是一个令人振奋的时代,我们进入了软件工业时代。在这个时代里,我们进行软件开发已经不再是一个一个的小作坊,我们在进行着集团化的大规模开发。我们开发的软件不再是为某个车间、某个工序设计的辅助工具。它从某个单位走向整个集团,走向整个行业,甚至整个社会,发挥着越来越关键的数据。一套软件所起到的作用与影响有多大。已经远远超越了全部人的想象。成为一个地区、一个社会。乃至整个国家不可或缺的组成部分。

慢慢地,人们已经难以想象没有某某软件或系统的生活和工作会是如何的。这就是软件工业时代的重要时代特征。

然而,在这个令人振奋的软件工业时代,处于时代中心的各大软件企业却令人沮丧。软件规模越来越庞大,软件结构越来越复杂的同一时候,却是软件质量越来越低下,软件维护变得越来越困难,以至于每一个小小的变更都变得须要伤筋动骨。

研发人员为此举足无措。測试人员成为唯一的救星,每一个小小的变更都须要付出巨大代价进行測试。软件企业在这样一种恶性循环中苦苦支撑。毫无疑问。这也成为这个令人振奋的时代的还有一个特征。

是的,面对软件工业时代我们并没有做好准备。过去,一套软件的生命周期只是2~3年时间。随着软件需求的变化。我们总是选择将软件推倒了又一次开发。可是如今这种情况在发生着改变。

随着软件规模的扩大。软件数据的积累,软件影响力的提升,我们,以及我们的客户。都真切地感受到,要推倒一套软件又一次开发,将变得越来越困难而不切实际。这种结果就是,我们的软件将不停地改动、维护、再改动、再维护……直到永远。

这是一件多么痛苦的事情啊!

一套软件,当它第一次被开发出来的时候,一切都十分清晰:清晰的业务需求、清晰的设计思路、清晰的程序代码。但经历了几次需求变更与维护以后,一切就变得不那么清晰了。业务需求文档变得模糊不清。设计思路已经跟不上变更的脚步,程序代码则随着业务逻辑的复杂而臃肿不堪。程序猿開始读不懂代码,软件开发工作变得不再是一种乐趣。

随着时间的推移,软件经过数年、数十次的变更与维护,情况变得越来越糟。最初的程序猿已经不愿再看到自己的代码而选择离去。他的继任者们变得更无所是从。因为看不懂程序,代码的每一次改动如同在走钢丝。

測试人员变成了唯一的希望,开发者的每一次改动都意味着測试人员须要把全部程序測试一遍。继任者们開始质问最初的设计者们。程序是怎么设计的。假设此时恰巧又有什么新技术出现,就会更显得原有系统的破旧与不堪。

相信这就是软件工业时代的全部企业都不得不面对的尴尬境界。难倒真的是我们最初的设计错了吗?是的,我们都这样质问过我们自己,因此我们開始尝试在软件设计之初投入很多其它的精力。

我们開始投入很多其它的时间作需求调研。考虑很多其它可能的需求变化。做很多其它的接口,实现更加灵活但复杂的设计。

然后呢,我们攻克了我们的问题了吗?显然是没有。需求并没有像我们想象的那样发生变更:我们之前觉得可能发生的变更并没有发生,使我们为之做出的设计变成了摆设;我们之前没有考虑到的变更发生了。让我们猝不及防,软件质量開始下降,我们被打回了原形。难倒真的是无药可解了吗?在我看来,假设我们没有看明确软件开发的规律与特点。那么我们永远找不到那份向往已久的解药。

如今,让我们真正静下心来分析分析软件开发的规律与特点吧。

软件。特别是管理软件,事实上质是对真实世界的模拟。我们通过对真实世界的模拟。实现计算机的信息化管理。来提高我们的生产效率。然而,真实的世界复杂而多变的,我们认识世界却是一个由简单到复杂循序渐进的过程,这是一个我们无法改变的客观规律。因此,毫无疑问,遵循着这样一个客观规律,我们的软件开发过程必定也是一个由简单到复杂循序渐进的过程。

最初。我们开发的是一个对真实世界最简单、最主要、最核心部分的模拟。由于简单,我们的思路变得清晰而明了。

可是。我们的软件不能永远仅仅是模拟那些最简单、最主要、最核心的部分。我们的客户在使用软件的过程中,假设遇到那些不那么简单、不那么主要、不那么核心的情况时,我们的软件就无法处理了,这是客户不管怎样不能接受的。因此,但软件的第一个版本号交付客户以后,客户的需求就開始变更。

客户的需求永远不会脱离真实世界,也就是说。真实世界不存在的事物、现象、关系永远都不可能出如今软件需求中。可是。真实世界的事物、规则与联系并非那么的简单与清晰的。随着我们的软件对它模拟得越来越仔细,程序的业务逻辑開始变得不再那么清晰而易于理解。这就是软件质量下降最关键的内因。

不论什么一个软件的设计,总是与软件的复杂度有密切的关系。

举例来说吧,客户资料是很多系统都必需要记录的重要信息。起初,我们程序简单,客户资料只记录了一些简单的信息,如客户名称、地址、电话等等,但随着程序复杂度的添加,客户资料開始变得复杂。

比方,起初“地址”字段就只需要一个字符串就能够了。但随着需求的变更。它開始有了省份、城市、地区、街道等信息。随后还会有邮政编码、所属社区、派出所等信息。

起初添加一个两个字段时我们还能够在“客户信息表”里凑合一下。但后来我们必需要及时调整我们的设计,将地址提取出来单独形成一个“地址信息表”。假设不及时予以调整,“客户信息表”将越来越臃肿。由10来个字段,变成50个、80个、上100个……

信息表尚且如此,业务操作更是如此。起初的业务操作是如此的简单而明了,以至于我们不须要花费太多的类就能够将它们描写叙述清楚。比方开票操作,最初的需求就是将已开具的票据信息读取出来,保存,并统计出本月开票量及金额。

这样一个简单操作,设计成一个简单的“开票业务类”合情合理。但随后的业务逻辑变得越来越复杂,我们要检查客户是否存在、开票人是否有权限、票据是否还有库存。等等。

起初的开票方式仅仅有一种,但随着非正常开票的添加,开票方式不再单一,而统计方式也随之变化……随着业务的不断添加,软件代码的规模也在发生着质的变化。假设这时我们不及时调整我们的设计,而是将全部的程序都硬塞进“开票业务类”,那么程序质量必定会退化。“开票业务类”由原有的数十行,激增到数百行,甚至上千行。

这时的代码将难于阅读,维护它将变成一种痛苦。毫无乐趣可言。

面对这种状况,我们应当如何走出困境呢?毫无疑问。就是重构,软件的重构。开票前的校验真的属于“开票业务类”吗?它们是否应当被提取出来,解耦成一个一个的校验类。正常开票与非正常开票真的应该写在一起吗?是否我们应当把“开票业务类”抽象成接口。以及正常开票与非正常开票的实现类。

这就是我给大家的良方:当软件由于需求变更而開始渐渐退化时,运用软件重构改善我们的结构。使之又一次适应软件需求的变化。

大话重构连载首页:http://blog.csdn.net/mooodo/article/details/32083021

特别说明:希望网友们在转载本文时,应当注明作者或出处,以示对作者的尊重,谢谢。

时间: 2024-07-30 13:36:22

大话重构连载:遗留系统——软件工业时代的痛的相关文章

大话重构连载1:遗留系统——软件工业时代的痛

我常常感到幸运,我们现在所处的是一个令人振奋的时代,我们进入了软件工业时代.在这个时代里,我们进行软件开发已经不再是一个一个的小作坊,我们在进行着集团化的大规模开发.我们开发的软件不再是为某个车间.某个工序设计的辅助工具,它从某个单位走向整个集团,走向整个行业,甚至整个社会,发挥着越来越重要的作用.一套软件所起到的作用与影响有多大,已经远远超越了所有人的想象,成为一个地区.一个社会,乃至整个国家不可或缺的组成部分.慢慢地,人们已经难以想象没有某某软件或系统的生活和工作会是怎样的.这就是软件工业时

大话重构连载5:软件修改的四种动机

软件,自从被我们开发出来并交付使用以后,如果它运行得好好的,我们是不会去修改它的.我们要修改软件,万变不离其宗,无非就是四种动机: 1. 增加新功能: 2. 原有功能有BUG: 3. 改善原有程序的结构: 4. 优化原有系统的性能[1]. 第一种和第二种动机,都是源于客户的功能需求,而第四种是源于客户的非功能需求. 软件的外部质量,其衡量的标准就是客户对软件功能需求与非功能需求的满意度.它涉及到一个企业.一个软件的信誉度与生命力,因此为所有软件企业所高度重视.但是,就在所有企业高管把软件外部质量

大话重构连载首页

<大话重构>这本书是我写的第一本书,从今天起我将通过连载的形式逐渐跟大家分享. 这本书让你: 告别游击队转变为正规军. 远离劣质代码走向精妙设计 真正明确专业级的软件开发是如何的 真正明确重构是如何一步一步进行的 高效重构七步曲.面对实践不卡壳 让遗留系统维护不再是你的梦魇 读完这本书以后: 需求变更不再纠结.重构让你润物细无声地容纳它们 超越代码级的重构,从各个层面深度领略重构之美 自己主动化測试不再是梦想.重构让自己主动化測试走你 又一次审视熟悉而陌生的技术.将碎了一地的它们又一次铆合在一

大话重构连载2:什么是系统重构

当我们开始系统重构的时候,不是着手去修改代码,而是首先建立测试机制.不论什么程序,只要是被我们修改了,理论上就可能引入BUG,因此我们就必须要进行测试.既然是测试就必须要有一个正确与否的评判标准.以往的测试,其评判的标准就是是否满足业务需求.因此,测试人员往往总是拿着需求文档测试系统. 与以往的代码修改不同,重构没有引入任何新的需求,系统原来什么功能,重构以后还是这些功能.因此,重构的测试标准就只有一个,就是与之前的功能完全保持一致,仅此而已. 然而在许多经典的重构书籍中,大师们总是建议我们首先

大话重构连载16:超级大函数

事情总是这样的:当我们对一个遗留系统一忍再忍,再忍,忍,还要忍--终于积攒到某一天,实在忍无可忍了,拍案而起,不能再忍了,重构!!!事情就这样发生了.然而,在这时你突然发现,重构的工作千头万绪,真不知从何开始.堆积如山的问题此起彼伏,期望修改的设计思绪万千.这里有个想法,那里有个思路,什么都想做,却什么都做不了,真是脑子里一团乱麻.这时候,没有一个合理的步骤,清晰的计划,瞎干蛮干是十分危险的,它会为你的重构带来不可预期的未来.无数次的经验告诉我,不论是什么系统,采用什么架构,从分解大函数开始,肯

大话重构连载7:重构是一系列的等量变换

系统重构要求我们对代码的每一步修改,都不能改变软件的外部行为,因此在系统重构中的所有方法,都是一种代码的等量变换.重构的过程,就好像在做数学题,一步一步地进行算式的等量变换.经过一系列等量变换,最终的结果虽然在形式上与原式不一样,但通过计算可以得到与原式完全相同的结果. 这种等量变换对于重构来说非常重要,它使得我们进行重构以后,程序还是那些程序,代码还是那些代码.但是,等量变换不等于原地踏步.正如矩阵通过等量变换可以得到方程组的解,微积分可以通过等量变换计算最终的结果,重构通过等量变换,在保证代

大话重构连载3:在保险索上走钢丝

当我们开始系统重构的时候,不是着手去修改代码,而是首先建立测试机制.不论什么程序,只要是被我们修改了,理论上就可能引入BUG,因此我们就必须要进行测试.既然是测试就必须要有一个正确与否的评判标准.以往的测试,其评判的标准就是是否满足业务需求.因此,测试人员往往总是拿着需求文档测试系统. 与以往的代码修改不同,重构没有引入任何新的需求,系统原来什么功能,重构以后还是这些功能.因此,重构的测试标准就只有一个,就是与之前的功能完全保持一致,仅此而已. 然而在许多经典的重构书籍中,大师们总是建议我们首先

大话重构连载19:大对象的演化过程

很好,我们终于迈出了重构的第一步,而这第一步我们瞄准了代码问题的重灾区——超级大函数.超级大函数之所以是代码问题的重灾区,就是因为它们往往难于阅读.难于维护.面对大函数我们采取的办法是拆分,以功能为核心将其拆分成一个一个独立的函数.拆分后的程序变得易于阅读了,因为要读懂程序你不再需要读完所有代码,选择性的读取那些顶级函数,只需了了数行代码,你就可以明白整个程序. 但是,当我们将数千行的大函数分解成数十个小函数时,另一个问题出现了.想象一下,数十个函数被杂乱无章地堆放在一个对象中,看看就让人头疼.

大话重构连载9:大布局你伤不起

作为优秀开发人员,重构应当成为一种习惯,自然而然地运用重构的开发模式,自然而然地在优化和调整我们的代码.它首先要求我们掌握重构的开发模式,就是"小步快跑"的开发模式,运用"两顶帽子"的设计顺序,去开发我们的程序.但作为重构初学者来说,这并不容易,即使你已经从业很多年. 所谓改变一种习惯,就好像习惯了左手吃饭的人,突然被要求改成右手,你必然会感到许多的不适.首先的不适是一种心理上的障碍,即如何能迈出重构代码的第一步,这需要一种决心.初次尝试重构的开发人员总是要经历一段