浅谈质量属性

浅谈质量属性

在架构的过程中,一个系统的质量属性主要考虑的是六个方面:可用性、可修改性、性能、安全性、可测试性以及易用性。实现这些质量属性依赖于基本的设计决策——战术,而战术就是影响质量属性响应控制的设计决策。其中包含六中战术分别对应系统质量属性考虑的六个方面,这六种战术的结合被称为“架构设计策略”,我个人认为更像是架构设计时的智慧。

接下来我分别针对六种质量属性的战术来谈一谈我的看法和见解,也会提供一些相应的实例来供大家思考。

可用性战术


目标:可用性战术将会阻止错误发展成故障,或者至少能够把错误的影响限制在一定范围内,从而使系统恢复成为可能。

维持可用性的战术主要有三种:错误检测、自动恢复以及错误预防。错误检测是用来检测故障的某种类型的健康监视,可以通过信号/响应、心跳、抛出异常等方式来实现。自动恢复可以检测到故障时某种类型的恢复,可以通过监测和修复或者是重新引入等方式来实现。错误预防则是为了防止错误演变成故障,可以通过从服务中删除事务或设立进程监视器等方式来实现。

一切的目的都是为了持续的维持系统的可使用状态,不因为用户的误操作或者是系统本身的问题而导致错误的扩大,尽量保证系统的鲁棒性。

实例:最常见的提高系统可用性的方式就是在编码过程中多写try/catch,如果一个不够那就多写几个,一个好的程序员往往也都会有自己的库,其中就包含一个异常库,系统如果没有按照既定的方向运行就会throw出一个Exception,这些都会写入系统的运行日志当中,根据抛出不同的异常系统会做出相应的错误处理反应,避免出现因为错误而影响全局的情况。

除非你看到问题的发生,否则你不会知道现在的系统当中存在着什么问题。通过提高系统的可用性可以保持系统可以在可接受范围内处理错误,避免错误发展成为故障从而产生更大的影响。

可修改性战术


目标:控制实现、测试和部署变更的时间和成本。

维持可修改性的战术主要有三种:局部化修改、防止连锁反应以及延迟绑定时间。局部化修改的目标是减少由某个变更直接影响的模块的数量,可以通过维持语义一致性、泛化模块、限制选择等方式来实现。防止连锁反应的目标是限制对局部化的模块的修改,以防止对某个模块的修改间接地影响到其他模块,可以通过隐藏信息、维持现有的接口、使用仲裁者等方式来实现。延迟绑定时间的目标是控制部署时间并允许非开发人员进行修改,可以通过运行时注册、配置文件、多态等方式来实现。

提高系统的可修改性的目的是为了增强系统的弹性,使系统向高内聚低耦合靠拢,让其具备更高的便携性,可以根据后期的反馈进行更新而不需要进行整体的大变动。从开发角度降低了修改的时间成本和金钱成本。

实例:软件设计模式当中的抽象工厂模式为例,每一个组件只负责单一简单的工作,通过组合来完成一个大的项目,使用抽象模块来建立各个工厂类之间的联系,在对一个具体的类进行修改或增加内容时也无需对其他部分进行改动。

一个好的系统不会是一成不变的,而是在面对用户的反馈进行一步一步的更新,提高系统的可修改性就可以减少在更新迭代中所付出的无用的返工成本。

性能战术


目标:对一定的时间限制内到达系统的时间生成一个响应,这些时间可以是消息到达、定时器到时以及系统状态的变化。

维持性能的战术主要有三类:资源需求、资源管理以及资源仲裁。资源需求是分析影响性能的资源因素,可以通过提高计算效率、减少计算开销、管理时间率等方式来实现。资源管理是提高资源的应用效率,可以通过引入并发、维持多个副本、增加可用资源等方式来实现。资源仲裁是解决资源的争用,可以通过调整调度策略来实现。

提高系统的性能是为了加快系统的响应速度,缩短系统反应的时间。谁都不想使用一个反应迟钝的系统,如果用户在数秒之内没有获得系统应该给出的反应,那必然会影响使用体验,假若这个时间再长一些,用户怕是会立马关掉并且不会想再打开第二次了,那么这对于一个系统的架构来说就是失败的。

实例:老生常谈的12306春运高并发购票的问题,春运期间庞大的并发量直接将网站击垮,对此12306互联网购票系统的改造给了我们一个很好的答案。其建立了一个可伸缩扩展的云应用平台,在网络阻塞时可以动态增加带宽,当服务器CPU到达高位时,可以快速从资源池获取虚拟机资源来分摊负荷。这就是一个成功的案例,网站初次建立是由于硬件的技术和用户的需求,谁也没有想到会如此快速的增长到这么高的并发,但是随着时代的发展,系统的性能就显得尤为重要。

