全新的软件项目,好的开始决定了成功一半!(需求&计划)
刚看完“无问西东”,电影里说人总归还是要留下些足迹(文字)的,那么赶紧跑图书馆来留下些文字。
最近去瑞士启动了一个新的项目,那么早上做项目,晚上总结留下了一张张思维导图来记录当时的感受,
手稿如下,字写得不好请见谅:)

首先你得知道这个软件写出来是做什么的,因为不同的应用场景对软件要求是千差万别的。
例如,机械控制?那可能需要实时性高;订票系统?那需要并发性好,还有数据准确性要高;购物系统?简单,好看,好用,操作不反人类......
所以第一重要的东西就是,Domian Knowledge领域知识。
领域知识
领域知识,怎么获得?当然是找三类人(产品经理,领域专家,服务工程师)。
产品经理:是他定义的产品,他当然一般知道用户的关注点和痛点是什么,他一般也是在这个行业中摸爬滚打了很多年,你让他给你讲这个行业是个什么情况,
这个产品大概应该做成什么样子,为什么要做这个产品,他一般都有自己的一些想法(当然有时候也不是非常全面的)
领域专家:他一般知道客户生产产品的流程,知道客户会怎么使用系统来帮助他们提高产品质量或生产效率,他也知道这个行业的基本技术水平在个什么高度(现在市面上的软件能帮客户产品做什么方面的管控,如何提高生产效率和产品质量),也知道按照客户流程这个产品应该怎么做测试
服务工程师:也就是你这个软件产品交付给客户使用之后,他们负责和客户交互,解决使用和简单技术问题。所以客户的一些反馈,客户如何真正使用软件,以及客户心情他们是都知道的。他们是软件使用的老师傅。
抓住这三类人,你将获得巨大的领域知识,这样你提供给客户的功能不再只是可运行的系统,而是在不断的给客户提供价值。
需求文档
人都是靠需求驱动的,马斯洛归纳了人类的5大基本需求。软件当然也不例外,软件也是靠需求驱动的,粗略的可以分成两大类--功能性需求和非功能性需求。
所以需求文档必须包含这两部分。
功能性需求:主要描述系统的行为要求。这个一般产品经理都会写,只是详略程度各有区别。
非功能性需求:主要描述系统的性能要求。
性能要求一般包括:易用性,效率性,维护性,安全性,可扩展性,等。
性能要求看似不起眼,而且很多情况下产品经理会漏掉定义这些。然后性能要求其实是驱动软件架构最重要的元素,所以项目开始这些也要定义清楚。
拿到需求之后有以下这些动作是要做的
- 需求的澄清:先阅读产品经理写的需求文档,然后将每条需求大概的用你自己的语言给产品经理讲一遍,看看你的理解是否正确,有疑问的话直接问,因为这些疑问迟早要回答的,越晚回答越对项目造成风险。(在你发问的过程中你会发现其实很多需求产品经理也都没想透彻,你发问帮助他思考,当然也是帮助自己不要写无用的代码)
- 需求排优先级:需求一定是有优先级和版本发布最小功能集的。如果你不能挖掘出这两个东西来,你很难做成功这个项目。如果产品经理说说有的需求都重要,请给他100块钱,然后说:“假设你只有100块钱来买软件功能,请将这100块钱分配到不同的需求上,钱越多表示越重要。”这之后你自然能知道需求的价值和粗略的优先级。需求文档拿到之后还有一个重要的策略是最小集,你说:“如果我们人手实在有限,只能提供软件最基础的功能,请你告诉我软件上线,哪些功能是必不可少的。”这之后你大概就知道项目的范围了。这样一般一个有经验的项目经理大概就能知道产品按时上市的可行性了。
- 需求文档经过前两步,项目目标,可行性和真实需求应该会比以前清楚不少了,那么后面项目经理一般会让开发组出一个项目估算。我只能告诉大家这个时候的估算,一般都不是太准的,但是我们可能试着提高估算的准确性。这里有个技巧就是把需求用User Story(https://www.mountaingoatsoftware.com/agile/user-stories)的方式来描述:As ...(role) I want ...(function)..so that...(purpose) 就是作为什么样的角色我需要什么样的功能,这个功能的目的是什么。可以发现当产品经理提出一个需求的时候你最想问的一般是“你为什么要这个功能,这功能谁会用?那他一般怎么使用?”,当然有时候“你为什么要这个功能?”听起来有点aggressive,但是却是个好问题:)
- 有了上面的用户故事,你们团队就可以开始做估算了。估算一般用计划扑克会比较好。当软件有技术难点时一般时间会估得比较不准,所以我建议尽早将系统难点研究一下,之后动手了才能真正知道有多复杂,说不定很简单呢。人对于自己不了解的东西总是有种恐惧感,估算的时候有时会估出一个“天文数字”。估算不是只做一次,第一次估算只是大概看看人手是否足够,技术点时候没太大risk,而不要太在意准确性。估算可以不断修正的,你了解得更多也会估得越准。
- 需求的利益相关者:这一条虽然放在最后,其实最重要:)请确保参与项目的利益相关者都在同一个理解层面上也就是on the same page。所以前期开会要尽量要求所有利益相关者一同开会,对整个项目有个相同的认识,而且对于项目的范围,目标,时间,质量达成协议,这样才好继续后面的工作。千万不要孤立或遗漏了重要的利益相关人员,或开很多小范围的讨论会议,这样很容易浪费时间,达不成共识,项目注定失败。还有一些重要决定请一定邮件、文档记录,签证画押~~
需求之后的产出物
- 需求定好了之后一般就可以产出一个基本的系统架构设计了--这个出来之后才好开始技术研究或相关编码
- 需求定好了之后一般就可以产出一个Mile Stone和交付计划了-- 这个出来之后才好安排相应的测试和其它资源
项目成功最最最最重要的部分,写在这了
角色定义和授权
- 这个很重要有了角色定义,项目中的角色就有了责任将这个角色扮演好,其它人有问题也可以找到相应的人员,也消除了一部分人不管自己的事情,老去盯着别人
- 授权也很重要,各个角色有什么权利,管哪些方面定义好了,就不会有模糊领域大家都不管,或者资源不听使唤
需求文档 -- 描述了做什么,什么不做,做的假设是什么
用户故事描述需求--可以捕捉,这个功能是谁要的,为什么要这个功能
软件架构设计--架构设计怎么来满足需求中的非功能性需求和功能性需求
估算--用来给项目计划提供支撑和合理安排资源
项目计划--给管理层一个时间节点和期望,相应的时间节点做资源安排等
后面找时间写后面几篇:
--全新的软件项目,好的开始决定了成功一半!(架构设计)
--全新的软件项目,好的开始决定了成功一半!(团队)
最后给大家show一下我在瑞士买的本子,我喜欢用思维导图捕捉思想,在瑞士偶遇了这个本子,大小纸张都很合适:)

