# 计算机科学速成课

在这个系列中,我们要跟踪我们的现代计算机的起源,讨论如何以及为什么我们的智能设备发展得越来越聪明!

在此过程中,你会更好地了解计算机已经带我们走了多远,以后也能继续带我们走向未来。

# 学习资料

计算机科学速成课 - [美]微软 - Bilibili (opens new window)

# 1.计算机早期历史

  1. 最早的计算设备是算盘,用二进制配合五进制来组成十进制,在一些老的药店还能看到 TA 的身影。
  2. Computer 这个单词最早指代的其实是进行计算的工作人员,随着计算机器的发展,人们开始利用计算机来进行运算,这个词慢慢的变成了指代计算机。
  3. 用于计算的机器里比较有名的是:步进计算器,是第一个可以做加减乘除的机器。
  4. 二战时期为了炮弹能够精准命中,需要对弹道进行计算,当时是通过查表来做的,每次改动火炮的设计就需要重新做一张新的表。
  5. 巴贝奇提出了“差分机”概念,在实际构造差分机期间,想出了分析机,分析机是通用计算机。
  6. Lovelace 给分析机写了假象程序(可能说的是伪代码?),因此成为了第一位程序员。所以说世界上的第一个程序员其实是程序媛。此外也比较出名的女工程师(科学家)还有 WiFi 之母——海蒂拉玛。
  7. 美国建国后进行人口普查,10 年一次,但是当时如果单纯的靠统计局的人力计算却至少需要 12 年。Herman Hollerith 的打孔卡片制表机大大的提升了效率,这种输入数据的方式也是早期计算机编程的主要方法。

# 2.电子计算机

  1. 1944 年,IBM 制造了第一台 自动按序控制计算器 ——Mark 1 号,这是一台继电器计算机。
  2. 继电器开关一秒钟最多开关 50 次,效率很低,现在还有一些古老的电磁式阵列显示器,利用电磁方式翻转卡牌,形成动态图像,bilibili 上还有人用这种“显示器”做出了”坏苹果“。
  3. 继电器经常因为虫子钻进去导致逻辑门损坏,这就是 BUG 的由来。
  4. 1904 年,这时就已经出现了真空管——热电子管,改进后能达到和继电器一样的功能。
  5. 英国在二战期间为了破译德军密码建造了巨人 1 号,首次大规模使用真空管。
  6. 1946 年,宾大的 ENIAC 是第一个通用可编程计算机。
  7. 1947 年,贝尔实验室做出了晶体管。
  8. 硅谷的典故:很多晶体管和半导体的开发都是在这里做的。而生产半导体最主要的材料就是硅。
  9. 后续的发展:肖克利半导体——仙童半导体——因特尔(民间戏称牙膏厂)。

# 3.逻辑代数和逻辑门

  1. 计算机其实可以是任意进制的,早期的计算机有二进制也有三进制,但是显然二进制更容易实现和纠错,因此最终二进制占据了主流。
  2. 逻辑的三个基本操作,与、或、非,通过这三个逻辑的组合能形成任意的逻辑。注意如果只是线性组合,是不能够形成触发器的。触发器需要后面的逻辑来影响前面才能完成,有了触发器就能存储数据了。
  3. 与非门很重要,单纯的利用与非门这一种逻辑门就能形成与、或、非三种逻辑,进而形成任意逻辑,甚至可以说与非门创万物啊。其实但凡是两种以上基本逻辑组成的逻辑门都可以组合成任意逻辑。
  4. 异或门很重要,这是形成加法的重要逻辑,有了加法自然也就有了减法,做多次减法或加法也就形成了除法和乘法。加减乘乘除有了,就可以做离散形式的“积分”、“微分”、”卷积“”矩阵“运算,配合模拟电路就能做出连续的积分微分以及卷积运算。
  5. 回到逻辑门的物理实现,实际上是利用半导体的非线性特性来形成二分的 1、0 逻辑,进而组合成计算机领域的线性运算,Amazing!!

# 4.二进制专题

  1. 不同的进制转换成二进制需要用到除法,其中最典型的是十进制转二进制,除到商为 0 为止,再把各项余数倒序排列,其中倒序刚好利用了栈的结构,实际在汇编中也是这样实现的。
  2. 计算机中的数主要是转换成补码进行运算的,这样能把符号一起进行二进制运算,还能把减法转换成加法运算,运算溢出时,数值位也能很好的保存。
  3. 美国信息交换标准码——ASCII,用来表示字符
  4. 1992 年,UNICODE 码诞生,是字符编码标准,解决了 ASCII 不够表达所有语言的问题,常用的字符集是 UTF-8,此外还有 UTF-16 能够表示更多的字符。

