谈 Go 的使用感受

假设让你在三种不同的条件下完成一副画,要求笔尖接触纸面到离开纸面即算一笔,三种条件分别是:只能落笔 1、100、10000 次。你觉得对于画家来讲,哪一种方式更困难?

显然,在只能落笔一次的情况下你需要高超的技巧才能一笔画完,而多次落笔会让你驾驭地轻松一点,更多的落笔机会就允许你从容地完成画作。

画是一种空间和色彩交织的复杂整体,其创作过程就是表现这个复杂整体的过程,当你用线性的笔法来创作这个浑然的整体时,难度就凸显出来了,即便天才画家也未必能玩转这种技巧,但当你手中可用的线条足够多时,你就可以轻易地组合成复杂的整体了,不单单是画的创作,在文章以及小说的创作上也类似。

叶圣陶先生在他的文章创作文集中对写作有过如下一段高屋建瓴的论述:“我们还期望能够组成调顺的‘语句’,调顺的‘篇章’。怎样叫作调顺呢?内面的意思情感是浑凝的,有如球,在同一瞬间可以感知整个的含蕴;而语言文字是连续的,有如线,须一贯而下,方能表达全体的内容。作文同说话一样,是将线表球的工夫,能够经营到通体妥帖,让别人看了便感知我们内面的意思情感,这就叫作调顺。”

因此,才有人说:“写作,是一场孤独的旅程。

叶圣陶先生将写作喻为“线表球”的功夫,这是很高明的见识,第一流的见解。我们再来看编程本身,就是将你一团浑凝的、整体的思绪,用指令的方式一丝一缕叙述出来,你要小心地安排事件的进展,巧妙地处理那些同时发生的事情,这跟写作的思路是暗合的,所以我常说:“每个人都能识文断字,但文学家总是凤毛麟角,编程就像作文,计算机语言的语法不难掌握,但天才的程序员却不可多得。” 道理其实一样,难点在于如何用有限的线条去勾勒复杂的整体。

我们这里不谈艺术不谈性能,仅仅从创作者与写作者的心智负担轻重角度讨论。对于写作,你当然无法同时去写几件事情,我在读金庸先生的作品时曾留意过他的叙事手法:剧情先是沿着主线流淌,因为某些事件的发生,几个人物分离,主线会择其中一人继续流淌,在未来的某个时间点会再次汇集,此时金庸先生会采用中断的方式,倒回去叙述另一人物的剧情,一直到交叉点为止。当然有些作者会采用多线叙事法,几处剧情同时进行,读者要在这几处剧情中几进几出,最后在某处汇集,但在作者的角度就是类似于一个单核 CPU 进行并发。

显然金庸老爷子的写作方式难度更高,更考验情节的安排与事件的把握,换句话说,小说是一个浑圆的整体,金庸先生将其用一条行进的流来表现复杂的整体;而多线叙事法则相对简单些,只要分开叙事,在关键点集中叙事即可。所以我们不难推想一下,把这种叙事推向极端:支线之间没有重合!作者只要分别写几则叙事短篇即告完成,当然这种书是没有意义的,我们只是来说明这种方式是用多个行进的流来表现复杂的整体,谁都不会否认一笔写完一个字和一镜到底的艺术难度!不过如果人的大脑可以并行工作,我想肯定多线叙事的小说会更受欢迎,只要作者调整一下文字结构,使这些线只在剧情汇集点交叉,不要为了照顾串行的大脑而做形式上的交叉。

现实世界是时间和空间的复杂结合,而最初的计算机程序是单进程,只能线性地表达复杂事物,也就是你要在单个进程流里做所有的事,这种一镜到底的功夫是需要一些艺术规划的;而多进程和多线程让这种表达轻松了许多,你可以几十镜、几百镜一起运用,通过剪辑来表现那个浑凝的整体,但是对于普通人来讲依然困难,因为管理进线程有一套复杂的接口,关键是你要有所节制,要小心地控制进线程的数量,不能屁大点事都要弄个线程去做,你仍然需要在几条或者几十条,几百条线程流中为它找一个位置,因为房子不够多,该挤的还是要挤挤。

Go 语言的协程极大地拓展了这个上限,使得表达复杂事物变得简单了。大部分的场景你都可以给每一个小事安排一个房子,你不用再为了给它寻找位置而煞费苦心,你可以用大量的线条去勾勒一个复杂的整体,该添一笔的地方千万不要吝啬。毫无疑问,这降低了你的创作难度,你可以肆无忌惮地去表达你心中那个浑凝的整体,用一种近似浑凝的方式!