现代软件工程讲义 7 设计阶段 Spec

在前一个博客里 (典型用户), 我们讲了怎么收集, 分析和验证用户的需求。 这里我们讲 spec – specification

Specification, 又叫spec, 有两种:

    a) functional spec, 软件功能说明书, 主要用来说明软件的外部功能, 和用户的交互情况 (把软件当作一个黑盒子)

    b) technical spec, 软件技术说明书, 又叫 design doc, 设计文档, 主要用来说明软件内部的设计 (把软件当作一个透明的箱子)

有同学说, 我们崇尚动手, code & fix 就是我们的座右铭,  写那么多文字作甚?  上次来了个需求, 我一看图纸, 很简单, 不就是做个烟囱么?  干!

image

做到一半, 用户来了把我打了一顿!

我冤枉啊

图纸拿倒了, 原来是要挖一口井!

image

后来我只好强力 "重构", 把烟囱强力插入地里去, 累坏了…

笑话讲完了,我们继续讲 functional spec: 从用户的角度描述软件产品的功能, 输入,输出,界面, 功能的边界问题,  功能的效率问题(对用户而言), 国际化, 本地化异常情况, 等; 不涉及软件内部的实现细节

谁来写spec?  项目的PM, 或者其他人员

谁来实现spec? 开发人员, UX/UI 设计人员

谁来验证spec? 质量保障人员 (QA)

怎么写好spec?  其实就是一件事情描述清楚,  下面是一个练习:

如果你要给一个外星人描述怎么系鞋带, 写一个 “系鞋带“ 的spec (用英语), 你怎么写?

第一, 我们要定义好相关的概念

—what is “shoe”, “shoe laces”, “tied shoe laces”, and “untied shoe laces”  鞋, 鞋带, 系鞋带, 解鞋带都是什么概念

—Benefit of this feature “tie your shoe laces”。 系好鞋带的好处是什么

—The goal of the feature?                                    系鞋带的目标是什么?

—What does “success” look like?                       什么叫系好了?

—Unambiguous steps to achieve from “untied” to “tied”   明确的步骤来演示系鞋带的过程

这是两个同学写的系鞋带的spec: 例子1, 例子2。

第二, 规范好一些假设 (assumptions), 例如, 鞋带是已经穿好在鞋上的么? 什么样的鞋属于我们要处理的? 

 

imageimage

 

第三, 避免一些误解, 下面这个从技术上也是 ”鞋带绑紧了“,  但它是 “系好了”么? 打了死结算成功么? 要打多少个蝴蝶结才算好?

image

第四, 厘清一些边界条件,  下面的情况属于好的系鞋带状态呢,  还是不好的状态呢? 这需要PM/Dev/Test 协商达成一致意见。鞋带要打多紧才算好? 打好的鞋带能拖在地上么?

imageimageimage imageimageimageimageimage

 

第五, 描述主流的用户/软件交互步骤。

image

第六, 一些好的功能还有副作用,  我们要把这些副作用明明白白地写出来。

例如: 美国很多地区用节能灯(LED) 代替了原来的白炽灯,  但是LED 灯泡发热少,  下雪天不能融化灯面的积雪, 导致交通问题。当初的spec 要把这一副作用 (危险) 给写出来。

 imageimage

 

有人说, 我们敏捷的团队,就喜欢直接的面对面的交流,不喜欢搞文档什么的,多好!

其实大多数情况下,留下文字的文档是很有好处的,相对于后来的浪费,当初花的时间真的是太值了。 看下面的例子:

自习课时,教务主任走进来,告诉班长“帮我找两个人,我要班花”,  同时两手在胸前做了一个抱花的动作,  就走了.  班长就组织全班投票评选起班花来,闹了一节课,搞了一些大数据, 终于统一了意见,选出了班里最PL的两mm。于是两mm很羞涩的去找主任,主任说:“怎么是你们? 男生都哪去了?  好吧,  跟我去后勤,我要搬花。。。”

当面, 直接的交流当然很敏捷, 但是还是要留下文档, 以明确用户的需求。

 

在大规模软件的开发中, 我们一定要说清楚服务质量是什么等级, 意味着什么,不然就会人云亦云,以谬传缪。例如: 三峡大坝到底能防多大的洪水?

我们看一看从 2003 年到 2010 年 大家的理解:

image

人民群众看不见具体的spec, 只能道听途说,专家有细致的解释:  http://news.163.com/10/0722/01/6C5MUM6R00014AED.html 

image

写好的 spec 的秘诀不多, 只有下面三条:

实践, 实践, 再实践

 