# 5.算数逻辑单元

  1. ALU 算数逻辑单元,比较出名的 ALU 芯片是因特尔 74181,现在在 Windows 端可以通过 Proteus 软件对这个芯片进行电路仿真。
  2. 半加器:处理 1 个 bit,2 个输出。全加器:处理 1 个 bit,3 个输入,多的一个是进位。将多个全加器组合就想成了带进位的多位加法器
  3. 逻辑单元:举例一个逻辑电路——检测数字是否为 0 的电路,数字电路入门实验——抢答器的基本原理就是如此。
  4. 算术单元和逻辑单元常常看做一起,叫做算术逻辑单元 ALU,抽象成一个 V 的符号。在 ALU 中最主要的输出判据是 Flag 标志寄存器,其中存放了程序当前执行的各种信息,比如当前计算是否移除,两数是否相等,等等。

# 6.寄存器和内存

  1. 存储的最基本概念是一个 bit,其物理实现是一个叫做触发器的东西,用触发器原理设计成一个能稳定存储数据的物理单元叫做锁存器,一般习惯将 8 bit 的二进制数存在一起,这个 8 位的锁存器又叫寄存器。寄存器是 CPU 中交换数据最快的地方。
  2. 通过多个寄存器的矩阵组合,能形成比如 16 X 16 的 256 位寄存器,这些寄存器还能进一步组合,形成更大的存储单元,大片的存储单元通过数据选择器来定位单个锁存器,更大的存储单元通过这种结构又能进一步扩大,这就是内存的分页。
  3. 一条 1980 年的内存,只有 1 M 的大小,这已经是当时最先进的技术了
  4. 32 位机说明地址线有 32 根,2 的 32 次方就是 4 G,这也是 32 系统只支持 4G 内存的原因,4G 是数量,单位是字节,1 type = 8 bit;

# 7.中央处理器

  1. 最基本的 CPU = RAM + Register + ALU;复杂的 CPU 还提供各种专用的解码,AI 算法电路等
  2. 一条指令要执行要经过 3 个阶段:取指令、译码、执行,每个阶段都要花费一个机器周期
  3. 在指令执行机构的基础上,进行”华罗庚烧水式“的优化,就有了指令流水线,让两条指令流水线错位运行,来提高指令的执行效率。
  4. CPU 的运行速率,取决于 CPU 时钟频率,时钟频率由内部晶体振荡器提供,现代计算机又将此细分为主频和倍频,晶振产生主频,再通过倍频器产生不同的频率,供给到需要运行在不同工作频率的电路。
  5. 超频提升性能,降频节省能源,现代化的处理器一般都带有睿频技术,能够在用户需要的时候自动提升和降低频率。

# 8.指令和程序

  1. CPU 的架构决定了 TA 能使用怎样的指令,这些指令的集合就叫做指令集,比如 AVX 指令集,这个指令集能够大大的提高虚拟机,模拟器等利用虚拟化技术的软件的运行效率。
  2. 根据指令集的复杂程度,将 CPU 分为了复杂指令集,代表有 Intel X86,和简单指令集,代表有 ARM 和 MIPS。
  3. 汇编程序,常见的有 MOV 和 JUMP,前者是进行数据的转移,后者能让程序进行跳转,这两条指令是高级语言们进行赋值,条件,循环语句的基本。
  4. 真正的现代 CPU 拥有更多的指令集,位数更长。1971 年的因特尔 4004 处理器,有 46 个指令集,而现代的酷睿 i7,有上千条指令。另外其实现在 I9 都出来很久了。

# 9.高级 CPU 设计

  1. 早期为了提高计算机 CPU 的性能,直接简单粗暴的通过提升晶振频率来获得,在农企 AMD 和牙膏厂 Intel 早些年的争锋中,常常出现这样的操作。
  2. 给 CPU 设计专门的运算电路来专门处理一些复杂的操作,比如游戏,视频解码,这也是某某 CPU 或者某某显卡对一些游戏具有玄学加成的原因。
  3. 给 CPU 设计多级缓存,并提高缓存的大小,提高数据存取速度,在服务器上,甚至对内存都有这种类似设计,缓存的存在能提前将硬盘和内存中的数据运送到靠近 CPU 更近的地方,这也是服务器电脑能快速吞吐大量数据的物理内核。
  4. 流水线的设计和并行处理能够提高 CPU 执行指令的效率,乱序执行、推测执行、分支预测等技术则进一步的提高指令的执行效率,这些都是在指令架构上的优化。
  5. 把多个 ALU,多个 Core,集成到一块芯片上,来提高单个芯片的性能。其中将多个 CPU 核心集成的技术,又被民间戏称为胶水技术。
  6. 多个芯片通过多路主板进行交火运算,多个主板又能再次联立,最终形成超大规模的计算机阵列,又叫做超级计算机,拥有相当庞大的计算能力和耗电能力。关于多个芯片交火和计算机阵列所需要的知识已经很难想象了。
  7. 我国比较出名的超算有:天津的“天河一号”、广州的“天河二号”、无锡的“神威太湖之光”。

