本文转发至 FinClip blog。
某种程度上,我们这几代的软件工程师,都是冯诺依曼(Von Neumann)架构的既得利益者。但红利正在消失。这个架构被“隐藏”了,以大语言模型为“中央处理器”的“自然语言计算机”正在出现,“古典”意义上的软件工程师职业还将存在多久?
现代软件工程师的职业,本质上是靠吃着冯诺依曼(von Neumann)架构的红利而存在(感谢祖师爷赏饭吃)。我们不过是计算机指令与数据的搬运工,通过写代码,把字节从二级存储搬到内存,然后又搬到寄存器,再搬到中央处理器,最后又把运算结果搬回去。后来有了网络,于是又多了把字节从这台计算机搬到那台计算机的工作。
为什么只有少数人能干这搬运工的活?因为大部分人搞不清楚这些中央处理器、存储器、寄存器。受过专业训练的码农才知道怎么搬。而其中水平比较高的,则知道用堆、用栈、用多线程、用队列、用各种算法和工具去搬的比较快、比较可靠。
但是,很多很多年前,时代已经来到一个阶段 - 大部分的码农其实甚至不具备Mechanical Sympathy(“机械同理心”),不知道基础的计算机原理与算法,他们日复一日的,只是在做代码翻译工作、数据格式转换工作,例如:一些写JavaScript的人把数据转换为XML或者JSON格式作网络传输,到了服务器上,一些写Java或者Ruby的人把这些网络数据转换成DAO(Data Access Object)对象,再到后面,一些搞数据库写SQL的人得把这些“对象”通过ORM(Object-relational mapping)变成表结构的数据存储,然后反方向再来一遍...
如此机械、重复的工作,很多码农是身体力行的以鼠标键盘“Cut-and-Paste”干着赖以为生,充当着着名符其实的搬运工。这样的工作有多少价值 - 尤其当它的提供者拿着几十万年薪的时候?
随着大语言模型的疯狂发展,一个把冯诺依曼架构彻底隐藏的新架构已经形成,而码农可以吃的“红利”,是不是也走到尽头?
生于计算机科学群星闪耀的50年代
软件工程师这个职业,如果说诞生于50年代,应该大体准确吧。图灵和冯诺依曼两位现代计算机科学奠基人的基础性工作已经完成,马文明斯基(Marvin Minsky)和麦卡锡(John McCarthy,LISP语言发明者)已经发起“达特茅斯会议”提出“人工智能”概念。专门从事软件开发工作的人已经出现,虽然还没有明确的“软件工程师”职业称呼。几种重要的编程语言在这个年代诞生了,例如:
- FORTRAN:1956年由IBM团队设计的科学计算的编程语言。它是第一门广泛使用的高级语言,异常的长寿,一直使用到今天
- Lisp:1958年发明的函数式编程语言,后成为人工智能领域的主要语言之一
- COBOL:1959年面向商业数据处理领域设计的语言,使用最为广泛,尤其在银行业
- Algol 60:1960年诞生,意在统一算法描述语言,对后世影响深远,成为面向过程编程语言的先驱
当时极少数的精英掌握了这些语言,他们就是软件工程师的先辈。之后的故事,我们都知道了,编程语言的发明一路开挂,从70年代的C、80年代的C 、90年代的Java到现在,全球现有的计算机编程语言总数量可以粗略估计约为1000-1500种。过去20年(2003年至2022年)平均每年诞生的编程语言数量统计:
- Tiobe编程语言指数追踪的语言数量:平均每年新增3.7种语言。
- IEEE Spectrum排名的编程语言数量:平均每年新增4.3种语言。
- Github上监测的新语言数量:平均每年新增约16.5种语言。
但“编程语言”本身是“反人性”的 - 它们不是人类最自然的自我表达方式,它是为与机器沟通而设计的,所以只是少数人能掌握 - 正如远古先民与“神”的沟通被垄断在少数炮制了“神”并声称能讲“神的语言”的巫师手里一样。
码农一天有效产出只有1千个Token
掌握编程“特殊技能”的软件工程师,尤其是在硅谷享受着高薪、公司股权、开着特斯拉那些,有人(哈佛大学教授Matt Welsh)给他们算了一笔账:
- 平均年薪US$220,000
- 企业为每个人付出的隐性成本(福利、税、免费早午晚餐、免费巴士、零食、按摩服务、医疗保健、娱乐...)US$92,000
总计人均成本每年US$312,000。
每年按260个工作天计算的话,企业每天付出给每个人的成本为US$1,200。那么这性价比如何?
这里又有一笔账 - 每个工程师每天完成并提交的源代码有多少行?“完成”的意思是:测试过、评审过、确认有效的代码。Welsh的估计,中位值是0! 你作为开发工程师每天有大量的时间不是在开会就是在等待别人的模块提交。你说你整天在写代码?但可能90%的代码是试错而无用、或者被同侪的评审给否决掉。你可能在思考如何开发、你可能在设计重构或者推倒重来... 你确实在工作但最终你提交到代码库的有效代码、也就是成为软件成品里一部分的真正运行代码行数不多。
考虑到你的“颅内运算”导致脑细胞死了不少、你的神经元网络算力全开,Welsh“慷慨”的把你的生产力提升为平均每天生产100行有效代码(他认为实际上是很难做到的),那么这100行代码等同于多少个GPT的token呢?按1行代码10个token算,你每天生产大概1000个token,这是多少钱呢?
- GPT-3.5 Turbo-16K的价钱是:US$0.004
- GPT-4 32K的价钱是:US$0.12
一个活人软件工程师一天撑死输出1000个有效token的成本,是GPT-4同等算力开销的10,000倍!而且GPT们可能只需要0.001秒...
有人的地方就导致低效
业务需求方、项目经理、产品经理都知道,要让一个软件开发小组高效产出有多大的挑战。
做几个应用页面?7、8个人的团队规模,开发小组先坐下来开几次会,产品经理搞个交互概念、UI整个“高保真”设计原型、前后端人员分个工、测试工程师搞个TDD/BDD。最终答复:如果贪急图快(Quick-n-dirty)的让我们先出个东西,3周;如果是隆而重之的生产环境发布并周到的考虑好向前兼容、保障可扩展的灵活性,12周。
活人软件工程师被GPT替代后,团队组成可能只剩下两个活人:产品经理和审核。产品经理负责通过提示工程的手段向AI提出各种设想、要求并对成品作验收。审核者则好歹看一下AI生成的代码(当然,这个时候他可能也没有能力靠“肉眼”去看了,还得借力各种AI工具,但也算是有个人类把关一下吧)。
敏捷迭代?什么敏捷迭代?
敏捷迭代还需要提吗?这完全是针对人类工程师而产生的概念。一个软件开发团队里工程师水平各异、良莠不齐,再加上和项目经理、产品经理、相对于团队而言算是外部的“需求”方等各种角色人员的交流沟通过程带来的各种不确定性,类似Kanban、Scrum等等试图解决这些问题的各种最佳实践、方法、理论才应运而生。
“有人的地方就有江湖”,人类的沟通与协同永远是一个软件项目中风险最高、最容易导致软件功能走偏、架构设计走歪、交付标准坍塌的部分,也是低效的根源。于是大家制定了一个游戏规则 - 确定与认领用户故事、每周定期做sprint planning和sprint review的仪式,小版本密集发布等等。
但是对于AI来说,敏捷 = 算力。迭代一版软件产品,就看你有多少颗GPU/TPU/CPU了吧。而且AI没有休息一说,可以无休止的工作,一天把软件代码迭代个十万八千次,不是问题。
架构设计模式?重构?不存在的事
因为现代软件系统的复杂性,在软件技术演进过程中,不得不持续总结、发明一些方法,去解决软件系统的性能扩容问题、长期可维护性问题、准确性问题... 工程师在开发的过程中,随着对一个业务领域的不断深入理解,也需要不断回顾复盘,从而归纳总结出更好的做法,经常性的为了让系统更好的应对未来需求而基于更深的认识去进行代码重构。
在这个过程中,我们采用各种面向对象的设计模式:Strategy、Proxy、Delegate、Facade、Observer、Command... 我们采用各种架构设计模式:MVC、Hub-and-Spoke、Bus、Pub-Sub、EDA(Event-Driven Architecture)、CQRS(Command Query Responsibility Segregation)、SOA(Service Oriented Architecture)... 我们采用各种开发方法:DDD(Domain Driven Development)、TDD(Test Driven Development)、BDD(Behavior Driven Development)、Design by Contract(契约式设计)等等...
但是,当代码都是由生成式AI去生产的话,这些设计模式、方法还重要吗?AI生成的代码会去遵循和沿用这些人类积累沉淀的知识吗?它是在自己生成的代码中借鉴或者实现了这些架构、框架还是是发展演变出新的“不为人知”的东西?是否会像AlphaGo最终发现对围棋的可计算空间远远大于人类积累两千年的知识空间那样,在软件构建方面发展出人类工程师从未想到过的架构与方法?
也许这些都不重要。当你告诉GPT,“帮我重写这20,000行代码”,而这一切在5分钟内完成的话,过去这些方法和技巧还有多少重要性呢?
冯诺依曼架构给码农的红利终结
某种程度上,我们这几代的软件工程师,都是冯诺依曼(Von Neumann)架构的既得利益者。
约翰·冯·诺伊曼(1903-1957)是现代计算机的奠基人(与奥本海默同时,并且是“曼哈顿计划”的成员)。他在20世纪40年代提出的计算机的体系结构、理论和设计原则,直到今天依然是现代计算机科学的基础。提供了理解计算机和编程的基本理论框架,对程序设计语言和算法的设计产生了深远影响,启发了操作系统、网络、数据库等关键软件技术的产生。什么CPU中央处理器、RAM内存、指令集、程序、I/O设备、Cache缓存这些今天广为人知的概念,源出于此。即便是这些年出现了GPU、TPU等,仍然属于冯诺依曼架构及其衍生架构的范畴。
冯诺依曼架构对现代软件工程影响深远,码农的所有技术知识,可以说都依托于这个架构体系之上,大家都是在这个体系下谋生。但是,现在有多少软件工程师真的对自己所用于编程和运行程序的底层软硬件技术深究、有深入的理解呢?
赛车手Jackie Stewart最早在赛车界提出所谓Mechanical Sympathy这个概念,中文不好翻译,似乎没有特别直观的说法,在这里勉强译为“机械同理心”,就是说赛车手对赛车的机械原理理解特别深,才能充分利用发挥其性能的意思吧。后来被软件大牛Martin Thompson引进到软件领域,强调开发者应该类似地对计算机硬件和系统有深入的理解,才能更好地编写高性能的代码。这种态度强调了开发者需要关注底层硬件的工作原理,以便更好地利用硬件特性来优化软件的性能。
但现在绝大部分的企业应用软件系统的开发工程师,编程所面向的“计算机”,已经是被层层封装的黑盒子,他们能看到的、仅在乎的,不过是一些“努力靠拢自然语言”的高级语言,经常用这些语言去粘合一些别人提供的API接口、组件接口,偶尔用这些语言去写一些主要由For-Loop和If-Then语句组成的业务逻辑(而且很多时候这些代码还被写成了像“意大利面条”一样,“松散耦合”?“内聚”?“设计模式”?不存在)。Mechanical Sympathy?更加是没影儿的事。
大语言模型的出现和普及,让本来就不再受大部分程序员关注的冯纽曼架构体系变成透明。以大语言模型为中心的架构,大语言模型取代了“中央处理器”,矢量数据库(Vector DB)取代了“存储器”,智能体(Agent)和外部调用函数(Function)取代了“I/O”和“中断”,而互联网上的各种服务API接口,就是“周边”(Peripheral)。
一个所谓的“自然语言计算机”(Natural Language Computer)出现了。这个时候,受过传统软件开发专业训练的程序员,还能否维持其“科班出身”的专业优势呢?能够聪明的理解人类指令和诉求、讲人类语言的计算机,还需要“巫师”般的行业黑话(编程语言)去指示其运作吗?还需要很多接受这种“行业黑话”专业训练的人去负责把业务应用需求“翻译”成机器指令吗?企业还愿意为这种专业技能买单吗?
可能不再需要。这好比越来越智能的汽车,最终它会以无人驾驶取代一般的司机。当然,深刻理解汽车机械的赛车手和他们的赛车,还是会继续存在的,但那只是非常非常少数的一个精英群体。
八十年之久的职业会消失吗?
人工智能甚至可以说诞生在现代计算机雏形出现之前,如果我们以图灵和冯诺依曼两个人的活跃时间以及各自学科的奠基时期来看的话:
图灵(1912-1954年)主要活跃于30年代至40年代初期。他在这段时间里奠定了计算机算法原理方面的基础理论。他在50年提出“图灵测试”,这是人工智能领域的里程碑。冯诺依曼(1903-1957年)则是在40年代中期至50年代前期最活跃,主导了当代计算机架构的发明。两人之间差了约10年的间隔。图灵理论偏前,冯诺依曼实践偏后。图灵50年代初去世较早,没有见证冯诺依曼后期成就。但图灵理论对冯诺依曼有启发和影响。
某种意义上可以说,软件工程师的宿命就是通过算法和软件工程手段,逐步实现人工智能,从而让自己与“神”沟通的专利消失(这比远古巫师炮制出“神”并垄断与其沟通的权利,伟大太多了)。
一旦人工智能掌握了自我学习的能力,技术发展就进入了指数级加速的轨道。5年后会发生什么?Matt Welsh姑且用了一个大致的整数年份来圈定软件工程师这份职业的始终:有了二战期间以及战后人工智能和现代计算机架构的奠基,50年代出现各种早期计算机语言,出现掌握这些语言的程序员;到了2030年,80年过去了,传统意义上的“古典”软件工程师职业还在吗?
至少对于机械性粘贴代码、写“意大利面条”、对底层计算机技术原理没有兴趣、不理解算法、知识面窄、表达能力差、逻辑分析能力弱、对世界没有好奇心、不求甚解的那帮开发人员,应该是走到职业尽头了。想一下你每天“吐”出来的的那些质量不怎么样的token,用GPT-4现在只需要花几毛钱,不够好使、不够满意?多花个几块钱多试验几个prompt如何?
Copilot是救兵吗?
号称AI赋能码农、增强其能力提升其效率的神器 - 各种Copilot,来了。随之而来的是各种“神预测”。
“未来的工程师只有两种人,能利用AI的和不能利用AI的”。Matt Welsh(以及很多人)如是说。这有点接近废话,不能利用AI的应该都干不了软件工作了吧。
“英语是最好的编程语言”。OpenAI科学家Andrej Karpathy如是说。抬杠的人可以说凭什么是英语而不是汉语或者其他语?但英语确实是软件世界各种编程语言约定俗成的基础语言,所以在可供训练的数据积累上是无与伦比的。但至少目前看来,用英语做提示让大语言模型生成真正有效的代码、实现一定的软件功能,依然不是普通人能驾驭,它可能带来另外的专业门槛。
“AI是平庸工程师的复仇”。有些技术视频博主如是说。但恐怕难以苟同 - “平庸工程师”就是上述那些甘于做“搬运工”的人吧,见识面窄、表达能力弱、逻辑不行、基础功底差、没好奇心不好学的那些,Copilot也拯救不了他们。
“产品经理自己就可以生产软件”。以现在市场上“产品经理”的阅历和专业训练背景,是不可能的。"AI产品经理”可能是另一个物种,也许架构师出身又有强大产品思维并且深入业务领域的人,有点机会。
无论如何,“古典”意义上的软件工程师职业将一去不复回,但我们之中很多人得感谢计算机技术革命的这黄金八十年创造的就业机会。学习计算机科学、进入这个领域,无疑是一种幸运,它给了我们严谨的逻辑思维和算法思想。接下来,牢固掌握原理性知识、理解底层技术有Mechanical Sympathy的人,有机会“进化”成AI世代的软件工程师,而粘贴代码、搞点字节搬运、做做增删改查机械任务的那些,将消失于这个行业。