Skip to content

计算机是怎样跑起来的——读书笔记

统计信息:字数 35046 阅读71分钟

2023年9月第一次阅读,这本是计算机科学概论的趣味入门书,一本 PDF 电子书,作者是日本矢泽久雄

本书倡导在计算机迅速发展、技术不断革新的今天,回归到计算机的基础知 识上。通过探究计算机的本质,提升工程师对计算机的兴趣,在面对复杂的最新技 术时,能够迅速掌握其要点并灵活运用。本书以图配文,以计算机的三大原则为开端, 相继介绍了计算机的结构、手工汇编、程序流程、算法、数据结构、面向对象编程、 数据库、TCP/IP 网络、数据加密、XML、计算机系统开发以及 SE 的相关知识。

第1章 计算机的三大原则

● 1.1 计算机的三个根本性基础

● 1.2 输入、运算、输出是硬件的基础

● 1.3 软件是指令和数据的集合

● 1.4 对计算机来说什么都是数字

● 1.5 只要理解了三大原则,即使遇到难懂的最新技术,也能轻松应对

● 1.6 为了贴近人类,计算机在不断地进化

● 1.7 稍微预习一下

提问1、每一个汉字占用的字符编码个数相同吗?字符编码不同,汉字占用的字节数也不同。在 GBK 字符编码下,每一个汉字占用2个字节。在 UTF-8 编码下,一个汉字占用3个字节。

提问2、计算机中所有的信息都会当做数字处理吗?是的,所有的信息都会当做数字处理。包括颜色编码、文字字符编码,最后都转换成二进制数字进行处理。

计算机的三个根本性基础:1、计算机是执行输入、运算、输出的机器 2、程序是指令和数据的集合 3、计算机处理方式有时候与人类思维习惯不同——这点很重要。计算机可以轻松处理多次重复性工作(例如循环数据)。当然现在人工智能大发展,计算机开始学习弱人工智能,这是未来的突破点。

第2章 试着制造一台计算机吧(计算机组成原理)

通常用 Hz 来表示驱动 CPU 运转的时钟信号的频率。1 秒发出 1 次时钟信号就是 1Hz,所以 100MHz(兆赫 兹)的话就是 100×100 万 = 1 亿次/秒。M(兆)代表 100 万

CPU 上数据总线的条数,或者 CPU 内部参与运算的寄 存器的容量,都可以作为衡量 CPU 性能的比特数。在 Z80 CPU 中,无论是数据总线的条数还是寄存器的容 量都是 8 比特,所以 Z80 CPU 是一款 8 比特的 CPU。 而在 Windows 个人计算机中广泛使用的 Pentium(奔 腾)CPU 则是 32 比特的 CPU。

● 2.1 制作微型计算机所必需的元件 17

制作微型计算机所需的基础元件只有 3 个,CPU、内存和 I/O

CPU 是计算机的大脑,负责解释、执行程序。内存负责存储程 序和数据。I/O 是 Input/Output(输入/输出)的缩写,负责将计算机和 外部设备(周边设备)连接在一起

输出时钟信号的元件叫作“时钟发生器”。 时钟发生器中带有晶振,根据其自身的频率(振动的次数)产生时钟信 号。 时 钟 信 号 的 频 率 可 以 衡 量 CPU 的 运 转 速 度。 这 里 使 用 的 是 2.5MHz(兆赫兹)的时钟发生器。

● 2.2 电路图的读法 21

● 2.3 连接电源、数据和地址总线 23

微型计算机所使用的 IC 属于数字 IC。在数字 IC 中,每个引脚上 的电压要么是 0V、要么是 +5V,通过这两个电压与其他的 IC 进行电 信号的收发。用于给 IC 供电的 Vcc 引脚和 GND 引脚上的电压是恒定 不变的 +5V 和 0V,但是其他引脚上的电压,会随着计算机的操作在 +5V 和 0V 之间不断地变化

● 2.4 连接I/O 26

Z80 PIO 上共有 4 个寄存器。2 个用于 设定 PIO 本身的功能,2 个用于存储与外部设备进行输入输出的数据

● 2.5 连接时钟信号 27

把时钟发生器的 8 号引脚和 Z80 CPU 的 CLK (CLK 即 Clock,时钟)引脚、Z80 PIO 的 CLK 引脚分别连接起来。时 钟发生器的 8 号引脚与 +5V 之间的电阻用于清理时钟信号