# 10.早期的编程方式

  1. 给机器编程的需求早在计算机出现之前就有了。
  2. 早期给计算机编程的方式是打孔纸带,想要修改程序的时候就用胶带将需要封住的孔给封住。
  3. 计算机大神——冯·诺依曼,提出了冯诺依曼架构,又称普林斯顿架构,这是现在通用计算机的主流架构,此外还有哈弗大学的哈弗架构。
  4. 现代化的一些 CPU 综合了冯式架构和哈弗架构,在内部利用冯式结构数据线地址线复用的特点,提高资源的体用效率,在外部使用哈弗结构,数据和逻辑运算分开,方便简单指令集的的实现,为高级语言的设计带来方便。
  5. 第一款取得商业成功的家用计算机:Altair 8800,这是一个组装电脑的套件,很多计算机大神的早期经历都和这台计算机有关,比如乔布斯就是靠它发家的。
  6. 虽然这时的计算机可以进行编程了,但是使用晦涩的汇编语言进行编程依然很困难,人们需要更加友好简单的方式来进行编程。

# 11.编程语言发展史

  1. 最开始编程,直接使用的二进制,现在纸上写伪代码,然后手工转换成二进制的机器码
  2. 后来有了助记符,用助记符来写代码,然后通过汇编器来把助记符转换成二进制的机器码,这就是汇编语言
  3. Grace 是哈弗 1 号计算机的首批程序员,海军军官,TA 设计了编程语言 A-0,同期还有 FORTRAN 语言,这些都不是通用编程语言。
  4. 后来慢慢的出现了通用编程语言,通用编程语言的口号是,一次编写到处运行,初期代表有 ALGOL, LISP, BASIC, Pascal, C, Smalltalk
  5. 再后来就是 C++, Objective-C, Perl, Python, Ruby, Java.....这些编程语言除了汇编以外都称为高级语言,大多数高级语言都是通过编译器转换成汇编语言,再通过汇编器将汇编代码转换成机器码。

# 12.编程基础-语句和函数

  1. 作为一门编程语言的基本共同点有:变量,赋值,条件判断,循环以及函数等。
  2. 函数-方法-子程序,这几个概念是相近的,将一系列的函数写成单独的文件,称为函数的封装,利用引入,导入,连接等方法可以调用这些封装的函数,功能完备且受人认可的封装,称之为库,利用库我们能更快速的实现想要的功能。

# 13.算法入门

  1. 程序是用来解决实际问题的,解决问题的方法有很多,但有的方法效率高,有的方法效率低,为了衡量程序的效率,我们对程序的效率从空间和时间两个方方面进行考量,这就是程序算法的空间复杂度和时间复杂度。
  2. 对算法复杂度的考量不需要过于精确,在数学上我们用大 O 表示法,来表示算法复杂度的数量级。
  3. 最经典的问题是对数组元素的排序,典型的排序算法有,冒泡排序,选择排序,快速排序和归并排序,这四种排序算法是任何计算机从业者都需要掌握的最基本排序算法。
  4. 为了应对不同的实际问题,人们需要设计了不同的数据结构,来高效的表示需要处理的数据,其中最典型的数据结构有,链表,堆栈,队列,二叉树,以及图
  5. 迪杰斯特拉算法是荷兰科学家迪杰斯特拉在 1959 年提出的,是从一个顶点到其余各顶点的最短路径算法。核心思路是采用贪心的策略,每次遍历到起始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。这个算法可以类比成排序中的冒泡算法,是图算法的入门经典。

# 14.数据结构

  1. 数组 Array 字符串 String 矩阵 Matrix 结构体 Struct 指针 Pointer
  2. 节点 Node 链表 Linked List 队列 Queue 栈 Stack 堆 Heap 树 Tree 二叉树 Binary Tree 图 Graph 红黑树 Red-Black-Tree

# 15.阿兰·图灵

  1. 阿兰·图灵,计算机科学之父,人工会智能之父,提出了图灵机的概念,揭示了计算机的运行原理,为现代计算机的逻辑工作方式奠定了基础。
  2. 图灵测试,图灵提出的一种用于判断机器是否具有智能的实验方法,也是对智能这一概念的操作性定义。PS:至今人们都未能给出关于智能这一概念准确的描述性定义。
  3. 图灵奖,一年一评,是计算机界最负盛名,最崇高的一个奖项。
  4. 停机问题,是逻辑数学中可计算性理论的一个问题,判断一个程序是否能在有限时间内结束的问题,本质上是一个高阶逻辑的不自洽性和不完备性,因此不存在能解决停机问题的方法。
  5. 哥德尔不完备性第一定理,任何一个包含一阶逻辑和初等数论的形式系统,都至少存在一个命题,TA 在这个系统中既不能证明,也不能证伪。PS:这似乎就是不可知论的一个强有力的论据

# 16.软件工程

  1. 软件工程讲的是一个关于合作开发软件的故事,软件工程这门新科学,解决的是大型软件中各个部门各个员工协同合作中产生的问题。
  2. 关于软件工程需要了解的概念属于有:
    • 面对对象编程 OOP Object Oriented Programing
    • 应用程序接口 API Application Programing Interface
    • 继承开发环境 IDE Integrated Development Environments
    • 调试 debugging 文档 readme 注释 comment
    • 代码复用性 code reuse 版本控制 version contral 代码仓库 code repository
    • 质量保证测试 Quality Assurance Testing 内部版本 alpha 测试版本 beta

