课件

5.3 软件项目计划.pdf

软件项目计划

软件项目计划是对软件开发过程中的活动、资源、任务进度等进行规划。按时交付是软件项目的最大挑战,所以合理地安排进度是软件项目计划的关键内容。
image.png
一般来说项目计划需要由团队成员共同讨论制定,明确项目要做什么、如何做、谁去做、什么时候做、成本是多少以及应该达到什么质量等一系列问题。

软件项目计划流程

制定软件项目计划,一般需要经过以下过程:
image.png

  • 首先是开发问题描述,明确系统应该解决的问题,目标环境和交付验收标准;
  • 接下来进行顶层设计,确定系统的总体结构和模块划分;
  • 然后对整个项目进行任务分解,并把任务分配给团队成员;
  • 最后估计可能完成的时间,建立项目的初始计划

开发问题描述

问题描述是由项目团队和客户共同讨论形成的,双方需要对系统所要解决的问题达成共识,说明问题提出的背景,需要开发的功能和性能以及系统运行的目标环境。

下面以微信抢票应用的事例文档为例进行说明。
image.png
image.png
微信作为一种新媒体,已经被大学生普遍使用,通过微信应用可以及时发布各种活动,并且提供便捷的服务,免去排队的烦恼,基于这样的一个背景,项目的开发目标就确定为在微信服务号的基础上开发一个抢票应用,实现活动推送和抢票服务。抢票应用的功能需求主要包括账号绑定,因为是针对校内学生的活动,需要通过绑定账号来确认学生的身份,还有活动创建和信息维护、抢票、选座和检票等。非功能性需求定义了用户并发数和响应时间、要求支持的手机操作系统、以及一些软件设计和代码质量的要求。另外,未来运行的应用服务器要部署在阿里云上,考虑到这个应用只是给校内学生使用,所以开发和运行环境都要采用开源系统,以便节省成本。抢票应用要在年底的新年联欢晚会上使用,所以规定交付时间是2014年12月25日。

对于问题描述中的功能需求,还要进一步说明用户和系统交互的一系列场景,如下图所示:
image.png
这是一个学生抢票的场景,以及若干微信操作的界面原型。

定义顶层设计

在需求分析的基础上,我们要给出系统的顶层设计,它定义了软件系统的体系结构,把整个系统划分成若干独立的子系统。
image.png

  • 第一步,是要明确设计目标,这时要考虑一下性能、可扩展性这样一些设计质量;
  • 第二步,做初始的子系统分解,需要比较不同的设计方案,以及可以采用的标准的体系结构风格;
  • 第三步,初始分解也许不能满足所有设计目标,需要进一步的分解和求精;
  • 最后,最后把分解的不同的子系统分配给不同的团队和开发人员,让他们协商定义子系统之间的接口;

需要强调的是:

  • 子系统分解应该是高层的,专注于功能并且要保持不变;
  • 每一个子系统可以被分配给一个团队或个人,由他负责进行详细设计和实现。

下图是微信抢票应用的顶层设计示意图:
image.png
前端部分,根据用户角色的不同分成用户微信页面和活动管理员页面:

  • 其中用户微信页面负责显示订票者在微信端打开的网页,实现界面的一些亚务逻辑,与 RESTful API 进行通讯。
  • 活动管理员页面也是类似,只是显示的是管理员在 PC 浏览器中打开的网页。
  • 抢票消息处理模块实现与微信服务器的通讯功能,在服务器端处理与抢票相关的业务逻辑。
  • RESTful API 模块是封装的 HTTP API,处理网页前端所涉及业务的数据输入和输出,并将数据读写请求传递给数据存取模块。
  • 数据存取模块封装数据库接口,处理所有数据读写请求并操作数据库,在必要的情况下,对部分数据像一些高频只读数据进行内存缓存。

定义项目工作分解

项目工作分解是将项目整体分解成一些更小的、易于管理和控制的子项目或工作单元。分解项目工作可以有不同的方法,最常用的是基于要做的功能进行分解。

对于前面给出的抢票应用这个例子,假设一个开发团队由 5 个成员组成,我们按照系统功能对项目工作进行分解,然后分配给不同的人员去完成。

账号绑定部分比较独立,单独交给一个人去做比较合适,其余部分虽然在功能上可以分割,但是在开发过程中由于代码和数据库设计上的耦合,比如下图成员B、C的任务都涉及到活动,成员C、D、E又都涉及到票,这样就造成一个人在设计上的修改会影响到其他人,另外熟悉前后端和数据库开发的全栈工程师并不对,对于学生团队更是如此,所以下图的分解可能会是不同人开发的部分在集成时出现困难:
image.png
另一种分解方法,是根据系统的产品结构来定义项目工作,我们把前端的用户微信页面和活动管理员页面分别分配给成员A和B,抢票消息处理模块和 RESTful API 模块分配给成员C,数据存储模块分配给成员D,成员E完成账号绑定模块,并承担更多的功能测试工作,如下图所示:
image.png
这种分解方式可以使开发人员专注于前端、后端和数据库的开发,不同模块之间通过接口进行访问,相对来说耦合性比较低。

建立初始时间表

项目工作分解之后,需要进一步估算活动所需要的时间和资源,并按照一定的顺序把这些活动进行组织和调度,建立项目的进度计划表。

过程如下图:
image.png
首先要识别任务,以及任务之间的依赖关系,由开发人员估算所承担任务的完成时间,最终创建项目的进度表。

需要说明的是,制定进度计划需要在资源、时间和实现功能之间不断平衡,并需要定期更新。