● 2.6 连接用于区分读写对象是内存还是I/O的引脚 28

● 2.7 连接剩余的控制引脚 29

● 2.8 连接外部设备,通过DMA输入程序 34

● 2.9 连接用于输入输出的外部设备 35

● 2.10 输入测试程序并进行调试 36

其实这些语言都无法使用,因为作 为计算机大脑的 CPU 只能解释执行一种编程语言,那就是靠罗列二进 制数构成的机器语言(原生代码)。

总线分为数据总线,地址总线,控制总线。实际上总线并不是一根线,而是不同单元上有很多串口,不同串口之间连接,分别执行数据地址控制等功能。这些连接的合集就是总线(实际上有几百个链接)。不同节就是介绍不同的模块具体怎样连接,以及最终连接后的调试工作。

第3章 体验一次手工汇编(汇编语言)-正在看 54-72

● 3.1 从程序员的角度看硬件 41

● 3.2 机器语言和汇编语言 44

根据表示指令功能的英语单 词起一个相似的昵称,并将这个昵称赋予给 0 和 1 的组合。这种类似 英语单词的昵称叫作“助记符”,使用助记符的编程语言叫作“汇编语 言”。

按功能这些指令可以分成运算、与内存的输入输出和 与 I/O 的输入输出三类。

● 3.3 Z80 CPU的寄存器结构 49

在 CPU 内部就应该有存储数据的地方。这种 存储数据的地方叫作“寄存器”。虽然也叫寄存器,但是与 I/O 的寄存 器不同,CPU 的寄存器不仅能存储数据,还具备对数据进行运算的能 力。

● 3.4 追踪程序的运行过程 52

● 3.5 尝试手工汇编 54

● 3.6 尝试估算程序的执行时间 57

三个问题:

1、什么是机器语言?二进制数字构成的程序,CPU 可以直接解释并执行。不管是低级的汇编语言,还是高级的C语言,都需要转换成机器语言最后才能被执行。

2、标识内存存储单元或者 IO 中的寄存器的数字是什么?叫做内存地址。从 0 开始标识每个存储单元。具体寄存器和地址的对应关系,取决于 CPU 和 IO 之间的布线。

3、CPU 中标志寄存器(Flags Register)有什么作用?用于指令运算结束后,存储运算结果的某些状态。如果执行了某个算术运算,逻辑运算,比较运算,标志寄存器并不会存放当前的结果,而是存放运算后的某些状态(例如是否错误,是否内存溢出,是否负数等)这里存放一个布尔值。

这一章需要亲自体验计算机运行机制,就是写汇编语言,然后手动转换成机器语言进行执行。

编写汇编语言前,需要清楚计算机硬件的信息,例如CPU(CPU的种类决定哪种机器语言,时钟信号的频率)、内存(内存地址空间,每个地址存放信息的比特位数)、IO(IO的种类,地址空间,周边设备)。

【CPU(处理器)信息】 ● CPU 的种类 ● 时钟信号的频率 【内存信息】 ● 地址空间 ● 每个地址中可以存储多少比特的信息 【I/O 信息】 ● I/O 的种类 ● 地址空间 ● 连接着何种周边设备

第4章 程序像河水一样流动着(程序与设计)72-96

● 4.1 程序的流程分为三种 61

CPU 中有各种各样的各司其职的寄存器。其中有一个被称为 PC (Program Counter,程序计数器)的寄存器,负责存储内存地址,该地 址指向下一条即将执行的指令。每解释执行完一条指令,PC 寄存器的 值就会自动被更新为下一条指令的地址。

● 4.2 用流程图表示程序的流程 65

● 4.3 表示循环程序块的“帽子”和“短裤” 68

● 4.4 结构化程序设计 72

为了把程序编写得具备结构性,仅使用顺序执行、条件分 支和循环表示程序的流程即可,而不再使用跳转指令

● 4.5 画流程图来思考算法 75

● 4.6 特殊的程序流程——中断处理 77

● 4.7 特殊的程序流程——事件驱动 78

第5章 与算法成为好朋友的七个要点(算法设计)

● 5.1 算法是程序设计的“熟语” 87

● 5.2 要点 1 :算法中解决问题的步骤是明确且有限的 88

