最小可行产品需要最小可行架构——可持续架构(三)
前言
- 最小可行产品(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的一部分创建有助于团队评估技术可行性,并为产品提供一个稳固的基础,可以随着产品的发展而进行调整。公开透明的架构决策有助于组织更好地理解为何会做出某些选择,从而帮助他们更好地决定如何使产品适应不断变化的市场条件和不断发展的客户需求。
相关文章:

最小可行产品需要最小可行架构——可持续架构(三)
前言 最小可行产品(MVP)的概念可以帮助团队专注于尽快交付他们认为对客户最有价值的东西,以便在投入大量时间和资源之前迅速、廉价地评估产品的市场规模。MVP不仅需要考虑产品的市场可行性,还需要考虑其技术可行性,以…...

笔记: 数据结构与算法--时间复杂度二分查找数组
算法复杂度 不依赖于环境因素事前分析法 计算最坏情况的时间复杂度每一条语句的执行时间都按照t来计算 时间复杂度 大O表示法 n 数据量 ; f(n) 实际的执行条数当存在一个n0 , 使得 n > n0,并且 c * g(n) 恒> f(n) : 渐进上界(算法最坏的情况)那么f(n)的时间复杂度 …...

AI绘画教程:Midjourney使用方法与技巧从入门到精通
文章目录 一、《AI绘画教程:Midjourney使用方法与技巧从入门到精通》二、内容介绍三、作者介绍🌤️粉丝福利 一、《AI绘画教程:Midjourney使用方法与技巧从入门到精通》 一本书读懂Midjourney绘画,让创意更简单,让设计…...

Spring-事务管理
1、事务管理 1.1、回滚方式 默认回滚方式:发生运行异常时异常和error时回滚,发生受查(编译)异常时提交。不过,对于受查异常,程序员也可以手工设置其回滚方式 1.2、事务定义接口 1.2.1、事务隔离级别常量 这些常量…...

MySql实战--为什么我的MySQL会“抖”一下
时的工作中,不知道你有没有遇到过这样的场景,一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短…...

【蓝桥杯第十三届省赛B】(部分详解)
九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…...

[linux初阶][vim-gcc-gdb] OneCharter: vim编辑器
一.vim编辑器基础 目录 一.vim编辑器基础 ①.vim的语法 ②vim的三种模式 ③三种模式的基本切换 ④各个模式下的一些操作 二.配置vim环境 ①手动配置(不推荐) ②自动配置(推荐) vim是vi的升级版,包含了更加丰富的功能. ①.vim的语法 vim [文件名] ②vim的三种模式 命令…...

【Lazy ORM 框架学习】
Gitee 点赞关注不迷路 项目地址 快速入门 模块所属层级描述快照版本正式版本wu-database-lazy-lambdalambda针对不同数据源wu-database-lazy-orm-coreorm 核心orm核心处理wu-database-lazy-sqlsql核心处理成处理sql解析、sql执行、sql映射wu-elasticsearch-starterESESwu-hb…...

安科瑞路灯安全用电云平台解决方案【电不起火、电不伤人】
背景介绍 近年来 ,随着城市规模的不断扩大 ,路灯事业蓬勃发展。但有的地方因为观念、技术、管理等方面不完善 ,由此引发了一系列安全问题。路灯点多面广 ,一旦漏电就极容易造成严重的人身安全事故。不仅给受害者家庭带来痛苦 &am…...

MYSQL——索引概念索引结构
索引 索引是帮助数据库高效获取数据的排好序的数据结构。 有无索引时,查询的区别 主要区别在于查询速度和系统资源的消耗。 查询速度: 在没有索引的情况下,数据库需要对表中的所有记录进行扫描,以找到符合查询条件的记录&#…...

Linux(CentOS7)配置系统服务以及开机自启动
目录 前言 两种方式 /etc/systemd/system/ 进入 /etc/systemd/system/ 文件夹 创建 nginx.service 文件 重新加载 systemd 配置文件 编辑 配置开机自启 /etc/init.d/ 进入 /etc/init.d/ 文件夹 创建 mysql 文件 编写脚本内容 添加/删除系统服务 配置开机自启 …...

0 决策树基础
目录 1 绪论 2 模型 3 决策树面试总结 1 绪论 决策树算法包括ID3、C4.5以及C5.0等,这些算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的…...

Linux速览(2)——环境基础开发工具篇(其一)
本章我们来介绍一些linux的常用工具 目录 一. Linux 软件包管理器 yum 1.什么是软件包? 2. 查看软件包 3. 如何安装软件 4. 如何卸载软件 5.yum补充 6. 关于 rzsz 二. Linux编辑器-vim使用 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4. vim末行模式…...

AWS SES发送邮件时常见的错误及解决方法?
AWS SES发送邮件如何做配置?使用AWS SES发信的限制? 在使用AWS SES发送邮件时,可能会遇到一些常见的错误。AokSend将介绍一些常见的AWS SES发送邮件错误及其相应的解决方法,帮助用户更好地利用AWS SES进行邮件发送。 AWS SES发送…...

视频基础学习三——视频帧率、码率与分辨率
文章目录 前言一、介绍1.定义2.三者之间的关系 总结 前言 在之前的文章中详细介绍了一些关于图像的色彩与格式,而视频其实就是由一张张图片进行展示呈现出来的。 我们会经常说一段视频的质量好不好,而什么是视频的质量呢?博主的个人理解就是…...

Spring(详细介绍)
目录 一、简介 1、什么是Spring? 2、Spring框架的核心特性 3、优点 二、IOC容器 介绍 1、获取资源的传统方式 2、控制反转方式获取资源 3、DI 4、IOC容器在Spring中的实现 入门案例 1、创建Maven Module 2、引入依赖 3、创建HelloWorld类 4、在Spring的配…...

Kettle使用
1.准备工作 KETTLE-5.4.zip HANA环境192.168.xx.xx 用户名:system 密码:****** 端口号:30015 Oracle环境 192.168.xx.xx 用户名 HANA_TEST 密码 ****** 端口号:31001 配置java环境变量 因为本次数据转换测试为将HANA数据转换到Or…...

互联网摸鱼日报(2024-04-01)
互联网摸鱼日报(2024-04-01) 36氪新闻 「矽迪半导体」获数千万天使轮融资,提供高效功率半导体方案|硬氪首发 本周双碳大事:国资委即将发布央企ESG指导意见;上海发文推动建立产品碳足迹管理体系;隆基新硅片面世 数字…...

pnpm比npm、yarn好在哪里?
前言 pnpm对比npm/yarn的优点: 更快速的依赖下载更高效的利用磁盘空间更优秀的依赖管理 我们按照包管理工具的发展历史,从 npm2 开始讲起: npm2 使用早期的npm1/2安装依赖,node_modules文件会以递归的形式呈现,严格…...

大前端-postcss安装使用指南
PostCSS 是一款强大的 CSS 处理工具,可以用来自动添加浏览器前缀、代码合并、代码压缩等,提升代码的可读性,并支持使用最新的 CSS 语法。以下是一份简化的 PostCSS 安装使用指南: 一、安装 PostCSS 在你的项目目录中,…...

全局UI方法-弹窗三-文本滑动选择器弹窗(TextPickDialog)
1、描述 根据指定的选择范围创建文本选择器,展示在弹窗上。 2、接口 TextPickDialog(options?: TextPickDialogOptions) 3、TextPickDialogOptions 参数名称 参数类型 必填 参数描述 rang string[] | Resource 是 设置文本选择器的选择范围。 selected nu…...

LibreOffice 将word,excel,PowerPoint文件转换PDF
安装LibreOffice并将Word和Excel文件转换为PDF文件,并设置文件存放路径的步骤如下: 1. 安装LibreOffice 如果尚未安装LibreOffice,可以通过以下命令在Ubuntu上安装: sudo apt update sudo apt install libreoffice 2. 使用Li…...

鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]
由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。 参考链接: 鱼眼镜头的成像原理到畸变矫正(完整版) 相机模型总结(针孔、鱼眼、全景) 三维…...

