基础不牢、地动山摇

经常有同学跟我说,很多的基础知识学过就忘, 比如操作系统、数据库、网络协议等方面的底层原理。而这些往往都是技术面试必考的内容。

 

每次被问到这个,我都不知怎么回答,跟他说多看几次,就记起来了? --- 这似乎是一句废话,但好像又对,细细想来,这后面还是有不少思考的。

 

我觉得很多同学在基础知识上的问题,不是技巧的问题,而是对基础知识的态度和理解的问题。

 

所以,这不是一篇教你怎么学基础知识的文章,而是告诉你基础知识的价值和基础知识在程序员脑海中的演进过程。

 

对于操作系统,数据库,网络等基础知识的学习,看书,做笔记是必要的。不过我在这里不教大家怎么看书,怎么做笔记,我估计读过大学的同学,这应该不是大问题。

 

很多人纠结的问题在于基础知识老是看了又忘,然后发现工作上好像也用不到,就开始质疑基础知识的价值,质疑到底该不该花时间去学。

 

所以先要认可基础知识的价值,意识到了基础知识的价值后,你才会愿意花时间去学习。

 

 

基础知识的价值

 

基础知识的价值,我觉得有两个部分。

 

一个是技巧层面的价值。

拿操作系统里面的线程和进程来说,线程和进程是cpu调度的基本单位,是代码的一种动态呈现,只要你写代码,就一定会涉及到线程或者进程。

 

当然在实际使用中可能被框架包装了起来,给人的感知很弱,但一旦你的程序有问题,你总是要用些工具来查看的:查看是那个进程出了问题,要从内存占用,cpu 占用,磁盘读写等来初步分析问题。

 

以上这个过程,是稍微有点技术含量的工程工作都会涉及的。上面例举的例子,你可以扩展到 操作系统锁,数据库表,数据库索引,数据库锁,数据库事务,TCP/IP , HTTP,websocket 等等。

 

就工程方向来说,几乎每个方向都要掌握相应的基础知识,只是每个具体方向对每种具体基础知识掌握的深入程度不一样。

 

像做分布式存储的同学,对数据库表,数据库锁,数据库事务这些的理解肯定是要很深入的;前端的同学对数据库相关概念的理解可以要求低些,但对网络,TCP/IP,  HTTP , HTTPS 这些的要求就要高很多。

 

一个是思维层面的价值。

除了技巧层面的价值,还有思维层面的价值。

 

怎么来理解这个事情呢?软件设计,有很多核心的设计思想,其实是相同的,这些基础概念,其实也是前人设计和总结出来的。

 

比如说线程和进程,这些概念不是自然原理,而是一种工程实践后的软件抽象,是前人抽象出来的一个结果。它的设计背后,蕴含很多优秀的设计思想和设计原则。

 

一开始的时候,你只知道这个概念,可能理解起来都觉得很困难,只能死记硬背,但就像我们小时候学习古诗词,它会给你带来潜移默化的影响。

 

你脑子里一直装着这些概念,实际工作和学习的时候,遇到相关的问题,你可能就会有点小思考,日积月累,你对它的理解会越来越深。这种理解,我觉得就在不断塑造着你的技术思维。

 

 

基础知识的演进

 

说完了价值,我来分享下,基础知识在程序员脑海中的演进过程。

 

我觉得对于操作系统和数据库,光看书几乎是学不好的,因为能做的就是背概念,但背完很快就忘记了。

 

我上操作系统课程之前,看过 linux 的源代码。对于操作系统,因为我花了很多时间在 linux 内核上,所以上操作系统课的时候,很多概念对我来说反而是一个汇总,把我很多离散的知识给汇总起来了。

 

所以我看进程,线程这些概念的时候,不是抽象的而且具象的,脑子里甚至可以具体到代码层面。

  

但很多人没有我这么一个经历,所以看起来一脸懵逼也正常。就像我在大学看数据库的时候,我也觉得很抽象,看了就忘,直到我后面自己去做存储,对很多的概念才慢慢地理解深入,开始有感觉。

 

但这里不是说就不去看了,不看,你就一直都不会知道,甚至连基本的思考都没有。

 

对于基础知识的学习,其实是循环往复的过程,不是一次性就能掌握的。对于这类知识的掌握会经历这么一个过程:

 

概念 -> 理解 -> 实践中的思考 -> 概念 -> 理解 -> 实践中的思考 ...

 

这是一个循环往复的过程,但不是重复,而是螺旋式地深入,每一次循环都能够带来更深入的理解。

  

我们说一个人技术很牛,有很大部分是因为他对很多的知识点经过了很多次这种循环,他对基础知识理解的深度要高过很多人。

 

软件技术有两个关键,一个是抽象,一个是分层。

 

其实你会发现很多的概念,知识点,都是一个具体软件实现的抽象,里面也有分层。

 

举个例子,我们说进程,你看书上就给了一个概念,你觉得很抽象,觉得这是操作系统里面的一个概念,有点像是原理性的东西。

 

但你往下一个层次看,到操作系统设计这个层面来看,进程是一个很具象的东西,有具体的代码,具体的设计,具体的细节,甚至有时候你会觉得有些代码写得也不咋地,就像是一个业务逻辑。

 

从这个层面,这个角度来理解,来看待进程的时候,怎么可能会懵逼,简直具象到不行了,甚至还会觉得这不就是一个业务逻辑嘛。

 

但深度是不是到这里就停止了,也不是。

 

你会开始去思考,为什么要有这个设计,为什么要有这种抽象,你可能会去找相关的论文来看。计算机技术不是自然科学,进程也不是定理性的东西,不是 1+1 等于 2 这种自然存在的,所有一切都是设计出来的。

 

有设计就会有讨论的过程,这些讨论的过程或结果很多都还保留在互联网上。

 

比如,有一次我们想为自己做的分布式存储,设计事物系统,后来就顺藤摸瓜地找到了数据库大师 Jim Gray 关于事务设计的经典文献和资料,里面有他的很多思考和权衡。

 

到这个时候,事务在你脑海里已经不是概念,而且一个庞大的东西,很多细节,设计的权衡,你想忘都忘不了了。

 

甚至你还会思考这种设计是不是最好的,时间过了这么久,会不会不适应现有的场景了,反正你会思考很多。

 

我们说有人很牛,我觉得这个就是很关键的区别了。

 

这个过程很艰难,也很缓慢的,要十年甚至二十年的时间,有人可以不断地深入;也有人只停留在很浅的层面。如果你能不断深入,你就能不断地超越很多人,朝着技术大牛的目标迈进。

 

结语

 

基础知识的学习和理解是缓慢且不断深入的过程,甚至是贯穿整个程序生涯的,不断深入理解的过程,也是不断塑造自身技术思维的过程。

 

当然,首先你得知道并认可基础知识的价值,你才会愿意花费时间和精力去不断去学习和深入理解它们。

 

这篇文章给大家分享了,基础知识的价值和基础知识在程序员脑海中的演进过程,这个视角可能比较独特,不过却也是我这么多年来的心得和感悟,希望对大家有所帮助!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值