Read-a-Book-In-a-Serioius-Way

一本书读过之后, 当再次拿起来的时候, 仿佛读新书一样; 读了, 看了, "劳民伤财"投入大量时间与精力, 但是记不住怎么办? 本文试图解决这个问题, 以SICP的第四章(Metalinguistic Abstraction)为例

论述分为六个部分:

  1. 启动-绘制大纲, 拿着地图阅读;
  2. 过程控制, 利用org-clock以及标签, 在控制过程的同时, 为后续的复盘预备第一手的线索;
  3. 阅读管理, 正文阅读阐述如何应用标签提高阅读效率, 并为后续查询参阅提供好用的数据结构;
  4. 案例与习题, 讨论怎样索引和处理书中的案例与习题;
  5. Org的撒手锏;
  6. 收尾, 总结探讨提高技术水平的同时, 稳扎稳打从每次阅读中提升英语能力.

附录: 参看书目

启动-绘制大纲

关于大纲目录的重要性, 引用王垠在"如何成为一个天才"中的一段话:

如果你看过John Nash 的传记《A-Beautiful-Mind》,就会发现他与其他人的不同.Nash看书只看封面和开头,把这书要讲的问题了解清楚之后,就自己动手解决. 最后,他完全依靠自己的“头脑暴力”创造出整本书的内容.

天才的能力或许难以企及, 天才的方法却可学可至. 一本书拿过来, 先看封面和目录, 纸笔绘制出来; 目录便是大纲结构, 投入10~30分钟的时间在大纲结构上, "头脑风暴"如果你在写这本书, 将会如何展开, 根据你的经验与想象, "编造"出来大致脉络, "编造", 无拘无束的"编造". 益处有四:

  1. 梳理和回顾你的经验和知识结构;
  2. 编造的过程会滋生阅读的欲望, 因为某些部分造不出来;
  3. 当拿着"我"的思想与"作者"的思想对照之时, 阅读的过程已变为求证的过程;
  4. 两个思想互相碰撞, 有共鸣有拍案, 不仅会事半功倍的提高阅读效率; 还能更深入的掌握书中的精妙之处.

退一步, 如果一点想法都没有, 半句话也编不出来, 那最好将背诵下来, 待到"厕上枕上马上", 从脑子里拿出来慢慢反刍咀嚼, 驱动潜意识这种神奇的力量开始工作.

纸笔绘制的方法有助于记忆, 而且可以放在手边作为地图参阅.

用emacs-org参阅大纲结构:

方法一: C-n S(shift)-tab

控制目录显示的深度,比如C-2 S-tab显示到2级目录,

./images/启动-显示到二级目录.png 方法的优点是可以自定义控制目录显示的深度

方法二:

p直接应用S-tab或者C-u Tab轮巡 ,-> OVERVIEW -> CONTENTS -> SHOW ALL –. '————————————–' 重复操作一次则显示在不同的结构

方法三:

TOC结构, 安装doom-emacs后, 在任意位置, 应用:toc:便能自动生成目录

./images/启动-toc-2.png

方法四

推荐的方案,纸笔绘制, 放在手边参阅.

./images/sicp-04.metalinguistic.jpeg

过程控制

Clock-in and Clock-out

当前章节下调用 M-x org-clock-in,

  • 一方面可以计时,
  • 再者则随时提醒当前所处的位置和任务, 及时跳转到其他的buffer中, 也会看到, 比如从4.4.1 Deductive Information Retrieval中激发了clock-in, 则即使在这篇文章的编辑页面, 依然能看到当下的任务, 随时提醒你回去执行.
./images/过程-clock-in.png
  • clock-in置顶当前任务, 为后文"阅读管理"添加标签提供便利.

随手建立todo任务

比如阅读过程中,发现svg的图片格式在black模式下, 认读需要眼睛对到屏幕上仔细得瞧个清楚, 因此设置任务将inline的图片逐步去掉, 修改成文本格式.

./images/过程-设置todo.png 任务完成后变更todo为done

提出问题?

过程控制中最重要的一点, 初次阅读的时候, 有困惑的地方, 不理解的地方, 尤其是与你在第一步"编造"和"想象"的内容不一致的地方, 标注成"问题?", 因为是自己的笔记, 只要稍微有一丝疑问, 马上标出来, 我觉着这是宝贵的财富. 一方面, 如果不标注, 过5分钟, 会忘记刚才在想什么 另一方面, 当一年后在读这本书的时候, 可以了解当时的水平, 当时的思考脉络. 问题统一设置成 问题? 的格式, 如此, 不仅是在正文的行首, 或者和在代码的内部, 都能方便查到; 又不会多余查到正常使用的"问题"这个词汇.

./images/过程-问题.png 问题解决后, 在后面标注v,v当做是对号. ./images/过程-问题v.png 如图, 刚才的12个问题解决了7个, 剩下的可能需要发到stackoverflow上.

