Vue 出 3 了,Spring 又更新了版本。网上一大票程序员叫学不动了,求不要再发布新版本了。

虽然工作多年,我时常也觉得学不动了。有时候再想软件行业永远也学不完吧。

一次偶然,我在 coursera 浏览了一个课程,它的前置课程是 discrete mathematics,也就是离散数学。我在想作者为什么要把离散数学放到一个应用的计算机课程中来呢?

我的专业是计算机网络,很遗憾没有学过离散数学,只学过微积分。于是我去看了下离散数学的介绍,有空去学一下。

看完介绍之后,后背发凉。

原来离散数学是很多计算机基础课程中的基础。数据库理论中的关系演算、哈弗曼树、笛卡尔积;计算机网络中的路由算法、通信原理;编程中用到的各种位运算技巧。这些知识都是离散数学的应用,难怪我在学习计算机网络和数据库理论的时候少了点什么支撑。

如果说计算机网络、数据库原理是知识的话,离散数学应该是知识中的知识。如果没有更加基本的知识中的知识,那么学到的这些计算机知识就像一盘散沙无法找到源头。

我才幡然醒悟,知识中的知识才是我们应该首先学习的东西,掌握了基础才能对应用知识顺手拈来。

因此我把计算机科学中的知识分为了两类:

  • 计算机的一些原理性的知识,例如数据库、分布式系统、操作系统、编译原理
  • 还有一类是流行的软件、库、中间件的使用方法

在程序员的生涯中学了太多的知识,与其说是知识不如说是在阅读某个开源软件的说明书。甚至是这些说明书的解释,更胜一步是翻译过来的中文材料。

于是就产生了程序员的知识获取鄙视链:

搞研究阅读论文的瞧不起读协议做实现的,读协议的看不起那些只能读某个实现软件的官方文档的,读英文文档的看不起读中文文档的,读中文文档的看不起看翻译版的,看翻译官方文档版本的看不起读周边书籍的。

处在鄙视链的最低端就是看视频教程手把手跟着学的。很不幸,我就是那个喜欢看视频教程处在鄙视链最低端的程序员。

更为具体的例子就是开源框架。基于 MVC 设计模式的各种框架不说上百种,也有几十种了。Java 中的 Spring MVC、Struts,PHP 中就更多了 Yii、CakePHP 等。Spring MVC 的文档是一个 MVC 框架的说明书,相关书籍时这个说明书的解释。

随着现代软件工程项目的复杂性越来越高,一个项目中引入的第三方软件包数十个,切换一个项目又需要重新学习另外的第三方软件。除此之外,还需要用到一些工具,IDE、Git、deveops 工具。如果涉猎架构和运维相关,还需要对基础设施很了解,docker、aws、ansible、keepalive 等。

这真的是 “生也有涯而知也无涯”,慢慢的我开始尝试取舍。

  • git 只是一个代码管理工具,用 Intellij 中的快捷键又快又好的完成了工作。
  • MVC 框架架学透一个能用的就好。
  • 前端的各种框架,快速读一下文档,了解一下直接在项目中使用。

上面这些东西都只能叫做“开源软件说明书”,下面的叫做 “知识”。

  • 计算机导论,计算机运行的基本原理。二进制、字符串编码、位运算等
  • 操作系统,计算机软件实现的基础。线程、进程、中断方式等
  • 数据结构和算法,优化程序性能的基础。数组、链表、HASH和各种树
  • 数据库原理,优化各种关系数据库的基础。索引原理、关系演算、范式理论等
  • 计算机网络,互联网开发的基础。HTTP协议、DNS 的原理
  • 密码学,计算机安全的基础。对称加密、非对称加密和各种签名算法
  • 编译原理,理解编程语言的基础,造轮子的基础。语法分析、词法分析、闭包等

阅读“开源软件说明书”的关键在于英语,现阶段大部分流行的开源框架和库都是英文文档,阅读英语是一个至关重要的能力。而学习计算机科学基础知识在于耐心,如果说学习 git 需要 4 个小时的课时的话。数据结构和算法起码需要 100 个小时,花费在计算机科学基础上的时间还需要包括实践,实验。

程序员持续学习的关键在于,层出不穷的框架、库和工具让人眼花缭乱,忘记了真正的知识是什么。也许当有一天,抵御了计算机行业中各种“时髦技术”的诱惑后,才能有所精进吧。

Last Updated:
Contributors: lin