本文转载自微信公众号《大飞码字》

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

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

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

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

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

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

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

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

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

基础知识的价值

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

一个是技巧层面的价值。

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

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

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

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

一个是思维层面的价值。

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

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

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

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

基础知识的演进

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

结语

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

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

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

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

  1. angular2学习记录-给后端程序员的经验分享

    1.前言 前几天刚下定决心把毕业设计改造下,因为毕业设计算是我学习的基石,学习到的东西都尽可能的在这个平台上施展,锻炼自己.改造为前后端分离,前端使用angular2,后端只提供接口.便于以后的维护. ...

  2. 漫谈程序员(五)20年资深程序员编程经验分享

    20年资深程序员编程经验分享 原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序员,编程经验已超过20年,涉足领域有电子商务.生物技术.房地产.医疗.保险和公 ...

  3. 程序员的精力呵护指南!来自十年程序员的精力管理经验

    有同学在星球询问了我精力管理相关的问题,问我白天要工作,晚上回家还要写文章,是怎么保持好一天的精力的. 我在这里分享下自己的一些经验. 程序员这个职业比较特殊,可以说是时间投入很大的一个职业,就算工作 ...

  4. python 线程池_老程序员的经验分享:Python 从业十年是种什么体验?

    出于某些原因,想记录一下我过去数年使用 Python 的经验和一些感悟.毕竟算是一门把我带入互联网行业的语言,而我近期已经几乎不再写 Py 代码, 做一个记录,也许会对他人起到些微的帮助,也算是纪念与 ...

  5. 程序员如何成长?如何进阶?——一个老程序员的经验分享2

    准备好了,我们需要开始起步了,所有的理想都是美好的,对于新人来说,这种美好都是原始动力,它不该被抹杀其作用,我很不同意一些人在开始就打击新人的这种出于理想主义的冲动,所以,我在这里要告诉那些新人如何利 ...

  6. 20年资深程序员编程经验分享

    原文地址:http://www.devstore.cn/essay/essayInfo/1845.html 原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序 ...

  7. 程序员如何成长?如何进阶?——一个老程序员的经验分享1

    做程序员十六年了,带过很多新人,闲着没事就把之前给新人们做培训的资料整理出来,分享一下,希望能给想做程序员的新人们给以建议和帮助. 1.心理准备. 程序员的世界是一个外面看着光鲜亮丽,但是实际里面十分 ...

  8. IT旅途——程序员面试经验分享

    摘要:本文从IT人员的角度,一起分享面试道路上的坎坷.文章汇集几个知名公司的面试题,从出题的角度到分析问题的方法到解决问题较为全面的讲解面试题目,以供读者参考. 面试是职场的永恒话题,如何在职场面试中 ...

  9. 程序员如何成长?如何进阶?——一个老程序员的经验分享3

    前面讲的东西显然还是太过理论化了,下面来讲讲具体怎么做才能让一个没有基础的人能够踏进软件开发这个行业来. 有了前面的对这个世界的初步了解,我估计你接下来会考虑难度问题. 从门外看,软件是有一定难度的, ...

最新文章

  1. 作者解读ICML接收论文:如何使用不止一个数据集训练神经网络模型?
  2. 《HBase企业应用开发实战》—— 第3章 数 据 模 型
  3. 复习笔记2018.8.3
  4. ubuntu开启SSH服务和允许root远程SSH登录
  5. python基础(part5)--容器类型之字符串
  6. httpcilent绕过证书
  7. python交叉验证函数_python – 在sklearn中使用交叉验证和AUC-ROC作为逻辑回归模型...
  8. C++可重载运算符和不可重载运算符
  9. 爬虫数据传入mysql_nodejs爬虫数据存入mysql
  10. HDU 4990 Reading comprehension
  11. ckeditor:基本使用方法
  12. 避免无法预知和依赖于实现环境的行为
  13. 【算法导论】第5章,概率分析和随机算法
  14. 矩阵论、组合数学基础
  15. CSS中的字体背景和盒子模型
  16. An Underwater Image Enhancement Benchmark Dataset and Beyong
  17. Hrbust2294修建传送门(尺取法)
  18. 「维基解密」:西游记死亡人数
  19. 朱老师ARM裸机学习笔记(四):S5PV210启动过程详解
  20. pandas matplotlib 用于数据分析和可视化

热门文章

  1. skill alpha protocol
  2. C# 通用Clone
  3. 【CVPR 2018】Learning Rich Features for Image Manipulation Detection(图像篡改检测)
  4. C/C++程序从编译到最终生成可执行文件的过程分析
  5. RxJava实现事件总线——RxBus
  6. px4 uavcan linux,PX4开发指南-12.2.1.UAVCAN Bootloader
  7. rsync 更改配置后, 无需手动重启
  8. Linux内核调试方法总结之sysrq
  9. linux小工具(1)查看shell的命令行历史记录
  10. SAP Customer Data Cloud(Gigya)的用户搜索实现