看小说与看代码的共通之处
看小说,是我从小的爱好,看代码写代码,是我谋生的技能。这是两件极不相干的事,但是最近忽然觉得,这两者却有相通之处。原来我一直是用看小说的方式来看代码。
我认为,一部好的小说,如果不是囫囵吞枣随意读完便罢的话,至少是要看三遍的。
第一遍,按顺序读完。
第二遍,以事件、时间为中心,再看一遍。
第三遍,以人物为中心,再看一遍。
其中,第二遍和第三遍的顺序可能会颠倒甚至交错进行,而且第二遍和第三遍本身各自又包含小范围内的反复阅读。这个过程虽然每个人各有各的习惯,但主要目的就是整理和归纳。
按顺序读完,这很好理解。科技类书籍可以跳读、挑读,但是读小说时将作品的内容顺序读完应该是最基本的。
以事件、时间为中心,是对应小说的灵魂,矛盾和冲突。只有以事件为中心,才能从全局的角度来掌握小说的内容,才能更好的欣赏其中的美。
例如,金庸的《天龙八部》中的著名事件,少室山大战,参与者有那几方?有几种矛盾在里面?这么多性格迥异、各自怀有不同目的的人,在这个事件中处的位置是什么?如果不能回答这几个问题,是很遗憾的事情,这样就无法欣赏金庸先生的笔力之深,格局之大。
以人物为中心,则是从细处着眼,分析某个具体人物在一系列事件中的心理和表现,理解其成长或者变化。小说毕竟是个纯人文的东西,在今天完全不读小说其实是完全没有任何害处的,喜欢读小说的人,很多是喜欢那种心理、精神上的沉浸感。从一个具体人物的视角观察书里的世界,我们能更好的理解这些人为什么会在某个时间点做那么一件事情。
例如,金庸的《神雕侠侣》,郭靖心怀天下的情怀怎么表达出来?通过杨过的眼睛来看。杨过意图刺杀郭靖前后的几章,从杨过的视角,一边是与自己有杀父之仇,一边是为国为民的侠之大者,郭靖心忧天下的形象就呼之欲出了。
再来说看代码。
看代码与看小说有个不同,一份代码第一遍很难从头到尾就读一遍,而且看代码的过程,比看小说更需要随时切换视角。所以,上面提到的看小说的“三遍”,对应了看代码的如下三个视角。(注:这里说的看代码的方法仅针对面向过程的项目,面向对象的大型项目我也没深入接触过,就不胡说了。)
第一,架构、框架的视角
以 Nginx 为例,我们要知道 Nginx 整个框架的基本原理,Nginx 框架与各模块是怎么串联起来的,各模块的各回调函数在框架中处于什么位置?
第二,关键流程的视角
以 Nginx-RTMP 为例,我们要知道一个直播过程有哪几方参与?一个流推上来会发生那些事情?一个播放器接进来又会发生哪些事情?音视频数据是怎么发送给播放器的?多进程之间又有哪些事情?断流会有哪些操作?
第三,数据的视角
还是以 Nginx-RTMP 为例,一个流在系统中的数据结构是什么?是怎么存储的?一个 tcp 连接又是对应什么数据结构,怎么存储的?各播放器怎么表示?它们是怎么组织起来的?pull、push 涉及到的远端连接,在系统中是怎么通过 relay 组织和实现的?
脑洞大开,胡扯一通。