从很小的时候,我就喜欢看书,记得当时看的最多的就是古龙的小说,三国演义,水浒传这些的武侠小说。那时候的梦想就是当一个作家,然后也写一点东西,不过发现多是矫揉造作,胡乱堆彻,文笔不通,于是就自认为根本不是这块料了,然后就彻底的放弃了当作家的念头。
不过想想,其实那时候,如果能早点知道一万小时理论,早点知道很多时候是自己输入太少,阅历不丰富,没法写出很多东西,早点了解很多读书的理论,how to write的理论,我觉得可能就不是今天这个样子了。
等上了大学,入读的是自动化专业,但幸运的是,我发现我自己最喜欢的是计算机,然后就义无反顾的决定走上了当程序员的道路。这个决定,到现在看起来,应该是一个非常明智的选择。如果从世俗的眼光看,我现在仍然没啥钱,没啥名气,算不上成功,但我自己知道,只要能按照自己选择的道路走下去,并且还能不断成长,这个就是成功的。
写了这么多年代码,有时候觉得,编码和写作这件事情,其实很类似。现在想想,小时候我自己在没有电脑的情况下面,还买了几本basic的书来看,没准从那时候起,我的梦想就是当一个程序员了,不过如果能当一个会写作的程序员没准更好 :-)
为什么我会觉得编码和写作类似?我觉得主要有几点:
输入输出
要想写好代码,或者文章,都需要大量的输入以及输出。我曾今以为,那些有名的作家,都是突然有一天灵感一来,然后奋笔疾书,于是就有了让人传颂的作品。不过后来了解的多了,也知道,作家也是人,也有写不出东西来的时候。
我从小语文就不好,可能是因为小时候的遭遇,觉得自己不是这块料,不过在高二的时候,我的语文成绩是非常好的,那时候多亏有一个特级语文老师教我。而且他真的不是教我怎么学语文,就是让我不停的读书,不停的写作。不过好景不长,高三那年,他因为个人发展从我们那个穷山区跑到了武汉,我一下子觉得没了希望,然后语文成绩就立刻下降了。想想,如果当时能够继续按照他的方法学习语文,没准我真能写好东西,至少我的高考语文成绩也不会就是那可怜的90分了。
所以从我可怜的经历可以看出,即使短时间的大量输入输出,对写作的提高也是很有帮助的,只是随着年龄的增长,我们越来越没了这份耐心以及坚持。
虽然写作上面没坚持下来,但我还是保留了喜欢读书的习惯,到现在也不停的在买书,读书,虽然输出没了,但输入没落下,至少以后给孩子教知识是没啥问题的。
编码也是类似,虽然我已经过了30,但我仍然在不停的编码,写了这么多年的代码,除非遇到节假日或者很多特殊情况,我都保证了每天写代码的习惯。甚至在除夕夜都在写代码。也因为这样的坚持,我的代码产出很高,对代码质量很有自信。同时开源维护了很多组件,还能保证公司的项目不被落下,顺带还能在一些技术会议上面去吹吹水 :-)
同时,要不断的学习业界的先进理念和知识,就跟写作需要不断的读书一样。计算机这个行业非常好的就是,能永远让自己不过时,永远让自己的脑袋处于世界最前沿。很多几年前火爆的技术,没准过不了多久,就会被另一种更先进的所取代。所以我们得不断的学习,不然就会被这个行业所淘汰。但是也别短视到现在热门什么就学什么,什么赚钱就学什么,一味的追求这些,反而会让自己在这个行业里面极度的不快乐。
风格框架
要想写好代码,首先得学习不同语言的编码规范,没这套规范,写出来的东西让其他人阅读起来就比较困惑。譬如google就专门出了c++的code style,然后go则是更进一步,直接提供了一个format工具,弄得大家的代码看起来一个样子。rust更直接,编译的时候直接告诉你,你的代码要怎么改,如果用上clippy,你会发现,你这么写,就一直给你报警告,弄得强迫症患者必须得改掉。
当然,如果所有作者都是一个风格,那这个世界也就太恐怖了。但不同的作者其实也有自己的写作风格的,譬如看古龙的小说和看金庸的小说感觉是完全不一样的。不过到现在为止,我是完全没有自己的写作style的,顶多就是记记流水账了。
很多作者能在不同的风格上面游刃有余的切换,这方面我是佩服的,不过后来想想,写代码也不是一样,我们照样可以在不同语言里面随意切换。不过切换有时候是很痛苦的,譬如写rust写多了,一下子换到go,很容易就每行加了分号,然后从go切换到c++,又忘记了分号。
上面说的其实还是语言规则上面的切换,真正困难的是如何做到思想上面的切换。譬如一个写小说的作家突然去写杂文,就不能按照以前小说的套路去写了,这种转换有时候很痛苦,但适应了没准就是另一个世界了。
程序员也一样,在我最开始写rust程序的时候,很容易就使用go的思路去写,但过了阵痛期之后,就发现rust其实也蛮不错的。这个在使用clojure的时候也是一样的,以前只接触过面向过程和面向对象,突然来一个函数式编程,一下子就不知道如何写代码了。但习惯之后,就发现完全是不同的思考方式了,以前实现一个功能,想的是我需要提供哪些函数,相关的class是啥,但用了clojure,想的是我这块数据流,如何做map,filter等。
结构骨架
在《如何阅读一本书》里面,作者提到了检视阅读,首先就是快速看书名,目录,索引等信息,提取出这本书大概的轮廓样子,为后续的分析阅读和主题阅读做好准备。按照我的理解,如果一个作家,不能很好的组织它作品的目录结构,是没法让读者很好的获取相关的知识的(当然,这里多数是技术知识类书籍,小说诗歌这些的不在此列了)。
话说,如果按照上面这个标准,我的文章几乎全部不合格了,因为太乱了。:-)
写代码也是一样,要完成一个功能点,首先要设想整体架构是怎样的,然后每个组件需要完全哪些功能,各个组件是如何交互的。这些没想好,就贸然动笔,就很有可能导致后续整个设计混乱。
当然,我们不是预言师,不可能预估对所有的情况,也不能过度设计,就譬如作家不可能一下子就完全想好如何写作一样(通常想一次就写好的,恰恰是最不会写出来的),后续还会根据实际的情况不断地调整改善。甚至极端情况下面,可能还会将以前的设计全部推倒重来,不过这种情况,对于整个项目就是个悲剧了。
总结
扯了这么多,无非就是去北京出差的时候突然想到,编码和写作到底有啥关系,虽然自己喜欢写作,但有自知之明,知道自己的文笔有多菜,但作为一个喜欢码字的程序员,想想这个问题,想想之间的关联性还是比较有意思的。毕竟书读的多了,总还是想手痒痒写点东西的。