NoteDeep

引言·思考

  • 硬件让机器变快,软件则让机器变慢。
  • 摩尔定律


计算机为什么能计算?

  • 参与运算的数转换为二进制进行计算;
  • 二进制的运算通过基本的布尔运算实现;
  • 基本的布尔运算可以由电路去完成。
  • 电路能计算,计算机能计算。
  • CPU就是电路
  • 有指令集;
  • 指令是二进制的,CPU能看懂并执行。
  • 要让CPU按照我们的想法做事
  • 把我们想做的事说给计算机(程序)。
  • 程序就是人们用来告诉计算机应该做啥的表示
  • 用高级语言的方式(2千多种语言)。
  • 程序必须经过编译才能转换成CPU所能接受的指令。
  • 一条语句可能被转换成多条指令。
  • 在控制器的协调下执行行相应的指令。

计算机系统抽象层的转换

程序执行结果不仅取决于算法、程序编写,而且取决于语言处理系统、操作系统、ISA、微体系结构,不同计算机课程处于不同层次,必须将各层次关联起来解决问题。
上层是下层的抽象,下层是上层的实现,底层为上层提供支撑环境!

IT历史

  • 世界上第一个计算机程序员:Ada
  • 计算机之父:冯·诺伊曼、图灵
  • 可计算问题
  • 设函数 f 的定义域是 D ,值域是 R ,如果存在一种算法,对于D中任意给定的 x ,都能计算出f(x) 的值,则称函数 f 是可计算的。
  • 即:为计算建立一个数学模型(计算模型),然后证明,凡是这个计算模型能够完成的任务,就是可计算的任务。
  • 在艾伦·图灵1936年关于可计算数字的论文中,他提出了一个思想实验。 图灵描述了一台机器,它有一个无限长的磁带,它在上面写,读和改变符号。 他进一步表明,具有正确的最小操作集的机器可以计算任何可计算的东西,无论其复杂性如何。
  • 图灵机
  • 简单、强大、可实现
  • 给出了一个可实现的通用计算模型
  • 引入了通过读写符号和状态改变进行运算的思想
  • 真实了基于简单字母表完成复杂运算的能力
  • 引入了存储区、程序、控制器等概念原型

计算机硬件体系结构

冯.诺依曼计算机体系结构图
计算机系统硬件结构的发展表明该领域逐渐走向成熟

程序

➢ 程序 = 算法 + 数据结构(1960’s )
➢ 程序 = 子程序 + 子程序(1970’s )
➢ 对象 = 算法 + 数据结构
程序 = 对象 + 对象(1980’s)
➢ 程序 = 组件 + 连接件(1990’s)

层次

早期软件生产

  1. 1950 -1960 年代,是程序设计阶段,基本是个体手工劳动的生产方式。这个时期,一个程序是为一个特定的目的而编制的,软件的通用性是很有限的,软件往往带有强烈的个人色彩。
  2. 1960 -1970 年代,是软件设计阶段小组合作生产方式。在这一时期软件开始作为一种产品被广泛使用,出现了“软件作坊”。

软件危机(Software Crisis)

软件危机指的是在计算机软件的开发和维护过程中所遇到的一系列严重问题。概括来说,软件危机包含两方面问题:
  1. 如何开发软件,以满足不断增长,日趋复杂的需求;
  2. 如何维护数量不断膨胀的软件产品。落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题。

软件工程

1968年NATO会议上首次提出“软件工程”(Software Engineering) 的概念,提出把软件开发从“艺术”和“个体行为”向“工程”和“群体协同工作”转化。其基本思想是应用计算机科学理论和技术以及工程管理原则和方法,按照预算和进度,实现满足用户要求的软件产品的定义、开发、发布和维护的工程。从此也诞生了一门新的学科——软件工程。
业界人士借鉴传统工业成功的做法,主张通过工程化的方法来解决软件危机。
  • 软件工程主要讲述软件开发的道理,成功的经验和失败的教训
  • 软件工程的观念、方法、策略和规范都是朴实无华的;
  • 软件工程的目标是提高软件的质量与生产率,最终实现软件的工业化生产
  • 软件工程模型建议:用一定的流程将各环节连接起来,采用规范的方式操作全过程;
  • 研究软件工程永远不会像理论家那样潇洒,定理证明了就OK;
  • 导致了一门新学科的出现。

