抽象的回归:编程从来无关代码

"一切都已经说过了,但因为没有人听,我们必须不断回过头来重新开始。"
——安德烈·纪德 ,显然是在软件行业工作

在我们正式开始之前,让我摧毁一个舒适的幻觉: 编程比代码更古老。古老得多。如此古老,以至于代码基本上是人类指令系统的TikTok——浮夸、新近,并且确信自己发明了一切。

阿达·洛芙莱斯在还没有机器运行她的程序时就已经在编程了。查尔斯·巴贝奇在调试不存在的硬件。雅卡尔提花机在1804年使用穿孔卡执行条件逻辑——如果有孔则提起纱线,否则不提起。这就是编程。不需要分号。不需要Stack Overflow。不需要npm漏洞。天堂。

"初有道,道与神同在,道就是神。"——约翰福音1:1,描述第一个没有文档的API

再往前追溯。中世纪酿造麦酒的食谱:"取大麦,弄湿,让它发芽直到芽突是谷粒长度的一半,然后烘干……"这是一个算法。确定性、可重复,有错误处理("如果谷物闻起来酸,就丢弃并重新开始")。老实说,比大多数JavaScript的错误处理都要好。

安提基特拉机械,建造于公元前100年左右,本质上是执行天文计算的硬件。编程,比FORTRAN早了两千年。而且它仍然工作,不像你去年构建的那个React应用。

罗马帝国的军事操练手册:"组成龟阵:前排跪下,盾牌举过头顶,第二排覆盖缺口……"这是一个分布式系统协议,具有完整的容错和状态管理。不需要Python。不需要Kubernetes。只是拿着盾牌的罗马人实现了比你的微服务更好的正常运行时间

……真的不是关于工具……

"纯粹而简单的真理很少是纯粹的,也绝不简单。"——奥斯卡·王尔德,关于阅读AWS文档

这里有一个令人不舒服的真相:编程是将意图构建成可执行形式的人类行为。代码?代码只是我们为这个古老实践发明的最新 notation。它比民主年轻,比微积分年轻,比三明治年轻。是的,三明治(1762年)。你的职业字面上比把肉放在面包之间还要年轻。

现在,在2025年,我们放弃代码改用自然语言提示,表现得仿佛这是革命性的。但我们不是在向前迈进。我们在完成一个圆圈。一个非常昂贵、高碳密集、风投资金资助的圆圈

1、作为执行架构师的程序员(或:专业意图低语者)

……告诉魔像需要做什么……

"我把这个写得比平时长,因为我没有时间把它写短。"——布莱兹·帕斯卡,解释为什么他用Java写的

如果编程不是代码,那么程序员到底在做什么?

我们是执行的架构师。或者,如果你想要诚实:我们是为非常昂贵、非常愚蠢但非常擅长快速犯蠢的机器服务的翻译官。我们将人类模糊、矛盾、往往不可能的欲望("让它脱颖而出,但又专业,但又前卫,但又安全")翻译成可以被其他东西遵循的精确、明确的指令——无论这个其他东西是计算机、LLM,还是组成龟阵的罗马军团。

代码不是内容。代码是内容的痕迹。就像乐谱对旋律,就像食谱对饭菜,就像建筑蓝图对永远不会看起来像蓝图的建筑。代码从来都不是目的执行才是目的实现的意图才是目的。代码只是我们还没想出如何消除的不幸的中间步骤。

"计算机科学中只有两件难事:缓存失效和命名。"——菲尔·卡尔顿,在遇到差一错误之前

我花了二十年写代码,直到最近才理解这一点:我写的每一行都只是意图的结晶,冻结在语法中。当我写:

def calculate_compound_interest(principal, rate, time):
    return principal * (1 + rate) ** time  # 看妈妈,我在做数学!

