上一篇文章我们聊了AI能做什么、不能做什么,以及AI替代大量脑力劳动的趋势不可阻挡。
这篇文章我想聊聊,为什么我觉得程序员一定是被AI取代程度最高的职业之一,未来还需要程序员吗?
为什么曾经门槛很高、薪资很高的程序员行业,现在却成了AI取代率最高的行业之一呢?
上一篇文章里我讲了AI的各种局限性,现在我们来分析一下,为什么这些局限性都不会影响到AI替代程序员的步伐。
一、AI暴露度
最近Anthropic提出了一个就业市场的AI取代率分析,也叫AI暴露度。他们统计了不同行业理论上被AI取代的比例(蓝色线)和目前实际上的取代率(红色线),其中计算机和数学排名很靠前(Computer & math)。
来源 https://www.anthropic.com/research/labor-market-impacts

还有一个类似的网站,用美国劳工统计局的数据,通过Gemini Flash给342个职业打分,用0-10分来展示每个职业被AI取代的程度。这个树图里,面积代表每个职业的人数,颜色深浅代表被AI取代的得分。
我用红框框出来的,就是包括软件开发在内的计算机领域的职业。可以看到,计算机领域各行各业得分基本都在8-9分,也就是说AI取代率很高。

二、软件是如何"组装"出来的?
首先我先画张图说明一下,现实世界的人类需求是怎么一步步被软件解决的,从产品设计、界面设计,到程序开发,一直到计算机、电路芯片晶体管,直到物理世界。
如果有了解最近很火的Superpowers项目,应该可以发现,这个项目也是按照类似图中的分层思路,让AI一步一步实现复杂软件开发的。