全新的软件项目,好的开始决定了成功一半!(需求&计划)的更多相关文章
- 软件项目量化管理(CMMI高成熟度)实践经验谈——之项目管理过程策划篇
		续:软件项目量化管理(CMMI高成熟度)实践经验谈--之概述篇 二.项目管理过程 软件开发项目管理过程,从项目全视角来看,分为售前.售中.售后等三个大的阶段.本文所谈的是售中阶段项目管理过程,在售中阶 ... 
- 开篇:软件项目的整个流程 - IT软件人员学习系列文章
		这段时间闲来无事,就在总结以前的项目经验,然后写成博客的形式以进行记录.本文就对<IT软件人员学习系列文章>做个开篇吧. 对于IT软件的开发来说,无外乎B/S.C/S和Android.iO ... 
- 规范化的软件项目演进管理--从 Github 使用说起
		规范化的软件项目演进管理 从 Github 使用说起 1 前言 首先,本文的层次定位是:很基本很基础的 Github 工具的入门级应用,写给入门级的用户看的. 基本上工作过几年的人,下面描述的这些 ... 
- Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结
		Atitit 软件项目非法模块与功能的管理与 监狱管理的对比 原理与概论attilax总结 软件项目中的非法模块非法功能非法分子与人类中的非法分子很是相似,必须要建议不同的的约束管理标准化... 软 ... 
