经常收到后台读者发过来同样的问题,看完「开发内功修炼」以后觉得写的不错。问:“飞哥你平时是怎么样磨炼自己的技术能力,并写出这些文章的?另外可否帮推荐几本书更系统地学习一下”。今天干脆就写一篇文章统一回复一下。

计算机技术理论与实现并重

在开始之前,我想先多扯几句关于在计算机技术上的一点浅薄的理解。计算机技术不同于其它学科,它对理论和实践都有较高的要求。我觉得最有用的成长方式就是理论和实践结合起来。用邓爷爷的话说就是两手抓,两手都要硬。

如果你还是学生,大概率理论占比会过于偏多,你就需要加强你的实践。要多多动手,甚至可以考虑去参加一些项目,在项目中不断实践自己学到的理论知识。这么做的好处是你不仅是有了实践经验,而且对你掌握的理论知识的认识也会进一步加深。

如果你已经工作了,可能手头的活儿干了很多。那可能需要暂停下手头机械搬砖的动作,结合自己的工作思考一下,工作中有哪些地方自己理论理解深度还不够,限制了你将手头工作推向更高的层次。回头去好好深耕理论,进而再将自己的工作做到更好的水平。

我的技术成长故事

我个人是属于已经工作了的那一类。我在日常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

提取码: 4uqa

高效学习方法总结

不过我最后再次强调一下我本人的内核修炼方法。我并不完全是用的传统的学习方法 - 挨本经典书都啃一遍或多遍。原因第一是工作后没有那么多的大块时间。第二是这种方法学来的东西很难内化到你自己的技术栈上,只是浅度的学习而已。

我的学习方法总结起来就是三步曲:

1.保持好奇心发现问题

在工作中,每一个司空见惯,不起眼的地方可能都会引发我的思考。每一个有意无意的小问题可能都不会被我放它过去。空文件占用多少磁盘空间,我非得去看看。文件名存到哪儿去了,我非得查个究竟。明明线上将长连接改成短连接性能已经优化过了,效果已经出来了。我还不行,我非得测测一台服务器究竟能撑多少条连接!

2.带着问题去深度思考、去查各种资料

每当我工作中遇到疑惑的时候,我都会把相关的经典书先翻开再查一遍。很多时候,书里的内容也并不能完整解释我的疑惑,比如上面我推荐的经典里没有任何一本书能清楚介绍内存是怎么工作的,网络包是怎么经过网卡到用的进程里的。我就还会继续 Google 上搜各种资料,甚至必要的时候也会翻开 Linux 的源代码。

3.别偷懒,加上动手实测

在理论上得到初步解释以后,其实这个时候你只是初步理解了,但理解深度还远远不够。而且还有可能是你查到的资料是片面的,甚至有可能都是错的。这时候的动手实际测试显得尤为重要,用各种性能测试工具也可以,自己直接亲手写一段代码也ok。反正就要用实践检验理论是否正确。不正确的时候,再去别的地方搜其它的解释。如此往复迭代,直到把疑惑彻底消灭掉为止~

总之,不要放过你手头工作中任何一个不起眼的疑问,抓住它进行深度思考,然后别偷懒多动手。当把问题真正搞的通透的时候,你会得到特别特别特别大的进步。

