PDF 版本的书籍我已经整理好,点击这个链接即可打包下载!没有解压密码!没有解压密码!没有解压密码!
开源的目的是为了大家能一起完善,如果你觉得内容有任何需要完善/补充的地方,欢迎提交 issue/pr。
- Github地址:https://github.com/CodingDocs/awesome-cs
- 码云地址:https://gitee.com/SnailClimb/awesome-cs (Github无法访问或者访问速度比较慢的小伙伴可以看码云上的对应内容)
目录 :
计算机基础
这部分内容我不光会推荐书籍,还会顺便推荐一些我觉得不错的教学视频&Project。
操作系统
操作系统中的很多**、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。
比如说我们开发的系统使用的缓存(比如 Redis)和操作系统的高速缓存就很像。CPU 中的高速缓存有很多种,不过大部分都是为了解决 CPU 处理速度和内存处理速度不对等的问题。我们还可以把内存可以看作外存的高速缓存,程序运行的时候我们把外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。同样地,我们使用的 Redis 缓存就是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。
高速缓存一般会按照局部性原理(2-8 原则)根据相应的淘汰算法保证缓存中的数据是经常会被访问的。我们平常使用的 Redis 缓存很多时候也会按照 2-8 原则去做,很多淘汰算法都和操作系统中的类似。
既说了 2-8 原则,那就不得不提命中率了,这是所有缓存概念都通用的。简单来说也就是你要访问的数据有多少能直接在缓存中直接找到。命中率高的话,一般表明你的缓存设计比较合理,系统处理速度也相对较快。
学好操作系统能够提高自己思考的深度以及对技术的理解力。
如果你要系统地学习操作系统的话,最硬核最权威的书籍是 《操作系统导论》 。你可以再配套一个 《深入理解计算机系统》 加深你对计算机系统本质的认识,美滋滋!
另外,去年新出的一本国产的操作系统书籍也很不错:《现代操作系统:原理与实现》 (夏老师和陈老师团队的力作,值得推荐)。
如果你比较喜欢动手,对于理论知识比较抵触的话,我推荐你看看 《30 天自制操作系统》 ,这本书会手把手教你编写一个操作系统。
纸上学来终觉浅 绝知此事要躬行!强烈推荐 CS 专业的小伙伴一定要多多实践!!!
以及一个学弟手写的操作系统内核: 《从零实现一个操作系统内核!》 。
其他相关书籍推荐:
- 《自己动手写操作系统》 : 不光会带着你详细分析操作系统原理的基础,还会用丰富的实例代码,一步一步地指导你用 C 语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。
- 《现代操作系统》 : 内容很不错,不过,翻译的一般。如果你是精读本书的话,建议把课后习题都做了。
- 《操作系统真象还原》 : 这本书的作者毕业于北京大学,前百度运维高级工程师。因为在大学期间曾重修操作系统这一科,后对操作系统进行深入研究,著下此书。
- 《深度探索 Linux 操作系统》 :跟着这本书的内容走,可以让你对如何制作一套完善的 GNU/Linux 系统有了清晰的认识。
- 《操作系统设计与实现》 :操作系统的权威教学教材。
- 《Orange'S:一个操作系统的实现》 : 从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程。配合《操作系统设计与实现》一起食用更佳!
如果你比较喜欢看视频的话,我建议你可以看看北京交通大学的慕课《操作系统》。
这个视频课程基本把操作系统的体系结构、设计机理及实现方法和技术相关重要的知识点介绍的差不多了。
还有下面这个国外的课程 《深入理解计算机系统 》 也很不错。
计算机网络
计算机网络是一门系统性比较强的计算机专业课,各大名校的计算机网络课程打磨的应该都比较成熟。
要想学好计算机网络,首先要了解的就是 OSI 七层模型或 TCP/IP 五层模型,即应用层(应用层、表示层、会话层)、传输层、网络层、数据链路层、物理层。
关于这门课,首先强烈推荐参考书是机械工业出版社的《计算机网络——自顶向下方法》。该书目录清晰,按照 TCP/IP 五层模型逐层讲解,对每层涉及的技术都展开了详细讨论,基本上高校里开设的课程的教学大纲就是这本书的目录了。
如果你觉得上面这本书看着比较枯燥的话,我强烈推荐+安利你看看下面这两本非常有趣的网络相关的书籍:
- 《图解 HTTP》 : 讲漫画一样的讲 HTTP,很有意思,不会觉得枯燥,大概也涵盖也 HTTP 常见的知识点。因为篇幅问题,内容可能不太全面。不过,如果不是专门做网络方向研究的小伙伴想研究 HTTP 相关知识的话,读这本书的话应该来说就差不多了。
- 《网络是怎样连接的》 :从在浏览器中输入网址开始,一路追踪了到显示出网页内容为止的整个过程,以图配文,讲解了网络的全貌,并重点介绍了实际的网络设备和软件是如何工作的。
除了理论知识之外,学习计算机网络非常重要的一点就是:“动手实践”。这点和我们编程差不多。
Github 上就有一些名校的计算机网络试验/Project:
- 哈工大计算机网络实验
- 《计算机网络-自顶向下方法(原书第 6 版)》编程作业,Wireshark 实验文档的翻译和解答。
- 计算机网络的期末 Project,用 Python 编写的聊天室
- CMU 的计算机网络课程
我知道,还有很多小伙伴可能比较喜欢边看视频边学习。所以,我这里再推荐几个顶好的计算机网络视频讲解。
1.哈工大的计算机网络课程 :国家精品课程,截止目前已经开了 10 次课了。大家对这门课的评价都非常高!所以,非常推荐大家看一下!
2.王道考研的计算机网络 :非常适合 CS 专业考研的小朋友!这个视频目前在哔哩哔哩上已经有 1.6w+的点赞。
除了上面推荐的书籍和视频之外,再推荐两篇计算机网络总结的文章:
最后再补充一个:浙江大学的计算机网络课程资料、教材和试卷 。需要的小伙伴请查收!
算法
先来看三本入门书籍。 这三本入门书籍中的任何一本拿来作为入门学习都非常好。
我个人比较倾向于 《我的第一本算法书》 这本书籍,虽然它相比于其他两本书集它的豆瓣评分略低一点。我觉得它的配图以及讲解是这三本书中最优秀,唯一比较明显的问题就是没有代码示例。但是,我觉得这不影响它是一本好的算法书籍。因为本身下面这三本入门书籍的目的就不是通过代码来让你的算法有多厉害,只是作为一本很好的入门书籍让你进入算法学习的大门。
再推荐几本比较经典的算法书籍。
这本书内容非常清晰易懂,适合数据结构和算法小白阅读。书中把一些常用的数据结构和算法都介绍到了!
我在大二的时候被我们的一个老师强烈安利过!自己也在当时购买了一本放在宿舍,到离开大学的时候自己大概看了一半多一点。因为内容实在太多了!另外,这本书还提供了详细的 Java 代码,非常适合学习 Java 的朋友来看,可以说是 Java 程序员的必备书籍之一了。
下面这些书籍都是经典中的经典,但是阅读起来难度也比较大,不做太多阐述,神书就完事了!
经典名著,ACM 冠军、亚军这种算法巨佬都强烈推荐的一本书籍。这本书的作者也非常厉害,Java 之父 James Gosling 就是他的学生。
很多人都说这本书不是教你具体的算法,而是教你一种编程的思考方式。这种思考方式不仅仅在编程领域适用,在其他同样适用。
这是一本被 Github 上的爆火的计算机自学项目 Teach Yourself Computer Science 强烈推荐的一本算法书籍。
类似的神书还有 《算法导论》、《计算机程序设计艺术(第 1 卷)》 。
如果说你要准备面试的话,下面这几本书籍或许对你有帮助!
这本面试宝典上面涵盖了很多经典的算法面试题,如果你要准备大厂面试的话一定不要错过这本书。
《剑指 Offer》 对应的算法编程题部分的开源项目解析:CodingInterviews 。
题目相比于《剑指 offer》 来说要难很多,题目涵盖面相比于《剑指 offer》也更加全面。全书一共有将近 300 道真实出现过的经典代码面试题。
数据结构
其实,上面提到的很多算法类书籍(比如 《算法》 和 《算法导论》)都详细地介绍了常用的数据结构。
我这里再另外补充基本和数据结构相关的书籍。
入门类型的书籍,读起来比较浅显易懂,适合没有数据结构基础或者说数据结构没学好的小伙伴用来入门数据结构。
质量很高,介绍了常用的数据结构和算法。
类似的还有 《数据结构与算法分析 :C 语言描述》 、《数据结构与算法分析:C++ 描述》
计算机专业课
数据库
数据库系统这门课在程序员的职业规划中也是非常重要的一门课,甚至有些信息管理的专业的也要开设这门课。说这门课重要,是因为对于程序员的发展来说,一方面关系数据库系统、SQL 语言以及数据库的三段设计(概念设计、逻辑设计和物理设计)都是开发数据库应用程序的必备技能,通常在数据库应用开发岗位的面试中,数据库的设计是面试官青睐的考点,如何能根据需求分析并设计出完善的数据库系统,是程序员的必备技能,设计好了完善的数据库系统之后,再用 SQL 语言等工具对其进行实现,那么这些其实就是个人的编码能力了。
另一方面,数据库中的查询处理、查询优化、并发控制、事务管理、日志管理等内容,都是数据库中稍微进阶一点的技能,对于一些对岗位要求比较高的,这些技术同样要求熟练掌握。对一些查询优化的等数据库底层实现的内容,也是新型数据库开发的前置基础技能,对于一些研究型人才来说,也是非常重要的。
数据库系统与其他计算机专业课一样,知识体系非常清晰,而且他有一个非常突出的特点,就是实际与理论相结合。SQL 语言,数据库设计等,这些都属于实践应用部分,而对于一些范式定义,两段锁协议并发控制等,这些就偏向于理论多一些。要想学好数据库系统,建议大家:
- 在课程的前期阶段,熟练掌握 SQL 语言的应用,同时不要忘了训练关系代数的应用能力。 关系代数虽然在数据库的实现上作用较小,但在学习阶段,结合关系代数和 SQL 语言学习,可以更加有体系地理清 SQL 语言各个子句之间的逻辑关系,有助于 SQL 语言的学习和记忆。关系代数的学习更像是建立一种思维,这种思维到了数据库底层实现学习环节也是非常有用的。
- 在课程的中期阶段,熟练掌握 ER 图的应用,并强化数据库设计中的理论部分。 ER 图的熟练应用可以更加轻松地设计出关系数据库模式,而理论部分同样不能忽视,设计理论的运用决定了数据库的正确性和健壮性。
- 而在课程的后期阶段,主要就是以理论居多,而且这些理论并不容易能找到配套的实验练习。这里再次强调,凡是理论知识的学习,尽量要结合图解的方式。
数据库基础
教材的话,强烈推荐 《数据库系统概念》 ,这本书涵盖了数据库系统的全套概念,知识体系清晰,是学习数据库系统非常经典的教材!不是参考书!
如果你觉得书籍比较枯燥,自己坚持不下来的话,我推荐你可以先看看一些不错的视频。就比如北京师范大学的《数据库系统原理》这个就很不错。
这个课程的老师讲的非常详细,而且每一小节的作业设计的也与所讲知识很贴合,后面还有很多配套实验。
如果你比较喜欢动手,对于理论知识比较抵触的话,我推荐你看看《如何开发一个简单的数据库》 ,这个 project 会手把手教你编写一个简单的数据库。
纸上学来终觉浅 绝知此事要躬行!强烈推荐 CS 专业的小伙伴一定要多多实践!!!
MySQL
我们网站或 者APP 的数据都是需要使用数据库来存储数据的。
一般企业项目开发中,使用 MySQL 比较多。如果你要学习 MySQL 的话,可以看下面这 3 本书籍:
- 《MySQL必知必会》 :非常薄!非常适合MySQL新手阅读,很棒的入门教材。
- 《高性能MySQL》 : MySQL 领域的经典之作!学习 MySQL 必看!属于进阶内容,主要教你如何更好地使用 MySQL 。既有有理论,又有实践!如果你没时间都看一遍的话,拿我建议第5章(创建高性能的索引) 、第6章(查询性能优化) 你你一定要认真看一下。
- 《MySQL技术内幕》 :你想深入了解MySQL存储引擎的话,看这本书准没错!
视频的话,你可以看看动力节点的 《MySQL数据库教程视频》。这个视频基本上把 MySQL的相关一些入门知识给介绍完了。
学习了 MySQL 之后,务必确保自己掌握下面这些知识点:
-
MySQL 常用命令 :
- 安全:登录、增加/删除用户、备份数据和还原数据
- 数据库操作: 建库建表/删库删表、用户权限分配
- ......
-
MySQL 中常用的数据类型、字符集编码
-
MySQL 简单查询、条件查询、模糊查询、多表查询以及如何对查询结果排序、过滤、分组......
-
MySQL 中使用索引、视图、存储过程、游标、触发器
-
......
如果你想让自己更加了解 MySQL ,同时也是为了准备面试的话,下面这些知识点要格外注意:
- 索引:索引优缺点、B 树和 B+树、聚集索引与非聚集索引、覆盖索引
- 事务:事务、数据库事务、ACID、并发事务、事务隔离级别
- 存储引擎(MyISAM 和 InnoDB)
- 锁机制与 InnoDB 锁算法
Redis
Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。
如果你要学习 Redis 的话,强烈推荐 《Redis 设计与实现》 和 《Redis 实战》 这两本书。另外,《Redis开发与运维》 这本书也非常不错,既有基础介绍,又有一线开发运维经验分享。
下面是我总结的一些关于并发的小问题,你可以拿来自测:
- Redis 和 Memcached 的区别和共同点
- 为什么要用 Redis/为什么要用缓存?
- Redis 常见数据结构以及使用场景分析
- Redis 没有使用多线程?为什么不使用多线程?Redis6.0 之后为何引入了多线程?
- Redis 给缓存数据设置过期时间有啥用?
- Redis 是如何判断数据是否过期的呢?
- 过期的数据的删除策略了解么?
- Redis 内存淘汰机制了解么?
- Redis 持久化机制(怎么保证 Redis 挂掉之后再重启数据可以进行恢复)
- Redis 缓存穿透、缓存雪崩?
- 如何保证缓存和数据库数据的一致性?
- ......
编译原理
编译原理相比于前面介绍的专业课,地位显得不那么重要了。编译原理的重要性主要体现在:
- 底层语言、引擎或高级语言的开发,如 MySQL,Java 等
- 操作系统或嵌入式系统的开发
- 词法、语法、语义的**,以及自动机**
编译原理的重要前置课程就是形式语言与自动机,自动机的**在词法分析当中有着重要应用,学习了这门课后,应该就会发现许多场景下,自动机算法的妙用了。
总的来说,这门课对于各位程序员的职业发展来说,相对不那么重要,但是从难度上来说,学习这门课可以对编程**有一个较好的巩固。学习资源的话,除了课堂上的幻灯片课件以外,还可以把 《编译原理》 这本书作为参考书,用以辅助自己学不懂的地方(大家口中的龙书,想要啃下来还是有一定难度的)。
其他书籍推荐:
我上面推荐的书籍的难度还是比较高的,真心很难坚持看完。这里强烈推荐哈工大的编译原理视频课程,真心不错,还是国家精品课程,关键还是又漂亮有温柔的美女老师讲的!
通用课
通用课的部分我想分为两大部分来介绍,主要就是数学和英语,一般在大一和大二两学年就可以全部修完,大二大三逐渐接触专业课。通用课作为许多高中生升入大学的第一门课,算是高中阶段到本科阶段的一个过渡,从职业生涯重要性上来说,远不及专业课重要,但是在本科阶段的学习生活规划中,有着非常重要的地位。由于通用课的课程多,学分重,占据了本科阶段绩点的主要部分,影响到学生在前两年的专业排名,也影响到大三结束时的推免资格分配,也就是保研。而从升学角度来看,对于攻读研究生和博士生的小伙伴来说,数学和英语这两大基础课,还是十分有用的。
数学
微积分(高等数学)
微积分,即传说中的高数,成为了无数新大一心中的痛。但好在,大学的课程考核没那么严格,期末想要拿高分,也不至于像高中那样刷题刷的那么狠。微积分对于计算机专业学生的重要性,主要体现在计算机图形学中的函数变换,机器学习中的梯度算法,信号处理等领域。
微积分的知识体系包括微分和积分两部分,一般会先学微分,再学积分,也有的学校把高数分为两个学期。微分就是高中的导数的升级版,对于大一萌新来说还算比较友好。积分恰好是微分的逆运算,**上对大一萌新来说比较新,一时半会可能接受不了。不过这门课所有的高校都有开设,而且大部分的名校都有配套的网课,教材也都打磨的非常出色,结合网课和教材的“啃书”学习模式,这门课一定不会落下。
线性代数(高等代数)
线性代数的思维模式就更加复杂了一些,它定义了一个全新的数学世界,所有的符号、定理都是全新的,唯一能尝试的去理解的方式,大概就是用几何的方式去理解线性代数了。由于线性代数和几何学有着密不可分的关系,比如空间变换的理论支撑就是线性代数,因此,网上有着各种“可视化学习线性代数”的学习资源,帮助理解线性代数的意义,有助于公式的记忆。
概率论与数理统计
对于计算机专业的小伙伴来说,这门课可能是概率论更有用一点,而非数理统计。可能某些学校只开设概率论课程,也可能数理统计也教,但仅仅是皮毛。概率论的学习路线和微积分相似,就是一个个公式辅以实例,不像线性代数那么抽象,比较贴近生活。在现在的就业形势下,概率论与数理统计专业的学生,应该是数学专业最好就业的了,他们通常到岗位上会做一些数据分析的工作,因此,这门课程确实是数据分析的重要前置课程,概率论在机器学习中的重要性也就不言而喻了。
离散数学(集合论、图论、近世代数等)
离散数学是计算机专业的专属数学,但实际上对于本科毕业找工作的小伙伴来说,离散数学还并没有发挥它的巨大作用。离散数学的作用主要在在图研究等领域,理论性极强,需要读研深造的小伙伴尽可能地扎实掌握。
英语
英语算是大学里面比较灵活的一项技能了,有的人会说,“英语学的越好,对个人发展越有利”,此话说的没错,但是对于一些有着明确发展目标的小伙伴,可能英语技能并不在他们的技能清单内。接下来的这些话只针对计算机专业的小伙伴们哦。
英语课在大学本科一般只有前两年开设,小伙伴们可以记住,想用英语课来提升自己的英语水平的,可以打消这个念头了。 英语水平的提高全靠自己平时的积累和练习,以及有针对性的刷题。
英语的大学四六级一定要过。 这是必备技能,绝大部分就业岗位都要看四六级水平的,最起码要通过的。四级比高中英语稍微难一些,一般的小伙伴可能会卡在六级上,六级需要针对性的训练一下,因为大学期间能接触英语的实在太少了,每学期一门英语课是不足以保持自己的英语水平的。对于一些来自于偏远地区,高中英语基础薄弱的,考四六级会更加吃力。建议考前集中训练一下历年真题,辅以背一下高频词汇,四六级通过只需要 425 分,这个分数线还是比较容易达到的。稍微好一点的小伙伴可能冲一下 500 分,要是能考到 600 分的话,那是非常不错的水平了,算是简历上比较有亮点的一项。
英语的雅思托福考试只限于想要出国的小伙伴,以及应聘岗位对英语能力有特殊要求的。雅思托福考试裸考不容易通过,花钱去比较靠谱的校外补课班应该是一个比较好的选择。
对于计算机专业的小伙伴来说,英语能力还是比较重要的,虽然应聘的时候不会因为没有雅思托福成绩卡人,但是你起码要能够:
- 熟练使用英文界面的软件、系统等
- 对于外网的一些博客、bug 解决方案等,阅读无压力
- 熟练阅读英文文献
- 具备一定的英文论文的撰写能力
毕竟计算机语言就是字符语言,听说读写中最起码要满足读写这两项不过分吧。
前端
笔者是从事 Java 后端开发的,对于前端的了解属于皮毛,欢迎前端大佬补充和指正。
前端框架更新换代的很快,目前比较流行的是 Vue、React、Angular 。
不过,不管前端这些技术怎么变,前端三剑客(HTML、CSS、JavaScript )是不会变的。
HTML 和 CSS 相对 JS 来说就比较简单了。你可以在 W3school 上学习一些关于 HTML、CSS、JS 的基础知识。然后,通过一个简单的前端项目来实战一下。比如你可以做一个个人简历或者模仿某某官网写个类似的网页。
JavaScript 的水更深,也是前端面试中的重心。
学习 JS的话,MDN 上的JS相关的内容是必须要看的!上面的内容很全面,质量非常高!
初次之外,开源的 JS 教程《The Modern JavaScript Tutorial》非常赞!目前的话,这个系列的教程还被翻译成了多国的语言。
这个教程的内容分为3部分
- JavaScript 编程语言 : JavaScript 入门,还会介绍 OOP 等相关高级概念。
- 浏览器(文档,事件,接口) : 学习如何管理浏览器页面
- 其他文章 : 按需学习其他 JavaScript 高级知识。
Java
我自己是在大二开始学习 Java 的,那个时候已经有了 C 语言的基础。
学习任何一门编程语言,我们先从最基本的开始。
Java 基础
如果你之前没有学习过编程的话,我建议你可以看看视频教程。
像尚硅谷的 《 Java 基础教程系列》 (点击下载视频)和韩顺平老师的《零基础30天学会Java》就很不错。
学习过 Java 的朋友,大部分应该都看过韩老师的课程吧!韩老师毕业于清华大学,录制的视频课程质量都非常高。内容易懂,并且不失严谨。
韩老师的《零基础30天学会Java》系列不光会教你 Java 基础,还会帮你建立编程**,让你知道学习了 Java 之后,你可以从事什么工作。
看视频的同时,配套一本好书也是非常有作用的。
《Head First Java》 这本书在是入门 Java 的很不错的书籍 。
《Head First Java》这本书的内容很轻松有趣,可以说是我学习编程初期最喜欢的几本书之一了。同时,这本书也是我的 Java 启蒙书籍。我在学习 Java 的初期多亏了这本书的帮助,自己才算是跨进 Java 语言的大门。
我觉得我在 Java 这块能够坚持下来,这本书有很大的功劳。我身边的的很多朋友学习 Java 初期都是看的这本书。
有很多小伙伴就会问了:这本书适不适合编程新手阅读呢?
我个人觉得这本书还是挺适合编程新手阅读的,毕竟是 “Head First” 系列。
《Java 核心技术卷 1+卷 2》 这两本书也非常不错。不过,这两本书的内容很多,全看的话比较费时间。我现在是把这两本书当做工具书来用,就比如我平时写文章的时候,碰到一些 Java 基础方面的问题,经常就翻看这两本来当做参考!
我当时在大学的时候就买了两本放在寝室,没事的时候就翻翻。建议有点 Java 基础之后再读,介绍的还是比较深入和全面的,非常推荐。
《Java 编程** 》 这本书被很多人称之为 Java 领域的圣经(感觉有点过了~~~)。不太推荐编程初学者阅读,有点劝退的味道,稍微有点基础后阅读更好。
我第一次看的时候还觉得有点枯燥,那时候还在上大二,看了 1/3 就没看下去了。
另外,Java 8 算是一个里程碑式的版本,现在一般企业还是用 Java 8 比较多。掌握 Java 8 的一些新特性比如 Lambda、Strean API 还是挺有必要的。这块的话,我推荐 《Java 8 实战》 这本书。
学完 Java 基础之后,你可以用自己学的东西实现一个简单的 Java 程序,也可以尝试用 Java 解决一些编程问题,以此来将自己学到的东西付诸于实践。
不太建议学习 Java基础的之后通过做游戏来巩固。为什么培训班喜欢通过这种方式呢?说白点就是为了找到你的G点。新手学习完Java基础后做游戏一般是不太现实的,还不如找一些简单的程序问题解决一下比如简单的算法题。
记得多总结!打好基础!把自己重要的东西都记录下来。 API 文档放在自己可以看到的地方,以备自己可以随时查阅。为了能让自己写出更优秀的代码,《Effective Java》、《重构》 这两本书没事也可以看看。
并发
多线程这部分内容稍微会比较难以理解和实践。如果你刚学完 Java 基础的话,我建议你学习并发这部分内容的时候,可以先简单地了解一下基础知识比如线程和进程的对比。到了后面,你对于 Java 了解的更深了之后,再回来仔细看看这部分的内容。
下面是一些我比较推荐的书籍。
这本书还是非常适合我们用来学习 Java 多线程的。这本书的讲解非常通俗易懂,作者从并发编程基础到实战都是信手拈来。
另外,这本书的作者加多自身也会经常在网上发布各种技术文章。这本书也是加多大佬这么多年在多线程领域的沉淀所得的结果吧!他书中的内容基本都是结合代码讲解,非常有说服力!
这个是我第二本要推荐的书籍,比较适合作为多线程入门/进阶书籍来看。这本书内容同样是理论结合实战,对于每个知识点的讲解也比较通俗易懂,整体结构也比较清。
这本书是几位大厂的大佬开源的。
这几位作者为了写好《深入浅出 Java 多线程》这本书阅读了大量的 Java 多线程方面的书籍和博客,然后再加上他们的经验总结、Demo 实例、源码解析,最终才形成了这本书。
这本书的质量也是非常过硬!给作者们点个赞!这本书有统一的排版规则和语言风格、清晰的表达方式和逻辑。并且每篇文章初稿写完后,作者们就会互相审校,合并到主分支时所有成员会再次审校,最后再通篇修订了三遍。
这本书是去年也就是 2020 年新出的,所以,现在知道的人还不是很多。
这本书主要是对 Java Concurrent 包中一些比较重要的源码进行了讲解,另外,像 JMM、happen-before、CAS 等等比较重要的并发知识这本书也都会一并介绍到。
不论是你想要深入研究 Java 并发,还是说要准备面试,你都可以看看这本书。
下面是我总结的一些关于并发的小问题,你可以拿来自测:
- 什么是线程和进程? 线程与进程的关系,区别及优缺点?
- 说说并发与并行的区别?
- 为什么要使用多线程呢?
- 使用多线程可能带来什么问题?(内存泄漏、死锁、线程不安全等等)
- 创建线程有哪几种方式?(a.继承 Thread 类;b.实现 Runnable 接口;c. 使用 Executor 框架;d.使用 FutureTask)
- 说说线程的生命周期和状态?
- 什么是上下文切换?
- 什么是线程死锁?如何避免死锁?
- 说说
sleep()
方法和wait()
方法区别和共同点? - Java 内存模型(JMM)、重排序与 happens-before 原则了解吗?
synchronized
关键字、volatile 关键字ThreadLocal
有啥用(解决了什么问题)?怎么用?原理了解吗?内存泄露问题了解吗?- 为什么要用线程池?
ThreadPoolExecutor
类的重要参数了解吗?ThreadPoolExecutor
饱和策略了解吗?线程池原理了解吗?几种常见的线程池了解吗?为什么不推荐使用FixedThreadPool
?如何设置线程池的大小? - AQS了解么?原理?AQS 常用组件:
Semaphore
(信号量)、CountDownLatch
(倒计时器)CyclicBarrier
(循环栅栏) ReentrantLock
、ReentrantReadWriteLock
、StampedLock
(JDK8)- CAS 了解么?原理?
- Atomic 原子类
- 并发容器:
ConcurrentHashMap
、CopyOnWriteArrayList
、ConcurrentLinkedQueue
BlockingQueue
、ConcurrentSkipListMap
Future
和CompletableFuture
- ......
JVM
对于 Java 程序员来说,JVM 帮助我们做了很多事情比如内存管理、垃圾回收等等。在 JVM 的帮助下,我们的程序出现内存泄漏这些问题的概率相对来说是比较低的。但是,这并不代表我们在日常开发工作中不会遇到。万一你在工作中遇到了 OOM 问题,你至少要知道如何去排查和解决问题吧!
并且,就单纯从面试角度来说,JVM 是 Java 后端面试(大厂)中非常重要的一环。不论是应届还是社招,面试国内的一些大厂,你都会被问到很多 JVM 相关的问题(应届的话侧重理论,社招实践)。
只有搞懂了 JVM 才有可能真正把 Java 语言“吃透”。学习 JVM 这部分的内容,一定要注意要实战和理论结合。
书籍的话,《深入理解 Java 虚拟机》 这本书是首先要推荐的。
这本书就一句话形容:国产书籍中的战斗机,实实在在的优秀! (真心希望国内能有更多这样的优质书籍出现!加油!
这本书的第三版去年年底已经出来了,新增了很多实在的内容比如 ZGC 等新一代 GC 的原理剖析。目前豆瓣上是 9.6 的高分,
不论是你面试还是你想要在 Java 领域学习的更深,你都离不开这本书籍。这本书不光要看,你还要多看几遍,里面都是干货。这本书里面还有一些需要自己实践的东西,我建议你也跟着实践一下。
类似的书籍还有 《实战Java虚拟机》、《虚拟机设计与实现:以JVM为例》 ,这两本都是非常不错的!
如果你对实战比较感兴趣,想要自己动手写一个简易的 JVM 的话,可以看看 《自己动手写Java虚拟机》 这本书。
书中的代码是基于 Go 语言实现的,搞懂了原理之后,你可以使用 Java 语言模仿着写一个,也算是练练手! 如果你当前没有能力独立使用 Java 语言模仿着写一个的话,你也可以在网上找到很多基于 Java 语言版本的实现,比如《zachaxy的手写JVM系列》 。
这本书目前在豆瓣有8.2的评分,我个人觉得张秀宏老师写的挺好的,这本书值得更高的评分。
另外,R大在豆瓣发的《从表到里学习JVM实现》这篇文章中也推荐了很多不错的 JVM 相关的书籍,推荐小伙伴们去看看。
再推荐两个视频给喜欢看视频学习的小伙伴。
第 1 个是尚硅谷的宋红康老师讲的《JVM全套教程》。这个课程的内容非常硬,一共有接近400小节。
课程的内容分为3部分:
- 《内存与垃圾回收篇》
- 《字节码与类的加载篇》
- 《性能监控与调优篇》
第 2 个是你假笨大佬的 《JVM 参数【Memory 篇】》 教程,很厉害了!
下面是我总结的一些关于 JVM 的小问题,你可以拿来自测:
- 什么是虚拟机?
- Java 内存区域是怎么划分的?大对象放在哪个内存区域?
- 垃圾回收有哪些算法?GC 的流程
- 什么是类加载?何时类加载?类加载流程?
- 知道哪些类加载器。类加载器之间的关系?
- 类加载器的双亲委派了解么? 结合 Tomcat 说一下双亲委派(Tomcat 如何打破双亲委托机制?...)。
- 常见调优参数有哪些?
- ......
常用工具
非常重要!非常重要!特别是 Git和 Docker。
- IDEA :熟悉基本操作以及常用快捷。你可以通过Github上的开源教程 《IntelliJ IDEA 简体中文专题教程》 来学习 IDEA 的使用。
- Maven :强烈建议学习常用框架之前可以提前花几天时间学习一下Maven的使用。(到处找 Jar 包,下载 Jar 包是真的麻烦费事,使用 Maven 可以为你省很多事情)。
- Git :基本的 Git 技能也是必备的,试着在学习的过程中将自己的代码托管在 Github 上。你可以看看这篇Github上开源的 《Git极简入门》 。
- Docker :学着用 Docker 安装学习中需要用到的软件比如 MySQL ,这样方便很多,可以为你节省不少时间。你可以看看这篇Github上开源的 《Docker 基本概念解读》 、《一文搞懂 Docker 镜像的常用操作!》
除了这些工具之外,我强烈建议你一定要搞懂 Github 的使用。一些使用 Github 的小技巧,你可以看《Github小技巧》这篇文章。
常用框架
Spring/SpringBoot
Spring 和 SpringBoot 真的很重要!
一定要搞懂 AOP 和 IOC 这两个概念。Spring 中 bean 的作用域与生命周期、SpringMVC 工作原理详解等等知识点都是非常重要的,一定要搞懂。
企业中做 Java 后端,你一定离不开 SpringBoot ,这个是必备的技能了!一定一定一定要学好!
像 SpringBoot 和一些常见技术的整合你也要知识怎么做,比如 SpringBoot 整合MyBatis、 ElasticSearch、SpringSecurity、Redis等等。
下面是一些比较推荐的书籍/专栏。
比较一般!
不建议当做入门书籍读,入门的话可以找点国人的书或者视频看。这本定位就相当于是关于 Spring 的一个概览,只有一些基本概念的介绍和示例,涵盖了 Spring 的各个方面,但都不够深入。就像作者在最后一页写的那样:“学习 Spring,这才刚刚开始”。
工具人!
对于 Spring5 的新特性介绍的比较详细,也说不上好。另外,感觉全书翻译的有一点蹩脚的味道,还有一点枯燥。全书的内容比较多,我一般拿来当做工具书参考。
稍微有点啰嗦,但是原理介绍的比较清楚。
SpringBoot 解析,不适合初学者。我是去年入手的,现在就看了几章,后面没看下去。书很厚,感觉很多很多知识点的讲解过于啰嗦和拖沓,不过,这本书对于 SpringBoot 内部原理讲解的还是很清楚。
比较一般的一本书,可以简单拿来看一下。
《Spring Boot 实战派》
这本书使用的 Spring Boot 2.0+的版本,还算比较新。整本书采用“知识点+实例”的形式编写。
另外,这本书的干货很多,作者在注意实战的过程中还不忘记对于一些重要的基础知识的讲解。
如果你要学习 Spring Boot 的话,我还是比较推荐这本书的。
Netty
但凡涉及到网络通信就必然必然离不开网络编程。 Netty 目前作为 Java 网络编程最热门的框架,毫不夸张地说是每个 Java 程序员必备的技能之一。
为什么说学好 Netty 很有必要呢?
- Netty 基于 NIO (NIO 是一种同步非阻塞的 I/O 模型,在 Java 1.4 中引入了 NIO )。使用 Netty 可以极大地简化并简化了 TCP 和 UDP 套接字服务器等网络编程,并且性能以及安全性等很多方面都非常优秀。
- 我们平常经常接触的 Dubbo、RocketMQ、Elasticsearch、gRPC、Spark、Elasticsearch 等等热门开源项目都用到了 Netty。
- 大部分微服务框架底层涉及到网络通信的部分都是基于 Netty 来做的,比如说 Spring Cloud 生态系统中的网关 Spring Cloud Gateway 。
下面是一些比较推荐的书籍/专栏。
《Netty 实战》
这本书可以用来入门 Netty ,内容从 BIO 聊到了 NIO、之后才详细介绍为什么有 Netty 、Netty 为什么好用以及 Netty 重要的知识点讲解。
这本书基本把 Netty 一些重要的知识点都介绍到了,而且基本都是通过实战的形式讲解。
《Netty 进阶之路:跟着案例学 Netty》
内容都是关于使用 Netty 的实践案例比如内存泄露这些东西。如果你觉得你的 Netty 已经完全入门了,并且你想要对 Netty 掌握的更深的话,推荐你看一下这本书。
《Netty 入门与实战:仿写微信 IM 即时通讯系统》
质量很高的一个小册!
通过一个基于 Netty 框架实现 IM 核心系统为引子,带你学习 Netty。整个小册的质量还是很高的,即使你没有 Netty 使用经验也能看懂。
性能调优
希望能有更多这 Java 性能优化方面的好书!
O'Reilly 家族书,性能调优的入门书,我个人觉得性能调优是每个 Java 从业者必备知识。
这本书介绍的实战内容很不错,尤其是 JVM 调优,缺点也比较明显,就是内容稍微有点老。市面上这种书很少。这本书不适合初学者,建议对 Java 语言已经比价掌握了再看。另外,阅读之前,最好先看看周志明大佬的《深入理解 Java 虚拟机》。
网站架构
看过很多网站架构方面的书籍,比如《大型网站技术架构:核心原理与案例分析》、《亿级流量网站架构核心技术》、《架构修炼之道——亿级网关、平台开放、分布式、微服务、容错等核心技术修炼实践》等等。
目前我觉得能推荐的只有李运华老师的**《从零开始学架构》** 这本。
这本书对应的有一个极客时间的专栏—《从零开始学架构》,里面的很多内容都是这个专栏里面的,两者买其一就可以了。我看了很小一部分,内容挺全面的,是一本真正在讲如何做架构的书籍。
面试
《JavaGuide 面试突击版》
谁看谁说好!哈哈!
Guide 自己开源的,涵盖了 Java 后端方面的大部分知识点比如 集合、JVM、多线程还有数据库 MySQL 等内容。
在我的公众号后台回复 :“面试突击”即可免费获取。
软件质量
下面推荐都是我看过并且我觉得值得推荐的书籍。
不过,这些书籍都比较偏理论,只能帮助你建立一个写优秀代码的意识标准。 如果你想要编写更高质量的代码、更高质量的软件,还是应该多去看优秀的源码,多去学习优秀的代码实践。
代码整洁之道
必看书籍!无需多言。编程书籍领域的瑰宝。
世界顶级、国宝级别的 Martin Fowler 的书籍,可以说是软件开发领域最经典的几本书之一。目前已经出了第二版。
这是一本值得你看很多遍的书籍。
《Clean Code》是 Bob 大叔的一本经典著作,强烈建议小伙伴们一定要看看。
Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓是对后生的一大馈赠。
其实,《代码大全(第 2 版)》这本书我本身是不太想推荐给大家了。但是,看在它的豆瓣评分这么高的份上,还是拿出来说说吧!
这也是一本非常经典的书籍,第二版对第一版进行了重写。
我简单地浏览过全书的内容,感觉内容总体比较虚,对于大部分程序员的作用其实不大。如果你想要切实地提高自己的代码质量,《Clean Code》和 《编写可读代码的艺术》我觉得都要比《代码大全》这本书更好。
不过,最重要的还是要多看优秀的源码,多学习优秀的代码实践。
《编写可读代码的艺术》这本书要表达的意思和《Clean Code》很像,你看它俩的目录就可以看出来了。
在我看来,如果你看过 《Clean Code》 的话,就不需要再看这本书了。当然,如果你有时间和精力,也可以快速过一遍。
另外,我这里还要推荐一个叫做 write-readable-code 的仓库。这个仓库的作者免费分享了一系列基于《编写可读代码的艺术》这本书的视频。这一系列视频会基于 Java 语言来教你如何优化咱们的代码。
在实践中学习的效果肯定会更好!推荐小伙伴们都抓紧学起来啊!
Java 程序员必看!
又是一本 Java 领域国宝级别的书,非常经典。这本书主要介绍了在 Java 编程中很多极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。这篇文章能够非常实际地帮助你写出更加清晰、健壮和高效的代码。本书中的每条规则都以简短、独立的小文章形式出现,并通过例子代码加以进一步说明。
程序员职业素养
《 The Clean Coder》是 Bob 大叔的又一经典著作。
《Clean Code》和《 The Clean Coder》这两本书在国内都翻译为 《代码整洁之道》,我觉得这个翻译还是不够优雅的。
另外,两者的内容差异也很大。《Clean Code》这本书从代码层面来讲解如何提高自己的代码质量。而《The Clean Coder》这本书则是从如何成为一名更优秀的开发者的角度来写的,比如这书会教你如何在自己的领域更专业、如何说不、如何做时间管理、如何处理压力等等。
架构整洁之道
你没看错,《架构整洁之道》这本书又是 Bob 大叔的经典之作。
这本书我强烈安利!认真读完之后,我保证你对编程本质、编程语言的本质、软件设计、架构设计可以有进一步的认识。
国内的很多书籍和专栏都借鉴了《架构整洁之道》 这本书。毫不夸张地说,《架构整洁之道》就是架构领域最经典的书籍之一。
正如作者说的那样:
如果深入研究计算机编程的本质,我们就会发现这 50 年来,计算机编程基本没有什么大的变化。编程语言稍微进步了一点,工具的质量大大提升了,但是计算机程序的基本构造没有什么变化。
虽然我们有了新的编程语言、新的编程框架、新的编程范式,但是软件架构的规则仍然和 1946 年阿兰·图灵写下第一行机器代码的时候一样。
这本书就是为了把这些永恒不变的软件架构规则展现出来。
项目管理
这本书主要描述了软件开发的基本定律:一个需要 10 天才能干完的活,不可能让 10 个人在 1 天干完!
看书名的第一眼,感觉不像是技术类的书籍。但是,就是这样一个看似和编程不沾边的书名,却成了编程领域长久相传的经典。
这本书对于现代软件尤其是复杂软件的开发的规范化有深刻的意义。
这本领域驱动设计方面的经典之作一直被各种推荐,但是我还来及读。
软件质量其他书籍推荐
- 《代码的未来》 :这本书的作者是 Ruby 之父松本行弘,算是一本年代比较久远的书籍(13 年出版),不过,还是非常值得一读。这本书的内容主要介绍是编程/编程语言的本质。我个人还是比较喜欢松本行弘的文字风格,并且,你看他的文章也确实能够有所收获。
- 《深入浅出设计模式》 : 比较有趣的风格,适合设计模式入门。
- 《软件架构设计:大型网站技术架构与业务架构融合之道》 : 内容非常全面。适合面试前突击一些比较重要的理论知识,也适合拿来扩充/完善自己的技术广度。
- 《微服务架构设计模式》 :这本书是世界十大软件架构师之一、微服务架构先驱 Chris Richardson 亲笔撰写,豆瓣评分 9.6。示例代码使用 Java 语言和 Spring 框架。帮助你设计、实现、测试和部署基于微服务的应用程序。
最后再推荐两个相关的文档:
- 阿里巴巴 Java 开发手册 :https://github.com/alibaba/p3c
- Google Java 编程风格指南: http://www.hawstein.com/posts/google-java-style.html
Q&A
1.感觉学校教的都联系不到实际,我本科毕业真的能找到工作吗?
就笔者所就读的高校来说,我是相信它的培养方案是有能力培养出具有就业能力的本科毕业生的。我相信很多名校的培养方案也都不会差。如果你就读的学校不是那么出色,并且质疑自己学校的培养能力的话,建议你多到名校的网课上取取经。如果你是就读于国内名校的话,请相信的自己专业的培养方案,下限不会低。
另外,如果你的学校比较差的话,大学期间一定要尽全力让自己的简历更好看,你可以出去实习、参加一些含金量比较高的比赛、跟着老师做一些项目。
2.学校里需要参加一些社团、学生会之类的吗?
笔者只参加过社团,并未参加过学生会。对于这个问题,我结合我所接触的人来简单回答一下。针对不同的发展定位,可以选择自己投入社团、学生会的精力。比如,你是一个技术宅,那么我想你就算加入了社团之类的团体,也收获不到自己想要的能力,其实就没有参加的必要了。如果你是一个学生干部,或者擅长和人打交道,也许毕业之后从事产品经理之类的工作,那么在学生会的经历应该是蛮锻炼你的能力的。是否要选择参加团体活动,投入多少精力,完全取决你对自己的定位如何,请把你自己放到合适的环境下培养,不必人云亦云。
3.在大学里一定要参加竞赛比赛吗?
竞赛比赛对于学生的好处有,得奖了的话可能会获得保研加分、丰富个人简历,在应聘中拿到不错的印象分。保研加分具体涉及到的竞赛需要咨询所在学院,并非所有竞赛获奖都能加分的。
那么竞赛比赛有没有坏处呢?也会有一点吧,就是指那些能力并不算强,但仍然把大量时间花在了打比赛这上面,这其实并不是坏处,这对个人能力仍有提高,坏处指的是因为打竞赛耽误了专业课的学习。 这样一来,基础也没扎实,突出能力也没训练出来,捡了芝麻丢了西瓜,就不好了。
总的来说,打竞赛利大于弊,不要低估的自己的能力而排斥参加竞赛,也不要高估自己的能力过分痴迷竞赛。
以上是我针对本科计算机专业各个课程的倾力解读,如有不妥,请多加指正!
资料下载
资料下载-计算机基础
打包下载(涵盖上面提到的大部分书籍)。没有解压密码!没有解压密码!没有解压密码!
扫描下面的二维码或者微信搜索 “Github掘金计划” 关注后回复“书籍”即可获取下载地址。
资料下载-Java
Java PDF书籍(涵盖上面提到的大部分书籍)打包下载。没有解压密码!没有解压密码!没有解压密码!
扫描下面的二维码或者微信搜索 “JavaGuide” 关注后回复“书籍”即可获取下载地址。
尚硅谷2021 Java全套视频学习资料 后台回复“视频” 获取。