# 17.集成电路与摩尔定律

  1. 集成电路,采用一定工艺把一个电路中所需的分立元件及布线连在一起,制成一小块半导体晶片,然后封装,称为具有一定功能的单独的微型结构。
  2. 数字暴政,1960 年代计算机工程师遇到的问题,意思是如果想加强电脑性能,就需要更多的部件,更多的线路,这会让电路变得更加复杂,很难处理
  3. 摩尔定律,英特尔创始人之一 Gordon Moore 提出的,当价格不变时,集成电路可容纳的元器件的数目,每个 18-24 个月就会翻一倍
  4. 摩尔定律遇到瓶颈,电路小型化到一定程度,就会遇到一个严重的瓶颈,目前这个瓶颈的主要因素有:
    • 光刻机产生的光不足以制作更精细的设计,需要能够产生更短波长光的技术,比如极紫外光刻
    • 尺寸达到微观领域,电子会发生量子隧穿效应,导致逻辑错误

# 18.操作系统

  1. 操作系统 Operating systems,简称 OS,也是一个软件,但它有操作硬件的特殊权限,可以运行和管理其他程序。
  2. 批处理 Batch processing,让程序一个接一个运行,而不用手动操作
  3. 随着计算机变便宜变多,不同计算机有不同配置,写程序处理不同硬件细节很痛苦,因此操作系统负责抽象硬件,充当软件和硬件之间的媒介。
  4. 操作系统提供 API 来抽象硬件,叫设备驱动程序 Device drivers。
  5. 多任务处理 Multitasking,计算机性能越来越强,为了浪费性能,让多个程序可以在同时间段内运行。
  6. 多个程序运行,切换时数据不能发生丢失,因此每个程序都需要有自己能控制的内存。但是数据在内存中的分配是非常复杂的,操作系统能够将这个部分进行抽象,叫做虚拟内存。它假定内存始终从 0 地址开始,且是连续的。
  7. 内存保护 Memory Protection
  8. 1970 年代,计算机足够便宜,大学买了让学生用,多个学生用多个 "终端" 连接到主机,为了让每个用户的操作不冲突开发了多用户分时操作系统

# 19.内存&储存介质

  1. 纸卡 Paper punch cards
  2. 延迟线存储器 Delay Line Memory
  3. 磁芯 Magnetic Core Memory
  4. 磁带 Magnetic Tape
  5. 磁鼓 Magnetic Drum Memory
  6. 硬盘 Hard Disk Drives
  7. 内存层次结构 Memory Hierarchy
  8. 软盘 Floppy Disk
  9. 光盘 Compact Disk
  10. 固态硬盘 SSD Solid State Drives

# 20.文件系统

  1. 文件格式:可以随便存文件数据,但按格式存会更方便
  • TXT 文本文件:ASCII
  • WAV 音频文件:每秒上千次的音频采样数字
  • BMP 图片文件:像素的红绿蓝 RGB 值
  1. 文件系统:很早期时空间小,整个存储器就像一整个文件。后来随容量增长,多文件非常必要
  2. 目录文件:用来解决多文件问题,存其他文件的信息,比如开头,结尾,创建时间等
  3. 平面文件系统 - Flat File System:文件都在同一个层次,早期空间小,只有十几个文件,平面系统够用

如果文件紧密的一个个前后排序会造成问题,所以文件系统会:

  • 把空间划分成一块块
  • 文件拆分存在多个块里
  1. 碎片整理:文件的增删改查会不可避免的造成文件散落在各个块里,如果是磁带这样的存储介质就会造成问题,所以做碎片整理
  2. 分层文件系统 - Hierarchical File System:有不同文件夹,文件夹可以层层嵌套

# 21.数据压缩

  1. 压缩的好处是能存更多文件,传输也更快
  2. 游程编码 Run-Length Encoding 无损压缩 Lossless compression 霍夫曼树 Huffman Tree
  3. "消除冗余"和"用更紧凑的表示方法",这两种方法通常会组合使用
  4. 字典编码 Dictionary coders 游程编码 和 字典编码 都是无损压缩
  5. 感知编码 Perceptual coding 有损压缩 jpeg 格式 时间冗余 Temporal redundancy MPEG-4 视频编码

# 22. 命令行界面 CLI

  1. 计算机早期同时输入程序和数据(用纸卡/纸带)运行开始直到结束,中间没有人类进行操作,原因是计算机很贵,不能等人类慢慢输入,执行完结果打印到纸上
  2. 到 1950 年代,计算机足够便宜+快,人类和计算机交互式操作变得可行
  3. 为了让人类输入到计算机,改造之前就有的打字机,变成电传打字机
  4. 到 1970 年代末,屏幕成本足够低,屏幕代替电传打字机,屏幕成为标配

