用笨办法应对充满不确定性的未来

程序员的自我修养:构建知识结构体系

2023.07.20

Photo by Yuichi Kageyama

Photo by Yuichi Kageyama on Unsplash

TL:DR;

职业发展到了一定阶段之后,想要继续下去就需要将所掌握的知识进行结构化,用来查漏补缺。本文尝试将知识部分划分为前端领域知识、编程语言、工程素养、数据结构与算法、通用技能这几大模块。后续期望在这些领域持续学习、实践、写成博客。

问题

程序员是技能型岗位,需要掌握的技能包括技术知识以及职业素养等软性知识。现在网络无比发达,想要学习总是能找到无尽的资源,好消息是获取资料比以往更容易,坏消息是资料太多了无从下手,并且资料质量良莠不齐。开发者往往是根据零散的文章学习,最多是通过一些专题课程、手册来补充某一主题的知识。

缺少融入到自身知识体系的过程,单个知识点的逐个学习的零散学习方式容易有遗漏,效率低,而且互联网文章的准确性存在风险。

建立知识结构是指将知识进行分类,并且尽可能遵循“穷尽”和“不重复”的原则,各个类别之间不存在重复,并且分类完毕后应该包括所有的主题。

是真正的问题吗?

将知识进行结构化,有以下几个优点:

  • 方便查漏补缺。点状学习容易有遗漏,比如 React 的学习,如果从网上热门的常考知识点来复习,很容易芝麻西瓜一起抓,如果面试时是只根据热门考点来看,那倒还可以,但是往往考官也会看面试集合,稍微岔开一点话题可能就答不上了。

  • 便于平衡在不同领域的时间精力。在不同领域的深度广度要求不一样,比如在软技能方面,有一些基础的了解就能够有很大帮助。在职业生涯上的不同阶段,在广度和深度的追求也是不一样的。

  • 防止遗忘。很多人说一个技术长时间不用就会忘记、生疏,就像有个情况是一线技术转管理一段时间不写代码就会对写代码很陌生。但是开始整理自己的知识体系后,能够巩固自己的掌握程度,也能提升自己的视野。

  • 工作证明。当你要向很多人证明自己的技术能力时候,与其花费一个小时去大谈自己成果,简单的甩一个链接过去可能更轻松。特别是技术人可能并没有很优秀的口才。

总结而言作为开发者,作为一名软件工程师,定期整理自己的知识体系是非常重要的。

探索解决办法

遵循自顶向下,逐步细化的的模式,首先绘制最顶层的知识结构,再对各个领域的内容逐步细化。下面是我使用 Figma 绘制出来的知识结构图:

程序员知识结构图 v0.1

程序员知识结构图 v0.1

首先将整个知识体系拆分成了前端开发、编程语言、工程素养、数据结构与算法、通用技能 5 个领域,并且将他们从上到下的排列,越往下越通用,越往上越具体。

在某个具体领域的定义上,也是偏前端岗位进行了调整,例如前端开发单独作为一个领域,而 Java 作为后端代表,在我们的知识结构图中仅仅是编程语言领域的一员。而通用技能部分,既有开发工具如 git,也有操作系统、计算机网络等通常所说的“计算机基础”。

前端开发

前端开发目前是我的主要工作,一方面他是我的主要收入来源,同时也是我最熟悉的部分。因此把它列在最上面。

其中最基础的是 HTML、CSS 和 JavaScript,现在大部分时间是在写 JavaScript,对于 CSS 只要了解布局原理、能够画出界面来就行,不过能把 CSS 写好是非常不容易的。HTML 部分重点在于把工程模板理清楚,关注语义化、关注各个各个标签的新特性、以及无障碍相关的内容。

而 JavaScript 内容是又多又杂,先是规范在不断的进步,ES5、ES6、ES7、ES10,还有各级草案也在不断的提出,还有 Dom、Bom、CssDom 等各种区分,运行环境有 Node.js 和浏览器、小程序,还有 PWA、Canvas、WebGPU 等新兴领域。还有各种框架的百花齐放:React、Vue.js、Angular、每个部分都值得花一些时间精力来总结。

编程语言

