美文网首页
软件复杂度概述

软件复杂度概述

作者: 立日心义 | 来源:发表于2018-11-14 22:53 被阅读0次

20世纪60、70年代,软件系统的规模越来越大,复杂度越来越高,软件危机爆发,软件工程应运而生。如何合理有效的度量复杂度并加以控制,成为科研人员探索的主题。1976年McCabe提出并开发了McCabe Cyclomatic Metric,对软件进行结构测试。1977年Halstead提出软件标准。这两种方法是复杂度度量的开始。

1976年McCabe提出圈复杂度,从提出至今,四十余年的发展中,圈复杂度在工业界和学术界都备受重视,学术界仍在有研究圈复杂度的文章,工业界中,度量软件复杂度的主流方法仍然是圈复杂度。

圈复杂度的现状

在阅读了关于圈复杂度2010年至今的文章,圈复杂度的文章可以分为几大类,一则结合圈复杂度本身图论的性质,例如用作UML图可理解度的度量,二是,作为众多复杂度度量方法之一,用作软件指标的测量,探究对软件属性的影响。

近几年对于圈复杂度方法改进的的文章少见,一方面,圈复杂度作为一个成熟的方法,很难再有突破,另一方面,学术界对圈复杂度颇有微词。

圈复杂度仅仅考虑了软件的设计结构,并未考虑的软件的输入、输出,这是一种不全面的计算方式。圈复杂度于1976年提出,此时,面向对象编程语言尚未出现,而今,面向方法早已占据了编程语言的半壁江山,此时的圈复杂度方法是否仍然适用,是一个有待探讨的问题。

针对面向对象语言的度量方法也有诸多,但是技术或者是理论的限制,这些方法并没有被工业界广泛应用,以至于工业界目前所知道的、使用的额,仍然是圈复杂度。

认知复杂度的兴起

2000年后,认知信息学,突飞猛进,这种新的理论方法,逐渐被应用到软件工程领域,以wang为代表的研究者,提出软件是一个信息实体,理解信息的复杂度即代表着软件难于理解的复杂度,这一思想,成为之后软工领域提出、改进认知复杂度方法的基础。

2002年wang提出了认知功能规模(Cognitive

Functional Size, CFS),认知复杂度的方法首次被提出,在此之后的方法都是基于CFS改进的,包括CICM、MCCM、CPCM等。Wang在CFS的论文中,总结了基础控制结构(Basic Control Structure,BCS),基础控制结构是构建软件逻辑体系结构的基本流程结构,wang通过心理实验的方法,为每一种结构分配认知权重,例如顺序的结构的权重是1,分支结构的权重是3,数字越大,即代表着理解结构越困难。

复杂度度量方法的验证

复杂度方法的验证,目前多是通过1988年weyuker提出的9种属性的验证,这种方法只能从宏观上描述一个度量方法是否有效:譬如度量两个不同的程序,值是否不同。定性的度量方法只解决了可不可以用的问题,是否可靠的问题尚未解决。验证薄弱,论文还会通过对比和专家经验,对比方法即将提出的方法与已有的方法纵向对比,主要比较的属性是对于不同的程序的区分度,不同语言的适用性。专家经验一般专用于验证认知复杂度的方法,对比认知方法度量的值和专家的评价值,若保持一致,即认为提出的方法更有效。

阈值的设定

引入复杂度度量方法,是希求能定量的计算出程序或软件的复杂度,从而提醒开发人员,重构代码,控制复杂度。便需要复杂度阈值的概念,即复杂度超过某个值需要控制复杂度,在哪个区间范围时合理的。一般来说,不同的度量方法,针对不同的语言,会有不同的阈值。McCabe&Associates公司曾建议圈复杂度的阈值要控制在10以下。此阈值没有针对不同的语言,也没有说明所度量程序或者是软件的大小。这个阈值在工业界已经稍有使用,工业界目前对于何时控制一般采取经验值,或者不做控制。

复杂度的意义

复杂度是否有意义,这个问题的答案实则等价于问,软件工程是否有意义,软件的不可见性,复杂,以及人为决定了软件是一个不可控极为矛盾的实体,复杂度方法所能做的,尽可能准确、客观指导开发人员控制软件的复杂度。从人的角度来看,软件复杂度是难以理解、难以维护的程度;从软件的生命周期来看,复杂度是软件设计、实现、维护和改变的难度;从软件本身开看,复杂度是软件的固有静态属性。

软件复杂度度量方法是否有意义,软件复杂度本身研究是否有意义,也许要从软件工程发展历史之路来看,但凡能有所作用的、有所改善的,都是必要的。

相关文章

  • 软件复杂度概述

    20世纪60、70年代,软件系统的规模越来越大,复杂度越来越高,软件危机爆发,软件工程应运而生。如何合理有效的度量...

  • 敏捷开发指导思想

    敏捷概述 背景 敏捷开发最早被提出应用于软件开发管理流程中。随着时代发展,软件规模和复杂度激增,需求变化加快,软件...

  • 打造一支精而强的技术团队

    软件开发的现状• 软件的复杂度持续不断地提升• 业务需求复杂度• 部署运营规模复杂度• 维护支持复杂度• 软件开发...

  • 软件的复杂度 vs 难度

    本文是对于软件复杂度的零碎思考和记录。 内容包括,软件复杂度本身没有统一定义; 介绍常见代码复杂度,圈复杂度;比较...

  • 基于jenkins搭建一个持续集成服务器

    持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已...

  • 数据结构与算法 复杂度分析

    复杂度:时间复杂度和空间复杂度。复杂度的分析是学习数据结构与算法的基础! 极简概述 复杂度的分析已经有很多很好...

  • 阿里研究员谷朴:API 设计最佳实践的思考

    API是软件系统的核心,而软件系统的复杂度Complexity是大规模软件系统能否成功最重要的因素。但复杂度Com...

  • 算法1:概述与排序算法

    1.概述 1.1 简介 1.2 算法效率的衡量 1.2.1 时间复杂度 1.2.2 空间复杂度: 1.3 常见...

  • 不吹不黑,DDD领域驱动设计与软件复杂度你真不一定能get到

    软件开发领域中,软件复杂度是一个由来已久的话题,从软件的诞生到成熟再到消亡,或多或少总会伴随着软件复杂度的讨论。 ...

  • 分离软件中易变部分和稳定部分

    软件中存在本质复杂度和偶发复杂度,即对应软件中易变部分和稳定部分。对于本质复杂度,指的就是业务逻辑,这部分是无论如...

网友评论

      本文标题:软件复杂度概述

      本文链接:https://www.haomeiwen.com/subject/xcwsfqtx.html