我不是在"编码"。我在构建一个意图——"钱应该随着时间指数增长,因为资本主义"——成可执行形式。Python语法是偶然的。我可以在C、Rust、Excel中表达同样的意图,如果必要的话,甚至用楔形文字泥板。(实际上,楔形文字可能比大多数企业Java更易维护。)

现在呢?现在我可以向LLM用英语表达它:"计算多少钱会因为复利而增长,请不要幻想出新的经济制度。"媒介改变了。角色没有改变。存在主义的恐惧保持不变。

2、伟大的语言截肢

我们如何学会停止担忧并爱上大括号

……让我切割一下意义……

"人生来自由,却无处不在枷锁中。"——卢梭,在看到第一个Java接口之后

故事在这里变得有趣,如果*"有趣"意味着"悲剧",而"悲剧"意味着"令人发笑的自作自受"*的话。

过去的六十年里,我们一直在进行大规模的语言缩减项目。我们拿走了自然语言——包括它所有诗歌、歧义、隐喻和说*"看情况"*的能力——然后我们有意截肢。就像维多利亚时代的外科医生,但麻醉更少,分号更多。

FORTRAN(1957):我们无法处理*"大约""可能"*,所以一切都变得精确。情绪被禁止。细微差别会被编译错误惩罚。

COBOL(1959):我们试图看起来像英语,但去除了所有有趣的部分。就像由会计师重写的莎士比亚。"PERFORM CALCULATE-INTEREST UNTIL HELL-FREEZES-OVER."

C(1972):忘记看起来像英语。拥抱括号。崇拜指针。分段错误是一种生活方式。

Java(1995):增加仪式感。更多仪式。万物皆有类。AbstractSingletonProxyFactoryBean不是笑话,它是真正的Spring类。上帝已死,我们用XML配置杀死了他。

Python(1991):在隐藏复杂性的同时假装简单。"可执行的伪代码",他们说。"会很有趣的",他们说。现在我们有GIL,没有人玩得开心(是啊……我知道,我们在努力摆脱GIL,甚至最近发明了Mojo,但是……)。

"我认为计算机的市场可能是五台。"——托马斯·沃森,1943年,比npm包作者表现出了更多的克制

每一次迭代都是一次协商:我们为了确定性牺牲了多少人性?我们为了精确放弃了多少表达?结果是:全部。我们放弃了全部。

我们花了四十年教会自己像机器一样思考。我们学会将*"给我冲杯咖啡"*分解为:

def make_coffee(strength='medium', milk=False, sugar=0):
    # 47行配置
    # 12个依赖导入
    # 3个工厂模式
    # 1个抽象基类
    # 0杯实际咖啡
    water = heat_water(100)  # TODO: 处理高度调整
    grounds = grind_beans(get_beans('arabica'), coarseness=2)
    coffee = brew(water, grounds, method='pour_over', time=240)
    if milk:  # TODO: 处理乳糖不耐症
        coffee = add_milk(coffee, amount=30, temp=65)
    for _ in range(sugar):  # TODO: 实现甜菊糖支持
        coffee.add_sugar(5)  # 克,不是自由单位
    return coffee  # 警告:咖啡可能为空

我们把自己变成了编译器,将人类意图翻译成机器指令。而且我们在这方面变得擅长了。真的很擅长。擅长到让我们开始认为这就是编程实际上是什么。擅长到我们忘记了我们在假装。

"我的语言的界限意味着我的世界的界限。"——维特根斯坦,在发现正则表达式之前

3、LLM登场:钟摆摆回来

带着风险投资

……金钱驱动的加特林机枪在行动……

"历史不会重演,但会押韵。"——马克·吐温,看着他的第三次JavaScript框架迁移

然后,在自有人决定PHP需要作为PHP 8复活以来最大的宇宙玩笑中,大语言模型到来了。

六十年的语言截肢,将语言简化到最骨架的形式,教会自己用函数和循环和条件说话之后……机器说:"实际上,我们更希望你正常说话。但是那种非常冗长的正常。维多利亚小说的那种正常。"

