自学书籍
C 程序设计语言
C 程序设计语言的作者是Brian W. Kernighan/ Dennis M. Ritchie,因此这本书也被称为K&R,号称”C语言的圣经“,其中Dennis M. Ritchie丹尼斯·里奇是C语言之父,Unix之父,图灵奖、计算机先驱奖获得者,是可以排进程序员前十的大牛。
深入理解计算机系统
这本书对于程序员来说,号称价值堪比等重量的黄金,是国外诸多名校以及国内顶级985的必修基础课程。有余力者,推荐直接看英文。 这本书无论是在国外还是在国内都是被公认的经典,英文为Computer Systems A Programmer's perspective,简称CSAPP,是四大名校CMU 15-213的教材。主要讲的是程序员的视角讲述应用开发者(码农)如何能够根据计算机系统知识编写出更好的程序,是国内外公认的最值得阅读的计算机书籍之一。
计算机程序的构造和解释
这本书的英文名为Structure and Interpretation of Computer Programs,简称为SICP,在国外也被称为”The Wizard Book“(巫师书)。这本书曾经长期是MIT本科入门第一课(不过现在四大CS名校入门第一课都改成了Python,MIT在2009年也是),但是这本书仍然是必看的经典,是所有MIT计算机科学、电子工程的学生都必修的一本书。
设计模式
这本书可以说是设计模式的开山之做,面向对象以及设计模式是程序员必须掌握的基础技能了。因为这本书的作者是四个人,也被称为四人组(Gang of Four),于是这本书也被称为GoF,23种设计模式就是因为这本书。
算法导论
这本书的作者也是四个人,Thomas H. Cormen,Charles E. Leiserson,Ronald L. Rivest,Clifford Stein,因此这本书的简称就是这四位大神名字的首字母为CLRS。这本书属于算法里的圣经,也是MIT 6.046的教材,推荐和MIT教学视频一起学习。
这种硬核的书,你不能指望像学编程语言一样很快就能看完,即使是MIT的学生,也要耗费一年的时间来学习此书的部分章节。更建议你可以先阅读《算法》或者其他数据结构与算法的书,比如《数据结构与算法分析 某某语言描述》,去刷一刷LeetCode.
计算机网络:自顶向下方法
这本书被数百个大学作为计算机网络课程的教材。”鉴于有那么多关于网络服务端和客户端的软件工程,计算机网络是计算机科学中价值最为'立竿见影'的领域之一“,关于计算机网络也是互联网企业面试必考的。
计算机体系结构-量化研究方法
这本书是最权威的计算机体系结构著作书中系统地介绍了计算机系统的设计基础、指令集系统结构、流水线和指令集并行技术、层次化存储系统与存储设备、互连网络以及多处理器系统等重要内容。英文名为Computer Architecture:A Quantitative Approach,简称CAAQA。这本书的作者是John L. Hennessy / [美] David A. Patterson,也是计算机组成与设计的作者,这个计算机组成与设计分RISC-V和ARM。
现代操作系统
国内很多人都更推荐现代操作系统,国外不少人推荐操作系统导论
操作系统导论
相关资源
2.计算机组成原理
计算机组成原理这门课很好地向我们阐述了计算机是如何工作的,是如何计算和输出我们想要的数据的,同时由于本门课是考研科目,所以各个大学都会有一些公开课视频,比如清华大学等,大家可以自行搜索得到,笔者就不再推荐了。这里推荐的是笔者看过的几本书。

首先推荐的是两本比较通俗易懂的书《大话处理器》和《编码》,这两本书都偏科普一些,阅读起来相对轻松,也更有趣味性,是不错的入门书籍。

最近笔者在看的另一本比较通俗易懂的书叫《穿越计算机的迷雾》,个人觉得写的比上面两本更通俗一些,大家也可以先读这本书。不过由于这本书已经绝版了,大家可以尝试到淘宝上看能否找到。

最后需要重点介绍的是《深入理解计算机系统》这本书,这本书是从程序员的角度来看待整个计算机系统的,所以是非常适合程序员的。但是这本书不仅仅包含了计算机硬件的相关知识,同时还包含了包括操作系统、计算机网络等相关知识,因此需要读者具备相关的知识才能学得更好,不过从零开始也是可以的,不过可能会比较吃力些。
4.计算机操作系统
跟计算机组成原理一样,计算机操作系统同样是一门考研课程,所以网络上存在的资料是非常多的,大家可以自行搜索。不过笔者还是需要推荐两本书,一本是笔者本科和研究生期间都学过的一本书《现代操作系统》,研究生期间有幸得到这本书的译者陈向群老师的亲自授课,也是学到不少知识。