小结:

过程控制使用了todo, 问题标签. 后文的"阅读管理"中探讨, 使用filter知识点的标签 #得到-概念 #得到-语法 #得到-行文(学习到了文章的结构) #得到-关联(关联到过往的经验) #得到-应用(对后续对概念对知识点应用的思); #短评(没有想好归类的,使用短评) #洞见 #洞见-关联 #洞见-应用 #拍案 #词汇 #总结 等等, 使用"问题?"等标签的优点: 一是: 为后续查询提供结构化的关键词 二是: 可扩展性, 一本书, 二读, 三读, 四读, 可以在既有的标签规则下, 添加新的想法.

阅读管理

金圣叹点评"水浒传", 也是为他深入理解文章, 阅读过程中, 给评注设置标签有三个作用:

  1. 分类记录, 不然写得评注很多, 复盘回顾则眉毛胡子一把抓
  2. 从自己的角度, 将文章重新格式化, 正文的目录是作者的结构, 标签可以按照自己的想法构建.
  3. 为二读, 三读提供结构化的线索.

短评

短评是不分类的标签, 可以意识流, 读到哪里, 有想法立刻写下来. 无拘无束, 不给大脑是否要分类, 分类到哪里的负担. 待到二读, 三读的时候再适当"短评"的内容归类, "短评"为后面的动作提供原材料.

./images/阅读-短评.png

洞见

读着读着, 对作者的阐述生发共鸣, 或者比"绘制大纲"阶段中"编造"的内容阐述的精彩, 又或者在胸中困顿许久没想明白的点, 在此处豁然开朗.

./images/阅读-洞见.png 举例比如 assignment and definition这一段, 从evaluator的角度, 赋值(assignment)与定义(definition)的本质是一样的, 都是set!, 这也完全符合直觉. 此处标注为洞见, 是因为刚从python入门编程的时候, 学习赋值与函数定义.

1
2
a = 9
def foo(x): return x * x

很容易直觉到或者看到这里的"def"与"="是一样的, 都是给一个变量赋值. 刚学python的时候, 将这个想法分享到微信群组, 招惹来汹涌的嘲笑, 各种跳大神纷纷登场. 上面的这一段, 也写进去, 标签是 #洞见-关联 关联到既往的经验中. 与 洞见-关联 标签相对应的是 洞见-应用, 既然有了这个洞见, 日后怎样应用?

拍案

"拍案"是"洞见"的升级, 给感情发挥的空间, 没有规则, 就是突然醍醐灌顶,拍案叫绝.

./images/阅读-洞见.png

比如这一章的开头, 作者引述的一段话

… It's in words that the magic is—Abracadabra, Open Sesame, and the rest—but the magic words in one story aren't magical in the next. The real magic is to understand which words work, and when, and for what; the trick is to learn the trick.

起讲"metalinguistic"之前, 作者引述这样浅显直白又颇具启发的用例. 当然与"洞见"一样, 后面在阅读的时候也加上"拍案-关联", "拍案-应用"标签,

小结: 从短评, 洞见, 到拍案, 都是自己的思路, 后面的"得到"标签标注知识点.

得到

采用"得到"标签, 是因为比"知识点"少一个字.

得到-概念:

标注文中新阐述的概念.

./images/阅读-得到-概念.png

比如文中的一个角度对CS的定义

Seen from this perspective, the technology for coping with large-scale computer systems merges with the technology for building new computer languages, and computer science itself becomes no more (and no less) than the discipline of constructing appropriate descriptive languages.

得到-语法:

标注语言的语法

./images/阅读-得到-语法.png 上图标注if-predicate, 是因为我的潜意识里, if总是两个predicates.

得到-八股

从文章中学习到的行文技巧, 起承转合, 类比比喻等等. 而八股文有着严谨的起承转合的结构.

./images/阅读-得到-八股.png

再看第三章的第一段,承接前两章然后引出下文.

./images/阅读-得到-八股2.png

得到:

新的知识点, 没想好归类, 直接用得到. 以上, 搜"# 得到"的时候, 可以

总结标签:

此处略过, 最好每一节都有一个总结.

词汇:

此处承接"尾声"部分, 积累词汇与表达, "积土成山, 风雨兴焉" 利用org的规则, 词汇标注有两种方式. 其一:

./images/阅读-词汇.png 比如本章节中的两个单词, evaluate与apply. eval便是输入expression, 输出value; 拆解evaluate这个单词, evaluate = ex(out) + value 将value拿出来就是evaluate, 与eval的过程百分百匹配; 直觉可以从这样的"跬步"中慢慢建立起来. apply就献丑了. 其二: 应用 vacabulary 标注单词

./images/阅读-词汇2.png 标注了14个词汇.