比较这两种实现同样结果的方式:

# 传统代码 - 我们花了几十年学习的
import requests
from bs4 import BeautifulSoup
import csv
# 还有20多行实际实现
# 每一行都是对确定性之神的小小祈祷

对比LLM提示:

"请从这个URL抓取产品名称和价格。专注于页面上标记为'product'的项目。从H2标签中提取产品名称,从class为'price'的span中提取价格。从价格中去掉美元符号并转换为浮点数。将所有内容保存到一个名为products.csv的CSV文件中,包含名称和价格的列。确保优雅地处理任何错误,并从名称中去除空白字符。实际上,你知道什么,自己想办法吧。你应该很聪明。还有,请不要幻想出任何不存在的产品。上次发生了这种情况,财务部门并不好笑。"

提示更长。它不那么精确。它更模棱两可。它使用被动语态,斯特兰克和怀特特别警告过我们要避免这一点。然而不知何故,它有效。有时。在星期二。当水星不在逆行时。

"任何足够先进的技术都与魔法无异。"——阿瑟·C·克拉克,他从不需要调试这种魔法

我们为机器简化了语言。现在机器要求我们使用完整的语言才能被理解。 如果这不是讽刺,我不知道什么是。(实际上,我知道这是什么:这是一个商业模式。)

4、美丽、可怕、昂贵的悖论

……少即是(有时)多……

"我们遇到了敌人,他就是我们。"——Pogo,高级软件架构师

考虑到以上所有——总结一下——这是一个应该让每个程序员的脑袋旋转(比平时更厉害)的悖论:我们花了六十年将语言蒸馏到它最原子化的组件,创建日益优雅的抽象,构建精确定义行为的塔……结果发现机器现在更喜欢我们如此努力逃离的混乱、冗余、上下文密集的自然语言

这就像花了你的一生学习用俳句说话,实现了完美的极简主义表达,结果发现你的听众想要维多利亚小说。由狄更斯写的。他按字数收费。想想这,这解释了令牌定价模型。

但这里是关键——这一点至关重要——提示并不比代码*"更好"。也不比代码"更差"。它是我们从有人第一次说"嘿,如果我们让石头思考会怎样?"*以来一直在骑行的同一个循环上的不同点。

提示更冗长但更不可确定性。记住这一点至关重要。代码更精确但更不易访问提示更容易写但更难调试代码更难写但更容易验证。提示每次尝试花费0.03美元。代码一次就花费你的理智。

**我们不是在进化。我们在振荡。*像一个钟摆。由风险投资制成。在"每个人都能编程""没人理解发生了什么"*之间摆动。

"理论上,理论和实践是一样的。在实践中,它们不同。"——约吉·贝拉,审阅拉取请求

5、概率性编译的代价

当"在我机器上可以工作"变为"那一次工作了"

……拉斯维加斯赌场llm机器……

"上帝不掷骰子。"——爱因斯坦,在看到LLM输出方差之前

让我介绍一个不应该存在但确实存在的术语,就像JavaScript的==运算符或我对人性的信心:"概率性编译器"

传统编译器:给它相同的输入,每次得到相同的输出。每一次。单一时间。无聊。可靠。就像瑞士火车或德国幽默。

LLM:给它相同的输入,得到……类似的东西?通常?除非它在思考什么?除非训练数据包含了某人的热梦?除非……

# 传统:确定性(无聊但值得信赖)
assert calculate_tax(100000) == 25000  # 总是为真,就像死亡本身

# LLM生成:概率性(令人兴奋但可怕)
assert llm_calculate_tax(100000) == 25000  # 星期二为真?
# 有时24999.99因为浮点
# 有时30000因为它从加州数据学习
# 有时"税就是盗窃"因为它从Reddit学习

