开发高质量的软件是一件极具挑战的工作。其中一个重要的原因就是对于“质量”的定义各不相同,变化莫测。

杰拉尔德温伯格在他的四部曲巨作《质量软件管理》的第一卷第一章中就谈到了什么是质量以及质量的重要性。温伯格在书中讲了一个很有趣的故事。某软件企业每年都会根据所开发软件的质量对开发团队进行奖励,质量好的团队将会获得相应的嘉奖。可是如何评价软件的质量是一个令人头疼问题,于是他们采用了量化指标,根据用户反馈的defect的数量来定。某款软件质量超群,自推出至市场以来,只收到了一个defect。于是开发相应软件的团队获得了年度质量大奖!可是这款软件真的是一款高质量的软件么?看看这个defect的内容吧:“该软件无法安装!”

为了了解软件的质量是否满足要求,我们必须定义软件的质量属性(Quality Attributes)。同时质量属性也是影响软件架构的重要因素。软件架构主要由需求决定,需求有功能性的和非功能性的,其中非功能性的需求主要就是指质量属性,即各种“性”(“-ilities“)。wikipedia上列出了大概80种不同的质量属性,下面我们讨论一下其中最常见的属性。

针对这些问题,为了增加可用性,需要考虑

糟糕的软件中这三点往往是一起出现的。

软件系统通常可以通过以分层,组件化等方式来提高灵活性。我在实践中的原则是”用简单构造复杂“。软件系统本身是非常复杂的,然而构建软件系统的基本单元却应该是非常简单的。例如计算机的基本组成单元是门电路,每一个门电路都非常简单,然而计算机系统却是如此的复杂和灵活。凯文凯利在他的《失控》一书中,也有同样的观点。

构建灵活软件系统的关键在于找到那个简单单元的边界,每一个单元应该足够的简单,但是不能够过于简单,爱因斯坦说过“Simple,but not Simpler!”