5.计算机编译原理
很多自学编程的同学(包括计算机专业和非计算机专业)都不是很清楚编程语言编译时到底发生了什么事情,并且对什么是编译期、什么是运行时都一知半解。编译原理这门课就是告诉我们高级语言是如何一步一步地被转化为低级语言,并最终能够在计算机上运行的。

书籍推荐的话当然是经久不衰的《编译原理》这本书了,教学视频的话,大家可以到网络上找下。
6.离散数学
离散数学个人认为对于计算机学生而言是非常重要的一门课,可惜的是由于在本科期间对计算机认知的不够,导致在学习这门课的时候只是把它当做一门数学来学习,并且也没有花太大的精力来学习,相信对于大部分的计算机专业的同学来说也是这样的。
不过我认为如果有时间和精力最好还是再重新学习这门课或者在大学期间就好好学习,并持续不断地来复习这么课中提到的知识,直到掌握为止。

7.数据结构与算法
相信无论是已经毕业的同学还是正在学校学习的同学,都或多或少地被数据结构与算法这门课给折磨过。数据结构与算法这门课开篇就讲了一个非常重要的概念:程序 = 数据结构 + 算法,对于初学者可能还不能完全地理解这句话,不过对于已经工作两三年的同学相信对这句话是深信不疑的。
对于数据结构与算法的学习,我个人认为应该分层三个步骤:首先先大致了解什么是算法,可以通过一些科普读物来入门,这个过程我称之为入门阶段;接着可以尝试实现一些比较容易的数据结构和算法,这样可以更加深对数据结构和算法的了解,这个过程我称之为实践阶段;最后去了解数据结构与算法背后的相关数学原理等,这个过程我称之为原理阶段。
那么对于这三个阶段,我分别分享两本本人在读或者读过的书,大家可以参考和借鉴。

入门阶段我推荐的是《算法图解》和《啊哈!算法》,这两本书通过简单通俗易懂的方式阐述了几个常用的算法,让大家对算法有个大致的了解,并学习一些基本的、常用的数据结构与算法。

实践阶段我推荐的是《数据结构(Java版)》,由于本人是从Java开始学起的,大家可以根据自己学习的语言找来对应的实践书籍来学习。通过实践过程,大家可以一方面学习书中各种数据结构的实现原理和算法的设计思路,同时可以对照着编程语言中这些数据结构的实现原理,比如可以对照Java中对于链表是如何实现的,这样不仅可以了解数据结构与算法是怎么回事,同时也对自己学习的编程语言进一步做了深入的研究。

理论阶段我推荐的是《算法心得》和《算法导论》这两本书,其中特别是《算法导论》这本书,其中可能牵涉到很多数学的推理过程,不过通过这个阶段的学习能够让自己的思路更上一层楼。
其实,对于理论部分还有一套读起来特别费劲的书籍,这里没有做推荐,是因为我觉得对于大部分的程序员,可能没有太大必要去研究它。这里之所以提及,是觉得大家如果有空闲时间,闲来无事翻翻也行。这套书叫《计算机程序设计艺术》,作者是唐纳徳·E. 克努特(Donald E.Knuath,中文名高徳纳),目前已经出到了第四卷上卷,书中大量的数学推理,所以数学比较好,并且爱好钻研的同学可以尝试读读。
8.计算机网络
计算机网络的相关知识在工作时使用的频率还是挺多的,即使不是直接的使用其相关的知识,也会通过一些软件间接的使用相关的知识。对计算机网络的认知也可能成为日后自身发展的瓶颈,比如做分布式系统的同学。

对于计算机网络同样有两个阶段的书籍来推荐,第一个阶段,也就是入门阶段,《图解HTTP》和《网络是怎样连接的》可以比较快速地了解计算机网络中比较基础的相关概念,建立起对网络的认知。

第二个阶段,也就是理论和实践阶段,推荐的是比较著名的《TCP/IP详解》这套书,这套书共分为三卷,分别从协议的原理、协议的实现等角度来阐述TCP/IP。