我在金融服务行业工作。当我计算复利时,我每次都需要相同的答案。当我处理交易时,我需要绝对确定性。一个可能将正确金额传输到可能正确的账户的系统想法并不是迷人的创新。这在我们行业被称为*"等待发生的联邦调查"*。

"有两种方法可以写出无错误的程序;只有第三种有效。"——艾伦·佩利斯,预见了提示工程

这不是一个bug。这是概率系统的基本性质。我们正在它们之上构建关键基础设施。 这就像在量子泡沫上建房,然后在别人的卧室醒来时感到惊讶。或者宇宙。

马可·奥勒留会对这个发表评论:"限制于当下"。但有了LLM,即使是现在也是不确定的。相同的提示,相同的模型,相同的温度设置——然而,有微小的变化。这是应用于软件开发的海森堡不确定性原理。你可以知道代码做什么或什么时候做,但不能两者都知道。

6、便利的碳成本

我如何学会停止担忧并爱上宇宙的热寂

……妈妈告诉我我仍然环保……

"未来的工厂将只有两个员工,一个男人和一条狗。男人在那里喂狗。狗在那里阻止男人触摸设备。"——沃伦·本尼斯,预测DevOps

你的笔记本电脑运行在大约15瓦("大约",我已经说了,停止你的内部验证器)。编译代码,运行测试,甚至观看关于你应该如何学习Rust的YouTube视频——15瓦。

单个ChatGPT查询?300-600瓦,取决于模型和复杂性。这不是拼写错误。这不是幻觉。这是为了使用自然语言的便利而增加40倍的功耗。就像开着怪兽卡车去上班,因为步行太确定性了。

你写的每一个提示,你改进它的每一次迭代("让它更正式","添加错误处理","不,不是那种错误处理","我说的是优雅降级,不是可耻的辞职"),你因为输出不太正确而重新生成的每一次——你都在以会让比特币矿工脸红的速度消耗电力。

"未来已经在这里——只是还没有非常均匀地分布。"——威廉·吉布森,看着他的电费账单

这里是无情的经济学:

  • 传统开发:高初始成本(学习编码,哭泣,治疗),接近零的边际成本(运行代码)* LLM开发:低初始成本(用英语写),高边际成本(每个查询花费金钱、碳和灵魂的一小块)

我们发明了一种大声思考就要钱的开发模型。每一个错误,每一个实验,每一个*"如果我们尝试……"*——它们都有价格标签。以美元计。以碳计。以添加到已经变暖的行星的热量计。以只想冰而不是冰咖啡的北极熊的眼泪计。

斯多葛学派谈论奢侈的隐性成本"每一个新事物都激发心灵,"塞内卡写道,"但寻求真理的心灵从新事物和表面事物转向旧事物和深层事物。"他们在谈论LLM吗?显然不是。他们在谈论JavaScript框架吗?几乎可以肯定。

7、永恒回归:GUI仇恨作为历史遗忘

一切都是旧的,但是全新的,但更糟

……我们以前没见过这个吗?

"那些不记得过去的人注定要重复它。"——乔治·桑塔亚那,看着有人用JavaScript重新实现PHP并称之为React

现在我们到达问题的核心,不断重复的模式,就像一只猫从桌子上掉下来的GIF,定义我们行业的循环:在可访问性和精确性之间,在视觉和文本之间,在包容性和专家之间,在*"我奶奶可以用这个""我需要三个证书才能理解错误信息"*之间的摆动。

让我告诉你我们时代的伟大GUI循环。围过来,孩子们,听听你们祖先的愚蠢。

7.1 PHP文艺复兴和衰落(一部三部分悲剧)

"PHP是由无能的业余人员实施和创造的次要邪恶,而Perl是由熟练但堕落的专业人员实施的巨大而阴险的邪恶。"——乔恩·里本斯,选择暴力

记得2008年的PHP吗?每个CMS都有一个可视化构建器。Drupal的Views UI。WordPress的可视化编辑器。Joomla的……不管Joomla有什么。(没人知道。没人想知道。)

