本文主要内容来自 SpriCoder的博客,更换了更清晰的图片并对原文的疏漏做了补充和修正。
Software 软件
- 信息可以记录、交流和存储
- 信息 \(\to\) 计算 \(\to\) 数字计算机 \(\to\) 软件
数字计算历史
Foundation of Digital Computing - 30s
- 硬件:微分计算器、继电器式计算机、ABC 原型计算、Harvard Mark 1 IBM 实验室
- Theory 理论
- 《论可计算数及其在判定问题上的应用》-Alan Turing
- 电子继电器可以实现布尔符号逻辑 Claude Elwood Shannon
Digital Computers - 40s
- ENIAC:第一台计算机
- Programming the ENIAC
- Programming chart
- 编程的步骤
- 将问题映射到机器上的任务很复杂,通常需要几个星期。
- 程序在纸上完成后,通过操纵开关和电缆将程序“导入”ENIAC 的过程需要额外的几天时间。
- 随后是一段时间的验证和调试,借助于机器的“单步”能力。
- EDVAC:(了解)
- EDVAC(Electronic Discrete Variable Automatic Computer)最早的电子计算机之一。与它的前身 ENIAC 不同,ENIAC 是二进制的,而不是十进制的,它是一台存储程序计算机。
- 埃克特、莫奇利和其他 ENIAC 设计师与约翰·冯·诺依曼一起担任顾问职务;冯·诺依曼在 1945 年 EDVAC 报告初稿中总结和讨论了逻辑设计发展。埃克特、莫奇利和其他 ENIAC 设计师与约翰·冯·诺依曼一起担任顾问职务;冯·诺依曼在 1945 年 EDVAC 报告初稿中总结和讨论了逻辑设计发展。
Software is one part of Hardware -50s
- 商业大型机:Ferranti Mark I、UNIVAC I、LEO I、IBM 701、IBM 650
- 编程语言,1955 FORTRAN,1958 LISP,1959 COBAL
- 命名:John W. Tukey 在 1958 年发表在《美国数学月刊》上的一篇文章中,成为第一个定义运行电子计算器的程序的人。
Software is not Hardware - 60s
- 变革、ASCII 美国信息交换标准码出现、ATM、IBM 信息管理系统 IMS 应用于阿波罗航天器、软件咨询业务、IBM S/360、信用卡、DEC PDP-1 小型机
- 软件的特性:
- 软件与现实世界关系更加密切,对需求的规格化更加困难
- 软件比硬件容易修改的多,并且不需要昂贵的生产线复制产品
- 软件没有损耗
- 软件不可见
Program = Algorithm + Data Structure - 70s ~ 80s
- Algorithms + Data Structures = Programs 是 Niklaus Wirth 在 1976 年写的一本书,涵盖了计算机编程的一些基本主题,特别是算法和数据结构之间的内在联系。
- For example, if one has a sorted list one will use a search algorithm optimal for sorted lists. 例如,如果一个人有一个已排序的列表,他将使用一个对已排序列表最合适的搜索算法。
Software Development is much more complicated than Programming - 90s ~ now
软件工作量随应用程序规模变化的情况
大型软件系统(规模为 100 万 LOC)的成本因素排序
- 软件类别:
- 系统软件:操作系统、数据库、数据仓库、嵌入式设备、安全
- 编程软件:IDE、测试、持续集成、建模、度量
- 应用软件:商业、政府、休闲、医疗、教育、国防、 个人、专业、科学
- 应用软件基于现实又高于现实:
- 应用软件被开发的目的和意图来源于现实世界的问题。
- 应用软件必须基于现实才能解决问题。
- 软件最终要被用于现实并改进现实。
- 如上图,所以我们可以形成进一步的迭代。
什么是软件工程总结
- 软件独立于硬件
- 软件是工具
- 软件 = 程序 + 文档 + 数据 + 知识
- 软件的发展比编码更加复杂
- 应用软件源于现实,但是高于现实(课本 P4)
工程
- 美国工程师专业发展委员会(ECPD,ABET 的前身)将“工程”定义为:创造性地应用科学原理,设计或开发结构、机器、仪器或制造工艺,或单独或组合使用它们的工程;或在充分了解它们的设计的情况下建造或操作它们;或在特定操作条件下预测它们的行为;就预期功能、运行的经济性或生命财产安全而言
- CCSE - About Engineer 关于工程师
- 工程师通过一系列的讨论决策,仔细评估项目的可选活动,并在每个决策点选择一种在当前环境中适合工当前任务的方法进行工作。可以通过对成本和收益进行折衷分析调整相应策略。
- 工程师需要对某些对象进行度量,有时需要定量的工作;他们要校准和确认度量方法,并根据经验和实验数据进行估算。
- 软件工程师强调项目设计过程的纪律性,这是团队高效工作的条件。
- 工程师可胜任研究、开发、设计、生产、测试、构造、操作、管理,以及销售、咨询和培训等多种角色。
- 工程师们需要在某些过程中使用工具,选择和使用合适的工具是工程的关键要素。
- 工程师们通过专业协会发展和确认原理、标准和最佳实践方法,并提高个人能力。
- 工程师们能够重用设计和设计制品。
- 工程师的决策往往进行折中,选择最优解。
工程学科的发展
工程要素
- 问题:动力
- 科学知识:工具
- 解决方法/机器:物体
- 成本效益/条件
软件工程
什么是软件工程?(重要)
- 应用系统的、规范的、可量化的方法来开发、运行和维护软件,即将工程应用到软件。
- 对 1 中各种方法的研究。
软件的工程的特点
- 具有解决实际问题的动机:工程学解决实际问题,而这些问题来源于工程领域之外的人:消费者。
- 应用科学知识指导工程活动:工程学不依赖于个人的技能,而是强调以科学知识为指导,按照特定方法与技术,进行规律性的设计、分析等活动,实现工程活动的可学习性和可重复性。
- 以成本效益比有效为基本条件:工程学不单单只是解决问题,它要有效利用所有资源,至少成本要低于效益,即成本效益比有效。
- 构建机器或事物:工程学强调构建实物工具,例如机器、事物等,并利用实物工具来解决问题。
- 以服务人类为最终目的:工程学考虑的不是单个客户的需要,而是要运用技术和经验实现全社会的进步。
软件工程师面临的问题
- 现实世界是复杂的:如果现实世界的状况与我们的期望不符,这就产生了问题。
- 很广阔的范围:所有人类所涉及的领域、在其他工程领域,问题是有限的
- 大多数是不明确的,需要我们去发现:在其他工程领域,问题是确定和明确的
- 工程思维:客观的,知道你想要什么
科学知识
- 以计算科学为科学基础,基于科学和逻辑作为标准工具
- 很多领域都是被对称的创造出来的,依据方法/方法论/技术,使用语言、工具,进行研究
工程 = 科学 + 原则 + 艺术
- 科学:计算科学知识是软件工程的基础
- 原则:实践知识也应该被广泛的分享
- 艺术:创造力:分析,设计
问题/机器和产品
- 虚拟机 = 通用机 + 特定的解决方案
- 解决方案可以在编程语言的帮助下映射到通用计算机上
- 并不像其他工程一样,不同问题有不同机器
- 解决方案的发展是软件工程首要的任务
- 将解决方案映射到通用机上是软件工程的次要任务
成本效益
- 可行性研究:
- 利益取决于用户
- 成本取决于软件工程师
- 到达目的地的方法总是很多的,软件工程师应该选择最具成本效益的方法(而不是最先进的方法)
- 当成本和效益的关系不再重要的时候,软件工程师将会消失
- 成本低:小规模编程
- 收益不明确:勘探研究
- 不计成本:计算科学研究
- 工程思想:成本和收益相平衡
- 控制和管理
软件工程的理解
- 软件工程是一种工程活动
- 软件工程的动机是解决实际问题
- 软件工程是科学性、实践性和工艺性并重的
- 软件工程追求足够好,不是最好
- 软件工程真正的产品是基于虚拟计算机的软件方案
- 软件工程的最终目的是要促进整个社会的进步
知识域
Landscape of Computing education
SWEBOK
软件工程知识体系(SWEBOK)由 IEEE 计算机协会赞助的软件工程协调委员会的产品
SWEBOK 软件工程技术知识域
SWEBOK 软件工程管理知识域
职业软件工程师的软件工程知识重要性评价
软件开发活动
软件发展活动
角色分工
- 需求工程师,又被称为需求分析师:承担需求开发任务。软件产品的需求开发工作通常由多个需求工程师来完成,他们共同组成一个需求工程师小组,在首席需求工程师的领导下开展工作。通常一个团队只有一个需求工程师小组。
- 软件体系结构师:承担软件体系结构设计任务。通常也是由多人组成一个小组,并在首席软件体系结构师的领导下开展工作。通常一个团队只有一个软件体系结构师小组。
- 软件设计师:承担详细设计任务。在软件体系结构设计完成之后,可以将其部件分配给不同的开发小组。开发小组中负责所分配部件详细设计工作的人员就是软件设计师。一个团队可能有一个或多个开发小组。 一个小组可能有一个或多个软件设计师。
- 程序员:承担软件构造任务。程序员与软件设计师通常是同一批人,也是根据其所分配到的任务开展工作。
- 人机交互设计师:承担人机交互设计任务。人机交互设计师与软件设计师可以是同一批人,也可以是不同人员。在有多个小组的软件工程团队中,可以有一个单独的人机交互设计师小组,也可以将人机交互设计师分配到各个小组。
- 软件测试人员:承担软件测试任务。软件测试人员通常需要独立于其他的开发人员角色。一个团队可能有一个或多个测试小组。一个小组可能有一个或多个软件测试人员。
- 项目管理人员:负责计划、组织、领导、协调和控制软件开发的各项工作。相比于传统意义上的管理者,他们不完全是监控者和控制者,更多得是协调者。通常一个团队只有一个项目管理人员。
- 软件配置管理人员:管理软件开发中产生的各种制品,具体工作是对重要制品进行标识、变更控制、状态报告等。通常一个团队只有一个软件配置管理人员。
- 质量保障人员:在生产过程中监督和控制软件产品质量的人员。通常一个团队有一个质量保障小组,由一个或多个人员组成。
- 培训和支持人员:负责软件移交与维护任务。他们可以是其他开发人员的一部分,也可以是独立的人员。
- 文档编写人员:专门负责写作软件开发各种文档的人员。他们的存在是为了充分利用部分宝贵的人力资源(例如需求工程师和软件体系结构师),让这些人力资源从繁杂的文档化工作中解放出来。