最小可行产品需要最小可行架构——可持续架构(三)

前言

  • 最小可行产品(MVP)的概念可以帮助团队专注于尽快交付他们认为对客户最有价值的东西,以便在投入大量时间和资源之前迅速、廉价地评估产品的市场规模。
  • MVP不仅需要考虑产品的市场可行性,还需要考虑其技术可行性,以便随着时间的推移进行维护和适应不断变化的需求。
  • MVP不仅适用于初创公司,因为每个应用程序都有一个初始发布版本,可以被视为MVP。MVP是产品开发策略的一个有用组成部分。与简单的原型不同,MVP并不打算“扔掉”。
  • 在MVP的一部分创建最小可行架构(MVA)有助于团队评估技术可行性,并为产品提供一个稳定的基础,可以随着产品的演进而进行调整。
  • 如果做出(或不做出)决定会影响产品的可行性和可持续性,或者改变决定会在金钱或时间方面付出如此巨大的代价,以至于这样做会使产品经济不可行、不切实际或不可能,那么这个决定必须作为MVA的一部分做出。
  • 使架构决策透明化有助于组织更好地理解为什么做出了某些选择,从而帮助他们更好地决定如何将产品适应变化的市场条件和不断发展的客户需求。

最小可行产品的概念可以帮助团队专注于尽早交付对客户最有价值的内容,以便他们可以在投入大量时间和资源之前快速、廉价地评估产品在市场上的规模,避免投入大量资源到可能不成功的项目中。简而言之,MVP是:
“产品的一个版本,具有足够的功能,可以被早期客户使用,并提供反馈以供未来产品开发。专注于发布MVP意味着开发人员可能避免进行冗长且(最终)不必要的工作。相反,他们会对可用版本进行迭代,并对产品需求的假设进行挑战和验证。”

然而,MVP的概念不仅限于创业公司的背景。每个应用程序都有一个可以视为MVP的初始发布版本。几乎每个组织都有这样的故事:他们花了数月甚至数年的时间开发新系统,然后部署它,却发现它并不符合用户的需求。提早发布MVP有助于防止将大量时间、金钱和精力投入到错误的需求中。

为了更好地理解MVP的目标,考虑一下“可行”的含义。MVP必须证明它以足够数量的价值为足够数量的人提供服务,以使其在经济上可行。简而言之,它必须是足够多的人愿意购买,以便提供良好的投资回报。

换句话说,您有一个足够大的问题,以及足够多的人需要解决这个问题。但是经济可行性还有另一个方面:成本。该产品既必须价格合理,又必须在所需利润率范围内定义的总生命周期成本之内。

并且使用现代敏捷方法,产品必须能够根据反馈和随时间变化的需求进行增量演进;与简单的原型不同,MVP不打算被“扔掉”。这就是最小可行架构发挥重要作用的地方。

什么是最小可行架构


当人们使用“最小可行架构”(MVA)这个术语时,他们通常指的是以下之一:

  • 一个涉及最少组件的设计。当团队主要专注于尽快实现MVP时,他们的MVA往往受其功能性要求的影响,而不是其可能尚未完全了解的质量属性要求(QARs)。他们的设计决策往往是战术性的,因为速度是他们的主要关注点,他们通常期望MVA在MVP被证明成功并最终演变成一个完整的产品时需要进行重新设计。产品的可持续性不是优先考虑的问题。用于组装MVA的组件可能来自商业云供应商提供的现成产品、低代码或无代码产品,或者是从现有系统中进行最小修改后重新使用的。

这种对MVA的方法的缺陷在于认为“解决方案的架构对客户并不重要”。但客户确实关心解决方案的可持续性,这使得架构对他们而言变得重要。正如我们在之前的一篇文章中你为什么需要关心软件架构指出的,这种方法可能涉及对初始设计的重大重构,导致时间和精力的浪费,并可能产生重大的技术债务。

将交付速度置于架构问题之前(这本身就是一个应该记录的架构决策)可能是正确的做法,尤其是如果团队当前的周期时间过长,无法提供有效的反馈循环。但团队应该愿意接受这样的可能性,即他们所交付的大部分内容可能在以后需要进行重大的重做。

  • 这个定义将注意力集中在可持续性上,即MVP的长期可行性,考虑了产品如何在满足其功能性要求的同时满足其QARs,并尽量减少技术债务以实现可持续性。正如我们在另一篇文章中指出的那样,软件架构是由QARs驱动的,而不是由功能性要求驱动的。在这种方法中,MVA由一组经过时间检验和发展的最小化技术决策组成。这些决策通过一组最少的架构实践来补充,帮助团队在演化过程中保持产品的架构可行性。