这些不是错误。它们解决了真正的问题:

  • 非程序员可以构建复杂站点* 快速原型变的真正快速* 反馈循环从几小时缩短到几秒* 民主来到了Web开发* 混乱随之而来,按照传统

然后发生了清算。每页加载400个数据库查询的站点。配置存储在数据库中的二进制大对象中,就像某种数字肿瘤。无法对整个站点进行版本控制。 当一个开发人员点击按钮而另一个写代码并且两者都在哭泣时,试图合并两人工作的恐怖。

解决方案?配置即代码。Drupal 8的配置管理。WordPress的wp-cli。向静态站点生成器和JAMstack的大迁徙。我们从*"任何人都可以构建网站"变为"你需要理解YAML、Git和依赖管理才能更改菜单"*。进步!

7.2 AWS控制台战争(或:我如何学会停止点击并爱上YAML)

"云只是计算机的其他地方。"——未知,可能是刚收到AWS账单的人

2009: AWS控制台启动。 终于,人类可以理解云计算!指向、点击、配置。 看到你的实例。可视化你的架构。民主!

2012: "朋友不让朋友使用控制台。" 一切必须是CloudFormation。4万行JSON来启动一个Web服务器。这没问题。

2014: 实际上,CloudFormation太冗长。Terraform到达。"基础设施即代码!"我们大喊,忽略它实际上是"基础设施即更多代码!"

2016: 实际上,Terraform太命令式。进入Pulumi、CDK。"用于基础设施的真实编程语言!" 因为基础设施真正需要的是继承层次结构

2018: Kubernetes接管。YAML化一切。缩进变成工作技能。

2020: 实际上,YAML太容易出错。Helm图表。模板的模板。模板一路向下。

2022: 实际上,Helm太复杂。GitOps和ArgoCD。Git作为真相的来源,假设真相是灵活的。

2024: "我们需要Kubernetes的可视化界面……"

循环继续,就像天空中不停转动的轮子。不要停止相信。

7.3 LLM编排马戏团(仍然每天表演!)

"快速行动,打破东西。"——Facebook座右铭,显然现在应用于认知架构

2023: LangChain到达。 "链接你的提示!组合你的代理!就像AI的LEGO!" 如果LEGO积木随机改变形状并且偶尔着火。

六个月后: "LangChain无法理解。太多魔法。抽象在泄漏。抽象在洪水。我们淹死在抽象中。发送帮助。发送确定性。"

2024: "实际上,我们需要状态管理。" 进入LangGraph,将提示链转换为显式状态机。因为非确定性系统真正需要的是更多复杂性。

2024年后期: "这太复杂了。我们可以为LangGraph制作可视化构建器吗?"

2026(预测): "可视化构建器太受限。我们需要AI工作流的声明性语言。"

2026年后期(可能): "回到代码。"

8、抽象的正弦性质

我的职业生涯是正弦波,振幅在增加

……不要往下看::不要往上看……

"时间是一个平坦的圆。"——拉斯蒂·科尔,《真探》,解释JavaScript事件循环

如果你绘制计算抽象的历史,你不会得到一条向上的趋势线。你得到一个正弦波。一个醉酒的正弦波。跳恰恰舞。同时抛接杂耍。

机器代码 → 汇编(上升) → COBOL试图成为英语(下降) → C极简(上升) → C++添加包括厨房水槽指针在内的一切(下降) → Java用AbstractSingletonProxyFactoryBean假装简单(地狱中间) → Python隐藏复杂性(下降) → 类型提示使Python变成Java(上升) →……

CLI → GUI(可访问性) → CLI(力量) → Electron应用程序(可访问性犯罪) → 终端文艺复兴(力量) → 基于浏览器的终端(我们在做什么)