1、从现实需求,到产品和界面设计
首先是现实世界的人类需求,我以点外卖这个常见场景来举例。
对普通人来说,需求很实际,可能就是一句话:我想点外卖,因为我不方便出门,但我想吃上热乎的饭。
产品设计通常是产品经理负责。当产品经理发现了这个需求,他们就会把需求细化成产品需求文档。
例如,我们要做一个APP,它有商家列表、商品点菜页、下单页、订单页等页面。
用户表达需求时可能只有简单的几句话,但里面蕴含了很多用户自己可能都没考虑过的现实世界细节。
例如考虑到用户想更快吃上饭,产品经理希望在商家列表页面里提供一个按送达时间排序的选项。考虑到有些用户担心食品安全问题,又想提供一个可以只展示堂食商家的选项。
再例如,产品经理会调研、思考为什么用户想点外卖,给不同的用户不同的选择。
有些人可能是因为工作繁忙没有时间,可以给他们推送营养丰富、送达及时且健康的工作餐。有些人可能是为了健身,可以给他们推送减脂健身餐。还有一些人可能在家但不太会做饭,又可以给他们推送已经加工的半成品,简单热一下就能吃。
这个过程也不是一次性完成的,产品经理会根据用户实际使用这些APP的数据做分析,也会不断收集用户反馈,反复改进产品。
产品文档本身只是描述产品的功能逻辑,通常是文字加原型示意图。
在产品提出产品文档的同时,通常会和设计师密切合作,给出产品的设计图,包括交互设计稿。这个设计图精确到具体每个页面、每个按钮长什么样,包括尺寸大小排列。
设计稿只是用于客户端,实际上很多需求还需要用到服务端,服务端用于保存处理各种用户的数据,也有非常多复杂的业务逻辑。
例如用户下单以后,要把订单派送给哪个骑手。再例如,发红包的时候,要给哪个用户发?什么时候发?什么类型的红包?都有很复杂的逻辑。
总之,这个过程中会有很多复杂的人类世界的逻辑。我们常常需要跟实际的人去交流,才能知道他们到底需要什么。而提出需求的人往往并不能清晰、完整地表达清楚自己的需求。
2、技术方案
需求提出后,就需要进行技术方案的设计,一般是架构师或资深程序员负责。
在这个过程中,常常需要根据现实世界的一些逻辑确定技术方案。也可能考虑到开发可行性和成本,要求产品经理修改文档。
例如,我们推测有外卖需求的用户非常多,且公司的推广能力很不错,认为未来发展空间很大,所以选择性能比较好的数据库。虽然前期维护起来会复杂一点,但是可以应对后续快速的规模扩张。
再例如,产品经理可能想让这个外卖APP里面有语音功能,直接说自己想吃什么就能自动点餐。那这个语音识别和语义分析的实现,是要放在客户端呢?还是要放在服务端呢?目前的技术实现起来难度大不大呢?公司研发团队规模有限,而这个功能属于锦上添花的功能,用户可能比较少,开发出来的性价比不高,是不是可以先不开发呢?
在这个架构设计的过程中,既需要对业务有所了解(人类世界),又需要对各种技术有所了解(物理世界),还需要一定的研发团队的管理能力。
3、业务开发
当确定了技术方案和实现文档后,就需要进行业务开发,一般是普通程序员负责实现。
实际上在一个业务驱动的公司里,业务开发的工作量占比是非常大的,这个过程很繁琐,很费时。
这个过程有点像搭积木,需求文档和技术方案规定了积木搭好以后是什么效果,也规定了大概要用哪些类型的积木,但是搭建的过程需要很多的人力成本。
4、底层开发
这里的底层开发,指的是业务无关的代码,包括:
1、APP自己独有的基础组件库。一般是业务开发过程中,根据实际需要逐渐提取出来的,在规模较大的公司,会有专门的基建团队负责维护。
2、第三方基础组件库。例如前端开发常用的React,Axios网络库等等,其中有很多是网上的开源库,开发者包括独立开发者,非营利性组织,企业等。
3、各种编程语言的标准库等。主要是编程语言的开发维护团队实现。
开发这些技术框架,一方面要知道上层业务需要一些什么样的工具,另一方面常常需要对计算机底层原理有更深入的理解,例如怎么样提高性能,怎么样避免内存问题等等。
5、编译器、解释器
在现代化的软件工程领域,前面说的这些基本上都是由“高级编程语言”开发出来的,也就是像C、C++、Java、JS、Python等等。
而这些语言实际在计算机中运行时,要么被编译成机器码,要么直接解释,但最终也会变成机器码,在计算机中运行。
这些编译器和解释器是非常复杂的,一般是经过了长期的完善才逐渐成熟。大部分业务开发程序员一般不太接触这些东西的设计,只需要了解它们的原理就可以了。
6、硬件设备、电路
而机器码最终能在电脑上运行,还需要CPU等硬件设备,芯片,一直到晶体管的复杂实现。
这些设备的设计实现是非常困难的,属于人类最前沿的科技。例如晶体管需要用到很多物理学的知识,例如材料学,量子效应等等。
这些领域涉及到大量跟真实物理世界的交互。为了研究明白这些理论,需要做很多复杂的物理学实验。
三、真实世界交互:AI的两大"盲区"
在前面的文章中我讲了,对于AI来说,与真实世界的交互是一件比较困难的事情。
和真实世界交互,我理解分为两部分,一是和人类世界的交互,二是和物理世界的交互。
在前面这个图中,我们可以看到,最上层产品经理就是主要和人类世界交互的。而最底层到了计算机硬件的设计实现,就会涉及到很多和物理世界交互的逻辑。
人类世界
和人类世界交互,需要懂人类世界的真实问题,目前AI在这方面并不成熟。
上篇文章也讨论过,AI是很难感知到真实世界的,所以它们并没有人类的情绪和感受。它们所做的一切只是根据网上已有的各种信息,然后来模仿和推测人类的想法。
假设在多年之前,AI已经达到了今天这种技术程度,但是外卖这种商业模式很少被提及,网上也很少有文章。如果去让AI设计一个外卖APP,它可能想不明白很多细节,例如人类为什么会点外卖,人类用户会关注哪些问题,怎么推广才能让这个产品走出去。
这当中涉及大量和人类社会的交流,而且需要不断地从人类社会收集反馈,做实验。至少目前的AI技术,没有这样的渠道搞定这一切。
物理世界
和物理世界交互同样是一个很困难的事情,这需要很多科研工作者努力。
这个过程中要做很多的实际的实验,并且需要的设备都非常复杂。或许AI在这个过程中能起到帮助作用,但是比较有限。
所以涉及到计算机硬件的设计实现,我认为AI没有那么容易取代人类的工作。
四、代码世界:完美的中间层,AI的"舒适区"
有意思的事情来了。代码世界,它和前面两个世界都不一样,它处于两者之间。
编程语言从头到尾都是人类设计出来的一套完备的规则,是一个抽象的、完美的中间层,它不需要探索各种未知的边界。
编程语言、各种底层库都有完整的文档告诉你它所有的关键字、语法、接口怎么用,你不能发明一种未知的语法或接口调用,在已知的语言框架里面运行起来。
当需求文档和设计稿确定之后,只要足够细化,并且已经有足够清晰的架构设计和实现文档后,具体的业务实现就是比较确定的:它不涉及上层复杂的人类需求,因为这个已经在设计需求文档里面细化过了;前期工作做足,也不太可能出现实现不了的情况,并且大概的实现成本也是确定的。