● 5.3 要点 2 :计算机不靠直觉而是机械地解决问题 89

● 5.4 要点 3 :了解并应用典型算法 91

● 5.5 要点 4 :利用计算机的处理速度 92

● 5.6 要点 5 :使用编程技巧提升程序执行速度 95

● 5.7 要点 6 :找出数字间的规律 99

● 5.8 要点 7 :先在纸上考虑算法 101

最后介绍最为重要的一点,那就是思考算法的时候,要先在纸上用文字或图表描述出解决问题的步骤,而不要立刻开始编写代码。前边的算法介绍就是辗转反侧计算最大公约数,其他细节很简单,不描述。

第6章 与数据结构成为好朋友的七个要点(数据结构)

● 6.1 要点 1 :了解内存和变量的关系 105

● 6.2 要点 2 :了解作为数据结构基础的数组 108

● 6.3 要点 3 :了解数组的应用——作为典型算法的数据结构 109

● 6.4 要点 4 :了解并掌握典型数据结构的类型和概念 111

● 6.5 要点 5 :了解栈和队列的实现方法 114

● 6.6 要点 6 :了解结构体的组成 118

● 6.7 要点 7 :了解链表和二叉树的实现方法 120

这里以C语言为例,在基本的数据结构外,使用了结构体数据结构,设置结构体的某个属性是指针,指向另一个结构体(类似对象引用另一个对象)。这样实现了链表,堆栈,二叉树等复杂的数据结构。在其他的数据结构和算法数据中介绍过了,所以不赘述。

// 这是自我引用的结构体
struct TestResult {
  char Chinese;
  char Math;
  char English;
  struct TestResult Pointer1;
  struct TestResult Pointer2;
};

第7章 成为会使用面向对象编程的程序员吧(面向对象)

● 7.1 面向对象编程 127 章

● 7.2 对OOP的多种理解方法 128

● 7.3 观点 1 :面向对象编程通过把组件拼装到一起构建程序 130

● 7.4 观点 2 :面向对象编程能够提升程序的开发效率和可维护性 132

● 7.5 观点 3 :面向对象编程是适用于大型程序的开发方法

● 7.6 观点 4 :面向对象编程就是在为现实世界建模

● 7.7 观点 5 :面向对象编程可以借助 UML 设计程序

● 7.8 观点 6 :面向对象编程通过在对象间传递消息驱动程序

● 7.9 观点 7 :在面向对象编程中使用继承、封装和多态

● 7.10 类和对象的区别

● 7.11 类有三种使用方法

● 7.12 在Java和.NET中有关OOP的知识不能少

这是2003年的书,距今已经20年了,所以当时面向对象还不是主流编程方案,主要的OOB语言还是 C++ Java c# 现在面向对象已经占据很大的市场份额了。客观的说,新技术比较难,确实会取代很多旧的技术。如果现在只会 VB 那么一定会被淘汰。

在 OOB 中才有对象的概念,就替代了 C 中的结构体。结构体是单纯的数据的集合,操作数据的方法还在结构体外部,以单独的函数存在。在面向对象编程中,对象内部包括了属性和方法,也就是集成了数据和操作数据的方法,就是加强版本的结构体。

开发小组中的全体成员没有必要都对程序中的方方面面有所了解,而是组中有些人只负责制作组件(类),有些人只负责使用组件。

现在项目中很多的问题,就是组件复用不多,或者说样式类名复用不多,很多情况直接抄代码,造成了后期不好维护等情况。这个想想怎么解决比较好。整体上,一部分 UI 组件是开源的商业组件,再此基础上进行细节的加工。

也就是说,要一边观察作为程序参照物的现实世界,一边思考待解决的问题是由哪些事物(类)构成的。从前端角度考虑,界面上 UI 划分的组件,然后理解组件对应的功能和属性,然后对应代码层面的类和内部函数。如果一个类不明确,那么UI层面上划分的就不合适。或者某个类没有对应某个实际的 UI,而是一个服务,这个就先设计好怎么处理不同的类。

面向过程编程,使用流程图就可以,因为没有具体执行函数的主体。

面相对象编程,使用时序图就可以,每一个类或者对象,都有自己的方法,或者和其他的类进行交互,这是与面向过程编程的最大区别。

