不仅仅是在目力所及的范围内,没有发现银弹,而且软件的特性本身也导致了不大可能有任何的发明创新——能够像计算机硬件工业中的微电子器件、晶体管、大规模集成一样——提高软件的生产率、可靠性和简洁程度。我们甚至不能期望每两年有一倍的增长。

——《人月神话》Frederick P. Brooks, Jr.

欲知大道,必先为史

——《尊史》龚自珍

已有的事,后必再有;已行的事,后必再行。日光之下,并无新事。

——《圣经·传道书》第一章第九节

最近越来越多的人在问我,写程序的未来在哪?编程究竟意味着什么,我想到了几年前图形化编程,低代码平台的冲击犹在眼前,这次会不一样吗?然后,又想起了当时在scartch和minecraft Mod里面耗散的时光,在build过程中获得的快乐,若有所思,收集些资料和关键词,与大家共同分享体会。

一、编程语言发展史概论:从硬件操作到思维表达的演进

1.1 机器语言时代:程序员即硬件工程师

在计算机发展的黎明时期(1940年代),编程的本质是直接操作硬件。程序员需要精确地了解计算机的物理结构——寄存器、内存地址、指令集,每一个操作都对应着具体的电路开关状态。这个时期的程序是纯粹的二进制序列,由0和1组成,直接控制着电子管的通断。

典型特征

  • 绝对控制:程序员对硬件拥有完全的控制权,可以精确到每一个时钟周期

  • 高度耦合:程序与特定硬件架构深度绑定,更换CPU意味着完全重写

  • 开发效率极低:一个简单的排序算法可能需要数百行机器指令

  • 调试困难:错误表现为硬件故障或不可预测的行为,缺乏有效的调试工具

这个时期的程序员更像是硬件工程师的延伸,他们需要同时理解电子电路和数学逻辑。著名的ENIAC计算机(1946年)的程序员团队由六位女性数学家组成,她们通过手动插拔数千根电缆和设置开关来"编程",每次修改程序都需要重新布线,整个过程更像是在进行物理电路设计而非我们今天理解的软件开发。

1.2 汇编语言的诞生:符号化的进步

1950年代初,汇编语言的出现是编程史上的第一次重大抽象。程序员不再需要记忆二进制指令码,而是可以使用助记符(如ADD、MOV、JMP)来编写程序,然后通过汇编器将其转换为机器码。

技术突破

  • 符号化表示:用人类可读的符号代替二进制代码

  • 宏指令:可以定义重复使用的代码片段

  • 相对地址:使用标签而非绝对内存地址

然而,汇编语言仍然与硬件架构紧密相关。不同厂商的CPU有不同的指令集和寄存器组织,为IBM 704编写的汇编程序无法在UNIVAC上运行。这种平台依赖性严重限制了软件的可移植性和复用性。

1.3 高级语言的革命:Fortran的开创性意义

1954年,IBM的约翰·贝克斯(John Backus)向公司管理层提交了一份提案,建议开发一种"自动编程系统",让科学家和工程师能够用数学公式的形式编写程序。这个项目最终催生了Fortran(FORmula TRANslation)语言,于1957年正式发布。

Fortran的核心创新

  1. 数学表达式语法:允许直接书写如 A = B + C * D 这样的表达式

  2. 变量类型系统:引入了整数、实数等数据类型

  3. 控制结构:提供了DO循环、IF条件判断等结构化编程元素

  4. 子程序机制:支持函数和子程序的独立编译和调用

1.4 编程语言的分化与专业化

Fortran的成功激发了编程语言设计的黄金时代。随后的几十年里,各种针对不同应用场景的语言相继诞生:

  • COBOL(1959):面向商业数据处理,强调数据描述和文件处理

  • LISP(1958):人工智能和符号计算,引入了函数式编程范式

  • ALGOL(1958):算法描述的标准,影响了后续大多数语言的设计

  • C(1972):系统编程语言,在抽象和效率之间找到了平衡点

每一次语言创新都在不同维度上提升了抽象层级:从机器细节到数学表达,从过程控制到对象封装,从同步执行到并发模型。这个演进过程的核心逻辑是不断将偶然复杂度封装到语言和工具链中,让程序员能够更专注于问题本身的本质复杂度。

1.5 现代编程语言的收敛趋势

