论软件的复杂性

原创 2006年05月31日 11:54:00

目前软件所采用的体系结构相对要解决的问题来说,不管要解决的问题本身是简单还是复杂,软件给出的解决方案通常都不会简单,尤其是一些企业级解决方案。

软件是用来解决问题的,如果问题域本身已经很复杂,再使用一个更加复杂的工具去解决它,其成功的概率为0。关于问题域的复杂性可以参阅布鲁克斯那篇“没有银弹”的经典文章,本文关注的是软件的复杂性。

从软件的发展历程看,复杂系统通常都会失败,不过失败后都通常会衍生出一个相对简单而实用的系统。这些复杂系统初始的目标看上去都很完美,可以被当成万能药使用,因此其实现通常都会比较复杂,难以学习,难以使用。这时一些实现相同目标的相对简单的系统就会出现,虽然这些简单系统有一些缺陷,但其实用性很强,通常比其复杂的前辈更能得到推广。 下面的例子充分说明了这点:

为简化MULTICS而诞生的UNIX已被广泛使用了30多年,再继续用上30年应该也没问题。 UNIX的核心思想就是保持简洁性。(参见 Eric S. Raymond   The Art of Unix Programming)

目前在Internet上广泛使用的TCP/IP协议是从一个叫OSI (Open Systems Interconnection)的模型简化后得到的。在OSI模型中,网络被分成了7层,而不是TCP/IP的4层。实现一个7层的协议要比4层协议困难得多,虽然也有7层的实现,不过由于其bug太多,最终被实现相对比较容易的TCP/IP所替代。

针对J2EE复杂性而出现的轻量级解决方案如Spring、Hibernate、Ruby On Rails等。

再举一个mail的例子,现在使用的SMTP和POP3有很多设计上的缺陷,导致存在安全隐患和垃圾邮件横行,但相比复杂的X.400协议,SMTP和POP3实现要简单很多,而且大部分情况下是可以满足用户发送邮件的需求的。所以现在很少见到X.400。

软件复杂性产生的原因大致可归结为以下方面:

  • 追求完美,想发明“银弹”。希望系统能对要解决的问题给出一个完美而通用的方案,因此就将所有可能的情况都加入到系统实现中,使得系统变得复杂,庞大。如MULTICS、CORBA、OSI等, 从实践看,这样的系统通常不会有很长的生命力或得到广泛应用。

 

  • 系统使用过程中逐步变得复杂。 系统初始设计时吸取前车经验,会比较简单,但随着使用者的增多,新的需求也不断提出,另外还要在竞争中保持优先,新特性会不断加入系统,使系统变得复杂。Java就是个例子,刚诞生时对C++作了很多简化,很快风靡软件界。 但到了10年后再看Java,当初简化掉的特性基本都已加入系统。 Java的这种复杂性使得一些相对简单的动态语言红极一时。

 

  • 利益驱使或个人表现。 不把系统搞得复杂一点不能够将价格抬上去,另外将系统搞复杂一点可以让人不能一下看出其深浅长短,以显得高深莫测。

 

软件复杂性带来的危害:

  • 增加开发难度,降低开发效率。 开发一个复杂的系统需要耗费不少精力去应对复杂性本身所带来的附加工作量,不能有效关注在解决问题本身,造成开发效率的降低。

 

  • 增加维护难度。 维护一个复杂系统是一个很艰巨的任务,你需要时刻防备系统不稳定性造成的故障。当要扩展系统时,其复杂性将成为一个需要花大力克服障碍。

 

  • 增加学习使用难度。复杂性会使学习曲线变得陡峭,如果封装得不好,会对操作带来很多的不便,通常需要花费很多的时间才能掌握其操作。

图灵奖得主、QuickSort算法的发明人霍尔曾说过,开发软件有两种方法:一种是使系统尽可能简单,使它看上去没有什么缺陷;另一种是将系统弄得很复杂,使你很难看出它有什么缺陷。

软件工程系列教材:软件架构设计实践教程

第1章 认识软件架构 1.1 软件架构与软件工程 1.1.1 软件产业的工业化与现代化 1.1.2 软件系统的复杂性 1.1.3 克服“软件危机”的进程 1.1.4 现代软件产业发展的时代特...
  • judyge
  • judyge
  • 2014年11月13日 19:39
  • 1197

软件工程(C编码实践篇)

软件工程(C编码实践篇)丁吉平 原创作品转载请注明出处 《软件工程(C编码实践篇)》 MOOC课程 http://mooc.study.163.com/course/USTC-1000002006 ...
  • dingji_ping
  • dingji_ping
  • 2015年11月10日 09:42
  • 688

论软件的复杂性

目前软件所采用的体系结构相对要解决的问题来说,不管要解决的问题本身是简单还是复杂,软件给出的解决方案通常都不会简单,尤其是一些企业级解决方案。软件是用来解决问题的,如果问题域本身已经很复杂,再使用一个...
  • wishfly
  • wishfly
  • 2007年10月30日 10:12
  • 630

软件复杂性分析

1,目的:更好地对软件开发过程进行控制;                提高软件的可靠性和可维护性;                降低由复杂性引发软件错误的可能性;              ...
  • v_forget
  • v_forget
  • 2015年09月27日 18:53
  • 719

面向对象程序设计

软件危机(Software Crisis)软件技术总是处于不断发展变化中,新工具、新技术相继产生。这就要求软件产业和软件工程师们不停的寻求软件设计和开发的新途径。由于日益增长的软件系统的复杂性和软件产...
  • flyingsnowy
  • flyingsnowy
  • 2006年03月28日 11:52
  • 1673

C++网络编程 卷1 运用ACE和模式消除复杂性.pdf

  • 2009年05月22日 18:01
  • 27.75MB
  • 下载

软件开发复杂性的解决方法(二)

5 面向对象技术   利用面向对象(object-oricnted,OO)技术可以充分体现分解、抽象、模块化、信息隐蔽等思想,可以很有效地提高软件生产率、缩短软件开发时间、提高软件质量,是控制软件复...
  • aibieqing241
  • aibieqing241
  • 2013年06月19日 10:50
  • 915

软件系统的复杂性

软件系统的本质是复杂的,开发团队的任务就是制造出简单的假象。 软件的复杂性是其根本特征,原因在于: 问题域的复杂性:软件系统一般都是处理逻辑或业务规则比较复杂的问题。 管理开发过程的困难...
  • luoxinwu123
  • luoxinwu123
  • 2012年12月27日 09:29
  • 2482

1-软件体系结构基础

1-软件体系结构基础1.1 为什么需要“软件体系结构”?——从“软件危机”谈起1.1.1 软件危机介绍 随着计算机应用的逐渐扩大,软件需求量逐渐增加,规模也日益增长,软件规模的快速增长,也带来了软件的...
  • qq_22841811
  • qq_22841811
  • 2017年01月22日 20:54
  • 762

软件工程(C编码实践篇)

软件工程(C编码实践篇)学习总结周朋飞+ 原创作品转载请注明出处 + 《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002...
  • qq_36766564
  • qq_36766564
  • 2016年11月20日 16:43
  • 67
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:论软件的复杂性
举报原因:
原因补充:

(最多只允许输入30个字)