UML软件工程组织

我的软件10年(3):需求的变化就是创新的机会
出处:CSDN 作者:sfcyyc
  经常遇到做软件设计的朋友抱怨用户的需求老是变化,自己不断的修改自己的设计,结构搞得自己疲惫不堪,而且软件的应用效果也不理想。其实类似的问题每个人都会遇到,关键是我们应该如何对待,如果我们总是不断的修改代码以适应用户的要求,这时候我们应该考虑软件是否具备足够的让软件开发人员自己比较舒适的适应能力,如果不具备这种能力,则改进设计,甚至具备足够的适应能力,否则,软件设计真的就成了苦差事。

  软件设计师不应该害怕需求的变化,更不应该为需求的变化而烦恼,任何需求的变化都可能蕴藏着巨大的机会,这种机会就是创新,这种创新就是未来的市场机遇,就是企业的进步的推动力。创新源于需求的不断变化。这是多年来从事软件开发工作的一点非常深刻的体会,这种变化包括各个方面的,可能是硬件的变化,可能是操作系统的变化,可能是用户群的变统统可以归结为用户需求的变化。我们的软件产品就是在需求不断的变化之中发展的。

  如果我们为用户编写了一个软件,不管具体实现的功能如何,只要上述的几种变化出现,我们都不得不不对软件的设计进行调整,有时可能需要对系统的整体框架进行调,甚至重写部分或全部的源代码。刚开始学习编程的时,总是希望一条语句表达尽可能多的含义,梦想一个算法解决所有的问题,一个程序满足所有用户的要求,但这是不可能的,因为我们周围的世界处于不断的变化之中,今天你写的程序完全满足用户要求,一段时间之后,用户的系统升级了,你的程序在新的系统上运行就会产生错误,所以你必须更新程序以适应这种变化。这种变化还包括机器主板的变化引起硬件的冲突,某种型号板卡的停产或改型,用户特别指定的硬件设备等等。另外,我们的头脑不可能聪明到完全可以预览未来发生的事情,所有很难设计一个一劳永逸的软件,另外市场的选择,竞争对手的压力,也逼着我们不断的修改设计。

  需求的变化是一个客观存在的事实,软件设计人员必须正确的面对这样的事实,不要指望你辛辛苦苦编写了一年的代码之后,你就可以高枕无忧,尽管你对软件的架构、算法处理的非常好,甚至可以说是完美,然而所有的你所津津乐道的那些完美的设计,都是相对的,当用户 的需求开始发生变化的时候,他们可能提出要增加一个新的功能,那么你很可能要改进设计。 除非你设计的东西没有人使用,否则对设计的更改总是不可避免的。

  2000年底的时候,我的第一个商品化软件完成,尽管我不觉得多么好,但是在同其他厂商的竞争中赢得了用户的青睐,听到从市场上反馈的信息,我当时的感觉非常好,然而,很快我不得不修改我的代码,除了程序中存在的一些BUG之外,在用户群不到增加的情况下,用户的要求开始发生变化了,例如:A用户希望整个界面的字体采用楷体比较好,B用户50多岁的人比较多,希望字体能够大一些,可以看得清楚,C用户希望界面上的“医生”改为“医师”,D用户希望界面上的字段数量少一些,等等诸如此类的。关键是有些用户的需求是存在冲突 的,如果程序满足了张三的要求,而张三所要求的东西恰恰是李四要极力避免的,所以对于使用VB时间不长,经验不多的我来说,只能靠保留多个版本来解决这样的问题,我为每个用户保留一个备份,这样每个用户的要求都可以满足了,但是后期的代码的维护几乎让我陷入绝望的境地,试想一下,一个存在问题的函数,需要你在10个甚至更多的版本上同时修改,是一种什么样的感觉,而且每个版本的程序都多少有点区别,任何一次修改,你都必须小心翼翼,一不留神就会产生一个新的BUG,这种更改让人精神紧张。或许,我应该使用VSS之类的工具管理代码,但是我当时根本不知道世界上有这样的一种工具。所以在万般无奈之下,我必须想办法拯救自己,可不能陷入到需求变化和版本层出不穷的深渊,于是我开始构思下一版的软件,这个软必须能够解决现有版本的程序所面临的一切问题,同时可以支持网络版的功能。

  在2002年,与后来的两个同时鼎力合作,终于在11月份完成的这个新版本的程序,整个程序界面上的控件都是在程序启动时动态创建,可以直接编辑,编辑完成之后将界面信息保存到数据库中,下次启动应用程序时再从数据库中动态加载界面,界面上的字体,颜色,甚至整个界面的风格都可以由用户自己选择。当这个软件第一次推出的时候,用户也比较喜欢,很多设计非常新颖。直到今天,这个版本的程序还在不断的完善,但是程序的样子与2002年11月相比,已经大不相同了,现在的程序更加美观,看起来更加专业,使用更为方便,也更稳定。但是这个程序比较庞大,因为它要同时支持Access和SQL Server数据库。这个程序也就成了我们的产品由单机版向网络版过度的一个桥梁。这就是我们的第三版软件。

  可以说第三版软件彻底解决了第二版软件面临的问题,但是在网络方面遇到了挑战,那就是所有的网络版软件都面临的问题:流程的变更和业务规则的变更。第三版的设计初衷就是为了解决第二版遇到的问题,不过为了节约工作量,同时兼顾了网络版的功能,这就导致了第三版代码比较多,其中经常出现是单击版还是网络版的判断。对于网络版的用户需求的适应能力,第三版显得有点吃力了,我们不得不在程序中专门为某个用户增加一些特殊的处理,当网络版的用户快接近10家的时候,我们的噩梦又开始了,当然比第二版要乐观一点,因为VC中可以使用预编译条件解决了不少的问题,例如一个对话框资源可以根据不同的条件显示不同的外观等等。由于针对多家用户添加的那些if else实在是太多了,修改一个地方,一不小心就会影响其他的功能。当然这也与第三版程序结构的设计不太合理有关系,因为这个版本的程序我依然是在现蒸现卖,卖到2005年底的时候,我对于VC才有了点感觉,什么是面向对象的设计,什么是设计模式,系统架构等等的概念开始接触和学习。

  在2003年非典刚刚开始的时候,我们的第一个网络版用户开始装机,从那时起第三版软件开始了网络版的考验,从第三个网络用户开始我就不得不规划第四版软件了,这个新版本的软件必须同时解决第二版和第三版所遇到的所有问题,同时可以非常方便的解决流程的变更和业务规则的变更问题。2004年2月,我正式开始设计第四版软件,这个软件可以设计界面,设计流程,增加和编辑业务规则,而且支持脚本和二次开发,到2005年11月,我们的BUG管理器通过第四版软件配置完成了,现在用得很好,到元旦前,估计我们得计划管理器也可以配置出来。这个版本的软件就像一个平台,可以搭建起几乎所有的数据库管理软件实现的功能,从而开发人员可以自如的面对用户需求 的变化。当然,并不是所有的需求都可以在不改变程序代码的情况下实现,但是相对于第三版软件,新版本的软件已经很优秀了,至少我们不需要为了实现每个用户的要求而修改程序的代码。另外,同第三版软件相比,该版软件的系统架构好多了,尽可能采用面向对象的设计,关于设计模式的很多规则也应用了不少。

  软件设计师就是为了解决麻烦而存在的,既要解决用户的麻烦,也要解决自己的麻烦,在这样的过程中不断的进步。抱着这样的一种心态,我们可以从容面对用户需求的变化,如果我们设计的软件不能够做到随需应变,那么很可能软件的结构和设计上遇到了问题,我们必须考虑如何改进设计以适应这种变化,如果你绞尽脑汁之后发现修改代码将会把一切搞得更糟,那么我们应该考虑是否重新设计一个新的产品。

版权所有:UML软件工程组织