spec 的最大敌人是什么? 乏味。软件公司的大部分人都不喜欢读文档,更不要说大学生了。 强迫大学生写乏味和没有人读的文档,简直就是扼杀同学们对软件工程的兴趣。 怎么把spec 写让人读了不困?

  1. 用活生生的人物和故事描述用户怎样用软件的  (参见上文 典型用户 )
  2. KISS - 保持简单, 直接的描述。涉及UI 的部分可以直接上图。 也可以画表格,不要写长篇累牍的文字。
  3. 如果是技术文档,最好把示例代码写上,单元测试也写好,让程序保证spec 的正确性,也让读者可以验证 spec 的正确性。
  4. 把边界条件规定清楚,理工科思维的工程师们看到这里大脑就兴奋起来了 - 他们想找出你 spec 的破绽! 

spec 的另一个敌人是时间。 几乎在spec 写好的那一瞬间,spec 就开始过时了。 容颜易老,spec 尤甚,怎么办?

  1. 记录版本修订的时间和负责人 - 这样出了问题好去找人。
  2. 在spec 中要说明如何验证关于功能的描述,从spec 的描述中就能知道单元测试怎么写, 最好把测试用例也链接上。
  3. 把spec 和测试用例,项目任务等放一起 (例如 TFS 上面),相互链接。
  4. 变化一定会发生的,与其在 spec 中有意忽略这一点,不如主动挑明哪些部分是容易发生变化的,提前做好预案。 哪些部分如果改变,会有何种连锁反应。
  5. 在做任何改动的时候,一定事先参考spec,事后更新spec,  团队领导人不应该在没有spec 的情况下做拍脑袋的决定

 

有spec  的模板么? 很多同学问,似乎很多同学有这样的希望,一旦搞到某文档的模板, 某课程的PPT,事情就成功了一大半。 盲目地套用最最给力的模板,对项目有大的副作用。 各位PM 要注意。 把上面正反的例子综合起来,就是一个模板:

    1. spec 的目标是什么,spec 的目标不包括什么
    2. spec 的用户和典型场景是什么
    3. spec 用到哪些术语,他们的定义是什么
    4. 用户如何使用软件的功能的
    5. 各种边界条件是什么,软件功能应该怎么样变化
      1. 这些边界条件多了去了,用户数量的变化,输入内容的上限下限, 不同国家/地区/文化/语言/硬件/软件版本/环境参数….
    6. 功能有什么副作用,对于其它功能有什么显性或隐形的依赖关系?
    7. 什么叫“好”,  什么叫这个功能测试完了,可以交付了?

 

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

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

相关文章

现代软件工程 2012 北航 项目复审模板

这是现代软件工程课在北航的项目复审要求。 这次我们有下列 10 个团队, 他们做了一些有意思的项目: 有七个小组合作,携手打造一个叫 学霸 的网站: 100Years 网页收集和归类工具76er 网页收集和归类工具FightingSnail 网页元数据抽…

现代软件工程讲义 8 软件的血型

[这是 现代软件工程讲义 的一篇] 一个软件团队经历了计划/设计/开发等阶段, 达成代码完成 (Code Complete) 这一目标,似乎后面的事情就水到渠成了. 其实不然, 软件生命周期的最后阶段往往是最考验团队的,不但考验团队项目管理水平,应变能力…

现代软件工程讲义 6 用户调研

[现代软件工程讲义 的一部分] 软件开发的过程, 就是 “用户最需要的东西” 在下面这一链条中传送,转换,实现,扭曲或丢失的过程。 用户最需要的 > 用户表达出来的 > 软件团队能理解的 (老板/PM) 团队的商业目标 > 软件团队成员具…

软件工程讲义 0 微博上的软件工程

[现代软件工程讲义] 有舌尖上的美味, 也有微博上的软工。舌尖上的美味各有千秋, 而微博上对软工的抱怨都是相似的。 下面是我在新浪微博收集到大学生对软件工程教学的反馈: 师生关系(不限于软件工程) 教材 上课 & 老师 实践 & 作业 考试 考完…

现代程序设计 作业 2

我们上节课讲了 返回整数数组中最大子数组的和 这个问题。 我们第二次作业在这个基础上扩展。 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数, 见 MSDN 的定义. 当然, 行…

现代程序设计 作业 3

这个作业是采取结对编程的方式完成。 在上一个作业中, 我们尝试了各种命令行的处理,以及各种数组的处理。 现在, 我们要把 现代程序设计 作业 2 的各个结果转换成图形界面显示。这个问题看起来很难, 实际上大部分难的工作都在上一个作业完成了 (数组计…

现代程序设计 作业4

英语国家的小孩们经常玩 Word Search 的游戏, 就是在一个填满字母的矩阵中把单词找出来。 这是一个简单的例子: (来自 wikipedia) 这是一个比较复杂的例子: 这是答案: 美国的商店里还有不少 word search books 卖, 两三块钱一本。 让我们把这个有趣的…

现代程序设计 作业6 - 简单而有意义的题目

这是这个课件的一部分: 现代程序设计 (课程设计中, 征求意见稿) 好多同学们都说题目难,这回我们来一个简单而很有意义的。 :) 写代码爽还是读代码爽? 往一堆乱麻中再加上一些线索,似乎比较容易;然而从…

