《算法》《算法导论》《数据结构与算法分析XX语言描述》《离散数学及其应用》这几本书应该以什么顺序学习? 除了这几本书(《算法》 《算法导论》 《数据结构与算法分析java语言描述》《离散数学及其应用》)之外,还有《CSAPP》、《30天自制操作系统》、《TCP/IP协议详解卷I》、《编译原理》。 这几本书我都买了, 但是不知道以什么顺序来看。我并非计算机专业,但目前有一些java开发经验了,目前为了看《CSAPP》(还没看,简介说用C写了代码)在学习C (《C程序设计语言》)。 所以我想请问各位大佬两点问题: 一、这些书籍是否遗漏了计算机专业的必修课? 二、应该以什么顺序看这些书? 万分感谢。
答案在本文第2节
若您想节约时间,请直接跳到"二、应该以什么顺序看题主买的这些书?"
--答主提示
有效学习计算机学科的知识,对任何想要进入计算机行业的人士来说都及其重要。掌握好的学习顺序,能在阅读计算机学科图书时,加快学习速度,减少时间浪费。
然而,对于计算机新人来说,要知道正确的图书学习顺序并非易事。不少像题主这样热爱学习的新人来说都难免会产生问题描述那样的苦恼:《算法》 《算法导论》 《数据结构与算法分析java语言描述》《离散数学及其应用》《CSAPP》《30天自制操作系统》《TCP/IP协议详解卷I》《编译原理》这些书我应该以什么顺序学习?或者说用怎样的学习路径,才能尽可能的快速学完这些书?
目前知乎还缺乏这方面类似的问题和回答,因此本回答认为研究题主的问题对那些渴望学习知识但又找不到门路的计算机新人具有意义。
本回答的目标是解决题主提出的两个问题。第一,题主在问题中提到的这些书籍是否遗漏了计算机专业的必修课?第二,应该以什么顺序看这些书?本回答会给出遗漏的必修课清单,给出看这些书的顺序,并进行分析和说明原因。
首先回答题主的第一个问题
一、这些书籍是否遗漏了计算机专业的必修课?
是。遗漏了以下几类必修课,
①基础理论类:《计算机科学导论》《计算机组成与结构》《数据库》《计算机网络》
②工程类:《软件工程》《软件项目管理》《软件测试》《软件架构》
③编程方法类:《设计模式》《UML、面向对象分析与设计》
《深入理解计算机系统》中虽然也讲到了《计算机组成与结构》,但是不全,尤其是硬件。另外《软件工程》《项目管理》《软件架构》等科目如果以后不打算进入管理岗位,可以无视。但《软件测试》是必须要看的,起码得了解基础概念,因为哪怕你不做测试人员,《软件测试》里的测试、调试知识也可以让你在写代码时少犯很多错,节约大量时间。
《UML、面向对象分析与设计》建议最好掌握。《设计模式》看自己个人目标了,如果每天写点业务、写点增删改查,不打算在编程方面进阶就不用看了。
另外我个人认为还应该必修有:《编码规范》《汇编》《计算机专业英语》
再回答题主的第二个问题
二、应该以什么顺序看题主买的这些书?
应该按以下顺序看这些书:
注:其中的《数据结构与算法 Java语言描述》是Frank.M.Carrano版,见附录
《算法导论》的学习方法是当成词典,把它作为算法词典进行查询。按上面表格在学习过程中遇到算法就去《算法导论》中查找看是否有这一算法,然后对应算法条目学习,就像你用英语词典查英语单词一样。
三、为什么应该按上述顺序看书?
下面分析和说明详细原因,也就是解释为什么要按上述顺序看书,这个表格是怎么来的。
1.书内容之间存在依赖关系
首先我们要明白,这些书的知识内容之间并不是完全线性的。也就是说一些章节必须要在另外一些章节之前看才行,否则会很难理解后面章节的内容。例如你如果没有先学《算法》第5章中的自动机知识的话,那么学习《编译原理》第10章时就会困难重重。因此为了节约时间,高效看书,我们应该先看前者然后看后者,这样避免了看不懂书冥思苦想造成的时间浪费。
书内容之间存在的这种依赖关系其实就是拓扑顺序,但它们不是只存在几条,而是有很多相互纠缠甚至交错的依赖关系(拓扑顺序)。这几本书的知识内容之间存在依赖关系,要精确到章节,它们的依赖关系很复杂,正如下列视频所示:
书的章节之间有着复杂的依赖关系
注:视频中橙红色边表示经过拓扑排序后得到的线性路径。
2.将问题建模成拓扑排序问题
我们可以用拓扑排序解决这些依赖关系,得到一个线性顺序,也就是学习这些书的先后顺序。拓扑排序是图论中的一个算法,运用拓扑排序可以解开书内容之间的拓扑顺序。从图论的观点来看,书的每一个章节就是图的一个节点,书内容之间的依赖关系就是图中的边,章节与章节之间如果存在一条依赖关系,那么就相当于图中这两个节点之间存在一条边。
某些章节前后是连续的,可以合并,因此这些书共152个节点(152章)合并后为122个节点。如下表:
3.求出线性的看书先后顺序
这个有122节点和247条依赖关系构成的图是一个有向无环图(DAG)
图画出来是这样:
然后,对该图进行拓扑排序,解开其拓扑顺序,得到一条线性路径即线性顺序,就是正确的看书学习先后顺序了。
解出的先后顺序如下图:
最后,根据这些节点对应到相应章节,进行化简,就得到了前面给出的看书顺序了,整理后的最终结果就是前面的看书顺序表格。
四、题外内容
另外说一些题外话,一些学习建议和注意事项
①多久才能学完?
题主要学完这些书,按前面给出的表格顺序看书学习,在不包括做书后面习题、记忆复习、敲代码练习所花时间的前提下,保守估计最少需600小时
也就是说,如果每天能投入3-5小时有效看书学习时间,学完这些书的总时间为4-7个月
②还需要更多的参考书
前面给出表格的学习顺序并不是完全光滑的,仍然突兀,因为这几本书还不够,光靠这几本书的内容学习过程可能仍会遇到难以理解的内容。
例如表格中最后的《编译原理》第4章-第12章,看起来好像是按顺序学到底就行了。实际上在代码优化部分第9章-第12章,如果你没有基础知识,将会不知所云,觉得这部分晦涩难懂,这是因为你不了解《组合优化》的基础知识。
再比如看《30天自制操作系统》时,你必须要懂汇编,还要有C语言基础知识。因为这本书的代码是汇编和C语言写的。
因此光靠这些书还不够,为了学习更顺畅,应该再买几本书作为中间的“润滑剂”。例如《组合优化》《非线性规划》《汇编》《并行算法》等。
③看书注意事项
《30天自制操作系统》这本书严格来说只能算GUI,而不是操作系统内核。事实上这本书只有第15和16章涉及到了进程调度;还有尽管这本书第9章标题声称是内存管理,但它根本算不上真正的内存管理。这本书是我看过的日本书中少有的逻辑比较混乱那种,看书时需要小心。当然这本书作为初学学习用于对操作系统起到感性认识还是不错的。
由于《30天自制操作系统》这本书并不是实现操作系统内核,如果题主想实现内核应该参考其他操作系统。例如BSD 4.4(1994年)、FreeBSD、MINIX 3等操作系统都是不错的选择。
附录、这几本书的内容结构如下:
①《离散数学及其应用》讲的内容是
②《深入理解计算机系统》讲的内容是
③《TCP/IP详解 卷1 协议》讲的内容是
《数据结构与算法分析 Java语言描述》有很多本,不知道题主说的是哪一本。不过都大同小异,就以Carrano的《数据结构与算法分析 Java语言描述》为例好了
④《数据结构与算法分析 Java语言描述》讲的内容是
《编译原理》也有很多本,这里默认题主指的是龙书:
⑤《编译器:原理、技术和工具》讲的内容是
声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。
作者:imagineit
来源:知乎
More:【微信公众号】 u3dnotes