41

基础知识的学习,来自十年程序员的经验分享

 4 years ago
source link: https://www.tuicool.com/articles/ZfqyUzi
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

imYn2ue.jpg!web

前面分享过一篇算法学习的文章 :  不懂算法,还想进大厂?做梦吧 。 虽然有点标题党,但内容还是不错的。

后来就想能不能对计算机学习方法和学习心得写个系列的文章,这篇算是第二篇。偏向基础知识部分, 比如 操作系统,数据库,网络 等。

本来这篇文章应该按着算法那篇来写 --- 写学习方法,但写着写着,就变成一个学习心得了,不过细细想想,觉得这么写也对。

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

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

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

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

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

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

基础知识的价值

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

一个是技巧层面的价值。

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

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

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

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

一个是思维层面的价值。

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

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

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

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

基础知识的 演进

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

结语

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

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

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

推荐阅读:

一些思考

一个邀约

关于小型长周期项目的一些建议

一个失败的技术型产品

人越老,脸皮越厚

十年工作生活路

你好,我是大飞, 十年互联网人!

如果你喜欢我的文章,就给 公众号加个星标 吧,方便阅读。

JFrEJfR.jpg!web

提升技术认知,助力技术成长:

jmYvAfQ.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK