# 计算机科学速成课
在这个系列中,我们要跟踪我们的现代计算机的起源,讨论如何以及为什么我们的智能设备发展得越来越聪明!
在此过程中,你会更好地了解计算机已经带我们走了多远,以后也能继续带我们走向未来。
# 学习资料
计算机科学速成课 - [美]微软 - Bilibili (opens new window)
# 1.计算机早期历史
- 最早的计算设备是算盘,用二进制配合五进制来组成十进制,在一些老的药店还能看到 TA 的身影。
- Computer 这个单词最早指代的其实是进行计算的工作人员,随着计算机器的发展,人们开始利用计算机来进行运算,这个词慢慢的变成了指代计算机。
- 用于计算的机器里比较有名的是:步进计算器,是第一个可以做加减乘除的机器。
- 二战时期为了炮弹能够精准命中,需要对弹道进行计算,当时是通过查表来做的,每次改动火炮的设计就需要重新做一张新的表。
- 巴贝奇提出了“差分机”概念,在实际构造差分机期间,想出了分析机,分析机是通用计算机。
- Lovelace 给分析机写了假象程序(可能说的是伪代码?),因此成为了第一位程序员。所以说世界上的第一个程序员其实是程序媛。此外也比较出名的女工程师(科学家)还有 WiFi 之母——海蒂拉玛。
- 美国建国后进行人口普查,10 年一次,但是当时如果单纯的靠统计局的人力计算却至少需要 12 年。Herman Hollerith 的打孔卡片制表机大大的提升了效率,这种输入数据的方式也是早期计算机编程的主要方法。
# 2.电子计算机
- 1944 年,IBM 制造了第一台 自动按序控制计算器 ——Mark 1 号,这是一台继电器计算机。
- 继电器开关一秒钟最多开关 50 次,效率很低,现在还有一些古老的电磁式阵列显示器,利用电磁方式翻转卡牌,形成动态图像,bilibili 上还有人用这种“显示器”做出了”坏苹果“。
- 继电器经常因为虫子钻进去导致逻辑门损坏,这就是 BUG 的由来。
- 1904 年,这时就已经出现了真空管——热电子管,改进后能达到和继电器一样的功能。
- 英国在二战期间为了破译德军密码建造了巨人 1 号,首次大规模使用真空管。
- 1946 年,宾大的 ENIAC 是第一个通用可编程计算机。
- 1947 年,贝尔实验室做出了晶体管。
- 硅谷的典故:很多晶体管和半导体的开发都是在这里做的。而生产半导体最主要的材料就是硅。
- 后续的发展:肖克利半导体——仙童半导体——因特尔(民间戏称牙膏厂)。
# 3.逻辑代数和逻辑门
- 计算机其实可以是任意进制的,早期的计算机有二进制也有三进制,但是显然二进制更容易实现和纠错,因此最终二进制占据了主流。
- 逻辑的三个基本操作,与、或、非,通过这三个逻辑的组合能形成任意的逻辑。注意如果只是线性组合,是不能够形成触发器的。触发器需要后面的逻辑来影响前面才能完成,有了触发器就能存储数据了。
- 与非门很重要,单纯的利用与非门这一种逻辑门就能形成与、或、非三种逻辑,进而形成任意逻辑,甚至可以说与非门创万物啊。其实但凡是两种以上基本逻辑组成的逻辑门都可以组合成任意逻辑。
- 异或门很重要,这是形成加法的重要逻辑,有了加法自然也就有了减法,做多次减法或加法也就形成了除法和乘法。加减乘乘除有了,就可以做离散形式的“积分”、“微分”、”卷积“”矩阵“运算,配合模拟电路就能做出连续的积分微分以及卷积运算。
- 回到逻辑门的物理实现,实际上是利用半导体的非线性特性来形成二分的 1、0 逻辑,进而组合成计算机领域的线性运算,Amazing!!
# 4.二进制专题
- 不同的进制转换成二进制需要用到除法,其中最典型的是十进制转二进制,除到商为 0 为止,再把各项余数倒序排列,其中倒序刚好利用了栈的结构,实际在汇编中也是这样实现的。
- 计算机中的数主要是转换成补码进行运算的,这样能把符号一起进行二进制运算,还能把减法转换成加法运算,运算溢出时,数值位也能很好的保存。
- 美国信息交换标准码——ASCII,用来表示字符
- 1992 年,UNICODE 码诞生,是字符编码标准,解决了 ASCII 不够表达所有语言的问题,常用的字符集是 UTF-8,此外还有 UTF-16 能够表示更多的字符。
# 5.算数逻辑单元
- ALU 算数逻辑单元,比较出名的 ALU 芯片是因特尔 74181,现在在 Windows 端可以通过 Proteus 软件对这个芯片进行电路仿真。
- 半加器:处理 1 个 bit,2 个输出。全加器:处理 1 个 bit,3 个输入,多的一个是进位。将多个全加器组合就想成了带进位的多位加法器
- 逻辑单元:举例一个逻辑电路——检测数字是否为 0 的电路,数字电路入门实验——抢答器的基本原理就是如此。
- 算术单元和逻辑单元常常看做一起,叫做算术逻辑单元 ALU,抽象成一个 V 的符号。在 ALU 中最主要的输出判据是 Flag 标志寄存器,其中存放了程序当前执行的各种信息,比如当前计算是否移除,两数是否相等,等等。
# 6.寄存器和内存
- 存储的最基本概念是一个 bit,其物理实现是一个叫做触发器的东西,用触发器原理设计成一个能稳定存储数据的物理单元叫做锁存器,一般习惯将 8 bit 的二进制数存在一起,这个 8 位的锁存器又叫寄存器。寄存器是 CPU 中交换数据最快的地方。
- 通过多个寄存器的矩阵组合,能形成比如 16 X 16 的 256 位寄存器,这些寄存器还能进一步组合,形成更大的存储单元,大片的存储单元通过数据选择器来定位单个锁存器,更大的存储单元通过这种结构又能进一步扩大,这就是内存的分页。
- 一条 1980 年的内存,只有 1 M 的大小,这已经是当时最先进的技术了
- 32 位机说明地址线有 32 根,2 的 32 次方就是 4 G,这也是 32 系统只支持 4G 内存的原因,4G 是数量,单位是字节,1 type = 8 bit;
# 7.中央处理器
- 最基本的 CPU = RAM + Register + ALU;复杂的 CPU 还提供各种专用的解码,AI 算法电路等
- 一条指令要执行要经过 3 个阶段:取指令、译码、执行,每个阶段都要花费一个机器周期
- 在指令执行机构的基础上,进行”华罗庚烧水式“的优化,就有了指令流水线,让两条指令流水线错位运行,来提高指令的执行效率。
- CPU 的运行速率,取决于 CPU 时钟频率,时钟频率由内部晶体振荡器提供,现代计算机又将此细分为主频和倍频,晶振产生主频,再通过倍频器产生不同的频率,供给到需要运行在不同工作频率的电路。
- 超频提升性能,降频节省能源,现代化的处理器一般都带有睿频技术,能够在用户需要的时候自动提升和降低频率。
# 8.指令和程序
- CPU 的架构决定了 TA 能使用怎样的指令,这些指令的集合就叫做指令集,比如 AVX 指令集,这个指令集能够大大的提高虚拟机,模拟器等利用虚拟化技术的软件的运行效率。
- 根据指令集的复杂程度,将 CPU 分为了复杂指令集,代表有 Intel X86,和简单指令集,代表有 ARM 和 MIPS。
- 汇编程序,常见的有 MOV 和 JUMP,前者是进行数据的转移,后者能让程序进行跳转,这两条指令是高级语言们进行赋值,条件,循环语句的基本。
- 真正的现代 CPU 拥有更多的指令集,位数更长。1971 年的因特尔 4004 处理器,有 46 个指令集,而现代的酷睿 i7,有上千条指令。另外其实现在 I9 都出来很久了。
# 9.高级 CPU 设计
- 早期为了提高计算机 CPU 的性能,直接简单粗暴的通过提升晶振频率来获得,在农企 AMD 和牙膏厂 Intel 早些年的争锋中,常常出现这样的操作。
- 给 CPU 设计专门的运算电路来专门处理一些复杂的操作,比如游戏,视频解码,这也是某某 CPU 或者某某显卡对一些游戏具有玄学加成的原因。
- 给 CPU 设计多级缓存,并提高缓存的大小,提高数据存取速度,在服务器上,甚至对内存都有这种类似设计,缓存的存在能提前将硬盘和内存中的数据运送到靠近 CPU 更近的地方,这也是服务器电脑能快速吞吐大量数据的物理内核。
- 流水线的设计和并行处理能够提高 CPU 执行指令的效率,乱序执行、推测执行、分支预测等技术则进一步的提高指令的执行效率,这些都是在指令架构上的优化。
- 把多个 ALU,多个 Core,集成到一块芯片上,来提高单个芯片的性能。其中将多个 CPU 核心集成的技术,又被民间戏称为胶水技术。
- 多个芯片通过多路主板进行交火运算,多个主板又能再次联立,最终形成超大规模的计算机阵列,又叫做超级计算机,拥有相当庞大的计算能力和耗电能力。关于多个芯片交火和计算机阵列所需要的知识已经很难想象了。
- 我国比较出名的超算有:天津的“天河一号”、广州的“天河二号”、无锡的“神威太湖之光”。
# 10.早期的编程方式
- 给机器编程的需求早在计算机出现之前就有了。
- 早期给计算机编程的方式是打孔纸带,想要修改程序的时候就用胶带将需要封住的孔给封住。
- 计算机大神——冯·诺依曼,提出了冯诺依曼架构,又称普林斯顿架构,这是现在通用计算机的主流架构,此外还有哈弗大学的哈弗架构。
- 现代化的一些 CPU 综合了冯式架构和哈弗架构,在内部利用冯式结构数据线地址线复用的特点,提高资源的体用效率,在外部使用哈弗结构,数据和逻辑运算分开,方便简单指令集的的实现,为高级语言的设计带来方便。
- 第一款取得商业成功的家用计算机:Altair 8800,这是一个组装电脑的套件,很多计算机大神的早期经历都和这台计算机有关,比如乔布斯就是靠它发家的。
- 虽然这时的计算机可以进行编程了,但是使用晦涩的汇编语言进行编程依然很困难,人们需要更加友好简单的方式来进行编程。
# 11.编程语言发展史
- 最开始编程,直接使用的二进制,现在纸上写伪代码,然后手工转换成二进制的机器码
- 后来有了助记符,用助记符来写代码,然后通过汇编器来把助记符转换成二进制的机器码,这就是汇编语言
Grace
是哈弗 1 号计算机的首批程序员,海军军官,TA 设计了编程语言 A-0,同期还有FORTRAN
语言,这些都不是通用编程语言。- 后来慢慢的出现了通用编程语言,通用编程语言的口号是,一次编写到处运行,初期代表有
ALGOL
,LISP
,BASIC
,Pascal
,C
,Smalltalk
- 再后来就是
C++
,Objective-C
,Perl
,Python
,Ruby
,Java
.....这些编程语言除了汇编以外都称为高级语言,大多数高级语言都是通过编译器转换成汇编语言,再通过汇编器将汇编代码转换成机器码。
# 12.编程基础-语句和函数
- 作为一门编程语言的基本共同点有:变量,赋值,条件判断,循环以及函数等。
- 函数-方法-子程序,这几个概念是相近的,将一系列的函数写成单独的文件,称为函数的封装,利用引入,导入,连接等方法可以调用这些封装的函数,功能完备且受人认可的封装,称之为库,利用库我们能更快速的实现想要的功能。
# 13.算法入门
- 程序是用来解决实际问题的,解决问题的方法有很多,但有的方法效率高,有的方法效率低,为了衡量程序的效率,我们对程序的效率从空间和时间两个方方面进行考量,这就是程序算法的空间复杂度和时间复杂度。
- 对算法复杂度的考量不需要过于精确,在数学上我们用大 O 表示法,来表示算法复杂度的数量级。
- 最经典的问题是对数组元素的排序,典型的排序算法有,冒泡排序,选择排序,快速排序和归并排序,这四种排序算法是任何计算机从业者都需要掌握的最基本排序算法。
- 为了应对不同的实际问题,人们需要设计了不同的数据结构,来高效的表示需要处理的数据,其中最典型的数据结构有,链表,堆栈,队列,二叉树,以及图
- 迪杰斯特拉算法是荷兰科学家迪杰斯特拉在 1959 年提出的,是从一个顶点到其余各顶点的最短路径算法。核心思路是采用贪心的策略,每次遍历到起始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。这个算法可以类比成排序中的冒泡算法,是图算法的入门经典。
# 14.数据结构
- 数组 Array 字符串 String 矩阵 Matrix 结构体 Struct 指针 Pointer
- 节点 Node 链表 Linked List 队列 Queue 栈 Stack 堆 Heap 树 Tree 二叉树 Binary Tree 图 Graph 红黑树 Red-Black-Tree
# 15.阿兰·图灵
- 阿兰·图灵,计算机科学之父,人工会智能之父,提出了图灵机的概念,揭示了计算机的运行原理,为现代计算机的逻辑工作方式奠定了基础。
- 图灵测试,图灵提出的一种用于判断机器是否具有智能的实验方法,也是对智能这一概念的操作性定义。PS:至今人们都未能给出关于智能这一概念准确的描述性定义。
- 图灵奖,一年一评,是计算机界最负盛名,最崇高的一个奖项。
- 停机问题,是逻辑数学中可计算性理论的一个问题,判断一个程序是否能在有限时间内结束的问题,本质上是一个高阶逻辑的不自洽性和不完备性,因此不存在能解决停机问题的方法。
- 哥德尔不完备性第一定理,任何一个包含一阶逻辑和初等数论的形式系统,都至少存在一个命题,TA 在这个系统中既不能证明,也不能证伪。PS:这似乎就是不可知论的一个强有力的论据
# 16.软件工程
- 软件工程讲的是一个关于合作开发软件的故事,软件工程这门新科学,解决的是大型软件中各个部门各个员工协同合作中产生的问题。
- 关于软件工程需要了解的概念属于有:
- 面对对象编程 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.集成电路与摩尔定律
- 集成电路,采用一定工艺把一个电路中所需的分立元件及布线连在一起,制成一小块半导体晶片,然后封装,称为具有一定功能的单独的微型结构。
- 数字暴政,1960 年代计算机工程师遇到的问题,意思是如果想加强电脑性能,就需要更多的部件,更多的线路,这会让电路变得更加复杂,很难处理
- 摩尔定律,英特尔创始人之一 Gordon Moore 提出的,当价格不变时,集成电路可容纳的元器件的数目,每个 18-24 个月就会翻一倍
- 摩尔定律遇到瓶颈,电路小型化到一定程度,就会遇到一个严重的瓶颈,目前这个瓶颈的主要因素有:
- 光刻机产生的光不足以制作更精细的设计,需要能够产生更短波长光的技术,比如极紫外光刻
- 尺寸达到微观领域,电子会发生量子隧穿效应,导致逻辑错误
# 18.操作系统
- 操作系统 Operating systems,简称 OS,也是一个软件,但它有操作硬件的特殊权限,可以运行和管理其他程序。
- 批处理 Batch processing,让程序一个接一个运行,而不用手动操作
- 随着计算机变便宜变多,不同计算机有不同配置,写程序处理不同硬件细节很痛苦,因此操作系统负责抽象硬件,充当软件和硬件之间的媒介。
- 操作系统提供 API 来抽象硬件,叫设备驱动程序 Device drivers。
- 多任务处理 Multitasking,计算机性能越来越强,为了浪费性能,让多个程序可以在同时间段内运行。
- 多个程序运行,切换时数据不能发生丢失,因此每个程序都需要有自己能控制的内存。但是数据在内存中的分配是非常复杂的,操作系统能够将这个部分进行抽象,叫做虚拟内存。它假定内存始终从 0 地址开始,且是连续的。
- 内存保护 Memory Protection
- 1970 年代,计算机足够便宜,大学买了让学生用,多个学生用多个 "终端" 连接到主机,为了让每个用户的操作不冲突开发了多用户分时操作系统
# 19.内存&储存介质
- 纸卡 Paper punch cards
- 延迟线存储器 Delay Line Memory
- 磁芯 Magnetic Core Memory
- 磁带 Magnetic Tape
- 磁鼓 Magnetic Drum Memory
- 硬盘 Hard Disk Drives
- 内存层次结构 Memory Hierarchy
- 软盘 Floppy Disk
- 光盘 Compact Disk
- 固态硬盘 SSD Solid State Drives
# 20.文件系统
- 文件格式:可以随便存文件数据,但按格式存会更方便
- TXT 文本文件:ASCII
- WAV 音频文件:每秒上千次的音频采样数字
- BMP 图片文件:像素的红绿蓝 RGB 值
- 文件系统:很早期时空间小,整个存储器就像一整个文件。后来随容量增长,多文件非常必要
- 目录文件:用来解决多文件问题,存其他文件的信息,比如开头,结尾,创建时间等
- 平面文件系统 - Flat File System:文件都在同一个层次,早期空间小,只有十几个文件,平面系统够用
如果文件紧密的一个个前后排序会造成问题,所以文件系统会:
- 把空间划分成一块块
- 文件拆分存在多个块里
- 碎片整理:文件的增删改查会不可避免的造成文件散落在各个块里,如果是磁带这样的存储介质就会造成问题,所以做碎片整理
- 分层文件系统 - Hierarchical File System:有不同文件夹,文件夹可以层层嵌套
# 21.数据压缩
- 压缩的好处是能存更多文件,传输也更快
- 游程编码 Run-Length Encoding 无损压缩 Lossless compression 霍夫曼树 Huffman Tree
- "消除冗余"和"用更紧凑的表示方法",这两种方法通常会组合使用
- 字典编码 Dictionary coders 游程编码 和 字典编码 都是无损压缩
- 感知编码 Perceptual coding 有损压缩 jpeg 格式 时间冗余 Temporal redundancy MPEG-4 视频编码
# 22. 命令行界面 CLI
- 计算机早期同时输入程序和数据(用纸卡/纸带)运行开始直到结束,中间没有人类进行操作,原因是计算机很贵,不能等人类慢慢输入,执行完结果打印到纸上
- 到 1950 年代,计算机足够便宜+快,人类和计算机交互式操作变得可行
- 为了让人类输入到计算机,改造之前就有的打字机,变成电传打字机
- 到 1970 年代末,屏幕成本足够低,屏幕代替电传打字机,屏幕成为标配
# 23. 屏幕与 2D 显示
- 显像管到液晶屏幕
- 位图和矢量图
# 24. 冷战和消费主义
- 1950 年,收音机大卖,索尼做了晶体管收音机,为日本半导体崛起埋下种子
- 1961 年,苏联加加林进入太空,美国提出登月,NASA 预算大大增加,计划用集成电路制作登月计算机,后来又建造超级计算机,进一步推动集成电路发展,70 年代,冷战渐消,行业开始衰败,英特尔转型做处理器。
- 政府和消费者推动了计算机的发展,早期靠政府资金,让技术发展到足够商用,然后让消费者购买商用产品继续推动产品发展
# 25.个人计算机革命
- 基本就是乔布斯和比尔盖斯的发家史
# 26.图像用户界面 UI
- 依旧是乔布斯和比尔盖斯的发家史
# 27.3D 图形 Graphic
- 2D 的电脑屏幕上不可能有 XYZ 立体坐标轴,所以有图像算法负责把 3D 坐标“拍平”显示到 2D 屏幕上,这叫“3D 投影”
- 正交投影,透视投影,多边形绘图,像素填充度,三角形用最少的点来描述一个平面的几何属性,
- 抗锯齿——边缘颜色渐变,画家算法——由远到近渲染,背面剔除——忽略背面,减少一半的多边形计算
# 28.计算机网络 Network
- 1970 年以前,大多数计算机是独立运行的,随着计算机的普及,计算机数量不断增多,分享数据和资源变得急需,于是首个计算机网络诞生了。
- 第一个计算机网络出现在 1950-1960 年代,通常在公司或者研究室内部使用,这种网络当时叫做球鞋网络。
- 计算机近距离构成的小型网络叫局域网,Local Area Networks 简称 LAN,用到的技术叫做“以太网”。
- 为了确定设备之间的数据交互,给每台计算机配备了唯一的媒体访问控制地址,Media Access Control address,简称 MAC 地址。
- 多台电脑共享一个传输媒介,这种方法叫做载波侦听多路访问,简称 CSMA,很多计算机同时侦听载体,载体传输数据的速度叫“带宽”。
- 计算机在数据传输期间检测到冲突时,会每隔一段时间再次检测是否可以传输,其等待时间与前一段时间成比例关系,因而也叫做指数退避,指数退避降低了冲突次数,使得网络变得通畅。
- 为了减少冲突和提升效率,我们需要减少同一载体中设备的数量,载体和其中的设备总称为“冲突域”,交换机干的事情就是划分冲突域。
- 从一个地点到另一个地点通常有多条线路,这就引出了路由,路由器通过转发数据包来事件网络互连,数据传输可以用不同路由使通信更可靠更能容错,当数据包太大的时候,将数据包分成多个小数据,每个小数据可以走不同的路线进行传输,通过 TCP/IP 协议可以解决数据包之间的顺序问题。
# 29.互联网 Internet
- 每个人的计算机都和一个巨大的分布式网络连在一起,这个网络就是互联网,个人计算机在路由器的局域网下,通过各级路由器可以连接到广域网,广域网的路由器一般属于 ISP(电信,联通等)
- Linux 系统
traceroute
命令,Windows 系统使用tracert
命令来查看各级路由,比如tracert baidu.com
- 用户数据报协议,简称 UDP,每个想访问网络的程序都要想操作系统申请一个端口号,程序发送的 UDP 数据头中就包含这一信息,比如 Skype 会申请 3478 端口,Nginx 默认申请 80 端口,数据头还包括数据的校验码,用来验证数据的完整性。
- UDP 是无连接的传输协议,简单粗暴,只管丢数据,不管数据是否抵达,是否完整,接收方如果得到损坏的数据包一般都是直接丢掉,这属于丢包的一种情况。UDP 的常用场景:即时网络游戏,直播等;
- 传输控制协议,简称 TCP,TCP 的数据包是带序号的,序号使得接收方可以把数据排成正确的顺序,TCP 还可以根据确认码的成功率和来回时间,推测网络的拥堵程度,来调整同时发包数量,解决拥堵问题,TCP 丢包的时候,需要重新发送数据包,以保证数据的完整性。
- 基于 IP 和端口就可以访问服务器上的服务了,但是非常的不方便记忆和使用,因此需要给不同的服务器地址起个名字,这就是域名,域名和 IP 对应,浏览器先访问本地 DNS 缓存,如果未匹配就向上一级网络的计算机(服务器)寻找,直到找到为止,或者直到在根域名服务器上都找不到,提示网络出错。
- 七层网络模型: 物理层,链路层,网络层,传输层,会话层,表示层,应用程序层
# 30.万维网 WWW
- 万维网 WWW 是 World Wide Web 的简称,也称为 Web、3W 。万维网的基本单位是单个页面,每个页面可以通过超链接进行跳转。
- 为了使网页能相互连接,每个网页需要一个唯一的地址,这个地址叫统一资源定位器,简称“URL”
- 使用 TCP/IP 和服务器建立连接后,向服务器请求页面,用到的是超文本传输协议,简称"HTTP",HTTP 的第一个标准是,HTTP0.9,创建于 1991 年,当时只有一个指令——”GET“。
- 网页是一个超文本,为了对网页上的内容进行区分,有必要开发一种标记方法,这就是超文本标记语言,简称“HTML”,HTML 第一版的版本号是 0.8,创建于 1990 年,当时只有 18 种标签,现在最新版的 HTML 是 HTML5,有 100 多种标签,每个标签又有着诸多属性。
- 浏览器,网页浏览器可以可网页服务器沟通,浏览器不仅获取网页和媒体,获取后还负责渲染和显示,世界上第一个浏览器和服务器是 Tim Berners -Lee 在 1990 年写的,一共花了两个月,他当时在欧洲核子组织工作,在此期间建立了网页的一系列标准,这套标准在 1991 年发布。
- 第一个可以显示图片的浏览器——Masaic 浏览器,由伊利诺伊大学香槟分校的一个小组在 1993 年制作,他们还开发了目前最负盛名的开源服务器 Apache。在此之后诸如 Netscape Navigator,Mozilla,IE,Opera 等浏览器也如雨后春笋般出世。
- 随着万维网上资源的不断增多,人工编辑资源目录变得极其麻烦,于是人们做出了搜索引擎,长得最像现代搜索引擎的最早搜索引擎是 JumpStation,这个搜索引擎由 Jonathon Fletcher 于 1993 年在斯特林大学开发。搜索引擎由三个部分组成:
- 第一个是爬虫,一个跟着链接跑的软件,每当看到新链接就加进自己的列表
- 第二个是索引,记录访问过的网页上出现过那些词,主要收录网页的关键字和语义化内容。
- 最后一个是查询索引的搜索算法,以保证最相关的网页被列出,并排列靠前。
# 31.计算机安全 Security
- 计算机没有“道德”概念,就像“原力”一样,计算机可以被拉到“光明面”或黑暗面。网络安全就像绝地武士团给网络世界带来和平与正义
- 我们可以把计算机安全,看成是保护计算机系统数据的保密性,完整性和可用性
TIP
- 保密性 只有有权限的人才能读取计算机系统和数据
- 完整性 只有有权限的人才能使用和修改系统和数据
- 可用性 有权限的人应该可以随时访问系统和数据
为了实现这三个目标,安全专家会从抽象层面想象敌人可能是谁,这叫"威胁模型分析"
,模型会对攻击者有个大致描述:能力如何,目标可能是什么,可能用什么手段。攻击手段又叫“攻击矢量”。
- 身份验证 你是谁
- What you are, 系统想要知道你是什么,这是最终目的,但很难实现。于是有了下面两个替代方案
- What you know, 你知道什么 举例:使用密码登录,回答安全验证问题
- What you have, 你有什么 基于用户有具体的特殊物体 举例:网盾,生物识别,FaceID,验证码
多因素认证 对于重要账户,安全专家建议用两种或两种以上的认证方式
- 访问控制 你可以访问什么
Bell-Lapadula 模型 机密信息系统
- 用户不能“读上”,用户不能读等级更高的信息
- 用户不能“写下”,防止用户意外泄露更高等级的信息
Biba 模型 军事指挥系统
- 用户只能创建等于或低于自己完整性级别的内容(将军可以写命令给上校,上校可以将这些命令发给少校。)
- 用户只能查看其自身完整性级别或以上的内容(一个列兵永远不能向他的中士下达命令,而他的中士可能永远不会向中尉下达命令,这也保护了任务的完整性)
- 数据完整性
一般来说,保持数据完整性有三个目标:
- 防止未经授权的各方修改数据
- 防止授权方未经授权修改数据
- 保持内部和外部的一致性(即数据反映真实世界)
- 可信计算与沙盒模型
# 32.黑客&攻击 Hack
- 社会工程学 Social Engineering,欺骗别人让人泄密信息,或者让别人配置电脑系统,变得易于攻击
- 钓鱼 Phishing 钓鱼网站,将网站伪造成真实网站
- 假托 Pretexting 制造虚假情形,以迫使针对受害人吐露平时不愿泄露的信息的手段
- 木马 Trojan Horses 垃圾邮件附带木马,木马会伪装成无害的东西,比如照片或发票,但实际上是恶意软件
- NAND 镜像 NAND Mirroring 如果能物理接触到计算机,可以往内存上接线,将内存中的所有数据复制,复制之后暴力尝试,遇到系统等待时导入之前复制的数据,然后再次尝试,这样就绕过了等待可以继续进行密码爆破。
- 缓冲区溢出 Buffer Overflow 缓冲区是一种概称,指预留的一块内存空间,黑客可以写入大量数据,让数据写入到缓冲区之外,以达到修改程序数据的目的
- 边界检查 Bounds Checking 许多现代编程语言自带了边界检查,程序也会随机存放变量在内存中的位置,这样黑客就不知道应该覆盖内存的那个位置的数据了
- 代码注入 Code Injection 另一个经典的攻击手段,叫代码注入,最常用于攻击用数据库的网站。举例:
select password from users where username = 'whatever'; drop table users;
- 零日漏洞 Zero Day Vulnerability 当软件制造者不知道软件有新漏洞被发现了,那么这个漏洞就叫“零日漏洞”,保持系统更新非常重要。
- 计算机蠕虫 Worms 可以在电脑间相互传播的恶意程序
- 僵尸网络 Botnet 如果黑客拿下大量电脑,这些肉鸡电脑可以组成僵尸网络,利用僵尸网络可以达到很多目的,比如发送大量垃圾邮件,使用这些电脑挖取比特币等
- 拒绝服务攻击 DDoS 或者使用僵尸网络发起 DDoS 攻击,发送大量垃圾信息到服务器,阻塞服务器
# 33.加密 Cryptography
世界上没有百分百安全的系统,总会有漏洞存在,而且安全专家知道这一点
- 多层防御 - Defence in depth 用多层不同的安全机制来阻碍攻击者
- 加密 - Encryption,解密 - Decryption 为了加密信息,要用加密算法(Cipher)把明文转为密文,把密文恢复为明文叫“解密”
- 凯撒加密 - Caesar cipher 替换加密的一种 替换加密 - Substitution cipher 容易被统计破解
- 移位加密 - Permutation cipher 列移位加密 Columnar transposition cipher 矩阵加移位,安全程度增加
- Enigma - 英格玛加密机 使用多重替换加密 + (变相的移位加密)替换规则会动态变化
- DES - IMB 和 NAS 于 1977 年指定"数据加密标准" - Data Encryption Standard (DES) 使用 56bit 长度的二进制密钥 容易被暴力破解
- AES - 2001 年"高级加密标准" - Advanced Encryption Standard (AES) 使用更长的密钥 128/192/256 位 AES 把数据切分一块一块,每块 16 字节,然后使用密钥进行一系列的替换和移位加密,再加上一些其他操作,并且重复 10 次以上,以便在性能和安全间取得平衡
- 密钥交换 - Key exchange 到目前为止,上面讨论的加密技术都依赖发送者和接收者知道相同的密钥。我们需要某种方法,在公开的互联网上传递密钥给对方。
- 单向函数,单向函数是一种数学操作,很容易算出结果,但是从结果反推输入非常困难
- 迪菲-赫尔曼密钥交换 - Diffie-Hellman Key Exchange 在 DH 中,单向函数是模幂运算
B^x mod M = R
已知 B、M、R 很难求解出 x 交换密钥实现加密的原理(B^y mod M)^x = (B^xy mod M)
- 非对称加密 - Asymmetric encryption 一个公钥一个私钥,通信双方交换各自的公钥,然后使用对方的公钥加密,使用自己的私钥解密
- 非对称加密算法 目前最主流的非对称加密算法是 RSA
# 34.机器学习与人工智能 ML
- 分类 Classification 举例:判断飞蛾是“月蛾”还是“帝蛾
- 分类器 Classifier 举例:做分类的算法叫“分类器”
- 特征 Feature 很多算法会简化复杂度,把数据简化成“特征”。特征是用来帮助分类的值
- 标记数据 Labeled data 为了训练“分类器”做出好的预测,我们需要“训练数据”,为了得到数据,我们需要标记数据。
- 决策边界 Decision boundaries 划分分类的判据
- 混淆矩阵 Confusion matrix 统计正确分类和错误分类的表格,机器学习算法的目标就是最大化正确的分类和最小化错误的分类
- 未标签数据 Unlabeled data
- 决策树 Decision tree 支持向量机 Support Vector Machines 基于统计学的算法
- 人工神经网络 Artificial Neural Network 基于代数的机器学习算法 输入层-->隐藏层-->输出层 激活函数
- 深度学习 Deep learning 隐藏层并非只有一层,深度学习由此得名
- 弱 AI Weak AI , 窄 AI Narrow AI,针对特定任务设计的 AI
- 强 AI Strong AI , 真正通用的,像人一样聪明的 AI
- 强化学习 Reinforcement Learning
# 35.计算机视觉 CV
- 视觉是信息最多的感官,半个世纪来,计算机科学家一直在想办法让计算机有视觉。
- 图像是像素组成的网格,每个像素的颜色,通过三种基色来定义,通过组合三种颜色的强度可以得到任何颜色。
- 颜色跟踪算法是一个一个像素检测,不适合检测占多个像素的特征,比如物体的边缘。
- 为了识别物体的边缘,算法要一块块的去处理,比如检测垂直边缘的算法,我们可以将图像转为灰度图,然后找到水平像素差异较大的地方。我们利用一组像素来组合核/过滤器 kernel or filter 来进行运算,把核上的数据应用于像素块,这种操作就叫卷积 convolution
- Prewitt 算子 Prewitt Operators,用途:边缘增强卷积核
突出垂直边缘突出水平边缘-1 0 1 -1 0 1 -1 0 1
1
2
3锐化图像-1 -1 -1 0 0 0 1 1 1
1
2
3模糊图像-1 -1 -1 1 9 -1 -1 -1 -1
1
2
3.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
1
2
3
4
5 - 维奥拉·琼斯 人脸检测算法 Viola-Jones Face Detection 集合多个特征的组合
- 卷积神经网络 Convolutional Neural Networks 基于神经网络每层使用卷积运算
- 算法识别出脸之后,可以进一步用其他算法定位面部标志,如眼睛和眉毛具体位置,从而判断心情等信息,跟踪全身的标记点,如肩部,手臂等
# 36.自然语言处理 NLP
- 让计算机拥有语音对话的能力,这个想法从构思计算机时就有了,“自然语言处理”因此诞生,简称 NLP
- 词性 Parts of speech 短语结构规则 Phrase structure rules 用于代表自然语言的语法规则;分析树 Parse tree 表明句子的结构,单词可能的词性
- Knowledge Graph 知识图谱
- 语音识别 Speech recognition 第一个语音数字识别器 Audrey
- 谱图 Spectrogram
- 快速傅立叶变换 Fast Fourier Transform 波形到频率的转换
- 音素 Phonemes 利用音频特征定义的基本单元 语音合成 Speech Synthesis
- 语音界面 Voice User Interface
# 37.机器人 Reboot
- 我们经常把机器人看成是未来科技,但事实是:机器人时代已经到来了,机器人帮助我们完成困难的工作
- 机器人是由计算机控制,可以自动执行一系列动作的机器
- 有时我们叫虚拟任务为“机器人”,但叫“Bot”或者“Agent”会更合适,因为机器人的潜在含义是存在于现实世界中的机器
- 自动机,法国吃饭鸭 - Digesting Duck, Canard Digerateur
- 土耳其行棋傀儡, 下国际象棋,其实是骗局
- 第一台计算机控制的机器出现在 1940 年代晚期,叫数控机器, Computer Numerical Control(CNC)
- 1960 年 Unimate,第一个商业贩卖的可编程工业机器人
- 简单控制回路 simple control loop 负反馈回路 negative feedback loop
- 比例-积分-微分控制器 Proportional–Integral–Derivative controller PID 控制器
- 机器人三定律 Three Laws of Robotics
# 38.计算机心理学
- 为了愉快的使用计算机,我们需要了解人类心理学,了解计算机和人类的优缺点,做出更好的计算机
- 易用度 - Usability 指的是人造物体,比如软件达到目的的效率由多高
- 颜色 颜色强度排序 和 颜色排序
- 分组 分组能够让信息更好记,比如电话号码 317-555-3897 比 3175553897 好记
- 直观功能 - Affordances 直观的东西广泛应用于 GUI,与之对应的心理学概念是认出 vs 回想 Recognition vs Recall
- 让机器有一定情商以及 Facebook 的研究,比如用软件修正注视位置。让视频通话时看起来像盯着对方,而不是盯着下方
- 恐怖谷理论,把机器人做的像人
- 有很多开放式的问题,心理学帮助我们明白不同选择可能带来的影响
# 39.教育科技
- 1913 年 爱迪生预言:“书籍很快会过时.. 用影片来教授所有知识是可能的”,他的预言没有成真,但视频教学确实越来越流行了
- 视频教学的优点,通过调速,暂停等技巧,加强学习效率
- 大型开放式在线课程 - Massive Open Online Courses (MOOC)
- 智能辅导系统 - Intelligent Tutoring Systems 贝叶斯知识追踪 Bayesian knowledge tracing
- 教育数据挖掘 Educational Data Mining
# 40.计算机的未来
- 把工作分为 4 个象限,讨论自动化带来的影响
- 重复性手工工作 已经被替代
- 非重复性手工工作
- 重复性思维工作
- 非重复性思维工作 暂时安全
- 机器人的存在时间可能长过人类,可以长时间探索宇宙