记笔记这件事,也许在很多人看来,再普通、简单不过了——从小老师就教育我们要这么做。不同的人有不同的方式,我们最终的目的,还是希望不要停留在只是记录这一层面上,而是将它们转变为我们的知识。作为一个程序员,今天我跟大家聊聊我的一些笔记管理的方法,希望对大家有用。如果大家还有更好的方式,也欢迎留言一起探讨。
知识学习的路径
首先聊聊知识学习的路径。讲得宏大一点,我们得先有方法论。知识学习的途径可以分为以下几个阶段:
接触,可能来源于工作中遇到的一个问题,或者朋友的推荐,或者逛社区、论坛时看到的新鲜内容。在接触之前,我们并不知道,或者并不在意一个知识的存在,以及它是如何存在的。通过接触,它勾起了我们的好奇心,激发了我们的热情,吸引我们去实践。
实践,就是依照别人所描述的内容,或者自己个人的理解,动手去解决问题。只有经历过实践,才能摸清楚细节,才能更加具象、深刻地理解某项知识。而在实践的过程中,我们可能会遇到各种状况,别人未描述的或自己不甚理解的。通过各种其他手段,如查阅、咨询等,最终解决了问题,丰富了知识适用的场景及其内涵。然后我们就需要把实践的过程记录下来,形成我们自己的认知。
总结,就是用自己的话去描述同样一个知识。它的表述形式可能跟别人的不一样,关注的细节点也可能不一样。通过总结,形成我们认识事物的方式。这种方式继而会影响我们在后续的实践过程中的工作流程。一些较复杂的知识点也不是一次实践或总结就能准确理解的,也许有疏漏。在后续的工作、学习中,我们使用这些尚未完全的知识,遇到困难,又继续总结,形成一个反馈循环。直到达到一个较为满意的状态。这个时候,我们就可以考虑“为人师”了。
分享,就是把自己掌握的知识,用更多人能理解的方式讲述、传播出去。它跟总结的区别就是,不再是仅仅以个人能理解的方式去表达知识,而是要辅以通俗的语言、合适的图文来表达。让大家看到还有这样一种角度、思路,成为他们的知识接触点。
结构
这里我们讨论的知识的主要载体,就是笔记。根据知识学习的路径,我们可以对笔记进行分门别类。至少要单独列出分享这一目录。我常用的一级目录为:
分享:包含所有待分享或已分享的文章、素材,使用日期作为子文件夹或文件名前缀。
开发:包含开发相关的知识点,如语言、工具、操作系统、网络、中间件、架构等等
工作:包含各个公司、个人项目的工作内容与日常记录
至于一级目录以下的目录划分,可以根据每个人所侧重的知识面来安排。
工具
那用什么做笔记呢?市面上已经有很多笔记管理软件了,像 EverNote、有道等。不过作为程序员,我们手边的开发工具就能做笔记管理。这里我推荐用 Visual Studio Code。它是一款非常轻量的 IDE 工具,有强大的插件体系。它不光可以用来写代码,还可以用来写文档,尤其是 Markdown 文档。自带 inline 样式渲染,支持格式校验、自动排版(尤其是 table)、PDF 导出等各种功能,还有很多插件可供你选择。
Markdown,我想每个程序员都应该熟悉它的语法。其实核心的、常用的几个语法很简单,包括多级标题、多级列表、Code 等。像我写这一篇文章,用到的也就无非这些语法点,额外多了图片的插入等。根本不需要花多少时间。但是掌握它,不光有助于我们写文章,包括开发中写文档,都是非常有用的。像我们常用的 Github、Gitlab 里,都可以直接渲染 Markdown 文件,Issue 中也能支持 Markdown 语法。学会一招,吃遍天下。很有必要。
也许有的同学会有疑问,那岂不笔记都是本地存储了?这个问题很好。我们还需要一些工具,Git + Gitlab。将整个笔记目录加入 Git 版本控制,这样我们所有的笔记历史都能保存起来。然后,我们可以在 Gitlab.com 的个人账号上创建一个私有项目,同步我们的本地笔记到远端。这样,我们在公司使用公司的电脑,可以顺利地同步;手机端也可以使用浏览器访问 Gitlab 网址在线打开我们的项目,查看笔记。有了 Git 支持,即便多端修改产生冲突,也能很好地去解决。
扩展
用 VSCode + Gitlab 来管理我们的笔记,还有一个好处就是,这些笔记就是我们看得到的文件。那这里我们可以引申一下。把我们的笔记管理作为个人知识仓库,它里面还能包含各种可以执行的脚本(如 Bash、Python)。这些脚本是我们自己编写的、用来方便我们工作的。比如说我就写了很多类似 Git 周报、Gitlab CI 自动化等这样的脚本。它们不光能在我家里的电脑上执行,还能同步到我公司的电脑上,照样执行。而且执行的方式不会有什么变化,不需要额外下载、保存、授权等各项工作,这些都在同步过程中解决了。十分方便。
当然,以上方式也有一些弊端,比如图片不好处理,无法直接粘贴到文章里(也许有这样的 VSCode 插件呢?)。不过至少我个人用起来,还是很舒服的。也希望这些内容,能为大家产生一些”接触“点。