第8章 一用就会的数据库(数据库概论)

● 8.1 数据库是数据的基地

开篇

表(Table)就是被整理成表格形式的数据。一张表由若干个列和行构成。列也被称为字段(Field), 行也被称为记录(Record)。

键用于设定表和表之间的关系(Relationship),而索引是提升数据检索速度的机制。

其上每个值都能够唯一标识一条记录的字段称为主键。为了在表和表之间建立关系而在表中添加的、其他表主键的字段称为外键。而索引是与键无关的机制。

卡片型数据库:将这样的数据存储形式原封不动地移植到计算机中,就形成了“卡片型数据库”。存储一条数据就好比把一张账单或是名片上的信息记录到一个文件中。

关系型数据库:适合存储大规模数据的是关系型数据库。在关系型数据库中,数据被拆分整理到多张表中,同时表与表之间的关系也可以被记录下来。

● 8.2 数据文件、DBMS和数据库应用程序

数据库系统的构成要素包括“数据文 件”“DBMS”“应用程序”三部分。在小型系统中,把三个要素全部部 署在一台计算机上,称作“独立型系统”。在中型系统中,把数据文件 部署在一台计算机上,并且使数据文件被部署了 DBMS 和应用程序 的多台计算机共享,这样的系统被称为“文件共享型系统”。在大型 系统中,把数据文件和 DBMS 部署在一台(或者多台)计算机上,然 后用户从另外一些部署着应用程序的计算机上访问,这样的系统被称 作“客户端/服务器型系统”。其中部署着数据文件和 DBMS 的计算 机是服务器(Server),即服务的提供者;部署着应用程序的计算机是 客户端(Client),即服务的使用者。如果把服务器和客户端之间用互联网联结起来,就形成了 Web 系统。在 Web 系统中,一般情况下应 用程序也是部署在服务器中的,在客户端只部署 Web 浏览器(如图 8.4 所示)

● 8.3 设计数据库

设计数据库的第一步是从“你想要了解什么”的视角出发找出需要的数据。

酒铺经营者需要知道什么? ● 商品名称 ● 单价(日元) ● 销售量 ● 顾客姓名 ● 住址 ● 电话号码

把必要的数据筛选出来以后,下一步要考虑的是各种数据的属性。 属性也称作模式(内模式),具体来说就是数据的类型(是数字还是字 符串),数字的话是整数还是浮点小数,字符串的话最多允许包含多少 个字符,是否允许 NULL 值(表示未知或者不存在的值),等等。

在关系型数据库中,把录入 到表中的每一行数据都称为记录,把构成一条记录中的各个数据项(在 本例中是商品名称、单价等)所在的列都称作字段。记录有时也被称为 行或元组(Tuple),字段有时也被称为列或属性(Attribute)。

● 8.4 通过拆表和整理数据实现规范化

在设计关系型数据库时,还要进行“规范化”。 所谓规范化,就是将一张大表分割成多张小表,然后再在小表之间建 立关系,以此来达到整理数据库结构的目的。通过规范化,可以形成结构更加优良的数据库。

规范化的要点是在一个数据库中要避免重复存储相同的数据。因 此在本例中,把酒铺的数据库分为“商品表”“顾客表”和“销售记录 表”三张表,然后再在它们之间建立关系

通过这样的处理,既省去了多次重复录入相同的顾客姓名、住 址、电话号码的麻烦,又能防止把相同的商品名称输入成不同名称的 错误。

● 8.5 用主键和外键在表间建立关系 159

首先要在各个表中添加 一个名为主键(Primary Key)的字段,该字段的值能够唯一地标识表中 的一条记录(如图 8.9 所示)。在顾客表中添加的“顾客 ID”字段,在 销售记录表中添加的“销售记录 ID”字段以及在商品表中添加的“商品 ID”字段,都是主键。

表之间的关系使记录和记录关联了起来。记录之间虽然在逻辑上 有一对一、多对多以及一对多(等同于多对一)三种关系,但是在关系 型数据库中无法直接表示多对多关系。

当出现多对多关系时(用户表和商品表,可能存在多对多的关系),可以在这两张表之间再加入一张表,把多 对多关系分解成两个一对多关系(如图 8.10 所示)。加入的这张表被称 作连接表(Link Table)(销售记录表,我们认为一条销售记录对应一个用户和一个商品,一个用户可以有多条销售记录,一个商品也能对应多个销售记录)。

