什么是软件
信息
- 信息的记录
- 信息的交流
- 信息的存储
- Information => Computer => Digital Computer => Software
软件的发展
数字基础——30年代
- 硬件:各种原型机
微分计算机、继电器式计算机、ABC原型计算机、Harvard Mark 1等 - 理论:
Alan Turing,《论可计算数及其在判定问题上的应用》
Claude Elwood Shannon,电子继电器可以实现布尔符号逻辑
Alonzo Church,Lambda演算
Digital Computer——40年代
ENIAC
- 人们认为软件是硬件的一部分
- 软件运行场景,如图
ENIAC机器
蹲着的拨开关,站着的看图check - 工作流程:
得到问题——映射到机器上——画出纸——拨开关
从得到问题到画出纸往往要几星期,根据纸拨开关也要好几天 - 调试方法:单步调试
EDVAC
- 由冯诺依曼提出冯诺依曼架构,分成五部分:输入、输出、主存、控制单元、计算逻辑单元
- 理念:stored-programming concept
指令存在内存里,每次主存中既有数据又有指令,可被反复利用 - 冯诺依曼架构图示
软件工程==硬件工程——50年代
- 商用计算机的出现(如Ferranti Mark I,UNIVAC I,LEO I,IBM 701,IBM 650)
- 编程语言的出现(FORTRAN,LISP,COBAL)
- software一词出现于1958
软件!=硬件——60年代
- 大变革:
美国信息交换标准码(ASCII码)
ATM机
IBM的应用管理系统IMS应用于阿波罗航天器
软件咨询业务
IBM S/360
信用卡
DEC PDP-1小型机
——充分接触了商业项目 - 软件特性被发现
软件与现实世界关系更加密切,对需求的规格化更加困难
软件比硬件容易修改的多,并且不需要昂贵的生产线复制产品
软件没有损耗
软件不可见
Program = Algorithm + Data Structure——70年代~80年代
- Program = Algorithm + Data Structure的概念由Niklaus Wirth在1976年的书中提出
软件开发远不止编程——90年代
- 软件规模越大,编程以外的其他工作越多
软件工作量随应用程序规模变化的情况
注:KLOC为千行代码
大型软件系统(规模位100万LOC)的成本因素排序
软件类型
系统软件
系统软件有:操作系统,数据库,嵌入式设备,安全软件
应用软件
- 针对编程的应用软件有:IDE,持续集成,建模,度量
- 针对大众的商业应用软件有:商业,政府,休闲,医疗,教育,国防,个人,专业,科学
- 应用软件层次示意图
- 应用软件基于现实又高于显示
应用软件被开发的目的和意图来源于现实世界的问题
应用软件必须基于显示才能解决问题
软件最终要被用于现实并改进现实
最终在现实世界中观察到新的问题,循环往复,继续解决问题
如图
Summary
- 软件独立于硬件
- 软件是工具
- 软件不同于编程,是程序、文档、知识、数据等的集合
- 软件开发比编程复杂得多
- 应用软件来源于生活,用来提高现实生活的水平
什么是软件工程
软件工程的定义
- 针对系统、有规则的、可量化的方法的应用,对他们的软件开发、操作、维护
- 对这类方法的研究
软件工程之工程
- 关键词:creative application
- 目的:一定的限制范围内(如考虑到经济因素、对生命财产安全因素等),实现功能
- 工程师要:
做决策,折衷与妥协
使用工具
善于重用
工程学科的发展
软件工程原则
综述
- 教普通人做软件的按部就班的基本方法,保证下限,即能做出来
- 限制条件:考虑成本效益
- 工具:应用科学知识指导工程活动(做到可学习性,可重复性等)
- 客观条件:构建机器或事物,利用实物工具来解决问题
- 开发动机:以服务人类为目的
软件工程的注意问题
- 真实世界更杂乱
If the state of the real world do not accord with our expectation, then there’s a problem - 涉及面很广阔:软件工程可能涉及其他所有人类涉及的领域,其他工程就不会有这个问题
- 问题和需求不明确:问题和需求不明确,往往需要特地去发现需求,其他工程的问题大都是清晰明确的
- Engineering Idea
Objectives (Know what you want to)
Scientific Knowledge
- 计算科学(基础;包括基于数学和逻辑的能力们)
- 系统性的技能们(方法、语言、工具等)
对软件工程的理解
- 软件工程是一种工程活动
- 软件工程的动机是解决实际问题
- 软件工程是科学性、实践性和工艺性并重的
- 软件工程追求足够好,不是最好
- 软件工程真正的产品是基于虚拟计算机的软件方案
- 软件工程的最终目的是要促进整个社会的进步
软件工程知识域
SWEBOK
The Software Engineering Body of Knowledge
软件开发活动
Target | Artifact | |
---|---|---|
Software Requirement | What | SRS(软件规格说明) |
Software Design | How | SDD(软件设计描述) |
Software Construction | Build | Code and executable file(代码与可执行文件) |
Software Testing | Are you building the “right” thing? Are you building it “right”? | Test Report(测试报告) |
Software Deliver | Install | User Document and System Document(用户文档、系统文档) |
Software Maintenance | Revolution | New version software |
角色分工
- 需求工程师,又称为需求分析师:承担需求开发任务;软件产品的需求开发工作通常由多个需求工程师来完成,他们共同组成一个需求工程师小组,在首席需求工程师的领导下开展工作;通常一个团队只有一个需求工程师小组
- 软件体系结构师:承担软件体系结构设计任务;通常也是由多人组成一个小组,并在首席软件体系结构师的领导下开展工作;通常一个团队只有一个软件体系结构师小组
- 软件设计师:承担详细设计任务;在软件体系结构设计完成之后,可以将其部件分配给不同的开发小组;开发小组中负责所分配部件详细设计工作的人员就是软件设计师;一个团队可能有一个或多个开发小组;一个小组可能有一个或多个软件设计师
- 程序员:承担软件构造任务,程序员与设计师通常是同一批人,也是根据其所分配到的任务开展工作
- 人机交互设计师:承担人机交互设计任务;人机交互设计师与软件设计师可以是同一批人,也可以是不同人员;在有多个小组的软件工程团队中,可以有一个单独的人机交互设计师小组,也可以将人机交互设计师分配到各个小组
- 软件测试人员:承担软件测试任务;软件测试人员通常需要独立于其他的开发人员角色;一个团队可能有一个或多个测试小组;一个小组可能有一个或多个软件测试人员
- 项目管理人员:负责计划、组织、领导、协调和控制软件开发的各项工作;相比于传统意义上的管理者,他们不完全是监控者和控制者,更多的是协调者;通常一个团队只有一个项目管理人员
- 软件配置管理人员:管理软件开发中产生的各种制品,具体工作是对重要制品进行标识、变更控制、状态报告等;通常一个团队只有一个软件配置管理人员
- 质量保障人员:在生产过程中监督和控制软件产品质量的人会员;通常一个团队有一个质量保障小组,由一个或多个人员组成
- 培训和支持人员:负责软件移交与维护任务;他们可以是其他开发人员的一部分,也可以是独立的人员
- 文档编写人员:专门负责写作软件开发各种文档的人员;他们的存在是为了充分利用部分宝贵的人力资源(例如需求工程师和软件体系结构师),让这些人力资源从繁杂的文档化工作中解放出来