每次摆动都解决前一次摆动产生的问题:

  • GUI解决CLI的可访问性问题* CLI解决GUI的精确性问题* 可视化构建器解决代码的专业性问题* 代码解决可视化构建器的混乱问题* NoCode解决代码问题* 代码解决NoCode问题* LowCode作为妥协出现* 每个人都不快乐

我们没有进步。我们在振荡。而每次振荡都使新一代相信他们发现了最终解决方案。*"这次不同!"*他们高喊,用不同的语法实现相同的模式。

"我看过你们这些人不会相信的事情。在猎户座肩膀着火的攻击舰。我在坦纳豪瑟门附近黑暗中看到C光束闪烁。所有这些时刻都会在时间中消失,就像雨中的眼泪。到死的时间。"——罗伊·巴蒂,描述他维护遗留代码的经历

9、循环中的人类

不是你想象的那样,或者也许正是你想象的那样但不想承认

……然而,我们肩上有一些重量……

"软件工程的目的是控制复杂性,而不是创造复杂性。"——帕梅拉·扎夫,显然从未使用过Webpack

这是AI布道者遗漏的(除了点、现实,偶尔还有他们的B轮融资):LLM不取代程序员,就像编译器不取代程序员。或者IDE不取代程序员。或者Stack Overflow不取代程序员。或者咖啡不取代程序员。(实际上,去掉咖啡看看会发生什么。我敢你。)

它们改变编程的内容,但不消除对人类意图、判断和责任的需求。和指责。尤其是指责。

LLM可以写代码。它甚至可以写好代码。 它可以重构、优化、文档化、测试。但它不能——这至关重要——它不能想要任何东西。 它有石头的欲望。电子表格的野心。特别缺乏想象力的土豆的梦想。

它不想让代码可维护。 它不想让用户体验令人愉快。它想让系统合乎道德。 它不想让错误被优雅处理。它什么都不想要因为它不想。

"我思故我在。"——笛卡尔,他从不需要证明他不是机器人才能买音乐会门票

必须还有人:

  • 定义值得解决的问题(并且在会议上争论它)* 评估解决方案是否真的解决了它(没有)* 判断伦理含义(总是有伦理含义)* 接受结果的责任(这是每个人都后退,除了你的时候)* 决定何时足够好就是足够好(从不,根据产品)* 知道何时停止优化(从不,根据凌晨3点的你)机器知道所有答案。只有人类知道哪些问题重要。 更重要的是,我们应该假装哪些问题在截止日期前不存在。

10、忒修斯之船的公案

如果我们替换了所有东西,它还是技术债务吗?

……"weey-heey and up she rises, 清晨"……

"我成了死神,世界的毁灭者。"——奥本海默,在星期五部署到生产环境后

有一个关于船逐渐替换零件的老思想实验。它还是同一艘船吗?

2025年的编程就是那艘船。除了我们在航行时替换零件。在暴风雨中。着火时。并且争论木头意味着什么。

语言改变了。范式转变了。工具进化得无法识别。我们从穿孔卡到提示,从大型机到移动,从确定性到概率性,从瀑布到敏捷到*"任何让VC快乐的东西"*。

它还是编程吗?

当然。因为编程从来都不是关于代码。它是关于将意图构建成可执行形式。 无论这种形式是:

  • 汇编助记符(给硬核的)* 面向对象层次结构(给企业的)* 函数组合(给纯粹的心的)* YAML配置(给该死的)* 自然语言提示(给勇敢的和/或愚蠢的)媒介进化。本质保持。痛苦是永恒的。
"地狱是别人的代码。"——萨特,可能

演习军队的罗马百夫长和制作完美指令的提示工程师从事相同的基本行为:获取人类意图并将其构建为可靠的执行。罗马人可能有更好的文档。

11、循环教导的东西

除了谦逊和肝脏损伤

……太长不看:它教导斗争继续……

"疯狂是一遍又一遍地做同样的事情并期待不同的结果。"——不是爱因斯坦,而是每个试图居中div的开发者