如果是自己的项目,那么每一个人可以购买多个书籍,每一个书籍可能由不同的人购买,所以这里也可以是类似的书籍销售记录表,处理多对多的联系。

还需要处理某一条数据删除的情况:如果某个书籍从数据库内部删除,那么对应的销售记录怎么处理?——删除书籍时,应该单独设置一个字段 deleted 使用布尔值作为标识,删除书籍对应的文本内容,保留基本的信息(书籍信息)然后在用户的购买记录中,显示书籍(已过期,或者已删除)这样比较好

目前书籍对应的文本内容,还是以字符串形式,存放在数据库中。实际上这个查表性能比较差,最好单独用一个数据库表存放对应的文本内容,这个需要调研,类似的其他多媒体,怎样在数据库中存储,也是类似的问题。

● 8.6 索引能够提升数据的检索速度 162

可以在表的各个字段上设置索引(Index),这也是 DBMS 所具备 的功能之一。虽然索引和键这两个概念容易让人混淆,但其实两者是 完全不同的。索引仅仅是提升数据检索和排序速度的内部机制。一旦 在字段上设置了索引,DBMS 就会自动为这个字段创建索引表

表中有两个字段,分别存储着顾 客姓名和位置(所对应的记录在数据文件中的位置)。与原来的顾客表 相比,索引表中的字段数更少,所以可以更快地进行数据的检索和排 序。当查询数据时,DBMS 先在索引表中进行数据的检索和排序,然 后再根据位置信息从原来的数据表中把完整的记录取出来。索引所起 的就是“目录”的作用。与图书的目录一样,数据库的索引也是一种能 够高效地查找目标数据的机制

因为一旦设置了索引,每次向表中插入数据时,DBMS 都必须更新索 引表。提升数据检索和排序速度的代价,就是插入或更新数据速度的 降低。因此,只有对那些要频繁地进行检索和排序的字段,才需要设 置索引。

如果表中充其量也就 只有几千条记录,那么即使完全不使用索引,也不会感到检索或排序 速度有多慢。

● 8.7 设计用户界面 164

在设计系统时,请诸位记住一个重要的顺序:优先设计数据库,然后再设计用户界面。

由于 DBMS 具有自动生成主键和外键上的值的功能,所以在设计 用户界面时,需要显示其余的字段,并要使 CRUD 操作能够通过按钮 和菜单来完成。

● 8.8 向DBMS发送CRUD操作的SQL语句 165

● 8.9 使用数据对象向DBMS发送SQL语句 167

● 8.10 事务控制也可以交给DBMS处理 170

事务控制。事务由若干条SQL 语句构成,表示对数据库一系列相关操作的集合。

为了从顾客 A 的账户中
给顾客 B 的账户汇入 1 万日元,就需要将以下两条 SQL 语句依次发送
给 DBMS :1. 把 A 的账户余额更新(UPDATE 语句)为现有余额减去
1 万日元;2. 把 B 的账户余额更新(UPDATE 语句)为现有余额加上
1 万日元。此时这两条 SQL 语句就构成了一个事务。

为了防止出现这种问题,在 SQL 语言中设计了以下三条 语句:1. BEGIN TRANSACTION(开启事务)语句,用于通知 DBMS开启事务;2. COMMIT(提交事务)语句,用于通知 DBMS 提交事务;3. ROLL BACK(事务回滚)语句,用于在事务进行中发生问题时,把数据库中的数据恢复到事务开始前的状态(如图 8.16 所示)。

第9章 通过七个简单的实验理解 TCP/IP 网络 175(计算机网络)

LAN 是 Local Area Network(局域网)的缩略语。通常把在一栋建筑物内或是一间办公室里的那种小规 模网络称作 LAN。与此相对,把互联网那样的大规模网络称作 WAN(Wide Area Network,广域网)。

路由器负责将 LAN 连接到 WAN 上。

MAC 地址就是能够标识网卡的编号。几乎所有的网卡都会在上市前被分配一个不可变更的MAC 地址。

● 9.1 实验环境 177

● 9.2 实验 1 :查看网卡的 MAC 地址 179