进入21世纪后,编程语言的发展呈现出明显的收敛趋势。大多数主流语言(Python、Java、C#、Go等)都提供了类似的抽象能力:

  • 垃圾回收:自动内存管理

  • 丰富的标准库:内置数据结构、网络、文件操作等

  • 包管理生态系统:庞大的第三方库支持

  • 跨平台支持:一次编写,多平台运行

这种收敛反映了软件开发范式的成熟:经过70年的探索,业界已经就"什么是好的抽象"达成了基本共识。程序员不再需要从零开始构建基础设施,而是可以在现成的抽象基础上快速构建应用。


二、高级语言诞生之初:控制力与性能的质疑及其历史回应

2.1 来自汇编阵营的激烈反对

当Fortran首次亮相时,它遭遇了来自传统汇编程序员群体的强烈抵制。这种抵制不仅仅是技术层面的质疑,更反映了两种截然不同的编程哲学冲突。

主要批评观点

  1. 性能损失论 "Fortran生成的代码比手写汇编慢30%-50%,在科学计算这种对性能要求极高的领域,这种损失是不可接受的。"——当时某位资深汇编程序员的评论

    实际情况是,早期的Fortran编译器确实存在优化不足的问题。但批评者忽略了一个关键事实:对于大多数应用场景,开发效率的提升远远超过了运行时性能的微小损失。更重要的是,随着编译器技术的发展,这个性能差距迅速缩小。

  2. 控制力丧失论 "使用高级语言就像戴着拳击手套操作精密仪器,你失去了对硬件的直接控制,无法进行精细优化。"——汇编程序员的普遍担忧

    这种担忧部分成立:高级语言确实隐藏了硬件细节。但历史证明,这种"控制力的丧失"实际上是控制力的转移——从微观的硬件操作转移到宏观的系统设计。

  3. 技能退化论 "依赖编译器的人会逐渐丧失编写高效代码的能力,长期来看会损害整个行业的技能水平。"——保守派的警告

    这个论点在每次技术变革时都会出现,但从未成为现实。相反,每次抽象层级的提升都催生了新的专业技能需求。

2.2 历史的反驳:三个关键案例

案例一:操作系统的演进 1960年代,贝尔实验室的肯·汤普森和丹尼斯·里奇决定用高级语言重写Unix操作系统。他们最初考虑使用Fortran,但发现其系统编程能力不足,于是创造了C语言。用C语言编写的Unix证明了:

  • 高级语言完全可以胜任系统级编程

  • 可移植性带来的价值远超微小的性能损失

  • 代码的可读性和可维护性显著提升

案例二:编译器自举 1970年代,编译器设计领域出现了一个重要概念:用高级语言编写自身的编译器。这被称为"自举"(bootstrapping)。如果高级语言真的效率低下,这种自举就不可能实现。但事实上,大多数现代语言的编译器都是用高级语言(甚至是自身)编写的,这本身就证明了高级语言的表达能力足够强大。

案例三:优化编译器的崛起 1980年代,优化编译器技术取得突破性进展。像IBM的PL/I编译器、GNU GCC等工具能够生成比普通程序员手写更优的代码。原因在于:

  • 编译器可以进行全局优化,而人类只能进行局部优化

  • 编译器可以应用复杂的数学变换(如循环展开、指令调度)

  • 编译器可以针对特定CPU架构进行微调

2.3 性能观念的范式转移

随着计算机体系结构的发展,人们对"性能"的理解发生了根本性变化:

  1. 从单指令性能到系统性能 早期计算机性能瓶颈在CPU,因此指令级优化很重要。现代系统的瓶颈更多在I/O、网络、内存访问等方面,系统级设计比指令级优化更重要。

  2. 从峰值性能到实际性能 理论峰值性能(如FLOPS)与实际应用性能往往相差甚远。良好的算法设计和架构设计带来的性能提升,远超过手写汇编的微优化。

  3. 从硬件性能到开发效率的权衡 阿姆达尔定律(Amdahl's Law)指出:系统的整体加速受限于必须串行执行的部分。当并行部分可以通过高级语言快速开发时,专注于串行部分的手工优化才有意义。

2.4 控制力的重新定义

高级语言并没有剥夺程序员的控制力,而是重新定义了控制的维度:

失去的控制

  • 直接的硬件寄存器操作

  • 精确的内存布局控制

  • 特定CPU指令的微调

获得的控制

  • 系统架构控制:可以设计更复杂的分布式系统

  • 抽象层次控制:可以在不同抽象层级上工作

  • 并发模型控制:可以更容易地实现并行和并发

  • 领域建模控制:可以更自然地表达业务逻辑

2.5 对当代AI编程的启示

今天,当AI编程工具(如GitHub Copilot、GPT Engineer)出现时,我们听到了与70年前惊人相似的质疑:

  • "AI生成的代码质量不高"

  • "依赖AI会让人丧失编程能力"

  • "AI无法处理复杂场景"

历史告诉我们:

  1. 工具的性能会快速改进(编译器优化技术的演进就是明证)

  2. 控制力会转移而非丧失(从代码细节控制到系统设计控制)

  3. 真正的专业技能会演进而非消失(从汇编技能到架构设计技能)

三、软件危机与《人月神话》:本质复杂度的永恒挑战

3.1 软件危机的历史背景

1960年代,随着计算机硬件成本的下降和商业应用的普及,软件系统的规模和复杂度开始呈指数级增长。IBM的System/360项目成为了这一时期的标志性事件——一个试图统一整个产品线的操作系统开发项目,最终演变成了一场代价高昂的灾难。

System/360项目的关键数据

  • 团队规模:高峰时期超过1000名程序员

  • 开发周期:原计划2年,实际耗时4年

  • 代码规模:超过100万行汇编代码

  • 成本超支:预算超支数倍,达到数亿美元(按当时币值)

  • 质量问题:发布时包含数千个已知缺陷

这个项目的技术负责人弗雷德里克·布鲁克斯(Frederick Brooks)在项目结束后进行了深刻反思,并于1975年出版了《人月神话》(The Mythical Man-Month)一书,其中的洞见至今仍在指导着软件工程实践。

3.2 人月谬误:软件开发的非线性本质

布鲁克斯提出的核心概念之一是"人月谬误"(The Mythical Man-Month):

"在软件工程中,假定人力和时间是线性可互换的——即认为投入的人月(man-month)数量可以直接决定项目进度——这是一个危险的谬误。"

数学表达: 如果完成一个项目需要12个人月,这并不意味着:

  • 12个人可以在1个月内完成 ❌

  • 1个人可以在12个月内完成 ✅

实际上,由于沟通成本的平方增长(n个人之间的沟通路径数为n(n-1)/2),增加人手往往会延长而非缩短项目时间。

沟通成本模型

<

其中n为团队人数

  • 5人团队:10条沟通路径

  • 10人团队:45条沟通路径(增长4.5倍)

  • 20人团队:190条沟通路径(增长19倍)

3.3 本质复杂度与偶然复杂度

布鲁克斯的另一个重要贡献是区分了两种不同类型的复杂度:

偶然复杂度(Accidental Complexity)

  • 来源于实现过程中使用的工具、方法、环境

  • 示例:手动内存管理、重复的样板代码、复杂的构建配置

  • 可被技术进步消除:通过更好的工具、语言、框架

本质复杂度(Essential Complexity)

  • 来源于问题域本身的固有特性

  • 示例:并发系统的状态一致性、分布式事务、容错机制

  • 无法被消除:只能被管理、封装或转移

关键洞察

"软件开发的根本困难在于其本质复杂度,而非偶然复杂度。技术进步主要解决的是偶然复杂度问题。"

3.4 布鲁克斯定律的现代验证

尽管《人月神话》出版于近50年前,但其核心观点在当代依然得到验证:

案例研究:现代大型软件项目

  1. Windows Vista开发(2001-2006)

    • 初始团队:数百人

    • 最终团队:高峰时超过5000人

    • 结果:多次延期,功能削减,市场反响不佳

    • 根本原因:过度依赖增加人手来解决进度问题

  2. Healthcare.gov初始发布(2013)

    • 涉及55个承包商

    • 缺乏统一的架构治理

    • 结果:上线即崩溃,成为技术灾难的典型案例

    • 教训:沟通协调成本压倒技术实现

  3. 对比案例:Linux内核开发

    • 分布式协作模式

    • 模块化架构设计

    • 渐进式演进而非大爆炸式发布

    • 结果:持续成功30年

3.5 软件工程的应对策略

基于《人月神话》的洞见,现代软件工程发展出了一系列应对策略:

架构策略

  1. 模块化与信息隐藏(Parnas, 1972)

    • 将系统分解为高内聚、低耦合的模块

    • 每个模块隐藏实现细节,仅暴露必要接口

  2. 微服务架构(2010s)

    • 将单体应用拆分为独立部署的服务

    • 减少团队间的直接依赖

    • 允许技术栈的异构性

组织策略

  1. 两个披萨团队(Amazon实践)

    • 团队规模控制在两个披萨能喂饱的人数(约6-8人)

    • 确保沟通效率最大化

  2. 康威定律的主动应用

    "设计系统的组织,其产生的设计等同于组织间的沟通结构。"

    • 有意识地设计组织架构以匹配目标系统架构

    • 通过组织边界定义系统模块边界

流程策略

  1. 敏捷开发与持续交付

    • 小批量、快速迭代

    • 减少在制品(WIP)数量

    • 通过自动化降低偶然复杂度

  2. DevOps文化

    • 打破开发与运维的壁垒

    • 将部署、监控等运维复杂度纳入开发考量

3.6 本质复杂度的不可消除性

无论技术如何进步,某些本质复杂度始终存在:

分布式系统的基本约束(CAP定理):

  • 一致性(Consistency)

  • 可用性(Availability)

  • 分区容错性(Partition Tolerance)

  • 三者不可兼得

软件可靠性的根本限制

  • 测试无法证明无缺陷(Dijkstra)

  • 形式化验证的适用范围有限

  • 某些错误只在特定条件下显现

人类认知的局限性

  • 米勒定律:人类工作记忆容量为7±2个信息块

  • 认知负荷理论:同时处理多个复杂任务效率急剧下降

  • 专家与新手的问题解决差异

3.7 对工具演进的历史启示

回顾软件危机和《人月神话》的教训,我们可以得出一个重要结论:

技术进步主要解决的是偶然复杂度问题,而本质复杂度需要的是工程方法和人类智慧。

这一认识帮助我们正确看待每一次技术革新:

  • 高级语言解决了汇编编程的偶然复杂度

  • 框架和库解决了重复造轮子的偶然复杂度

  • 云服务解决了基础设施管理的偶然复杂度

  • 但业务逻辑的复杂性、系统架构的设计、团队协作的挑战——这些本质复杂度依然存在


四、没有银弹——低代码、图形化编程为什么没有杀死程序员

4.1 "银弹"隐喻的起源

1986年,布鲁克斯在《没有银弹:软件工程的本质与偶然》(No Silver Bullet: Essence and Accidents of Software Engineering)一文中提出了一个著名论断:

"在十年内,不会有任何单一的技术或管理进展,能够使软件生产率提高一个数量级(十倍)。"

这个论断基于一个核心观察:软件开发的困难主要来自于本质复杂度,而当时(乃至现在)的大多数技术进步主要解决的是偶然复杂度

4.2 低代码/无代码运动的历史轮回

低代码开发平台(Low-Code Development Platforms, LCDP)并非新鲜事物。其理念可以追溯到多个历史阶段:

第一代:第四代语言(4GL, 1980s)

  • 代表:PowerBuilder, Oracle Forms

  • 承诺:让业务人员直接开发应用

  • 现实:仍需大量编程知识,维护成本高

第二代:可视化编程(1990s)

  • 代表:Visual Basic, Delphi

  • 特点:拖拽控件+事件驱动编程

  • 成功领域:桌面应用、简单业务系统

第三代:企业应用平台(2000s)

  • 代表:Salesforce平台, OutSystems

  • 特点:模型驱动开发+代码生成

  • 局限:平台锁定,复杂逻辑仍需编码

第四代:现代低代码平台(2010s至今)

  • 代表:Mendix, Microsoft Power Apps

  • 创新:云原生、AI辅助、开放集成

  • 现状:在特定场景成功,但未取代传统开发

4.3 低代码的技术边界分析

要理解为什么低代码没有"杀死"程序员,需要分析其技术能力边界:

低代码擅长的领域(偶然复杂度主导):

  1. 表单驱动应用

    • 数据收集、审批流程

    • 简单的CRUD操作

    • 示例:请假系统、调查问卷

  2. 工作流自动化

    • 规则明确的业务流程

    • 状态机模式的应用

    • 示例:订单处理、客户服务工单

  3. 报表和仪表板

    • 数据可视化

    • 预设模板的配置

    • 示例:销售看板、运营报表

低代码的固有局限(本质复杂度领域):

  1. 算法密集型任务

    <

  2. 性能关键型系统

    • 内存管理优化

    • 并发控制

    • 延迟敏感应用

  3. 复杂的状态管理

    <

  4. 与非标准系统的集成

    • 专有协议对接

    • 遗留系统适配

    • 定制硬件交互

4.4 图形化编程的认知负荷悖论

图形化编程(如Scratch、LabVIEW、Node-RED)基于一个直观的理念:"用图形代替文本,降低学习门槛"。然而,研究表明这种优势存在明显的边界条件:

研究数据

  • 简单任务:图形化编程确实降低入门门槛(MIT Scratch项目验证)

  • 中等复杂度:文本和图形效率相当

  • 高复杂度:文本编程反而更高效(代码密度、抽象能力、工具支持)

认知心理学解释

  1. 工作记忆限制:图形元素占用更多视觉工作记忆

  2. 搜索效率:在大量图形节点中定位比文本搜索更困难

  3. 抽象表达:文本更适合表达高阶抽象(函数、类、接口)

实际案例:LabVIEW在测试测量领域的应用

  • 成功领域:仪器控制、数据采集原型

  • 局限领域:大型系统、算法开发、团队协作

  • 行业现状:与文本编程(Python、C++)共存而非替代

4.5 平台公司的技术现实

许多互联网公司被称为"平台公司"而非"科技公司",这一区分揭示了低代码局限性的深层原因:

平台公司的技术特征

  1. 技术作为实现手段:技术用于快速实现业务需求

  2. 核心竞争力在别处:用户增长、运营效率、生态构建

  3. 技术债务的容忍度:为业务速度可以接受技术妥协

在这种环境下

  • 低代码/无代码工具确实有用武之地

  • 但复杂业务逻辑仍需传统开发

  • 技术团队的角色从"实现者"转变为"赋能者"

真正的科技公司差异

  1. 技术作为产品核心:Google的搜索算法、AWS的云架构

  2. 本质复杂度密集:需要深入的技术专长

  3. 创新驱动:技术突破带来竞争优势

4.6 程序员角色的演化而非消亡

低代码的兴起不是程序员的终结,而是角色分工的进一步细化:

新兴角色类型

  1. 公民开发者(Citizen Developer)

    • 使用低代码工具的业务人员

    • 解决部门级、临时性需求

    • 依赖专业开发者提供的组件和模板

  2. 专业低代码开发者

    • 精通特定低代码平台

    • 构建可复用的组件和模板

    • 解决平台的能力边界问题

  3. 传统全栈开发者

    • 处理低代码无法解决的复杂场景

    • 开发低代码平台本身

    • 构建系统集成和定制扩展

  4. 平台工程师

    • 设计和维护内部开发平台

    • 提供标准化工具链和最佳实践

    • 降低团队间的偶然复杂度

4.7 历史的教训:工具与技能的共生关系

回顾编程工具的发展史,可以看到一个清晰的模式:

阶段一:专家工具(汇编、早期高级语言)

  • 使用者:专业程序员

  • 技能要求:高

  • 应用范围:窄但深

阶段二:普及化工具(现代高级语言、框架)

  • 使用者:广大开发者

  • 技能要求:中等

  • 应用范围:广泛

阶段三:民主化工具(低代码、可视化)

  • 使用者:包括非专业开发者

  • 技能要求:低(入门)

  • 应用范围:特定领域

关键洞察

每个新工具层不是取代上一层,而是创造新的生态位。专业程序员的工作不是减少,而是向上迁移到更复杂的问题域。

4.8 对AI编程时代的预示

低代码/图形化编程的历史为我们理解AI编程提供了重要参照:

  1. 能力边界的存在:任何工具都有其适用范围

  2. 角色的演化:新工具创造新角色而非消灭旧角色

  3. 本质复杂度的持久性:核心挑战需要人类智慧

  4. 生态系统的形成:工具、技能、流程共同演进

正如低代码没有杀死程序员,而是让程序员专注于更有价值的工作,AI编程工具也将遵循相似的路径:自动化重复性任务,放大人类创造力,重新定义专业边界。

五、Agent时代回头看:三座高山与不变的建造者

让我们回到开头

“最近,越来越多的人问我:写程序的未来在哪?编程究竟意味着什么?这次会不一样吗?”

朋友的疑问让我沉默。这问题太像潮汐,总在技术浪潮拍岸时准时涌来——低代码火热时、图形化编程兴起时,甚至更早,当我小学二年级第一次在《Minecraft》里放下一个方块时,困惑就已存在。只是那时,它不构成疑问,而是答案本身。

我的路径有些不同。很多人先接触艺术,再寻找技术作为表达工具。我则相反:我是先成为建造者,而后才理解了艺术。二年级在像素方块世界里搭起第一座歪斜的小屋;四五年级,因为想造出更不可思议的东西,自然而然地摸索起Java,笨拙地写下一个能让天空下雨的Mod;直到初中,才在信息学奥赛的体系里,正式邂逅了算法与数据结构。

这个顺序至关重要。它意味着,驱动我的从来不是“学习一门技术”,而是 “建造的冲动” 。代码不是目的,而是我的斧头、我的泥刀、我让想象世界具象化的咒语。后来当我重新拾起画笔与乐器时,我意识到:技术于我,从来就是最本真的创作母语。

正是这份从童年游戏里生长出的“建造者定力”,让我能在每一次“程序员将死”的喧嚣中保持平静。因为纵观来路,工具的剧变从未消灭过建造者,它只是在不断追问:当工具归于无形,我们究竟为何而建造?

Agent时代给出的答案,清晰地将我们引向计算机世界中永恒矗立的三座高山——它们分别对应着人类三种核心的、难以被自动化替代的能力。


第一座高山:人本的创作

“哲学家们只用不同的方式解释世界,而问题在于改变世界。” —— 卡尔·马克思

编程的起点,永远是一个非技术的、属于人类的念头:“要是能……就好了”。这是一个愿景,一种改变现状的冲动。Agent可以生成实现愿景的代码,但它无法产生那个最初的愿景。

这解释了为何大量互联网公司本质是平台公司而非科技公司。它们真正的护城河与核心竞争力,在于社区运营的微妙手感、版权与合规性的复杂博弈、用户体验的细腻雕刻。在这里,技术是实现业务逻辑的“泥瓦”,但设计宫殿蓝图、理解人群何以在此聚集、规划街道与广场如何流动——这些是产品经理、运营者与业务架构师的工作,其本质是对人性的洞察与社会行为的建模

一个具体的“点”:2016年,Discord从游戏语音工具起步,其技术实现并非独创。但它精准捕捉了游戏社群渴望一种更轻松、更持久的陪伴式交流空间,并通过极简的频道设计与权限系统,将这种模糊的渴望产品化。它的胜利,是对人本联结需求的胜利,而非单纯的技术胜利。

其中不变的,是人类改变世界的原始欲望与将模糊愿景具象化的能力。就像我当年在Minecraft里,想“要是一场雷暴只劈中我的敌人就好了”,然后去学习天气事件与实体检测。Agent让“学习实现”的步骤缩短,但“想要雷暴”的那个创意闪电,依然只来自建造者的大脑。


第二座高山:数学建模的体系

“如果人们不相信数学简单,那是因为他们不知道真实世界有多复杂。” —— 约翰·冯·诺伊曼

计算机的根在数学。编程的核心心智活动之一,是将混沌、连续、充满噪音的现实世界,抽象为清晰、离散、可计算的数学模型。这是从现象中提炼本质的能力。

当Agent能够熟练调用成熟的排序算法时,真正的挑战在于:你如何为从未被形式化描述过的问题,设计第一个算法? 量化交易员在数据洪流中识别市场的隐形结构;图形学研究者将光线与材质的物理交互凝练成渲染方程;搜索引擎工程师将人类知识的海量与关联映射成高维空间中的向量运算。

看一个“面”:AlphaFold在蛋白质结构预测上的突破,震撼了生物学界。其核心飞跃并非编程技巧,而是DeepMind团队成功地将蛋白质折叠这一生物化学问题,重新建构为一个空间几何约束与进化关联的复合数学模型。代码是它的肌肉,但深刻的数理模型才是它的大脑。

其中不变的,是那种将现实复杂性问题“翻译”成数学语言,并寻找最优解的建模思维。这是我初中接触信息学奥赛时被点燃的火花:面对一个“最短路径”问题,你需要抛开具体的地图,看到它背后抽象的“图论”模型。Agent未来或许能更快地编写Dijkstra算法的代码,但首先需要有人看出,城市物流调度、社交网络关系链、甚至是游戏里的寻路问题,都可以被抽象为同一个“图论”问题来求解。


第三座高山:工程复杂度的管理

“在计算机科学中有两件难事:缓存失效和命名。” —— Phil Karlton

这句业内的经典玩笑,幽默地道破了工程实践的本质:在无穷的细节与偶然性中,建立并维持可靠的秩序。《人月神话》早已断言,这是无法被工具消除的“本质复杂度”。

这关乎如何在数百人的协作中,设计出高内聚、低耦合的模块架构,让团队像精密钟表而非混乱蜂群一样工作。这关乎如何让一个日均处理千亿次请求的分布式系统,在面对硬件故障、网络分区、恶意攻击时,依然保持可用与一致。这更关乎如何给事物起一个好名字——一个能准确传达意图、减少误解、经得起时间磨损的命名。

一个“点”的例子:Netflix的Chaos Monkey(混乱猴子)工具。它不是一个业务功能,而是一个工程哲学的体现。它主动在生产环境中随机关闭服务实例,以此来强迫工程师构建真正 resilient(弹性)的系统。这种主动拥抱、管理复杂性的文化,是任何自动化工具都无法灌输的。

其中不变的,是面对复杂系统时,那种权衡、抽象、约定与持续驯化的工程智慧。这就像我小时候搭建复杂的红石电路:单个逻辑门很简单,但当它们成百上千地组合起来,延迟、信号干扰、意外耦合就会让整个系统变得诡异难调。调试它的过程,就是对工程复杂度的初级体验。今天,云厂商(AWS、Azure)、顶级SRE团队、基础软件开发者,正是在全球尺度上应对这种复杂度。他们是数字世界的基础架构师


未来的三条路径:建造者的迁徙

因此,Agent时代回头看,编程行为的外壳在融化,但其核心指向的三座高山反而更加清晰。这为未来的建造者勾勒出三条坚实的迁徙路径:

  1. 成为“本质复杂度的征服者”:向下深入,投身于操作系统、数据库、编译器、云基础设施、嵌入式系统的领域。这是计算机科学的“重工业”,处理的是冯·诺伊曼结构的根本约束与物理世界的交互。当万物互联、具身智能崛起,我们需要更多理解“机器如何真正工作”的工程师,去建造数字世界的基石。

  2. 成为“领域的翻译家与赋能者”:横向融合,将计算思维与建模能力变为你的超能力,带入其他行业。用计算机+金融,去做量化与风控;用计算机+生物,去做计算生物学;用计算机+艺术,去创造下一代沉浸式体验。你不是替代领域专家,而是为他们提供新的、强大的“语法”来描述和解决他们的问题。

  3. 成为“未知模型的探险家”:向上攀登,在理论计算机科学、算法前沿、人工智能原理、形式化方法的无人区探索。为人类的计算能力开拓新的疆土,为下一代的Agent奠定新的理论基础。

投机者的时代或许结束了,但工程师的黄金时代,正随着领域壁垒的融化而真正到来。

编程,从驾驭机器语言到对话智能体,其本质始终是:人类扩展认知与改造世界意志的延伸。它关乎创作(改变世界),关乎建模(理解复杂),关乎工程(建立秩序)。

所以,回到最初的问题:这次会不一样吗? 我的回答是:会的。每次都不一样。但每次,工具的革命都如同河流改道,它冲垮了旧的营寨,却让远方三座高山的轮廓更加雄伟、路径更加清晰。如果你也曾因“建造”本身——无论是用方块、用代码、还是用数学公式——而感到过最纯粹的快乐,那么你就掌握了那份不变的定力。

Agent不是你命运的对手,它是你童年那把木斧的终极进化形态。它卸下了你肩上重复的砖石,让你能更专注地,去凝视你想要建造的星空。


六点五、扩展DLC:失业、危机与建造者的灵魂——当潮水退去时,我们真正要寻找的是什么?

“你选一个公认的世界难题,最好是只用一张纸和一支铅笔的数学难题,投入全部身心钻研,只问耕耘不问收获,不知不觉的专注中,一辈子也就过去了……所以,美妙人生的关键在于你能迷上什么东西。” ——刘慈欣《球状闪电》

写下前文时,我知道会面临什么。屏幕那头的你,或许正被截然不同的情绪包裹——可能是焦虑,是迷茫,甚至是一丝嘲讽:“说得那么理想,但现实是,我看到的只有‘已读不回’和越来越低的薪资包。”

我都理解。让我先把那些高高在上的“技术洞见”放在一边,作为一个同样身处时代洪流中的大一学生,和你聊聊那些更真实、更泥泞的问题。


1. “为什么有那么多人在抱怨?”

让我们坦诚一点:前些年互联网行业的景象,某种程度上,是一场美丽的意外。

技术的浪潮、移动设备的普及、资本的狂热,共同创造了一个巨大的人才缺口。一时间,“转码”成为通往美好生活的显学。大量的人一拥而入,其中不乏将编程视为“高薪流水线”的操作员。那时的市场,需要大量能够熟练使用框架、快速拼装业务的“技工”。

那不是行业的常态,那是时代的红利。

如今,潮水正在回归它本来的水位。行业不再需要那么多的“拼装员”,而是需要真正的“建筑师”、“发明家”和“翻译官”。这就像一场考试,从“默写公式”升级到了“解决从未见过的应用题”。很多人感到不适,本质上是由奢入俭的阵痛。

抱怨是真实的。但抱怨的背后,是一个更根本的追问:当“躺着赚钱”的信息差红利消失,我们到底靠什么立身?

我提供的答案或许不中听,但可能是唯一的:终身学习与主动适应的能力,是唯一不变的安全感。 这不是内卷,这是在激流中为自己打造一艘更好的船。过去,这能力让你抓住风口;现在和未来,这能力让你在任何水域都能航行。


2. “那到头来,要求不是更高了吗?我们更累了!”

是的,要求确实在提高。但这不仅仅是行业的要求,这是整个社会向高质量发展转型的缩影。当“量”的扩张到达边界,“质”的深耕就成为必然。

但我想请你换个角度看这个问题。

在上一篇博客里,我分享的核心,真的是“如何成为一个不被淘汰的程序员”吗?不是的。我真正在分享的,是核心能力与内在热情如何引领一个人穿越迷雾。这种能力——发现问题、系统思考、创造性解决、在复杂中建立秩序——从不专属于计算机行业。

人被大学训练,不是为了变成肉喇叭或螺丝钉,而是为了成为人格健全、独立思考、能推动某个领域哪怕一丝一毫进步的“完整的人”。

基础学科的研究者,用公式和实验破解物质世界的奥秘;人文社科的学者,用文本与田野解读人与社会的复杂图景;未来的医生、教师、工程师……每一个值得投入一生的领域,其深处都矗立着类似的三座高山:改变现状的使命感、理解本质的洞察力、应对复杂的实践智慧。

行业的调整,就像一场突然的降温,它惊醒了在温水中徜徉的我们。它逼迫我们回答:“抛开所有外部标签和预期,我究竟对什么着迷?我愿意为什么问题投入我的智识与热情?”

躺着按部就班度过一生,也许是一种幸福。但一个由自己主动选择、独立思考所构筑的世界,尽管伴随挑战,其精彩与厚重,是前者无法比拟的。是该从那个“稳定”的温床上醒来,去直面属于自己人生的“本质复杂度”了。


3. “可我就是感到痛苦,看不到出路”

这份痛苦,我百分之百地理解,也感同身受。我们怀念那个充满确定性的叙事:“学好技术,就能拥有美好未来。”如今这个叙事动摇了,前路似乎被大雾笼罩。

首先,我们必须承认,痛苦不全是我们的错。这里有社会分配与保障机制的不足(有些竞争确实是无效内卷),有资本逻辑的推波助澜,也有教育与社会引导的阶段性脱节(比如,过于强调“有用”之学,而忽视了关乎心智与选择的“无用”之学)。结构性的矛盾,注定会让一部分个体感到失配和彷徨。每个时代都有它的主题,而所有命运馈赠的礼物,都曾在暗中标好了价格。

然而,承认系统性因素的存在,不是为了让我们躺平认命,而是为了更清醒地定位自己的痛苦——哪些是时代给的,哪些是自己必须面对的。

其次,我想和你分享一个从计算机中学来的“隐喻”。当你运行一个复杂的程序遇到致命错误(Segmentation Fault)时,系统不会告诉你问题到底出在哪一行。你最需要的,不是胡乱修改代码,而是一个调试器——一个能让你深入内部,查看每一步状态,最终定位问题根源的工具。

当下的迷茫与痛苦,就是我们人生的“Segmentation Fault”。而人文教育的阅读、深度思考、自我对话、与不同灵魂的交流,就是我们最好的“调试器”。它能帮助我们一步步回溯:我的兴趣究竟在哪里?我的价值观是什么?我恐惧的到底是什么?是害怕不成功,还是害怕面对真实的自己?

“认识你自己”——这古老的箴言,从来不是一句空话,而是在迷航时唯一可靠的罗盘。


通往“学业之外的旷野”

所以,这篇看似在谈论技术演变的博客,最终指向的,或许是一个更私人的命题:在按部就班的道路不再被许诺的今天,我们该如何定义自己的“成功”与“人生”?

技术的高度,需要思维的深度来驾驭;而思维的深度,最终需要情感的温度和生命的厚度来支撑。这就是为什么,在钻研代码之外,我们必须补上人文教育这一课。它不直接教你谋生,但它教你生活;它不保证你赢,但它让你明白为何而战,以及如何优雅地面对不确定。

无论你最终选择在计算机的殿堂里深潜,还是带着建造者的心智转向另一片星辰大海,唯一重要的,是找到那个能让你“迷上”的东西。它可能是一个数学猜想,一个社会问题,一种艺术形式,一门待完善的技术。

那东西就是你的“旷野”。那里没有现成的地图,没有标准的攻略,只有属于你的、需要亲手开辟的道路。而大学,应该是为你提供工具、勇气和同伴,鼓励你走向那片旷野的起点,而不是把你塑造成流水线终点的标准化零件。

痛苦是觉醒的开始,迷茫是寻找的前奏。如果你正身处其中,那么,欢迎来到真实而复杂的人生。这不是终点,这是一场真正冒险的入口。

关于这片“旷野”里具体有什么,我们又该如何准备行囊,那是下一个博客要讲的故事了。但在此之前,请你先问问自己那个最简单也最艰难的问题:

“除去所有别人的期待,我,究竟想建造什么?”


七、大总结:在共产主义未来的前夜,如何与这个带着毛边的世界共存

“一切坚固的东西都烟消云散了,一切神圣的东西都被亵渎了。人们终于不得不用冷静的眼光来看他们的生活地位、他们的相互关系。” ——卡尔·马克思《共产党宣言》

一、毛边的世界:我们时代的两面

我们生活在一个充满巨大张力的时代。一边,是尚未抵达的理想彼岸;另一边,是依然带着粗糙“毛边”的现实。

毛边的这一面,是尚未抚平的棱角:

  • 分配的逻辑依然主导着我们的许多选择,当一个人为了生存而非热爱去从事一份职业时,真正的“自由发展”仍是遥远的图景

  • 地缘的冲突、身份的隔阂、观念的撕裂仍在制造着无声或震耳的巨响

  • 气候的警钟正在敲响,我们开始品尝工业化狂飙后自然的回响

  • 技术的洪流中,意义的空心化与精神的漂泊感,成为新型的“现代性不适”

我们不太幸运,因为我们仍需要为“分配”、“生存”、“安全”这些本应成为基底的问题耗费巨大心力,未能全身心投入到“人的自由全面发展”这一终极主题中去。

但毛边的另一面,是被照亮的织纹:

  • 绝对的物质匮乏与大规模饥荒,正在被人类缓缓关进历史的橱窗

  • 知识的获取从未如此平等,文化的创造与欣赏达到了空前的高度

  • 对于多数人而言,“活下去”的基本挑战,第一次让位于“如何活得好”的创造性追问

  • 正是这个尚不完美的、过渡性的时代,让我们得以清晰触摸历史的针脚——感受矛盾、见证变革、体会一个文明在转型期的阵痛与希望

我们又何其幸运,能站在这样一个承前启后的节点上。这个“毛边世界”不提供光滑的幻觉,它提供真实的触感,逼迫我们睁开双眼,开始思考那个最重要的问题:在一个基本生存得以保障的时代里,人生的意义究竟何在?

二、以史为鉴:从计算机到人的尺度

让我们回到这篇长文的起点——“以史为鉴”。

我们梳理了从汇编语言到智能Agent的技术史,看似在谈论编程的变迁,实则是在解剖一个更宏大的主题:人类如何运用工具拓展自身边界,又在工具变革中如何重新定位自身价值。

计算机、互联网、人工智能……它们都只是我们时代一个辉煌的“主题”。如同蒸汽机是工业时代的主题,电气是二十世纪的主题一样。每一个主题都会老去,新的主题会升起。

但在所有技术主题的轮转之下,一脉相承的根本能力始终闪耀:

  • 观察与抽象的能力(从具体问题中看到普遍模型)

  • 系统与建构的能力(将碎片组织成可运行的复杂整体)

  • 理解与共鸣的能力(穿透代码,看到背后的需求与人性)

  • 批判与创造的能力(不满足于既定答案,建造新事物)

这些能力,从来不属于任何一个特定行业。它们属于一个完整的、觉醒的、具有主体性的人。过去,它们被用于驯服机器;未来,它们将用于料理智能、设计社会、抚平世界的“毛边”,并最终用于每个人对自身生命的艺术创作。

三、共存之道:在过渡时代安放自我

那么,在抵达那个“每个人的自由发展是一切人自由发展的条件”的灿烂未来之前,在这段漫长的、带着毛边的黎明中,我们该如何自处?

首先,做一名清醒的“现实主义者”。 不沉溺于过去黄金时代的幻象,也不悬浮于对完美未来的空想。正视眼前的矛盾与不公,理解其历史根源与复杂性。真正的建设,始于对现实的诚实丈量。这意味着,我们在钻研技术的同时,也必须理解技术嵌入的社会结构、经济逻辑与权力关系。

其次,成为一名耐心的“织补者”。 世界的毛边不需要粗暴的撕裂,而需要精心的织补。用你的专业能力,去修复一个漏洞,优化一个流程,创造一个更美、更高效、更公平的产品或服务。无论你的领域是什么,都可以找到那个能让世界变得光滑一毫米的切入点。编程是在数字世界织补,法律是在规则世界织补,教育是在人心世界织补。

最终,成为一名坚定的“建造者”——为自己建造意义。 这是最根本的共存之道。当外部不再提供现成的、不容置疑的人生脚本时,意义便从“被赋予”转向“被建造”。这需要你向内探索,找到那件能让你“迷上”的事情——它可能宏大如攻克一项科学难题,也可能具体如维护一个美好的开源社区;它可能关乎亿万人的福祉,也可能只是让一小群人感到温暖。

共产主义未来的前夜,不是一个消极等待的时辰,而是一个积极准备的工地。 那个理想社会的最大前提,正是由无数个已经实现了精神与能力上“自由而全面发展”的个体所构成的。我们今日所有对专业的热爱、对思想的锤炼、对不公的反思、对美好的建造,都是在为那个未来准备合格的“建筑材料”——那就是我们自己。

结语:跳出来,看见更大的世界

所以,年轻的同行者,当你为专业的前景感到焦虑时,当你被时代的浪潮拍打得晕头转向时,我邀请你做一个思想实验:

跳出来。 像从轨道上回望地球一样,回望你正在钻研的领域。你会发现,计算机科学、物理学、文学、经济学……都只是人类理解世界、改造世界的一座座暂时性营寨。它们很重要,但它们不是目的本身。

更大的世界是什么? 是仍待解释的宇宙,是尚未抚平的社会伤痛,是人心深处对真善美永不熄灭的渴求,是那个我们终将实现的、每个人都能自由绽放的遥远未来。

你现在所磨练的一切核心能力,最终都是为了在这个“更大的世界”里,承担起一个建造者的责任。技术会过时,热点会转换,但一个具备抽象思维、系统视角、人文关怀与建设之心的人,永远能在任何时代找到他不可替代的坐标。

我们无法选择时代,但我们可以选择回应时代的方式。与其诅咒毛边,不如用它来磨砺思维的锋芒;与其恐惧变化,不如在变化中锚定那个不变的、正在成长的自己。

前夜虽长,但星辰已亮。共勉。