在学习编程语言的过程中学习编程
前言
一般情况下,对编程的学习始于对某一门具体编程语言的学习,却不会终于对某一门具体编程语言的掌握。
编程的学习是一项可以并有必要持续一生的智力活动。
也许不是每一个人都要学习如何编程,但每一个人都要学习说话和表达。一个人可以不会说话,但不能不会表达,否则就会被归到智力障碍人群当中。
说话和表达的学习并行于母语的学习,到三四岁之后,正常人会基本掌握母语,再经过小学的训练,还可以掌握书写。
当对母语的掌握覆盖了口头和书面之后,我们是否可以认为「说话和表达」已被完全掌握?
这当然是不可以的。
所以说,我们先是一边学习一门语言,一边借助这门语言学习如何表达,当语言基本被掌握之后,「如何表达」依然可以继续进行。
我们表达的是什么?可以是我们头脑中的任何东西,我们往往称之为「思想」。
如何表达某一个思想,这是我们不可能学到尽头的东西,因为思想无穷无尽,总会有新思想冒出来。
具体到编程这门表达艺术,其中的思想,也就是编程思想是人类全部思想的一个子集。所以,学习编程,从编程语言开始,最终会进入「编程思想」的学习。编程思想的核心特点是:可以完全映射到在硬件上运行的一系列庞杂但又明确且有序的数学计算之上。
如何学习编程语言?如何学习编程?
通过上面一堆论述,至少可以接受:编程语言的学习和编程的学习并不是同一件事情,它们是两件互有关联,但又各成主体的事情。
我们的真实目标是学习编程,具体到实际,就是学习如何表达编程思想,而编程思想最终会被映射为硬件上运行的一系列数学计算。所以,我们面临的现实问题是:我们并没有可能把整个过程全部学会。我们能做的是借助某一门现有的已经在计算机硬件上完全实现了的编程语言来学习并表达我们的编程思想。
所以,我们的编程学习是如何这个样子的:
- 初级目标:掌握一门编程语言。
- 中间目标:构思某种现行的编程思想并用编程语言表达出来。
- 终极目标:编程思想的设计及实现。
我现在的状态是,初级目标都还没有达成。事实上,初级目标也是一件不那么容易的事情。看上去很简单,类似母语的学习,花功夫掌握就好了。但据我的实际经验,编程语言的学习和自然语言尤其是母语的学习之间,有着本质差别。
造成差别的一大原因是:现有多种编程语言,它们有的更底层,有的更高层,但没有一门语言是完美的。不完美还在其次,最大的问题,没有一门语言可以承担起我们想干的事情的总和。
这反映出来的核心问题是:只学一门编程语言的话,自己的编程思想很可能会被大大局限,有很多编程思想对自己而言将会不可见。
具体到我自己身上,此点更为明显。因为我学习的主要是非常高层次的 Python。
我目前的应对策略是:
- 短期内,是有意识跳脱 Python 语言提供的编程框架,更深入学习和理解编程这件事
- 长期看,依然需要多学习几门语言,让几门语言在互补中能够比较好地涵盖大部分编程思想
总结
- 意识到编程语言和编程的学习之间,虽有联系,但也有根本区别。
- 具体学习过程中,有意识发掘和理解编程思想。
- 牢牢记住:编程思想的表达,严格依赖于硬件的执行,不能想当然。
- 补充一点:编程的世界里,局部性原理无处不在,任何一个抽象层次下都是如此,甚至现实世界里也是如此:二八原理,幂数定律,赢家通吃。
不知是该恭喜,还是该怎样,总之阅读到该文的,你是第 人。每一次刷新,都是不同的自己。