四年前在知乎提过一个问题,「什么是真正的编程能力」,当时这个问题获得了许多业内前辈的热诚回答。时过境迁,前段时间和朋友谈起最初使用知乎的经历,这才又想起当年年少无知提的这个问题,多年以后去一一回顾当时大家的回答,对每句话都有了更为深刻的理解和感触。

如果我在今天去回答四年前自己提出的问题,我会如回答里的诸多其他工程师一样,将编程能力定义为「解决问题的能力」。在不同职业阶段对这话的理解可能会大有不同。在四年前,我会认为这句话的意思是「通过熟练且优异的编程技巧进行解决问题的能力」,着重点依旧在编程本身。但如今我却「背叛」了编程,或者说我所认为的编程能力不应当局限于「狭义的编程」本身。

如果我们抛开这些年上层编程技术日新月异的发展,从编程的本质来看,编程的实质无非是用一套形式化语言去定义问题和描述解决问题的步骤。一个文学作家亦可以用自然语言实现他自己的编程工作,只不过最终的编译器和运行环境是人类的大脑 —— 过去几千年的数学家就是如此工作,并在自然语言基础上发明了更清晰严格的数学形式语言。计算机编程较之人脑的优越性在于更为可靠和高效的运行环境,使得数学得以脱离人类大脑的局限,完成更为复杂的工作。

然而现实生活远比数学家想象的世界要复杂的多,现实问题在被形式化成为计算机语言前,往往要先经过人类使用自然语言进行反复沟通和辩论的过程,最终才会达成一致并被批准以落实成计算机语言。甚至于事实上相当一部分工作在自然语言阶段就足以被妥善解决,完全没有使用计算机的必要。许多人最初认为的编程能力,仅限于最后一步把自然语言的需求翻译成计算机语言而已,但事实上,一个只了解计算机语言编程的人或许是个不错的 Coder,但很难被称之为是一个合格的工程师,也不可能开发出伟大的 Software。

如果一个工程师在编程活动中被一个他所不熟悉的语言所编写的软件所阻挡,最工程师的方法自然是学会这门语言然后解决这个软件的问题。以此类推当一个工程师在现实生活中被一群完全与他处于不同话语体系和思维体系的人所阻挡,最工程师的方法同样是学会他们的语言,使用他们的方式去描述问题、解决问题。

语言亦或思想都是编程的工具,而编程又是为解决问题而创造的工具。我们经常看到一些多年某门计算机语言的从业者对于计算机的认知被牢牢锁死在这门语言框定的世界里,与之相似的是有更大一部分人对于世界的认知被锁死在计算机语言所框定的世界里。这既是从业者的悲哀也是计算机科学的悲哀。

以上所述,如果要我将「解决问题的能力」展开成一个更为清晰的定义,我会认为,真正的编程能力是能够在这个复杂的世界里,针对不同语言体系的人理解并使用不同的描述形式,编写出一个用以清晰界定问题并描述出解决方法的「程序」的能力。

希望再过四年我再来回顾这个问题时,能够有更为别致的感受。