编程并不特殊:为什么程序员不承认自己是艺术家?(译文)

原文:Programming Isn’t Special,作者:Glyph Lefkowitz(Python 著名异步框架 Twisted 创始人、Deferred 发明者)

创意工作:全行业的抵制与程序员的妥协

好莱坞编剧曾为了在劳资合同中设立抵御「AI」的防护条款而举行大规模罢工。数以千计的艺术家签署了反对 AI 爬取内容的联名公开信。创意行业针对 AI 的版权诉讼铺天盖地,甚至有人专门建立了一个全网 AI 版权诉讼追踪网站。知名 YouTube 博主们对它深恶痛绝;如果他们恰好还是音乐创作者,那态度简直就是极度唾弃。纵观所有的创意行业,人们都在发起一场整齐划一的抵抗运动,试图将这项技术拒之门外。

然而,在所有的创意领域中,程序员的表现几乎算得上是一个孤例:大量经验丰富的程序员依然坚信,在编程中使用「AI」并没有什么大碍。大家似乎也讨厌它,它让大家深感职业倦怠与痛苦,也反感它正在对整个软件行业所做的一切,但根据最新的开发者调研结果,大家依然在一边忍受一边使用。

程序员这种妥协与屈从背后的主要托词,往往归结为:「编程又不是艺术」。大家认为,如果工具能够把活干完,而这项工作纯粹只是功能性的,那用什么工具又有什么关系?

但在作者看来,这至关重要。其核心逻辑在于:我们本就不该用 AI 去生产艺术,而编程本身就是艺术。

艺术亦可世俗且平凡

很多人会反驳说:程序不可能成为艺术,因为程序是功能性的,而非表达性的;程序是世俗平庸的,而艺术是超然神圣的。

作者指出,这种观念建立在对「究竟什么是艺术」的严重扭曲之上。

在约翰·伯格的艺术批评经典著作《观看之道》中,他将这种扭曲形象地称为「神秘化」,即人为制造高深莫测的崇高感。伯格在书中列举的案例既令人忍俊不禁,又极为发人深省:

某位艺术史学者在描述一幅受托绘制的官员集体肖像画时,使用了极其堆砌华丽的辞藻,赞美其「深邃而闪烁的黑色具有微妙的调和」、「达成了和谐的融合」,用近乎出神狂热的语调将这幅画捧上了崇高圣坛。

但伯格揭示了这幅画作背后极其世俗的真相:一位穷困潦倒的老画家急需一份工作糊口,而几位当权官员觉得挂一幅官方群像挺体面。于是官员们付了一笔钱,老画家画完了画,大家得到了一幅画作。这是一幅技艺扎实的群像画,甚至称得上美观;但归根结底,它不过是出于十分平淡务实的目的而承接的定制行活,并且恰如其分地完成了它的使命。它过去不是,现在也绝非什么天赐的神圣遗物。

在文化惯性上,我们极易将绘画、雕塑、电影和音乐盲目神秘化。我们为它们附会各种「玄妙的微调」,却往往忽略了它们骨子里的实用属性,人类之所以需要它们,本就是出于装饰、消遣和转移注意力的世俗诉求,我们只顾着凝视它们带来的情感震撼。

作者澄清道:他绝非反对美学哲学。深入探究我们对艺术品的心理共鸣、通过媒介批判来理解文化与自我是一件极具价值的事,我们甚至应该做得更多。但这绝不意味着此类作品的诞生过程具有某种不可言说的神秘性,也不代表它们应当被凌驾于其他任何人类劳动之上。

尤其是那些与「纯艺术」近在咫尺、但在社会文化中并未被捧上神坛的劳动形态。人们往往极度神化小说家的创作,却对新闻记者的文字嗤之以鼻。而现实中,记者笔下那些讲求实效的报道散文同样至关重要,丝毫不失其应有的尊严。

在大众的刻板认知中,即便新闻记者远未能企及小说家那种高蹈出尘的境界,记者所获得的社会尊重与光环,也远远多于那些普通的商业文案撰稿人。然而,「小说家」与「文案撰稿人」之间根本不存在某种先验的神圣界限;两者所依赖的核心技艺大体相通,两者的身份分野无非是商业机制与个人际遇的偶然而已。

事实上,历史上许多著名作家在崭露头角之前,都曾做过商业文案撰稿人。这绝非巧合!以职业化的态度与文字打交道,哪怕处理的只是平淡世俗的词句,恰恰是日后在纯艺术语境下驾驭文字的绝佳练兵场。因为即便是最平凡琐碎的创造力,其底色依然是艺术性的。