阅读管理小结:

  1. 短评, 基础的原材料标签, 有启发有想法随时记下来, 作为后续分类的基础;
  2. 洞见, 有共鸣, 有豁然开朗的地方
  3. 拍案, 醍醐灌顶, 就像高呼几声的地方
  4. 得到, 知识点, 将得到重新修改为知识点 #2021-02-24 Wednesday
  5. 总结
  6. 词汇,
  7. 关联与应用放到相应的标签后面.

案例与习题

SICP习题过多, 目前的处理方法是建索引, 梳理思路. org可以给代码块,图片等命名,格式为=#+name=

例如书中的案例:

1
2
3
4
    (define (self-evaluating? exp)
      (cond ((number? exp) true)
            ((string? exp) true)
            (else false)))

"#+name:" + "case-" + 小节序号"4.1.1" + "函数名"

书中的案例分散在各处, 刚上手开读, 不太可能过目不忘, 而读下文回想上文,巨耗脑力; 如果持续使用C-s随机跳转, 思路会搅得杂乱无章;

解决的方法是命名代码块, 自定义索引.

梳理思路

建立索引后, 可以从mini-buffer中查看局部的框架

./images/案例-swiper.png

也可以调用grep查看, 尤其是复盘的时候, 可以只看着grep的清单, 尝试重新构建出来.

./images/案例-grep.png

跳转查询

比如当读到`define analyze`的时候突然忘记了`self-evaluating`的定义

