《计算机科学导论》重温领域知识和技术变迁

选书

工作了之后,对学术界进展关注比较少,对计算机领域的变化缺少整体认识,在做技术的选型时就会有技术盲区。

看看学校的新课本,了解下整个领域的新进展就很有必要,例如第三版就增加了人工智能等内容,第四版增加了社交媒体、社会和道德问题,而且基础教材都通俗易懂。

网上也看过很多趋势预判,热点技术之类的文章,缺少历史的延续性,很多都是老技术的整合包装,当然《技术的本质》里也说,新技术就是对老技术的升级、组装或嵌套。

就像李彦宏说的那样,很多技术都是新瓶装旧酒,那么选一本基础且全面的书读一读,不但提升了全部领域的认识,减少盲区,而且在技术的获取上比读网上专家的预判也要高效准确的多。

读书

图灵机

如果说人类做到了什么,那么他肯定提前想到了,并且想通了。

从英国巴贝奇的差分机开始,人类就有很多发明来解决计算问题,就像耕地时用人、牛、用骡子、用拖拉机一样;计算机也经历了从人计算、简单机械计算、复杂机械计算、通用机械计算、通用电子计算等历程。

而图灵,准确点应该是邱奇-图灵猜想,从脑子里把通用计算模型跑通了,它是一个思想实验,却打开了通用计算的大门。

数子系统

我认为数字是对世界比较高级的一种抽象,而数字的设计也是多种多样,对常见的有基于位置的数字和非基于位置的数字。

基于位置的数字设计,数字和位置相关,不同的位置表示的数量不同,例如我们常用的10进制,1在个位就是1,在十位就是10,在百位就是100。

基于位置的数字设计又叫基数法,进制是用有限的符号表示无限数字的方法,可使用的符号数量称为基数或底数,例如十进制就是0-9,八进制就是0-7,十六进制是0-F,而二进制是0-1。

非基于位置的数字设计,例如古罗马数字,共有7个符号,Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000),左边有小于右边的代表减,每个符号就代表固定的数量和位置无关,Ⅰ代表1,ⅠⅠ代表2,ⅠⅠⅠ代表3,Ⅳ代表4,V代表5,VI代表6,VII代表7,VIII代表8,IX代表9,X代表10;ⅯⅭⅮⅩⅩⅩⅦ代表1437。

不同基数系统的转化规则,整数部分用除基数取余法,小数部分用乘基取整法。

数据存储

无符号整数的存储是最基础的部分,对实数的处理就要对数的大小和精度做折中处理,要存的数又大精度又高就是矛盾的,所以就有了浮点数和双精度浮点数,可以存储的小数位数是不同的。

存储文本时,早期英文就是ASCII码,每个字节(8位或8bit)存储一个字符;刚开始是没有考虑非英语国家使用的!后来就有了UNICODE编码,用多个字节表示,这样就可以存下全世界的文字并在不同的系统中使用。

图片的存储分为位图模式和矢量图模式,位图模式是每个像素有一个RGB的三原色值,又叫真彩色,可以表示几万种色值,但是通常人眼是很难区分的,所以为了压缩使用了索引色,将相似的颜色用一个色值表示,这样就减少了色值空间,可以用用更少的存储,常见的就是JPEG(联合图像专家组,真彩色)和gips(索引色格式,常用来压缩)。

位图在经过拉伸后会有锯齿,变的模糊;后来就有了矢量图格式,矢量图本质是一堆数学公式,当图片拉伸时根据公式重新绘制,这样就可以高保真,常用在工程图纸、流程图等场景。

视频的存储其实是很多图片(帧),而视频内每秒的N帧图像一般是很相似的,这样就有了压缩的空间,将视频中相似的图片分组为I帧、P帧和B帧,I帧是全信息的图片内容,P帧和B帧则为过度帧和补充帧,常用的格式是MPEG(动态图片专家组)。

音频的存储则是将模拟信号采样量化为数字信号,然后将数字信号进行采样,将采样后的数字数据进行存储,常用的格式为mp3(MPEG layer 3)。

数据运算

计算机底层的操作都是二进制,故最基础的操作还是基于位的运算,例如左右移、整数运算和浮点数运算。

计算机组成

这章主要还是围绕冯·诺依曼的体系结构介绍CPU(ALU、Cache、控制单元);内存(空间、寻址、缓存层次结构);输入输出(存储设备和非存储设备);子系统连接的方式中,对不同传输速率下的设备连接折中设计,一种是独立地址,一种是内存地址映射。

