微信搜索「高性能服务器开发」关注后,在后台回复「书单」即可获取本文书单链接。
回复「pdf」即可获取本文提到的书籍电子版pdf。
作为一个有理想的程序员,必读的书都有哪些?
很多人给学弟学妹们推荐图书时,一上来就是各种大部头的经典书籍,有些书确实是非常经典,但是能不能让人坚持看下去是一回事,就像有些道理人人都懂,但是能践行下去的人没几个。在这里也只推荐我觉得比较好的书,宁缺毋滥。
一、算法与数据结构
建议你应该好好准备算法和数据结构,做到常见的算法和数据结构知识点都能熟悉。如果你是应届生,毕业求职的时候可以轻松拿一些大厂(BAT 等)的 offer,至少不会挂在算法数据结构上面;社招的话,也是非常重要的加分项。一毕业去大厂的好处点击这里。
1. 严谨的教材
- 《数据结构与算法分析:C 语言描述》
- 《算法导论》
2. 轻松活泼的教材
- 《大话数据结构》
- 《编程之美》
《编程之美》是一本特别能锻炼思维能力的算法书。
严谨的教材适合系统学习,轻松活泼的教材适合提高学习兴趣、非科班的同学。
3. 适当刷题还是有必要的
- 《剑指 offer》
- 《程序员代码面试指南 IT名企算法与数据结构题目最优解》
二、语言类
1. C语言
无论你做什么开发,个人觉得 C 语言是所有想成为高手最应该熟悉的入门语言。
- 《C 语言程序设计:现代方法》。
2. C++
当然,如果你想掌握好 C++,《深度探索 C++ 对象模型》是一定要看的。
- 《深度探索 C++ 对象模型》
介绍 C++ 技术和编程技巧的图书实在太多了,我这里推荐《提高 C++ 性能的编程技术》一书,这本书中介绍了常见的 C++ 编码技巧,建议做 C++ 开发的同学把书中说的技巧全部掌握,最关键的是这本书非常薄。
- 《提高 C++ 性能的编程技术》
如果觉得自己设计 C++ 类和接口不优雅,不能很好地划分模块,大型项目不知道如何去组织和搭建,推荐下如下两本书,这两本书是你成为高手的必读书籍。
- 《C++ API 设计》
- 《大规模C++程序设计》
C++ 比较经典的书籍还有:
- 《Effective C++》
- 《More Effective C++》
学习 C++11/14/17:
- 《深入理解 C++11:C++11 新特性解析与应用》
- 《深入应用 C++11:代码优化与工程级应用》
- 《C++17 完全指南》
- 《Cpp 17 in Detail》
3. Java
- 《Java 核心技术 》
- 《Effective java》
- 《深入理解 Java 虚拟机》
- 《Java 并发编程实战》
三、操作系统
操作系统无论是面试还是自我提高的五大基础之一,我的建议学习操作系统知识时,不一定要看完所有操作系统书籍,但一定将一些基础概念(如进程、线程、内存模式等)看懂、理清。
- Tanenbaum.A.S《现代操作系统》
你如果还有时间强烈推荐看看俞甲子的《程序员的自我修养:链接、装载与库》。这本书同时涉及到了 Windows 和 Linux 两个操作系统平台,用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节,甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚,同时也分析了 C Runtime(CRT)、glibc 这样的操作系统接口库的原理和执行逻辑,是一本实实在在帮你实战操作系统原理的好书。
- 《程序员的自我修养:链接、装载与库》
如果对操作系统内核感兴趣,可以阅读下:
- 《Linux 内核设计与实现》
- 《Linux 内核情景分析》
- 《Windows 内核情景分析》
四、计算机网络
学习计算机网络除了掌握网络基础知识(比如三次握手和四次挥手),还要熟悉网络编程。
- 《计算机网络:自顶向下方法》
网络编程方面的实战书来,我推荐韩国人尹圣雨写的这本《TCP/IP 网络编程》,这本书也适合无任何 Socket API 编程经验的小白,这本书涵盖从基础的 Socket API 到高级的 IO 网络模型,有非常详细和生动的例子。
- 《TCP/IP 网络编程》
等你有了一定的网络编程以后(熟练使用常见 Socket API),你可以看看游双的《Linux 高性能服务器编程》,这本书给没有基础的人或者基础不扎实的人的感觉是,尤其是书的前三章,这书怎么这么垃圾,又把网络理论书上面的东西搬过来凑字数,但是如果你有基础再按照书上的步骤在机器上实践一遍,你会发现,真是一本难得的、良心的书,桃李不言下自成蹊吧。如果你掌握了这本说上说的这些知识,你再看陈硕老师的《Linux 多线程服务端编程》或者去看像libevent这样的开源网络库,你会进一步的得到提升。这也是我学习网络编程的一些经验和经历吧。
- 《Linux 高性能服务器编程》
五、操作系统 API
不管是什么开发,你都是需要基于特定的操作系统的,这里不提 Windows 系统,单单拿 Linux 操作系统来说,既然你选择做这个方面的开发,你需要熟悉这个操作系统平台提供的一些常用的 API 函数,网络通信方面上文已经说过,除了网络通信还有如操作文件、操作内存、字符串操作、进程线程系列、线程同步系列(如互斥体、条件变量、信号量)、管道等常用的各种API接口函数。这里的意思是,不是要你背诵记忆每一个接口函数的签名,而是你要知道何时该用哪个接口,如何用,有什么注意事项。
我入门的时候看的是 Robert Love 的《Linux 系统编程》,熟悉这个人的应该知道,Google 的工程师,他也《Linux 内核设计与实现》一书的作者。
《Linux 系统编程》
《Windows 程序设计》第五版
(第六版以后,这个不再是用 Windows Native API 写 C 程序了,而是转到 C# 平台上了),这本书是中国第一代程序的 Windows 启蒙书籍,你所看到的大多数桌面软件,如 QQ,的开发者可能都是通过阅读这本书启蒙起来的。
- 《Windows 核心编程》
这本书搞 Windows 开发的一定都知道这本书的分量。
- 《Windows PE 文件权威指南》
六、汇编与安全工程
如果你熟练掌握汇编,你就比其他人多很多优势,你会能透彻地知道你写的每一行 C/C++ 代码背后的机器指令的效率。无论是做安全工程还是自己技术提升上都是非常不错的。这里推荐一本王爽老师的《汇编语言(第 3 版)》,这本书***,语言通俗易懂,你也不用刻意去记忆,基本上当小说书看一下就能很快看完了。汇编实战类图书还有另外一本《老码识途:从机器码到框架的系统观逆向修炼之路》。我个人是非常喜欢这本书的。当年读这本书的时候,真的有一种“笑看妻子愁何在?漫卷诗书喜欲狂”的感觉。
《汇编语言(第 3 版)》
《老码识途:从机器码到框架的系统观逆向修炼之路》
七、数据库
数据库需要掌握的基础知识有:
(1)熟悉基本 SQL 操作
包括增删改查(insert、delete、update、select语句),排序 order,条件查询(where 子语句),限制查询结果数量(LIMIT语句)等
(2)稍微高级一点的 SQL 操作(如 Group by,in,join,left join,多表联合查询,别名的使用,select 子语句等)
(3)索引的概念、索引的原理、索引的创建技巧
(4)数据库本身的操作,建库建表,数据的导入导出
(5)数据库用户权限控制(权限机制)
(6)MySQL的两种数据库引擎的区别
(7)SQL 优化技巧
以上属于对开发的基本的数据库知识要求,你可以找一本相关入门级的数据库图书推荐:
- 《MySQL技术内幕(第5版)》
高级开发除了以上要求还要熟悉高可用 MySQL、主从同步、读写分离、分表分库等技术,这些技术的细节一定要清楚,它们是你成为技术专家或者高级架构的必备知识。我们在实际面试时,在讨论高可用服务服务方案时,很多面试者也会和我们讨论到这些技术,但是不少面试者只知道这些技术的大致思想,细节往往说不清楚,细节不会就意味着你的高可用方案无法落地,企业需要可以落地的方案。
这些技术我首推《高性能 MySQL》这本书,这本书高级开发者一定要通读的,另外还有 2 本非常好的图书也推荐一下:一本是《MySQL 排错指南》,读完这本书以后,你会对整个“数据库世界”充满了清晰的认识;另外一本是《数据库索引设计与优化》,这本书读起来非常舒服,尤其是对于喜欢算法和数据结构的同学来说。
- 《高性能 MySQL》
- 《MySQL 排错指南》
- 《数据库索引设计与优化》
八、编译原理与计算机组成原理
- 《编译系统透视:图解编译原理》
- 《计算机组成与设计:硬件软件接口》
八、设计模式
- 《大话设计模式》
九、代码规范与风格优化
- 《重构:改善既有代码设计》
- 《程序设计实践》
- 《代码整洁之道》
这两本书特别推荐学生朋友看一下,能大幅度地提高你实际编码的技巧和编码风格。
作为一名过来人的老学长,我码这么多字,希望想做好开发的学弟学妹们,勿在浮沙筑高台。如果你现在还是学生,你有大把读书的机会,一定要珍惜大好读书时光。工作年限不长的同学,也应该尽快在工作的早些年把基本功打扎实。三十岁以后面临着工作、家庭等各种问题,你可能再不能心无旁骛地去学习和提升了。所以前期的积累很重要,毕竟选择技术这条路,提高技术是升职加薪改善生活水平最直接的方法。
书单未完待续,后面会整理得更加完善,更加成体系。
微信搜索「高性能服务器开发」关注后,在后台回复「书单」即可获取本文书单链接。
回复「pdf」即可获取本文提到的书籍电子版pdf。