learn.lianglianglee.com/专栏/软件工程之美/17 需求分析到底要分析什么?怎么分析?.md.html
2022-05-11 18:57:05 +08:00

1403 lines
36 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>17 需求分析到底要分析什么?怎么分析?.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/软件工程之美/00 开篇词 你为什么应该学好软件工程?.md.html">00 开篇词 你为什么应该学好软件工程?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/01 到底应该怎样理解软件工程?.md.html">01 到底应该怎样理解软件工程?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/02 工程思维:把每件事都当作一个项目来推进.md.html">02 工程思维:把每件事都当作一个项目来推进.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/03 瀑布模型:像工厂流水线一样把软件开发分层化.md.html">03 瀑布模型:像工厂流水线一样把软件开发分层化.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/04 瀑布模型之外,还有哪些开发模型?.md.html">04 瀑布模型之外,还有哪些开发模型?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/05 敏捷开发到底是想解决什么问题?.md.html">05 敏捷开发到底是想解决什么问题?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/06 大厂都在用哪些敏捷方法?(上).md.html">06 大厂都在用哪些敏捷方法?(上).md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/07 大厂都在用哪些敏捷方法?(下).md.html">07 大厂都在用哪些敏捷方法?(下).md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/08 怎样平衡软件质量与时间成本范围的关系?.md.html">08 怎样平衡软件质量与时间成本范围的关系?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/09 为什么软件工程项目普遍不重视可行性分析?.md.html">09 为什么软件工程项目普遍不重视可行性分析?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/10 如果你想技术转管理,先来试试管好一个项目.md.html">10 如果你想技术转管理,先来试试管好一个项目.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/11 项目计划:代码未动,计划先行.md.html">11 项目计划:代码未动,计划先行.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/12 流程和规范:红绿灯不是约束,而是用来提高效率.md.html">12 流程和规范:红绿灯不是约束,而是用来提高效率.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/13 白天开会,加班写代码的节奏怎么破?.md.html">13 白天开会,加班写代码的节奏怎么破?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/14 项目管理工具:一切管理问题,都应思考能否通过工具解决.md.html">14 项目管理工具:一切管理问题,都应思考能否通过工具解决.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/15 风险管理不能盲目乐观凡事都应该有B计划.md.html">15 风险管理不能盲目乐观凡事都应该有B计划.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/16 怎样才能写好项目文档?.md.html">16 怎样才能写好项目文档?.md.html</a>
</li>
<li>
<a class="current-tab" href="/专栏/软件工程之美/17 需求分析到底要分析什么?怎么分析?.md.html">17 需求分析到底要分析什么?怎么分析?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/18 原型设计:如何用最小的代价完成产品特性?.md.html">18 原型设计:如何用最小的代价完成产品特性?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/19 作为程序员,你应该有产品意识.md.html">19 作为程序员,你应该有产品意识.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/20 如何应对让人头疼的需求变更问题?.md.html">20 如何应对让人头疼的需求变更问题?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/21 架构设计:普通程序员也能实现复杂系统?.md.html">21 架构设计:普通程序员也能实现复杂系统?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/22 如何为项目做好技术选型?.md.html">22 如何为项目做好技术选型?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/23 架构师:不想当架构师的程序员不是好程序员.md.html">23 架构师:不想当架构师的程序员不是好程序员.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md.html">24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/25 有哪些方法可以提高开发效率?.md.html">25 有哪些方法可以提高开发效率?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/26 持续交付:如何做到随时发布新版本到生产环境?.md.html">26 持续交付:如何做到随时发布新版本到生产环境?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/27 软件工程师的核心竞争力是什么?(上).md.html">27 软件工程师的核心竞争力是什么?(上).md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/28 软件工程师的核心竞争力是什么?(下).md.html">28 软件工程师的核心竞争力是什么?(下).md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/29 自动化测试如何把Bug杀死在摇篮里.md.html">29 自动化测试如何把Bug杀死在摇篮里.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/30 用好源代码管理工具,让你的协作更高效.md.html">30 用好源代码管理工具,让你的协作更高效.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/31 软件测试要为产品质量负责吗?.md.html">31 软件测试要为产品质量负责吗?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/32 软件测试:什么样的公司需要专职测试?.md.html">32 软件测试:什么样的公司需要专职测试?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/33 测试工具为什么不应该通过QQ微信邮件报Bug.md.html">33 测试工具为什么不应该通过QQ微信邮件报Bug.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/34 账号密码泄露成灾,应该怎样预防?.md.html">34 账号密码泄露成灾,应该怎样预防?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/35 版本发布:软件上线只是新的开始.md.html">35 版本发布:软件上线只是新的开始.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/36 DevOps工程师到底要做什么事情.md.html">36 DevOps工程师到底要做什么事情.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/37 遇到线上故障,你和高手的差距在哪里?.md.html">37 遇到线上故障,你和高手的差距在哪里?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/38 日志管理:如何借助工具快速发现和定位产品问题 .md.html">38 日志管理:如何借助工具快速发现和定位产品问题 .md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/39 项目总结:做好项目复盘,把经验变成能力.md.html">39 项目总结:做好项目复盘,把经验变成能力.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/40 最佳实践:小团队如何应用软件工程?.md.html">40 最佳实践:小团队如何应用软件工程?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/41 为什么程序员的业余项目大多都死了?.md.html">41 为什么程序员的业余项目大多都死了?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/42 反面案例:盘点那些失败的软件项目.md.html">42 反面案例:盘点那些失败的软件项目.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/43 以VS Code为例看大型开源项目是如何应用软件工程的.md.html">43 以VS Code为例看大型开源项目是如何应用软件工程的.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md.html">44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html">45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第1期 30个软件开发常见问题解决策略.md.html">一问一答第1期 30个软件开发常见问题解决策略.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第2期 30个软件开发常见问题解决策略.md.html">一问一答第2期 30个软件开发常见问题解决策略.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第3期 18个软件开发常见问题解决策略.md.html">一问一答第3期 18个软件开发常见问题解决策略.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第4期 14个软件开发常见问题解决策略.md.html">一问一答第4期 14个软件开发常见问题解决策略.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第5期 22个软件开发常见问题解决策略.md.html">一问一答第5期 22个软件开发常见问题解决策略.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/学习攻略 怎样学好软件工程?.md.html">学习攻略 怎样学好软件工程?.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/特别放送 从软件工程的角度解读任正非的新年公开信.md.html">特别放送 从软件工程的角度解读任正非的新年公开信.md.html</a>
</li>
<li>
<a href="/专栏/软件工程之美/结束语 万事皆项目,软件工程无处不在.md.html">结束语 万事皆项目,软件工程无处不在.md.html</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>17 需求分析到底要分析什么?怎么分析?</h1>
<p>你好,我是宝玉,我今天想与你分享的主题是“需求分析”。</p>
<p>通过前面的学习,我们知道在瀑布模型中,第二个阶段就是需求分析阶段,同时需求分析的结果也决定了后续的系统设计、开发、测试等阶段能否顺利如期进行。即使是用敏捷开发,同样也少不了对需求的分析整理。</p>
<p>可以说需求就是整个产品的源头,所以需求分析的结果往往决定了产品的成败。如果没有正确把握客户需求,可能就会一步错,步步错!</p>
<p>就像我在《特别放送 从软件工程的角度解读任正非的新年公开信》提到的秋千的案例:</p>
<blockquote>
<p>客户想要一个给三个孩子玩的秋千;产品经理以为就是一个板子加两绳子就行;架构师发现除非把树截开,否则秋千没法荡起来的;程序员以为用绳子和板子连一起就完事了;而真正满足客户需求的,也就只要在绳子上挂个轮胎而已!</p>
</blockquote>
<p><img src="assets/2a196741845cc6533716f7ff66fa3c70.jpg" alt="img" /></p>
<p>所以在本篇文章中,我将带你去了解:需求分析到底要分析什么?以及我们怎么样才能做好需求分析,抓住用户的真实需求,做出来客户想要的软件产品,避免失败或浪费。</p>
<h2>什么是需求?</h2>
<p>我们日常在项目中,经常会听到“需求”这个词,比如说:</p>
<ul>
<li>
<p>项目经理对产品经理说:用户给我们提了一个需求,想要一个给三个孩子玩的秋千,你分析一下;-</p>
</li>
<li>
<p>产品经理对架构师说:我们现在有一个需求,在树上拴两绳子,再吊一块板子,你做一下设计。</p>
</li>
</ul>
<p>很明显,这两个需求的意思不一样,<strong>前面这个需求是用户需求,后面这个需求是产品需求。</strong></p>
<p>用户需求是由用户提出来的,期望满足自身一定需要的要求,例如用户说:“想要一个给三个孩子玩的秋千。”这种原始的用户需求通常是不能直接做成产品的,需要对其进行分析提炼,最终形成产品需求。</p>
<p>产品需求就是在分析提炼用户真实需求后,提出的符合产品定位的解决方案。就像上面“在树上栓两绳子,再吊一块板子”,就是产品经理针对用户需求提出的解决方案。</p>
<h2>需求分析是要分析什么?</h2>
<p>其实对用户需求的分析,不是一个动作,而是一个过程。需求分析,就是对用户需求进行提炼分析,最终形成产品需求的过程。</p>
<p>而针对每个用户需求的需求分析过程,需要经过三个步骤。</p>
<p><strong>第一步:挖掘真实需求</strong></p>
<p>大部分用户提的需求,都不见得是其真实的需求,需要透过现象看本质,去挖掘其背后真实的需求。就像福特汽车创始人亨利福特说过的:</p>
<p>如果我最初是问消费者他们想要什么,他们应该是会告诉我,“要一辆更快的马车!”</p>
<p>这里“要一辆更快的马车”就是一个典型的用户需求,但这并非是用户的真实需求,用户的真实需求,需要通过分析才能得到。</p>
<p>要分析用户的真实需求,可以从三个角度入手。</p>
<ol>
<li>目标用户:用户不同,诉求也不一样;</li>
<li>使用场景:使用场景不一样,解决方案也会有所不同;</li>
<li>想要解决的问题:用户背后想要解决的问题是什么。</li>
</ol>
<p>我们假设目标用户是普通乘客,使用场景是日常出行,那么用户想要解决的问题其实并不简单是“要一辆更快的马车”,想要更快的马车只是用户自己能想到的解决方案,而他想解决的问题是“更快更舒适的出行方式”。</p>
<p>而现实项目中,大多数人需求分析的不正确,就是因为没有挖掘出用户的真实需求。</p>
<p>我们再看之前的秋千项目,目标用户是三个孩子,使用场景是一起户外玩耍,想解决的问题其实是能有一起玩的娱乐设施。</p>
<p><strong>第二步:提出解决方案</strong></p>
<p>我们知道了目标用户,其使用场景和想要解决的问题,就可以结合产品定位,提出相应的解决方案。</p>
<p>比如针对想要“更快更舒适的出行方式”日常出行的乘客,我们就可以提出汽车的解决方案,而不一定要局限于马车,汽车能更好的满足用户需求。</p>
<p>针对三个孩子想有一个在户外一起玩的娱乐设施这个需求,我们可以提供一个轮胎式的秋千,就可以很好的满足他们的需求,我们甚至可以建一个小型游乐园。</p>
<p><strong>第三步:筛选和验证方案</strong></p>
<p>在提出方案后,我们需要对方案进行筛选,比如对于秋千项目,建小型游乐园的方案虽然能满足需求,但是成本太高,需要排除掉。</p>
<p>在选好方案后,还需要对方案进行验证,以确保方案能解决用户需求。</p>
<p>在传统瀑布模型中,选定方案后,会写成产品设计文档,走相应的评审流程,评审完成后再进行设计、开发和测试,测试完成后会让客户再进行验收。而敏捷开发,在整个开发过程中,每个迭代或者关键的里程碑,也一样需要客户进行验收。</p>
<p>通过以上三步,就可以对用户需求进行提炼分析,最终形成产品需求。</p>
<p>所以在需求分析过程中,分析的就是一个个用户的需求,找出背后的真实诉求,再有针对性的提出解决方案。</p>
<p>对于解决方案,要进行筛选和验证,有些不可行的用户需求不会变成产品需求,可行的用户需求会按照优先级进入实施阶段,最终变成产品。</p>
<h2>怎样做需求分析?</h2>
<p>前面我介绍了对单个用户需求的分析,主要经过三个步骤:</p>
<ul>
<li>
<p>第一步:挖掘真实需求;</p>
</li>
<li>
<p>第二步:提出解决方案;</p>
</li>
<li>
<p>第三步:筛选和验证方案。</p>
</li>
</ul>
<p>而软件项目的用户需求,从来就不是单一的,而是一系列需求,所以对于软件项目的需求分析,还需要增加收集整理的步骤。整个过程是迭代进行的,如下所示:</p>
<ul>
<li>
<p>收集需求:对用户需求进行收集整理;</p>
</li>
<li>
<p>分析需求:对需求进行分析,挖掘用户真实需求;</p>
</li>
<li>
<p>需求评估:筛选过滤掉不可行的需求;</p>
</li>
<li>
<p>需求设计:针对用户需求提出解决方案,设计成产品方案;</p>
</li>
<li>
<p>验证需求:验证方案是否可行。</p>
</li>
</ul>
<p><img src="assets/b4f5e9676ed215c1d80da73a15281776.jpg" alt="img" /></p>
<p>我在美国 DePaul 大学读书的时候,曾在学校兼职,当时接到一个项目,要为计算机学院的网络教学系统做一个网页版的播放器。</p>
<p>我们知道现在的课堂里面,老师上课的时候,会用电脑放 PPT 或者课件,同时还要在黑板(也有的是白板)上写写画画辅助说明。</p>
<p>DePaul 大学的网络教学系统,就是在老师上课的时候,用摄像头把老师讲课的整个过程都录制成视频,同时也会用特殊的软件,把当时电脑屏幕上显示的内容,和白板上写的内容,都录制下来。</p>
<p>这样选网络课程的同学可以通过网络直接观看,既不会漏了老师讲的内容,也不会错过老师在电脑上放的和白板上书写的内容。播放器要做的就是要播放录制的教学视频、电脑屏幕和白板。</p>
<p>我将以这个项目为例,讲讲如何做需求分析。</p>
<ol>
<li><strong>收集需求</strong></li>
</ol>
<p>这个项目的原始需求是老师给我的,只是告诉我要做这样一个播放器,让学生能看教学内容。而这个需求还不够,我还需要继续收集用户需求。</p>
<p>收集用户需求有很多方法,这里列举部分:</p>
<p>头脑风暴:就是大家一起开会头脑风暴讨论;</p>
<p>用户调研:通过调查问卷或者访谈,通过问用户一些问题收集反馈;</p>
<p>竞品分析:通过分析其他同类产品的功能获得需求;</p>
<p>快速原型:通过原型来收集反馈,收集确认需求。</p>
<p>拿播放器的项目来说,头脑风暴没有足够的项目成员,也没有同类产品可以做竞品分析,做原型的话,成本有点高,所以用户调研就是最适合的收集需求的方法。它不仅简单,而且能收集到真实的用户反馈。于是我通过微信群、邮件、用户访谈从老师、领导和学生那分别收集了一些反馈。</p>
<p>老师们没有什么有效反馈,因为他们基本不需要用到这个软件,领导们有个需求就是希望能播放字幕,而很多学生希望能有 2 倍速快进功能。</p>
<ol start="2">
<li><strong>分析需求</strong></li>
</ol>
<p>收集了需求,就要分析用户的真实需求,这是最难的部分,也是最体现产品经理需求分析水平的地方。</p>
<p>用户需求背后的真实需求有三个层次:</p>
<ul>
<li>
<p>表层需求:用户对解决问题的期望,例如马车更快;</p>
</li>
<li>
<p>深层需求:用户的深层次动机,诉求产生的原因,例如乘客对出行速度的要求;</p>
</li>
<li>
<p>底层需求:人性本能的需求,例如对安全感对舒适的追求。</p>
</li>
</ul>
<p>要分析好用户需求背后的真实需求,就是要结合“目标用户”和“使用场景”,按照上面三个层次去思考。</p>
<p>我们拿刚才播放器为例,目标用户是学生,使用场景是学校机房或者家里,希望解决以下问题。</p>
<p>字幕的问题:</p>
<ul>
<li>
<p>表层需求:显示字幕;</p>
</li>
<li>
<p>深层需求:语言不好,跟不上老师节奏;</p>
</li>
<li>
<p>底层需求:聋哑学生无法听到声音,只能通过字幕学习。</p>
</li>
</ul>
<p>快进的问题:</p>
<ul>
<li>
<p>表层需求:能快进播放;</p>
</li>
<li>
<p>深层需求:可以节约学习的时间,提高效率;</p>
</li>
<li>
<p>底层需求:取得好的学习成绩</p>
</li>
</ul>
<p>经过这么一分析,基本上就对于用户的真实需求心里有数了。</p>
<ol start="3">
<li><strong>需求评估</strong></li>
</ol>
<p>需求收集分析完了后,还需要进一步评估,以决定做还是不做,优先级如何,先做哪些再做哪些。</p>
<p>需求评估考虑的因素有:</p>
<ul>
<li>
<p>可行性:技术能否实现;</p>
</li>
<li>
<p>成本:人力成本、时间成本;</p>
</li>
<li>
<p>商业风险和收益:有没有商业上的风险,收益是否合理;</p>
</li>
<li>
<p>紧急性与重要性:是不是用户迫切的需求。</p>
</li>
</ul>
<p>如果确定可行,还需要评估其优先级。评估优先级一个简单的方案就是用“紧急重要四象限”的方法来区分:</p>
<p><img src="assets/43965aae9c1a2f294fb5664731e9cdd8.jpg" alt="img" /></p>
<p>复杂一点的有 KANO 模型,如下图所示。</p>
<p><img src="assets/71cb6e674f8b633be802a02c2e616d7f.jpg" alt="img" /></p>
<ul>
<li>
<p>红色曲线,是用户认为必须要有的功能;</p>
</li>
<li>
<p>绿色曲线,就是用户明确提出的需求;</p>
</li>
<li>
<p>黄色曲线,属于兴奋型需求,就是用户自己没想到,超出预期的功能。</p>
</li>
</ul>
<p>回到我们播放器的例子:</p>
<ul>
<li>
<p>红色曲线(必须要有的功能):能播放视频、播放电脑屏幕,播放白板;</p>
</li>
<li>
<p>绿色曲线用户明确提出的功能字幕、2 倍速快进;</p>
</li>
<li>
<p>黄色曲线超出预期功能10 秒快进、10 秒快退、在时间轴上记录笔记。</p>
</li>
</ul>
<ol start="4">
<li><strong>需求设计</strong></li>
</ol>
<p>在分析和评估完需求后,还需要提出解决方案,也就是对需求进行设计,做出来有效的产品设计方案。最终的产品设计,会落实到人机交互上面,用户可以通过软件界面交互。</p>
<p>现在产品设计方面,各个平台都有一套比较成熟的界面标准控件,大部分产品设计都可以基于标准界面控件,组合成满足需求的用户界面,在满足功能的前提尽可能做得易用和美观。</p>
<p>在需求设计的时候,可以用草图、原型设计工具、界面设计工具进行设计。</p>
<p>在需求设计阶段,可以参考其他成熟的产品。比如我在设计播放器时,也是通过借鉴其他软件的设计来完成的,比如说向 Youtube 借鉴了视频播放器的设计,向 Skype 的电话会议系统借鉴了其播放区域切换的交互,最终完成了产品设计。</p>
<p><img src="assets/a2c1d84a3422cf77bd2a903303249977.png" alt="img" /></p>
<p>\5. 验证需求</p>
<p>在需求设计好后,还需要进行验证,看解决方案是否能满足用户的需求。</p>
<p>对需求的验证方式其实是贯穿整个软件项目生命周期的,在需求分析阶段,会反复验证确认设计好的需求是否满足用户的真实需求,例如各种设计评审。</p>
<p>在产品开发完成后,也需要有需求的验收,以确保开发出来的软件产品是客户想要的,满足客户需求的。</p>
<p>现在很多互联网产品,还有一种基于数据的验证需求方式,也就是 A/B 测试。</p>
<p>设计好一个功能上线后,并不直接让所有用户使用,而是先给一小部分用户使用,然后分析数据,看使用这个功能的用户群和不使用这个功能的用户群,在营收、访问量、活跃度等关键数据上是更好还是更坏。如果好,就加大比例,如果数据不好,可能就会调整甚至取消这个功能。</p>
<p>我在设计播放器的时候,首先用 PPT 做了一个简单的草图,拿去给老师确认,收集一些反馈后,写了一个 PC 版的软件原型,拿给一部分同学试用。在收集反馈后,做了一些修改和调整,最终确认了产品的设计。</p>
<p><img src="assets/96ffb31d8373ed35bbfc3ea66e4011f1.png" alt="img" /></p>
<p>在需求分析完成后就可以基于需求分析形成的文档进行设计和开发了。DePaul 大学的网络教学系统产品演示)</p>
<h2>总结</h2>
<p>今天带你一起学习了软件工程中一个非常重要的知识点:需求分析。</p>
<p>需求分析,就是一个将用户需求变成产品需求的过程。要做好用户需求的分析,需要找出来隐藏在用户需求背后的真实需求,还要针对用户的真实需求提出解决方案,最终验证方案是不是能满足好用户需求。</p>
<p>需求是整个产品的源头,很多软件项目失败的原因就在于没有做好需求分析,软件中很多浪费也来源于需求没想清楚导致的返工。做好需求分析对于软件项目来说非常的重要。</p>
<p>要做好软件项目的需求分析,需要做好需求的收集整理工作,然后对收集好的需求进行科学的分析,评估是不是可行以及划分优先级,对可行的需求项进行设计,最后还要验证设计出来的结果是不是满足需求。</p>
<p>希望你通过这节课的学习,能科学地运用好需求分析的知识,对项目的需求分析把好关,保证最终产品能满足用户需求,超出用户预期。</p>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/软件工程之美/16 怎样才能写好项目文档?.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/软件工程之美/18 原型设计:如何用最小的代价完成产品特性?.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997c52dc8d3cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>