zoukankan      html  css  js  c++  java
  • 科技小论文

    质量属性

    赵家明 高欣跃 白明霞

    (石家庄铁道大学   软件工程学院   河北省  石家庄   050300)

    摘要:开发高质量的软件是一件极具挑战的工作。其中一个重要的原因就是对于“质量”的定义各不相同,变化莫测。某软件企业每年都会根据所开发软件的质量对开发团队进行奖励,质量好的团队将会获得相应的嘉奖。可是如何评价软件的质量是一个令人头疼问题,于是他们采用了量化指标,根据用户反馈的缺陷的数量来定。某款软件质量超群,自推出至市场以来,只收到了一个缺陷。可是这款软件真的是一款高质量的软件么?结果这个缺陷的内容是:“该软件无法安装!”为了了解软件的质量是否满足要求,我们必须定义软件的质量属性。同时质量属性也是影响软件架构的重要因素。软件架构主要由需求决定,需求有功能性的和非功能性的,其中非功能性的需求主要就是指质量属性,即各种“属性”。

    关键词:质量属性,量化目标,软件架构

    Developing high quality software is a challenging task. One of the important reasons is that the definition of "quality" is different and unpredictable. A software enterprise will reward the development team according to the quality of the developed software every year, and the team with good quality will be rewarded accordingly. However, how to evaluate the quality of software is a headache, so they use quantitative indicators, based on the number of defects fed back by users. The quality of a software is superior. Since it was launched to the market, only one defect has been received. But is this software really a high-quality software? The result of this defect is: "the software cannot be installed!" In order to know whether the quality of software meets the requirements, we must define the quality attributes of software. At the same time, quality attribute is also an important factor affecting software architecture. Software architecture is mainly determined by requirements, which are functional and non functional. Non functional requirements mainly refer to quality attributes, i.e. various "attributes".

    Keywords:Quality attribute;Quantitative objectives;Software architecture;

    一、引言

    软件系统通常可以通过以分层,组件化等方式来提高灵活性。凯文凯利在他的《失控》一书中,也有同样的观点。构建灵活软件系统的关键在于找到那个简单单元的边界,每一个单元应该足够的简单,但是不能够过于简单,爱因斯坦说过“Simple,but not Simpler!”我们可以看出,这些问题大多是管理的问题。我个人认为,为了实现概念一致性,在软件的设计过程中应该尽可能少的引入新的概念。软件设计的过程是一个抽象的过程,我们把复杂的软件系统抽象为一个个的层,问题域,过程,模块,服务,接口,这些都是非常必要的。但是这些东西都应该是越少越好,能在一两层解决的问题,绝不要划分成四五层,能提供一个API接口,绝不要给三个。大部分人不会费力气去搞懂你设计的高大上的新概念。他们很有可能会设计出一套对他们自己更容易理解的并行的方案来解决同样的问题。

    二、质量属性

    1、可用性

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

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

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

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

    恶意攻击:例如DOSDeny of Service)攻击

    软件的设计问题或BUG:比如错误的资源控制锁导致某个资源长期被占用

    升级或日常维护

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

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

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

    2、可修改

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

    例如现在需求是返回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以内的质数这样简单的运算根本不需要计算机。

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

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

    b、过于复杂的代码

    c、不断重复的代码

    3性能

      性能通常是指软件的 “ 时间 - 空间 ” 效率,而不仅是指软件的运行速度。既要马儿跑得快,又要马儿吃的少。性能优化的关键工作是找出限制性能的 “ 瓶颈 ” ,不要在无关痛痒的地方瞎忙乎性能优化就好像从海绵里挤水一样,你不挤,水就不出来,你越挤海绵越干。

    4易用性

      易用性是指用户使用软件的容易程度导致软件易用性差的根本原因:理工科大学教育存在缺陷,开发人员犯了“错位”的毛病.软件的易用性要让用户来评价。

    5安全性  

      这里安全性是指信息安全,英文是 Security 而不是 Safety 。安全性是指防止系统被非法入侵的能力,既属于技术问题又属于管理问题。黑客:真是“道高一尺,魔高一丈”!  开发商和客户愿意为提高安全性而投入的资金是有限的,他们要考虑值不值得。  究竟什么样的安全性是令人满意的呢?一般地,如果黑客为非法入侵花费的代价(考虑时间、费用、风险等因素)高于得到的好处,那么这样的系统可以认为是安全的。对于普通软件,并不一点要追求很高的安全性,也不能完全忽视安全性,要先分析黑客行为。  

    6、可测试性

      软件的可移植性指的是软件不经修改或稍加修改就可以运行于不同软硬件环境( CPU 、 OS 和编译器)的能力,主要体现为代码的可移植性。编程语言越低级,用它编写的程序越难移植,反之则越容易。这是因为,不同的硬件体系结构(例如 Intel CPU 和 SPARC CPU )使用不同的指令集和字长,而 OS 和编译器可以屏蔽这种差异,所以高级语言的可移植性更好。Java 程序号称“一次编译,到处运行”,具有 100% 的可移植性。为了提高 Java 程序的性能,最新的 Java 标准允许人们使用一些与平台相关的优化技术,这样优化后的 Java 程序虽然不能“一次编译,到处运行”,仍然能够   “一次编程,到处编译”。软件设计时应该将“设备相关程序”与“设备无关程序”分开,将“功能模块”与“用户界面”分开。

    三、结束语

    软件质量属性划分抄为运行期质量属性和开发期质量属性两大类。开发期质量属性其实包含了和软件开发,维护和移植这三类活动相关的所有质量属性,百这些是开发人员,开发管理人员和维护度人员都非常关心 的,对最终用户而言,这些质量属性只是间接地促进用户需求的满足知;而运行期 质量属性是软件系统在运行期间,最终用户可以直接感受到的一类属性,道这些质量 属性直接影响着用户对软件产品的满意度。

  • 相关阅读:
    尚未笔记知识点
    jsonp的原理及其使用
    django中将views.py中的python方法传递给html模板文件
    UVA
    UVA
    UVA
    UVA
    UVA
    UVA 1600 Patrol Robot
    UVA
  • 原文地址:https://www.cnblogs.com/zjm15511858030/p/12757782.html
Copyright © 2011-2022 走看看