什么样的决策塑造了MVA

回答“什么是刚刚好”的问题取决于是否需要做出架构决策才能使产品可行。如果做出(或不做出)决策会影响产品的可行性和可持续性,或者如果更改决策在时间或金钱上的成本如此之高,以至于这样做会使产品不经济、不切实际或不可能,那么这个决策必须成为MVA的一部分。
这些决策涉及产品/系统特性相关的QARs的处理方式,包括:

  • 并发性——与同时在线用户、传感器以及其他设备同时产生事件的数量相关。
  • 吞吐量——与产品必须在定义的时间段内处理的交易量或数据量相关。
  • 延迟和响应速度——与产品对事件作出响应的速度相关。
  • 可伸缩性——与系统通过增加成本来处理增加的工作负载的能力相关,通常呈近线性关系。
  • 持久性——与产品必须存储和检索的数据的吞吐量和结构(或缺乏结构)相关。通常包括关于不同种类数据存储技术的决策(例如SQL数据库管理系统、NoSQL数据库管理系统等)。
  • 安全性——与产品如何保护自身免受未经授权的使用或对产品数据的访问相关,以实现机密性、完整性和可用性。
  • 监控——与产品将如何被实时监测相关,以便支持产品的人员了解当产品开始无法满足QARs并防止严重系统问题时的情况。
  • 平台——与产品将如何满足与内存、存储、事件信号等系统资源约束相关的QARs相关。例如,实时和嵌入式产品(如数字手表或自动制动系统)与基于云的信息系统具有完全不同的约束。
  • 用户界面——与产品如何与用户进行交互的决策相关;例如,虚拟现实界面与二维图形用户界面具有完全不同的QARs,而命令行界面则与二者都有不同的QARs。这些决策可能会影响上述其他QARs。(GUI、VR、命令行或其他类型的界面。)

这个列表并不详尽,开发团队可能需要根据他们自己的QARs添加或删除其中的项目。

开发团队如何发展他们产品的MVA

与一次性原型不同,开发团队在构建MVP的过程中同时构建他们的初始MVA,这是产品的第一个发布版本。采用敏捷方法,就像他们通过一系列迭代(或Scrum中的Sprint)演进MVP一样,他们也演进MVA。在任何时间点,他们的产品都应该满足已知的、客观的QARs。通过这样做,他们不会基于猜测和假设给产品增加不必要的功能,这有助于我们以可持续的方式持续交付业务能力。
在概念上,这种方法可以描述如下:

  • 团队最初开发了足够的架构,恰好满足了软件系统的已知QARs,以便快速创建一个足够可行的产品,供真实客户使用。
  • 然后,团队持续演进产品,以满足更多的需求或需求变化(包括QARs),随着他们对客户真正需要的了解越来越多。保持架构的灵活性至关重要,应用连续架构原则,特别是第3原则,“延迟设计决策直到绝对必要”,是实现这一目标的有效方法。

简而言之,随着团队对产品需求的了解越来越多,他们只会构建足够多的产品,并作出尽可能少的架构决策,以满足他们现在所知道的需求;产品继续是一个MVP,而架构继续支持MVP。这两种行为的原因很简单:团队可能会花费大量时间和精力在产品中实施功能和QARs,结果发现客户不认同它们的价值观;关于价值的信念只是假设,直到被客户验证。这就是假设和实验有用的地方。

简化来说,假设是对尚未被证明(或证明无效)的某种观察结果提出的解释。在需求的背景下,它是一种信念,即做某事会导致其他事情发生,例如交付X功能将导致Y结果。实验是旨在证明或拒绝某种假设的测试。

每个功能和每个需求(包括QARs)实际上都代表了关于价值的假设。经验主义方法的一个目标是使这些假设变得明确,并有意识地设计实验,明确测试功能和需求的价值。实际上并不需要构建整个功能或需求来确定其是否有价值;对于团队来说,构建它的足够部分以验证可能证明或否定其价值的关键假设可能是足够的。

在MVA的背景下,团队将在每个迭代(Sprint)中通过经验主义地测试来验证他们对解决方案的假设,并根据所学到的知识做出决策。例如,在Scrum的背景下,Scrum团队将考虑他们需要通过对产品积压清单中的项目进行排序来了解的内容;产品积压清单本身将包含功能性需求(如功能和用户故事)以及QARs。

