编程是一门艺术。它与精细艺术或音乐的相似之处不大,而更接近于建筑或木工——结合了形式和功能——但它确实是一门艺术。
如果你不相信我,可以考虑代码评审。我曾经参与过代码评审,对代码的精湛掌握感到钦佩,解决方案的优雅之处像一颗璀璨的宝石一样闪耀,我读到莫扎特的作品时,内心充满了萨列里般的感动。相反,我也曾指导过初级程序员,阅读他们的代码后立即发现了可以帮助他们成长的机会——这部分代码重复了,这部分可以更简洁地表达,这部分影响了性能优化,等等。
当我对AI生成的代码进行评审时,我却没有这些感受。我有时可以分辨出代码是由Claude还是Codex生成的(Claude喜欢使用很多听起来很官方的注释,而Codex则更直接),但我的思维往往会转向PR背后的意图、提示或计划。纠结代码的细节,如for循环的类型或函数名称,感觉完全是多余的。有时,最好的建议是选择一个新的计划并重新提示。
在我的大部分职业生涯中,我一直持有两种相互矛盾的编程观点:
随着大型语言模型(LLM)编程代理的出现,我认为这一矛盾已经在功能上得到了坚定的解决。或者,正如Les Orchard所说,“让它运行的人”已经战胜了“工艺爱好者”。
当然,工艺仍然存在,但它已经不同了。当我与代理一起编码时,我会思考更高层次的抽象:架构、弹性、系统、监控、测试。我曾经非常关注细节——Claude以大写字母开始注释,而我很少这样做;Claude以一种方式命名变量,而我更喜欢另一种方式——但我很快就学会了不再关心。特别是当代理可能会在下一次重构中撤销你的挑剔时,纠结于细节纯粹是浪费时间。
在某些方面,我感觉自己像一名木匠,他的工作现在是为宜家工厂设计蓝图。当然,在设计蓝图时仍然存在艺术性,但如果你不关心工厂生产的一张或两张桌子腿上有木刺,那么这就无关紧要了。关键是要生产足够多的家具,速度足够快,这样小瑕疵就无关紧要了。品位和判断力仍然很重要,但它们是在装配线上督工的层面上,而不是在操作凿子的木匠大师层面上。
对我来说,编程在艺术谱系中占据了一个奇怪的位置。有些代码是纯粹的艺术——例如,Jenn Schiffer曾担任艺术家驻地,并有多个项目致力于艺术和编程的交汇处。而其他代码则是纯粹功能性的:我相信许多程序员在整个职业生涯中都在为企业CRM编写粘合代码,从未想过他们正在创造的东西是否是“艺术”。
我对我们这一代程序员的担忧是,我们中的许多人一直从编程中获取艺术“养分”:认真对待工艺,审阅他人的代码时像文学批评家一样,试图提升职业水平。现在,这个职业已经变成了一条装配线,我们中的许多人都急切地跳入新的工作中,成为蓝图设计师,却没有质疑这会对我们的灵魂造成什么影响。我相信,艺术对于丰富和充实的人类生活是必要的,所以这并不是一个无关紧要的担忧。
我对其他程序员的建议,至少是我给自己的建议是,如果你在编程中寻找艺术:停止寻找。如果你以前从未对诗歌、绘画、舞蹈等感兴趣,现在就是一个好时机。在一个互联网上充满了机器人向每个人的大脑中灌输平淡的想法时代,寻找明显的人类表达形式已经变得至关重要。
这可能听起来很感性(或像我正在经历中年危机),但我最近做了以下事情:
你可能也注意到,这个博客最近变得更加感性和实验性。我从未使用LLM来帮助我写作(甚至不用于拼写检查!),但最近我试图克服自己写平淡、易于预测的文章的倾向。在一个机器可以“预测下一个代币”的世界里,最好的反应是什么?变得不那么可预测。至少我希望我是这样的。
我不认为编程作为一种艺术形式已经死亡,我认为新的工艺会有自己的大师、自己的风格、自己的表现力。也许我会感到惊讶,在某个地方,会有一位艺术家驻地挥舞着代理指挥家像画笔一样!但我并不这么认为。如果你不织毛衣,那么你就是在流水线上制作衣服,如果衣服是一次性的,那么它在艺术上就没那么有趣,因为它少了人类的触摸。
在我看来,我们正处于编程的快时尚时代:软件被匆忙编写,被使用,被丢弃,然后再被匆忙编写。这并不是一件完全坏事,我相信许多非程序员尤其对他们获得的超能力感到兴奋。但作为程序员,我们不应忽视我们失去了什么,而应该通过新的艺术营养来源来弥补。