软件行业呼唤可开发性设计

    对于DFM(Design for Manufacturability, 可生产性设计)、DFT(Design for Testability,可测试性设计)我们可能并不陌生,但DFD(Design for Developability,可开发性设计)我想一定听得很少。在写这篇博文时,我用Google搜了一下,发现竟然没有与软件相关的DFD。就我而言,我认为DFD在我们的软件行业并没有得到广泛的关注和重视,在此,我想谈一谈我对软件行业DFD的想法。

    简单说来,可开发性设计就是我们在开发一个软件(相关)产品时,软件的设计应当考虑方便开发人员(大部分情况下就是我们自己)进行开发,或者说在设计时应考虑如何提高开发效率。在某些情况下,如果我们不这么做会造成我们的开发效率大打折扣,后面我们称这种现象为可开发性问题。

    可开发性问题并不是在所有的软件产品的开发过程中都一定存在,这一问题通常在与设备相关的软件产品的开发中更容易出现。比如,在嵌入式系统开发中这一问题就相对容易出现,尤其对于大型的电信级设备或是其它的高可靠性要求的大型设备系统。下面我们来看一看大型的电信级设备的开发中,哪些地方容易出现可开发性问题,从而认识DFD。

    1)对于大型的电信级设备,其系统通常非常的复杂,之所以复杂,是因为对于设备的可靠性要求非常的高。比如,很多电信级设备需要达到99.999%的可靠性。在这种情况下,设备的软件系统和硬件系统都非常的复杂。由于硬件的复杂,造成硬件设备的成本非常的高。因此,在大型的电信级设备的开发中,设备往往是一个紧缺资源。此外,这种设备的开发往往是典型的嵌入式系统开发模式,比如,采用交叉编译环境来编译程序,然后将编译出来的程序放到设备中去运行,并通过测试来看是否达到了功能需求。这种开发模式的结果是:开发人员将大量的时间放在将程序从编译环境传输到目标设备中。另外,嵌入式系统开发的调试手段相对的落后,其效率远远不如我们在Windows上采用Visual Studio进行软件开发那样的方便。由此看来,设备的紧缺、交叉编译环境的存在以及调试手段的相对落后都有可能造成在大型电信级设备的开发过程中出现可开发性问题。

    2)正如前面提到的,大型电信设备的开发往往软件系统非常的复杂。比如,为了实现99.999%的可靠性,软件得做大量的工作来实现主、备设备(或是板卡)的热备份。具体一点就是,假设我们正在打电话,其中的一设备块板卡出现了硬件或是软件故障,此时,另一块备用设备板卡要立即接管所有的工作,从而保证我们已经建立的通话不会因为所出现的故障而中断。为了做到这一点主设备(或板卡)需要不断的与备用设备(或板卡)进行数据同步,从而为每一次故障做准备。由于软件的复杂性,往往造成在软件开发的过程中为了做一次软件测试,其过程相当的慢。可能为了做一次测试,我们先要等待10分钟以保证整个软件系统完全初始化好。这,你同样可以看到存在可开发性问题。

    对于可开发性问题,我们如何去解决呢?我想这是相当复杂的一个问题,但最为重要的是我们需要对可开发性问题有所认识,从而有意识的去改进或避免。对于前面所提到的大型电信级设备的开发中所存在的两大类可开发性问题,我想谈一谈我的解决方法或想法。

    1)为了解决由于设备的紧缺、交叉编译环境的存在以及调试手段的相对落后而造成的可开发性问题,我想我们是否可以采用其它的高效的开发工具来加以解决,比如,我们可以采用Visual Studio来进行软件开发。为了做到这一点,我们需要让我们的程序能运行在Windows上。而要让我们的程序运行在Windows上,我们需要做一定的前期工作。首先要做的是将整个软件分为两大部分:一部分是与硬件相关的,这部分程序必须运行在设备上;另一部分是应用(业务)逻辑相关且与硬件无关的部分,这部分的代码可以放在Windows上运行。那么如何让两部分的程序作为一个整体协同工作呢?答案是通过以太网,也就是说我们的设备需要有以太网接口,这通常不是一个问题。采用这种模式,有点像是将一个单一的系统变成了一个简单的分布式系统。另外,我们需要开发一个跨平台的库,这一库即可以在Windows上运行,也可以在目标设备上运行,且所有的应用(业务)逻辑都应当基于这一库进行开发。这样,我们需要开发时可以采用Windows版本的库,如果不是为了开发,则应当采用目标设备的库。对于大型的电信级设备,其复杂度往往是在应用(业务)逻辑部分,因此,如果我们将这一部分移到了Windows上,那么我们的开发效率将大大的提高。还有一点是,由于应用(业务)逻辑是运行在Windows上的,我们不需要花时间将其传输到目标设备上,这也提高了开发效率。此外,除了前面说的方法,还有一种最为简单的方法是:我们将所有的开发工具都放到目标设备上去,即不采用交叉编译的模式进行开发。但这种方法很多情况下不可行,因为目标设备的硬件资源往往是有限的,即没有那么多的内存、也没有硬盘。

    2)为了解决软件复杂性所造成的可开发性问题,我们需要在软件设计时考虑很多的因素。比如,我们能否采用模块化的方法进行设计,模块不仅仅体现在代码的模块性,而且体现在模块是一个独立的运行体,能方便的进行重新启动。在很多的嵌入式系统中(包括大型的电信级设备)其往往是采用整个设备重启来实现软件重启的,而不是说可分模块进行重启。显然,采用整个设备重启将花费更多的时间。对于通过软件设计来解决可开发性问题,应当说没有一条统一的原则,毕竟每一个系统都不同,只有我们开发过程中去多注意,并采用相应的设计方法加以解决。这需要我们看问题时,站得更高,当然对于我们的能力也要求更高。

    虽然,我在文中采用的是大型电信级设备开发作为一个例子进行DFD的阐述,但我相信,在很多的软件产品的设计中都或多或少的存在这类问题。只是有时这种问题并不严重、或是我们没有意识到它的存在。

    DFD问题不仅仅影响到我们的产品开发速度,更影响到了我们开发人员的生活质量!我想DFD应当引起软件行业更为广泛的关注和重视!

你可能感兴趣的:(职场,休闲,DFD,Developability,可开发性设计)