我们可以看出,这些问题大多是管理的问题。我个人认为,为了实现概念一致性,在软件的设计过程中应该尽可能少的引入新的概念。软件设计的过程是一个抽象的过程,我们把复杂的软件系统抽象为一个个的层,问题域,过程,模块,服务,接口,这些都是非常必要的。但是这些东西都应该是越少越好,能在一两层解决的问题,绝不要划分成四五层,能提供一个API接口,绝不要给三个。人类能够同时掌握的概念是有限的,大部分人可能也就三四个把,当你设计的系统中有五六个或者七八个陌生的概念需要同时掌握的时候,对你的团队中其它需要使用你的设计的开发人员来说绝对是一个巨大的挑战。大部分人不会费力气去搞懂你设计的高大上的新概念。他们很有可能会设计出一套对他们自己更容易理解的并行的方案来解决同样的问题。

  • 可用性(Availability

    可用性是指系统正常工作的时间所占的比例。可用性会遇到系统错误,恶意攻击,高负载等问题的影响。

    当年在一家存储公司开发管理软件,"HA"(High Availability)是一个经常被提及的性能属性。"DU"(Data Unavailable)和"DL"(Data Lost)都是非常严重的可用性问题。

    可用性面临的主要问题有:

    • 物理层失效:比如数据库服务器宕机,停电, 网络欠费被中国电信断网

    • 恶意攻击:例如DOS(Deny of Service)攻击

    • 软件的设计问题或BUG:比如错误的资源控制锁导致某个资源长期被占用,各种core dump, out of memery, out of stack。

    • 升级或日常维护

    • 如何设计故障转移(failover),一般可以使用冗余来消除系统中的单点故障。可以是各种冷热备份,分布式系统。

    • 如何设计在线升级。我当年在那家存储公司的一个主要责任就是做在线升级,因为存储设备有两个同时工作的单元构成,所以升级的过程简单说就是先升级第一个单元,然后再升级第二个单元。听上去非常简单,然而实际的升级过程非常复杂,在升级之前,会做非常多的健康检查,比如检查两个单元是不是都在正常工作,有没有坏的磁盘,存储设备的版本是不是满足要求,等等等等。特别是由于存储设备的软硬件型号复杂,还要考虑各种不同的运行环境,各种软件BUG,健康检查非常非常的复杂。当然大多数情况下,用户可以跳过健康检查,然而由此引发的升级失败,后果自负!

    • 如何设计异常处理。异常处理是一个很大的话题,为了支持高可用性,我们应该如何处理异常呢?举个例子,一个网站要处理用户的订单,然而由于数据库服务器的故障,虽然前端的服务一切正常,可是订单无法处理。你会怎么处理这个数据库服务器异常的情况呢?大多数的程序员会在捕获异常的时候写日志,把异常状记录下来,然后在客户端的UI上显示一段谁也看不懂的异常代码。这样的异常处理其实跟没做差不多,甚至更糟。那么把异常代码翻译成用户可以看懂的语言是不是会好一点呢?也许会,如果你告诉用户因为你的数据库故障,请明天再来,可想而知用户会多么失望!好的异常处理是把用户的订单请求记录下来,发给人工处理,或者等待数据库恢复后自动处理,并告诉用户订单已经处理,并有可能迟延,请求得到用户的谅解。

    • 如何应对不稳定的网络连接。

  • 灵活性 (Flexibility

    灵活性是指系统是否能够很容易的适应环境和需求的变化。

    例如现在需求是返回10以内的所有质数。我们可以使用以下程序:

    function prime(){var result = [2,3,5,7];return result;
    }

    这段程序非常好,性能也非常高。然而非常的不具备灵活性,通过对需求的分析我们似乎可以大胆的预见10是一个非常有可能会改变的需求,于是提高灵活性的方式就是把10变成可变参数:

    function prime(range){var result = [];var i,k;for(i=2; i<=range; i++){result.push(i);}for(i=0; i<result.length; i++){for(k=i+1; k<result.length; k++){if(result[k]%result[i]==0){result.splice(k,1);}}}return result;
    }

    我们看到第二段代码为了增加灵活性,代码变的更复杂,运行时间变长。当然第一段代码中的质数根本就没有经过计算验证,完全是我自己计算出来的,因为10以内的质数这样简单的运算根本不需要计算机。

    在软件开发中有哪些问题会引起灵活性下降呢?

    • 由于各种原因而造成的数量惊人的代码

    • 过于复杂的代码

    • 不断重复的代码

  • 概念一致性 (Conceptual Integrity

    我们很少在软件设计的时候谈论概念一致性,也许我们认为概念一致是一个共同的假定,然而实际上,在软件开发的过程中,往往会出现很多概念不一致的情况。

    概念一致性的问题主要表现在以下的方面:

    • 在一个模块的设计中混杂不同的问题域

    • 不同的组织或者团队负责系统中的同一个功能

    • 没有统一的代码规范

    • 为了满足后向兼容,系统中存在新旧两套不同的代码栈

在以后我们将接着讨论软件中其它主要的质量属性。

当我们设计软件的时候,需要定义哪些质量属性是我们希望实现的,切记,质量属性并非越多越好。一般来说找到最重要的三个来构建软件就好了,而且"鱼和熊掌不能得兼",各个质量属性之间有可能是互相矛盾或者互相影响的。分布式数据库中的CAP理论就是一个典型的例子。对于一个分布式的计算系统可不能同时满足一致性(Consistency),可用性(Availability),分区容忍性(Partition Tolerance)。

软件中的质量属性(一)相关推荐

  1. 软件构造 第一章第二节 软件开发的质量属性

    ​软件构造 第一章第二节 软件开发的质量属性 1.软件系统质量指标 External quality factors affect users 外部质量因素影响用户 Internal quality ...

  2. 软件体系架构——质量属性

    以<淘宝网>为例,描绘质量属性的六个常见属性场景,将上述整理为一篇博客发表. 1.可用性分析 可用性分析所关注的方面包括:如何检测系统故障,系统故障发生的频度,出现故障时会发生什么情况,允 ...

  3. bootstraptable设置行高度_条码打印软件中不干胶卷纸的标签设置方法

    条码打印软件中的标签设置是根据打印机中的实际标签纸的情况进行设置的,不同的标签纸有不同的设置方法(如A4的平张纸,或者单排.双排.多排的不干胶卷纸都有相对的设置方法).今天就用中琅条码打印软件给大家演 ...

  4. 软件设计——质量属性(非功能性需求)

    当你在收集需求的时候 人们会很乐意给你一个愿望清单,写满了他们想要软件系统所完成的事,也有完善的方法以用户故事.用例.传统的需求规格书.验收标准等形式来捕捉这些功能需求 但是那些讨厌的非功能性需求呢? ...

  5. 软件的设计原则,设计模式以及软件的质量属性

    文章目录 软件的设计 设计原则 设计模式 软件的质量属性 定义 关系 软件的设计 ant design 设计价值观 在蚂蚁的开源项目ant design的介绍中,谈到了价值观,原则和模式之间的关系: ...

  6. 探讨如何确保对日软件外包开发过程中的质量

    2019独角兽企业重金招聘Python工程师标准>>> 摘 要:对日软件外包是目前在国内发展迅速的一个行业,但是由于国界.地域.语言.习俗等差异,导致了对日软件外包的质量得不到保证. ...

  7. 高质量软件中的7项自动化要求

    目录 翻译内容 Summary(摘要): 正文 关于作者 Sammy Tam 原链接 翻译内容 Summary(摘要): An advanced, efficient test automation ...

  8. 基于框架的应用系统的质量属性

    质量属性指的是影响质量的相关因素,是对质量的描述.下面我从6个常见的系统质量属性和一些其他质量属性进行系统的质量描述. 系统质量属性: 可用性: 在可用性方面,本系统可以相对应的任务如用户信息的传输, ...

  9. 【转载】实现软件架构质量属性的战术

    原文地址:http://www.uml.org.cn/zjjs/201309043.asp 架构设计则为满足架构需求的质量属性寻找适当的战术.对如何实现特定的质量属性感兴趣.质量需求指定了软件的响应, ...

最新文章

  1. 综述 | 基于深度学习的目标检测算法
  2. 四则运算 3.0 结对
  3. dyld: Library not loaded: @rpath/MySDK.framework/MySDK 错误解决
  4. 面试问烂的 MySQL 四种隔离级别,看完吊打面试官!
  5. 中文微博与社会化媒体的区域距离
  6. [渝粤教育] 长沙民政职业技术学院 高职公共英语(一) 参考 资料
  7. linux io分析工具,io性能分析工具-iostat
  8. kabina 使用说明_Kibana安装及使用说明
  9. 计算机二级考试改错题技巧
  10. 介绍一下ajax后最好的返回结果的方式#34;Json#34;
  11. nginx一些重要配置说明
  12. android通用adapter,Android通用ListViewAdapter的编写。
  13. 《从零开始学Swift》学习笔记(Day 30)——选择类还是结构体呢?
  14. word 技巧 - 删除指定页页眉
  15. 童年十大经典玩耍游戏
  16. 使用Python-OpenCV将图片批量转换为jpg格式
  17. java时区转换_java中的时区转换
  18. 群晖如何建php网站_群晖建博客详细教程
  19. STM32与ARM7、ARM9、ARM11
  20. CVX示例库之多面体的Chebyshev中心

热门文章

  1. iOS字符串大小写转换
  2. windows 安装 OpenSSH
  3. 微信小程序设置字体无效_微信小程序自定义字体及自定义图标问题说明
  4. 程序设计教程用c 语言编程,程序设计教程:用C/C++语言编程
  5. was英文读音_英语单词was怎么读,was的音标是什么,was是什么意思 - 音标网
  6. Java项目:销售团队后台管理系统(java+SpringBoot+FreeMarker+bootstrap+echarts+mysql)
  7. mybatis数据库框架应用之餐馆点菜系统
  8. 百度网盘目录管理系统
  9. go语言基础 数学包 math
  10. php音乐链接,用PHP获取虾米音乐网的下载链接_php