如果我从二十年观察这些循环中学到了什么,那就是:每一代程序员都认为自己是第一个发现*"正确"*方式的人。就像青少年发现性,但文档更多,社交技能更差。

我这一代认为面向对象编程会解决一切。*"对象模拟现实世界!"*我们说,创建AbstractFactoryFactory类来模拟呃,现实世界中存在的工厂工厂?

前一代认为结构化编程是答案。*"GOTO有害!"*他们高喊,发明了新的创造方法在没有意大利面的情况下创建意大利面。

下一代认为函数编程是启示。*"纯函数!"*他们吟唱,立即添加状态单子,因为现实是有状态的和令人失望的。

再下一代可能会发现过程编程并表现得好像他们发明了它。"如果我们……"他们会说,眼中充满发现,"只是……按顺序写指令?"

"只有两种语言:人们抱怨的语言和没人使用的语言。"——比雅尼·斯特劳斯特鲁普,创建C++以确保人们有一些可以抱怨的

抽象也是如此:

  • "GUI是给业余的"(直到你需要快速让团队入职)
  • "真正的开发人员使用CLI"(直到你需要可视化400节点Kubernetes集群)
  • "基础设施即代码是唯一方法"(直到你需要调试被宇宙射线破坏的Terraform状态文件)
  • "提示是未来"(直到你的起搏器需要确定性执行)

斯多葛学派有一个称为*"永恒回归"*的概念——所有事件无限重复的想法。他们是在宇宙意义上说的。但在软件中,这字面上是真的。我们反复解决相同的问题,每次都认为我们是第一个。我们是西西弗斯,但我们的石头是由技术债务制成的,山是由抽象层制成的。

12、关于进步的不舒服的真相

剧透:没有进展

……隐藏混乱,这就是我们实际做的……

"我们只能看到前面一小段距离,但我们可以看到那里有很多需要做的事情。"——阿兰·图灵,大大低估了事情

这里没有人想承认:我们不是在编程方面变得更好。我们在隐藏复杂性方面变得更好。这就像通过把所有东西推入壁橱来打扫房子。它看起来干净直到有人打开门并被技术债务的雪崩掩埋。

每个新抽象不消除复杂性——它重新定位它。汇编的复杂性变成内存管理的复杂性变成对象层次结构的复杂性变成依赖管理的复杂性变成提示工程的复杂性变成向经理解释为什么AI生成了香蕉面包配方而不是用户身份验证系统的复杂性。

这是乌龟一直向下,只是乌龟是抽象层,没有人记得我们为什么首先需要乌龟。还有,乌龟着火了。还有,我们是乌龟。

"调试比最初编写代码要难两倍。因此,如果你尽可能聪明地编写代码,根据定义,你不够聪明无法调试它。"——布莱恩·克尼汉,解释为什么聪明的代码是愚蠢的

13、保持的角色

为什么你仍然有工作,暂时

……老人和海(代码或者更准确地说是程序)……

"计算机让你比人类历史上任何发明都以更快的速度犯更多错误——可能有手枪和龙舌兰酒的例外。"——米奇·拉特克利夫,据经验说话

那么留给我们什么,那些花了几十年学习像机器思考,结果却让机器要求我们再像人类思考的人类?那些刚好在垃圾回收前学习指针,刚好在Rust前学习垃圾回收,刚好在LLM使语言无关前学习Rust的人?

我们保持我们一直是什么:意图的守护者。目的的牧师。"我们应该"的仲裁者,在一个痴迷于"我们能"的世界里。

我们决定什么应该存在。我们判断它是否应该存在。当它存在得很糟糕时我们接受责任。 当它存在得非常糟糕时我们更新我们的简历。当其他人都忘记时我们记住为什么它需要存在。我们向审计师解释为什么它以这种方式存在。我们对自己撒谎重写会解决一切。