五、清晰的边界
前面的文章中,我提到了模糊的现实这一问题。也就是说,很多现实世界当中问题是模糊的,AI没有办法知道自己的结论到底是对还是错。这样的话,我们在训练AI的时候,也不知道应该让AI往哪个方向走。
但是在编程领域,它天然的有一个清晰的边界。例如我们可以给代码跑自动化测试,只要测试通过了,那就证明这个代码在这一种条件下是正确的,不会有歧义。
六、程序员需要创造力吗?
如果一个公司的工作内容、职责划分非常清晰完善,所有业务开发部分的工作,就只需要机械地按照设计文档里的设计,用固定的技术框架和代码实现这些业务,甚至连代码风格都已经在规范文档中明确了。这个过程中几乎没有需要发挥创造力的地方。
实际上,之所以有很多程序员觉得上班很无趣的重要一点,正是来源于此。由于公司规模比较大,很多东西都是分工明确的,而很多程序员的大部分工作可能就是业务开发,解决一些比较枯燥、比较固定的问题,难以发挥主观能动性。
当然在实际的公司里,分工不会像前面说的这么细致和完美。负责业务开发的程序员,可能也要承担一部分底层框架设计的工作,会参与前期技术方案设计,甚至参与产品经理和设计师的一部分工作,在规模小的公司更是如此,这样他们的工作就不至于那么的枯燥乏味。
这种业务开发任务就有点像搭积木。代码要反复地调试、测试、找bug、修bug。在过去,它是一个相对机械、但又必须由人来解决的问题,而且还必须是抽象理解力、学习能力、耐心足够好的人类才行。
在有了AI大模型以后,这一切的逻辑就开始发生改变。原先很多必须人类去实现的搭积木过程,现在已经可以逐步让AI去实现了。

