近期,一系列关于AI编程的新产品和相关新闻引发热议,再次点燃了”AI是否会替代程序员”以及”是否还需要学习编程”的讨论。让我们不禁思考,这次大模型人工智能领域的首个颠覆性应用会不会出现在编程领域?仅仅两年前还被视为”金饭碗”的程序员行业,真的会被AI”砸了饭碗”吗?程序员这个职业还会继续存在吗?我们的年轻人和孩子们是否还需要学习编程呢?正是出于以上目的,本文希望通过理性的分析能够正面回答以上问题。
近期发生了什么?
首先,阿里最近发布了Qwen2.5-Coder系列编程模型。这是一个开源模型,包括0.5B、3B、14B和32B四个规模。根据测评结果,其中最大的Qwen2.5-Coder-32B-Instruct模型在代码生成、修复、推理和多语言支持方面的性能已达到GPT-4和Claude 3.5 Sonnet的水平。GPT-4和Claude 3.5 Sonnet代表了当前世界最高水平,分别来自OpenAI和Anthropic。GPT-4于8月发布,Claude 3.5 Sonnet则在10月推出。这意味着国内大模型仅用2-3个月就追赶上了全球顶尖水平。更令人惊讶的是,Qwen2.5-Coder是一个开源模型,这表明我们在大模型编程这一细分领域取得了巨大进步。当然,这些仍只是测评数据。Qwen2.5-Coder已集成到Cursor这个IDE中,未来还需依靠用户的实际使用体验来进行验证。
第二件事是在11月12日,李彦宏在2024百度世界大会上发布了结合AI和多智能体技术的无代码工具“秒哒”。李彦宏讲到“有了秒哒,一个人通过自然语言交互,就可以完成一整套系统的搭建,还可以做任意场景下的各种应用,应用的复杂度也会随着我们技术的提升不断提升”,“我是软件工程师出身,国外有一种说法叫‘软件吞噬世界’。但我认为,这个世界不应该被吞噬,而应该被创造。AI时代,应用创造世界。所以请大家和我一起见证,AI applications are creating the world。”
虽然”秒哒”要到明年才正式对外使用,目前无法试用,但它展示了大模型结合AI无代码平台的发展趋势。李彦宏传达了两个关键观点:自然语言可以替代传统编程语言,以及每个人都能成为程序员。
在2024年3月9日央视《对话》的开年节目中,李彦宏曾表达类似观点:“未来程序员这个职业基本上不会存在了。只要会说话,甚至不用写字,你就具备今天程序员的能力,这意义重大。未来的编程语言只会剩下两种:英文和中文,这也是目前人工智能技术最领先的两种语言。”显然,这一直是他的观点,并正在逐步实现。
如果你认为李彦宏的评估不太可靠,那么看看全球市值第一的公司——英伟达的CEO黄仁勋的看法。黄仁勋在年初的一次演讲中提到,生成式AI的发展大幅降低了学习编程的必要性。他认为人类应该专注于更重要的技能,如生物学、教育学、制造业或农业。他表示,所有人都不再需要学习编程,因为编程语言将成为人类的通用语言,现在世界上每个人都可以成为程序员,这就是人工智能带来的奇迹。此外,Stability AI的CEO Emad Mostaque也曾预言:”五年后,就不会再有程序员了”,表达了类似的观点。
几周前,谷歌首席执行官桑达尔·皮查伊在 2024 年第三季度财报电话会议上表示:”谷歌超过四分之一的新代码是由 AI 生成的,这些生成的代码再由工程师审查和接受。”
这些产品和新闻的连续爆发,引发了一个在业界和教育界经常被争论的话题:在人工智能大爆发的时代,未来的青少年或大学生是否还需要学习编程语言?程序员是否还有存在的价值?这个职业还会继续存在吗?
如果在2022年提出这些问题,可能会被视为天方夜谭。看看各大学计算机系那么多毕业生,外面那么多编程培训机构,互联网上那么多编程培训课程。这些学生毕业后主要从事的工作就是”码农”,也就是程序员。虽然”码农”是对这个群体略带嘲讽的说法——人们最多调侃一下他们头发少、爱穿格子衬衫、不苟言笑之类的——但他们毕业后能够进入大公司,拿到高薪,收入稳定,前途光明,是妥妥的优质白领。怎么突然就被认为可能会被社会淘汰呢?
什么是编程语言?
要讨论是否需要学习编程,我们首先需要了解编程语言的本质、起源和发展历程。让我们简要梳理一下编程语言的演变脉络。
在1940年代,世界上第一台计算机埃尼亚克(ENIAC)诞生时,还没有我们今天所说的编程语言。埃尼亚克没有存储代码的存储器,主要通过重新设置物理连接线来进行编程,需要操作数千个开关和电缆。这些开关和电缆的位置就代表了计算机程序。后来,冯·诺依曼结构提出了使用存储器存放程序的理念,由此产生了计算机编程的概念。简而言之,计算机编程就是设计和构建可执行计算机程序来完成特定计算任务的过程。从今天的角度来看,我们已经经历了四代编程语言的发展。
第一代编程语言是纯粹的机器语言(Machine language)。数字设备只能理解由1和0组成的原始二进制语言,没有编译器和汇编器。程序员通过线路控制面板或打孔带、打孔卡直接向机器下达指令,打孔代表1,不打孔代表0。这些指令集合就是计算机可以直接识别和执行的程序。早期计算机主要用于解决复杂的数学计算问题。机器语言运行速度快、效率高,但最大的缺点是一旦出错,代码极难修复。即使在现代程序中,开发人员偶尔也会使用机器级代码,特别是在编写系统底层功能时,如驱动程序、固件和硬件设备接口程序等。
第二代是汇编语言(Assembly language)。作为计算机专业的学生,我们曾经都学习过汇编语言,不知现在的学生是否仍在学习?汇编语言依赖于机器代码指令,每种汇编语言都针对特定的计算机体系结构。它是一种低级编程语言,其指令与计算机体系结构的机器代码指令有着强烈的对应关系。汇编语言通常一条语句对应一条机器指令,几乎是1:1的关系。同时,它还支持常量、注释、汇编器指令、符号标签,以及内存位置、寄存器和宏处理。
汇编语言曾广泛应用于各种编程工作,但从1950年代末开始,为提高编程效率,它逐渐被更高级的开发语言取代。然而,直到今天,汇编语言仍在特定领域发挥作用,如直接硬件操作、访问专用处理器指令或解决关键性能问题。它常用于开发设备驱动程序、低级嵌入式系统和实时系统。此外,汇编语言一直是8位家用计算机和8位游戏机的主要开发语言,如Atari 8位系列、Apple II、MSX、ZX Spectrum和Commodore 64等计算机,以及Atari 2600和Nintendo Entertainment System等游戏机。这些系统资源受限、内存和显示架构特殊,且系统服务有限。同时,适用于这些微型计算机和游戏机的高级语言编译器也很少,这使得汇编语言在这些领域大显身手。
第三代是高级编程语言,如Fortran、Basic、C和Java等。进入1960年代后,高级编程语言对机器语言进行了更高层次的抽象。它们通常不直接处理寄存器、内存地址和调用堆栈等底层操作,而是主要处理变量、数组、对象、复杂算术或布尔表达式、子程序和函数等,并使用循环、线程、锁等应用层面的计算机概念。这种抽象让程序员能够与计算机硬件分离,专注于计算逻辑和应用逻辑的处理,而无需关心底层硬件配置。高级编程语言更注重代码的可用性、可读性、可解释性、可维护性和健壮性,而非追求最优的程序执行效率。
世界上第一个为计算机设计的高级编程语言是普兰卡尔库尔(Plankalkül),由德国计算机之父康拉德·楚泽在1943年至1945年间设计。但受限于当时的计算机硬件,这门语言并未得到实际应用,也鲜为人知。直到2000年,它才在柏林自由大学首次成功执行。
而真正投入使用的第一个高级编程语言是IBM公司的约翰·巴克斯发明的Fortran语言,于1958年首次成功编译。Fortran主要用于支持科学和工程应用,如数值天气预报、有限元分析、计算流体动力学、等离子体物理学、地球物理学、计算物理学、晶体学和计算化学等领域。它是一种广受欢迎的高性能计算语言。此后出现的几种高级语言都反映了计算机的发展和普及历程。
Basic语言是由达特茅斯学院的约翰·凯梅尼为推广分时系统和普及大学生教育而开发的简单编程语言。其中最著名的用户当属微软公司创始人比尔·盖茨。他在高中时期就开始使用BASIC编程。后来,盖茨与保罗·艾伦和蒙特·大卫杜夫为他们新成立的公司MicroSoft共同开发了第一个微型计算机版本的BASIC,这最终演变成了Microsoft BASIC。当微软在1990年推出Windows 3.0时,计算机进入了图形用户界面时代,基于文本命令行的BASIC似乎已经落伍。微软接过了凯梅尼的衣钵,推出了基于Windows的BASIC版本,名为Visual BASIC。VB继承了BASIC的传统,成为编程初学者的必备工具。
C语言由丹尼斯·里奇在20世纪70年代创建,至今仍是计算机领域的核心语言。从现在的角度来看,C语言既是高级语言,又是低级语言,因为它与计算机硬件指令集密切相关。然而,它又不直接依赖于特定的硬件设备,开发者可以在任何支持C语言的机器上轻松编写程序。C语言在流行度、影响力和重要性方面多年来几乎从未跌出开发语言排行榜前三名。没有其他语言能在优雅度、表现力、效率和简洁性之间达到如此平衡。C语言还启发了许多后来的编程语言,包括C++、苹果公司的Objective-C和微软的C#。
Java语言体现了面向对象编程的特征,由詹姆斯·高斯林于1991年6月发起Java语言项目。Java最初属于Sun公司,后来Sun公司被Oracle收购。Java是一种高级、基于类、面向对象的编程语言,其设计目的是尽可能减少实现依赖性。它是一种通用编程语言,旨在实现”一次编写,到处运行”的理念,这意味着编译后的Java代码可以在所有支持Java的平台上运行,无需重新编译。Java应用程序通常被编译为可以在任何Java虚拟机(JVM)上运行的字节码,不受底层计算机体系结构的限制。
第四代编程语言更接近人类自然语言,例如Python、Ruby和SQL等。这些语言伴随着互联网和人工智能时代应运而生。其中,由荷兰人吉多·范罗苏姆创立的Python语言尤为引人注目。Python支持动态类型和自动内存管理,支持多种编程范式,包括结构化(特别是过程式)、面向对象和函数式编程。它的最大特点是拥有全面的标准库,常被描述为”自带电池”的语言。Python一直被评为最流行的编程语言之一,在人工智能和机器学习社区中广泛使用。如今,许多编程初学者都选择Python作为他们的入门语言。
当然,世界上的编程语言数不胜数,有些昙花一现,有些经久不衰。一门语言的成功不仅取决于其自身能力,还与其生态环境密不可分,包括编程社区的活跃度和主流平台的支持情况等。这个话题可以展开很多,相信懂行的人都心知肚明。
总结编程语言的演变,我们可以看出哪些特征?编程语言与人类自然语言的根本区别在于:自然语言用于人与人交流,而编程语言则是人类向机器传达指令的工具。实际上,这涉及三者关系的变化:人(使用自然语言,主要是英语)、编程语言(作为人机沟通的桥梁)和计算机(执行人类意图的应用程序,背后运行的就是这些代码)。
编程语言面临双重挑战:一方面需要解决计算机端的问题,如硬件依赖、软件依赖和跨平台运行;另一方面,在用户层面,要追求语法简洁规范、易于使用现有代码资源、便于维护,并尽可能接近人类自然语言。然而,自然语言最大的问题是缺乏标准化和规范性,因此编程语言一直在自然表达和标准规范之间寻求平衡。
纵观编程语言的发展历程,我们可以看到它正逐步向人类自然语言靠拢。因此,人工智能推动编程向自然语言过渡的趋势,也就顺理成章了。从当前来看,编程语言并不会消失。只要计算机的基本范式——冯·诺依曼结构——保持不变,向机器传达指令的需求就会一直存在。编程语言的消失需要计算机本身发生根本性的变革,或者计算机彻底消失。
软件的未来是什么?
既然编程语言将继续存在,那么用编程语言编写的软件是否会消失或停滞不前呢?答案同样是否定的。事实上,计算机对软件的需求正在不断增加,范围也越来越广。我们常听到”软件吞噬世界”和”软件定义一切”这两个说法,它们恰好代表了软件发展的广度和深度。
“软件吞噬世界”体现了软件发展的广度。这个概念源自 Marc Andreessen 于 2011 年 8 月在《华尔街日报》上发表的文章《Why Software Is Eating the World》。文章站在 2010 年代的起点,回顾了互联网、智能手机和云计算对商业社会的变革,同时预见了软件将进一步重塑汽车、零售、物流、金融、医疗保健和教育等传统行业。
从协作办公到销售营销,从人力财务到 IT 安全,软件以 SaaS 的商业模式渗透进企业业务流程的每个环节。在 Microsoft 和 Oracle 主导的时代,企业软件以功能全面性著称,而在 SaaS 时代,软件则专注于特定环节或行业。例如,自动化平台 Zapier 在 10 年间连接了 6000 多个企业软件的应用程序接口(API),成为一家仅融资一轮就实现盈利的独角兽公司。API(即”接口”)虽然不是为 SaaS 设计的,但由于 SaaS 需要与企业客户对接,开放可编程接口成为必备特性。同时,开源软件社区的壮大使得技术栈中越来越多的开源代码需要通过接口相互连接、调用,形成了一个基于”接口”的软件生态。在这个生态中,每家公司专注于做好一件事,其他难以解决的问题则通过其他公司的接口来解决。这不仅是一种软件开发哲学,也是商业生态的网络效应,更是资本投入的高效杠杆。
“软件定义一切”则体现了软件发展的深度。过去,硬件和软件的界限非常清晰。但近年来,”软件定义某某”成为信息技术的热点术语。这一概念始于”软件定义网络”(Software-Defined Network,SDN)。传统网络体系结构中,网络资源配置主要是对每个路由器/交换机进行独立配置,网络设备制造商不允许第三方开发者重新编程硬件,控制逻辑都以硬编码方式直接写入交换机或路由器。这种”硬件为中心”的网络体系结构复杂性高、扩展性差、资源利用率低、管理维护工作量大,难以适应上层业务扩展演化的需求。2011 年前后,SDN 开始广泛应用于数据中心的网络管理,取得了巨大成功,重新”定义”了传统网络架构,甚至改变了传统通信产业结构。在 SDN 之后,又相继出现了软件定义存储、软件定义环境、软件定义数据中心等概念。可以说,针对泛在化资源的”软件定义一切”(Software-Defined Everything,SDX)已成为一种趋势。
“软件定义一切”已然成为一种客观需求,并呈现快速发展态势,其主要体现形式将是软件的”基础设施化”。这不仅是因为在数字经济时代,人类社会经济活动高度依赖信息基础设施,而软件是信息基础设施的重要组成部分;另一方面,软件也将”重新定义”传统物理世界基础设施和社会经济基础设施,对人类社会的运行乃至人类文明的进步起到重要的支撑作用。
那么,未来这两个概念会不会演变为”AI 吞噬世界”和”AI 定义一切”呢?
在大模型爆发前,我们已经做了什么?
在大模型出现之前,人们就一直在尝试简化编程或利用自然语言进行编程。这些努力主要体现在两个方面:集成开发环境(IDE)和低代码(Low-code)平台。
首先,从工具层面来看,IDE 是最传统也最常见的解决方案。对初学者而言,IDE 的直观性和易用性能显著降低学习编程的门槛。达特茅斯 BASIC 是首个使用 IDE 创建的语言,也是首个设计用于在控制台或终端前使用的语言。它的 IDE(作为达特茅斯分时系统的一部分)是基于命令行的,集成了编辑、文件管理、编译、调试和执行等基本功能。
世界上第一个软件集成开发环境 Maestro I 由慕尼黑 Softlab 公司开发。截至 1989 年,Maestro I 已在全球安装了 22,000 个实例,其中 6,000 个在德国。Maestro 在 20 世纪 70 年代和 80 年代可谓是该领域的领军者。
随着时代发展,IDE 的功能不断丰富。现代 IDE 通常包含三个核心组件:源代码编辑器、编译器/解释器和调试器。除了基本的代码编辑功能外,IDE 还提供语法高亮、代码格式化、版本控制和代码搜索等功能。许多 IDE 还支持插件扩展,让用户能根据需求定制功能。
早期的 IDE 往往与特定编程语言和平台绑定,如苹果的 Xcode 和微软的 Visual Studio。随着 Java 的普及,从 Eclipse 到 IntelliJ IDEA 的发展,IDE 的通用性有所提高。然而,IDE 始终是程序员的辅助工具,本质上是高级代码编辑器,核心的处理逻辑和代码仍需程序员手动编写。
随着时代进步,业界逐步发展出另一种降低编程难度的方法——低代码(Low-code)。这催生了低代码开发平台(LCDP)。低代码的理念其实早已渗透到传统开发平台中,但多局限于特定领域。例如,业务流程管理系统(BPMS)允许用户通过拖拽节点来配置业务流程;报表平台让用户能轻松将数据拖入预设的报表格式;前端开发工具支持通过拖拽控件来完成页面布局。这些操作往往不需要专业程序员,经过培训的业务人员就能胜任,他们被称为”高级用户”(Power User)或”公民开发者”(Citizen Developer)。
低代码开发平台通过代码封装和预制模块,结合用户友好的拖拽界面,致力于用最少的传统”手工编码”来实现应用程序的快速创建、设置和部署。然而,低代码平台也有其局限性:它们多数专注于特定领域,且各平台之间互不兼容。当用户需求超出平台支持范围时,仍需要传统编码来解决。
一些功能更为完善的低代码平台甚至被称为”无代码”平台。但这类平台往往限制更多,自定义功能有限,且深度依赖于特定供应商,难以后期修改或迁移。因此,在遇到复杂开发问题时,仍然需要专业程序员介入。所谓的低代码和无代码平台,更多是用于简单的应用生成或逻辑配置,与真正的软件开发工作仍有较大差距。
那么,既然已有多年积累的 IDE 和低代码平台,为何还会出现”AI 替代人类编程”的讨论呢?这背后的原因是大模型的出现。大模型,本质上是大语言模型,它最擅长处理语言。而编程语言——经过几十年积累的高度结构化、规范化、高质量的语言——恰恰符合大模型的专长。因此,从目前来看,大语言模型在应用层面最成功的领域可能就是编程了。
大模型的爆发带来了什么?
2020年,OpenAI发布了基于Transformer架构的GPT-3。尽管当时在自然语言处理方面还有不足,但它已展现出强大的编程能力。全球最大的代码库GitHub敏锐地察觉到这一潜力,随即打造了GitHub Copilot——一款编程”副驾驶”。当时,业界普遍认为AI无法完全替代程序员,而是作为辅助编程或结对编程的工具。
Copilot最初由OpenAI的Codex模型提供支持。Codex是基于GPT-3,经过数十种编程语言、数以千兆字节计的源代码训练而成的领域大模型。OpenAI将GPT-3独家授权给GitHub的母公司微软,因此微软后续推出的Office AI版本也被称为Copilot。
2022年2月,计算机协会发布了一篇论文,评估了GitHub Copilot在培训新手程序员方面的影响。研究发现,当时Codex大模型的平均表现已优于大多数学生。然而,在解决具体问题时,如判断使用条件、集合和循环等功能,大模型的表现仍有不足。研究结论指出,Copilot有助于编程学习,但也可能导致过度依赖和代码抄袭。值得注意的是,这项评估是在2022年进行的。到2023年11月,Copilot已升级使用OpenAI最新的GPT-4大模型,其能力已有质的飞跃。
近期,GitHub宣布Copilot将采用多模型策略,不再单一依赖OpenAI的GPT模型。这一决策旨在满足不同开发场景的需求,因为各模型在不同编程语言或任务类型上各有所长。新策略下,GitHub Copilot将引入Anthropic的Claude 3.5 Sonnet和谷歌的Gemini 1.5 Pro。此外,GitHub推出了全新的AI原生开发环境——Copilot Workspace,帮助开发者利用自然语言快速从构思到代码实现。Copilot Workspace已在2023年的用户会议上亮相,目前处于技术预览阶段。GitHub还推出了基于自然语言的应用开发工具Spark,适用于非专业开发者快速创建简单应用,同时为专业开发者提供精细调整功能。
而真正震撼程序员界的是另一款软件Cursor。Cursor集成了Claude 3.5 Sonnet、GPT-4等先进模型,现在还能整合Qwen的代码模型。它提供实时代码建议、错误检测和自动重构功能。Cursor的独特之处在于其聊天窗口操作方式,使得即便完全不懂代码的人也能在短时间内运行功能齐全的应用程序,并不断添加新功能。这一突破性进展,让编程真正走向了大众化。
Cursor引起轰动的标志性事件是Cloudflare公司副总裁8岁女儿的操作展示。这位小女孩仅用45分钟就搭建了一个聊天机器人应用,整个过程通过直播向180万在线观众展示。OpenAI创始成员、被誉为”赛博菩萨”的大神Karpathy看后,盛赞并向用户推荐Cursor。Cursor的便捷性令人惊叹,用户只需修改一行代码格式,然后按几次Tab键,整个文件的格式就能自动调整完毕。Karpathy在X上大胆预言,未来编程可能只需”狂按Tab键”就能完成。另有一位用户仅通过语音指令,利用Cursor AI+Voice在5分钟内构建了一个财务仪表盘应用。更有甚者,有人仅用3周时间,借助Cursor写出11000行代码,构建了一个支持网页和移动端的视频编辑器。
Cursor背后的公司Anysphere由4位MIT高材生创立。2023年8月时,Cursor团队仅有5人。即便到今天,这个团队依然保持小而精的特色:仅由12名工程师和研究人员组成。公司成立初期就获得OpenAI青睐,在首轮融资中获得800万美元,占比72.7%。有趣的是,Cursor最近的爆红却主要依靠OpenAI竞争对手Anthropic的Claude-3.5-Sonnet模型,同时也整合了前文提到的Qwen2.5-Coder。目前,Cursor的用户流量已超过了AI代码编辑器界的先驱GitHub Copilot。
Cursor AI的设计注重操作简便性,界面简洁,用户体验出色,使开发人员能够轻松上手。它的另一大优势在于个性化编码能力,在实时代码建议、错误检测和代码重构方面表现卓越。随着使用时间增加,Cursor AI的学习算法能够适应用户的编码风格,提供更加个性化、更符合用户需求的建议。相比之下,GitHub Copilot在多语言支持和自然语言处理方面略胜一筹。
目前,国外AI编程软件市场主要由这两款产品主导。国内市场也不甘落后,涌现出多个对标产品,包括阿里的通义灵码、蚂蚁集团的CodeFuse、百度的Comate和科大讯飞的iFlyCode。这些产品大多基于各自的大模型,再加上专门的代码库训练而成。此外,更多传统IDE厂商也开始行动,借助第三方大模型来增强原有IDE的功能,如神码的Code Master。关于AI辅助编程的话题,我们在之前的节目中有专门探讨过。
正是这些AI辅助编程或替代编程工具的出现,引发了业界”编程已死,程序员将被取代”的论调。这种观点让正在学习编程的大学生感到恐慌,担心毕业后难以就业。同时,也让正在为孩子选择编程培训的家长产生困惑,不知是否应该继续让孩子学习编程。因此,今天我们将深入探讨这个问题,试图得出一些有价值的结论。
哪些编程能力是AI无法替代的?
既然编程语言不会消失,IDE和低代码平台也无法让所有人直接上手,Copilot还在当副驾驶,那么编写、使用和管理这些开发语言的人必然存在。不论这些人是否被称为”程序员”,或以何种方式编写或使用编程语言,这些角色都将继续存在。
随着AI能力不断增强,我们需要思考:这是否意味着每个普通人都能胜任这些角色?还是说,这些岗位仍需要特定的专业素质和能力?这个问题直接关系到”程序员”这一职业是否会继续存在。
让我们设想AI发展到极致的情况:假设AI能帮你写出所有你想要的代码,那么哪些能力仍然至关重要?
AI确实能理解自然语言并转换为计算机代码,但前提是你能清晰、准确地表达自己的想法,且表述不存在歧义——即不同人看到这段描述时理解是一致的。
这看似简单,实则困难。有多少人能准确描述自己的需求,表达严谨的逻辑和规则?举个例子,假设你要让计算机给你一杯水,你需要详细描述:水的类型(矿泉水、自来水还是开水)、温度及其形成方式(烧到特定温度还是烧开后再冷却)、水量、容器大小、溢出处理方案、容器破损的应对措施等。即便解决了这些问题,还要考虑如何将水送到你手中,以及运送途中洒水的处理方法。你认为普通人能向计算机清晰表达这些细节吗?也许你会说,我们日常使用的设备似乎不需要如此复杂的要求就能满足需求。但这是因为软件程序已经默默完成了这些工作,或为你设定了默认值,使你作为用户能够简单使用。然而,现在的角色转变了,你需要设计和完成这个”倒水”应用,这就是关键区别所在。
而能够用逻辑方式清晰表达需求的能力,恰恰是多年从事编程的程序员所具备的——这就是所谓的”编程思维”。编程思维不仅仅是编写程序的技巧,而是一种解决问题的思维方式。它强调将问题分解成更小的部分,然后逐个解决。编程思维的核心是抽象、模块化和自动化。
抽象是指将问题简化为更基本的概念。例如,在编写一个计算两数之和的程序时,我们可以将问题抽象为”将两个数字相加”。
模块化是指将问题分解成更小的部分。例如,在编写一个绘制正方形的程序时,我们可以将问题分解为以下几个步骤:
绘制一条线
旋转90度
再绘制一条线
再旋转90度
重复步骤1到4,直到绘制完成
传统的编程思维可以分解为以下几个要素:
问题分解:将复杂的大问题拆解成更可执行、更易理解的小步骤。例如:如何制作汉堡包?我们可以将汉堡包分成几个部分:最上层的圆面包、生菜、西红柿、奶酪、牛肉饼、下层的圆面包。
模式识别:识别问题中的相似模式和重复性(找出规律)。例如,看到水里鱼的鱼鳍,就知道那是用来游泳的。
抽象:将问题简化为更基本的概念(聚焦最重要的信息,忽略无关细节)。从事物中提取特征,比如长方形都有四个角。
算法设计:设计逐步解决问题的路径(设计解决方案)。例如排序算法、分类算法等。这也是计算机考试中经常考察的内容。
代码实现:使用编程语言将算法实现为计算机程序(实现设计)。
随着AI能力的提升,问题分解、模式识别和抽象能力仍然必不可少,但算法设计可能会演变为更注重逻辑清晰度的过程。例如,计划一天的日程安排:早上7:00起床、上午9:00去学校、下午15:00做运动、晚上21:00睡觉。如果前几步都是思考问题的话,那么最后一步”代码实现”可能会变为用严谨的自然语言表达。当你理清了所有内容,关键在于你是否能用自然语言清晰地表达出来。
对于前三项内容——解决问题、模式识别和抽象——听起来简单,但并非人人都具备这些能力。即使作为受过良好训练的大学生,当面对专业领域的问题时,你仍然需要专业的思考和理解能力。这就是除了编程思维外,程序员所需要的第二项重要能力:对专业领域的思考、理解和建模,以及使用专业术语的表达能力。
实际上,传统的企业计算机应用领域也存在这个问题。例如,财务人员通过自然语言表达的业务逻辑需要转换成专业的财务术语,如借方和贷方、余额、轧差和科目等,然后再从财务语言转换成编程语言。这就是我们常说的从需求到需求分析,再到编码的过程。
我们看到很多人利用AI的例子都是面向消费者(C端)的应用,而非面向企业(B端)的。即便是C端程序,比如开发一个音频播放器,你真的了解什么是一个优秀的播放器吗?还是仅仅在模仿现有软件?模仿的意义有多大?世界需要劣质的模仿者吗?所以即使是C端应用,依然需要开发者能够专业而准确地表达自己的需求。
因此,即使AI能够理解自然语言,我们仍然面临着如何将自然语言有效转换为专业语言的挑战,以及确保这种专业语言适合编程的问题。这仍然需要专业人员的培养和长期积累的经验。在这个过程中,我们还需要帮助AI解决一些涉及上下文和认知的通识问题。尽管AI可能在更广泛的领域具备通识能力,但它是否真正理解特定领域的通识和上下文呢?
除了具备编程思维和专业领域的理解能力外,程序员还需要完成最后一项关键工作。当我们面对复杂问题时,仅仅通过简单的自然语言表达是否足够?我们是否需要借助图表、示例、公式等更复杂的表达方式?甚至是照片或视频等更直观的说明方式?为了清晰表达一个概念,我们可能需要运用各种手段。而这些综合表达的内容,AI真的能完全理解并准确地生成相应的代码吗?我认为这是非常具有挑战性的。
这最后一项工作就是填补AI无法完全理解或连接的部分,解决程序开发”最后一公里”的问题,成为连接和补充的关键角色。目前,许多AI生成内容(AIGC)工具并不支持直接修改,而是重新生成内容,这并不是一种理想的方式。
如果要求人来完成这”最后一公里”的工作,他们需要具备什么能力?那就是能够发现AI的缺陷并解决更深层次的问题。在这个过程中,即使你可能不完全了解编程语法,但你必须能识别AI的漏洞和未完成的部分。这需要程序员与AI助手反复协作才能完成。
此外,目前AI在编程的工程化能力方面还相对薄弱,特别是在代码框架和整体架构的理解上还有待提高。不过,随着AI能力的不断提升,这一点可能会得到改善。
因此,在可预见的AI未来中,程序员在编程过程中仍然需要担任多个关键角色:开始时进行分析,建立模型,寻找逻辑,搭建框架,清晰表达需求,发现bug,最后协助AI完成”最后一公里”的工作。
正是基于这些原因,近期关于AI在科研论文方面的研究结果颇为有趣。这些发现与编程领域的情况基本一致:整体产出增加,顶尖人才获益最多,而基层人员(除了从事体力劳动的蓝领工人)的价值增量接近于零。
如果这类专业人群仍然需要具备编程思维、专业能力以及程序补充和连接的能力,那么”程序员”这一职业必将继续存在。只是他们的角色将发生转变,能力要求会有所变化,工作方式也会随之调整,最终导致效率的显著提升。
未来我们应该接受什么样的编程教育?
最后,让我们探讨如何教育孩子或培养该专业的人才。教育问题可分为两个部分:儿童青少年的编程教育和面向社会的职业教育。在中国,这两者构成了两个主要的教育体系。
少儿或学生教育一方面来自学校,另一方面来自众多社会培训机构。然而,将孩子引向这个领域的主要是家长,而非培训者本身。因此,家长的认知至关重要,而评价标准则来自比赛、考试和证书。
职业教育则一方面来自社会培训机构,另一方面更多来自用人单位的入职培训和在职培训(即”On-the-job training”)。这种教育更多依赖于受训者自身的认知,其评价标准主要基于实际应用和实战效果。
如今,家长为何要让孩子学习编程呢?有些人可能是洞察了大趋势,例如我们刚才讨论的软件和计算机的普及。在他们看来,编程就像外语和开车一样,是一项普及化的技能,应该让孩子掌握。还有一些家长可能认为学习编程能帮助孩子将来找到好工作,以谋生为目的。也有一些家长,纯粹是为了让孩子参加竞赛或获得证书,以便为高考加分,进入好大学。
如果您属于第一种目的,我们可以深入讨论。但如果是后两种目的,我建议您可以重新考虑。首先,科技发展日新月异,技术变化迅速。如果出于就业目的,我们根本无法预测现在高考报考的专业四年后是否还有市场,更不用说具体的编程技能了。这就像学习了一门外语,毕业后却发现世界上已经没有人使用这种语言了。而对于那些只为了考证的家长,考虑到计算机编程的快速变化,今天的证书在未来是否还有意义值得商榷。如果证书失去意义,教育部门制定政策的人也会意识到这一点。如果真的是为了考证,不如去学习奥数,因为数学这类基础能力目前看来仍然经久不衰。
如果是出于第一种目的,我们就必须思考:少年儿童在计算机编程培训中应该学习什么?培训老师又该教授什么?
实际上,在儿童教育领域,有一些专门用于教育的入门级编程语言,它们是简化版或定制版的编程方式。最早用于教育的编程语言叫做Logo。Logo 是由Wally Feurzeig、Cynthia Solomon和Seymour Papert于1967年在马萨诸塞州剑桥的一家研究公司Bolt, Beranek and Newman (BBN)创建的。它的知识基础植根于人工智能、数理逻辑和发展心理学。在最初的四年里,Logo的研究、开发和教学工作都在BBN进行。其目标是创造一个数学王国,让孩子们可以在其中玩转单词和句子。虚拟海龟的使用使得即时视觉反馈和图形编程的调试成为可能。第一个可用的Logo乌龟机器人诞生于1969年,展示用的虚拟海龟先于实体地面海龟出现。Logo最早的一年制学校用户是1968-69年马萨诸塞州列克星敦的Muzzey Jr.高中。虚拟海龟和实体海龟于1970-71年首次由同一城市桥梁学校的五年级学生使用。
2000年代初,麻省理工学院媒体实验室的终身幼儿园小组(LLK)开始开发针对儿童的可视化编程语言。2003年,Mitchel Resnick、Yasmin Kafai和John Maeda获得了国家科学基金会的拨款,用于开发新的编程环境,让儿童能够用代码表达自己。由Mitchel Resnick领导的LLK与UCLA的Yasmin Kafai团队合作,并与波士顿和洛杉矶的计算机俱乐部密切合作,开发了Scratch。Scratch的设计立足于这些课后青少年的实践和社交动态。它最初是一种基本的编程语言,没有标记类别,也没有绿旗。与AgentSheets类似,Scratch采用了触觉编程的概念,后来被称为基于块的编程。这也是Scratch编程以及著名的在线编程教育网站Code.org的起源。
Scratch是一种高级、基于块的可视化编程语言和网站,主要作为面向8至16岁儿童的教育工具。网站用户可以使用块在网站上创建类似界面的项目。Scratch的构思和设计是通过美国国家科学基金会授予Mitchel Resnick和Yasmin Kafai的合作资助实现的。Scratch由麻省理工学院媒体实验室开发,已被翻译成70多种语言,在世界大部分地区广泛使用。
Scratch界面分为三个主要部分:舞台区域、块调色板和编码区域。用户可以在编码区域放置和排列块,形成脚本,这些脚本可以通过点击绿色旗帜或直接点击代码本身来运行。用户还可以创建自己的代码块,这些自定义代码块将显示在”我的块”部分中。
如今,国内大多数编程教育软件都是基于Scratch的,例如编程猫、猿编程等。目前,这些软件多以游戏包装的形式进行思维训练,教学方式大同小异,主要区别在于教师的引导能力和表达能力。
如果少儿教育或学校教育属于某种知识的普及,学会编程并不意味着一定要从事这项专业工作。职业教育则不同,其培训编程的目的是为了就业。那么,我们需要问:就业的目标是什么?是成为程序员吗?如果是,我们就必须回到一个关键问题:程序员这个职业会不会消失?让我们先看看已经消失的职业有哪些,它们具备什么特征?
例如,电报收发员随着通信技术的发展而消失;打蜂窝煤的职业因天然气、液化气等清洁能源的普及而逐渐消失;底片冲洗工因数字摄影技术的发展而被淘汰;电话接线员和BP机传呼员因程控交换机的普及而变得多余。
这些例子说明,当生产资料不再存在时,相应的生产者也就不存在了,职业随之消失。但我们前面已经论证过,编程语言和应用程序是不会消失的。这意味着对程序员而言,他们的”原材料”(编程语言)和”产品”(应用程序)仍然存在。从这个角度看,程序员这个职业应该不会消失。
然而,你可能会指出另一类职业:虽然生产资料仍然存在,但由于自动化程度提高,社会需求保持不变或减少,导致从业者数量减少。例如高速收费员、报刊亭老板、公交售票员、裁缝等。这些职业并非完全消失,而是变得稀少或需要转型。比如,传统的车工、铣工、刨插工、磨工、钳工向数控领域转变,生产制造的精度和效率得到极大提高。
这类职业的转型启示我们,程序员可能需要职业能力的转型。根据我们前面分析的三种能力(编程思维、专业能力,框架补齐和串接),随着AI逐步替代人类的基础编程能力,程序员这个职业可能需要重新定位。
如果在儿童教育或学校教育中已经培养了编程思维,那么新的职业教育方向应该聚焦后两种能力。专业能力要求与你所服务的行业有关,无论是医疗、金融、电信还是政府部门,程序员都需要熟悉该行业的专业术语和逻辑规则。而搭建框架、补齐和串接代码的能力则更加困难,因为这需要实战经验,仅通过职业教育很难完全掌握。
因此,一个理想的编程教育结构是:在儿童和少年时期培养编程思维,了解世界运行的方式,消除对计算机的神秘感,学习在约束条件下解决问题的能力,将编程视为创造和改造世界的一种手段。在入职前,学习特定领域的专业知识,熟悉行业术语,了解各个领域的运作机制。而最具挑战性的方面——搭建框架和补齐串接能力的培养,则需要通过工作中的持续实践来完成。
由此可见,社会对程序员的需求正在发生变化。未来可能不再需要如此庞大的程序员队伍,而是分为两类:一是高端开发人才,他们精通架构、原理、机制和AI,堪称全能型战士;二是专业的一般性开发人才,他们深谙特定行业、领域,并熟悉AI技术。如果程序员无法在这两个方向上发展,很可能面临被淘汰的风险。
这种趋势在近期的程序员裁员中已有体现。高端开发人才仍然供不应求,而熟悉特定领域的企业对企业(2B)程序员也相对安全。相比之下,从事企业对消费者(2C)领域的中端程序员,如果缺乏专业知识、人脉和资源积累,又要求较高薪酬,就更容易成为裁员的主要对象。