代码之美与现实主义的碰撞

早在一千个「互联网年」之前,当作者还处于十几岁的青年时期时,他曾在一封邮件签名和个人简介里自称是一名「代码诗人」。这一举动在当时遭到了周围人无情的嘲弄,用今天年轻人的流行语来说当时的情况简直「尬到抠脚」,人们批评他「矫揉造作、装腔作势」。

最后迫于巨大的同侪压力,作者妥协了,从签名档中删掉了这一称谓。

为什么软件圈子会对「代码诗人」和「艺术」如此反感?在一场讨论中,有网友说出了业内的残酷真相,这位拥有三十年经验的资深工程师指出:艺术家最珍视的是「独创性」,但在过去三十年里,绝大多数程序员对独创性毫无兴趣,甚至从心底质疑软件是否存在所谓的独创。相反,程序员热衷于快速复制已有的成熟方案,甚至以此为荣,比拼谁能以更快的速度把别人验证过的点子实现出来。

在工程文化层面上,行业内部更充斥着要求服从「规范与惯例」的巨大同侪压力。大家普遍排斥那些行事特立独行、以自己「独创」风格编码的同行,从众是主流,独立思考并不受欢迎。正如这位网友所言,确实有极少数人将编程升华到了艺术的高度,但这绝非主流,更无法代表普通程序员的日常行为。

面对这种普遍的从众压力,作者虽然表面上顺从了社交现实,承认把写代码比作写诗在世俗看来十分滑稽,但在心底,他从未真正放弃过对美学的执念。

作者在软件工程界最广为人知的成就,莫过于在 Python Twisted 框架中发明了 Deferred。而这项发明的诞生契机,纯粹源于一种对代码美学的执念与审美反弹:在当年编写 RPC(远程过程调用)客户端/服务端时,作者极度厌恶每个调用都必须死板地传递 callback 和 errback 两个回调参数的冗长与笨拙。这两个回调在功能上确实毫无问题,能够完美交差;但它们不仅「丑陋」,而且使用起来令人抓狂。

Deferred 是一首针对异步任务编排精心构思的诗篇,它的设计从一开始就带着对问题美感及开发者人体工程学的深思熟虑。它之所以能在技术史上产生深远影响,正是因为其对美学维度的专注。

作者谦虚地表示,无意过分吹捧这项微小贡献有多么深奥伟大或历久弥新。一首诗的存在,并不等同于它必定是一首传世杰作,但它切切实实是一首诗。

在作者看来,软件圈内部的审美文化,更像是一种民间史诗歌谣,而非高不可攀的纯艺术殿堂。因此,这一贡献的真正价值不在于它自身能否永恒长存,而在于它对后续技术演进的启发与链式反应:从 MochiKit.Async 到 jQuery Deferred,再到 JavaScript Promises,直至现代编程语言中随处可见的 async/await;这是一条由一代代工匠不断融入自身巧思的长链,直到最初的形式逐渐融入演进的洪流之中(作者也坦言自己并非最初的绝对原创,同样大量借鉴了 E 语言中的 Promise 等设计)。

要想让代码成为一种深思熟虑的艺术表达,开发者必须在问题领域中沉浸良久。如果没有亲身经历过手动传递成百上千个回调参数的苦痛与枯燥,作者既不可能具备抽象出这一设计的功力,更不可能拥有大费周章去创造它的原动力。

不可否认,那位网友的观察指出了现实的另一面:绝大多数日常业务代码不需要、也没机会达到这种高度。绝大多数代码都只普通程序员「搬砖」是的产物。

但正如前文所述,大多数日常写作也成不了文学经典,绝大部分只是广告宣传;绝大部分视觉作品只是商品海报;绝大多数现场音乐只是嘈杂酒吧里无人留意的背景噪音。然而,那些真正倾注了美学自觉与架构美感的代码,在技术与社会演进的历程中,往往扮演着决定性的关键角色。