# 23. 屏幕与 2D 显示

  1. 显像管到液晶屏幕
  2. 位图和矢量图

# 24. 冷战和消费主义

  1. 1950 年,收音机大卖,索尼做了晶体管收音机,为日本半导体崛起埋下种子
  2. 1961 年,苏联加加林进入太空,美国提出登月,NASA 预算大大增加,计划用集成电路制作登月计算机,后来又建造超级计算机,进一步推动集成电路发展,70 年代,冷战渐消,行业开始衰败,英特尔转型做处理器。
  3. 政府和消费者推动了计算机的发展,早期靠政府资金,让技术发展到足够商用,然后让消费者购买商用产品继续推动产品发展

# 25.个人计算机革命

  1. 基本就是乔布斯和比尔盖斯的发家史

# 26.图像用户界面 UI

  1. 依旧是乔布斯和比尔盖斯的发家史

# 27.3D 图形 Graphic

  1. 2D 的电脑屏幕上不可能有 XYZ 立体坐标轴,所以有图像算法负责把 3D 坐标“拍平”显示到 2D 屏幕上,这叫“3D 投影”
  2. 正交投影,透视投影,多边形绘图,像素填充度,三角形用最少的点来描述一个平面的几何属性,
  3. 抗锯齿——边缘颜色渐变,画家算法——由远到近渲染,背面剔除——忽略背面,减少一半的多边形计算

# 28.计算机网络 Network

  1. 1970 年以前,大多数计算机是独立运行的,随着计算机的普及,计算机数量不断增多,分享数据和资源变得急需,于是首个计算机网络诞生了。
  2. 第一个计算机网络出现在 1950-1960 年代,通常在公司或者研究室内部使用,这种网络当时叫做球鞋网络。
  3. 计算机近距离构成的小型网络叫局域网,Local Area Networks 简称 LAN,用到的技术叫做“以太网”。
  4. 为了确定设备之间的数据交互,给每台计算机配备了唯一的媒体访问控制地址,Media Access Control address,简称 MAC 地址。
  5. 多台电脑共享一个传输媒介,这种方法叫做载波侦听多路访问,简称 CSMA,很多计算机同时侦听载体,载体传输数据的速度叫“带宽”。
  6. 计算机在数据传输期间检测到冲突时,会每隔一段时间再次检测是否可以传输,其等待时间与前一段时间成比例关系,因而也叫做指数退避,指数退避降低了冲突次数,使得网络变得通畅。
  7. 为了减少冲突和提升效率,我们需要减少同一载体中设备的数量,载体和其中的设备总称为“冲突域”,交换机干的事情就是划分冲突域。
  8. 从一个地点到另一个地点通常有多条线路,这就引出了路由,路由器通过转发数据包来事件网络互连,数据传输可以用不同路由使通信更可靠更能容错,当数据包太大的时候,将数据包分成多个小数据,每个小数据可以走不同的路线进行传输,通过 TCP/IP 协议可以解决数据包之间的顺序问题。

# 29.互联网 Internet

  1. 每个人的计算机都和一个巨大的分布式网络连在一起,这个网络就是互联网,个人计算机在路由器的局域网下,通过各级路由器可以连接到广域网,广域网的路由器一般属于 ISP(电信,联通等)
  2. Linux 系统traceroute命令,Windows 系统使用tracert命令来查看各级路由,比如tracert baidu.com
  3. 用户数据报协议,简称 UDP,每个想访问网络的程序都要想操作系统申请一个端口号,程序发送的 UDP 数据头中就包含这一信息,比如 Skype 会申请 3478 端口,Nginx 默认申请 80 端口,数据头还包括数据的校验码,用来验证数据的完整性。
  4. UDP 是无连接的传输协议,简单粗暴,只管丢数据,不管数据是否抵达,是否完整,接收方如果得到损坏的数据包一般都是直接丢掉,这属于丢包的一种情况。UDP 的常用场景:即时网络游戏,直播等;
  5. 传输控制协议,简称 TCP,TCP 的数据包是带序号的,序号使得接收方可以把数据排成正确的顺序,TCP 还可以根据确认码的成功率和来回时间,推测网络的拥堵程度,来调整同时发包数量,解决拥堵问题,TCP 丢包的时候,需要重新发送数据包,以保证数据的完整性。
  6. 基于 IP 和端口就可以访问服务器上的服务了,但是非常的不方便记忆和使用,因此需要给不同的服务器地址起个名字,这就是域名,域名和 IP 对应,浏览器先访问本地 DNS 缓存,如果未匹配就向上一级网络的计算机(服务器)寻找,直到找到为止,或者直到在根域名服务器上都找不到,提示网络出错。
  7. 七层网络模型: 物理层,链路层,网络层,传输层,会话层,表示层,应用程序层

