(题图来自我那备受折磨的键盘)
无论是对于成人,还是对于孩子,大家都在说,应该培养和训练“编程思维”。那么,到底什么才是“编程思维”呢?这个问题我思考过很久。若从大约1995年我写下第一行“10 PRINT 1+2”代码算起,至今我的码龄也快三十了,那我就倚老卖老,来谈谈这个其实总也不太谈得清的话题。
1
首先,说起编程,大家脑子里浮现的,很可能就是满屏幕的令人眼花缭乱的字母数字。这种几近故弄玄虚的天书,让程序员显得十分神秘,木讷的他们,似乎代言着另外一个世界。
是的,关于“编程思维”,最直接的理解,就是与计算机对话的能力。如果各种计算机语言不是用键盘敲出,而是由口中喊出,那程序员就很像掌控魔法的巫师,咒语喃喃念动,便让数字世界的机器臣服,甘受驱使。
若是夺去这种神秘感,那“编程思维”似乎就成了某种简单的翻译技能,把人类现实世界的语言,翻译成机器能够听懂的指令来,仅此而已。
2
另一种理解,也是被广为传颂的,“编程思维”似乎隐含着表示某种逻辑思维能力。但到底是啥逻辑,似乎也说不清。像是某种理科生特有的标签,你一眼就会知道是它,但又总描绘不出来,活脱脱像是吃了文科没学好的哑巴亏。
只不过,懂得机器运作的原理,知道某几种甚至几十种计算机语言的语法,这就算是“很有逻辑”了吗?好像这也算不上什么特征,并不能将编程与其他理工学科或技能相区分呢。而且,听闻“回家路上买三斤苹果,如果有西瓜,则买一个”后,只买了一个苹果回家的脑回路,算不算得上好逻辑呢?
3
或许,从码农的视角来体会和思考,会得到更接近真相的理解吧。
我最早学习编程时的实践,是在一台没有存储功能的学习机上进行的。每次我都得花上两三个小时,把书上的几十行代码,用两个食指,生疏地在键盘上敲打出来,然后运行,看到屏幕上精灵移动时,就会短暂忘记,很快断电后,下次又要一切重来的痛苦。
敲代码是非常费劲的,即使是在我掌握了娴熟的指法后,也依然如此。随着我写的程序变得复杂,逐步开始有子程序、类、模板等概念。我开始悟出一个道理:各种引入的语法,其目的都是在试图减少代码的重复。代码总会滋生bug,重复的代码会滋生成群的bug,导致经常忘记同步修复所有重复之处,让bug分身总是春风吹又生。
能够用最少、最简洁、且无重复的代码,来实现某个功能,听起来,这样的挑战,似乎就是“编程思维”所追求的重要内容。像是一种头脑体操,让思维变得更加灵活,延缓痴呆。
4
其实,关于“编程思维”,应该还有个重要的理解角度。
试想下程序是运行在某个无人值守的飞船上,而飞船正航行在茫茫太空中,即使程序开发者想要干预,也是心有余却不可及。于是,我们需要在飞船起飞前,预见到各种不同的情况,并相应设置程序代码,以便在这些情况发生时,进行恰当的响应和处置。
所以,这是一种对未来场景的预见能力。在大脑中提前抽象出应对规则,并条理化出来。像是终于构建了满满一沙盘的密密麻麻的多米诺骨牌的世界,只等待那一根手指的一推……很酷,也很爽,是吧?