DevOps落地笔记-05|非功能需求:如何有效关注非功能需求

news2024/11/15 13:30:10

上一讲主要介绍了看板方法以及如何使用看板方法来解决软件研发过程中出现的团队过载、工作不均、任务延期等问题。通过学习前面几个课时介绍的知识,你的团队开始源源不断地交付用户价值。用户对交付的功能非常满意,但等到系统上线后经常出现服务不可用的情况,比如:服务出现单点故障,这个时候运维团队就要处理这些焦头烂额问题了。这是因为在软件开发过程中,团队关注的一直都是用户需要的功能,忽略了那些能够让产品维持工作的非功能需求。今天介绍的内容——有效关注非功能需求,就是教我们要在关注功能需求的同时,也要关注非功能需求。帮你彻底改善软件系统的可用性和性能。

什么是非功能需求
当谈起需求,很多人都认为是“用户需求”,需求也分为不同的种类。需求的分类可以参考由惠普的 Robert Grady 设计的 FURPS+ 需求分类模型:

& 功能性(Functionality);

& 易用性(Usability);

& 可靠性(Reliability);

& 性能(Performance);

& 可支持性(Supportabilit)。

FURPS+中的“+”号指的是其他需要关注的方面,比如:

& 设计需求(Design Requirements);

& 实现需求(Implementation Requirements);

& 接口需求(Interface Requirements);

& 物理需求(Physical Requirements)。

该需求分类模型包含了功能性需求和非功能性需求。功能性需求指的是产品功能,比如:聊天功能,支付功能等。非功能性需求是整个系统交付的标准,比如系统可靠,性能高等。

功能需求通常很容易定义、度量和测试,一般可以描述为特定系统执行特定功能的需求。就像前面课时中提到的用户故事,作为用户,当我在地址栏里输入内容时,显示所有可用的地址列表。因此,功能需求通常被视为系统“应该做什么(What)”。

非功能需求则较难定义、度量、测试和跟踪,这也是经常被忽略的原因。一般可以描述为系统如何提供功能。比如,当用户在地址栏里输入内容时,要快速的显示所有的地址列表(性能)。因此,非功能需求通常被视为系统“应该如何做(How)”。

为什么要关注非功能需求?
在《敏捷宣言》里讲到,“可工作的软件,胜过面面俱到的文档”。这里的“可工作”是对交付到用户手中的软件最重要的度量标准,软件不仅要具备用户需要的功能,还要能够持续不断的使用该功能。但实际情况却不尽如人意,这是因为我们在开发软件的时候,总是关注功能性的需求,而忽略非功能性的需求。我举个例子,下面这张图是一座冰山,当一个管理家庭地址的需求被提出后,用户需要的功能是新增、编辑、删除和查询家庭地址,但在这几个功能需求的背后却是表单重复提交验证、浏览器兼容、性能、用户身份认证等隐藏需求。没有这些隐藏需求,一般情况下用户也能使用该功能,但在使用的过程中,就会出现各种问题,令用户体验非常不好。
在这里插入图片描述
随着敏捷开发方法的采用,这一问题已经有所转变。比如,将非功能需求和功能需求一起纳入流程管控等措施。在 DevOps 实践中,这个转变更进了一步,产品负责人要关注整个产品需求,包括功能需求和非功能需求。只有从源头上重视非功能需求的开发,团队才能真正交付 “可工作” 的软件。下面介绍一下在软件开发流程中,如何关注并落实非功能需求。

如何关注非功能需求?

在软件开发过程中,明确定义的非功能需求的实现是用于评估整个软件成功的关键。功能需求的实现表示用户可以使用该软件提供的功能,非功能需求的实现表示用户可以一直使用该功能。定义明确的非功能需求,不仅容易度量和测试,而且团队也能更好地了解这个需求离实现还有多远。

非功能需求的管理

既然非功能需求对于系统交付非常重要,那么在系统一开始团队中的每个人都要考虑非功能需求,以及它们对系统架构,系统交付时间,测试策略和总成本的影响。

需求管理