这 套 机 制 叫 作 CSMA/CD(Career Sense Multiple Access with Collision Detection,带冲突检测的载波监听多路访问)。所谓载波监听 (Career Sense),指的是这套机制会去监听(Sense)表示网络是否正在 使用的电信号(Career)。 而 多 路 复 用(Multiple Access)指的是多个 (Multiple)设备可以同时访问(Access)传输介质。带冲突检测(with Collision Detection)则表示这套机制会去检测(Detection)因同一时刻

的传输而导致的电信号冲突(Collision)。在小规模的 LAN 中,像这样 略显粗躁的 CSMA/CD 机制是可以正常运转的。因为 CSMA/CD 归根 结底也只是一种适用于 LAN 的机制。

一台计算机收到了电信号以后会先做判断,如果是发送给 自己的则选择接收,反之则选择忽略。可以用被称作 MAC(Media Access Control)地址的编号来指定电信号的接收者。在每一块网卡所 带有的 ROM(Read Only Memory,只读存储器)中,都预先烧录了一 个唯一的 MAC 地址。

ipconfig

ifconfig

不同操作系统下面,查看 MAC 地址的命令不一致

● 9.3 实验 2 :查看计算机的 IP 地址 182

在 TCP/IP 网络中,除了硬件上的 MAC 地址,还需要为每台计算机设定一个软件上的编号。这个编号就是众所周知的 IP 地址。

通常把设定了 IP 地址的计算机称为“主机”(Host)。因为路由器 也算是计算机的一种,所以它们也有 IP 地址。在 TCP/IP 网络中,传输 的数据都会携带 MAC 地址和 IP 地址两个地址。

● 9.4 实验 3 :了解 DHCP 服务器的作用 184

虽然在这个对话框中可以手动设置 IP 地址和子网掩码,但是大多 数情况下选择的还是“自动获得 IP 地址”这个选项。这个选项使得计 算机在启动时会去从 DHCP 服务器获取 IP 地址和子网掩码,并自动地 配置它们。

DHCP 的全称是 Dynamic Host Configuration Protocol(动态主机设 置协议)。

● 9.5 实验 4 :路由器是数据传输过程中的指路人 186

在一台路由器的路由表中,只会记录通往与之相邻的路由器的路径,而并不会记录世界范围内的所有传输路径。

如果数据的发送目的地就在本 LAN 中,则可以直 接发送数据而无需经过路由器转发;反之如果在 LAN 外(或发送目的 地的 IP 地址不在路由表中),则需要经过路由器转发。

● 9.6 实验 5 :查看路由器的路由过程 188

● 9.7 实验6 :DNS服务器可以把主机名解析成IP地址 190

DNS 服务器通 常被部署在各个 LAN 中,里面记录着 FQDN 和 IP 地址的对应关系表。

如果一台 DNS 服务器无法解析域名,它就会去询问其他的 DNS 服务器。

● 9.8 实验 7 :查看 IP 地址和 MAC 地址的对应关系 192

用于实现由 IP 地址到 MAC 地址的转换,这 种功能被称作 ARP(Address Resolution Protocol,地址解析协议)。

当向各个计算机都询问 完一轮之后,就会把得到的 MAC 地址和 IP 地址的对应关系缓存起来 (临时保存在内存中)。存起来的这些对应关系信息称作“ARP 缓存 表”。

● 9.9 TCP的作用及TCP/IP网络的层级模型 193

IP 协议 用于指定数据发送目的地的 IP 地址以及通过路由器转发数据。而 TCP 协议则用于通过数据发送者和接收者相互回应对方发来的确认信 号, 可 靠 地 传 输 数 据。

第10章 试着加密数据吧 197

信息摘要是指从作为数字签名对象的文件整体中计算出的数值。对比由文件整体计算出的信息摘要,可以证明文件的内容有没有被篡改。加密处理过的信息摘要就是数字签名。

● 10.1 先来明确一下什么是加密 199

对称密钥加密技术。这种加密技术的特征是在加密 和解密的过程中使用数值相同的密钥。因此,要使用这种技术,就必 须事先把密钥的值作为只有发送者和接收者才知道的秘密保护好。互联网的存在应 该意味着用户可以实时地与世界各地的人们交换信息。因此对称密钥

加密技术不适合在互联网中使用。

● 10.2 错开字符编码的加密方式 201

● 10.3 密钥越长,解密越困难 205

