Please enable Javascript to view the contents

大语言模型已来, 传统编程已死

 ·  ☕ 13 分钟  ·  ✍️ Calvin Haynes · 👀... 阅读

在这个迅猛发展的AIGC时代,大语言模型如同一股不可抗拒的潮流,它们的崛起不仅改变了我们与技术的互动方式,更是给传统编程敲响了丧钟。

前言

首先, 各位读者原谅我这个可能存在一点标题党嫌疑的题目, 因为这来自于我最近看到的一个对我来说比较有启发的一个 Harvard 的 Tech Talk, 原标题就是"Large Language Models and The End of Programming", 主讲人 Matt Welsh 就编程语言的历史, 编程的本质, 以及未来自然语言编程的可能性等等方面对 AI 大模型的未来发展进行了探讨, 原视频地址我放在最后的参考资料中, 感兴趣的可以去自行观看, 本文我会客观的总结这个视频的全部内容, 同时也会整合我自己对于这个新领域的思考, 希望能带给读者一些感思

请一定要读完哦, 相信每个人都会有所启发!

编程的简短编年史

🌟我们都知道任何程序本质上都是机器语言的二进制代码, 只不过我们人类为了可读性, 为了发挥我们人类的创造性, 我们选择在机器语言上再加上一层最终形成我们都能看得懂的"高级语言", 但是为了和机器底层的硬件特性做兼容, 我们同时也要在编程语言上做底层硬件的抽象 (比如设计栈, 队列等数据结构, 设计指针等语言特性), 这些其实都是为了和计算机底层硬件做的妥协, 这就导致编程语言和我们人类的自然语言还是有很大的差距, 从而诞生了程序员这个职业, 而程序员高薪也恰恰是因为这些学习成本!

最早期的编程

最早期的编程可追溯到 19 世纪初。那时,编程与我们现在理解的概念大不相同,它更多的是指对机械设备的一系列操作和调整,以使其执行特定任务。

image.png

1801年:提花机 最早的编程之一可以追溯到法国织布工人约瑟夫·玛丽·雅卡尔发明的提花机。这台机器使用一系列穿孔的卡片来控制织布机的纹路,这些穿孔卡片可以看作是一种早期的“程序”,通过它们的不同排列和组合来编织出复杂的图案。这种使用穿孔卡片的方式后来对计算机编程产生了重要影响。

1837年:分析机 另一个关键的里程碑是查尔斯·巴贝奇的分析机,它被认为是第一台通用计算机的概念设计。分析机的设计采用了类似现代计算机的存储和处理单元。巴贝奇的朋友,数学家艾达·洛夫莱斯,为分析机编写了一系列操作指令,这些指令被认为是世界上第一个计算机程序,艾达·洛夫莱斯因此被称为世界上第一位程序员。

1940年代:电子计算机 到了20世纪40年代,随着电子计算机的诞生,编程开始转向电子形式。第一台电子通用计算机ENIAC(电子数值积分计算机)在1945年完成,它使用了一系列电子管来执行计算任务,其“编程”过程实际上是通过手工重新接线和配置开关来实现的。

1940年代末至1950年代初:汇编语言与高级语言 随着时间的推移,编程语言逐渐发展,从机器语言到汇编语言,后者通过助记符来代表机器指令,使得编程更加直观。汇编语言减少了编程工作的复杂性,但编程仍然是一项专门的技能,需要深入理解计算机的工作原理。

高级编程语言的出现

高级编程语言的出现大大扩张了程序员这一职业, 使得原本只用于科研计算的编程应用到了各行各业的信息化中

image.png

1957年:Fortran IBM的Fortran出现后,它开启了高级编程语言的时代。Fortran的设计使得编程更接近数学公式和自然语言,从而使得程序设计不再只是电子工程师的专利,而是向科学家和工程师开放,这是编程发展史上的一个重要转折点。

1960年代:结构化编程的兴起 随着软件系统变得越来越复杂,人们开始寻求更好的代码组织和管理方法。这时,结构化编程的概念应运而生,它强调使用序列、选择和循环这样的控制结构来编写程序,而避免使用跳转指令(GOTO)。Algol 60是支持结构化编程的先驱语言之一,它对后来的许多语言设计有着深远的影响。

1970年代:面向对象编程与C语言 面向对象编程(OOP)范式随着Smalltalk语言而兴起,它引入了类和对象的概念,以及封装、继承和多态等核心概念。同时,C语言的发明对编程世界产生了深远的影响。它由丹尼斯·里奇在贝尔实验室开发,旨在提供一种能够有效生成操作系统代码的语言。C语言结合了高级语言的优势和对硬件操作的低级控制能力,成为了UNIX操作系统的开发语言,并对后来的C++、Objective-C、C#等语言产生了深远影响。

