【北京大学 软件工程】一、软件工程概论

简介: 本文介绍了软件的定义、特点及分类,探讨了软件工程的起源、概念及其框架,并展望了软件工程的新视野。软件是指计算机系统中的程序及其文档,具有无形性、复杂性和高开发成本等特点,分为系统软件、支撑软件和应用软件三类。软件工程起源于解决早期编程难题,历经个人程序、软件作坊到软件工程时期的发展,旨在以工程化方法解决软件危机。软件工程的核心目标是生产正确、可用且开销合理的软件,主要活动包括需求分析、设计、实现、确认和支持。新一代信息技术如量子计算、区块链等正推动软件工程向更高效、安全的方向发展。

一、软件的定义及特点

1、软件的定义

计算机系统中的程序及其文档程序是计算任务的处理对象和处理规则的描述:文档是为了便于了解程序所需的阐明性资料。                                                                          -  张效祥主编:计算机科学技术百科全书(第2版)

2、软件的特点

  • 软件是无形的、不可见的逻辑实体
  • 它的正确与否,一直到程序在机器上运行才能知道
  • 这就给设计、生产和管理带来许多困难
  • 软件是设计开发的,而不是生产制造的
  • 软件在使用过程中没有磨损、老化的问题
  • 软件是定制开发的
  • 虽然整个工业向着基于构件的构造模式发展
  • 然而大多数软件仍是根据实际的顾客需求定制的
  • 软件是复杂的:
  • 软件涉及人类社会的各行各业
  • 软件开发常常涉及其他领域的专业知识,这对软件工程师提出了很高的要求
  • 软件的开发成本高
  • 软件易于复制
  • 软件质量要求较高
  • 软件的开发与运行都离不开相关的计算机系统环境
  • 软件开发工作牵涉到很多社会因素
  • 如机构设置、体制和管理方式,以及人们的观念和心理

不同于一般工程项目的是,在软件项目开发过程中,实际开发(编写代码)的成本只是整个工程成本的一小部分,甚至可以说是“冰山一角”。而软件测试、系统维护等任务将占据工程的很大一部分成本。

3、软件的种类

按照软件的功能划分,软件一般可以分为系统软件支撑软件应用软件三类:

  1. 系统软件
  • 居于计算机系统中最靠近硬件的一层。
  • 其他软件一般都通过系统软件发挥作用。它与具体的应用领域无关,如编译程序和操作系统等。
  • 编译程序把程序人员用高级语言书写的程序翻译成与之等价的、可执行的低级语言程序。
  • 操作系统则负责管理系统的各种资源、控制程序的执行。
  1. 支撑软件
  • 支撑软件的开发维护运行的软件。
  • 70年代后期发展起来的软件开发环境以及后来的中间件则可被看成现代支撑软件的代表。
  • 软件开发环境主要包括环境数据库、各种接口软件工具组。三者形成整体,协同支撑软件的开发与维护。
  • 中间件是一种软件,它处于系统软件(操作系统和网络软件)与应用软件之间,它能使远距离相隔的应用软件可协同工作(互操作)。
  1. 应用软件
  • 特定应用领域专用的软件。
  • 例如人口普查用的软件就是一种应用软件。

二、软件工程的起源和概念

1、软件工程的起源

早期计算机程序

  • 在1946年计算机刚诞生时,人们采用机器码编制程序,根本没有独立的软件的概念。
  • 机器码指令只是为了驱动计算机硬件工作,就象人们调节电视机、录像机、洗衣机等家用电器的按钮一样。
  • 1947年,冯·诺依曼VonNeumann首先提出用流程图描述计算机的运行过程,才使人们认识到程序设计是完全不同于硬件研制的另一项工作。从此以后,软件的开发和研究才逐渐开始独立地进行。

现在人们认为

  • 在信息产业中,微电子是基础,计算机和网络是载体,软件是核心

2、软件开发的三个阶段

软件开发方法大致经历了以下几个时期,反映出人们对软件和软件开发规律认识的不断深入:

(1)个人程序时期(1947年-1950年代末)

  • 这一时期的特点是硬件价格非常昂贵,软件完全作为硬件的附属。
  • 硬件致力于执行功能单一的程序
  • 早期的应用大多集中在科学计算方面
  • 软件是为了某个具体的应用和特定的硬件而定制的
  • 程序设计完全凭程序员的经验和技艺以个人或小组方式进行。