当团队计划一个Sprint时,他们从产品积压清单中拉取项目以满足Sprint的目标,这将反映出不仅关于产品提供给客户的价值的假设,还包括关于产品增量如何在随着时间的推移而持续演变的假设。产品积压清单中项目的顺序,包括QARs,因此将迫使团队面对他们关于价值以及产品如何可持续地提供价值的假设。

总结

MVP(最小可行产品)不仅需要考虑产品的市场可行性,还需要考虑其技术可行性,以便随着时间的推移进行维护和适应不断变化的需求。MVP并不局限于初创企业的背景,因为每个应用程序都有一个可以视为MVP的初始发布版本,它们可以成为产品开发战略的有用组成部分。将MVA(最小可行架构)作为MVP的一部分创建有助于团队评估技术可行性,并为产品提供一个稳固的基础,可以随着产品的发展而进行调整。公开透明的架构决策有助于组织更好地理解为何会做出某些选择,从而帮助他们更好地决定如何使产品适应不断变化的市场条件和不断发展的客户需求。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】iOS如何抓取HTTP和HTTPS数据包经验分享

📱 在日常的App开发和研发调研中,对各类App进行深入的研究分析时,我们需要借助专业的抓包应用来协助工作。本文将介绍如何使用iOS手机抓包工具来获取HTTP和HTTPS数据包,并推荐一款实用的抓包应用——克魔助手,希望能够…

【PyQt】18 -菜单等顶层操作

顶层界面的使用 前言一、菜单栏1.1 代码1.2 运行结果 二、工具栏2.1 代码几种显示方法 2.2 运行结果 三、状态栏3.1 代码3.2 运行结果 总结 前言 1、介绍顶层菜单栏目的使用,但没有陆续绑定槽函数。 2、工具栏 3、状态栏 一、菜单栏 1.1 代码 #Author &#xff1a…

插入排序、归并排序、堆排序和快速排序的稳定性分析

插入排序、归并排序、堆排序和快速排序的稳定性分析 一、插入排序的稳定性二、归并排序的稳定性三、堆排序的稳定性四、快速排序的稳定性总结在计算机科学中,排序是将一组数据按照特定顺序进行排列的过程。排序算法的效率和稳定性是评价其优劣的两个重要指标。稳定性指的是在排…

k8s 如何获取加入节点命名

当k8s集群初始化成功的时候&#xff0c;就会出现 加入节点 的命令如下&#xff1a; 但是如果忘记了就需要找回这条命令了。 kubeadm join 的命令格式如下&#xff1a;kubeadm join --token <token> --discovery-token-ca-cert-hash sha256:<hash>--token 令牌--…

【Linux】详解进程程序替换

一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例程开始执…

UDP send 出现大量“Resource temporarily unavailable”

背景 最近排查用户现场环境&#xff0c;查看日志出现大量的“send: Resource temporarily unavailable”错误&#xff0c;UDP设置NO_BLOCK模式&#xff0c;send又发生在进程上下文&#xff0c;并且还设置了SO_SNDBUF 为8M&#xff0c;在此情况下为什么还会出现发送队列满的情况…

Grafana+Promethues配置RocketMQ监控

背景 接前文&#xff0c;Promethues已经配置完毕&#xff0c;下面通过导入的Grafana的面板来配置RocketMQ监控页面 Dashboard 这里我们直接使用Grafana现成的面板配置 node_exporter&#xff1a;https://grafana.com/grafana/dashboards/1860 rocketmq_exporter的dashboar…

基于ssm的线上旅行信息管理系统论文

摘 要 随着旅游业的迅速发展&#xff0c;传统的旅行信息查询管理方式&#xff0c;已经无法满足用户需求&#xff0c;因此&#xff0c;结合计算机技术的优势和普及&#xff0c;特开发了本线上旅行信息管理系统。 本论文首先对线上旅行信息管理系统进行需求分析&#xff0c;从系…

网络工程师实验命令(华为数通HCIA)

VRP系统的基本操作 dis version #查看设备版本信息 sys #进入系统视图 system-name R1 #改设备名字为R1进入接口配置IP地址 int g0/0/0 ip address 192.168.1.1 255.255.255.0 #配置接口地址为192.168.1.1/255.255.255.0 ip address 192.168.1.2 24 sub #此…

