性能文章>白话硬核技术系列开篇:这么多技术我们该怎么学>

白话硬核技术系列开篇:这么多技术我们该怎么学原创

3周前
190402

 希望我们每一个人都能够更加高效地学习新技术,节省下来的时间多陪陪家人和朋友

 

01

 

 

现代技术人的困境

 

当今世界,技术纷杂,新技术层出不穷,我们无法像上几代人那样,能够精通或者熟悉所有的技术。

 

环境总是在变化,技术总是在发展,如果没法快速掌握新技术,我们很快会被拍在历史的沙滩上,导致所谓的“35岁危机”。新一代技术人由于无历史包袱,技术的学习热情和动力远胜于我们,我们很容易被替代。

 

但是,新技术的发展实在太快了。可能你刚学完一项新的技术,另一项相关的技术就已含苞待放,过不了多久,你所精通的那项技术就会迅速过时,你又不得不重新学习另一项新的技术。

 

我们该怎么办?

 

 

02

怎么解?

 

《技术的本质》这本书告诉我们两个基本原理

  1.  

  2. 1.所有的技术都是已有子技术的组合

  3. 2.技术到最底层最终都是依赖于一些自然现象

 

通过这两条非常简单的基本原理能够推导出所有技术的起源和演进,包括整体的计算机技术、计算机技术领域中一项具体的技术,比如:Docker,K8S 等等。

 

举个生活中的栗子:

 

一辆卡车利用了这样两种基本的物理现象:第一种物理现象是圆形的物体滑动摩擦力远远小于方形物体,第二个物理现象是燃烧的气体高速往后排的时候会产生一个反向作用力。基于这两个基本的物理现象,封装成一些基本的设备,比如轮胎系统,动力系统;然后为了确保这些设备高效运转,又有一些辅助设备围绕在他们周围运转,如刹车润滑系统,传动系统,散热系统;然后为了确保传动系统和散热系统能够正常 work,可能又会增添一些新的系统,层层叠加,一辆卡车到最后可能有成千上万个零件,但是,其最本质的东西可能就那么几个。

 

计算机技术的结构也是类似的情况,每一项具体的技术总是依赖为数不多的几个“现象”。

 

如 Spring 可以理解为最核心的就是一个大 Map,往 Map 里塞东西,取东西,形成了 IOC;往 Map 塞东西的时候,可以装饰它,就形成了 AOP,核心技术原理可能就那么几行代码。

 

再比如 Netty,核心原理就是一个 for 循环,挨个地执行连接的读写事件,所有的其他组件都是围绕在这个 for 循环周围的装饰,了解了这一点,整个框架的学习也就能够很快掌握。

 

抓核心,抓本质,这个核心本质就是底层技术,也就是我们所有技术依赖的“现象”。

 

按照 《技术的本质》一书的理论,所有技术最终都是依赖于物理现象,我们当然不要求挖到物理现象那么深,我们只需要尽可能地接近物理现象,越接近物理现象,我们未来所能创造的技术空间就越大,也就是未来我们学习新技术的速度就会越快。

 

所以,知道了这些,到底如何提升我们学习新技术的效率?

 

如果一项具体的技术和你的当前工作关系不大,而是奔着“以后可能会遇到”的目的去学习,建议不要耗费大量的精力去了解这项技术的所有的细节,比如所有的 API,所有的功能。一方面由于工作中用不着,没有实践的技术很快就遗忘,另外一方面,如果只是学到表象的浅层的知识,无法迁移到新的技术,事倍功半。

 

正确的做法是:我们可以去学习这项技术背后依赖的更本质更底层一些的技术,也就是《技术的本质》中所说的“物理现象”。

 

比如学 Docker 之前我们可以去了解 Linux 内核的 namespace 和 cgroup 技术;学一个高性能日志系统之前我们可以先去学 Linux 内核文件读写的机制以及一些关键的数据结构;学一个新的 JVM 编程语言之前我们可以先去学虚拟机字节码及相关的运行机制、编译原理相关的一些理论。只有知其所以然,才能够更快地知其然,以不变应万变才是面对当今复杂世界的解决之道。

 