在这个时期,程序员使用的开发语言主要是机器语言汇编语言,负责从程序的开发、运行和维护的全过程,这是一种私人化的软件环境

(2)软件作坊时期(1960年代初-1960年代末)

  • 随着以计算机为基础的系统应用范围的不断扩大,以及系统数量的不断增长,个体生产方式已经不能适应社会发展的需求,而是需要多人分工合作,共同完成一个程序的编制,需要对项目开发进行管理,即所谓“作坊式生产方式”。
  • 这一时期,出现了若干高级程序设计语言,如FORTRAN,COBOL等;
  • 1964年,IBM宣布了划时代的System/360系列机,不同机型具有相同或相似的指令集合、操作系统,彼此兼容,同一程序可以在不同的机器上运行。
  • 同年,DEC也发布了PDP-8系列机。
  • 这是一个创新性的举措,可以有效地保护客户的投资;同时,也意味着软件不必附属于特定的硬件,可以作为独立的产品存在。

(3)软件工程时期(1970年代初至今)

  • 随着计算机应用领域的进一步扩大,软件的规模和复杂性也在不断增加
  • 在软件开发领域的地平线上出现了一朵乌云:
  • 软件质量差,可靠性难以保证;
  • 成本难以控制,很少有在预算内完成的;
  • 开发进度难以把握,周期拖得很长
  • 可维护性较差,维护人员和费用不断增加。
  • IBM 360系列机的操作系统OS/360,耗资几千万美元,投入了五千多人年,拖延了几年才交付使用,交付使用后仍不断发现新的错误。
  • 这就是所谓的“软件危机”。

3、软件工程的定义

软件工程概念的提出

其目的是倡导以工程的原理、原则和方法进行软件开发,以解决软件危机。

三、软件开发的本质和基本手段

1、软件开发的含义

软件开发的本质是什么?

软件开发的基本手段是什么?

软件开发本质:

不同抽象层术语之间的“映射”

不同抽象层处理逻辑之间的“映射”

问题空间与解空间的映射

2、实现映射的基本手段——建模

何谓建立问题的模型:运用所掌握的知识,通过抽象,给出该问题的一个结构。

何谓模型Model:

模型是在特定意图下所确定的角度抽象层次上对物理系统的描述,通常包含对该系统边界的描述,给出系统内各模型元素以及它们之间的语义关系。

软件系统或项的模型分类

四、软件工程框架

软件工程可定义为三元组:<目标,原则,活动>

(1) 给出了软件所涉及软件工程的工程要素

(2) 给出了各要素之间的关系

(3) 给出了软件工程学科所研究的主要内容

1、软件工程的目标

目标:生产具有正确性、可用性以及开销合宜的产品。

  • 正确性:意指软件产品达到预期功能的程度
  • 可用性:意指软件基本结构、实现及文档为用户可用的程度。
  • 开销合宜:指软件开发、运行的整个开销满足用户要求的程度

2、软件工程的活动

活动:生产一个最终满足需求且达到工程目标的软件产品所需要的步骤。

  • 主要包括需求、设计、实现、确认和支持等活动。
  1. 需求:

定义问题,即建立系统模型

主要任务包括:

  • 需求获取
  • 需求定义(即定义问题)系统功能的一个正确的陈述
  • 需求规约:系统需求规格说明
  • 主要成分:系统模型,系统功能的一个精确、系统的描述
  • 需求验证:验证需求陈述和需求规约之间的一致性、完整性和可跟踪性。
  1. 设计:

在需求分析的基础上,给出系统的软件设计方案

设计包括总体设计 (也称为概要设计) 和详细设计

总体设计建立整个软件体系结构

  • 包括子系统、模块 (或构件) 以及相关层次的说明、每一模块 (或构件) 的接口定义。
  • 体系结构类型可分为:
  • 层次模块体系结构
  • C/S体系结构
  • 以数据库为中心的体系结构
  • 管道结构和面向对象的结构

详细设计针对总体设计结果,给出体系结构中每一模块或构件的详细描述

  • 即给出它们的数据结构说明和实现算法
  1. 实现:

把设计结果转换为可执行的程序代码。

具体做法可分为两种:

  • 选择可用的模块或构件;
  • 或以一种选定的语言,对每一模块或构件进行编码。
  1. 确认:

确认活动贯穿于整个开发过程。

实现完成后的确认,保证最终产品满足用户的需求。

确认活动主要包括:

  • 需求复审、设计复审以及程序测试。主要任务是:软件测试。
  1. 支持活动:

支持活动包括修改和完善。

它为系统的运行提供完善性维护、纠错性维护和适应性维护。

3、软件工程的原则

选取适宜的开发模型

必须认识需求定义的易变性

  • 采用适宜的开发模型予以控制,以保证软件产品满足用户的需求

使用合适的设计方法

  • 在软件设计中,通常要考虑软件的模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。
  • 合适的设计方法有助于这些特征的实现。

提供高质量的工程支持

在软件工程中,软件工具和环境对软件过程的支持非常重要。

软件工程项目的质量与开销直接取决于对软件工程所提供的支撑质量和效用。

重视开发过程的管理

软件工程的管理,直接影响可用资源的有效利用,生产满足目标的软件产品,提高软件组织的生产能力等问题。

4、软件工程框架的作用

软件工程可定义为三元组:<目标,原则,活动>

(1) 给出了软件所涉及软件工程的工程要素

(2) 给出了各要素之间的关系

  • 每一活动根据特定的软件工程目标,采用合适的开发模型、设计方法、支持过程以及过程管理。

(3) 给出了软件工程学科所研究的主要内容

  • 软件开发模型
  • 软件开发模型是软件开发全部过程、活动和任务的框架软件开发方法
  • 软件开发方法
  • 为建造软件提供技术上的解决方法(“如何做”)方法覆盖面很广,包括沟通、需求分析、设计建摸、编程、测试和支持等。
  • 软件过程
  • 为建造高质量的软件所需完成任务的框架。
  • 软件工具
  • 软件开发环境
  • 计算机辅助软件工程(CASE)
  • 软件经济学

五、软件工程新视野

1、重新定义软件

重新定义软件:软件是客观世界中问题空间与解空间的具体描述

  • 软件工程就是解决如何正确、高质、高效地写出软件
  • 经典软件工程是在经典信息技术体系中,给定底层硬件与运行环境,给定应用需求,指导(软件过程与管理)和辅助(开发工具与环境)并发团队10人以上)正确、高质、高效(风险和成本控制)地写出软件
  • 新一代信息技术底层环境复杂多变,应用需求难以给定,99%的开发团队低于10人,经典软件工程更不够用
  • 软件定义一切(software defined everything)成为软件工程新思路

2、新一代信息技术

2030年以后:量子通信与量子计算、生物计算与碳基计算、类脑与仿脑计算、复杂系统计算……

3、区块链

区块链技术的定义:集体协作共同维护的可靠数据库方案

区块链技术(BlockChain)是区块链是一个分布式账本,一种通过去中心化形式实现所有参与主体共同维护同一可靠数据库的技术方案。

该技术方案主要让区块(Block)通过密码学方法相关联起来,每个数据块包含了一定时间内的系统全部数据信息,并且生成数字签名以验证信息的有效性并链接到下一个数据块形成一条主链(Chain )。

【金融】

区块链项目在金融领域的探索主要集中在支付、房地产金融、企业金融、保险、资产管理、票据金融等领域。在国内,不仅是新兴区块链创业企业,如中国银联、招商、民生等银行和蚂蚁区块链、众安科技在内的科技巨头已经开

始布局并落地了相应的平台与项目。利用区块链的去中心化、不可篡改的特性对于金融各个环节的风险有了更好的把控,从而降低了金融流程中的成本。

【娱乐】

区块链应用较为早期的2C类业务主要衍生在娱乐社交领域。在音乐创作中区块链可以帮助创作者规避抄袭的争议。基于区块链做的虚拟偶像、游戏、直播等项目让虚拟财产交易和保护更加透明。游戏行业是非常火热的一个应用概念,因为游戏账号和游戏装备是最常见的一种虚拟资产,最容易与区块链和虚拟货币相结合。

【物联网】

曾有机构预言供应链和物联网将是区块链迅猛发展的下一片沃土。这得益于区块链带来的交易共享性和不可篡改性,这提高了供应链在物流、资金流、信息流等实体协作沟通效率,改善了多方协作时的争议。

【医疗】

针对医疗的数据安全和患者隐私保护,区块链的匿名和去中心化的特性得到了很好的应用。这让医联体之间进行远程数据共享、分布式保障与存储管理更加安全。

【能源】

在能源领域最为广泛应用的是智能电网。针对每一度电用区块链可以从来源到使用建立完备的数字档案,为电站提供数据支持和资产评估依据。区块链还可以释放分布式资源的多余电力,如回购民用屋顶太阳能产生的冗余资源。【公益】