这里主要从编程语言角度出发,作为前端工程师 JavaScript 语言是必须的,同时也需要了解关于 Node.js 的部分,前端工具开发离不开 Node.js,同时现在有很多前端命令行工具都在用 Rust 重写,甚至有 Tauri 这种底层以 Rust 构建的跨平台开发框架,因此也有必要去了解 Rust 语言。

将 Python 列到其中是因为 Python 的使用面非常广,从数据分析到运维脚本开发,从后端开发到机器学习都能用上,其广泛的第三方包让学习 Python 变成了非常有性价比的投资。特别是最近玩 AI 绘画接触到了机器学习部分,庆幸自己了解 Python,不然绘图环境搭建都没那么容易。

将 Emacs Lisp 列入其中是因为 SICP 的语言是 Scheme,而 Scheme 这门语言也是一种 Lisp 方言,既然都学了何不也把 Emacs Lisp 学上手呢?何况 Emacs Lisp 也能够让我在用 Emacs 时更加得心应手,加上加上加上。

Java 作为互联网行业的后端标准语言,我觉得有生之年是应该要学一下的,不过用到的场景可能不是很多,或许可以拿来开发 Android App,但那是另一个故事了。个人角度而言可以去了解一下 Java,这样跟后端合作的时候也能更加流畅。

工程素养

包括设计模式和如何写整洁代码两部分。前者可以避免各种自创的“小妙招”,可以用公认的一些设计模式术语与其他程序员沟通,例如你刷题有经验后跟别人讲解题目思路,一句使用双指针法或者哈希表法就比你长篇大论描述执行过程要方便得多。

整洁代码部分有其抽象的部分,细化下来也要根据编程语言的特点制定一些语法、代码风格方面的规范。而且很多情况下代码风格检查工具并不能检查出更高层的问题,如模块设计不合理等问题就比较难以检查出来,同时规范也很容易被跳过。整洁代码通常要和 Code Review 联合起来。

数据结构与算法

列出这部分是因为它属于了解之后,能够提升对编程的兴趣。有时候在工作环境搬砖搬久了,会觉得人生真是无聊。但是熟悉算法之后,每周去练习一下算法就当作脑部健身操了。而且算法确实有用,没用到的话只是别的框架都把细节做掉了。

通用技能

操作系统跟计算机网络等属于计算机基础知识,通常在大学中算是计算机专业的核心课程。常规来说经典书籍包括 CSAPP、SICP,课程方面可能得找国外的大学开放课程来看了,属于短期不大会直接拿来干活,但是要不会的话对后面的成长有影响。

英语是公认的通用技能,首先编程新技术等等都是使用英文编写,社区也是用英文交流,甚至如果以后想找国际合作机会的话,不会英语都是件麻烦事情。我有幸能简单阅读英文资料,但是还需要增强、甚至再扩展一门外语。

开发工具。包括熟练掌握 IDE 的使用、调试方法、画图工具、Docker 等运维工具都是很有必要掌握的,毕竟天天用的东西,提升一点点效率积累起来都是很大的财富。

如何细化知识结构

绘制完了顶层的知识结构,下一步是完善并细化具体领域的知识结构。

第一个问题是应该深度优先还是广度优先。我的想法是对于当前工作能直接有帮助的,就优先了解,并且先广度优先,然后逐个突破。比如前端领域的 JavaScript 部分,先直接按照经典书籍的方式来叙述,力争整个流程都逐步的梳理一遍。然后对于重点难点领域,进行深入理解,有必要的话还得动手大量写代码。

第二个问题是如何证明自己掌握了。比如 CSAPP、SICP 等经典书籍,计划将其核心的例题都做一遍,最好能做出自己的编程语言,还可以写笔记、写教程来为他人讲解。根据学习金字塔的说法,仅仅独自学习的效果最差,而教授给他人的学习效果是最好的。最后留下在线的学习成果证明很重要,避免独自一人闭门造车,也可以展示自己的成果。

我的理解中计算机软件领域是学习成本最低的,特别是互联网开发,只需要一台电脑和网络就能学习并实操,并且能力够强的话还可以做到远程工作,对开发者来说也是非常适合做独立开发者,比如做个 SAAS 服务运营得当能够卖到全球的话,也是一件令人羡慕的事情。

总结

本文开了个新坑,用来整理程序员知识结构。本次先把顶层的结构给梳理出来了,下一步是完善并细化具体领域的知识结构。