【任务描述】
软件工程是为了帮助解决软件开发和生产中出现的各种问题,那么软件开发的过程是怎样的?其中有哪些关键事项和要素?
【知识储备】
一、软件生命周期
软件生命周期由软件定义、软件开发和软件使用与维护3个时期组成,每个时期又进一步划分成若干个阶段。
软件定义时期 分成3个阶段,即问题定义、可行性研究和需求分析。软件定义时期的任务是:确定软件开发工程必须完成的目标;确定工程的可行性;确定实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项工程需要的资源和成本,并且制定工程进度表。这个时期的工作通常又称为系统分析,由系统分析员或担负相关职责的人员完成。
软件开发时期 由4个阶段组成:总体设计、详细设计、编码和软件测试。其中前两个阶段又称为系统设计,后两个阶段又称为系统实现。
软件使用与维护时期 由3个阶段组成:软件发布、软件维护与软件退役。
下面简要介绍软件生命周期每个阶段的基本任务。
(1)问题定义
问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”如果不知道问题是什么就去解决这个问题,显然最终得出的结果很可能是缺乏针对性的。尽管确切地定义问题的必要性是十分明显的,但是在实践中它却可能是最容易被忽视的一个步骤。
(2)可行性研究
这个阶段要回答的关键问题是:“对于上一个阶段所确定的问题有行得通的解决办法吗?”可行性研究阶段的任务不是具体解决问题,而是研究问题的范围及解决它的必要性,探索这个问题是否值得去解,是否有可行的解决办法。
可行性研究的结果是用户决定是否继续进行这项工程的重要依据,一般说来,只有投资可能取得较大效益的或必须实施的工程项目才会继续进行下去。可行性研究需要确定以后的哪些阶段将需要投入更多的人力和物力。如果通过可行性研究,拒绝或停止了一些不值得投资的工程项目,这也是可行性研究必要性的体现。
(3)需求分析
这个阶段的任务是准确地确定“为了解决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。
通常的情况是,用户了解他们所面对的问题,知道需要做什么,但是常常不能完整准确地表达出他们的要求,更不知道怎样利用计算机来解决他们的问题。软件开发人员知道怎样用软件实现人们的要求,但是对特定用户的具体要求并不完全清楚。用户觉得理所当然的事项或步骤,开发人员根本不知道、不了解;或者反过来,开发人员认为非常重要的问题,用户觉得没有必要……因此,系统分析员在需求分析阶段必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典或简要的算法表示系统的逻辑模型。
在需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的要求。这个阶段的一项重要任务就是,用正式文档准确地记录对目标系统的需求,这份文档通常称为“规格说明书”。
(4)总体设计
这个阶段必须回答的关键问题是:“概括地说,应该怎样实现目标系统?”总体设计又称为概要设计。
首先,应该设计几种可能的方案来实现目标系统。通常至少应该设计出低成本、中等成本和高成本3种方案。软件工程师应使用适当的工具描述每种方案,分析每种方案的优缺点,并在充分权衡各种方案的优缺点的基础上,推荐一个“最佳”方案。此外,还应该制定出实现最佳方案的详细计划。如果用户接受所推荐的方案,则进入下一步。
上述设计工作确定了解决问题的策略及目标系统中应包含的程序,但是,怎样设计需要的程序呢?软件设计的一条基本原理就是,程序应该模块化,也就是说,一个程序应该由若干个规模适中的模块按合理的层次结构组合而成。因此,总体设计的另一项主要任务是,设计程序的体系结构,也就是确定程序由哪些模块组成以及各模块之间的关系。
(5)详细设计
总体设计阶段以比较抽象或概括的方式提出了解决问题的办法。详细设计阶段的任务就是把方案具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?”
这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明书。这种规格说明书的作用类似于建筑工程领域中的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。
详细设计也称为模块设计,在这个阶段将详细地设计每个模块,确定实现模块功能所需要的算法和数据结构。
(6)编码
这个阶段的关键任务是写出正确的、容易理解的、易于维护的程序模块。程序员应该根据目标系统的目标和实际环境,选取一种适当的高级程序设计语言,把详细设计的结果翻译成用选定的语言编写的程序,并且仔细测试这些程序。
(7)软件测试
这个阶段的关键任务是,通过各种类型的测试使软件达到预先的要求。
软件测试阶段分为单元测试、集成测试、确认测试、系统测试和验收测试。 单元测试 是对最小可测试单元进行测试,其目的是检验软件基本组成部分(即单元)的正确性。 集成测试 是将程序模块(或单元)采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。集成测试主要目的是,检查软件单位之间的接口是否正确。 确认测试 是验证被测软件是否满足需求规格说明书列出的需求,目的是验证软件的功能和性能及其他特性是否与用户的要求一致。 系统测试 是将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统规格说明书的地方,这种测试可以发现系统分析和设计中的错误。 验收测试 则是按照需求规格说明书的规定对目标系统进行验收,保证用户对所交付的系统的满意。
(8)软件发布
通过验收测试后,可以进行软件的发布,开发、测试、运营、市场、销售等相关部门要联合发布产品的“说明书”和“产品介绍”,说明本次发布中包含或者新增的功能特性。
(9)软件维护
维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。
通常有4类维护活动: 改正性维护 ,也就是诊断和改正在使用过程中发现的软件错误; 适应性维护 ,即修改软件以适应环境的变化; 完善性维护 ,即根据用户的要求改进或扩充软件使它更完善; 预防性维护 ,为将来的维护活动预先做好准备。每一项维护活动都应该准确地记录下来,作为正式的文档资料加以保存。
(10)软件退役
软件不再适应市场需求,软件退役。
以上根据应该完成的任务的性质,把“软件生命周期”划分成10个阶段。在实际的软件开发工作中,软件规模、种类、开发环境及开发时使用的技术方法等因素,都可能影响阶段的划分。事实上,承担的软件项目不同,应该完成的任务也有差异,没有一个适用于所有软件项目的任务集合。例如,适用于大型复杂项目的任务集合,对于小型简单项目而言往往就过于复杂了。
二、开发模型
软件开发模型是指软件项目从需求定义直至软件经使用后废弃为止,跨越整个生存周期的系统开发、运作和维护所实施的全部过程、活动和任务的结构框架。软件开发模型又称软件生命周期模型。软件生命周期模型规定了把软件生命周期划分成哪些阶段及各个阶段的执行顺序,因此,也称为过程模型。
软件开发模型的几种类型:以软件需求完全确定为基础的瀑布模型;在开发初期仅给出基本需求的渐进式模型,如V模型、原型模型、增量模型等。下面介绍4个常用的模型。
1.瀑布模型
瀑布模型是将软件生命周期的各项活动划分为按固定顺序执行的若干个阶段,其过程形如瀑布流水,如图1.2所示,故此得名。
图1.2 瀑布模型
瀑布模型是最早出现的软件开发模型,在软件工程中占有重要的地位,它提供了软件开发的基本框架。其执行过程是,将上一阶段活动的结果作为下一阶段活动的输入,完成相应的工作后再作为输出,传递给下一阶段。同时,在本阶段中,要评价上一个阶段完成的活动,若得到确认,则进行本阶段的活动;否则返回上一阶段,甚至返回至更早的阶段。
瀑布模型的优点是,简单、直接、方便,为软件开发和维护提供了一种有效的管理模式,对保证软件质量可以起到重要作用。当然,瀑布模型也有缺点,瀑布模型缺乏灵活性,对开发过程中很难发现的错误,只有在最终产品运行时才能暴露出来,从而加大了软件产品的修改与维护难度。
2.V模型
V模型也是广为人知的测试模型,如图1.3所示。典型的V模型会在其开始部分对软件开发过程进行描述,其开发和测试采用分级的层次式结构,它非常明确地定义了测试的不同级别,清晰地展示了软件开发与测试之间的关系。
V模型优点是,既有底层测试又有高层测试,将开发阶段清楚地表现出来,便于控制开发的过程。V模型缺点是,仅仅把测试过程作为在需求分析、系统设计及编码之后的一个阶段,忽视了测试对需求分析、系统设计的验证,如果开发有问题,可能要等到后期的测试时才被发现。
图1.3 V模型
3.原型模型
原型是快速实现和运行的早期版本(或说简版),它能反映最终系统部分重要特性,如图1.4所示。
图1.4 原型模型
原型模型的优点是,可以减少设计中的错误和开发中的风险,减少了对用户培训的时间,提高了系统的实用、正确性以及用户的满意程度;缩短了开发周期,加快了工程进度;可以降低成本。原型模型的缺点是,开发者为了使一个原型快速运行起来,往往在实现过程中采用这种手段——不能将原型系统作为最终产品,即原型与最终版本相差较大。
4.增量模型
增量模型融合了瀑布模型的基本成分和原型模型实现的迭代特征,但与原型实现不一样的是,其强调每一个增量均发布一个可操作产品,如图1.5所示。早期的增量是最终产品的“可拆卸”版本,但提供了为用户服务的功能,并且为用户提供了评估的平台。
图1.5 增量模型
增量模型的优点是,人员分配灵活,刚开始不用投入大量人力。如果核心产品很受欢迎,则可增加人力实现下一个增量版本。这样,既可先发布部分功能版本给用户,也能够有计划地管理风险。增量模型的缺点是,这种开发模型对开发人员技术能力要求较高,还要求能从系统整体出发正确划分增量构件,并进行分别开发,最后能很好地集成这些构件。
【案例】
开发模型的选择
假设你是一家软件公司的项目负责人,你的工作是管理该公司已被广泛应用的通用软件产品的新版本开发。由于市场竞争激烈,公司规定了严格的完成期限并已对外公布。你打算选用哪种软件开发模型?为什么?
【解答】:开发的时候选用增量模型。原因:旧版本相当于一个原型,通过收集用户对旧版本的反馈,较容易确定新版本的需求;公司的软件工程师对通用软件产品比较熟悉,具有采用增量模型开发新版软件所需要的技术能力;该软件受到广大用户的喜爱,今后还可能开发更高的版本。
【任务实施】
根据软件生命周期原理,规划图书管理系统
根据软件生命周期的原理,将图书管理系统分为系统规划、需求分析、系统设计、系统实施、系统测试、系统运行与维护6个阶段。
(1)系统规划
系统规划阶段的任务是新系统的使用环境、现行系统的状况等进行调研,根据用户的目标和规划,研究新系统的必要性和可行性。并在这个阶段给出备选方案,进行可行性研究,写出可行性研究报告。待可行性研究报告评审通过后,编制“系统计划书”。
(2)需求分析
当“系统计划书”完成之后,软件项目就进入了软件需求分析阶段。需要从功能、性能、兼容性、安全性等多个方面进行需求分析。
图书管理系统的功能需求主要包括以下3个方面:借阅者能够借阅和归还书籍;图书管理员能够处理借阅者的借阅和还书请求;系统管理员可以对系统的数据进行维护,如增加、删除和更新图书信息,增加、删除和更新借阅者信息等。
性能需求包括系统的功能性、兼容性、安全性和可扩展性方面的需求;当管理员执行增加、删除等操作时,数据库响应时间要求在2秒之内;系统要有可扩展性,当出现新的需求时,能将其纳入系统,而不必改变原有的系统结构;系统必须贴近实际的应用流程,尽量符合用户的操作习惯、方便操作并提高管理效率;还应考虑到不同操作者的计算机水平不同,在系统的设计时要注重易用性,使大多数的用户都可以使用系统。
图书管理系统的兼容性需求包括在不同的操作系统、不同的网络浏览器和不同的分辨率下能正常运行。
图书管理系统的安全性需求,系统必须建立完备的安全机制,保证用户身份的合法性,避免出现越权操作情况。同时,要防止计算机病毒以及黑客的网络攻击,系统必须有备份和防火墙等方面的措施,以提高系统的安全性。
(3)系统设计
系统设计的原则是界面美观友好,信息查询简单、方便,数据存储安全、可靠。图书管理系统在面向对象分析的基础上,根据用户对系统功能和操作使用方面的需求及运行环境等方面进行设计。除此之外,数据库的设计是系统设计的一个关键步骤。
(4)系统实施
系统实施阶段在系统规划的基础上确定整个系统结构中各个组成部分的具体内容,完成应用系统的编码。图书管理系统基于Java及SQL Server数据库进行开发,在具体开发中,依据系统设计阶段的划分情况,完成各模块代码。
(5)系统测试
图书管理系统测试,主要从功能测试、接口测试、用户界面测试、安全性测试等方面进行。
功能测试,使用黑盒测试中的等价类划分、边界值测试、错误推断等方法,测试该图书管理系统是否能实现借书、还书、管理用户等基本功能。
接口测试包括外部接口(用户接口和程序接口)和内部接口测试。例如,用户接口部分测试可视化窗口;程序接口部分测试与JDBC与SQL数据库的连接;内部接口部分测试各个功能模块之间的接口(登录、查询、更新等)。对接口进行测试的目的是,验证接口的功能,及时发现接口的缺陷,保证图书馆管理系统功能的正确性。
用户界面测试,检查显示界面元素的文字是否正确;检测窗口切换、移动、改变大小等功能是否正常;各种界面元素的有效、无效、选中等状态是否正确等。
安全性测试检查系统对非法侵入的防范能力。安全性测试检测图书馆管理系统能否抵御各种的危险,从而保证系统的各项安全。
(6)系统运行与维护
系统投入运行使用后,要重点做好系统的维护。可以从病毒和黑客攻击的防范、数据备份、权限管理与维护、硬件维护等方面进行系统维护。
【任务拓展】
图书管理系统数据库开发
按照数据库设计的方法,考虑到数据库及其应用系统开发的全过程,图书管理系统数据库开发分为6个阶段。
(1)需求分析
需求分析是在完成用户调查工作的基础上,分析调查数据,逐步明确用户对系统的需求,包括数据需求和围绕这些数据的业务处理需求,得到用数据字典描述的数据需求,用数据流图描述的处理需求,形成需求说明书。
(2)概念结构设计
在需求说明书的基础上,对数据库管理系统的需求形成一个独立于具体数据库管理系统的概念模型,用E-R图表示。
(3)逻辑结构设计
将概念结构转换为数据库管理系统所支持的数据模型,并对其进行优化。对于图书管理系统数据库,选择关系型数据库管理系统,即将E-R图转成关系模式。
(4)物理结构设计
为逻辑数据模型选取一个最适合应用环境的物理结构,包括文件类型、索引结构、存储结构、存取方法和存取路径等。
(5)数据库实施
根据逻辑设计和物理设计的结果建立数据库,编制并调试应用程序,将数据导入数据库,并进行试运行。
(6)数据库运行和维护
数据库应用系统经过试运行并测试合格后,即可进入正式运行阶段。在数据库系统运行过程中需要连续地对其进行评价、调整与修改。
【知识链接】
网站开发生命周期
(1)需求分析
目标定位:做这个网站干什么?这个网站的主要职能是什么?网站的用户对象是谁?用户使用网站做些什么?
用户分析:网站用户的主要特点是什么?他们需要什么?如何针对他们的需求特点引导他们?如何为他们做好服务?
市场前景:网站如同一个企业,它需要能养活自己。这是前提,否则任何目标都是虚的。应当明确网站与市场的结合点在哪里?
(2)平台规划
内容策划:这个网站要经营哪些内容?其中分重点、主要内容和辅助性内容,这些内容在网站中具有各自的体现形式。内容划分好以后,可进行文字策划,把每个类别内容包装成栏目。
界面策划:结合网站的主题进行风格策划。如为不同的功能区定义色彩,例如主色调、辅助色调、突出显示色调等,版式设计应包括全局版式、导航栏、核心区、内容区、广告区、细部板块及版权告知区等。
网站功能:主要是管理功能和用户功能。管理功能是我们通常说的后台管理,关键是要使管理更方便、更快捷、更加智能化。而用户功能就是用户可以进行的操作,这涉及交互设计,它是人和网站对话的接口,非常重要。
(3)项目开发
界面设计:根据界面策划的原则,对网站界面进行设计和完善。
程序设计:根据网站功能规划进行数据库设计和代码编写。
系统整合:将程序与界面结合,并进行功能性调试。
(4)测试验收
项目人员测试:请项目经理、监察员及项目开发人员共同参加,根据前期规划对项目进行测试和检验。
非项目人员测试:邀请非项目参与人员作为不同的用户角色对平台进行使用性测试。
公开测试:网站开通,并接受网友的使用测试,设立反馈信息渠道,收集意见和建议信息,针对平台存在的不足进行思考和完善。
(5)运行维护
跟踪网站运行情况,要保证浏览者能够正常的浏览网站,对网站的内容、特定的页面或重要页面进行维护与更新。
【课后阅读】
C/S架构与B/S架构
软件开发的整体架构主要分为C/S(Client/Server)架构与B/S(Browser/Server)架构,C/S架构与B/S架构都可以进行同样的业务处理,甚至也可以用相似的方式实现共同的逻辑。
一、C/S架构
C/S架构是一种典型的两层架构,即客户端/服务器端架构,其客户端包含一个或多个在用户计算机上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket协议与客户端的程序通信。
C/S架构的优点如下:
(1)C/S架构的界面和操作可以很丰富。
(2)安全性可以很容易保证,实现多层认证也不难。
(3)由于只有一层交互,因此响应速度较快。
C/S架构也有一些缺点,具体表现如以下:
(1)适用面窄,通常用于局域网中。
(2)用户群固定。由于程序需要安装才可使用,因此不适合偶尔使用系统的用户。
(3)维护成本高,一旦客户端程序升级,则所有客户端程序都需要同时进行升级。
二、B/S架构
B/S架构是指浏览器/服务器结构。在技术上,它是一种三层架构——Web浏览器、Web服务器端和数据库服务器端。
B/S架构的优点如下:
(1)客户端无须安装特定软件,有Web浏览器即可。
(2)B/S架构可以直接放在广域网或互联网上,通过一定的权限控制实现众多客户端的多并发访问,其交互性和方便性均较强。
(3)系统升级时,无须升级Web浏览器,仅升级Web服务器端或数据库服务器端即可。
B/S架构也有一些缺点,具体表现如下:
(1)在跨浏览器运行时,B/S架构的表现不佳。
(2)在速度和安全性上,需要花费软大的设计成本,这是B/S架构的最大问题。
(3)客户端/服务器端的交互方式是一种“请求—响应”模式,经常需要刷新页面。