第一章.概论

一. 软件的基本概念

1. 什么是软件

一个例子:简单计算的工具,自己孩子用小程序、全校学生用软件、放在网站上服务

规模越来越大,需求越来越复杂;难度越来越大,所需的时间越来越长;出错的概率也越来越大

1.1 软件的定义

软件(Software):一组对象或项目所形成的一个“配置”,由程序、文档和数据等部分构成。

  • 程序(program):可被计算机硬件理解并执行的一组指令,提供期望的功能和性能
  • 数据(data structure):程序能正常操纵信息的数据结构
  • 文档(document):与程序开发、维护和使用有关的图文材料

程序只是软件的一部分

1.2 软件的四大特征

  • 复杂性(complexity)
    • 要解决的现实问题通常很复杂,数据、状态、逻辑关系的可能组合导致了软件本身的复杂性
    • 软件无法以“制造”的方式被生产,只能采用手工开发方式,智力密集型,与人的水平密切相关
  • 不可见性(invisibility)
    • 尚未完成的软件是看不见的,无法像产品一样充分呈现其结构沟通困难,难以精确刻画度量
  • 易变形(changeability)
    • 软件所应用的环境由人群、法规、硬件设备、应用领域等因素汇集而成,而这些因素皆会频繁快速的变化
  • 一致性(conformity)
    • 各子系统的接口必须协同一致,但难以维持

(精确性与模糊性?)

1.3 软件不断变化

  • 变化以适应新的计算环境或新技术的发展
  • 功能增强以实现新的业务需求
  • 扩展以与其他软件系统进行互操作
  • 重构以延续生命周期
image-20211219162059891

软件不会磨损,但是维护困难

遗留系统(Legacy system):仍在使用中的软件系统,可满足客户需求,但很难以“优雅的”方式对其进行演变以适应新需求或新环境。

1.4 软件的分类

  • 系统软件:操作系统、编译器、数据库/DBMS、集成开发环境(IDE)
  • 应用软件:商业软件(企业/政府)、个人软件、工程和科学计算软件
  • 开发方式:商业软件、开源软件
  • 存在形式:嵌入式/单机/分布式、移动终端、基于Web、服务形态的软件(SaaS)
image-20211219163004301

2. 软件的发展

2.1 软件及其开发方式的发展

  • 第一阶段(1950-1960年代)
    • 主要用于数值计算
    • 认为质量完全依赖程序员个人才能
    • 简单复杂的发展,软件危机
  • 第二阶段(1970年代)
    • 商务领域推广,数据库、结构化编程等技术
    • “软件生命周期” 概念出现,软件不仅是程序,还包括开发、使用、维护等文档
  • 第三阶段(1980年代)
    • 规模复杂度扩大 关注软件开发过程管理及工程性开发
    • CASE工具
    • 关注软件的质量度量和管理
    • 面向对象思想出现
  • 第四阶段(1990年代)
    • Internet和Web 分布式、异构环境下的软件
    • 软件复用
    • 分布式计算、网络技术
  • 第五阶段(2000年代至今)
    • 软件服务化、系统互操作的需求
    • 云计算平台的软件体系结构、模型驱动的开发方法MDA、敏捷软件开发方法、软件集成开发环境及工具
    • 面向服务的体系结构SOA方法
    • 基于互联网与云计算的软件开发方法
    • 普适计算、移动计算

2.2 软件及其开发方式

2.3 软件开发技术的发展过程

  • 1950-1960年代
    • 软件=程序
    • 面向过程的软件=算法+数据结构
  • 1970年代
    • 软件=程序+文档
    • 软件=程序+文档+数据
  • 1980-1990年代
    • 面向对象的软件=对象+消息
  • 1990年代至今
    • 面向构件的软件=构件+框架
    • 面向服务的软件=服务+消息+总线

二. 软件工程的基本概念

1. 软件工程产生的历史根源

NO Sliver Bullet

软件危机

软件神话(《人月神话》)

image-20211219174355287

2. 软件工程的基本概念

  • 软件工程是为了经济地获得能够在实际机器上高效运行的可靠软件而建立和使用的一系列工程化原则
  • 将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即将工程化应用到软件上
  • 应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度实现满足用户要求的软件产品的定义、开发、发布和维护的工程,或以其为研究对象的学科

软件工程重要的不是技术而是如何开发软件项目的思想

软件工程是一种建模活动、解决问题的活动、知识获取的活动、受软件工程原理指导的活动

软件工程的范围

  • 软件开发过程(分析、设计、实现、测试、运行、维护)
  • 软件开发中应遵循的原则和管理技术
  • 软件开发中所采用的技术和工具

软件工程的目标

  • 高质量
  • 按时交付
  • 控制成本(商业行为)
  • 满足用户需求

3. 软件工程的知识体系

3.1 软件开发方法学

结构化开发方法SADT (Structured Analysis and Design Technique)、面向对象开发方法OOAD (Object Oriented Analysis and Design)、基于UML的OOAD

传统软件工程:结构化方法 面向对象方法
程序=数据结构+算法 程序=对象+消息
自顶向下:结构化需求分析 结构化设计(概要设计、详细设计) 面向过程的编码 测试 软件分析与对象抽取 对象详细设计 面向对象的编码 面向对象的测试
image-20211219194749609 image-20211219194758148

3.2 软件工具与软件工程环境

工具:自动或半自动的软件支撑环境,辅助软件开发任务的完成,提高开发效率和软件质量、降低开发成本

  • 项目管理工具、需求管理工具、设计建模工具、编程和测试工具、测试和维护工具
  • 多个工具集成在一起 形成软件工程开发环境CASE(Computer Aided Software Engineering计算机辅助软件工程)

3.3 软件过程

将人员、技术、组织与管理有机的结合在一起,实现在规定的时间和预算内开发高质量软件的目标

3.4 软件工程管理

  • 目的:为了按照进度和预算完成软件开发计划
  • 内容:成本估算、进度安排、人员组织、质量保证

3.5 软件质量特性

  • 软件质量
    • 定义:软件产品与需求相一致的程度,由一系列质量特性来描述
    • 不完全取决于开发人员自身,通常与客户、用户、维护人员等提出的要求密切相关
    • image-20211219215157682
  • Bug
    • Bug的多少可以直接衡量一个软件的开发效率、用户满意度、可靠性、可维护性
    • Bug=软件的行为和用户的期望值不一样

***软件工程知识体系(Software Engineering Body of Knowledge, SWEBOK)

三. 软件工程工具

CASE工具

image-20211219214308116
  • 计算机辅助系统工程工具 - CASE

  • 制图、建模工具:Rational Rose / Microsoft Visio / StarUML

  • 原型制作工具:Balsamiq Mockups / ExtJS / jQuery / EasyUI /墨刀

  • 集成开发环境:Visual Studio.NET / Eclipse

  • 数据库设计工具:PowerDesigner / ERWin

  • 代码生成工具:Rational Rose

  • 项目管理工具:Microsoft Project

image-20211219220220099

SADT/OOP:结构化分析设计技术/面向对象编程

NFP:非功能属性

GUI:图形化用户界面