现代程序设计 作业7 - 更加简单的题目

在网上,当用户发现一个新东西 (海洋里捞出来的新物种,奇怪颜色的飞鸟,某种新的植物等), 大家会问下面的问题: 能吃么 好吃么 怎么吃 这三个振聋发聩的问题被吃货们简称为能好怎, 大家可以打开链接看看&…

现代软件工程 第三章 【软件工程师的成长】练习与讨论

1. 选哪一种医生? 作为一个软件工程师, 你觉得自己表现如何? 有没有这样的体会: 看书的时候觉得“技止此耳”,开发项目的时候才觉得实际情况和书上讲的都有一些出入,一些重要的细节书上没有提。我们很多人是边看Asp.net的书, 边开发Asp.ne…

现代软件工程 课件 软件工程师能力自我评价表

这是《构建之法》和软件工程教学的一部分,用于学生/工程师自我评价。 软件工程师如何评价自己的能力? 有人写Java,有人用C,还有人用1980年代就出现的 Object-C, 有人写前端,有人写后端,有人偏于行业应用&a…

现代软件工程 第四章 【结对编程】练习与讨论

4.7.0 结对编程的练习题 地铁导航和遍历 4.7.1 结对项目的案例和论文 在现代软件工程教学的过程中,同学们已经总结了不少切身体会。例如: 总结1[i]:那是project到了比较关键的创造阶段,整整一天,我们俩椅子靠椅子的坐在电脑前&am…

现代软件工程 第八章 【需求分析】练习与讨论

1 扩展阅读下面两篇文章也说明了软件估计的难度: Steve McConnell 软件估计的 10 种罪:http://www.ewh.ieee.org/r5/central_texas/austin_cs/presentations/2004.08.26.pdf Quora精选: 为什么软件开发周期总是预估的2~3倍http://jandan.net/201…

现代软件工程 第九章 【项目经理】练习与讨论

9.5.1 PM们的故事 讲了这么多条条框框,我们还是来讲几个故事吧。 A)是不是所有的好功能都是由PM主导,一步一步根据用户需求,按照用户场景设计,然后进行可用性测试等等步骤之后得来的呢? 功能本天成,妙手偶…

现代软件工程 第十章 【典型用户和场景】 练习与讨论

1. 讨论:下面的老板犯了什么错误? 只看用户的表面语言或行动还是不够的。我们还要找到用户语言行动背后的动机! (图像来源: http://www.weibo.com/funnyshoelace) 2. 是否要文档 有人说,我们敏捷的团队,就喜欢直接的面对面的交流&#xff0…

现代软件工程 第十七章 【人、绩效和职业道德】 练习与讨论

0. 为啥要讲人、绩效、和职业道德? 学好专业不就行了么,为啥要扯这么多? 用专业知识教育人是不够的。通过专业教育,他可以成为一种有用的机器,但是不能成为一个和谐发展的人。要使学生对价值有所理解并且产生热烈的感情…

现代软件工程 第十六章 【IT 行业的创新】练习与讨论

16.6.0 Xerox Parc 的成功创新和推向市场的失败 http://research.microsoft.com/en-us/um/people/blampson/Slides/AltoAtPARCIn1970s_files/frame.htm http://research.microsoft.com/en-us/um/people/blampson/38-AltoSoftware/WebPage.html http://research.microsoft.com/…

《梦断代码》读后感 - 驱动,责任,交流,远虑

这三篇读后感原来发布在我自己申请的域名 yishan.cc 上面,后来这个域名被墙了。 (原文写于2008年12月) 几个星期前,我给《现代软件工程》课的每一个团队都发了一本 《Dreaming In Code》的中文版 《梦断代码》,要求写读后感。这本书讲了这样的…

现代软件工程讲义 7 分析和设计方法

(这一节在第一版的 《构建之法》中没有, 是《构建之法》电子书(多看版), 和纸版书第二版中新增加的内容,纸版书第二版预计2015年6月出版) 11.1 分析和设计方法 我们写软件就是要解决用户的需求,我们需要表达和传递下面这些…

现代软件工程讲义 源代码管理

【现代软件工程课件】 源代码管理 -- 以实践促进学习 移山软件学院的学生果冻问老师: 为啥需要源代码管理? 我自己写代码多爽,别人要,就用QQ 传过去好了。 老师问:原始人怎么建房子? 果冻:或者找一个洞&…