1980年代:多样化的编程语言 编程语言开始向多个方向快速发展,满足不同领域的特定需求。C++引入了C语言的面向对象版本,Ada为大型、安全性至关重要的系统提供服务,而Pascal则成为教学用途的首选语言。此外,函数式编程语言如Haskell也在这一时期问世,提供了一种全新的编程范式。

1990年代:脚本语言与互联网 随着互联网的兴起,Web编程需求激增。Perl、PHP、JavaScript和Python等脚本语言变得流行,它们易于学习和快速开发,特别适合Web开发。Java凭借其“编写一次,处处运行”的能力,迅速成为企业应用开发的热门选择。

2000年代:语言的统一与多样性 新世纪伊始,.NET框架的出现推动了语言的统一,C#成为.NET环境的重要语言。同时,动态语言如Ruby和Python因其编程简便性而变得日益流行。此外,开源运动的兴起也为编程语言的发展提供了新的动力。

现代编程

伴随大数据, 云计算以及 AI 的发展, 现代编程领域出现了更多的编程语言和开发方式

image.png

2010年代:现代语言与大数据 随着大数据和云计算的兴起,需要更好地处理并发和大规模数据处理的编程语言,如 Go 和 Rust,逐渐进入开发者的视野。同时,Swift 的出现为 iOS 和 macOS 应用开发带来了新的活力。

人工智能时代:大语言模型 到了21世纪20年代,随着机器学习技术的成熟,编程语言的发展进入了一个新的阶段。大语言模型如 OpenAI 的 GPT 系列和其他自动化代码生成工具如Copiliot,使得编程更加智能化,甚至在某些情况下能够自动生成代码

畅想未来的编程

随着大语言模型的迅猛发展, 未来程序员利用自然语言实现 AIaaS (Artificial Intelligence as a Service) 将成为一种可能

image.png

编程语言的对比

🌟经过这么多年的编程语言的发展, 我们其实发现还是没有一个编程语言能够本质上解决可读性和效率的同时满足, 我们一定要制定一些编码规范, 用一些设计模式和开发领域内的统一规范才能保证可读性, 而提高效率的一种办法仍然是操作底层甚至编写汇编语言, 可见编程语言的发展其实已经长时间处于瓶颈期了, 那么其实不难发现通常历史上解决领域瓶颈的通常都是不破不立, 大语言模型的出现也许真的是一种""!

时间线

image.png
image.png
image.png
image.png

INTERCAL 编程语言 (just for fun)

INTERCAL,全名为“编译器语言,没有明确的缩写”,是一种设计出来的目的就是为了娱乐的计算机编程语言。这种语言由普林斯顿大学的学生唐·伍兹和詹姆斯·M·里昂在 1972 年创建。INTERCAL 的设计哲学与任何其他编程语言都截然不同,它包含了大量的讽刺和幽默元素。

INTERCAL 的语法独一无二,故意设计得非常古怪和反直觉,以此戏仿其他编程语言的复杂性。比如,它避免使用传统的编程语言中常见的术语和符号,例如不使用 +- 进行加减运算,而是使用了 PLEASE 来表示请求,以此来讽刺程序员有时需用礼貌的方式与计算机“交流”。如果程序中的 PLEASE 太多,编译器会报告“过度的殷勤”错误;太少的话,则会因“不够的殷勤”而出错。

例如,下面是一个在 INTERCAL 编程语言中打印出“Hello, world!”的程序示例:

DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP

INTERCAL 通常不用于实际的软件开发,而是作为一种文化现象,展示编程语言设计上的自由和多样性。它被编程社区用来开玩笑或是作为编程挑战,来展示掌握这种语言的能力。尽管它具有故意设计的低效率和可读性问题,但 INTERCAL 却以其独特的幽默感赢得了一小撮忠实粉丝的心。

未来计算机产业结构畅想

未来软件开发团队的可能性

image.png