- 开源软件项目管理系统招设计/开发。。。。。Zend Framework2架构 svn://735.ikwb.com/pms
		开源软件项目管理系统招设计/开发.....Zend Framework2架构svn://735.ikwb.com/pms 
- AxeSlide软件项目梳理
		先介绍一下我负责的软件项目 AxeSlide斧子演示,估计大部分人没有听说过,但国外有一款叫Prezi的软件,应该有一部分人使用过. 这是我们产品的官网http://www.axeslide.com/ ... 
- “canvas画布仿window系统自带画图软件"项目的思考
		"canvas画布仿window系统自带画图软件"项目的思考 首先贴上DEMO图,并没有美化效果.对UI有要求的,请自带补脑技术. 思考一 在做项目的过程中,我发现"工具 ... 
- 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路
		layout: post title: 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路 key: 20180517 tags: OAA flow chart se ... 
- 小账本APP——软件项目风险管理及解决办法案例
		小账本APP——软件项目风险管理及解决办法案例 摘要 软件项目风险是指在软件开发过程中遇到的预算和进度等方面的问题以及这些问题对软件项目的影响.软件项目风险会影响项目计划的实现,如果项目风险变成现实, ... 
随机推荐
- java基础day02
			变量命名: 1.1)只能包含字母.数字._和$符,并且不能以数字开头 1.2)严格区分大小写 1.3)不能使用关键字 变量初始化:1)声明的同时初始化:2)先声明后初始化.基本数据类型0.byte: ... 
- 通过window.location.search获取页面url传递的参数
			function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ... 
- python正则详解
			正则表达式概述 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),是计算机科学的 ... 
- 对比Tornado和Twisted两种异步Python框架
			做Python的人,一定知道两个性能优秀的异步网络框架:tornado,和twisted. 那么,这两个著名的框架,又有什么异同呢?tornado和twisted,我都用在几个游戏项目中,做过后端,觉 ... 
- .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接
			众所周知在.NET下的RSA类所生成的密钥为Xml格式,而其他语言比如java一般使用pkcs8格式的密钥,JavaScript一般使用pkcs1格式.我们在开发过程中很可能遇到需要与其他语言开发的a ... 
- Undefined symbols for architecture arm64(其cpu架构)
			"_OBJC_CLASS_$_XXX",referenced from: 之类的问题,很多人看到这些很头疼,不知道从何下手去修改.以下是我总结的相关修改办法.如下图 这是一个很明显 ... 
- InnoDB锁机制
			1. 锁类型 锁是数据库区别与文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问. InnoDB使用的锁类型,分别有: 共享锁(S)和排他锁(X) 意向锁(IS和IX) 自增长锁(AUTO-I ... 
- Swagger入门教程
			[译]5.41 Swagger tutorial 单击此处查看原文 更多概念参见:Implementing Swagger with your API docs 关于 Swagger Swagger能 ... 
- 谈谈关键字new
			1.在情人节那天,无意间看到空间有人说,没有对象就new一个,然后就可以........ 程序中我们常用到X a=new X(), new在这里是创建一个对象,也可以叫做创建一个实例,我们先谈谈后半部 ... 
- MySQL如何插入测试数据
			关于插入MySQL测试数据,这里介绍两种方法: 选择优先级(结合PHP生成测试数据 > 使用存储过程 ). 使用存储过程(建议测试数据小于1000条使用该方法) 具体代码如下: 创建表: mys ... 