在公益事业中,应用最多的还是区块链的溯源能力,追溯善款的去向,让捐赠者安心。

【农业】

也是利用区块链的溯源能力,追溯农产品的来源,让食用者放心。

【法律】

区块链的分布式存证让在法律层面主要体现在版权保护、证据保全和电子智能合同三个方面。对于版权保护,区块链让版权交易标准化成为可能;而对于电子证据来说,区块链实现了保真和验真。

相关文章
|
18小时前
|
算法 数据挖掘
【北京大学 软件工程】五、结构化设计方法-1
结构化设计是软件开发中的重要环节,旨在根据需求规约构建系统的软件模型。其主要目标是在抽象层面上建立系统架构(包括数据和程序结构),并详细描述处理算法,最终形成设计规格说明书。结构化设计分为总体设计和详细设计两部分:总体设计确定系统的模块结构及模块间的调用关系;详细设计则深入描述各模块的具体实现。 设计方法需提供体现原理的术语、表达软件模型的工具及过程指导。总体设计引入了“模块”与“调用”两个核心概念,并使用模块结构图(MSD)来表达静态结构。设计步骤包括将DFD(数据流图)转化为MSD,区分变换型和事务型数据流图,通过自顶向下的方式逐步细化模块,确保高内聚低耦合。
【北京大学 软件工程】五、结构化设计方法-1
|
18小时前
|
测试技术 开发者
【北京大学 软件工程】二、软件过程
本文介绍了软件生存周期过程的概念及其分类。软件生存周期是从概念形成到产品淘汰的全周期,涵盖开发、交付、维护等阶段。软件生存周期过程则是这些活动中的一系列相关流程。文中详细描述了基本过程(如获取、供应、开发、运行和维护)、支持过程(如文档、配置管理、质量保证)及组织过程(如管理、基础设施、改进)。此外,还介绍了常见的软件生存周期模型,包括瀑布模型、增量模型、演化模型和喷泉模型,分析了它们的特点和优缺点。
【北京大学 软件工程】二、软件过程
|
18小时前
|
存储 测试技术 项目管理
【北京大学 软件工程】三、软件需求
本文介绍了软件需求工程的基础概念和流程。首先定义了需求及其获取,强调需求是描述系统功能、性能等方面的要求,并需具备必要性、无歧义性、可测性、可跟踪性和可测量性五大基本性质。接着阐述了需求的分类,包括功能、性能、外部接口、设计约束和质量属性五类,并详细说明了各类需求的具体内容及示例。此外,还探讨了需求发现的技术,并分析了每种技术的应用场景与优缺点。最后,文章解释了需求规约(SRS)的概念、格式和作用,指出它是软件开发组织与用户之间的技术合同,用于指导项目管理、产品设计、测试计划和用户手册的编写。需求规约不应包含设计细节或项目规划信息,而是专注于明确系统的功能性与非功能性要求。
【北京大学 软件工程】三、软件需求
|
18小时前
|
存储 自然语言处理 算法
【北京大学 软件工程】四、结构化分析方法
结构化分析方法是一种系统化的软件开发方法学,旨在通过使用问题域术语建立系统的功能模型,以明确“系统必须做什么”。该方法包括结构化分析、设计和程序设计三个主要部分。其核心工具是数据流图(DFD),用于表达系统功能模型,并结合数据字典定义数据流和数据存储。此外,还使用加工小说明(如判定表或判定树)描述加工逻辑。 结构化分析过程遵循自顶向下、逐步求精的原则,首先建立系统环境图确定边界,然后通过分解加工、分派数据流和引入文件来细化模型。整个过程中需确保模型平衡和信息组织的复杂性控制。最终输出为需求规格说明书(SRS),确保需求的正确性、无二义性、完整性和可验证性等特性。
|
算法 测试技术 应用服务中间件
软件工程导论
软件工程导论
276 1
软件工程导论
|
机器学习/深度学习 小程序 测试技术
|
安全 算法 测试技术
|
存储 NoSQL 数据库
软件工程导论—可行性研究(上)
软件工程导论—可行性研究(上)
软件工程导论—可行性研究(上)
|
机器学习/深度学习 存储 传感器
软件工程导论—可行性研究(下)
软件工程导论—可行性研究(下)
软件工程导论—可行性研究(下)
|
算法 IDE 测试技术
软件工程导论—软件与软件工程(下)
软件工程导论—软件与软件工程(下)
软件工程导论—软件与软件工程(下)