代码改变。语言进化。抽象在简单和复杂之间,在可访问性和力量之间,在视觉和文本之间,在*"我奶奶可以用这个""我有博士学位但我很困惑"*之间振荡。

必须有人仍然站在人类需求和机器执行之间的边界,将一个翻译到另一个。那就是编程。 那一直是编程。那也是治疗,但是给电脑的。

14、不是预言

不,我不知道接下来是什么,你也不知道

……我更关心问题,而不是答案……

"预测非常困难,尤其是关于未来。"——尼尔斯·玻尔,或者约吉·贝拉,或者你的冲刺计划会议

我不会告诉你AI是未来。我不会说*"适应或死"*。我不会假装我知道十年后编程会是什么样子。任何声称他们知道的人在卖东西。可能是一门课程。可能在Udemy。可能已经过时了。

我会告诉你的是:我们在一个循环,而不是革命中。我们之前来过这里,只是用不同的工具。我们会再来这里,用更不同的工具。工具会有更好的标志但更差的文档。

从穿孔卡到终端,从终端到GUI,从桌面到Web,从Web到移动,从移动到云,从云到边缘,从边缘到不知何故回到大型机但现在我们称之为其他东西——能够转型的程序员幸存下来不是因为他们学习了新语法。他们幸存下来是因为他们理解编程是关于意图,而不是实现

还有酒精。他们也幸存下来是因为酒精。

"在开始宇宙被创造。这让很多人非常生气并被广泛视为糟糕的行动。"——道格拉斯·亚当斯,描述npm init

15、我们不写的代码

……低代码,无代码,曾经有任何代码吗?……

"结束?不,旅程不在这里结束。死亡只是另一条路,我们都必须走。"——甘道夫,解释软件生命周期管理

我有时做一个冥想,通常在特别糟糕的合并冲突后或当node_modules超过我硬盘大小时。我想象我在职业生涯中写的所有代码——几十种语言的数百万行——我想象它们全部消失。删除。消失。好像从未存在。就像我在2011年工作的那个初创公司。

我还是程序员吗?

是的。因为代码从来不是目的。我解决的问题,我构建的意图,我组织成执行的混乱——那才是让我成为程序员的东西。代码只是证据,不是本质。就像犯罪现场,但有更多评论说*"TODO:以后正确修复这个"*。

五年内,我们可能根本不写代码。我们可能用语言将我们的程序带到存在,用手势在空中绘制它们,通过神经接口将它们思考成存在,或者只是礼貌地询问并期待最好的结果。媒介会改变。角色不会。

编程不会死。它只是改变字母表。

有一段时间,它用C写(或者放置你其他最喜欢的毒药以避免火焰战争)。然后YAML(黑暗时期)。现在它用全句对假装理解的模型说话。

在下一个循环,它将是别的东西:一种以可执行和可重复形式捕获意图的新方式。可能以某种方式涉及区块链。一切最终都涉及区块链。这就像技术的规则34。

"那么长,感谢所有的鱼。"——海豚,在JavaScript生态系统在自己重量下崩溃前离开地球

这就是工作——不是写代码,而是描述需要发生的世界。无论我们用Python还是散文,用配置还是对话,用解释性舞蹈还是愤怒的提交消息来描述它,工作保持:我们是执行的架构师,意图的翻译官,连接人类想要和机器能做的桥梁,知道为什么系统在凌晨3点宕机的人。

机器可以写。但必须有人知道应该写什么。而当一切都出错时必须有人被指责。

那个人,尽管有所有的自动化和人工智能和概率性编译和量子计算和接下来发生的任何东西,仍然是我们。

"已有的事后必再有;已行的事后必再行;日光之下并无新事。"——传道书1:9,显然在描述JavaScript框架生态系统

我们真幸运。

……现在就是这样,拜拜并稍后见,伙计们……


原文链接: The Eternal Return of Abstraction: Why Programming Was Never About Code

汇智网翻译整理,转载请标明出处