作为一个有理想的程序员,必读的书都有哪些?
很多人会想到各种大部头的经典书籍,那些书确实是非常经典,但是能不能让人坚持看下去是一回事,就像有些道理人人都懂,但是能践行下去的少之又少一样。
下面根据我自己的读书经验和工作感受来谈一下,不喜欢勿喷。
先介绍一下我的情况,坐标上海,后台开发,前某大型互联网公司技术经理,目前在一家大厂做架构。我就从单纯的提高编程技术的角度来谈谈吧,一家之言,说的也不一定对。
目前主流的有 C++、JAVA、go,C++ 我的经验稍微多一点。我就说说我关于 C++ 方面的学习经验。如果您是学生,临近毕业,没有那么多时间读许多书,可以按下面列举的重要程度来参考。当然,我推荐的书都是我买了,并且认真读过的。
一、首先,我觉得你应该好好准备算法和数据结构,做到常见的算法和数据结构知识点都能非常熟悉,这样的话你毕业求职的时候可以轻松拿一些大厂(BAT 等)的 offer。
我本人非科班出身,一毕业之后各种摸爬滚打。一毕业去大厂个人觉得有两个好处:
第一,你的收入会比一般的的小公司高很多,小公司招人要求相对低一些,薪资给的也少很多,它们是实实在在招能干本职工作活儿的人。
第二,你的起点也会比一般进入小厂的同学高。
我这里并不是歧视小厂,只是说一种普遍的情况。我本人也是从小厂一路过来的。这里我是强调算法和数据结构的重要性。尤其是应届生求职,更应该去好好准备一下这个,因为这个东西是原理性的基础。企业在面试应届生时不会过分要求项目经验和各种操作系统原理、网络通信原理之类的东西,而唯一能考察一个人的基本功的就是这个了。
我是社招进大厂,基本上算法和数据结构这类问题问的比项目经验本身要多许多。但是社招又不太一样,因为除了要准备算法和数据结构以外,还得准备有项目经验、了解操作系统原理、熟悉网络通信、了解数据库、熟悉要求的各种开源框架和技术等等,实在太多了,即使再怎么准备也不一定能一举拿下。相反,应届生基本上只要好好准备算法和数据结构的东西,大学其他专业课学的不是太差,这基本上就是进大厂的捷径。
图书方面,你可以使用你们计算机专业的相关教材,也可以使用《数据结构与算法分析:C 语言描述》《算法导论》这一类严谨的教材,当然,平心而论我是不敢推荐《算法导论》的,因为这一本书实在是太大部头了,没有好的数学知识,真的很难啃。如果想看一下比较幽默轻松类的书,可以看看程杰的《大话数据结构》。
数据结构与算法分析:C 语言描述
链接: https://pan.baidu.com/s/1WIyKQAIvt89cuJeDXWVwaQ 密码: qivj
算法导论
链接: https://pan.baidu.com/s/1XnrDbZph1Kp1P-Mwpe59dQ 密码: 0q8r
大话数据结构
链接: https://pan.baidu.com/s/1LDtySRDDozUz4OatZnG9XQ 密码: rrf8
二、其次,如果你学有余力,可以看看操作系统原理方面的书籍,当然也可以使用你们的教材,我这里推荐一本我看过的吧,Tanenbaum.A.S《现代操作系统》,Tanenbaum 是荷兰人,也是 Linux之父 Linus Torvalds 操作系统方面的启蒙老师。当然,我的建议是这种书毕竟流于理论知识,也不一定要看完,但一定将一些基础概念,如进程线程内存模式等基础概念看懂理解。
现代操作系统
链接: https://pan.baidu.com/s/18idkwiCuLkcORs3kqpZIUg 密码: 0sks
你如果还有时间强烈推荐看看俞甲子的《程序员的自我修养:链接、装载与库》,这本书同时涉及到了 Windows 和 Linux 两个操作系统平台,用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节,甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚,同时也分析了 C Runtime(CRT)、glibc 这样的操作系统接口库的原理和执行逻辑,是一本实实在在难得的帮你实战操作系统原理的一本好书。我特别喜欢这个书中序言的一段话:
“CPU体系结构、汇编、C语言(包括C++)和操作系统,永远都是编程大师们的护身法宝,就如同少林寺的《易筋经》,是最为上乘的武功;学会了《易筋经》,你将无所不能,任你创造武功;学会了编程“易筋经”,大师们可以任意开发操作系统、编译器,甚至是开发一种新的程序设计语言!
程序员的自我修养:链接、装载与库
链接: https://pan.baidu.com/s/1RybISm9nZPCDZTAHwrKC8w 密码: dlia
三、再次,你学这些东西是为了将来实践并有产出的,而落实这个产出的东西就是编程语言,如果是入门,我首推 C/C++。
你只有熟练使用一门编程语言,你才能将你的想法变成现实。
注意这里我把 C 和 C++ 放在一起,但是严格意义上说,C 和 C++ 还是有点区别的,但是除了语法上的一些细节差异,基本上可以认为是相通的。个人觉得 C 语言是所有想成为高手最应该使用的入门语言,不要和我说现在很火的 Python、Go 这类语言,“玄都观里桃千树,尽是刘郎去后栽”。我这里也推荐一本 C 语言方面的图书吧,有兴趣的可以参考一下:《C 语言程序设计:现代方法》。
C 语言程序设计:现代方法
链接: https://pan.baidu.com/s/18H4k0eCmD0jZ50ABRa_WGw 密码: okff
至于谭浩强的书就不要提了,还有就是大部头的《C++ Primer》,它虽然是一本好书,但实在是太大部头了。语法层面的东西学会很快,stl 库的东西需要实战,也不是翻这类字典一样的书就能很好地掌握的。
当然,如果你想掌握好 C++,《深度探索 C++ 对象模型》是一定要看的。
深度探索 C++ 对象模型
链接: https://pan.baidu.com/s/1nRlyUCuziPDkI9HGJZ1A2g 密码: 8puh
C++ 实际编码技巧还有另外一本非常好的书,介绍了常见的 C++ 编码技巧《提高 C++ 性能的编程技术》,建议 C++ 开发的把书中说的技巧全部掌握。
提高 C++ 性能的编程技术
链接: https://pan.baidu.com/s/1wYrWLA6Uv6v4ROHbeY7fZQ 密码: e0gq
四、接着说,我们再说说网络方面的,首先网络基础方面的书籍,我就没啥推荐了,现在很多计算机学院也开始使用《计算机网络:自顶向下方法》这本不错的教材,如果没有看过的可以看下。
计算机网络:自顶向下方法
链接: https://pan.baidu.com/s/1Uic-0KHUXwMR_pytx7Mh_A 密码: 9p3k
当然还是那句话你一定要看懂而不是看完。比如三次握手和四次挥手的细节,你一定要很清楚。然后你就可以找一本网络编程的实战书来看下,如果你没有使用任何socket api编程的经验,你可以看看韩国人尹圣雨写的这本《TCP/IP 网络编程》,这本书从基础的socket api介绍到比较高级的io复用技术,有非常详细和生动的例子。如果你是初级水平,强烈建议看看这本书。网络编程的细节需要注意的地方实在太多了,这本书上都有介绍。很多人尤其是一些学生,写了一些可以相互聊天的小程序就觉得自己熟悉网络通信了,但是这类程序拿到互联网上或者离开局域网,不是连接出错,就是数据总是收发不全。我当年也是这么过来的,看看这本书,你就能明白许多网络故障的原因。
TCP/IP 网络编程
链接: https://pan.baidu.com/s/1YZXRbD5BqzS0HF2jSDedvg 密码: qwdu
等你有了一定的网络编程以后(熟练使用常见socket API),你可以看看游双的《Linux 高性能服务器编程》,这本书给没有基础的人或者基础不扎实的人的感觉是,尤其是书的前三章,这书怎么这么垃圾,又把网络理论书上面的东西搬过来凑字数,但是如果你有基础再按照书上的步骤在机器上实践一遍,你会发现,真是一本难得的、良心的书,桃李不言下自成蹊吧。如果你掌握了这本说上说的这些知识,你再看陈硕老师的《Linux 多线程服务端编程》或者去看像libevent这样的开源网络库,你会进一步的得到提升。这也是我学习网络编程的一些经验和经历吧。注意这里有必要提一下:像UNP、APUE、还有《TCP/IP 详解》这一类书,如果你将来不是专门做网络方面的工作或研究,其实是非常不建议抱着他们看的,因为部头太大,其次太多理论和Unix的东西,花的时间产出投入比很低的。
Linux 高性能服务器编程
链接: https://pan.baidu.com/s/16H5N6QiFWdvFatJl5PXrMw 密码: orld
五、接着说,以上说的都是一些基础的东西。其实不管是什么开发,后台开发也不例外,你都是需要基于特定的操作系统的,这里不提 Windows 系统,单单拿 Linux 操作系统来说,既然你选择做这个方面的开发,你需要熟悉这个操作系统平台提供的一些常用的 API 函数,网络通信方面上文已经说过,除了网络通信还有如操作文件、操作内存、字符串操作、进程线程系列、线程同步系列(如互斥体、条件变量、信号量)、管道等常用的各种API接口函数。这里的意思是,不是要你背诵记忆每一个接口函数的签名,而是你要知道何时该用哪个接口,如何用,有什么注意事项。
我入门的时候看的是 Robert Love 的《Linux 系统编程》,熟悉这个人的应该知道,Google 的工程师,他还有另外一本非常有名的书《Linux 内核设计与实现》。
Linux 系统编程
链接: https://pan.baidu.com/s/1ZoMVBfkRoRcO88AZKYfTYw 密码: m284
Linux 内核设计与实现
链接: https://pan.baidu.com/s/1d4Xs3yyDPuFtGiFzZX1qXw 密码: pof8
六、最后,我强调一下,如果你是快毕业的学生,面临着找工作的压力,应该以算法和数据结构为主。如果你是大一大二或研一这个阶段的学生,我上面推荐的书,你还是可以考虑好好咀嚼一下,标准是看懂而不是看完。
七、再补充一些我觉得要成为高手应该要掌握的东西,先说汇编。虽然第三代第四代语言越来越多,硬件性能越来越好。但是如果你熟练掌握汇编,你就比其他人多很多优势,你会能透彻地知道你写的每一行 C/C++ 代码背后的机器指令的效率。无论是做安全工程还是自己技术提升上都是非常不错的。这里推荐一本王爽老师的《汇编语言(第 3 版)》,这本书***,语言通俗易懂,你也不用刻意去记忆,基本上当小说书看一下就能很快看完了。汇编实战类图书还有另外一本《老码识途:从机器码到框架的系统观逆向修炼之路》。我个人是非常喜欢这本书的。当年读这本书的时候,真的有一种“笑看妻子愁何在?漫卷诗书喜欲狂”的感觉。尽管那个时候连女朋友都没有——!
汇编语言(第 3 版)
链接: https://pan.baidu.com/s/1OY3LejfzuGGO38nBnNfoaw 密码: rf2q
老码识途:从机器码到框架的系统观逆向修炼之路
链接: https://pan.baidu.com/s/1EnlOX6Fi3NwWjsnXw6xqpw 密码: 9sgr
另外补充一些我学生时代看过的书吧,我本人是熟悉Windows和linux两个平台的开发,这也归功于我学生时代看过的一些经典书籍,可能有点跑题了,如果不介意,我可以和你说说:
- 《Windows 程序设计》第五版(第六版以后,这个不再是用 Windows Native API 写 C 程序了,而是转到 C# 平台上了),这本书是中国第一代程序的 Windows 启蒙书籍,你所看到的大多数桌面软件,如 QQ,的开发者可能都是通过阅读这本书启蒙起来的。
- 《Windows 核心编程》,这本书搞 Windows 开发的一定都知道这本书的分量。
Windows 程序设计 第五版
链接: https://pan.baidu.com/s/1ItSTSyKuhV6YAW1qfdnBdA 密码: ckq3
Windows 核心编程
链接: https://pan.baidu.com/s/1YdxOpKvFfoeJLx3mPdClIA 密码: aa43
- 《Linux 内核情景分析》毛德操老师的书,非常的实在,另外他写了一套关于Windows源码分析的书,这本书是基于开源的“Windows” ReactOS,书名叫《Windows 内核情景分析》。
Linux 内核情景分析
链接: https://pan.baidu.com/s/1bJDMIXwkTsIWK67OES1QJQ 密码: p3oj
Windows 内核情景分析
链接: https://pan.baidu.com/s/1y5LcZZg5KBuqa__zbAECwA 密码: fjb7
- 《编译系统透视:图解编译原理》,编译原理方面的实践书。
编译系统透视:图解编译原理
链接: https://pan.baidu.com/s/1ualL9CSyBHuRRnPA6jJriA 密码: k91h
- 《编程之美》,关于面试的,主要是一些算法和逻辑思维题实战。
编程之美
链接: https://pan.baidu.com/s/1c7xvPYOINL4-ExDCKkuBTg 密码: njp2
- 《重构:改善既有代码设计》,没有实际写代码经验不推荐看。
重构:改善既有代码设计
链接: https://pan.baidu.com/s/14v6azSQBgLqdeDGPgDSFAw 密码: r8ew
- 《程序设计实践》这本书特别推荐学生看一下,能大幅度地提高你实际编码的技巧和编码风格。
程序设计实践
链接: https://pan.baidu.com/s/1IZavh4lxsXADUXSIL-mIXg 密码: 4ii4
- 《代码整洁之道》同上
代码整洁之道
链接: https://pan.baidu.com/s/1HFiAQot0XYVzF1w05b-8iw 密码: jimw
- 《大话设计模式》
大话设计模式
链接: https://pan.baidu.com/s/1225ccn2r6FCURFVXgCgG8Q 密码: whno
- 《Windows PE 文件权威指南》
Windows PE 文件权威指南
链接: https://pan.baidu.com/s/1a5f7PadVWsFs8BKF5Bq1CQ 密码: eksf
《Effective C++》系列
Effective C++
链接: https://pan.baidu.com/s/1Pm2QlH9ezOZUYaNUafRTeg 密码: 5vuf
More Effective C++
链接: https://pan.baidu.com/s/1tFmjrnAlRseRDYIYMhz4mw 密码: ig8a
- 《计算机组成与设计:硬件软件接口》
链接: https://pan.baidu.com/s/1hjoQw9VRSW6kwXFtZdJm5g 密码: ogst
总的来看,我学生时代主要是侧重基础知识来读书的。本科四年、硕士三年,多谢这些书帮助我成长,记得大学毕业的时候,我光读书笔记就有满满十个笔记本。
工作以后,也读了像 Redis、Netty、分布式这一类书。但是那都是工作需要吧。由于我扎实的基础,当然也可能是因为运气成分吧吧,所以得到一些注重扎实的技术基础公司的青睐,给了目前这个阶段看起来还不错的薪资(当然可能还有人比我更厉害,那我这里就贻笑大方了,所以请不喜勿喷)。同时非常感谢我一路上遇到的公司和同事给我的技术上和生活上的帮助。薪资本身不能说明一个人是否成功,我码这么多字,希望广大的开发者注重基础,勿在浮沙筑高台。尤其是学生,你有大把读书的机会,一定要珍惜大学时光。毕竟工作以后,尤其是毕业后,面临着工作、家庭等各种问题,你可能再也没有心思和完整的时间去学习和提升了。所以前期的积累很重要,毕竟选择技术这条路,提高技术是升职加薪改善生活水平最直接的方法。
最后用我学生时代看到一个技术前辈写的一首诗来结束吧:
仗鼠红尘已是癫,
有网平步上青天。
游星戏斗弄日月,
醉卧云端笑人间。
七载寻梦像扑火,
九州谁共我疯癫?