非功能需求和功能需求一样,它们也有实际的业务价值,在需求管理阶段就要将其纳入统一的流程管理。比如“管理家庭地址”的需求,在进行“新增地址”功能需求排期的同时,也要考虑“表单验证”“表单重复提交验证”“身份认证和授权”“浏览器兼容性”等非功能需求。因此,需要创建一些具体的任务来管理这些非功能需求,或者在其他功能需求中加入非功能需求的验收条件。

跨团队协作

非功能需求又被称为“跨功能需求”,因此在非功能需求的讨论、方案的制定,验证条件等方面,都需要其他团队一起来完成。安全性相关的需要安全团队,性能、可扩展性相关的需要架构团队,验收方面需要测试团队,监控告警方面需要运维团队。跨团队协作不容易,我的建议是将这件事情写到每个团队的 OKR 里,这样大家的目标就一致了,实施起来会更加容易。

权衡利弊

非功能需求的实现是有成本的,而且它们之间可能彼此排斥。比如,对安全性要求高的系统往往易用性就不会太好。在理想情况下,每个人都想开发出具有高安全性、高性能、高扩展性、高易用性的系统。但是,在实际开发中,考虑到系统的交付时间,系统的总成本,往往会根据非功能需求的实现难度,做出权衡。

非功能需求的分析

非功能需求的分析也是非常重要的一部分。在进行需求分析的时候,不仅要分析出系统所提供的功能需求,同时也要知道这些功能存在的限制条件。

这里介绍一个四层非功能需求分析法。该方法包含一些规则和非功能需求分析的过程。通过这种方法,我们可以确定系统提供的功能,子功能和每个子功能需要具备的非功能需求。有利于从不同的视图识别所有的非功能需求。这种方法的目标是找出任何系统中都非常重要的非功能需求。如下图所示。
在这里插入图片描述
任何一个系统的需求都可以总结为下面这句话:每个<系统>提供<功能>给<关系人>,每个<功能>必须满足<条件>才能满足<关系人>的需求。

正如前面提到,功能需求表示系统应该做什么(What),非功能需求表示系统应该如何做(How)。 上图利用分层的方法非常清晰地将系统具备的功能需求和非功能需求表示出来。前面三层是功能需求的拆解,第四层是每个子功能具备的条件,即非功能需求。

整个非功能需求的分析过程可以分为下面四个步骤:

step1:识别系统中的关系人;

step2:基于开发人员的知识和经验,从关系人角度制定功能目标;

step3:拆解功能为子功能;

step4:识别每个子功能中的非功能需求。

下面利用四层非功能需求分析法分析开头的 “管理家庭地址” 的需求,结果如下图所示:
在这里插入图片描述
经过这个分析过程,就非常清楚地知道哪些功能需求需要具备哪些非功能需求,可以基于分析结果编写用户故事以及验证标准。

非功能需求的度量

为了使系统能够达到验收的标准,在定义非功能性需求的时候就需要是可度量的,这样团队才能知道非功能性需求当前值是多少,离满足要求还差多少。上面提到非功能需求是指系统应该如何做,即对系统属性和质量的描述,比如:可扩展性、可靠性、高性能等,这些都属于定性的描述。定性的描述缺少量化的指标,是不可度量的,这一点团队在定义非功能性需求时应该注意。

还是以上面的例子为例:

“快速地显示所有的地址列表”,这就是一个定性的描述,它是不容易度量的,也是不容易测试的,不知道要达到多快才能满足要求。

修改后:

“0.1s显示所有的地址列表”,这就是一个定量的描述,提出了对该非功能需求的度量、测试和验收标准。只要能在 0.1s 内显示所有的地址列表,就能满足要求。假如在一次测试时得到的结果是 0.2s,团队也很清楚地知道还需要再提高 0.1s 才能满足要求。

常见非功能需求的度量指标有:

& 吞吐量: TPS(Transactions Per Second)每秒处理事务数,QPS(Queries Per Second)每秒查询数,RT(Response Time)响应时间。

& 可靠性: MTTF(Mean Time to Failure)平均无故障时间,MTTR(Mean Time to Repair)平均故障恢复时间,MTBF(Mean Time Between Failure)平均故障间隔时间等。

& 扩展性: 随着服务器数、服务数或线程数的增加,单个请求的响应时间和并发用户数。