● 10.4 适用于互联网的公开密钥加密技术 208

实现公开密钥加密技术的算法有若干种,这里笔者将介绍 目前广泛应用于互联网中的 RSA 算法

● 10.5 数字签名可以证明数据的发送者是谁 211

而在通过网络传输的文件中,数字签名可以发挥出与印章和签 名同样的证明效果。通常可以按照下面的步骤生成数据签名。步骤中 所提及的“信息摘要”(Message Digest)可以理解为就是一个数值,通 过对构成明文的所有字符的编码进行某种运算就能得出该数值。

这里是使用私钥进行加密、使用公钥进行解密

发送者用构成文件的所有字符的编码生成了信息摘要,就证 明发送者从头到尾检查了文件并承认其内容完整有效。如果接收者重 新算出的信息摘要和经过发送者加密的信息摘要匹配,就证明文件在 传输过程中没有被篡改,并且的确是发送者本人发送的。正因为数据 是用发送者的私钥加密的,接收者才能用发送者的公钥进行解密。

合理的密钥应该满足如下条件:长短适中、可以反复使用、可以 通过某种通信手段交给接收者,并且通信双方以外的其他人难以用它 来解密。公开密钥加密技术就完全满足上述条件,

第11 章 XML 究竟是什么 215

ML是Extensible Markup Language(可扩展标记 语言)的缩写。

HTML是用于编写网页的标记语言。XML是用于定 义任意标记语言的元语言。通常把用于定义新语言的语言称作元语言。通过使用 XML 可以定义出各种各样的新语言。

● 11.1 XML是标记语言 217

XML 本身并不 会限定标签的种类,反倒是允许 XML 的使用者随心所欲地创建标签。在“<”和“>”中的单词可以是任意的。这就是所谓的“可 扩展”。说 XML 仅仅限定了进行标记时标签的书写格式(书写风格)。也就 是说通过定义要使用的标签种类,就可以创造出一门新的标记语言。

在 HTML 中,我们只能使用由 HTML 定义出的那若干种标签, 因此 HTML 是固定的标记语言。

HTML 是给人看的,XML 是给计算机看的

● 11.2 XML是可扩展的语言 219

● 11.3 XML是元语言 220

● 11.4 XML可以为信息赋予意义 224

● 11.5 XML是通用的数据交换格式 227

在计算机行业,长久以来一直把 CSV(Comma Separated Value, 逗号分隔值)作为通用数据交换格式沿用至今。

CSV 文件的扩展名为 .csv。正如其名,在 CSV 文件中,记录的是 经过“,”(半角逗号)分割后的信息。

CSV 文件的大小不过 50 字节,而这个 XML 文件的大小是 280 字节, 竟比 CSV 文件的 5 倍还多。文件尺寸增大,就意味着会占用更多的存 储空间、需要更长的传输及处理时间。

● 11.6 可以为XML标签设定命名空间 230

● 11.7 可以严格地定义XML的文档结构 232

有效的 XML 文档:所谓有效的 XML 文档是 指在 XML 文档中写有 DTD(Document Type Definition,文档类型描述)信息。

其实完整的 XML 文档包括 XML 声明、 XML 实例和 DTD 三个部分。所谓 XML 声明,就是写在 XML 文档开 头的、形如 <?xml version="1.0" encoding="Shift_JIS"?>的部分。XML 实例是文档中通过标签被标记的部分。而 DTD 的作用是定义 XML 实 例的结构。虽然也可以省略 DTD,但是通过 DTD 可以严格地检查 XML 实例的内容是否有效。

● 11.8 用于解析XML的组件 233

可以使用浏览器解析 XML,也可以使用其他语言(vb)等解析 XML。

Set obj = CreateObject("Microsoft.XMLDOM")
 obj.async = False
 obj.Load "MyPet.xml"
 s = ""
 For i = 1 To obj.documentElement.childNodes.length
     s = s & obj.documentElement.childNodes.Item(i - 1).nodeName
     s = s & "..."
     s = s & obj.documentElement.childNodes.Item(i - 1).Text
     s = s & vbCrLf
Next MsgBox s

● 11.9 XML可用于各种各样的领域 235

第12 章 SE 负责监管计算机系统的构建 239

● 12.1 SE是自始至终参与系统开发过程的工程师 241