基于Spring Boot 3 + Spring Security6 + JWT + Redis实现登录、token身份认证

基于Spring Boot3实现Spring Security6 JWT Redis实现登录、token身份认证。 用户从数据库中获取。使用RESTFul风格的APi进行登录。使用JWT生成token。使用Redis进行登录过期判断。所有的工具类和数据结构在源码中都有。 系列文章指路&#x1f449; 系列文章-基于Vue3创建前端…

小程序利用WebService跟asp.net交互过程发现的问题并处理

最近在研究一个项目&#xff0c;用到asp.net跟小程序交互&#xff0c;简单的说就是小程序端利用wx.request发起请求。获取asp.net 响应回来的数据。但经常会报错。点击下图的测试按钮 出现如下错误&#xff1a; 百思不得其解&#xff0c;试了若干方法&#xff0c;都不行。 因为…

ChatGPT 商业金矿(上)

原文&#xff1a;ChatGPT Business Goldmines 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第一章&#xff1a;为什么我写这本书 欢迎阅读《ChatGPT 多源收入&#xff1a;20 个利润丰厚的业务&#xff0c;任何人都可以在一周内使用 ChatGPT 开始》。我很高兴分享我…

人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践,CapsNet模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践&#xff0c;CapsNet模型结构介绍。CapsNet&#xff08;Capsule Network&#xff09;是一种创新的深度学习模型&#xff0c;由计算机科学家Geo…

网络编程综合项目-多用户通信系统

文章目录 1.项目所用技术栈本项目使用了java基础&#xff0c;面向对象&#xff0c;集合&#xff0c;泛型&#xff0c;IO流&#xff0c;多线程&#xff0c;Tcp字节流编程的技术 2.通信系统整体分析主要思路&#xff08;自己理解&#xff09;1.如果不用多线程2.使用多线程3.对多线…

使用Jenkins打包时执行失败,但手动执行没有问题如ERR_ELECTRON_BUILDER_CANNOT_EXECUTE

具体错误信息如&#xff1a; Error output: Plugin not found, cannot call UAC::_ Error in macro _UAC_MakeLL_Cmp on macroline 2 Error in macro _UAC_IsInnerInstance on macroline 1 Error in macro _If on macroline 9 Error in macro FUNCTION_INSTALL_MODE_PAGE_FUNC…

【QT+QGIS跨平台编译】040:【geos_c+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、geos_c介绍二、文件下载三、文件分析四、pro文件五、编译实践一、geos_c介绍 GEOS_C(GEOS C++接口)是GEOS库的C语言版本,它提供了一套丰富的API,允许开发者在C++程序中执行复杂的几何形状处理和空间关系分析。GEOS_C是基于JTS(Java Topolog…

【黑马头条】-day04自媒体文章审核-阿里云接口-敏感词分析DFA-图像识别OCR-异步调用MQ

文章目录 day4学习内容自媒体文章自动审核今日内容 1 自媒体文章自动审核1.1 审核流程1.2 内容安全第三方接口1.3 引入阿里云内容安全接口1.3.1 添加依赖1.3.2 导入aliyun模块1.3.3 注入Bean测试 2 app端文章保存接口2.1 表结构说明2.2 分布式id2.2.1 分布式id-技术选型2.2.2 雪…

IP组播基础

原理概述 IANA ( Internet Assigned Numbers Authority &#xff09;将 IP 地址分成了 A 、 B 、 C 、 D 、 E5类&#xff0c;其中的 D 类为组播 IP 地址&#xff0c;范围是224.0.0.0~239.255.255.255。 一个 IP 报文&#xff0c;其目的地址如果是单播 IP 地址&#xff…

Unity3d使用Jenkins自动化打包(Windows)(二)

文章目录 前言一、Unity工程准备二、Unity调取命令行实战一实战二实战三实战四实战五 总结 前言 自动化打包的价值在于让程序员更轻松地创建和管理构建工具链&#xff0c;提高编程效率&#xff0c;将繁杂的工作碎片化&#xff0c;变成人人&#xff08;游戏行业特指策划&#x…

混合编程:在Go中与Python共舞

1. 引言 在软件开发领域&#xff0c;Go语言和Python都是备受推崇的高级编程语言&#xff0c;它们各自具有独特的优势和适用场景。Go语言以其简洁、高效的特性而闻名&#xff0c;而Python则因其简单易学、灵活多样的语法而备受青睐。本文将探讨Go语言与Python的优势&#xff0c…