目前在监控或统计系统中都会包含上面的度量指标,如下图是请求 QPS 变化趋势图:
在这里插入图片描述
非功能需求的设计
非功能需求在设计时可以遵循下面两个原则。

1. 面向对象设计的 SOLID 原则。

SOLID 原则是由 Robert C. Martin 于 2000 年编写的面向对象设计的五个原则。后来,人们将这五个原则的首字母组成缩略词,也就是SOLID,并被业界广为流传。这五个原则是:

1.单一责任原则(Single responsibility principle),指一个类有且只有一个职责。这个原则增强了类的灵活性和可维护性;

2.开闭原则(Open/closed principle),指一个类对外扩展开放,对修改关闭。这个原则增强了类的可扩展性和可维护性;

3.**里氏代换原则(Liskov substitution principle),**指程序中使用基类进行定义,在运行时再确定其子类类型,用子类对象替换父类对象,这个原则增强了类的灵活性和可扩展性;

4.接口分离原则(Interface segregation principle),指类的依赖关系应该建立在最小接口上,即建立单一接口,而不是臃肿庞大的接口,这个原则增强了类的可维护性和可扩展性;

5.依赖倒置原则(Dependency inversion principle),指高层模块依赖抽象类或接口,而不是具体的类,这个原则增强了类的可扩展性。

SOLID 原则处理的是面向对象中的类、接口、继承等元素,能够更好地满足面向对象设计中的非功能性需求。

2. 微服务设计的 IDEALS 原则

如今,随着微服务架构的广泛应用,SOLID 原则并不能完全适用于分布式系统中的**“微服务”**这一元素。Paulo Merson 提出了一套微服务设计的核心原则,即 IDEALS 原则。IDEALS 是这几个原则首字母组成的缩略词。原则如下:

接口分离(Interface segregation) 指的是不同类型的客户端,如,移动应用程序、Web应用程序、CLI程序,能够通过适合其要求的协议与服务端交互;

可部署性(Deployability (is on you)) 指的是在微服务时代,也就是 DevOps 时代,开发人员需要在打包、部署和运行微服务方面做出关键的设计决策和技术选择;

事件驱动(Event-driven) 指的是在任何时候,都应该通过异步消息或事件进行调用,而不是同步调用;

可用性胜于一致性(Availability over consistency) 指的是最终用户更看重系统的可用性而不是强一致性,他们对最终一致性也很满意;

松耦合(Loose coupling) 指的是服务之间相互依赖的程度,对于基于服务的系统来说,传入耦合与传出耦合的设计是一个重要问题;

单一责任(Single responsibility) 指的是服务内聚性,一个服务只包含单一职责,功能庞大服务在维护和部署方面都会变得繁重。

SOLID 原则和 IDEALS 原则是在进行系统架构设计时需要遵循的核心原则,可以有效地提高系统在非功能性方面的质量要求。

非功能需求的测试

前面也提到,非功能需求是验证系统是否满足要求的衡量标准。这里以**“响应时间”**为例,简单介绍一下非功能需求的测试方法。

定义基准

目标明确的基准式测试有利于判断局部代码优化为系统带来的具体影响,例如,在添加数据缓存后,与基准数据比较,响应时间到底提升了多少。

定义场景

把系统的一个具体使用场景作为一个测试。不同使用场景对测试的要求和验收标准不一样,同样是响应时间这个指标,当数据量在 1000 和 1000 万时的标准是不一样的,当并发用户数在 1000 和 1000 万时的标准也是不一样的。

定义成功与失败

测试的成功与失败与场景也是强相关的,成功与失败不过是当前测试值与目标基准值的一个比较。因此,成功与失败不是关键,基于场景的基准值的设定是关键。该值的设定可以通过“预估+核验”的方式,在开始时先预估一个初始值作为最低验收标准,当测试通过了最低验收标准,就把验收标准提高一点,调整该测试的成功门槛。如果测试失败,如果最低验收标准高于需求中定义的门槛,那么只要降低最低验收标准是被接受的,直接降低就可以了,否则就要优化代码直到满足最低验收标准。

非功能需求的监控