在这张充满想象力的插图中,我们看到了未来软件开发团队的一种可能面貌。左侧是一位专注的人类代码审查员,他正紧锁眉头,可能是在寻找代码中的 bug 或是在评估代码质量。中间的是一位自信满满的项目经理,他身体里流淌着“红色的血液”,意味着尽管技术如此先进,项目经理的角色仍然由人类担当,强调了人类在项目管理和决策中的不可替代性。最后,右侧展示了一个 AI 机器人“代码猴”,它或许正在编写或测试代码,暗示了未来 AI 在代码生成和初步开发中的作用。整个场景通过一个循环流程图连接起来,展示了从 AI 生成代码到人类审查,再到项目管理,最后又回到 AI,形成了一个封闭的工作循环。这张图展现了一个幽默而又深刻的未来视角,揭示了 AI 与人类专业技能如何在未来的软件开发中并行不悖。

雇佣 AI 机器人的成本

在前几天的 OpenAI 的 DevDay 中 API 再次降价, 将意味着利用 OpenAI 的 API 进行 AI 开发更加便宜, 这真是杀死了一堆大语言模型创业企业, 真是布局早的人就会制定整个行业的规则啊! (像极了Apple)

image.png
image.png
image.png

这三张幻灯片共同探讨了用人工智能(AI)替代软件工程师(SWE)的成本问题,并以幽默的方式对比了人类和 AI 在软件开发过程中的成本效益。

第一张幻灯片 描述了替换一个软件工程师的总成本。它提到一个典型的软件工程师的年薪是 220,000 美元,再加上福利、税收、免费餐饮、按摩服务、班车和其他福利,总额为 92,000 美元。将这些相加,一个软件工程师一年的总成本是 312,000 美元。考虑到一年有 260 个工作日,计算出每工作日的成本为 1,200 美元。

第二张幻灯片 展示了使用 AI(如 GPT-3)进行编程可能的成本。它根据平均每天提交的代码行数(大约 100 行),以及每行代码平均的 GPT-3 代币数(大约 10 个),以及 GPT-3 的价格(每 1,000 个代币 0.02 美元)来计算成本。基于这些数据,它估算出用 AI 替代人类软件工程师一天的工作量仅需要 0.12 美元。

第三张幻灯片 描述了使用 AI 机器人编程的一些特性。它指出机器人不需要休息,不需要免费午餐或按摩等福利,且无论是制作原型还是生产最终产品,所需时间长度都是一样的。然而,它也幽默地提到机器人可能会犯很多错误,只不过这些错误是“非常迅速地”犯下的。

自然语言计算机

image.png

这张图展示了一个称为“自然语言计算机”的概念。这种计算机是一种新型的计算基础设施,它使用自然语言“程序”来进行操作,不同于传统的编程语言。核心部分是一个大型的语言模型,如图中所示的 AI 图标和 Google 的 G 表示,这可能是指结合了多种 AI 技术和大数据处理能力的系统。

在这个系统中,语言模型具有短期和长期记忆,这使得它能够记忆和使用之前的交互,以更好地处理连续的任务。短期记忆可能用于当前的会话,而长期记忆则可以存储更持久的信息和上下文。

图中还显示了一个向量数据库(Vector DB),它可能用于存储和检索大量的数据向量,这些向量可以是语义表示,用于支持 AI 的理解和生成能力。

另一方面,“外部工具(周边设备)”可能指的是 AI 系统可以访问的外部 API 和服务,比如 Google 的 API 或其他互联网服务,以扩展其功能和获取外部数据。

最后,这个系统可以执行多个任务,这些任务由自然语言模型处理,并可能通过外部 API 和服务来完成。

总的来说,这张图描绘了一个复杂的 AI 驱动系统,它能够通过自然语言处理和多源数据整合来执行各种任务,展现了未来自然语言处理技术和人工智能在计算领域的集成和应用前景。

计算机领域的未来

image.png
image.png
image.png

这几张图片向我们展示了计算机科学(CS)领域的发展和对人工智能(AI)进步的适应。随着时间的推移,计算机科学越来越像电气工程(EE),成为一些高度专业化职业所需的更技术化技能集。这种进化表明,随着计算的日益复杂化,要在计算机科学领域取得成功所需的技能变得更加专业化和技术化。图片还强调了软件开发领域的重大转变。它认为,未来构建“软件”的大多数人不会进行传统意义上的编程;相反,他们将与 AI 系统互动。这反映了一个趋势,即软件开发的民主化,降低了进入门槛,允许能够用自然语言表达需求的个体无需编写传统代码就能创造软件解决方案。

