论软件体系架构之质量属性

发表于:2020-7-02 11:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:马旺旺    来源:博客园

  摘 要:软件架构(及软件架构设计师)重点关注的是质量属性。文章从常见的六个质量属性,即可用性、可修改性、性能、安全性、可测试性、易用性写起,使读者对其有初步的认识和了解。解决了在具体的软件开发环境中的质量属性是什么,怎么用,如何用好的问题。只用遵循质量属性的原则,才能有好的设计思想,才能开发出好的软件产品。
  0 引言
  为了了解软件的质量是否满足要求,我们必须定义软件的质量属性(Quality Attributes)。同时质量属性也是影响软件架构的重要因素。软件架构主要由需求决定,需求有功能性的和非功能性的,其中非功能性的需求主要就是指质量属性。wikipedia上列出了大概80种不同的质量属性,下面我们讨论一下其中最常见的属性。
  1 可用性
  可用性是指系统正常工作的时间所占的比例。可用性会遇到系统错误,恶意攻击,高负载等问题的影响。
  在实际软件开发过程中,"HA"(High Availability)是一个经常被提及的性能属性。"DU"(Data Unavailable)和"DL"(Data Lost)都是非常严重的可用性问题。
  可用性面临的主要问题有:
  (1)物理层失效:比如数据库服务器宕机,停电, 网络欠费被中国电信断网。
  (2)恶意攻击:例如DOS(Deny of Service)攻击。
  (3)软件的设计问题或BUG:比如错误的资源控制锁导致某个资源长期被占用,各种core dump, out of memery, out of stack。
  (4)升级或日常维护。
  针对这些问题,为了增加可用性,需要考虑:
  (1)如何设计故障转移(failover),一般可以使用冗余来消除系统中的单点故障。可以是各种冷热备份,分布式系统。
  (2)如何设计在线升级。由于存储设备有两个同时工作的单元构成,所以升级的过程简单说就是先升级第一个单元,然后再升级第二个单元。听上去非常简单,然而实际的升级过程非常复杂,在升级之前,会做非常多的健康检查,比如检查两个单元是不是都在正常工作,有没有坏的磁盘,存储设备的版本是不是满足要求。特别是由于存储设备的软硬件型号复杂,还要考虑各种不同的运行环境,各种软件BUG,健康检查非常非常的复杂。
  (3)如何设计异常处理。异常处理是一个很大的话题,为了支持高可用性,我们应该如何处理异常呢?举个例子,一个网站要处理用户的订单,然而由于数据库服务器的故障,虽然前端的服务一切正常,可是订单无法处理。你会怎么处理这个数据库服务器异常的情况呢?大多数的程序员会在捕获异常的时候写日志,把异常状记录下来,然后在客户端的UI上显示一段谁也看不懂的异常代码。这样的异常处理其实跟没做差不多,甚至更糟。那么把异常代码翻译成用户可以看懂的语言是不是会好一点呢?也许会,如果你告诉用户因为你的数据库故障,请明天再来,可想而知用户会多么失望!好的异常处理是把用户的订单请求记录下来,发给人工处理,或者等待数据库恢复后自动处理,并告诉用户订单已经处理,并有可能迟延,请求得到用户的谅解。
  (4)如何应对不稳定的网络连接。
  2 可修改性
  可修改性是有关变更的成本问题。它提出了两个关注点:
  (1)可以修改什么?
  可以修改系统的任何方面 ,最常见的就是系统计算的功能、系统存在平台(硬件、操作系统和中间件等 )、系统运行的环境(它必须与之互操作的系统,它用于与其他部分进行通信的协议,等等)、系统所展示的质量属性(其性能、可靠性、甚至包括将来的可修改性)以及其容量(所支持的用户数量、同时发生的操作的数量,等等)。
  (2)何时进行变更以及由谁进行变更?
  最常见的就是修改源代码。也就是说,开发人员必须修改代码,对修改后的代码进行测试,然后将其部署在新版中。然而,现在不仅仅是何时变更的问题,而且还有由谁进行变更的问题。
  3 性能
  性能是指软件及时提供相应服务的能力。具体而言,性能包括速度、吞吐量和持续高速性三方面的要求:
  (1)速度往往通过平均响应时间来度量;
  (2)吞吐量通过单位时间处理的交易数来度量;
  (3)持续高速性是指保持高度处理速度的能力。
  在C++性能优化的培训中,有一道算法,要求大家试着用最快的方式实现。因为C++中的指针操作按数组索引访问要快,于是当时最快的一个解决方案是用了一大推复杂指针访问来实现算法。然而这样的代码很难维护,而且容易出错。所以为提高性能就牺牲了可维护性。
  一般而言,计算机提供了许多的资源,包括CPU,内存,硬盘等等,提高性能的核心就是充分利用这些资源。要保证对资源的使用是正确和有效的。
  随着软件的发展,现在的程序员可以更高效的实现功能需求。一方面编程语言和方法在不断进步,另一方面大量的可重复使用的组件,服务,开源的库使得想在实现同样的功能的时间和需要的开发人员的数量比以前极大的缩小了。whatsapp以区区55人的团队开发出价值190亿美元,拥有4.5亿用户的软件产品,这在以前是难以想象的。所以软件架构设计者应该把软件的开发效率看成是更重要的性能指标。
  4 安全性
  安全性指软件同时兼顾向合法用户提供服务,以及阻止非授权使用软件及资源的能力。
  安全性既属于技术问题又属于管理问题。一般地,如果黑客为非法入侵花费的代价(考虑时间、费用、风险等多种因素)高于得到的好处,那么这样的系统就可以认为是安全的。
  当今社会网络安全问题尤为突出,客户隐私泄露问题,账户资金被盗刷,软件存储的客户数据被黑客恶意攻击,各种安全问题层出不穷。安全问题是所有互联网企业都绕不开的问题,只有保证自己的产品足够“安全”,才能赢得客户的信赖。
  5 可测试性
  可测试性顾名思义就是指软件是否容易测试。
  什么样的软件是不可测试的呢?举个例子来说,开发一个数据可视化的组件,就是把数据以图表的形式展现出来。有一种数据可视化的类型使用力导向的算法(force-directed)把数据以网络拓扑图的形式展现出来,该算法使用一些随机的参数来模拟节点的初始位置,并通过迭代计算生成最终layout的结果。也就是说每次的layout结果都是不一样的。测试团队对这样的算法很不满意,他们认为这样的实现是无法测试的,因为当时我们的测试主要以比对图形为基础,也就是生成一个正确的图形为基准,每次测试都会把输出的图形和基准图形进行比较,如果不一致则认为出错或者要修改基准。随机算法虽然从功能上讲并没有错误,但是在这样的测试方法下是无法满足可测试性的要求的。最后,开发团队修改了算法,使得每次的初始位置未固定位置来解决这个问题。
  6 易用性
  可用性针对的是系统,可用性,顾名思义,是系统能不能使用,当一个系统可以上线时,说明其具有了一定的可用性。而易用性针对的是用户,描述的是系统好不好用,这两个概念有一定的区别,可用性是能不能用,易用性是好不好用。
  针对淘宝网为例,以一次完整的购物流程为背景,我们分析了在淘宝网中的一些易用性的体现,主要场景如下图所示:
  在本场景中,新用户下载淘宝app时,第一次打开应用,淘宝app会出现新手指引,教会用户如何购物,极大方便了用户,使用户可以简单上手,开启自己的购物之旅。
  在用户登录时,淘宝网从用户的角度出发,在登录页面免去了之前输入用户名密码的操作,而是选择使用二维码扫描登录,极大化简了了用户登陆时输入用户名密码的过程,同时在满足了易用性的前提下,使用手机淘宝扫描二维码登录,使得用户的安全性得以显著提升,极大减少了用户淘宝账号被盗、造成财物损失的风险。同时,手机提示信息的确认登陆页面再次提醒用户登录信息,完备了用户的安全性。淘宝网将易用性和安全性结合起来,给了用户很良好的登陆体验。
  7 总结
  软件质量属性的每一个方面都有很多的内容,我们只能浅尝而止,而且仍然有许多重要的质量属性我们还没有涉及到。软件设计时应该将“设备相关程序”与“设备无关程序”分开,将“功能模块”与“用户界面”分开。现在你是否也知道了常人是怎么评价软件的?没错,作为软件的用户我们只关心“好不好用”,它包含在这些专业指标之中,是其综合作用的结果。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号