当系统在生产环境运行时,对系统的监控是也是很重要的一部分。有一些开源APM(Application Performance Management,应用性能管理)工具能够追踪每个请求的完整调用链路,收集调用链路上的每个服务的性能数据,并通过页面进行展示。常用的有Skywalking、Zipkin、Pinpoint 等。如下图是 Pinpoint 的监控界面。
在这里插入图片描述
图中右侧显示的是 ApiGateway 这个服务的响应时间汇总信息,响应时间在 1s 内的有 600 个,大于 5s 的有 41 个,还可以针对每个请求查看完整的调用链,对于排查慢请求的问题非常有帮助。

总结

本课时从非功能需求会导致哪些问题入手,描述了目前软件开发中过于关注功能需求,而忽略非功能需求的现象,从而提议软件开发人员在进行软件开发时要关注非功能需求。并在随后的内容里,从非功能需求的管理、分析、度量、设计、测试和监控等方面,简单而全面地描述了如何关注非功能需求。由于篇幅有限,并不能面面俱到,以非功能需求作为一个课题来讲,也是希望软件从业人员能够对非功能需求引起重视,开发出满足用户需要的、“可工作” 的软件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1424626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扣库的函数经验

有的库确实可以提出来的 比如这个库 GitHub - intel/x86-simd-sort: C template library for high performance SIMD based sorting algorithms 根据自己的需要是可以&#xff0c;把内容抠出来的&#xff0c;重新build的。 我就自己新建了一个vs的工程&#xff0c;然后把源…

将java对象转换为json字符串的几种常用方法

目录 1.关于json 2.实现方式 1.Gson 2.jackson 3.fastjson 3.与前端的联系 1.关于json JSON是一种轻量级的数据交换格式。它由Douglas Crockford在2001年创造。JSON的全称是JavaScript Object Notation&#xff0c;它是一种文本格式&#xff0c;可以轻松地在各种平台之间传…

【GEE】基于GEE可视化和下载Landsat8 L2A数据(镶嵌、裁剪)

之前发过一篇使用GEE下载Landsat8的文章&#xff0c;然后有很多小伙伴私信我各种问题&#xff0c;如L1C、L2数据代码怎么修改&#xff0c;如何镶嵌&#xff0c;如何去云、 如何裁剪等一系列问题。正好快过年了&#xff0c;手头的事也没有多少了&#xff0c;所以这两天整理了一下…

考研高数(数列极限之f(xn)和{xn}的关系)

说白了&#xff0c;f(xn)是复合函数&#xff0c;是f(x)与{xn}的复合函数。&#xff08;复合函数的单调性有同增异减的原则&#xff09; 例题1&#xff1a;【可以用同增异减的原则&#xff0c;迅速解答&#xff08;有不合理的地方&#xff0c;请各位大佬指正&#xff01;&#…

【操作系统】FileOutputStream的flush操作有时不生效

按照我们的理解&#xff1a;FileOutputStream的flush()方法的作用就是将缓冲区中的数据立即写入到文件中&#xff0c;即使缓冲区没有填满。这样可以确保数据的及时写入&#xff0c;而不需要等待缓冲区填满或者调用 close() 方法关闭流时才写入。真的是这样吗&#xff1f;&#…

dv和ov通配符SSL证书的区别

SSL数字证书是一种数字证书&#xff0c;可以保护网站传输数据安全以及对服务器身份进行验证&#xff0c;SSL证书有很多种&#xff0c;而通配符证书则是其中的一种特殊类型。SSL证书旗下的通配符SSL证书随着互联网的发展&#xff0c;颁发量也越来越多&#xff0c;为了使用户选择…

websocket编写聊天室

【黑马程序员】WebSocket打造在线聊天室【配套资料源码】 总时长 02:45:00 共6P 此文章包含第1p-第p6的内容 简介 温馨提示&#xff1a;现在都是第三方支持聊天&#xff0c;如极光&#xff0c;学这个用于自己项目完全没问题&#xff0c;大项目不建议使用 需求分析 代码

Celeryconfig配置文件

Celery配置文件 本篇介绍Celery配置文件相关&#xff0c;celeryconfig.py Celeryconfig.py 在上篇celery基础用法中&#xff0c;是这样使用celery的实例化的。 # tasks.py 文件名需与实例化对象第一个参数一致 import time from celery import Celeryredis_url redis://Pa…