软件工程

软件工程定义

IEEE

(1)将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即,将工程应用于软件
(2)在(1)中所述方法的研究。

Fritz Bauer

软件工程是建立和使用一套合理的工程原则,从而经济地获得可靠的、可以在实际机器上高效运行的软件。

《计算机科学技术百科全书》

软件工程是应用计算机科学、数学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。

软件工程的发展阶段

传统软件工程

20世纪70年代,为了解决软件项目失败率高、错误率高以及软件维护任务重等问题,人们提出软件开发工程化的思想,希望使软件开发走上正规化的道路,并努力克服软件危机。
结构化

面向对象的软件工程

80年代逐步发展起来的面向对象的分析与设计方法,形成了完整的面向对象技术体系,使系统的生存周期更长,适应更大规模、更广泛的应用,进一步提高软件生产率、保证软件质量就成为软件工程追求的更高目标。软件开发开始进入以面向对象为中心的第二阶段。

组件(构件)软件工程

1990年开始在基于面向对象技术的基础上发展了组件技术,它丰富了重用手段和方法,逐渐成为研究的热点;
组件(Component)是可用来构成软件系统的即插即用(Plug & Play)的软件成分,是可以独立地制造、分发、销 售、装配的二进制软件单元;

面向服务的软件工程

对市场需求的快速变化,要求企业系统具有敏捷服务、快速重构、资源重用及自由扩充等特点。这样就应运而生了面向服务的架构(Service Oriented Architecture,SOA)
构成:
  1. 服务请求者。又称服务消费者,是需要使用服务的应用程序或其它的服务。通过对注册中心的服务进行查询后,根据接口说明信息并使用某种传输协议与服务绑定并执行服务功能。
  2. 服务注册者。集中存储服务信息,以便于服务请求者查找。同时服务提供者可以把所要提供的服务在服务注册者处进行注册。
  3. 服务提供者。即服务的拥有者,它将各种信息及功能封装成用于业务流程的可重用组件的应用程序函数;负责将服务信息发布到服务注册者,响应服务请求者的命令并为之提供高质量的服务。

软件工程的发展总结

  • 软件工程不是万能的。
  • 软件工程的发展,所产生的方法不是严密的理论,实践者不能教条的套用,重要的是学会“选择合适的方法和产生新的方法”:

复用

  • 复用的东西包括有形的和无形的成果
  • 复用的内涵在于提高质量和生产率

分而治之

将一个复杂的问题分解成若干简单的问题,朴素的思想来源于生活,完全适合于技术领域。
软件的分而治之不能硬分硬治。
  • 复杂问题分解后,每个问题能否用程序来实现?
  • 所有的程序最终能否集成为一个软件系统并有效解决原始的复杂问题?

优化-折中

  • 优化不是可有可无的事情,只有当优化成为一种责任的时候我们才能改进软件中的算法、数据结构、组织结构从而提高软件质量
  • 当不能够使所有的目标都得到优化的时候,就需要采用折中的策略,实现整体最优。“……为了使整个组织具有最好的战斗力,我们要重用几个人,照顾一些人,在万不得已的情况下委屈一些人”

今天,软件产品越来越复杂,相互之间的依赖性更强,分工也愈加细化
➢ 相同的情况也出现在软件设计领域
➢ 对整个系统的设计和描述变得越来越重要。
抽象程度有规律的提高

程序=算法+数据结构。软件的结构与抽象集中在数据结构上。
➢ 渐渐的,人们开始希望把算法与数据结构结合起来,ADT被提了出来。

  • 软件体系结构的提出与发展,主要原因在于软件开发自身的变化
  • 软件的规模越来越大
  • 对分布式的需求


评论列表

    引言·思考
    计算机为什么能计算?
    计算机系统抽象层的转换
    IT历史
    计算机硬件体系结构
    程序
    层次
    软件工程