Java 学习:
- 《Java 核心技术:卷 1 基础知识》 Java 核心技术·卷 I(原书第 10 版) (豆瓣)
- 《Spring 实战》和《Spring Boot 实战》 Spring 实战(第 4 版) (豆瓣) Spring Boot 实战 (豆瓣)
- 《Effective Java》(注意,这里我给的引用是第三版的,也是 2017 年末出版的书),这本书是模仿 Scott Meyers 的经典图书《Effective C++》的。Effective Java (豆瓣)
- GitHub - google/guava: Google core libraries for Java。这个库不但是 JDK 的升级库,其中有如:集合(collections)、缓存(caching)、原生类型支持 (primitives support)、并发库(concurrency libraries)、通用注解(common annotations)、字符串处理(string processing)、I/O 等库,其还是 Effective Java 这本书中的那些经验的实践代表。
- 《Java 并发编程实战》 Java 并发编程实战 (豆瓣)
- 《Java 性能权威指南》 Java 性能权威指南 (豆瓣) 使用 JDK 中自带的工具收集 Java 应用的性能数据,理解 JIT 编译器的优缺点,调优 JVM 垃圾收集器以减少对程序的影响,学习管理堆内存和 JVM 原生内存的方法,了解如何最大程度地优化 Java 线程及同步的性能,等等。
- 《深入理解 Java 虚拟机》 深入理解 Java 虚拟机(第 2 版) (豆瓣)
- 《Java 编程思想》,真是一本透着编程思想的书。上面的书让你从微观角度了解 Java,而这本书则可以让你从一个宏观角度了解 Java。这本书和 Java 核心技术的厚度差不多,但这本书的信息密度比较大。
- 《精通 Spring 4.x》,也是一本很不错的书,就是有点厚,一共有 800 多页,都是干货。我认为其中最不错的是在分析原理,尤其是针对前面提到的 Spring 技术,应用与原理都讲得很透彻,IOC 和 AOP 也分析得很棒,娓娓道来。其对任何一个技术都分析得很细致和全面,不足之处就是内容太多了,所以导致很厚,但这并不影响它是一本不错的工具书。
- 设计模式 (豆瓣)
- Head First 设计模式(中文版) (豆瓣)
C/C++ 学习:
- 《C 程序设计语言》。注意,这本书是 C 语言原作者写的,其 C 语言的标准不是我们平时常说的 ANSI 标准,而是原作者的标准,又被叫作 K&R C。但是这本书很轻薄,也简洁,不枯燥,是一本你可以拿着躺在床上看还不会看着看着睡着的书。C 程序设计语言 (豆瓣)
- 《C 语言程序设计现代方法》。有人说,这本书配合之前的 The C Programming Language 那本书简真是无敌。我想说,这本书更实用,完整覆盖了 C99 标准,习题的质量和水准也比较高。更好的是,探讨了现代编译器的实现,以及和 C++的兼容,还揭穿了各种古老的 C 语言的神话和信条……是相当相当干的一本学习 C 语言的书。 C 语言程序设计现代方法 (豆瓣)
- 千万不要看谭浩强的 C 语言的书。各种误导。
- 《C 陷阱与缺陷》这本书,你会发现,这里面的坑不是一般大。
- C 语言在泛型编程上的各种问题,这个时候我推荐你学习一下 C++语言。C++是目前世界上范式最多的语言了,其做得最好的范式就是”泛型编程”,这在静态语言中,是绝对地划时代的一个事。
- 《C++ Primer 中文版》,这本书是久负盛名的 C++经典教程。书是有点厚,前面 1/3 讲 C 语言,后面讲 C++。C++的知识点实在是太多了,而且又有点晦涩。但是你主要就看几个点,一个是面向对象的多态,一个是模板和重载操作符,以及一些 STL 的东西。看看 C++是怎么玩泛型和函数式编程的。
- 如果你想继续研究,你需要看另外两本更为经典的《Effective C++》和《More Effective C++》。这两本书不厚,但是我读了 10 多年,每过一段时间再读一下,就会发现有更多的收获。这两本书的内容会随着你经历的丰富而变得丰富,这也是对我影响最大的两本书,其中影响最大的不是书中的那些 C++的东西,而是作者的思维方式和不断求真的精神,这真是太赞了。
- 学习 C/C++都是需要好好了解一下编译器到底干了什么事的。就像 Java 需要了解 JVM 一样,所以,这里还有一本非常非常难啃的书你可以挑战一下《深度探索 C++对象模型》。这本书是非常之经典的,看完后,C++对你来说就再也没有什么秘密可言。我以前写过的《C++虚函数表解析》,还有《C++对象内存布局》属于这个范畴。还有 C++的作者 Bjarne Stroustrup 写的 C++ FAQ (中文版),也是非常值得一读的。
Go 语言:
- 有了 C/C++的功底,学习 Go 语言非常简单。
- 首推 Go by Example 作为你的入门教程。然后,Go 101 也是一个很不错的在线电子书。如果你想看纸书的话,The Go Programming Language 一书在豆瓣上有 9.2 分,但是国内没有卖的。(当然,我以前也写过两篇入门的供你参考 “GO 语言简介(上)- 语法” 和 “GO 语言简介(下)- 特性”)。
- 另外,Go 语言官方的 Effective Go 是必读的,这篇文章告诉你如何更好地使用 Go 语言,以及 Go 语言中的一些原理。 Go 语言最突出之处是并发编程,Unix 老牌黑客罗勃·派克(Rob Pike)在 Google I/O 上的两个分享,可以让你学习到一些并发编程的模式。
- Unix 老牌黑客罗勃·派克(Rob Pike)在 Google I/O 上的两个分享,可以让你学习到一些并发编程的模式。Go Concurrency Patterns( 幻灯片和演讲视频)。 Advanced Go Concurrency Patterns(幻灯片、演讲视频)。
- Articles · golang/go Wiki · GitHub
- Blogs · golang/go Wiki · GitHub
- GoTalks · golang/go Wiki · GitHub
- GitHub - avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software
数据结构与算法:
- 《算法》《算法图解》《算法导论》《编程珠玑》
- List of algorithms - Wikiwand ,这个网站罗列了非常多的算法,完全可以当成一个算法字典,或是用来开阔眼界
- Data Structure Visualization 数据结构动画图的网站
其他理论基础知识:
- 数据结构与算法分析 (豆瓣)
- 数据库系统概念 (豆瓣)
- 现代操作系统(第 3 版) (豆瓣) 这本书是操作系统领域的经典之作,书中集中讨论了操作系统的基本原理,包括进程、线程、存储管理、文件系统、输入/输出、死锁等,同时还包含了有关计算机安全、多媒体操作系统、掌上计算机操作系统、微内核、多核处理机上的虚拟机以及操作系统设计等方面的内容。
- 计算机网络(第 4 版) (豆瓣) 这本书采用了独创的自顶向下方法,即从应用层开始沿协议栈向下讲解计算机网络的基本原理,强调应用层范例和应用编程接口,内容深入浅出,注重教学方法,理论与实践相结合。新版中还增加了无线和移动网络一章,并扩充了对等网络、 BGP、MPLS、网络安全、广播选路和因特网编址及转发方面的材料。是一本不可多得的教科书。
- 计算机程序的构造和解释(原书第 2 版) (豆瓣) 这本书也很经典,是 MIT 的计算机科学系的教材。这本书中主要证实了很多程序是怎么构造出来的,以及程序的本质是什么。Scheme/Lisp 语言,从数据抽象、过程抽象、迭代、高阶函数等编程和控制系统复杂性的思想,到数据结构和算法,到编译器/解释器、编程语言设计。
- 编译原理 (豆瓣) 这本书又叫”龙书”,其全面、深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析技术,并在相关章节中给出大量的实例。与上一版相比,本书进行了全面的修订,涵盖了编译器开发方面的最新进展。每章中都提供了大量的系统及参考文献。
虽然这些理论知识枯燥难学,而且通常学完了在工作中也并不是马上就能用上,但这些知识是必须要学好的。这些理论知识可以说是计算机科学这门学科最精华的知识了,认真学习,理解其背后的逻辑和思维方式,会让你受益匪浅。不管是未来你是要学习新技能,还是解决什么疑难问题,都能在这些知识中获得灵感或者启发。
系统知识学习:
美国计算机科学家理查德·史蒂文斯(Richard Stevens) 的三套巨经典无比的书。
- UNIX 环境高级编程 (豆瓣)
- UNIX 网络编程 (豆瓣)
- UNIX 网络编程 卷 2 (豆瓣)
- TCP/IP 详解 卷 1:协议 (豆瓣)
这三本书可能都不容易读,一方面是比较厚,另一方面是知识的密度太大了,所以,读起来有点枯燥和乏味。但是,这没办法,你得忍住。
如果你觉得上面这几本经典书比较难啃,你可以试试下面这些通俗易懂的(当然,如果读得懂上面那三本的,下面的这些也就不需要读了)。
-
The TCP/IP Guide - The TCP/IP Guide 本书在豆瓣上的评分 9.2,这里给的链接是这本书的 HTML 英文免费版的,里面的图画得很精彩。
-
Wireshark 数据包分析实战 (豆瓣) 作者结合一些简单易懂的实际网络案例,图文并茂地演示使用 Wireshark 进行数据包分析的技术方法,可以让我们更好地了解和学习网络协议。
看完《Unix 高级环境编程》后,你可以趁热打铁看看 Linux/UNIX 系统编程手册 (豆瓣) 或是罗伯特·拉姆(Robert Love)的 Linux System Programming 英文电子版。其中文翻译版 Linux 系统编程(第二版) (豆瓣) 也值得一读,虽然和《Unix 高级环境编程》很像,不过其主要突出的是 Linux 的一些关键技术和相关的系统调用。
- Let’s code a TCP/IP stack, 1: Ethernet & ARP
- Let’s code a TCP/IP stack, 2: IPv4 & ICMPv4
- Let’s code a TCP/IP stack, 3: TCP Basics & Handshake
- Let’s code a TCP/IP stack, 4: TCP Data Flow & Socket API
- Let’s code a TCP/IP stack, 5: TCP Retransmission
对于系统知识,我认为主要有以下一些学习要点。
- 用这些系统知识操作一下文件系统,实现一个可以拷贝目录树的小程序。
- 用 fork / wait / waitpid 写一个多进程的程序,用 pthread 写一个多线程带同步或互斥的程序。比如,多进程购票的程序。
- 用 signal / kill / raise / alarm / pause / sigprocmask 实现一个多进程间的信号量通信的程序。学会使用 gcc 和 gdb 来编程和调试程序(参看我的《用 gdb 调试程序》一、二、三、四、五、六、七)。用 GDB 调试程序(一)_用 gdb 调试程序(一) 陈皓-CSDN 博客
- 学会使用 makefile 来编译程序(参看我的《跟我一起写 makefile》一、二、三、四、五、六、七、八、九、十、十一、十二、十三、十四)。 跟我一起写 Makefile(一)_陈皓 跟我一起写 makefile-CSDN 博客
- Socket 的进程间通信。用 C 语言写一个 1 对 1 的聊天小程序,或是一个简单的 HTTP 服务器。
C10K 问题:
- 如何处理 10000 TCP 连接 - OSCHINA - 中文开源技术交流社区
- C10K 问题本质上是操作系统处理大并发请求的问题。对于 Web 时代的操作系统而言,对于客户端过来的大量的并发请求,需要创建相应的服务进程或线程。这些进程或线程多了,导致数据拷贝频繁(缓存 I/O、内核将数据拷贝到用户进程空间、阻塞),进程/线程上下文切换消耗大,从而导致资源被耗尽而崩溃。这就是 C10K 问题的本质。
- 了解这个问题,并了解操作系统是如何通过多路复用的技术来解决这个问题的,有助于你了解各种 I/O 和异步模型,这对于你未来的编程和架构能力是相当重要的。
- The Secret to 10 Million Concurrent Connections -The Kernel is the Problem, Not the Solution - High Scalability -
实现一个 telnet 版本的聊天服务器,主要有以下需求。
- 每个客户端可以用使用 telnet ip:port 的方式连接到服务器上。
- 新连接需要用用户名和密码登录,如果没有,则需要注册一个。
- 然后可以选择一个聊天室加入聊天。
- 管理员有权创建或删除聊天室,普通人员只有加入、退出、查询聊天室的权力。
- 聊天室需要有人数限制,每个人发出来的话,其它所有的人都要能看得到。
实现一个简单的 HTTP 服务器,主要有以下需求。
- 解释浏览器传来的 HTTP 协议,只需要处理 URL path。
- 然后把所代理的目录列出来。
- 在浏览器上可以浏览目录里的文件和下级目录。
- 如果点击文件,则把文件打开传给浏览器(浏览器能够自动显示图片、PDF,或 HTML、 CSS、JavaScript 以及文本文件)。
- 如果点击子目录,则进入到子目录中,并把子目录中的文件列出来。
实现一个生产者/消费者消息队列服务,主要有以下需求。
- 消息队列采用一个 Ring-buffer 的数据结构。
- 可以有多个 topic 供生产者写入消息及消费者取出消息。
- 需要支持多个生产者并发写。
- 需要支持多个消费者消费消息(只要有一个消费者成功处理消息就可以删除消息)。
- 消息队列要做到不丢数据(要把消息持久化下来)。
- 能做到性能很高。
如果想看完我推荐的那些书和知识,并能理解和掌握,我估计怎么也得需要 4-5 年的时间。
往后面走,你需要开始需要术业有专攻了。下面给一些建议的方向。
底层方向:操作系统、文件系统、数据库、网络……
架构方向:分布式系统架构、微服务、DevOps、Cloud Native……
数据方向:大数据、机器学习、人工智能……
前端方向:你对用户体验或是交互更感兴趣,那么你走前端的路吧。
其它方向:比如,安全开发、运维开发、嵌入式开发……