重磅!讯飞星火V3.5正式发布,3大核心能力超GPT-4 Turbo!

1月30日&#xff0c;科大讯飞召开星火认知大模型V3.5升级发布会&#xff0c;这是国内首个基于全国产算力训练的多模态认知大模型。科大讯飞董事长刘庆峰先生、研究院院长刘聪先生出席了大会&#xff0c;并对最新产品进行了多维度解读。 讯飞星火V3.5的7大核心能力实现全面大幅…

用的到的linux-文件移动-Day2

前言&#xff1a; 在上一节&#xff0c;我们复习了cd大法和创建生成文件和文件夹的方法&#xff0c;介绍了一些“偷懒”&#xff08;高效&#xff09;的小技巧&#xff0c;本节&#xff0c;我们一起来探讨下&#xff0c;我们对文件移动操作时有哪些可以偷懒的小技巧~ 一、复制…

Oracle 集群】RAC知识图文详细教程(四)--缓存融合技术和主要后台进程

Cache Fusion 原理 前面已经介绍了 RAC 的后台进程&#xff0c;为了更深入的了解这些后台进程的工作原理&#xff0c;先了解一下 RAC 中多节点对共享数据文件访问的管理是如何进行的。要了解 RAC 工作原理的中心&#xff0c;需要知道 Cache Fusion 这个重要的概念&#xff0c;要…

基于腾讯云服务器搭建幻兽帕鲁服务器保姆级教程

随着网络游戏的普及&#xff0c;越来越多的玩家希望能够拥有自己的游戏服务器&#xff0c;以便能够自由地玩耍。而腾讯云服务器作为一个优秀的云计算平台&#xff0c;为玩家们提供了一个便捷、稳定、安全的游戏服务器解决方案。本文将为大家介绍如何基于腾讯云服务器搭建幻兽帕…

三、C++中的Mat对象

图片在C中是作为矩阵Matrix进行处理对待的&#xff0c;通过Mat数据类型进行处理 新建项目这里就不再赘述了哈&#xff0c;可以参考博文&#xff1a;零、环境搭建(第三部分Visula Studio中新建项目) 我这边创建的项目名称为&#xff1a;1_31_matrix 为了养成良好的项目开发习惯…

ubuntu QT openssl支持https

1、Building Qt 5 from Git - Qt Wiki 2、下载编译对应的opengssl [ 1.1.1 ] - /source/old/1.1.1/index.html 3、安装所需基础工具 sudo apt-get install build-essential perl python3 git sudo apt-get install ^libxcb.*-dev libx11-xcb-dev libglu1-mesa-dev libxrende…

基于YOLOv8的水下生物检测,多种优化方法---MSAM(CBAM升级版)助力涨点(二)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了水下生物检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入自研注意力MSAM mAP0.5由原始的0.522提升至0.534…

Epicypher—SMARCA2 Chromatin Remodeling Enzyme (Human BRM)

EpiCypher是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher&#xff08;国内授权代理 欣博盛生物&#xff09;能提供全长重组人SMARCA2重塑酶。SMARCA2是ATP依赖性染色质重塑复合物SWI/SNF的核心ATP酶亚基&#xff0c;可动员核小体&#xff0…

第二百九十九回

文章目录 1. 概念介绍2. 实现方法2.1 使用Steam实现2.2 使用Timer实现 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现每隔一段时间执行某项目任务"相关的内容&#xff0c;本章回中将介绍如何实现倒计时功能.闲话休提&#xff0c;让我们一起Talk Flutter吧…

Elasticsearch:Geoshape query

Geoshape 查询可以用于过滤使用 geo_shape 或 geo_point 类型索引的文档。 geo_shape 查询使用与 geo_shape 或 geo_point 映射相同的索引来查找具有与查询形状相关的形状的文档&#xff0c;并使用指定的空间关系&#xff1a;相交&#xff08;intersect&#xff09;、包含(con…

【百度Apollo】本地调试仿真:加速自动驾驶系统开发的利器

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

【C++干货基地】C++引用与指针的区别:深入理解两者特性及选择正确应用场景

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…