我们身处软件工业时代这个令人振奋的时代,却面临着遗留系统这个令人尴尬的难题。事情总是这样的:软件最开初开发的时候总是非常清晰,清晰的需求、清晰的设计、清晰的代码,清晰的程序结构让人赏心悦目,甚至有些自我陶醉。随后,软件开始需求变更,每变更一次软件的质量就下降一次。这样,软件经过数次的变更以后,需求文档变得模糊不清,设计思路跟不上变更的脚步,程序代码则随着业务逻辑的复杂而臃肿不堪,程序员开始读不懂代码,软件开发工作变得不再是一种乐趣。随着时间的推移,经过数年、数十次的需求变更,情况变得越来越糟,软件质量像滚雪球一样直线下降。难道需求变更就是软件变糟的罪恶之源吗?

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

最初,我们开发的是一个对真实世界最简单、最主要、最核心部分的模拟。因为简单,我们的思路变得清晰而明了。但是,我们的软件不能永远只是模拟那些最简单、最主要、最核心的部分。我们的客户在使用软件的过程中,如果遇到那些不那么简单、不那么主要、不那么核心的情况时,我们的软件就无法处理了,这是客户无论如何不能接收的。因此,但软件的第一个版本交付客户以后,客户的需求就开始变更。

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

任何一个软件的设计,总是与软件的复杂度有密切的关系。简单软件有简单软件的设计,复杂软件有复杂软件的设计,它们是不一样的。但是,软件的发展规律却是一个由简单软件转变为复杂软件的过程。正因为如此,我们最初的设计通常是简单软件的设计,然而随着软件复杂度的提升,我们是否调整过我们的设计,向复杂软件的设计过渡呢?非常遗憾的是,通常情况却不是这样,起初进行简单软件设计以后,虽然软件在越来越复杂,但开发人员没有通过重构对软件结构进行调整,而是就着简单软件的设计,添加复杂的程序逻辑。这才是所有遗留系统面临的真正问题:不是因为软件需求在变更,而是因为当需求变更以后,软件业务逻辑在变得越来越复杂时,我们没有通过系统重构调整原有的系统结构,以适应新的需求。正因为如此,我们的遗留系统将变得越来越难懂,越来越难于维护,任何一项变更都成本巨大。

说了这么多,你也许还没有什么感觉。举例来说吧,客户资料是许多系统都必须要记录的重要信息。起初,我们程序简单,客户资料只记录了一些简单的信息,如客户名称、地址、电话等等,但随着程序复杂度的增加,客户资料开始变得复杂。比如,起初“地址”字段就仅仅需要一个字符串就可以了,但随着需求的变更,它开始有了省份、城市、地区、街道等信息。随后还会有邮政编码、所属社区、派出所等信息。起初增加一个两个字段时我们还可以在“客户信息表”里凑合一下,但后来我们必须要及时调整我们的设计,将地址提取出来单独形成一个“地址信息表”。如果不及时予以调整,“客户信息表”将越来越臃肿,由10来个字段,变成50个、80个、上100个……

信息表尚且如此,业务操作更是如此。起初的业务操作是如此的简单而明了,以至于我们不需要花费太多的类就可以将它们描述清楚。比如开票操作,最初的需求就是将已开具的票据信息读取出来,保存,并统计出本月开票量及金额。这样一个简单操作,设计成一个简单的“开票业务类”合情合理。但随后的业务逻辑变得越来越复杂,我们要检查客户是否存在、开票人是否有权限、票据是否还有库存,等等。起初的开票方式只有一种,但随着非正常开票的加入,开票方式不再单一,而统计方式也随之变化……随着业务的不断增加,软件代码的规模也在发生着质的变化。如果这时我们不及时调整我们的设计,而是将所有的程序都硬塞进“开票业务类”,那么程序质量必然会退化。“开票业务类”由原有的数十行,激增到数百行,甚至上千行。这时的代码将难于阅读,维护它将变成一种痛苦,毫无乐趣可言。

面对这样的状况,我们应当怎样走出困境呢?毫无疑问,就是重构,软件的重构。开票前的校验真的属于“开票业务类”吗?它们是否应当被提取出来,解耦成一个一个的校验类。正常开票与非正常开票真的应该写在一起吗?是否我们应当把“开票业务类”抽象成接口,以及正常开票与非正常开票的实现类。这就是我给大家的良方:当软件因为需求变更而开始渐渐退化时,运用软件重构改善我们的结构,使之重新适应软件需求的变化。(续)

相关文章:

遗留系统:IT攻城狮永远的痛

需求变更是罪恶之源吗?

系统重构是个什么玩意儿

我们应当改变我们的设计习惯

小步快跑是这样玩的(上)

小步快跑是这样玩的(下)

代码复用应该这样做(1)

代码复用应该这样做(2)

代码复用应该这样做(3)

做好代码复用不简单

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