# 30.万维网 WWW

  1. 万维网 WWW 是 World Wide Web 的简称,也称为 Web、3W 。万维网的基本单位是单个页面,每个页面可以通过超链接进行跳转。
  2. 为了使网页能相互连接,每个网页需要一个唯一的地址,这个地址叫统一资源定位器,简称“URL”
  3. 使用 TCP/IP 和服务器建立连接后,向服务器请求页面,用到的是超文本传输协议,简称"HTTP",HTTP 的第一个标准是,HTTP0.9,创建于 1991 年,当时只有一个指令——”GET“。
  4. 网页是一个超文本,为了对网页上的内容进行区分,有必要开发一种标记方法,这就是超文本标记语言,简称“HTML”,HTML 第一版的版本号是 0.8,创建于 1990 年,当时只有 18 种标签,现在最新版的 HTML 是 HTML5,有 100 多种标签,每个标签又有着诸多属性。
  5. 浏览器,网页浏览器可以可网页服务器沟通,浏览器不仅获取网页和媒体,获取后还负责渲染和显示,世界上第一个浏览器和服务器是 Tim Berners -Lee 在 1990 年写的,一共花了两个月,他当时在欧洲核子组织工作,在此期间建立了网页的一系列标准,这套标准在 1991 年发布。
  6. 第一个可以显示图片的浏览器——Masaic 浏览器,由伊利诺伊大学香槟分校的一个小组在 1993 年制作,他们还开发了目前最负盛名的开源服务器 Apache。在此之后诸如 Netscape Navigator,Mozilla,IE,Opera 等浏览器也如雨后春笋般出世。
  7. 随着万维网上资源的不断增多,人工编辑资源目录变得极其麻烦,于是人们做出了搜索引擎,长得最像现代搜索引擎的最早搜索引擎是 JumpStation,这个搜索引擎由 Jonathon Fletcher 于 1993 年在斯特林大学开发。搜索引擎由三个部分组成:
    • 第一个是爬虫,一个跟着链接跑的软件,每当看到新链接就加进自己的列表
    • 第二个是索引,记录访问过的网页上出现过那些词,主要收录网页的关键字和语义化内容。
    • 最后一个是查询索引的搜索算法,以保证最相关的网页被列出,并排列靠前。

# 31.计算机安全 Security

  1. 计算机没有“道德”概念,就像“原力”一样,计算机可以被拉到“光明面”或黑暗面。网络安全就像绝地武士团给网络世界带来和平与正义
  2. 我们可以把计算机安全,看成是保护计算机系统数据的保密性,完整性和可用性

TIP

  • 保密性 只有有权限的人才能读取计算机系统和数据
  • 完整性 只有有权限的人才能使用和修改系统和数据
  • 可用性 有权限的人应该可以随时访问系统和数据

为了实现这三个目标,安全专家会从抽象层面想象敌人可能是谁,这叫"威胁模型分析",模型会对攻击者有个大致描述:能力如何,目标可能是什么,可能用什么手段。攻击手段又叫“攻击矢量”。

  1. 身份验证 你是谁
  • What you are, 系统想要知道你是什么,这是最终目的,但很难实现。于是有了下面两个替代方案
  • What you know, 你知道什么 举例:使用密码登录,回答安全验证问题
  • What you have, 你有什么 基于用户有具体的特殊物体 举例:网盾,生物识别,FaceID,验证码

多因素认证 对于重要账户,安全专家建议用两种或两种以上的认证方式

  1. 访问控制 你可以访问什么

Bell-Lapadula 模型 机密信息系统

  • 用户不能“读上”,用户不能读等级更高的信息
  • 用户不能“写下”,防止用户意外泄露更高等级的信息

Biba 模型 军事指挥系统

  • 用户只能创建等于或低于自己完整性级别的内容(将军可以写命令给上校,上校可以将这些命令发给少校。)
  • 用户只能查看其自身完整性级别或以上的内容(一个列兵永远不能向他的中士下达命令,而他的中士可能永远不会向中尉下达命令,这也保护了任务的完整性)
  1. 数据完整性

一般来说,保持数据完整性有三个目标:

  • 防止未经授权的各方修改数据
  • 防止授权方未经授权修改数据
  • 保持内部和外部的一致性(即数据反映真实世界)
  1. 可信计算与沙盒模型

