Brooks曾指出:“爱因斯坦认为自然界必定存在着简单的解释,因为上帝不是反复无常或随心所欲的。软件工程师没有这样的信仰来提供安慰。许多必须控制的复杂性是随心所欲的复杂性。”
定义软件的复杂性。
软件确实有较为简单的软件,系统简单,没有什么复杂的变化,甚至不需要系统的学习,你就可以写出一个和他一样的软件或比他写的更好。但是对于复杂的软件系统,你该怎么办?完犊子。
问题域的复杂性。实际系统的基本功能难以确认解释,非功能需求(可用性、性能、成本、健壮性和可靠性)变化多端。造成这种现象的原因有用户和系统开发者之间的“沟通困难”,用户只是对想要的软件系统有一个模糊的想法。而这是缺乏邻域的经验。缺乏很好的描述性文档。现有的只能是一些文字,插图,这样的文档容易产生歧义,不好理解,而且经常包含一些设计方案,而不是基本需求。解决方法,看到早期的产品(设计文档和原型),会帮助我们更好的促进用户和系统开发人员的沟通与交流。
软件的维护与演化。修正错误时,这是维护;应对需求改变时,这是演化;保持老软件继续工作,这是保护。
管理开发过程的困难性。对于开发团队来说,主要的管理挑战总是维持设计的一致性和完整性。
软件中随处可能出现的灵活性(既是优点,也是缺点)。软件行业还是一种劳动密集型的产业。许多东西需要自己重新开发,并且缺乏一个统一的编码和标准。
描述离散系统行为的问题。造成的原因,组合,这导致系统可能状态的数目非常大。关于系统的正确性,必须满足于可接受的信息级别。
复杂系统的5个属性
层次结构。在Simon和Ando工作的基础之上,Courtis提出:“复杂性常常以层次结构的形式存在。复杂的系统由一些相关的子系统组成,这些子系统又有自己的系统,如此下去,直到达到某种最低层次的基本组件。”“所有系统都有子系统,所有系统都是更大系统的组成部分......一个系统所提供的价值肯定来自于各个组成部分之间的相互关系,而不是来自于单个的组成部分”
相对本原。“选择哪些作为系统的基础组件相对来说比较随意,在很大程度上取决于系统观察者的判断。”
分离关注。组件内的联系通常比组件间的联系更强。这一事实实际上将组件中高频的动作(涉及组件的内部结构)和低频的动作(涉及组件间的相互作用)分离开来。
共同模式。层次结构通常只是由少数不同类型的子系统按照不同的组合和安排方式构成的。(小组件的复用,如细胞)
稳定的中间形式。复杂系统毫无例外都是从能工作的简单系统演变而来的。
总结:软件本质上是复杂的,软件系统的复杂性常常超出了人类智能的范围。
原文:https://www.cnblogs.com/happyness-world/p/14052149.html