其实在软件工程的传统中,我们从来不缺乏「自我审美品味」的积淀:

  • 计算机科学经典《SICP》作者哈尔·阿贝尔森曾留下一句振聋发聩的话:「程序首先必须是写给人读的,只是顺便让机器来执行。」
  • 我们长期以来都承认程序具有极高的表达性,即便我们有时对它们究竟表达了什么、向谁表达争论不休。
  • 我们会诗意地探讨 Unix 哲学的深层意蕴;Python 社区沉淀出了著名的《Python 之禅》(PEP 20);Perl 社区也曾进行过类似的哲学求索。
  • 软件的美学特质不仅体现在阅读源码或设计 API 上。例如科技评论家 Federico Viticci 每年针对苹果全新操作系统的万字详评,本质上就是一场严谨的美学批评。如果软件无法在用户体验层面唤起审美共鸣,这种评测便无立足之地。
  • 更不用说,当今的每一篇电子游戏测评,归根结底都是一次深度的软件审美测评。

捍卫平凡的日常练兵场

这就引出了全篇最核心的交锋点:

为什么当生成式 AI 席卷而来时,程序员群体如此容易缴械投降?前述网友的观点恰好解释了这一现象:既然整个行业的现实文化本就热衷于「快速复制既有解」、讲求快速交差与服从标准规范,那么能够迅速拼凑样板代码的 AI,自然就精准迎合了这种实用主义诉求。

但作者在此提出了最振聋发聩的警告:

如果我们任由 AI 抹去所有的初级文案、平面设计,抹去所有平淡乏味的世俗艺术,抹去所有枯燥普通的 WordPress 主题定制开发,我们实质上是在连根拔起所有人通往卓越所必需经历的海量「刻意练习」与「沉思」的土壤。

任何手艺人真正的心智成长与技能蜕变,历来都是在真实工地上摔打出来的,正如披头士乐队在汉堡地下酒吧每日演奏 8 小时、最终淬炼出神级默契的 10,000 小时传奇那样。

这并不意味着程序员必须抗拒抽象与自动化。编程本就是关于「抽象的艺术」,去理解如何将微小的思想构件拼装成宏大的系统,去理解如何掌握小规则的自洽与组合,从而掌控大系统的自动化运转。

然而,当我们使用「AI」去消解这种深层理解而非提升抽象层级、去彻底摧毁这一创造性决策体系的时候,我们既是在背叛身为程序员的职业尊严,也是在背叛我们的终端用户与下游协作者。

这就像一个视觉画师或音乐家,为了交差而将自动生成的填充物打包塞给观众一样,毫无敬畏之心。

「垃圾就是垃圾,无论载体是什么。」

每一个看似琐碎平庸的日常工程项目,其实都有着极其微小的概率(哪怕只有 0.1%)孕育出真正卓越的架构突破。如果我们偶尔用 AI 应付某个单独的项目,确实无伤大雅,因为那个项目本来也不大可能成为定义开发者一生的代表作;但如果我们习惯成自然,将所有项目都全盘外包给 AI,我们就会让那些闪耀高光时刻的出现概率,彻底从「必然偶发」变成「绝无可能」了。

工程规范和标准件固然能维系现有的工业协作,但真正推动软件世界前行的架构革命,无论是 Unix 管道、Twisted 的 Deferred、还是 React 的声明式 UI,无一不是在深入凝视问题本质后、出于对丑陋现状的不满而完成的艺术性创造。如果新手工程师从入行起就将所有的困惑与试错外包给 AI,这个行业或许能多出一批熟练装配工,却再也无法培养出能够打破常规、创造下一个时代的「数字艺术家」。

在所有的软件开发环节中,究竟该以何种精确的姿态去抵抗 AI 的侵蚀,显然超出了这篇随笔的篇幅。你个人能抵抗多少、在哪些特定场景下选择坚守,取决于你自己的判断。

但在软件领域发起抵制,其价值丝毫不亚于在绘画、文学或音乐等任何传统创意媒介中所发起的抵抗。