谈谈Python中的列表、元组、字典和集合的主要区别和用法
谈谈Python中的列表、元组、字典和集合的主要区别和用法 Python是一种功能强大且易于学习的编程语言,它提供了多种数据结构来支持各种编程需求。其中,列表(list)、元组(tuple)、字典(dictionar…...

【WPF应用24】C#中的Image控件详解与应用示例
在C#应用程序开发中,图像显示是一个常见的需求。无论是创建图形界面还是处理图像数据,System.Windows.Controls.Image控件都是实现这一目标的重要工具。本文将详细介绍Image控件的功能、用法、优化技巧以及一些实际应用示例,帮助开发者更好地…...

CTF题型 php://filter特殊编码绕过小汇总
CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议,它允许你读取经过过滤器处理的数据流…...

【嵌入式智能产品开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】
目录 程序的安装 程序安装的本质 在Linux下制作软件安装包 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正…...

网络编程的学习1
网络编程 在网络通信协议下,不同计算机上运行的程序,进行数据传输。 三要素 ip:设备在网络中的地址,是唯一的标识。 ipv4:采取32位地址长度,分成4组。 ipv6:采用128位地址长度,分成8组。 …...

spark log4j日志文件动态参数读取
需要在log4j xml文件中设置动态参数,并支持spark任务在集群模式下,动态参数读取正常; 1.log4j配置文件 log4j2.xml <?xml version"1.0" encoding"UTF-8"?> <Configuration status"info" name&quo…...

设计模式,装修模式,Php代码演示,优缺点,注意事项
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许动态地向一个现有对象添加新的功能或行为,而不改变其原始结构。在 PHP 中,可以使用类的继承和组合来实现装饰模式。下面是一个简单的 PHP 装饰模式示例代码&am…...