我的观点

  1. 如今的 AIGC 想发展到完全替代传统程序员还面临着很多局限性, 比如硬件局限性就是一个需要挺久才能解决的问题 (但是前一阵子超导的事情是真的就不好说了), 但是这肯定是一个必然趋势, 因为说点实在一点的分析是, 我们不难看到国外的前沿科技企业都在把 AIGC 引到自己业务中, 无论未来如何发展, 起码整个行业现在都在布这个局! 所以传统程序员要有一些危机感, 要关注行业发展情况做出自己的学习计划调整, 不能再只局限于自己的技术栈了, 现在就算是栈溢出了也干不过 AI 啊
  2. 解决问题是编程的本质, 所以平时的学习中千万不要本末导致, 更多的学习一个东西的设计思想和解决思路将更加重要, 未来世界一定会越来越不需要循规蹈矩按照 todolist 完成一件又一件重复性的工作的人, 发挥你的想象力和创造性, 去悟每个解决问题的方法的本质 (比如最近重新学习数据结构的时候我的一个思考, 过去学习链表的时候, 根本没思考为什么要设计一个虚拟头节点, 就直接记住用就完了, 但是最新学习 UC Berkeley 的 CS61B 课的时候才理解了链表一步一步的设计历程, 其实这种思想远高于技术本身, 所以我们一定要更加重视这些设计思想, 用批判思维思考每件技术, 这样才能不是一个"工具人"! )
  3. 提升个人创新能力或专业性将是程序员未来生存的必要条件, 要么有超出常人的点子利用现有的 AI 工具快速开发软件打入市场吸引大量用户, 要么就是在自己的专业领域足够深入, 达到专家级别 (这个不知道随着 AIGC 发展会不会也有打破的可能)
  4. 对于知识的学习的框架要重于知识本身, 因为就目前的发展, ChatGPT 已经可以算个人的知识库了, 只要你有知识的框架, 其实你学任何东西只要把框架中的关键词输入 ChatGPT, 他就可以帮你解释了, 所以理清知识框架将是很重要的一个能力, 我估计未来也会有这样的知识库软件出现, 比如思维导图的节点可以使用 AI 进行生成或许更高级一点还能自己 fine-tune 这个知识库 GPT 模型
  5. 关于科研领域, 我觉得 AI 的可解释性将是一个非常有前景的研究领域 , 现在大语言模型依旧是一个大黑箱, 没人知道里面究竟发生了什么, 所以 OpenAI 也一直把这种技术称为涌现, 对于 AI 可解释性的研究将是推动未来行业发展的一个重要方向 (本人不搞科研, 这块也就是简单说一说看法, 行业大佬有想法的话在评论区向大家科普哈)
  6. Turn the AIGC effectively from Dark Art to A real Science, AIGC 生成内容的确定性和规范性将是一个很重要的课题, 因为 AIGC 生成的内容随机性很强, 怎么将这种随机性进行一个规制, 从而能够始终生成正确的代码和数据应该是 prompt engineering 领域的一个重点, 亦或是可以通过调模型参数实现
  7. 用自然语言明确表达自己的需求将是一个未来重要的能力, 而且本身自然语言就比编程语言带宽更宽 ,编程语言其实能描述和解决的问题范围一定低于自然语言, 这也是未来自然语言"编程"的可能性的一个论据
  8. 作为程序员,现在我们能用 AI 对开发提升哪些呢, 多用 Copilot 就行啦, 而且 Copilot Chat 现在还能针对写好的 API 自动生成测试代码, 属实够强劲了

结语

创作不易,整理写作这些内容花费了很大精力,希望大家能有所收获,最后有一个小彩蛋, 本文章存在很多 GPT 创造的内容, 相信大家应该都发现了吧 ( •̀ ω •́ )y, 最后祝看到这里的大家都要每天开心, 在学习的过程中也不要忘记生活, 毕竟这才是我们人类不同于 AI 的地方, 要学会取悦自己呀!!!


感谢您看到最后,如果本文对您有所帮助的话,还希望给我一个一键三连(狗头保命),如果对于我和我的文章感兴趣的话,欢迎点一个关注,您会收到我回答和文章的更新通知,也欢迎加入我建立的技术交流群 QQ:725133797 讨论交流。

最后附上我的个人博客站:Calvin Haynes的博客站,欢迎访问和交流

参考资料

  1. Large Language Models and The End of Programming - CS50 Tech Talk with Dr. Matt Welsh - YouTube
  2. GitHub Universe 2023 opening keynote - YouTube
  3. Programming language - Wikipedia
  4. Introducing GPTs
  5. OpenAI Data Partnerships
-------他日江湖相逢 再当杯酒言欢-------

Calvin Haynes
作者: Calvin Haynes ❉
Life is a journey, not a destination.


目录