刚看完“无问西东”,电影里说人总归还是要留下些足迹(文字)的,那么赶紧跑图书馆来留下些文字。

最近去瑞士启动了一个新的项目,那么早上做项目,晚上总结留下了一张张思维导图来记录当时的感受,

手稿如下,字写得不好请见谅:)

首先你得知道这个软件写出来是做什么的,因为不同的应用场景对软件要求是千差万别的。

例如,机械控制?那可能需要实时性高;订票系统?那需要并发性好,还有数据准确性要高;购物系统?简单,好看,好用,操作不反人类......

所以第一重要的东西就是,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一下我在瑞士买的本子,我喜欢用思维导图捕捉思想,在瑞士偶遇了这个本子,大小纸张都很合适:)

全新的软件项目,好的开始决定了成功一半!(需求&计划)的更多相关文章

  1. 软件项目量化管理(CMMI高成熟度)实践经验谈——之项目管理过程策划篇

    续:软件项目量化管理(CMMI高成熟度)实践经验谈--之概述篇 二.项目管理过程 软件开发项目管理过程,从项目全视角来看,分为售前.售中.售后等三个大的阶段.本文所谈的是售中阶段项目管理过程,在售中阶 ...

  2. 开篇:软件项目的整个流程 - IT软件人员学习系列文章

    这段时间闲来无事,就在总结以前的项目经验,然后写成博客的形式以进行记录.本文就对<IT软件人员学习系列文章>做个开篇吧. 对于IT软件的开发来说,无外乎B/S.C/S和Android.iO ...

  3. 规范化的软件项目演进管理--从 Github 使用说起

    规范化的软件项目演进管理 从 Github 使用说起 1   前言 首先,本文的层次定位是:很基本很基础的 Github 工具的入门级应用,写给入门级的用户看的. 基本上工作过几年的人,下面描述的这些 ...

  4. Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结

    Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结 软件项目中的非法模块非法功能非法分子与人类中的非法分子很是相似,必须要建议不同的的约束管理标准化... 软 ...

  5. 开源软件项目管理系统招设计/开发。。。。。Zend Framework2架构 svn://735.ikwb.com/pms

    开源软件项目管理系统招设计/开发.....Zend Framework2架构svn://735.ikwb.com/pms

  6. AxeSlide软件项目梳理

    先介绍一下我负责的软件项目 AxeSlide斧子演示,估计大部分人没有听说过,但国外有一款叫Prezi的软件,应该有一部分人使用过. 这是我们产品的官网http://www.axeslide.com/ ...

  7. “canvas画布仿window系统自带画图软件"项目的思考

    "canvas画布仿window系统自带画图软件"项目的思考 首先贴上DEMO图,并没有美化效果.对UI有要求的,请自带补脑技术. 思考一 在做项目的过程中,我发现"工具 ...

  8. 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路

    layout: post title: 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路 key: 20180517 tags: OAA flow chart se ...

  9. 小账本APP——软件项目风险管理及解决办法案例

    小账本APP——软件项目风险管理及解决办法案例 摘要 软件项目风险是指在软件开发过程中遇到的预算和进度等方面的问题以及这些问题对软件项目的影响.软件项目风险会影响项目计划的实现,如果项目风险变成现实, ...

随机推荐

  1. css实现网格背景

    只使用一个渐变时,我们能创建的图案并不多,当我们把多个渐变图案组合起来,让他们透过彼此的透明区域显现时,神奇的事情就发生了!我们首先想到的是把水平和水质条纹叠加起来,就可以得到各种各样的网格. 1. ...

  2. Android Studio 查看手机CPU信息

    在Android开发中,我们想要获取手机是什么CPU架构,可以通过下面方式: 1.进入adb 终端 adb shell 2.进入proc目录 cd /proc/ 3.查看cpu信息 cat cpuin ...

  3. 15.5 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表

    点击返回:自学Zabbix之路 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表  1. Actions表 actions表记录了当触发器触发时,需要采用的动作. 2.Aler ...

  4. asp.net mvc 防止重复提交

    string hiddenToken = "hiddenToken"; public void OnActionExecuting(ActionExecutingContext f ...

  5. Windows内核中的内存管理

    内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,Driver ...

  6. html的布局demo

    header section footer 都是水平,垂直居中,文本内容居中 section的高度是根据文本内容自适应的,footer会一直在最下面 <!DOCTYPE html> < ...

  7. String常用的方法

    l String: 字符串类,字符串是常量:它们的值在创建之后不能更改 l 方法 boolean equals(Object obj) 判断两个字符串中的内容是否相同 boolean equalsIg ...

  8. 牛客网linux试题-错误整理-20171013

    创建对象时,对象的内存和指向对象的指针分别分配在:堆区,栈区 堆内存用来存放由new创建的对象和数组,在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在 ...

  9. RNN的简单的推导演算公式(BPTT)

    附上y=2x-b拟合的简单的代码. import numpy as np x = np.asarray([2,1,3,5,6]); y = np.zeros((1,5)); learning_rate ...

  10. AFO

    留坑 有点绝望 状态什么的,存在么 upd at 2017/11/14还算完满地结束了OI之路了吧.