不同的处理器支持的指令集不同,可分为精简指令及(RISC,reduce instruction set computer),此类指令集少,对于cpu设计简单,对于上层应用则需要封装实现更多的功能;复杂指令集(CISC,complex instruction set computer),在此指令集中包含了复杂指令,故在CISC指令集中进行程序设计要容易得多。

计算机网络和因特网

基本每本网络的书都会先讲网络的概念、分层协议、TCP/IP协议簇,其实我更想知道在网络规模的发展中,每个技术方案选择背后的因素,例如为何是4层,不是7层或更少,这部分能补充就更好了。

bloom-img.png

操作系统

对二进制的操作其实是很枯燥的,就像计算核爆方程一样,大量的人做类似的一件事情且枯燥无味,如果这个简单操作能有单独的工具完成封装实现,提供给其他上层应用,就有了复用,极大的提升了效率。

所有通用计算机中复用最多的就是操作系统,没有用户会直接控制二进制开关来写代码。

操作系统封装了所有的二进制操作,对计算机体系结构不同部分的封装就有了内存管理、进程管理(为啥不叫CPU管理)、文件管理、用户界面(面向用户)。

操作系统对任务的调度方式不同,拆分为批处理、分时、并行、分布式(这个网络操作系统和我理解的基于单一体系结构的操作系统维度不同,其实这样写感觉有点乱)、实时。

算法

有了操作系统对硬件的封装,我们就可以使用开发语言开发很多算法,算法就是一种逐步解决问题或完成任务的方法。

算法的三大结构:顺序、判断、循环。

算法的表示常用的有UML和伪代码。

算法明确的定义:良好定义(有目的)、明确步骤(可复现)、产生结果(能解决问题)、有限时间内(有机会看到结果)。

基本的算法:数学上的加减乘除、最大和最小、排序和查找。

程序设计语言

语言的演进:机器语言(二进制指令)、汇编语言(助记符语言)、高级语言(更接近自然语言且可以在不同的系统运行)。

高级语言的执行之前可能有几个步骤转化为机器语言(机器只认机器语言),编译和解释。

程序设计的模式有:过程式模式(FORTRAN、Pascal、C、Ada)、面向对象模式(C++、Java)、函数式模式(LISP、Schema)和声明式模式(Prolog)。

语言中的共同概念有标识符、数据类型、变量、字面值、常量、输入和输出(hello world必备)、表达式(开始上手必备)、语句(上手必备)和子程序(程序设计必备)。

软件工程

每个软件都有生命周期:开发-》使用-》修改-》终止。

软件分析的两种模式:面向过程和面向对象。

软件设计中两种模式:面向过程设计和面向对象设计。

语言的选择:面向过程C,面向对象C++和Java等。

软件质量分为:可操作性、可维护性、可迁移性。

  • 可操作性:准确性、高效性、可靠性、安全、及时、适用性
  • 可维护性:可变性、可修正性、适应性、可测试性
  • 可迁移性:重用性、互用性、可移植性

测试阶段:白盒测试(玻璃盒测试,可用路径测试和控制结构测试)和黑盒测试(功能测试、界面测试)。

软件工程中三大文档:用户文档(咋用的)、系统文档(咋维护的)、技术文档(咋升级的)。

数据结构

从1到多,1就是基础数据类型,整形、浮点型、字符型。

多就是数组和记录,数组是同类型的基础数据类型,记录是多种基础数据类型,数组是记录的特例。

链表是数组和记录的实现形式。

抽象数据类型

有很多数据之后就有了处理的顺序,就有了查找优化的结构。

处理顺序方面的抽象数据类型是栈和队列,解决先处理谁的问题。

广义线性表和树是解决怎么查找的问题。

文件结构

文件存取方法分为两种随机存取和顺序存取,我们常用的磁盘为随机存取,可以根据地址寻址后读写;常用的磁带是顺序存取,只能一个接一个的,从头到尾的读取或存储。

随机存取中可以使用索引文件提升文件查找速度,例如unix系统中的inode数据等。

unix系统文件设计的结构未树状结构,使用目录时分为绝对路径和相对路径(使用相对路径时,在不同环境中会埋下问题哦)。

数据库

数据库是一个组织内被应用程序使用的逻辑一致的相关数据的集合。

演化之前是很多相关的文件,但是文件会有各类的约束缺失和数据重复,导致数据混乱,故用数据库进行一类数据的管理;进而减少冗余、避免不一致、提升使用效率、数据更加完整、机密性也更强。

数据库管理系统的构成:硬件、软件、数据和用户。