1
2
3
4
5
6
7
8
9
(define (analyze exp)
  (cond ((self-evaluating? exp)
         (analyze-self-evaluating exp))
        ((quoted? exp)
         (analyze-quoted exp))
        ((variable? exp)
         (analyze-variable exp))
        ((assignment? exp)
...

./images/案例-跳转查询.png 从结构中能清楚地看到"目标位置"是在大纲目录下的4.1.2中, 如果直接搜索"define (self-eval", 则第一眼看不到大纲. mini-buffer内的中操作:C-n C-p 如果点击去查看细节, 结束之后按键 C-u C-@ 会重新回到 (define (analyz) 这个初始位置.

习题

如果直接查看"Exercise"

./images/案例-习题概览.png 了解到大概有80个习题和粗略的进度. 但也仅此而已, 看不到一道习题隶属哪个章节, 没有整合进大纲结构中.

可以给习题解答的代码设置name, 比如

1
2
3
4
5
6
7
(define (eval-or exps env)
    (cond ((null? exps)
            #f)
          ((true? (eval (first-exp exps) env))
            (eval-or (rest-exp exps) env))
          (else
            #f)

此时在查看"case-4.1.2"的时候, 习题与案例连成一体, 都在"4.1.2 Representing Expressions"之下.

./images/案例-习题命名.png

Clock-in

案例与习题命名的格式是"case-4.1.2", 在阅读过程中, 挪用脑力记忆住"4.1.2"这个点位, 或者上下移动光标查看, 不太可取. 在过程控制中, 首要先打开Clock-in,此时可以派上用场. 脑力过于发达可以在大的节点上clock-in比如"4.1", 我是在颗粒度更高的小节点"4.1.2"上clock-in, clock-out.

案例与习题小结

案例与习题是洒落一地的珠子, 初次阅读在代码之间来回跳转参阅, 劳神费力, 建立索引是将珠子串起来, 梳理思路和参阅. 比如本章中的两个基础定义 eval and apply 分别建立索引"#+name: case-4.1.1-apply-core"和"#+name: case-4.1.1-eval-core", 可以通缩C-s "case eval core"准确的一步定位. 如果用查询"define (eval)", 则需要消耗点脑力, 组合regex规则过滤掉其他备选项, 而此时大脑正在全神贯注处理当下问题, 最好不要被分神打扰.

Org的撒手锏

  1. ros即时插入图片

观察SICP视频的同时, 可以即时截屏插入到笔记中. 安装ros插件

./images/撒手锏01.png

如图所示, M-x调用ros之后, 从左边截屏, 图片将会直接插入到笔记中. 虽然简单, 但却极大地提高效率, 因此也放在撒手锏这里.

  1. 绘制思维导图

在"01.启动-绘制大纲"的方法三中, 介绍过使用自动建立Table of Content的方法

images/01.draw-toc.png

Org的撒手锏之二可以将其转成思维导图

images/撒手锏-思维导图.png

需要做一点作业就是将上图的table of content用regex简单成以下格式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@startmindmap
- 4.Metalinguistic Abstraction
-- 4.1 The Metacircular Evaluator
--- 4.1.1 The Core of the Evaluator
---- Eval
---- Apply
---- 1.Procedure arguments
---- 2.Conditionals
---- 3.Sequences
---- 4.Assignments and definitions
---- Derived expressions
--- 4.1.2 Representing Expressions
---- pre
---- Derived expressions
--- 4.1.3 Evaluator Data Structures
---- Testing of predicates
---- Representing procedures
---- Operations on Environments
--- 4.1.4 Rnning the Evaluator as a Program
--- 4.1.5 Data As Programs
--- 4.1.6 Internal Definitions
--- 4.1.7 Separating Syntactic Analysis from Execution
-- 4.2 Variations on a Scheme --- Lazy Evaluation
--- 4.2.1 Normal Order and Applicative Order
--- 4.2.2 An Interpreter with Lazy Evaluation
---- Modifying the evaluator
---- Representing thunks
--- 4.2.3 Streams as Lazy Lists
++ 4.3 Variations on a Scheme +++ Nondeterministic Computing
+++ 4.3.1 Amb and Search
++++ Driver loop
+++ 4.3.2 Examples of Nondeterministic Programs
++++ Logic Puzzles
++++ Parsing natural language
+++ 4.3.3 Implementing the =Amb= Evaluator
++++ Execution procedures and continuations
++++ Structure of the evaluator
++++ Simple expressions
++++ Conditionals and sequences
++++ Definitions and assignments
++++ Procedure applications
++++ Evaluating =amb= expressions
++++ Driver loop
++++ Footnotes
++ 4.4 Logic Programming
+++ 4.4.1 Deductive Information Retrieval
++++ A sample data base
++++ Simple queries
++++ Compound queries
++++ Rules
++++ Logic as programs
+++ 4.4.2 How the Query System Works
++++ Pattern matching
++++ Streams of frames
++++ Compound queries
++++ Unification
++++ Applying rules
++++ Simple queries
++++ The query evaluator and the driver loop
+++ 4.4.3 Is Logic Programming Mathematical Logic?
++++ Infinite loops
++++ Problems with =not=
++++ 4.4.4 Implementing the Query System
++++ 4.4.4.1 The Driver Loop and Instantiation
++++ 4.4.4.2 The Evaluator
++++ 4.4.4.3 Finding Assertions by Pattern Matching
++++ 4.4.4.4 Rules and Unification
++++ 4.4.4.5 Maintaining the Data Base
++++ 4.4.4.6 Stream Operations
++++ 4.4.4.7 Query Syntax Procedures
++++ 4.4.4.8 Frames and Bindings
@endmindmap
./images/metalinguistic.png

此时调用C-c C-c将会自动生成上述的思维导图

Emacs as a Notebook by Org

Document Structure

  • Headlines A cleaner outline view
  • Visibility Cycling S-TAB org-global-cycle C-u C-u TAB (org-set-startup-visibility) C-u C-u C-u TAB (outline-show-all)

    C-c C-k (outline-show-branches)

 C-c C-x b (org-tree-to-indirect-buffer)

  • Initial visibility
    #+STARTUP: overview
    #+STARTUP: content
    #+STARTUP: showall
    #+STARTUP: showeverything
  • Motion (略)
  • Structure Editing M-LEFT org-do-promote M-RIGHT org-do-demote M-S-LEFT org-demote-subtree M-s-RIGHT org-promote-subtree
  • Sparse Tree C-c / r 查询使用swiper
  • Plain List kbd(M-RET) (org-insert-heading) kbd(M-S-RET) (org-insert-checkbox) C-c ^ 排序
  • Drawers a PROPERTIES drawer
  • Blocks: #+BEGIN#+END

Tables

  • Built-in Table Editor

    C-c |
    org-table-create-or-convert-from-region
  • Column Width and Alignment

    C-c C-c
    org-table-align
    M-LEFT and M-RIGHT
    org-table-move-column-right
    M-S-LEFT and M-S-RIGHT
    org-table-delete-column and org-table-insert-column
    M-UP and M-DOWN
    org-table-move-row-up and org-table-move-row-down
    S-UP and S-DOWN
    org-table-move-cell-up and org-table-move-cell-down
    M-S-UP
    org-table-kill-row
    M-S-DOWN
    org-table-insert-row
    C-c -
    org-table-insert-hline
    C-c RET
    org-table-hline-and-move
    C-c ^
    org-table-sort-lines
    C-c +
    org-table-sum
    S-RET
    org-table-copy-down √
    C-c TAB
    org-table-toggle-column-widt
    C-u C-c TAB
    org-table-shrink
    C-u C-u C-c TAB
    org-table-expand
  • Column Groups

    <>
    Column Groups
  • The Orgtbl Minor Mode

    M-x orgtbl-mode
  • The Spreadsheet 略
  • Org Plot 略

Hyperlinks

internal link
[[internal-link]]
?
file:projects.org::regex
?
gnus:group
?
shell:ls
?
elisp:(find_file "elisp.org")
?
elisp:org-agenda