需求变更是罪恶之源吗?相关推荐

  1. 程序员你为什么这么累【续】:如何应对需求变更

    作者:晓风轻原文:https://zhuanlan.zhihu.com/p/28719726 我之前的文章 程序员你为什么这么累? 中,我个人观点是加班原因是编码质量占了大部分因素,但是不少同学都不认 ...

  2. 项目管理中的客户需求变更时需求分析和解决方法

    一.令人烦恼的需求变更 作为一个软件项目经理,在项目开发进行中,你是否遇到过这样的问题:客户的一个电话,就推翻了之前你与客户.与你自己的开发团队,经过再三讨论而确认定下来的需求.之后你就重新开始了和客 ...

  3. 项目管理中的需求变更和解决之道

    一.令人烦恼的需求变更 作为一个软件项目经理,在项目开发进行中,你是否遇到过这样的问题:客户的一个电话,就推翻了之前你与客户.与你自己的开发团队,经过再三讨论而确认定下来的需求.之后你就重新开始了和客 ...

  4. 在项目开始前,为客户做专门的“需求变更流程”培训是必要的

    在项目开前,公司应该专门组织一个客户参与的会议,会议的主题就是宣讲公司的项目管理流程,其中最重要的就是"需求变更流程".这样,以后客户在提出需求时,就应该按照既定的流程进行申请. ...

  5. 项目积压需求项目计划_需求变更频繁,项目经理如何做好需求管理?

    项目实施过程中,项目经理常常面临一个重大挑战--需求变更.需求变更无处不在,市场条件变化.新业务出现.战略目标调整.客户需求修改.资源限制等,都会造成需求变更. 需求变更会影响项目的时间.成本和质量, ...

  6. 面试题,作为产品经理你是如何应对需求变更的?

    有个小伙伴在微信上问我,他说面试官问他作为产品经理如何应对需求变更,今天我就来说说我的看法. 产品经理在项目中经常会遇到需求变更的情况,哪怕你计划做的再详细,也免不了受到一些需求变更的困扰,变化不可怕 ...

  7. [理解需求变更之一]说说需求变更的必然

    歌德曾说:"哪个少男不钟情,哪个少女不怀春". 对于需求,我们一开始的时候就是这样的.那时,我们总是希望完全理解它,我们总认为能够完全掌握它,可实际的情况是--需求变更往往在所难免 ...

  8. 如何做好需求变更管理?——需求变更流程规范

    一.引言 由于目前公司内部对产品的需求变动都只是口头或邮件中进行通知,并没有进行内部评审和相关需求变动后的记录,导致后续出的产品某些需求增加了,某些没有进行增加.这样就会导致测试得到的信息不完整,以及 ...

  9. 谈软件开发项目管理之需求变更

    在软件开发过程中需求的变更会给开发带来不确定性,但只要把需求变更作为重点.难点小心加以控制,软件开发的进度.成本和质量也就有了"安全"的基础.变化并不是人们最害怕的,最怕的是跟不上 ...

最新文章

  1. TSQL:判定一段数组连续的数字段有多少的方案
  2. 微软发布Azure SignalR Service的预览版本
  3. 【转载】struts应用在断网情况下启动报错解决办法(java/net/AbstractPlainSocketImpl.java:178:-1)...
  4. 10月份个人技术指标
  5. 内核空间镜像攻击揭秘:ARM 硬件特性,竟能开启安卓8终端的上帝模式?
  6. PAT甲级 -- 1090 Highest Price in Supply Chain (25 分)
  7. 解决ueditor jquery javascript 取值问题
  8. VS2015+cmake3.8+opencv3.2+opencv-contrib3.2编译及配置步骤
  9. 安全基础知识 最强0到33600端口详解(5)
  10. 数学建模-14.主成分分析PCA
  11. 【钟表识别】基于matlab GUI形态学钟表识别【含Matlab源码 1351期】
  12. java多线程--容器类和其他工具类
  13. 单片机c语言表达式,单片机C语言教程:运算符和表达式(位运算符)
  14. Word标题样式设置多级自动编号
  15. Android HttpClient及连接管理器
  16. Java学习day07-认识类和对象(单元测试Test)
  17. VUE 拦截浏览器后退弹窗,弹窗一闪立刻消失问题
  18. C# OpenCvSharp 连通区域最小衔接矩形+最小标注信息(minx,miny,Width,Height)
  19. CC00255.CloudKubernetes——|KuberNetes中间件容器化及helm.V02|——|中间件.v02|redis.v5.0.4|ratel方式部署|
  20. LabVIEW创建Web服务

热门文章

  1. redis 事务、python代码实现redis事务
  2. 智能嵌入式系统大作业(1)
  3. Delphi 百度智能云 OCR API 调用控件
  4. 今天小暑是什么时间_小暑时间 小暑是几月几日代表什么
  5. 为什么要使用tiles框架?
  6. 数据库连接:操作数据增删改查
  7. 2007年春节联欢晚会经典台词
  8. MFC —— 随心修改Dialog的Caption
  9. 2021年安全员-A证(江苏省)作业考试题库及安全员-A证(江苏省)实操考试视频
  10. 2021年保安员(初级)考试题及保安员(初级)免费试题