七、人月神话与算力成本
除了要写代码和调试代码之外,负责业务开发的程序员还需要花大量的时间用于沟通。
因为一个复杂项目需要很多的程序员一起开发,每个程序员负责其中的一个模块,而这些模块之间需要组装到一起,就涉及到大量沟通工作。
在软件工程与项目管理领域的经典著作《人月神话》一书中提到一个观点,开发同一个软件时,如果开发人员越多,沟通成本就会指数级增加。
假设原本需要1个人开发10个月的工作,如果改成10个人,实际开发时长会远大于1个月,因为沟通成本大大增加了。按照“人月”这个单位(也就是一个人一个月的工作量)来衡量和管理软件开发是不现实的,就像神话一样。
但是现在有了AI,过去的项目管理逻辑被颠覆了。AI不仅可以取代人类编写大量代码,还可以取代人类极大加速沟通。AI之间可以使用文档进行沟通,一个AI可以在极短时间生成大量文档,而别的AI也可以在极短的时间里读完这些文档,沟通效率很高。原本人多以后指数级增加的沟通成本,瞬间指数级的下降了。
只要我们的算力足够多,理论上可以让无限多个AI并行工作。开发速度可以极大地提高。并且我们可以让AI自己去研究要怎么拆分任务,怎么提高沟通效率。
八、理想主义者的知识自由
前面的文章我提到有很多行业是有公开的秘密的,并且有很多信息壁垒和人为障碍。但是程序员这个职业,有天然的被AI取代的优势。
程序员非常热衷于分享。程序员出生在互联网时代,这个行业从一开始就带着一种理想主义思想,崇尚知识自由,并且很多程序员的性格很直,或者说很实诚。
很多程序员都会免费把自己学到的东西发到网上,免费的把自己写的代码开源出来,并且不求经济上的回报,只为了追求个人价值实现。
实际上,作为一个程序员,我从上大学期间就开始写博客了,没指望从中赚钱,每年还要花几百块钱用于域名和服务器的维护。
最开始之所以会这么做,是因为我在学习编程的时候也看了很多别人的公开博客,对我帮助很大。所以我希望通过分享我学到的知识,回馈这个行业。
当然我也有自己的私心。例如,博客写得多可以自己梳理自己的思路,博客也可以作为我面试的时候自我展示的一个方式,通过博客我也认识到了不少同行,可以互相学习。
但总的来说,我会免费把这些知识分享到网上。
相比之下,很多行业就没有那么多知识可以免费学习。在现实社会当中,花钱学东西才是常态。
有不少程序员一直局限在自己的圈子里,他们觉得任何东西都可以从网上免费学到,并且有时候他们感受不到自己的价值所在。因为他们习惯了免费的技术学习资料,同时也免费分享技术学习心得。
就例如身边有朋友会觉得,找阿姨上门打扫卫生一个小时80块钱,很划算。但是如果让他花200块钱让别人上门给他装个系统,他就会觉得:好贵呀,钱这么好挣吗?
实际上装系统这件事并不简单,虽然它不需要很多体力劳动,但是也需要很长时间学习,门槛比打扫卫生要高不少。只是因为程序员已经熟悉自己的领域,所以觉得不难。
前段时间,网上有很多收费安装OpenClaw,要好几百。说实话我觉得略贵,但是在当时OpenClaw很火的阶段,收几百似乎也是符合市场行情的。
总的来说,在编程领域有大量免费和唾手可得的代码和文档资料。这些都成为了AI大模型训练的素材,使得大模型在编程能力上,相比其他领域更容易取得突破。
最近GitHub就有开源项目,可以把冰冷的同事变成温暖的Skills。乐于分享的碳基人类,终究变成了硅基AI的燃料。