数据库体系结构:内层、概念层、外层。

数据库常用模型:层次模型、网状模型和关系模型;点前主流的还是关系模型。

关系数据库常用操作:结构化查询语句、插入、删除、更新、选择、投影、连接、并、交、差、语句的组合。

数据库设计:第一步是找用户面谈确认需求,第二步建立一个实体关系模型(ERM)。

规范化:给定的一组具有更加坚固结构的关系,常见的有1NF、2NF、3NF、BCNF(Boyce-Codd范式)、4NF、PJNF(Projection/Joint)和5NF。

其他数据库模型:分布式数据库和面向对象数据库。

数据压缩

数据压缩又分为无所压缩和有损压缩,无损压缩又可用:游程长度编码、赫夫曼编码、LZ编码;无损压缩图片有JPEG、视频有MPEG、声音有MP3(MPEG Layer 3)。

安全

安全的目标:机密性、完整性、可用性。

常见的攻击类型:机密性上有嗅探和流量分析,完整性上有篡改、假冒、重放、抵赖,可用性上有拒绝服务。

安全实施的两个方向:密码术和隐写术。

密码术分为:对称加密和非对称加密(RSA)。

完整性上实施有:散列函数(MD4、MD5、SHA1)。

安全出入口实施常用防火墙:四层设备、七层设备或软件。

计算理论

使用递增、递减、循环实现的复杂程序功能介绍,我们看到的复杂逻辑,拆解到计算机底层都是指令。

图灵机的组成:磁带(无限长)、读/写头、控制器(有限状态机)。

丘奇-图灵论题:如果存在一个能完成一个符号操纵任务的算法,那么也存在一台完成这个任务的图灵机。

哥德尔数:在计算机科学理论中,一个无符号数能被分配给任何用特定语言编写的程序,通常称为哥德尔数。

停机问题:我们能编写一个程序来测试任何可以用哥德尔数表示的程序是否会终止吗?(我们能够确定一个不确定的问题吗,我觉得显然不能)

停机问题不可解,证明一个问题能否解决等同于证明停机问题能否解决。

可解问题时间复杂度一般用大O法表示。

多项式问题:如果复杂度为O(log n)、O(n)、O(n平方)、O(n的k次方),则为多项式问题。

非多项式问题:例如O(10的n次方)、O(n的阶乘)。

人工智能

人工智能是对程序系统的研究,该程序系统在一定程度上能模仿人类的活动,如感知、思考、学习和反应。

智能体是一个能智能的感知环境、从环境中学习并与环境进行交互的系统。

智能体可分为软件智能体(搜索引擎)和物理智能体(机器人)。

编程语言:LISP和PROLOG,性能较低,一般会用C或C++重写。

知识表示:语义网、框架、谓词逻辑、基于规则的系统。

专家系统:一般由抽取知识、抽取事实组成。

专家系统体系:用户、用户界面、推理机、知识库、事实库。

感知能力:当前较成熟的有图像处理和语言处理。

图像处理步骤:边缘探测、分段、查找深度、查找方向、对象识别、应用。

语言理解:语音识别、语法分析(文法和词法分析)、语义分析、语用分析、意图理解。

搜索的方向:蛮力搜索、深度优先、启发式搜索。

神经元:胞体、轴突、树突。

社交媒体

主要介绍了facebook和twitter的使用,不知道为啥又这一章,略过。

社会和道德问题

道德的第一个原则是我们应该避免去做那些违反普遍道德的行为(己所不欲、勿施于人)。

道德的第二个原则是如果一个行为能够带来好的结果,那么这个行为是道德的(与他人有益)。

道德的第三个原则是如果一个行为被社会大部分人接受,那么这个行为是道德的(底线思维呢)。

常见知识产权:商标、商业机密、专利、版权。

计算机犯罪:入侵攻击(病毒、蠕虫、特洛伊木马、拒绝服务攻击)、动机(政治、黑客、恐怖主义间谍、经济利益或仇恨)。

攻击保护:物理保护、使用受保护的软件、安装防病毒软件。

黑客:之前是指拥有很多知识,可以改进系统、提升系统性能的人;现在指未经授权访问他人计算机获取机密信息的人。

用书

  • 理论方面可以重新学习加强认识,补充近些年计算机领域发展的相关知识。
  • 业务方面可以提升广度,在技术选型中可以结合当前的进展更加全面。
  • 知识结构方面可以梳理完善,完整的领域知识树有助于差缺补漏。
您的支持是我最大的动力!