需求分析是解决做什么的问题,设计则是解决如何去做的问题。
很多的软件公司在概念上是按宏观-微观的思维方法将系统设计分为概要设计和详细设计,这也是传统软件工程思想的划分方法。实际工作当中,尤其是体现在思维以及文字方面,我们是按不同的方面去进行设计的,所谓的概要设计和详细设计只是分在了不同的文档上。由于实际情况的局限,更多时候我们在文档上偏重于概要设计,详细设计可能在编码时穿插进行,且仅存于编码人员的头脑之中,在把更多自由给了编码人员的同时,也埋下了较多的设计风险。
个人认为,宏观-微观的思维方法在处理设计时是不够明确的,用它来处理需求问题更为合适。这是因为,在处理未知的事情时,我们应先明确范围和目标,然后再深入到事物的内部,对其中的细枝末节进行详细的分析。用户需求十分符合这个特性,设计则不然。在设计之前,我们肯定已经明确了用户的需求,即已经确定了设计的范围何目标,接下来就应该从系统结构、模块、数据结构与算法、用户界面等方面进行分析设计。
系统结构设计
系统结构好比人的骨架,它应具备最基本的三个特性:稳定、通用、高效。稳定是对体系结构最基本的要求,就和人体一样,皮肉之伤不算大事,伤筋动骨麻烦就大了,因此一旦有需求变化,是不能影响到系统结构的,否则,系统结构的设计就是不合理的。所谓通用,也可以理解为灵活,即系统结构能满足系统中绝大多数功能的需求,是一切功能的基础,换句话说,在系统结构基础上稍做进一步加工,就可实现用户的多种需求。高效体现的是系统设计人员对软件设计更深层次的认知,虽然现在硬件设备的效率较比以前已经有了大幅提高,但还是应该在软件设计当中“勤俭节约”,不能过分浪费硬件的运算效率,注重数据结构设计和算法设计的高级设计人员都深不谙此道。
模块设计
我们通常说的模块其实是按功能的划分的,这所以按功能划分,是为了遵循模块设计最基本的原则——功能独立。功能独立可以降低编码、测试、维护的代价(尤其是维护),但功能独立又不是绝对的,而是相对概念,毕竟模块与模块之间需要通信,需要协同工作。因此,设计功能独立的模块的前提必须是考虑好模块间的协作关系,这就需要从信息保密、内聚与耦合、封闭-开放三方面去考虑。信息保密,模块与模块之间的通信不能毫无限制,有些信息需要公开,有些信息则必须要独自保密,公有与私有划分清楚,这才是严谨的设计。高内聚和低耦合是高质量软件设计的一个基本标准,我们应当严格的遵守。如果一个模块可以作为一个独立体被其它程序引用,则称模块具有封闭性。如果一个模块可以被扩充,则称模块具有开放性。模块的“封闭——开放性”实际上对应于软件质量因素中的可复用性和可扩充性。采用面向过程的方法进行程序设计,很难开发出既具有封闭性又具有开放性的模块。采用面向对象设计方法可以较好地解决这个问题。
数据结构与算法设计
前面已经提到,高级设计人员都比较注重数据结构和算法的设计。现在的软件开发为了达到工业化生产的目标,往往都是基于某一个或几个技术框架进行开发的,例如现在Java界流行的Hibernate、Spring架构等。毋庸置疑,这些所谓的架构大大提高了软件公司的开发效率,但其负面影响也是显而易见的,程序员越来越成为重复编码的机器,而不是创造的源泉。太多的细节被封装起来,包括数据结构和算法,程序员不用再关心这些,但这些框架被千篇一律的应用却造成了对硬件资源的极大浪费,所以我个人认为程序员还是不要去过分炫耀对这些框架使用的有多熟练,深度掌握数据结构和算法设计才是王道。
言归正传,高效率的软件确实是来源于深刻的数据结构和算法设计,而不是个别的编程技巧。每一种数据结构和算法都有其时间和空间的开销,当然也有收益,这就需要掌握其中的原理,还有就是存储介质的特性,内存和硬盘是不同的。空间和时间是互相制约的两方面,我们必须仔细研究,才能让两者平衡,以期达到最高的收益。更基本的,算法必须以需求为基础,不能脱离需求,更不能为算法而算法。
界面设计
说到界面,就有一大堆理论。程序员往往在审美方面比较迟钝,界面设计人员虽然懂得美学的基本理论,但是,有很多时候界面的美观与操作的灵活是有冲突的,软件的主宰还是程序员。他们宁愿选择灵活的操作,也不愿追求虚华的外壳,这是程序员骨子里的性格,他们鄙视一切虚无的东西,世界非1即0,你把1涂成红色,它还是1,把0弄的五彩缤纷,它也变不成1。
因此,要纠正一个错误的认识,所谓优秀的界面并不是指界面有多华丽,而是指界面之中隐藏的含义。我认为,一个优秀的软件界面设计至少应该包含一下几点:
1. 清晰可见
2. 界面一致
3. 导向明确
4. 有点个性
其它的,根据用户的喜好不同,可能就得灵活处理了。五彩缤纷的界面不一定好,黑白单调的界面也不一定坏,最主要的,还是得有个性,得让人能够见一面而记终生。
说白了,系统设计也无非就这些东西,很多时候为设计头疼,不是设计有多难,而是太囿于既有的文档格式,在文档的束缚下无法发挥自己的理解和认知。
好的软件需要有创造性的思维,要有创造性,就得自由才行。