提高系统的性能无疑可以优化用户的使用体验,但是拥有一个人可以接受的正常性能则是一个系统的必然要求,不同的系统对性能的要求都不能脱离开其业务流程来谈,在提高系统性能上付出的成本也应该与其主要的业务流程和用户的体量大小相对应。

安全性战术


目标:系统检测、抵抗或从攻击中恢复。

维持系统安全性的战术主要有三种:抵抗攻击、检测攻击以及从攻击中恢复。抵抗攻击可以通过身份验证、用户授权、数据加密、检验数据完整性等方式来实现。检测攻击可以通过入侵检测等方式来实现。从攻击中恢复可以通过设置冗余来恢复并设置审计追踪等方式来实现。

提高系统的安全性是为了增加系统抵抗恶意操作、恶意入侵等非法操作的能力。其重要性与系统内部的信息重要程度是成正比的,越重要的信息被坏人觊觎的可能性越大,就需要更够的堡垒来保护。

实例:提到安全性就不得不说一说区块链,区块链一向以数据透明,可溯源著称,想要篡改其中的信息就需要付出远远超出其价值的成本,通过公开广播到每一个节点的方式来实现信息的不可篡改。另外再举一个例子,如今各个社交软件的动态安全性都较高,通过对用户身份的绑定来多角度验证使用者是否是本人,密码、手机令牌、邮箱各种验证都是在提高系统的安全性。

网络环境是复杂的,你无法判断正在使用你的系统的人是一个正常用户还是一个想要窃取机密的坏蛋,拥有一个安全的防护措施是非常必要的。

可测试性战术


目标:允许在完成软件开发的一个增量后,轻松地对软件进行测试。
维持系统可测试性的战术主要有两种:管理输入/输出以及内部监视。管理输入/输出可以通过记录/回放、将接口与实现分离、特化访问路线/接口等方式来实现。内部监视可以通过内置监视器等方式来实现。

检测的目的就是为了检测出错误,更早的发现错误可以减少更改错误的成本。提高系统的可测试性可以简化系统的测试流程,使得错误更容易被发现。

实例:在开发过程中经常需要测试自己代码的正确性,判断一个方法的输出是否符合要求,但是又不能每一次都为方法的测试写一个主函数来运行,所以在一个方法中应当完成一个简单单一的功能,一个模块是一个个体,可以被单独的进行测试,单个模块测试完毕之后再进行组合进行集成测试,这是一个从小变大的过程。

系统的错误发现的越晚想要更改其花费的成本就越大,尽早的发现系统中的bug可以降低维护成本,而提高系统的可测试性则是让系统可以更加全面更加容易的被测试,让错误更容易被发现。

易用性战术


目标:与用户完成期望任务的难以程度以及系统为用户提供的支持种类有关。

维持系统易用性的战术主要有三种:分离用户接口、支持用户主动、维持用户一个模型。支持用户主动可以通过取消、撤销、聚合等方式来实现。维持用户一个模型可以通过建立用户模型、系统模型、任务模型来实现。

主要是为用户提供适当的反馈和协助,通过为用户提供关于系统正在做什么的反馈,以及为用户提供发出基于易用性命令的能力来增强易用性。

实例:易用性在任何一个合格的系统中都有体现,如输入法会根据你日常的键入来学习的输入习惯,从而让你更经常打的字出现在前面,再比如编译器中根据已有输入进行的代码补全,大大提高了编码的效率和正确性。

易用性提高的不仅仅是用户的使用体验,更是一种人性的理解,更容易上手的软件往往更容易得到用户的青睐。

总结:这六大系统质量属性是一个优秀的系统所必须要考虑的,但是不同的系统面向的业务流程和用户需求也不同,所以在六大战术上的侧重以及实现方式也会略有差异,需要根据实际情况灵活侧重。
个人见解:一个系统就像是一个活生生的人,他可能从事不一样的工作。如果他需要从事体育行业,那么他需要有一个强健的体魄;如果他需要从事教育行业,那么他需要有丰富的知识;如果他需要从事销售行业,那么他需要拥有八面玲珑的沟通能力。从事什么样的工作需要有相应的专长,一个系统想要优秀也需要像看病一样,对症下药。如果有什么其他的见解,或者是认为我哪里说的不太对的地方可以和我一起交流,期待!