九、程序员的自我革命
程序员行业从诞生以来,就在不断地自我革命,以降低开发门槛、提高开发效率为目标。
其实最开始计算机刚设计出来,人们想编程就只能用机器码。后面才逐渐发明了高级编程语言。
而高级编程语言出来以后,绝大多数软件开发都直接用高级编程语言了,没有人再用机器码了,除非是一些非常核心关键的极少数地方用一下。
实际上,在高级编程语言出来以后,程序员还是在不断追求,能不能用一种更加接近人类语言、更容易被人类理解的方式来编程或实现需求呢?
例如OC语言,它的API设计就强调一种参数分离、靠近自然语言的思想。例如,把登录按钮背景色设置成红色,常规的语言例如Java里的写法一般是setButtonBackground(loginButton, Color.RED)。而OC里面的写法可以是 [set:loginButton backgroundTo:redColor],这里面的 loginButton 和 redColor 分别是两个参数,这个API这么写,看起来就和自然语言一样连贯了。
例如SQL语言,它就是一种比较像自然语言的语法,但实际上它里面还是有比较复杂的逻辑,没有自然语言那么好理解。
例如,多年前有人发明了易语言,它是一种中文编程语言,目标是想让不懂英文的中文用户也能写好代码。但是可能是因为它写起来比较别扭,所以用的人比较少。
再例如,近些年很多企业都在宣传低代码的思路,也就是实现各种现成的工具库,利用主题、插件等方式,让用户不需要实际写代码,就能实现一些定制化的功能。
现在一切都变了,AI时代,我们真的可以直接使用自然语言来编程了,虽然现在还不够成熟。未来或许会发明一种通过自然语言来描述的编程规范,它就是一种新的编程语言。
由于自然语言编程语言的学习难度进一步下降,会写代码的人就越来越多了。届时全职程序员就会越来越少了,因为人人都可以写代码。
这有点像媒体,以前因为发布知识、文字、图片素材需要比较高的门槛,要么做实体版的报纸等印刷材料,要么自己搭建网站。
但是现在,由于技术的进步,产生了各种自媒体网站,任何人都可以注册账号,轻松发布图片、视频、文字等等,成为自媒体。
也有点像摄影行业。以前摄影师都要有昂贵的摄影器材,但是现在摄影器材的价格已经很亲民了,更重要的是手机的发展太快了,有时候专门的相机拍照效果可能还没有手机那么好,摄影成了一个非常大众的爱好。

十、未来还需要程序员吗?
还是分析一下前面那张图。从目前的发展趋势来看,最容易被取代的工作就是业务开发这一部分,并且它现在已经很大程度上兑现了。很多刚毕业不久的程序员是受影响最大的。不少公司更愿意招资深的程序员,让他们用AI写代码。
而资深程序员之所以资深,它不仅仅是体现在技术上,也要体现在对业务的理解上。
在技术上,资深程序员在深入了解了某一个方向的开发,就很容易融会贯通,了解类似的方向。
拿我自己来说,我是做安卓出身的,但是后面我自己业余也做过全栈开发,工作当中也接触过基础的iOS开发。学这些比当初学安卓要轻松的太多了,因为很多东西都是相通的,只是一些具体细节上的差异。
在业务上,我刚毕业做业务的时候,会过分纠结代码本身要怎么写,怎么提高代码的扩展性。但是对代码能解决什么实际问题这件事理解就比较浅薄。
有时候不愿意和产品经理妥协,总是觉得会把代码写的很乱。但实际上,解决实际问题才是一个公司的首要任务。代码写的再好,如果解决不了实际问题,这个项目黄了,代码再好也没用了。
在我工作年限比较久以后,也从那些工作年限短的同事身上看到过同样的现象,我也会和他们分享我的学习经验。
而资深程序员的工作,涉及到架构设计、技术选型,由于涉及到对业务的理解,虽然短期内不太可能被AI马上取代,但AI也可以参与,例如调研不同的技术优缺点,最后由人来决定使用哪种技术。
而在底层基础框架建设工作上,需要对操作底层系统底层有更深入的理解,且有很多项目的规模和复杂度非常高,目前AI想要取代并不容易。但是同样有很多可以让AI帮忙解决的东西。例如,当我想设计一套框架时,我只需要用语言描述我要设计哪些组件,具体的代码实现完全可以让AI帮我解决。
总之,我认为在未来还是会有程序员的职业,但是程序员的工作模式会完全不一样。并且社会对全职程序员的需求会减少,因为常规的简单的软件开发会有越来越多的人学会。
而职业程序员需要做的是更深入和复杂的工作,按照我前面那张图来看,也就是从业务开发往上下两端走,要么深入复杂的人类世界,要么深入深奥的物理世界,做AI还不擅长的事情。
如果觉得文章有帮助,欢迎分享转发,也欢迎关注我的公众号“搬砖的小明”,及时获取更新