● 12.2 SE未必担任过程序员 243

● 12.3 系统开发过程的规范 243

● 12.4 各个阶段的工作内容及文档 245

● 12.5 所谓设计,就是拆解 247

● 12.6 面向对象法简化了系统维护工作 249

● 12.7 技术能力和沟通能力 250

● 12.8 IT不等于引进计算机 252

● 12.9 计算机系统的成功与失败 253

● 12.10 大幅提升设备利用率的多机备份 255

SE 是 System Engineer(系统工程师)的缩略语。SE 是参与所有开发阶段的工程师。类似于国内的项目经理。

软 件 开 发 过 程 的 模 型 有“瀑布模型 ”“原型模型”“螺旋模型”等。本章主要介绍瀑布流开发模型

SE 指的是在进行业务的信息化时,负责调查、分析业务内容,确定计算机系统的基础设计及其详细规格的技术人员。同时 SE 也负责系统开发的项目管理和软件的开发管理、维护管理工作。由于主要的工作是基础设计,所以不同于编写程序的程序员,SE 需要具备从硬件结构、软件的构建方法乃至横跨整个业务的广泛知识以及项目管理的经验。

SE 负责的工作是项目管理和软件开发管理,以及引进计算机系统后的维护,而制作软件(编程)的工作则交由程序员完成。

瀑布模型的不同阶段,都应更改有文档并进行审核。审核通过后,项目进入下一个阶段。这种开发模式适合于团队人数较多,软件设计比较复杂的情况。

瀑布流的好处,1、确定需求前就进行精确的论证,这个就避免了后续需求变化造成的返工等问题。2、刚开始从顶层设计,设计代码层面考虑到整体的功能和复杂度,避免了后续功能扩容兼容造成的种种问题。

在瀑布流开发模型中,SE 就需要精确把控方向。

开始
需求分析——系统策划文档、系统功能需求规格文档
外部设计——外部设计文档
内部设计——内部设计文档
程序设计——程序设计文档
编码实现——模块设计文档、测试计划文档
测试——测试报告
部署、维护——部署手册、维护手册
目标

可以对照一下项目,查看目前的项目缺少哪些文档,并进行完善。

在计算机行业中常会提及“外部”和“内部”,一般情况下,把从用户的角度看到的东西称为“外部”,把从开发者的角度看到的东西称为“内部”。

大型项目测试注意:

到了“测试”阶段,测试人员要根据测试计划文档的内容确认程序的功能。在最后编写的“测试报告”中,还必须定量地(用数字)标示出测试结果。如果只记录了一些含糊的测试结果,比如“已测试”或是“没问题”,那么就难以判断系统是否合格了。

在定量地标示测试结果的方法中,有“涂色检查”和“覆盖测试”等方法。“涂色检查”的做法是一个个地确认“系统功能需求规格文档”中的功能,如果该功能实现了,就用红笔把它涂红。“覆盖测试”则是

一种表示有多少代码的行为已经经过确认的方法。“通过涂色检查,已确认了系统 95% 的功能。剩下的 5% 虽然有问题,但已经查明了原因,可以在 1 周内修正”“已完成了 99% 的覆盖测试。由于剩余的 1% 是不可达代码(Dead Code,绝不会被执行的代码),所以可以删除”。如果能像这样给出定量的测试结果,那么就很容易判定系统是否合格了吧。

计算机系统的设计,就是拆解。把大型的模块和功能,拆解成小型的模块和功能。把大型的代码结构,面向对象拆解成小型的模块或者代码段。

成功的计算机系统是什么样的呢?那就是能完全满足客户需求的计算机系统。客户期待的是由计算机带来的 IT 解决方案,而并非计算机技术。能满足需求且稳定地工作,这样的计算机系统正是被客户所需要的。

处于正常运转状态的比率叫作“设备利用率”。将计算机系统的构成要素设成多机备份,可以出乎意料地大幅度提升设备利用率。

在个人项目中的应用,最后项目部署阶段几个方案:

1、搞一个入门云服务器,然后部署这些服务。

2、或者自己做一个 docker 包,然后在另一个docker中部署-需要学习 docker commit 等

3、直接在另一个设备中,拉下开源的代码,然后部署上述的服务(可以是虚拟机,或者是另一个 mac 终端等等)。


Last update: November 9, 2024