# 32.黑客&攻击 Hack

  1. 社会工程学 Social Engineering,欺骗别人让人泄密信息,或者让别人配置电脑系统,变得易于攻击
  2. 钓鱼 Phishing 钓鱼网站,将网站伪造成真实网站
  3. 假托 Pretexting 制造虚假情形,以迫使针对受害人吐露平时不愿泄露的信息的手段
  4. 木马 Trojan Horses 垃圾邮件附带木马,木马会伪装成无害的东西,比如照片或发票,但实际上是恶意软件
  5. NAND 镜像 NAND Mirroring 如果能物理接触到计算机,可以往内存上接线,将内存中的所有数据复制,复制之后暴力尝试,遇到系统等待时导入之前复制的数据,然后再次尝试,这样就绕过了等待可以继续进行密码爆破。
  6. 缓冲区溢出 Buffer Overflow 缓冲区是一种概称,指预留的一块内存空间,黑客可以写入大量数据,让数据写入到缓冲区之外,以达到修改程序数据的目的
  7. 边界检查 Bounds Checking 许多现代编程语言自带了边界检查,程序也会随机存放变量在内存中的位置,这样黑客就不知道应该覆盖内存的那个位置的数据了
  8. 代码注入 Code Injection 另一个经典的攻击手段,叫代码注入,最常用于攻击用数据库的网站。举例:select password from users where username = 'whatever'; drop table users;
  9. 零日漏洞 Zero Day Vulnerability 当软件制造者不知道软件有新漏洞被发现了,那么这个漏洞就叫“零日漏洞”,保持系统更新非常重要。
  10. 计算机蠕虫 Worms 可以在电脑间相互传播的恶意程序
  11. 僵尸网络 Botnet 如果黑客拿下大量电脑,这些肉鸡电脑可以组成僵尸网络,利用僵尸网络可以达到很多目的,比如发送大量垃圾邮件,使用这些电脑挖取比特币等
  12. 拒绝服务攻击 DDoS 或者使用僵尸网络发起 DDoS 攻击,发送大量垃圾信息到服务器,阻塞服务器

# 33.加密 Cryptography

世界上没有百分百安全的系统,总会有漏洞存在,而且安全专家知道这一点

  1. 多层防御 - Defence in depth 用多层不同的安全机制来阻碍攻击者
  2. 加密 - Encryption,解密 - Decryption 为了加密信息,要用加密算法(Cipher)把明文转为密文,把密文恢复为明文叫“解密”
  3. 凯撒加密 - Caesar cipher 替换加密的一种 替换加密 - Substitution cipher 容易被统计破解
  4. 移位加密 - Permutation cipher 列移位加密 Columnar transposition cipher 矩阵加移位,安全程度增加
  5. Enigma - 英格玛加密机 使用多重替换加密 + (变相的移位加密)替换规则会动态变化
  6. DES - IMB 和 NAS 于 1977 年指定"数据加密标准" - Data Encryption Standard (DES) 使用 56bit 长度的二进制密钥 容易被暴力破解
  7. AES - 2001 年"高级加密标准" - Advanced Encryption Standard (AES) 使用更长的密钥 128/192/256 位 AES 把数据切分一块一块,每块 16 字节,然后使用密钥进行一系列的替换和移位加密,再加上一些其他操作,并且重复 10 次以上,以便在性能和安全间取得平衡
  8. 密钥交换 - Key exchange 到目前为止,上面讨论的加密技术都依赖发送者和接收者知道相同的密钥。我们需要某种方法,在公开的互联网上传递密钥给对方。
  9. 单向函数,单向函数是一种数学操作,很容易算出结果,但是从结果反推输入非常困难
  10. 迪菲-赫尔曼密钥交换 - Diffie-Hellman Key Exchange 在 DH 中,单向函数是模幂运算 B^x mod M = R 已知 B、M、R 很难求解出 x 交换密钥实现加密的原理 (B^y mod M)^x = (B^xy mod M)
  11. 非对称加密 - Asymmetric encryption 一个公钥一个私钥,通信双方交换各自的公钥,然后使用对方的公钥加密,使用自己的私钥解密
  12. 非对称加密算法 目前最主流的非对称加密算法是 RSA

# 34.机器学习与人工智能 ML

  1. 分类 Classification 举例:判断飞蛾是“月蛾”还是“帝蛾
  2. 分类器 Classifier 举例:做分类的算法叫“分类器”
  3. 特征 Feature 很多算法会简化复杂度,把数据简化成“特征”。特征是用来帮助分类的值
  4. 标记数据 Labeled data 为了训练“分类器”做出好的预测,我们需要“训练数据”,为了得到数据,我们需要标记数据。
  5. 决策边界 Decision boundaries 划分分类的判据
  6. 混淆矩阵 Confusion matrix 统计正确分类和错误分类的表格,机器学习算法的目标就是最大化正确的分类和最小化错误的分类
  7. 未标签数据 Unlabeled data
  8. 决策树 Decision tree 支持向量机 Support Vector Machines 基于统计学的算法
  9. 人工神经网络 Artificial Neural Network 基于代数的机器学习算法 输入层-->隐藏层-->输出层 激活函数
  10. 深度学习 Deep learning 隐藏层并非只有一层,深度学习由此得名
  11. 弱 AI Weak AI , 窄 AI Narrow AI,针对特定任务设计的 AI
  12. 强 AI Strong AI , 真正通用的,像人一样聪明的 AI
  13. 强化学习 Reinforcement Learning

