经常收到后台读者发过来同样的问题,看完「开发内功修炼」以后觉得写的不错。问:“飞哥你平时是怎么样磨炼自己的技术能力,并写出这些文章的?另外可否帮推荐几本书更系统地学习一下”。今天干脆就写一篇文章统一回复一下。
计算机技术理论与实现并重
在开始之前,我想先多扯几句关于在计算机技术上的一点浅薄的理解。计算机技术不同于其它学科,它对理论和实践都有较高的要求。我觉得最有用的成长方式就是理论和实践结合起来。用邓爷爷的话说就是两手抓,两手都要硬。
如果你还是学生,大概率理论占比会过于偏多,你就需要加强你的实践。要多多动手,甚至可以考虑去参加一些项目,在项目中不断实践自己学到的理论知识。这么做的好处是你不仅是有了实践经验,而且对你掌握的理论知识的认识也会进一步加深。
如果你已经工作了,可能手头的活儿干了很多。那可能需要暂停下手头机械搬砖的动作,结合自己的工作思考一下,工作中有哪些地方自己理论理解深度还不够,限制了你将手头工作推向更高的层次。回头去好好深耕理论,进而再将自己的工作做到更好的水平。
我的技术成长故事
我个人是属于已经工作了的那一类。我在日常code之余会有节奏有目的地推进自己的理论思考。没错,我用的字眼不是学习,而是思考。我对工作中看似司空见惯的问题发起疑问,然后自己花时间去翻阅各种资料,进行深度思考,然后将相关理论知识再次进行测试验证,最后在项目中应用。
比如有一次我们自己维护了一个线上的redis(当时工程部还没有redis平台,redis服务要业务自己维护)。为了优化性能,我把后端的请求由短连接改成了长连接。虽然看效果性能确实是优化了,但是我的思考并没有停止。我们所有的后端机都会连接这个redis。这样在这个redis实例上可能得有6000多条并发连接存在。我就开始疑惑,Linux最多能有多少个TCP连接呢,我这6000条长连接会不会把这个服务器玩坏?
所以我去回头翻各种资料,尤其是内核相关的。上网查各种文章,并进行多次的实践测试以后终于把这块的理论搞通透了。我的这篇文章《漫画 | 一台Linux服务器最多能支撑多少个TCP连接?》 就是这么来的。这个深度的理解对我后续的工作有极大帮助~~
我的类似的思考有很多。例如后端的各种服务经常要进行压测,经常会提及性能瓶颈。我又在想,整个计算机体系结构里,各个模块的性能表现究竟是啥样的。比如内存的延迟是多少,带宽能达到多少,真有厂家吹的那么牛叉?经过思考以及动手测试后,下面几篇文章就诞生了
《实际测试内存在顺序IO和随机IO时的访问延时差异》 《揭穿内存厂家“谎言”,实测内存带宽真实表现》 《搭载固态硬盘的服务器究竟比搭机械硬盘快多少?》
所有我这些思考成果汇总出来就形成了现在的「开发内功修炼」
当你开始深度思考一个具体问题的时候,你可能会发现,其实大部分时候没有任何一本现成的技术书籍能有完整的答案。比如我当时想查询内存的延时,带宽性能的时候,想看下内存的整体工作原理、CL、CD等各种延时究竟是什么含义。我翻遍了手头的资料也没找到靠谱的结论,后来是在几本书、加上互联网上搜来了几个零星的资料、再加上亲手实践测试后才算是彻底搞懂的。
这种对理论知识进行深度思考再加动手验证以后得来的知识在脑子里的印象特别深的。你几乎不太可能忘了它,因为它已经彻底内化到你的知识体系里了。在互联网时代,各种各样的知识获取成本已经足够的低,但只有深度思考才能让你把获取来的知识有机地组织,彻底融合到你的技能栈中。
经典书籍推荐
现在说到技术书籍的推荐上。在我思考的过程中,虽然说有时候连经典的技术书籍也不一定能给到我全部想到的答案。但它们的价值仍然是非常巨大,所以值得你拥有。不单单是要看一遍,而且在工作中遇到问题的时候随时要拿出来查。最好是拥有纸质版,因为当你想去查的时候,纸质的要比电子的更容易定位。今天推荐的书籍列表如下:
《深入理解计算机系统》
这本书我真的是非常喜欢,经常会回头去翻一翻。对于想理解你写出来的程序是怎么跑起来的同学真是的太合适了。里面推荐价值比较高的几块。一是存储器层次结构,这块内容对于理解CPU的缓存非常有好处。二是虚拟内存,看完这块能帮助理解开发手中用的内存地址是怎么转化到物理内存地址的。你也将彻底弄清楚页表、TLB缓存等概念。
《现代操作系统》
这本书是操作系统领域的经典之作。把操作系统的经典概念都基本讨论全了:进程、线程、存储管理、文件系统、I/O、死锁等等。不过该书过于全面,也过于理论,适合入门。
《TCP/IP详解 卷1:协议》
这是一本完整而详细的TCP/IP协议指南,把arp、ip、tcp、udp都介绍的透透的。也介绍了Linux上可用的ping、traceroute等网络分析工具。是开发同学手中必备的一本书。
《TCP/IP详解 卷2:实现》
但有些时候,你可能不满足于只知道TCP网络协议的理论。可能你也想看看这些协议都是怎么被实现的,那你就需要看看卷2了。
《深入理解Linux内核》
都说源码面前毫无秘密。我本人比较喜欢Linux操作系统的原因之一就是它开源,你想知道它咋工作的,找出源代码来看一看就行了。但是你自己没有任何经验的话,直接看源代码绝对能看蒙圈了。这本书就是一个帮助你理解Linux内核的一个绝佳的帮手。
在这里,你能看到操作系统理论中的进程调度、系统调用、页高速缓存、虚拟文件系统、Ext系列的文件系统分别都是怎么实现的。在工作中遇到不解的问题的时候,我也经常把它拿出来翻一翻。
《深入理解LINUX网络技术内幕》
这本是另外一本介绍网络实现的书。在《TCP/IP详解 卷2》中对Linux内核中的一些基本组件比如网卡注册、NAPI等没有介绍,这本书都涉及了。比如网卡的中断处理注册、数据帧的接收、NAPI与软中断等等。这本书再配合《TCP/IP详解 卷2》,理解Linux网络包处理更全面一些。
《追踪Linux TCP/IP代码运行》
这本书是中国人写的,基于Linux 2.6内核,比较起来上面的两本关于网络内核稍微容易理解一些。将socket怎么实现的,内核是如何监听的,怎么样来接收连接请求大概都写了一遍。如果你看其它书有难度的时候,可以把这本书拿出来帮你一下。
wireshark抓包工具
当你想动手实测的时候,你可能需要进行网络抓包。我本人对于这种应用工具类是不喜欢屯书的,每次哪儿用不明白我就直接上google了。
如果你非得喜欢囤一本回家好好看,我也推荐你一本:
《性能之巅》
你写出来的程序最终是要放在服务器上跑的。那么你的服务器在运行过程中对CPU、内存、磁盘、网络的消耗情况是怎么样的,通过哪些工具来进行分析,这本书可以告诉你。如果你是服务器端相关的开发或者是运维工作,如果想把工作干的出色一点,这本书必备!
Linux内核源代码
除了书以外,另外一个比较重要的工具就是源代码了。强烈建议看书的时候,打开vscode等IDE,跟踪一下代码的跳转。因为书都是基于某一个特定版本来写的,而事实上你用的每一个版本的Linux在实现上可能都会有不同的地方。所以最好的资料就是免费的源代码!
虽然Linux是开源的,但是还是有很多同学不知道去哪里下载源码。我这里贴一下
https://mirrors.edge.kernel.org/pub/linux/kernel/
上面的镜像站点里从1.0到6.x版本的源代码都有。
电子版下载
好了,到这里书单就推荐完了。不过好事做到底,飞哥打算把服务精神发挥到极致。
我这里把能收集到的电子版本,都帮大家整理好了,可以通过以下地址下载即可。
下载地址: https://pan.baidu.com/s/1yzSbhD96wdfYW6ncA9cN7A
高效学习方法总结
不过我最后再次强调一下我本人的内核修炼方法。我并不完全是用的传统的学习方法 - 挨本经典书都啃一遍或多遍。原因第一是工作后没有那么多的大块时间。第二是这种方法学来的东西很难内化到你自己的技术栈上,只是浅度的学习而已。
我的学习方法总结起来就是三步曲:
1.保持好奇心发现问题
在工作中,每一个司空见惯,不起眼的地方可能都会引发我的思考。每一个有意无意的小问题可能都不会被我放它过去。空文件占用多少磁盘空间,我非得去看看。文件名存到哪儿去了,我非得查个究竟。明明线上将长连接改成短连接性能已经优化过了,效果已经出来了。我还不行,我非得测测一台服务器究竟能撑多少条连接!
2.带着问题去深度思考、去查各种资料
每当我工作中遇到疑惑的时候,我都会把相关的经典书先翻开再查一遍。很多时候,书里的内容也并不能完整解释我的疑惑,比如上面我推荐的经典里没有任何一本书能清楚介绍内存是怎么工作的,网络包是怎么经过网卡到用的进程里的。我就还会继续 Google 上搜各种资料,甚至必要的时候也会翻开 Linux 的源代码。
3.别偷懒,加上动手实测
在理论上得到初步解释以后,其实这个时候你只是初步理解了,但理解深度还远远不够。而且还有可能是你查到的资料是片面的,甚至有可能都是错的。这时候的动手实际测试显得尤为重要,用各种性能测试工具也可以,自己直接亲手写一段代码也ok。反正就要用实践检验理论是否正确。不正确的时候,再去别的地方搜其它的解释。如此往复迭代,直到把疑惑彻底消灭掉为止~
总之,不要放过你手头工作中任何一个不起眼的疑问,抓住它进行深度思考,然后别偷懒多动手。当把问题真正搞的通透的时候,你会得到特别特别特别大的进步。