以前对于很多程序员,写出来的代码实际上原创的成分很少。遇到问题就上Stack Overflow、CSDN或者各种博客,然后照抄。稍微复杂一点的工程,就涉及到架构问题。这时候就从各种架构书里去找现成答案,然后套用在自己的项目里。境界再高一点,才可以稍微有一点自己的创造性思考和实现。诚实地说,这种程序员的核心能力,究竟有多少价值?能看懂语法、懂设计模式、懂算法、会运用现有的工具解决问题,这些能力在过去成了程序员的护身符。但是现在有了AI,程序员发现自己会做的AI也会做。于是很有挫败感,觉得AI抢了自己的饭碗。
现在回过头来审视,过去程序员们那些引以为傲的能力,真的有不可替代性吗?或者说不应该被替代吗?假设这些能力不能被替代,那么人类将始终处于一个停留在低层次劳动的阶段。
比如,过去老百姓不识字,于是知识阶层便使用文字作为权力垄断的工具。后来人人识字,有一些迂腐的知识分子觉得“斯文扫地”,自己风光不再。但是很显然,人人识字是一种历史的进步。而且权力的垄断依旧存在,这时的垄断者正是那些不依靠文字,而依靠更高层次治理能力的人,比如军事才能、政治才能等等。
类比到程序员身上,从计算机科学诞生以来直到今天,行业内的大佬很少有纯以代码输出能力作为自身核心能力的。很多是搞数学的,然后是搞算法的,还有设计架构的、搞底层的。有几个大佬是依靠组装轮子把自己立起来的呢?但是过去程序员用组装轮子把自己立起来,今天有了更厉害的组装轮子的工具(AI),却还觉得这是一种非常珍贵的能力,不应该被替代。组装轮子当然算一种能力,它可以创造产品、换取报酬、养家糊口。但是假设不允许这种进步发生,人类又怎么能够迈向更高的一个层次呢?哪次技术进步不是伴随着大规模的就业洗牌呢?无论这个牌怎么洗,王牌永远都是香饽饽。对程序员来说,跳出代码外的思考能力、数学能力、创新能力、系统思维能力,才是香饽饽。今天已经不太需要抄写员了,正如将来某一天可能不再需要程序员。
细细分析一下,AI能够替代程序员,一个关键的能力就是代码生成。但是从computer science这门学科诞生开始,代码生成从来就不是一个核心领域。
这个世界上所有的学术科目,根据公认,都是从两个源头演化而来:数学和哲学。若没有跟这两个科目扯上关系,那它就不能被称为学术。
比如,每个人都可以在夜晚看星星,但看星星不是学术。后来引入了数学,成为了观星学,再后来成了天文学,乃至天体物理学,才是学术。因为引入了数学。
计算机按照图灵的表述,一开始是一种纯粹的数学模型,有四大要素。其中,指令只是衍生而出的一种应用工具。在冯·诺依曼的架构里,指令更是一种计算机的“粮食”,喂给它它就转,即使不喂,它本身也完备。也就是说,在这个模型上,指令是可被应用并且有效的。这正如人类有了充分发育的智慧大脑才产生语言,但语言并不代表大脑的智慧本身。
后来为了使得计算机这种东西不仅在数学上,更在现实中也有价值,就有了机器码。机器码是人为约定的,目的是为了操作计算机。也就是说,到了“编码”这一步,已经是计算机发展的中下游链路了。
一开始用的是纸带打孔。所以那时候的“程序员”其实就是打孔员。一张纸带代表一个指令,成本非常高昂。
后来发明了高级语言,人类只需要写这种语言,机器就可以把它自动编译成机器码。而且有了电子存储器,也不需要纸带了。到了70年代左右,才有了我们今天熟悉的所谓“编程语言”。
这个时候我们看看,编程语言在计算机科学发展的过程中,扮演了一个什么样的角色呢?它是学术吗?它是数学?还是哲学?把代码写得像证明一样严谨,那么它就是数学咯?或者写得像诗篇一样优美,那么它就是哲学咯?
我们有一门学问叫作编译原理,专门研究编译这件事。编译就是指把高级语言编译成机器码,这是一门数学性很强的科学。但是它和编程语言本身有什么关系?我们见过大量的程序员对编译原理知之甚少,也就是说只要他们不接触机器码和底层开发,编译原理并没有很多人想象中那么重要。
所以写代码本身一开始就和学术扯不上太大关系。发明高级语言,只是为了减轻程序员的工作量。高级语言的编译是一门大学问,但是使用高级语言本身,好像并没有获得太多学术上的关注,倒是很多大企业在用它创造产品。这就又出现一门学科叫作软件工程。
根据Uncle Bob的说法,高级语言编程的三大范式早在上世纪就确定了:函数式、过程式、对象式。所有的软件工程书籍,都在教你怎么用这三种方法写出最稳健、最易于维护的代码。但是它是语言不相关的,几乎任何一个图灵完备的语言都可以采取一定的架构,解决一定的问题。至于能实现多少,那就看这门语言的设计。而语言的设计又跟编译脱不开干系,这就又回到编译原理上。
说到底,代码本身从来不是一个目的。写代码没什么了不起,设计代码才是核心领域。
所以我们发现,指令的使用,乃至编程语言的使用,是计算机发展的大树上伸得很长但离得很远的一枝。它属于典型的应用侧。
既然是应用,显然用得越方便、越快速、越稳定越好,因为用它是为了看成果。所以自然而然的想法就是自动生成代码。
代码生成上迈出的第一步,恰恰是高级语言的发明。今天很多程序员抨击AI写代码是生成的,不好,但是他们忘记了他们使用的五花八门的高级语言,本质上也是一个机器码生成器。
有了高级语言,开发容易多了,这才有了软件的大爆发。
后来又有了五花八门的硬件、五花八门的操作系统。同一套软件、同一套业务,为了适配不同平台,就需要好几个团队来分别为不同平台做开发。比如Windows端用C#,Android端用Java或Kotlin,iOS端用Swift,Linux鬼知道该用什么。一套软件四套团队,怎么办?
于是就有了各种各样的跨平台方案,人类在代码生成上迈出伟大的第二步。比如现在学会JavaScript,几乎什么都能做,各大成熟的跨平台框架任君挑选。本质上就是:用一套高级语言的代码生成多个平台的机器码。这时候另外三套团队就会失业、被裁员。只不过那时候互联网应用野蛮生长,编程也没有今天这般高的热度,没有太多人会去倾听他们的心声。
所以今天的程序员,早就开始用代码生成技术了。如今有了AI,可以直接生成高级语言。形式虽更高级,本质却没有变化。只是过去人们手动编写编译器,将高级语言编译为机器码;如今AI能够深度学习现有的代码,人工可以少干预,仅此而已。这是软件这门生意发展的必然结果。
另一个方面,深度学习的理论框架早就有了,为什么近年才发展起来呢?
因为技术的发展本身需要一定的时间,而且,还有一个重要原因:硬件变强了。
硬件为什么能变强?因为基础研究的进步。基础研究为什么能进步?因为基础学科的进步。什么基础学科?数理化。好了,我们又回到了计算机科学的核心。
综上所述,计算机科学发展的第一动力,绝对不是代码。它被替代,完全合乎情理。所以程序员们,确实没有必要致力于守成。如果真的想提升不可替代性,应该尽快修正自己的错觉,尽量靠近computer science的核心,那就是从“做”到“设计”。