即便如此,也许你也知道学底层技术很重要,但是市面上很多相关资料都太过于高深,我们也没有太多时间花在所有的底层技术上。因此,我决定做一个尝试,来帮助你更有效地学习与工作相关的底层技术,我称之为“硬核技术”,掌握这些硬核技术,潜在的上层技术空间就越大,未来的新技术的掌握速度也就也快。

 

03

白话硬核技术系列计划

 

这个系列的文章,我会站在一个普通开发者的视角,用白话文的方式来向你介绍看似高深技术背后的每一个硬核技术,初步的一些文章如下:

  • 什么是用户态和内核态?

  • 什么是系统调用?

  • 为什么不同进程访问相同的内存地址不会产生冲突?

  • 写文件为什么一定要 flush?

  • 为什么文件不使用要关闭?

  • mmap 为什么这么快?

  • 什么是工作目录?

  • 进程睡眠到底意味着什么意思?

  • 为什么 Linux 下的软件无法在 Mac 下运行?

  • 进程上下文切换为什么这么慢?

  • 程序是如何变成进程的?

  • ...

 

这个目录是动态调整的,未来我希望能够攒够一百篇,能够覆盖大部分和我们普通开发者最接近的硬核技术。

虽然叫硬核技术,但是越底层的技术,越接近物理现象,实际上反而越简单,所以你不用担心学不会。当你的工具箱里存放的这些硬核技术足够多,未来对于新技术本质的把握也就越快。

大家有好的建议也可以在底下给我留言,截止 7.31 24:00 留言点赞最多的一位同学可以免费获取我著的 《跟闪电侠学 Netty:Netty 即时聊天实战与底层原理》 一本。

PS:关,开启你的硬核技术之旅!

 

请先登录,感受更多精彩内容
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

在调试器里看LINUX内核态栈溢出
图灵最先发明了栈,但没有给它取名字。德国人鲍尔也“发明”了栈,取名叫酒窖。澳大利亚人汉布林也“发明”了栈,取名叫弹夹。1959年,戴克斯特拉在度假时想到了Stack这个名字,后来被广泛使用。
雕刻在LINUX内核中的LINUS故事
因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人。虽然大家可能都听过钱钟书先生的名言:“假如你吃个鸡蛋觉得味道不错,又何必认识那个下蛋的母鸡呢?” 但是如果真是遇到一个“特别显赫”
从猫蛇之战再看内核戏CPU
连续写了几天的代码,有些疲倦,吃过晚饭,换个工作方式,继续和大家聊猫蛇之战。蛇不仅丑陋,而且可能伤人害命,是邪恶的象征。猫与蛇战,代表着讨伐奸邪,是正义之战。猫与蛇战,技艺娴熟,举重若轻,叫人拍手叫绝
如何使用Linux内核中没有被导出的变量或函数?
本文详细介绍了使用EXPORT_SYMBOL宏导出函数或变量、使用kallsyms_lookup_name()查找函数或变量的虚拟地址以及内核模块中直接使用内核函数的虚拟地址等3种方案解决没有被EXPORT_SYMBOL 相关的宏导出的变量或函数不能直接使用的问题
深入理解Linux内核进程上下文切换
我都知道操作系统的一个重要功能就是进行进程管理,而进程管理就是在合适的时机选择合适的进程来执行,在单个cpu运行队列上各个进程宏观并行微观串行执行,多个cpu运行队列上的各个进程之间完全的并行执行。进
Linux pstore 实现自动“抓捕”内核崩溃日志
简介pstore文件系统(是的,这是个文件系统)是Persistent Storage的缩写,最早在2010年由 Tony Luck 设计并合入Linux主分支,设计的初衷是在内核Panic/Oops
从应用到内核查接口超时(下)
某个接口超时会偶发,查了几个 case 的日志,发现 httpClient 在请求某三方接口结束后输出一条日志时间为 A,方法返回后将请求结果解析成为 JSON 对象后,再输出的日志时间为 B, AB之间的时间差会特别大,100-700ms 不等,而 JSON 解析正常是特别快的,不应该超过 1ms
操作系统
内存问题探微
这篇文章是我在公司 TechDay 上分享的内容的文字实录版,本来不想写这么一篇冗长的文章,因为有不少的同学问是否能写一篇相关的文字版,本来没有的也就有了。说起来这是我第二次在 TechDay 上做的
2
0