我是怎么样写出开发内功修炼的?秘密都在这里!相关推荐

  1. 开发内功修炼网络篇电子书出炉!!!

    点击上方蓝字"开发内功修炼",关注并设为星标 了解你的每一比特,用好你的每一纳秒 飞哥的开发内功修炼技术号更新文章有一年多了,以前的文章都是单独介绍一个技术点,没给大家一个整体的视 ...

  2. 开发内功修炼内存篇汇总

    最近终于抽空把内存篇更新完了,我分享出来的这些问题,其实都是我之前没有搞的特别明白的困惑.刚刚开始的时候,可能就是在我脑子里蹦出的一个疑问,比如内存随机IO会比顺序IO慢吗? 为了解开这个疑惑,我曾经 ...

  3. 我是如何写出一本畅销技术书的?持续更新

    如何写技术文章已经有很多人写过了,这里我来讲一下如何写一本畅销书,以及成为畅销书作者后发生的事. 1.阻碍写书的关键点 很多人都想写书,也想了很久,就是事没成,最主要就是没有迈出第一步,阻碍迈出第一步 ...

  4. html文标题党,标题党:如何写出一个SEO与新媒体传播都吸引人的标题! - 蝙蝠侠IT...

    标题党,这里先简述一下,大部分作者往往将标题党定义为那些利用浮夸标题吸引眼球的写手,基本上文不对题,但实际上我认为"标题党"这个词应该作为中性词. 道理很简单,在任何时期,我们都得 ...

  5. 写给内功修炼读者的一封信!文末献上作者近照!

    大家好,我是张彦飞allen.我在2010年从西北大学计算机系硕士毕业,然后就来到帝都一直混迹到现在.这期间主要在腾讯.搜狗两家公司从事应用开发与技术管理工作. 为啥要写这么一个技术号呢?故事还要从2 ...

  6. 教你写出可读性高的Python代码

    如果有人问起 Python 程序员他们最喜欢 Python 哪一点,他们一定会提到 Python 的高可读性.确实,对于 Python 来说,其高可读性一直是这门语言设计的核心.一个不争的事实是,相对 ...

  7. 转贴:孙云丰,你让我感到恶心 --鉴于google的退出,正好是写出了心中所想

    百度首席产品设计师孙云丰写到  "Google市侩,我感到恶心" (全文见 http://www.douban.com/note/56797811/ ) 他这样写到 "& ...

  8. 【软件开发底层知识修炼】十三 链接器-如何写出不依赖C库函数的代码

    本文将综合以下4篇文章,学习如何写出不依赖libc库的程序: [软件开发底层知识修炼]九 链接器-可重定位文件与可执行文件 [软件开发底层知识修炼]十 链接器-main函数不是第一个被执行的函数 [软 ...

  9. 下载破 2w+,在校生必看,《程序员内功修炼》第二版出炉

    在上上周的时候,我发了一篇预告文章:下载破2w+,帅地把<程序员内功修炼>给大整改,全新第二版即将出炉 不过,我并没有在上周就把<程序员内功修炼>第二版整理出来,主要是自己那一 ...

最新文章

  1. 程序与进程的区别,并发与并行的区别,多进程的实现原理
  2. centos php 开启socket,centos下phpsocket连接,该如何解决
  3. 20135223何伟钦—信息安全系统设计基础第七周学习总结
  4. 电脑主板主要外部接口
  5. 将jpg文件当作php文件来解析,解析漏洞
  6. SQLServer 2008 技术内幕——T-SQL 查询 笔记
  7. Layout 和 Menu【转】
  8. 极客大学架构师训练营 大数据 GFS、MapReduce、BigTable,Hadoop HDFS Yarn HiveQL 第12次作业
  9. android 不压缩保存图片格式,Android图片处理——压缩、剪裁、圆角、保存
  10. MMD动作下载:世界第一公主殿下 World Is Mine Project DIVA
  11. php中大于等于的表示方法,php大于等于符号
  12. 电影记忆之20(恐怖游轮)
  13. 1.bboss-bboss启动无法加载ES参数问题跟踪
  14. 推荐免费学习使用的云服务器
  15. 港湾公园 Haven Park for Mac(好玩的探索建造冒险游戏)
  16. 【RPC实战与核心原理】-第19讲-分布式环境下定位问题
  17. 2018仁爱英语7年级下册U6T2学科讲义(有答案)
  18. 互联网广告作弊的危害,以及如何反作弊
  19. 解析几何:第二章 解析几何中的基本计算公式
  20. ADV-369 第二点五个不高兴的小明 动态规划入门

热门文章

  1. 什么是新零售系统?新零售系统如何变企业“卖货难”为“销货易”?
  2. 【IDEA】IDEA相关
  3. 图书馆借阅的e-r图
  4. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记~第五章:继承与派生(新标准C++程序设计)
  5. MX Player 1.8.6第三方解码器,支持AC3、DTS
  6. itk registration 14
  7. ASO优化:关于后台关键词设置的逗号的使用
  8. 登康口腔上市获反馈:成人牙膏贡献八成收入,销售费用远高于研发
  9. 微信小程序宠物用品服务商城SSM-JAVA【数据库设计、论文、源码、开题报告】
  10. WebJobs schedule Job调度时间 设定 各个字段的含义