我学习的习惯非常不好,常常会在学习一个知识的时候,偏离主航道,花费很多时间在偏路上。等蓦然回头时,才发现时间已经被“浪费”了很多。

比如,最近我正在研究 AI 里的大语言模型结合知识图谱的工作。本来,这已经需要我学习很多以前不懂的知识了。我还“乱上加乱”,因为我发现我需要记点笔记。然后,在记笔记的时候我觉得应该每学完一个知识就写一个读后感;接着,我发现读后感里要增加一个功能:每增加一个读后感,当然要自动计数,告诉自己,文档又多了一个哦。但是呢,这个自动计数肯定不能自己手动去数,必须让计算机自动完成,否则太愧对“程序员”的自我标榜了。

可是,对于一个普通的文档,比如 markdown 格式或者 org 格式,怎么能让程序自动运行呢?当然,这就引入了 Knuth 教授当年提出的“文学编程”概念,也就是,一边写文档,一边写程序,然后两者要无缝嵌入。在我的“读后感”org 文档里,自然是要用 Emacs Lisp 语言来自动实现我的要求的。问题在于,唔,Elisp 我不熟悉啊 🤣 也就是说,我自吹自擂用 Emacs 了很多年,竟然连 Elisp 编程都不会。怎么办呢?当然要先去学习 Elisp 编程啊。

于是,我的学习路径,就从最开始的 AI + LLM + Knowledge Graph ,变成了学习 Elisp 。嗯,分岔到天涯海角去了。中间的过程我就不描述了,看书、上网查资料、调试代码、AI 问讯…..。总之,经过了大约 8 个小时之后,这个问题被我解决了。代码很简单,只有短短的几行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
;; Counting sub-headings
(cl-defun my/count-org-headings (&optional (level 4))
  "计算当前headings下指定sub-headings的数目.
LEVEL 是一个数字,作为参数提供,默认指定第4级"
  (interactive "nLevel: ")
  (let ((count 0))
    (save-excursion
      (org-map-entries (lambda () (when (= (org-current-level) level)
           (setq count (+ count 1))))
       nil 'tree))

    (insert (number-to-string count))
    (message "Number of level %d subheadings: %d" level count)))

(add-hook 'org-mode-hook
          (lambda () (local-set-key (kbd "C-c C-h n")

啊,每当我在“读后感”文档里,轻轻地按下组合键: C-c C-h n 时,就会有一个数字跳出来,显示在当前行,告诉我已经写了几篇读后感了。当然,连同最新的这篇《Introduction to Emacs Lisp》,一并算在内了。

总有人问我,每天都在看书,到底看了些什么啊?我自己也经常稀里糊涂,我不喜欢喝酒、不喜欢应酬、不喜欢打游戏、不喜欢看肥皂剧……,可是我的时间去哪儿呢?就在这一次次的“分岔”学习中,我学了好多乱七八糟的知识。有些是我工作所需要的,大多数是没什么直接用处的。可是,我经常乐在其中。也许,这样的随心所欲学习,才是我真正喜欢的。没有功利,没有利害,只有自己的喜欢。

前两天一个朋友发来信息,说看到一句话: 所谓魅力,就是比当下的时代老派一点点 。朋友第一时间就想到了我,说完全是我的贴身写照嘛。我回答:那我魅力无穷,因为我不是老派一点点,我是老派好多代,我就是一个 old-fashion man,就连学习,大概都是工业时代前的,或许要追溯到苏格拉底时代: 我什么都不知道,但我什么都想知道,我就愿意去找寻原因,无论有没有用处