编程就像学写作(1)

从字词开始

当你开始写一篇文章时,人们是假设你至少要掌握了一种可以书写的语言,比如说汉语。你的记忆里存储着一定数量的词汇:春天、阳光、和煦的、嫩绿、幼苗……等等。你还了解,在一定的组合规则下能生成这样一个句子:春天,阳光和煦,田地里冒出嫩绿的幼苗。

回到你能写出类似这句话的原点,或者说零点来看,这已经是一段复杂语句。几十年都在不断修订的教育大纲,依然是:小学一年级的时候,孩子们才开始学习书写,春天、阳光……这些独立的词汇,做一些最简单的组合练习,例如组词——春,可以组成下面的词汇:春天、春日、春光、春秋……。

如此详细地去剖析,学习词语的过程,你可能有点不耐烦了。这些回忆,是想呈现对比:学习某一种编程语言,也是这样的过程。编程语言有自己的词汇库,比如关键字、数据类型、操作符等等,这也意味着你少不了记忆的工作;编程语言遵循一定的规则(或者叫约定),比如python语言规定函数语句里必须有冒号:,如一句话结束你得点句号;代码块必须缩进四格,如当你开始新的一段时,有些写作规范要求你空行或者第一个字缩进两格。

复现与理解

而在你积累了不少词汇,还要过上几年,老师才开始教你枯燥的语法规则:名词、形容词、副词、主语、限定语,修饰词,后置定语……而实际上,在还不清楚这些规则的时候,你已经每天都在使用它们了。这也正是《笨办法学python》的办法:学编程,直接从敲代码开始,而不是先讲词汇与语法。

还记得你不曾写出一篇自己的文章时候,语文老师曾经留过的作业吗?背课文,抄写文章段落。我也还不清楚这种训练,到底基于何种科学原理。但是直到现在,主流教育也没有完全摒弃这种练习方式,至少说明了:它足够有效。

而你是成人,不需要、也没必要复制孩子的学习过程:把学会一门语言的时间拉至如此之长(我怀疑孩子的学习,也不需要拉这么长,只是规范化的社会教育如此设置,才能让孩子在学校里呆的时间足够长。在这点上,《黑客与画家》的作者保罗(Paul Graham)有类似的评论:表面上,学校的使命是教育儿童。事实上,学校的真正目的是把儿童都关在同一个地方,以便大人们白天腾出手来把事情做完。)。而且你有成人的优势,你更擅长从意义中学习。抄写代码是一种临摹,你可以在临摹的过程中,弄清楚词汇与规则。而《笨办法学python》就是如此巧妙地设计了全书的内容。

在学写作文的时候,记得语文老师曾说过:多多阅读课外书。你需要从足够多的范例中学习。学习编程语言,也同样如此,除了记忆词汇、规则,临摹练习,你还要多看,看别人写的代码,理解别人写的代码。是不是听着耳熟,无论是汉语还是英语学习的时候,你都没少过「阅读理解」的训练。幸运地是,对于信息社会来说,供阅读的代码资源,在网路上非常容易获得,这里首先推荐优秀程序员常去的地方:Github

学习编程还有个独特的好处,你可以随时在python环境下,复现别人的代码,得知结果。其他的学习,都没有这么方便快捷的反馈环境。

刻意练习

美国心理学家安德斯•艾利克森(Anders Ericsson)在著作《刻意练习》中曾提到富兰克林年轻时提高写作的方法:

  • 以最为相近的方式重写《观察家》杂志上文章的句子,将自己写的句子和原文对比,并修改升级:这个训练教会他「如何明确且中肯地表达观点」。
  • 实践上述之后,富兰克林发现自己的词汇量不丰富,从《观察家》杂志上找文章改写成诗句(写诗迫使他想出大量其他不同的词语),在诗句和措辞忘记得差不多的时候,再把诗句改写成散文:「这使他形成了一个习惯,就是要找到正确的词汇,并且增加对词汇数量的积累,以至于他可以迅速从记忆中调用这些词汇。」
  • 参考《观察家》的文章,写下句子的提示线索,打乱顺序,在忘记原文的措辞和顺序之后,按他理解的逻辑来复写文章,将自己复写文章的思路与原文对比:训练「文章的总体结构和逻辑」。

这样的策略同样可用于学习编程,设计专属自己的刻意练习,获得有效反馈。

比如,我在网路上看到这样一段代码(while循环):

count = 0
while count < 5:
   print count, "is less than 5"
   count +=1
else:
   print count, "is not less than 5"

当在python环境下复现这段代码时候,我意识到自己可以改写这段代码:

count = 0
while count < 5:
   print "%s is less than 5" % count
   count +=1
else:
   print "%s is not less than 5" % count

最终的输出结果都是:

0 is less than 5
1 is less than 5
2 is less than 5
3 is less than 5
4 is less than 5
5 is not less than 5

这种改写,可能会让熟练的程序员朋友们不屑一顾,然而对于一个新手来说,这却是一个还不错刻意练习:

  • 第一段代码中使用了print的语法规则: print用来将语句打印在屏幕上,它默认的打印之后是换行的,然而, 使用逗号,后不换行。这段代码的作者巧妙地综合这些规则,让最后的输出呈现为「X is less than 5」或者「X is not less than 5」。
  • 而我自己改写的代码,是从书(《从零开始学python》中练习获得的最熟悉的方式:用转义字符%d来输出数据到屏幕;加上曾经犯过这条语法规则的错误(漏输语句中间的%),我对这个语句印象深刻。
  • 这个练习甚至能提醒我想到,偶尔看到网络或者书名中透漏过的信息,代码有简洁与不简洁之分。这将会为后来的学习埋下思考的种子。

参考

changelog

  1. 20181102 14:00-15:10 初稿
  2. 20181102 15:35-16;39 补充例子、写匠检查陈词滥调
  3. 20181102 19:40-19:44 修改逻辑不清楚的表达
这是我的原创文章,如果觉得不错,打个赏呗~