计算机是怎样跑起来的
时间开销:
共计12h
阅读+随手记
181107: 2h
181108: 0.25h+3h
181112: 1h+1.5h+1.5h
小计:9.5h ~ 10h
总结+进阶计划
181112:2h
分章节笔记
00 序言
本书2003年出版,2015年5月译版第1版
如果仅仅把技术当作一个黑盒, 只把时间花在学习其表面上, 而并没有探索到其本质, 就绝不应该认为自己已经“懂” 了。
即便面对的是复杂的最新技术,一旦把它们回归到计算机的基础知识上, 就变得可以轻松理解了。
本书目的是为了了解有关计算机技术的知识范围,掌握其基础中的基础知识。
全文共计12章:
- 01:计算机基础中的基础(三大原则)
- 02-03:计算机组成原理(CPU构成)+汇编(手工汇编)
- 04-07:算法与数据结构(经典算法+数组栈队列链表树)+程序设计(程序运行流程+面向过程or面向对象)
- 08:数据库(表、字段、索引、主键、关系、事务)
- 09-11:计算机网络(TCP/IP)+加密(对称加密or非对称加密)+数据传输格式(XML扩展标记语言)
- 12:整个系统构建过程和目标
01 计算机的三大原则
181107:2149:所谓编码,就是把信息数字化成计算机能够理解的数字,根据不同的编码方式,计算机存储需要的字节数不同;用于表示字符的数字就是“字符编码”,用于表示颜色的数字就是“颜色编码”;编码就是一种数字化的标准or方式,比如单汉字GBK下2字节,UTF-8下3字节;如果说Linux系统中所有都是文件的话,那么计算机中所有都是数字;计算机=输入+运算+输出;程序=指令+数据;指令和数据都是数字,一组指令可以理解为函数,数据可以理解为变量;所谓编译,就是把各种不同编程语言写的代码转换成计算机能够理解的机器语言(原生语言-数字);计算机进化的方向是为了与人类越来越接近,摈弃计算机中不符合人类思维习惯的地方;面向过程编程->两种编程方法,面向组件编程CBP和面向对象编程OOP(更接近人类的思维习惯)。
02 试着制造一台计算机吧
181107:2238:这章讲的大部分内容基本都是之前没看过的,偏底层硬件,只看到了各种引脚连线,把CPU、内存、I/O给串起来,但是到底怎么串的,以及各种物理电学常识都忘了。通过手工绘制电路图连线,对整个CPU的构造有了一些了解,非常细致,通过拨动CPU上的按键开关手动输入机器语言一行一行的输入代码。机器语言的语法十分简单,就是指令+数据,指令和数据则是根据存储的内存地址+指令or数据本身,告诉CPU在哪儿做什么。对于不做硬件的来说,要深入理解的主要还就是二进制,时钟信号,0/1,Hz是用来表示驱动CPU运转的时钟信号的频率,1秒钟发出1次时钟信号就是1Hz。
进阶书:计算机组成原理(是时候复习一下了)
03 体验一次手工汇编
181108:0958:总的来说这一章的知识比上一章容易理解,主要是之前上了计算机组成原理的课,对于寄存器、汇编语言有一定的了解,这章把机器语言清晰的解释了一遍,更理解底层的实现机制了,很不错,不过掌握程度不是很高;每个汇编符号都是在CPU的资料中能够找到,每个指令都有对应的机器语言二进制代码,以及对应执行该指令需要的时钟周期,每个CPU的Hz频率表示的就是每秒能够执行多少个时钟周期,通过对指令需要的时钟周期进行累加,就能够计算程序所消耗的时间。汇编语言的语法只有一个,把标签、操作、操作数写在一行中,标签的目的是为该行代码对应的内存地址取一个名字;程序的执行重点是几种寄存器,其中PC寄存器存储着下一行指令的内存地址,是控制整个程序运行流程的重要寄存器;(2)表示地址编号;汇编语言的一行指令能够翻译成多少字节的机器语言取决于指令种类和操作数的个数(其实也就是CPU资料上怎么写就怎么对应)
进阶书:编译原理(这书说实话虽然买了但几乎没看,太偏底层而现在业务开发很少直接用到,但如果想要了解底层实现各种感觉还是要好好看一下)、程序员的自我修养——链接、装载与库(对各种静态、动态编译了解不深刻,这本书貌似很经典,想看)
04 程序像河水一样流动着
181108:2107:程序的流程到根本只有3种:顺序、条件、循环,如果看到更底层的硬件层面,其实可以把循环和条件归为一类,条件是跳转到另一个地址,而循环则是跳转到之前出现过的地址;写程序之前可以先简单画大概的流程图,其实就等价于算法,不过算法可能还需要更加细致;流程图主要使用的就是圆角矩形表示开始结束、矩形表示操作、菱形表示条件、箭头和连线表示执行的顺序流程;所谓程序块就是代码的集合;所谓结构化程序设计,就是只具有顺序、条件、循环,而没有goto等所谓跳转,因为goto这种跳转命令用得不好就会导致整个程序执行的逻辑复杂、难以理解,而仅仅根据已有的3种流程已经能够组合出所有想要的程序需求了;几乎所有的程序都可以分为初始化处理+循环处理+收尾处理这三个过程;两种特殊的流程,中断和事件驱动,严格的说他俩都是条件的一种,中断突然类似来了个电话,解决之后又再回到原本的任务中来,事件驱动则是类似通知,接收到某个通知之后,改变当前的状态;事件驱动主要用于GUI程序的编写,更适合使用状态转换图or状态转换表来进行描述。
进阶书:程序设计相关——代码大全&代码整洁之道&代码之美(很经典,而且貌似很细致,想看)、HeadFirst设计模式(讲解了多种设计模式,看名字感觉对小白也比较有爱)、设计模式之禅(据说很经典,想看)、领域驱动设计(据说很经典、想看)
05 与算法成为好朋友的七个要点
181108:2133:所谓哨兵就如字符串的末尾用\0表示,链表的末尾用-1表示的这种特殊的数据,之前见过一些使用哨兵的技巧,但是不知道这就是哨兵;计算机程序的算法必须是步骤明确且有限的;计算机只能机械的解决问题,虽然有时候解决问题的方法比较复杂,但考虑到计算机的运行速度极快,利用好了也可以执行非常简单的算法;一些主要的典型算法是必须要掌握的:辗转相除法(求最大公约数,求最小公倍数就用两者相乘除以最大公约数)、埃拉托斯特尼筛法(求某个数是否是素数,直接直觉的从2除到该数的平方根即可)、查找搜索的顺序、二分、哈希,排序的冒泡、快排;解决同一个问题可能有多种算法,而其中执行速度快的、占用空间少的算法当然更为优秀,要善于利用编程技巧(如哨兵)、数字规律(公式or特殊规律)等来优化算法,减少执行时间;善于使用流程图or伪代码先把算法写出来,想清楚之后再开始编码。
进阶书:算法导论(讲算法中堪比圣经了吧,不过貌似比较难理解)、算法第4版(据说这个作为算法入门比较不错)
06 与数据结构成为好朋友的七个要点
181108:2156:这章可以说是自己第1个能够把3个问题全部回答出来的章节了,整体就是在讲数据结构的东西,数组、栈、队列、链表、二叉树,这几种基本的数据结构,算是简单的复习了一遍,还有C结构体的概念;其中栈和队列有个特性是说,经常用于不能立即处理的数据,进行缓存,感觉就是消息队列kafka的核心了。数组是最基础的数据结构,其他的数据结构都是基于数组进行的变种,因为数组这种分配连续一块内存空间地址的方式,与计算机物理分配内存一致。这章还算比较友好,不过相对的学到的新东西其实也少了。
进阶书:数据结构(可以复习复习,其实数据结构和算法密不可分,看上面的基本就OK)
07 成为会使用面向对象编程的程序员吧
181108:2234:算是复习了一下面向对象编程和面向过程编程的最大的不同点和特性,主要就是类、继承、封装、多态,继承顾名思义就是继承类,封装则是把类中的属性和函数设置为private不让外面调用,形成一个封闭的盒子,多态则是对于同一个消息,不同的对象能够进行不同的操作;类和对象的关系,类是对象的定义,对象是类的实例;里面比较新的是对UML统一建模语言的介绍,九大图,之前有看到过,但是没有去搜,这里看到了很不错把面向对象编程作为一种能提升编程效率、写出易于维护的代码的编程方法, 在适当的场合实践面向对象编程;使用类有3种情况:一个是继承该类定义新类、一个是调用该类持有的个别成员(函数)、一个是在类的定义中使用其他类。考虑python,它既是一种解释型脚本语言,也能够支持使用面向对象编程的思想,重点是在什么情况下使用面向过程,什么情况下使用面向对象。
进阶书:面向对象相关(和前面程序设计相关结合看,基本上讲程序设计的都会说到面向对象编程)
08 一用就会的数据库
181108:2302:数据库这个,之前也是上过课的,整体来说,由于这本书03年写的,肯定有一些技术有点滞后,特别是对近几年火的非关系型数据没有进行探讨,不过这里对关系型数据库的介绍还算不错,如何对关系型数据库进行拆表、主键、外键、CRUD、数据库事务的原子性操作、SQL语句,Visual Basic 6.0中以前用过的ADO数据对象,用于处理和数据库的交互的类;任何语言都有能够和数据库交互的数据对象,基本操作就是:程序开始时建立链接,进行CRUD操作,结束时关闭链接。
进阶书:关系型数据库(MySQL、Oracle)、非关系型数据库(MongoDB、GraphDB、Redis、NoSQL精粹)、分布式数据库。(这部分的书暂时还没有找好,不过根据想要了解的某种数据库,比较经典的书应该也是比较好找的)
09 通过七个简单的实验理解TCP/IP网络
181112:1019:所谓协议,就是一种通信标准,对信息发送方式的规定or约束;从底往上,网卡(LAN内的MAC地址在网卡上)-网卡驱动程序-IP层(LAN外的IP地址)-TCP层-应用程序(FQDN,主机名+域名);LAN中,MAC到IP的转换,由ARP地址转换协议规定,路由器通过广播询问某个IP的MAC地址是谁,该主机应答后,在路由器中记下ARP缓存表,定时询问更新缓存;LAN中IP地址地址的分配,包括路由器的IP地址的分配由DHCP协议(服务器)搞定,服务端记录可用的IP池,客户端申请时自动分配可用的IP地址给主机;LAN中,FQDN和IP的转换,则由DNS服务器搞定,实际上内网中各自主机的转发用不到DNS,如果路由器发现数据包目的IP就在LAN内,则直接转发,如果目的IP和源IP不在同一个LAN内,则需要通过路由器转发;网络中的传输都是通过IP来标识数据包寻址的,域名只有上升到应用程序的时候才考虑,但其实每个LAN都有一个域名,每个LAN内的主机也有一个主机名,组合起来的FQDN就是域名,也可以唯一标识一台主机;MAC地址由两部分构成,制造厂商的编号+厂商内部的编号;子网掩码的作用是为了标识IP地址的网络地址部分和主机地址部分。windows下查看一些信息的命令(linux可能也有同名命令):
- ipconfig /all :可以查看主机MAC地址、IP地址、主机名、子网掩码、默认网关(路由器IP地址)等
- route print :输出路由器的路由表,5列构成:目的IP+子网掩码+路由器IP+接口+距离
- tracert FQDN :跟踪路由路径,访问某个网站的路由路径信息
- nslookup :构造DNS请求数据包,查看响应结果
- arp -a :查看路由表ARP缓存信息,对应的MAC地址和IP地址。
进阶书:计算机网络(经典课本,感觉可以复习复习)、图解TCP/IP第5版(这本书讲解风格比较容易理解,适合入门,之前没看完)、TCP/IP详解卷1-3(差不多是类似圣经,经典必看了,里面的内容比较深入、底层,把代码的实现细节都写出来了,感觉理解起来有一定难度)、UNIX网络编程卷1-2(一直很想看完的书,但是一直没看完……)、HTTP权威指南(也是经典必看,做网络必须要深入了解HTTP协议原理)、Linux鸟哥私房菜基础学习篇+服务器架设篇(考虑到大多数网络服务器都是在Linux系统下,而且有很多网络相关的命令,深入了解Linux也是做网络的必备工夫)
10 试着加密数据吧
181112:1626:整体来说这章的内容还是比较浅显,只是对对称加密和非对称加密稍微讲了讲,介绍了下数字签名,是公私钥对的简单应用。还是比较简单,如果涉及到证书验证之类的可能会比较难一些。不过也从侧面说明这部分自己掌握得还算不错吧。合理的密钥应该满足如下条件: 长短适中、 可以反复使用、 可以通过某种通信手段交给接收者, 并且通信双方以外的其他人难以用它来解密。
进阶书:加密与解密(一直想看,结果没看)、HTTPS/SSL/证书相关(书还没找,但一直想深入了解其原理,现在做网络绕不开加密了,加密流量越来越多,非常需要深入了解,进一步可能需要了解一下区块链技术)
11 XML究竟是什么
181112:1707:XML其实是一种标记语言的源语言;标准的XML由3部分组成:XML声明+DTD/XML schema+XML主体,声明定义这是一个XML文档,类似文件头部,DTD/XML schema严格定义XML文档中能够使用的标签及数据及数据位数类型等,主体则是XML传输的数据内容;XML可以应用到任何领域,只要是想要为信息标记含义的应用场景;但是XML是通用的,但并不是万能的,在例如互联网or分布式计算等需要多个不同标准格式的主机之间传输数据时,作为通用的数据格式,XML非常有用,但是如果所有的主机都是同一个厂商的,其实使用厂商内部定义的格式更为高效并节约内存;相对于XML,csv格式的文件没有定义数据信息,而是只传输了数据本身,更为节省内存,另外csv文件格式传输字符串的时候使用双引号包含起来,可能内部的逗号就不会被认为是分隔符;由于XML可以使用于多个领域,而且标签是可扩展的(即任意指定),肯定会存在同形异义的情况,所以有xmlns属性作为命名该标签的命名空间,明明空间的指定一般使用URI,这样能够全世界唯一标识该XML使用的命名文件,这样如果存在标签的同形异义,就不会误会了(命名空间的名称其实可以任意写);用于解析XML的程序有很多,DOM、SAX其实都是一种解析标准,很多编码语言都已经实现了XML的解析库,直接调用即可。这里也是没有介绍新技术HTML5,毕竟2003年HTML5还没有出现。
进阶书:数据传输格式貌似没什么可进阶的,不过如果考虑到XML大量应用于Web开发的话,Web开发相关的进阶技术栈就非常多了;之前做过一些网页前端开发的东西,对HTML/CSS/JS/XML/DOM等相关的技术有一定了解,不过并不深入,后续有需要的话可能会进一步学习,不过感觉还是对后端更感兴趣一些。
12 SE负责监管计算机系统的构建
181112:1741:这里说的SE系统工程师,感觉是把产品经理和技术经理结合起来了,或者说就是在人少时候的技术经理,需要懂一点技术,而且能够和客户沟通需求,既要求沟通能力也要求技术能力;简单介绍了软件开发时最简单的瀑布模型,基本就是按照顺序进行的阶段,每个阶段具有其具体的输出文档;所谓设计就是拆解(最好使用面向对象进行拆解,这样当现实世界进行变化的时候,可以通过只改变那一个对象而进行顺利过渡),所谓编码就是集成(通过从小到大的编写模块单元测试,最终集成成一个系统进行集成测试);拆解的程序设计方法,根据拆解时候关注的事物不同,可以有不同的方法,但是究其根本的原则,还是顺延计算机的三大原则,输入运算输出、符合计算机处理方式的设计原则,更适合计算机程序设计;系统的可用率计算,当多配置一台机器,其设备可用率就能够从90%上升到99%,这个在数学之美里面也看到过,很神奇,但数学就是这样。
进阶书:如果从技术的角度,这部分的进阶应该就是软件架构相关了。软件架构的艺术(据说很经典)、大型网站技术架构:核心原理与案例分析(之前看过,但是影响不深刻,而且这本书可能已经比较旧了)、大规模分布式系统架构与设计实现(一直很想了解分布式相关的东西,想看)
全书总结:
181112:1749:整体花了近10h看完这本书,虽然其实是一些很基础的知识介绍,但是也有一些说实话是之前都没有了解过的完全全新的内容,差不多占10%左右,还有一些内容是之前了解过,但是并不是很熟练然后相当于是复习加固了一遍,感觉还是不错的。这是整理编程书籍之后看的第一本书,希望今年能够把计算机的基础重新复习加固一遍,很多东西其实自己真的没有掌握很好的,无论怎样,打好基础是很重要的。
这本书的优点是讲解十分浅显易懂,感觉即使是完全的小白也能够理解大概;但是缺点是有些内容可能有点点过时,经典的原则、那些基础中的基础当然具有漫长的声明周期,但是有些新技术其实应该加入到里面来的,而没有加入,作为打基础感觉欠缺了一些新技术的介绍。
无论是想要复习的、新学习的方向进阶书都太多了, 准备还是先把基础看完、整理、复习OK之后再慢慢往上。
暂定阅读计划顺序:
- 程序是怎样跑起来的(和本书同一个作者,不过是2001年写的,会有一些重复的内容,不过也有一些本书没有覆盖到的)
- 网络是怎样连接的(这三本书是同一个系列的,总是成套卖,还是比较经典的,想一次性看完)
- 程序员的自我修养——链接、装载与库(很想把编译这块没有了解的弄明白)
- 编译原理(这本书感觉会比上面这本难,所以先看上面这本打个底)
- 程序员的数学(看完编译原理看这个放松一下)
- 操作系统概念(算是复习一下)
- 七周七语言:理解多种编程范型(接触过的编程语言也算是有一些了,可能现在看这本书会比较有感觉了)
- 多核编程入门(之前一直不太了解多核、并行、分布式这堆东西,想看看了解下)
这些是已经下载好准备看的计算机基础概念相关的书了,不知道19年之前能看到第几本,争取坚持每天看2h吧。