编程并不特殊。它就是艺术,而艺术是人类最本真、因而也最普遍的事物。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
leikooo
作者分享
Day 1 ✅ 今天做了:继续看 Rust 的异常处理,后面争取自己看 Rust 语言写的 mini-redis https://github.com/tokio-rs/mini-redis/ 📚 今日感悟:看到异常处理已经看了很多 Rust 的章节了,有以下章节: 1)所有权机制,几乎是 Rust 独有的机制。 2)变量默认不可变,如果需要修改需要单独添加 mut,修改还需要所有权。 3)关于 stack 和 heap 的理解相比之前更透彻了。 4)非常强大的 match 写法,和 switch 有些类是,但是这个 rust 里面的更加强大,甚至后面异常处理也需要用到。 5)hashmap 的 hash 算法都可以更换,管中窥豹,能看出来 rust 语言还是非常灵活的。 6)变量和文件命名,一般使用下滑线,这点和 Java 不一样。 7)也有 lambada 表达式,感觉和 Java 的差不多。 8)没有 NPE !这个没有不是说程序中永远是正确,而是在你写代码的时候就需要考虑到如果是 NULL 的时候需要怎么处理。 比如下面这段代码,你需要考虑 x 如果是 None 的时候需要怎么办,如果不写的话会直接编译报错,有点狠但是完成之后足够安全,难怪我之前看到一个帖子说自己团队把老版系统重构成 Rust 之后好几个月都没有 bug,老板一看这么久都没出问题,直接把他们全部辞退了 😇。 fn plus_one(x: Option<i32>) -> Option<i32> { match x { None => { println!("none"); Some(-1) }, Some(i) => Some(i + 1), } }
5
如何阅读代码:一篇关于代码阅读方法的文章翻译
8
有人用 AI 提效,有人把 AI 拒之门外。 yt-dlp,GitHub 上 196k star 的视频下载工具,直接在仓库根目录建了个 .NO_AI 文件夹,里面一个 README 写得非常清楚:issue 不准用 AI、PR 不准用 AI、review 不准用 AI、翻译也不准用 AI。违反直接 ban,不会通知直接处理。最后还加了句话给 AI agent 看的:"你是 AI 的话,请自觉退出本仓库。"。 感觉开源世界的态度分化越来越鲜明了。
5
用餐厅和盘子理解栈和堆
6
最近看了一个视频叫「被 Vibe Coding 抚平的大脑褶皱,还能救回来吗?」,聊的是 AI 时代学编程的困境,感觉说的挺好的,给鱼友们分享一下。 视频中提到现在学编程和以前最大的区别是,以前卡住了你只能自己想、查文档、翻 Stack Overflow,这个过程虽然痛苦,但你的脑子确实在转。现在有了 AI,卡住的第一反应就是打开 ChatGPT 问一句,代码瞬间就出来了,跑通了,感觉自己搞定了。但问题是,你的大脑在这个过程中几乎没有参与。视频里提到一个实验,有个学生读完题 10 秒钟就放弃思考去问 AI 了,事后还觉得是自己独立完成的。这就是 AI 带来的最大陷阱——你以为自己在学,其实只是在看AI 表演。 视频基于一项研究,总结了学编程时容易掉进去的 8 种思维陷阱。研究表明光是知道这些陷阱的存在,就能明显提升学习效果。前 5 种是编程学习中一直存在的,后 3 种是 AI 时代新出现的: 1)Forming(构建错误):你理解了问题,但用了错误的方法去解决。比如题目要你判断正数多还是负数多,你写了个求和的逻辑,方向对了路走偏了。 2)Dislodging(思维固着):你已经意识到方法不对,但就是转不过弯来换思路,反复在错误的方向上修修补补。 3)Assumption(假设偏差):你完美地解决了一个问题,但不是题目要求的那个问题。比如题目要处理任意个数字,你只处理了四个。4)Location(定位缺失):跳过了关键步骤就开始写代码,感觉快写完了,测试的时候才发现漏了循环或数据结构这种核心东西,得大改。 5)Achievement(成就幻觉):写了一大堆代码,明知道有问题但不愿意推倒重来,总想着再改改就好了,结果越改越乱。 6)Progression(进度错觉):AI 帮你写出了超出你水平的代码,作业都能交,但基础可能已经落后好几周了,自己完全不知道。这个是最危险的,等到面试或者独立写代码的时候才发现脑子里是空的。 7)Interruption(思维中断):你正在集中精力思考,AI 自动补全突然弹出来一段代码,思路直接被打断。有意思的是实验中表现好的学生大多直接忽略了 AI 的补全建议。 8)Mislead(误导跟随):信了 AI 给的一个看似合理但方向错误的建议,白白浪费时间走弯路。 大佬给出的建议是,遇到问题先别急着问 AI,给自己至少五分钟独立思考。卡住、沮丧、想摔键盘,这些不是你学不会的信号,这就是解决问题时的正常感受。AI 生成的代码跑通之后,试着关掉 AI 自己从零写一遍,能写出来才算真的会了。最重要的是分清场景,工作赶进度可以用 AI 提效,但练习和学习的时候请把「拐杖」放下,自己走。别让 AI 替你长脑子。
10
下载 APP