本文转载自公众号  大飞码字

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

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

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

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

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

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

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

基础知识的价值

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

一个是技巧层面的价值。

拿操作系统里面的线程和进程来说,线程和进程是cpu调度的基本单位,是代码的一种动态呈现,只要你写代码,就一定会涉及到线程或者进程。当然在实际使用中可能被框架包装了起来,给人的感知很弱,但一旦你的程序有问题,你总是要用些工具来查看的:查看是那个进程出了问题,要从内存占用,cpu 占用,磁盘读写等来初步分析问题。

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

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

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

一个是思维层面的价值。

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

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

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

一开始的时候,你只知道这个概念,可能理解起来都觉得很困难,只能死记硬背,但就像我们小时候学习古诗词,它会给你带来潜移默化的影响。你脑子里一直装着这些概念,实际工作和学习的时候,遇到相关的问题,你可能就会有点小思考,日积月累,你对它的理解会越来越深。这种理解,我觉得就在不断塑造着你的技术思维。

基础知识的演进

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

结语

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

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

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

面试官,你考我那么多基础知识干什么?相关推荐

  1. 作为一名Java程序员,这些Spring知识点面试官常考

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 丸纸 来源 | 极客时间 毋庸置疑,Spring 早已成为 Java 后端开发事实 ...

  2. 字节面试官推荐的一份 Java 基础面试题!太顶了

    Java 基础篇 Java 有哪些特点 并发性的: 你可以在其中执行许多语句,而不必一次执行它 面向对象的:基于类和面向对象的编程语言. 独立性的: 支持一次编写,到处运行的独立编程语言,即编译后的代 ...

  3. 关于三次握手与四次挥手面试官想考我们什么?--- 不看后悔系列

    在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问 ...

  4. 软考自查:多媒体基础知识

    多媒体基础知识 内容提要 多媒体技术基本概念 多媒体相关计算问题 常见多媒体标准 数据压缩技术 多媒体技术基本概念-音频相关概念 多媒体技术基本概念-图像相关概念 彩色空间 RGB YUV(电视,兼容 ...

  5. (软考)系统分析师——多媒体基础知识

    ps:本博客内容只针对博主复习期间对考点的一些总结,内容可能并不全面,还望海涵.也欢迎大家补充和指点错误~~ 计算机多媒体技术的基本特征:数字化.集成性.交互性和围绕计算机而构成并受计算机控制.计算机 ...

  6. 软考——软件测评师基础知识

    计算机基础知识 计算机系统构成及硬件基础知识 计算机系统由硬件和软件两部分组成 1) 计算机硬件:运算器.控制器.存储器[前三个统称为计算机的主机].输入设备.输出设备 中央处理器(CPU)=运算器( ...

  7. 12. 面试官不问, 你也不得不知道的锁知识!

    前言 hello, 大家好, 我是咸鱼君, 擅长各种Java摸鱼姿势. 恰逢2020年"金九"月, 今天, 我们就来说一说面试中出现频率极高的锁知识! ps:说不定可以帮到部分有& ...

  8. 扎实的java基础_如何做到面试官要求的“扎实的Java基础”

    那么,如何具有扎实的Java基础? 总结成一句话--玩好JDK. 总的来说,JDK包括三部分,第一:Java运行环境(JVM),第二:Java的基础类库(lang .uitl.io等等),第三:Jav ...

  9. 有哪些前端面试题是面试官必考的

    Iterator迭代器 Iterator(迭代器)是一种接口,也可以说是一种规范.为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据 ...

最新文章

  1. 五、开始学习Excel函数,效率快速提高
  2. Java内存缓存-通过Map定制简单缓存
  3. 中文版php.ini
  4. linux如何查看jmx参数,linux下利用JMX监控Tomcat
  5. poj 3461 - Oulipo
  6. Reverse Interger
  7. nohup启动java命令导致dubbo无法注册
  8. 机器学习---分类、回归、聚类、降维的区别
  9. 国内自动化测试软件,AutoRunner-国内测试行业专业自动化测试工具成长史
  10. 张孝祥正在整理Java就业面试题大全
  11. 恢复win7快速启动栏
  12. JPG图片在线翻译的操作方法
  13. Binder源码阅读指南之java层,作为Android开发程序员
  14. ubuntu如何连接显示器
  15. 灵异事件之idea和金山词霸
  16. 【python--爬虫】b站弹幕爬虫
  17. GATBX遗传算法工具箱函数及实例讲解
  18. 四川已公开5G专利1966件,位列全国第六
  19. 实现城市列表的排序及模糊查询
  20. 3手机版怎么换行_奥特曼格斗进化3手机版完美存档安装读取教程

热门文章

  1. Linux文本处理三剑客之sed
  2. JNI编程基础(二)——Android Studio NDK开发
  3. 解决重写父类的方法且不会影响继承的子类的问题
  4. Windows ThinPC 最终版已 RTM
  5. Linux系统下挂载Windows分区
  6. Java调用Matlab程序
  7. 解决ubuntu(16.04版本)和windows电脑之间无法复制粘贴问题
  8. Linux下进程间通信的六种机制详解
  9. SIP中的SDP offer/answer交换初探
  10. C++后台服务程序开发模式