# 35.计算机视觉 CV

  1. 视觉是信息最多的感官,半个世纪来,计算机科学家一直在想办法让计算机有视觉。
  2. 图像是像素组成的网格,每个像素的颜色,通过三种基色来定义,通过组合三种颜色的强度可以得到任何颜色。
  3. 颜色跟踪算法是一个一个像素检测,不适合检测占多个像素的特征,比如物体的边缘。
  4. 为了识别物体的边缘,算法要一块块的去处理,比如检测垂直边缘的算法,我们可以将图像转为灰度图,然后找到水平像素差异较大的地方。我们利用一组像素来组合核/过滤器 kernel or filter 来进行运算,把核上的数据应用于像素块,这种操作就叫卷积 convolution
  5. Prewitt 算子 Prewitt Operators,用途:边缘增强卷积核
    突出垂直边缘
    -1  0  1
    -1  0  1
    -1  0  1
    
    突出水平边缘
    -1 -1 -1
    0  0  0
    1  1  1
    
    锐化图像
    -1 -1 -1
     1  9 -1
    -1 -1 -1
    
    模糊图像
    .003 .013 .022 .013 .003
    .013 .069 .097 .059 .013
    .022 .097 .159 .097 .022
    .013 .069 .097 .059 .013
    .003 .013 .022 .013 .003
    
  6. 维奥拉·琼斯 人脸检测算法 Viola-Jones Face Detection 集合多个特征的组合
  7. 卷积神经网络 Convolutional Neural Networks 基于神经网络每层使用卷积运算
  8. 算法识别出脸之后,可以进一步用其他算法定位面部标志,如眼睛和眉毛具体位置,从而判断心情等信息,跟踪全身的标记点,如肩部,手臂等

# 36.自然语言处理 NLP

  1. 让计算机拥有语音对话的能力,这个想法从构思计算机时就有了,“自然语言处理”因此诞生,简称 NLP
  2. 词性 Parts of speech 短语结构规则 Phrase structure rules 用于代表自然语言的语法规则;分析树 Parse tree 表明句子的结构,单词可能的词性
  3. Knowledge Graph 知识图谱
  4. 语音识别 Speech recognition 第一个语音数字识别器 Audrey
  5. 谱图 Spectrogram
  6. 快速傅立叶变换 Fast Fourier Transform 波形到频率的转换
  7. 音素 Phonemes 利用音频特征定义的基本单元 语音合成 Speech Synthesis
  8. 语音界面 Voice User Interface

# 37.机器人 Reboot

  1. 我们经常把机器人看成是未来科技,但事实是:机器人时代已经到来了,机器人帮助我们完成困难的工作
  2. 机器人是由计算机控制,可以自动执行一系列动作的机器
  3. 有时我们叫虚拟任务为“机器人”,但叫“Bot”或者“Agent”会更合适,因为机器人的潜在含义是存在于现实世界中的机器
  4. 自动机,法国吃饭鸭 - Digesting Duck, Canard Digerateur
  5. 土耳其行棋傀儡, 下国际象棋,其实是骗局
  6. 第一台计算机控制的机器出现在 1940 年代晚期,叫数控机器, Computer Numerical Control(CNC)
  7. 1960 年 Unimate,第一个商业贩卖的可编程工业机器人
  8. 简单控制回路 simple control loop 负反馈回路 negative feedback loop
  9. 比例-积分-微分控制器 Proportional–Integral–Derivative controller PID 控制器
  10. 机器人三定律 Three Laws of Robotics

# 38.计算机心理学

  1. 为了愉快的使用计算机,我们需要了解人类心理学,了解计算机和人类的优缺点,做出更好的计算机
  2. 易用度 - Usability 指的是人造物体,比如软件达到目的的效率由多高
  3. 颜色 颜色强度排序 和 颜色排序
  4. 分组 分组能够让信息更好记,比如电话号码 317-555-3897 比 3175553897 好记
  5. 直观功能 - Affordances 直观的东西广泛应用于 GUI,与之对应的心理学概念是认出 vs 回想 Recognition vs Recall
  6. 让机器有一定情商以及 Facebook 的研究,比如用软件修正注视位置。让视频通话时看起来像盯着对方,而不是盯着下方
  7. 恐怖谷理论,把机器人做的像人
  8. 有很多开放式的问题,心理学帮助我们明白不同选择可能带来的影响

# 39.教育科技

  1. 1913 年 爱迪生预言:“书籍很快会过时.. 用影片来教授所有知识是可能的”,他的预言没有成真,但视频教学确实越来越流行了
  2. 视频教学的优点,通过调速,暂停等技巧,加强学习效率
  3. 大型开放式在线课程 - Massive Open Online Courses (MOOC)
  4. 智能辅导系统 - Intelligent Tutoring Systems 贝叶斯知识追踪 Bayesian knowledge tracing
  5. 教育数据挖掘 Educational Data Mining

# 40.计算机的未来

  1. 把工作分为 4 个象限,讨论自动化带来的影响
  • 重复性手工工作 已经被替代
  • 非重复性手工工作
  • 重复性思维工作
  • 非重复性思维工作 暂时安全
  1. 机器人的存在时间可能长过人类,可以长时间探索宇宙