代码不值钱,让我听你怎么说
软件开发,正如过去几十年来的做法,已经结束了。LLM编码工具从根本上改变了这一切,无论好坏。
AI编程/Vibe Coding 遇到问题需要帮助的,联系微信 ezpoda,免费咨询。
"说话不值钱。让我看代码。" — Linus Torvalds,2000年8月
当Linux内核创始人Linus Torvalds做出这个经典言论时,是在回应对Linux内核中一段复杂代码的声明,[1]我当时是个无知、粗鲁、羽翼未丰的青少年菜鸟程序员,通过拨号网络复制粘贴开源Perl和VB代码片段。
这句经典言论此后成为软件界的格言。那时的核心意思是,谈论所有你想要做的软件内容或理论上可以做的事情很容易,但除非真正付出努力并证明它,否则谈话没有什么价值。编写和证明优质软件是一项高投入、高成本、高技能的投入。
即使有了清晰明确的软件开发计划和实施它的确切知识,任何足够复杂的编程代码在真正编写并达到功能、可靠且至少合理地面向未来的形式时,都是高投入、枯燥且耗时的。在开发软件的过程中,可能会出现许多不可预见的复杂性和陷阱,其中许多是不可解决的权衡,[2]无论是技术方面的还是外部的。软件架构中途多次更改并不罕见。仅仅尝试事物的成本呈指数级高,以至于绝大多数想法根本从未被尝试过。
归根结底,真正的瓶颈是古老的身体和生物人类限制——认知带宽、个人时间和资源,最重要的是,必须无限期坐着、一行一行地用双手编写代码的生物成本和约束,即使一切都在脑海中,同时通过大型系统的心理图进行上下文切换。如果是多个人,还有一系列的人际协调和沟通动态参与其中。因此,很难原型化和尝试不仅宏大的想法,甚至相当简单的想法。正如我们许多人所做的那样,大多数想法通常被附加到一个无底层的愿望清单中,它们很可能永远停留在那里。这就是我定期编写和开发软件并享受它的方式——从业余爱好到数百万用户依赖的关键系统——大约25年了。
当然,所有这些现在已经完全被抛出窗外,无论好坏。
回到Linus,快进25年,当他将一段AI生成的代码合并到他的玩具项目中并评论 "这比我手工做的好很多?确实如此。"[3]我,不再是羽翼未丰的菜鸟,而是一个拥有数十年软件开发伤疤和习语(既有身体的也有隐喻的)的人,能够把握其含义。不仅如此,现在有了相当多的LLM辅助编码第一手经验,我不得不说,软件开发,正如过去几十年来所做的那样,已经结束了。与此同时,许多其他事情也是如此。
我说这话时充分意识到这带有福山的历史的终结的味道,[4]但我要重申:
软件开发,正如过去几十年来所做的那样,已经结束了。
1、我
我很幸运处于过渡性的黄金时代,见证并参与互联网和软件格局的飞速发展——从拨号到DSL到千兆;Basic、Visual Basic 4/5/6和Delphi;cgi-bin的兴衰;Altavista到Google;XMLHttpRequest开启了Web 2.0;Flash的兴衰;IE的消亡和Chrome的崛起;WAP到Symbian到Android和智能手机应用程序;SourceForge的衰落和FOSS(自由和开源软件)的大规模扩散和成功;git和GitHub;SaaS的兴起;ExpertsExchange到StackOverflow;Linux世界的增长;sysadmin到devops到whateverOps;Node.js和MongoDB在同一年 ominous地诞生;微服务;VC资助的软件"独角兽"的爆炸;加密和web3骗局;模式的迅速变暗;隐私、注意力和尊严的大规模商品化和货币化;以及随后成为常态的软件巨大膨胀。
在此过程中,我一直作为专业开发者和作为FOSS爱好者,用无数种语言、框架、工具和方法论编写、维护和部署软件。从青少年时期认为"缩进代码很烂"(尴尬),到从复制粘贴到CVS到svn到git,进行空格vs制表符的战斗,到成熟到"任何适合你的方式"并仍然定期压缩PNG以节省几KB,我一直是一个涉猎者、业余爱好者和成瘾者,一个无条件地享受编写代码和开发软件的人。
但现在?我现在开发软件的方式不再是我所有这些年来所做的那样——所有正确、错误、好坏、简单和困难的结合。随着代码辅助LLM的出现,它完全颠覆了,我认为没有回头路了。
现在,这里有一些类似"雨中眼泪"式的[5]独白。
2、代码
除了一些明显的101入门外,没有通用标准来衡量什么使代码库优秀或伟大。风格、习语、模式、架构差异很大。即使是客观可证明的技术选择也取决于无法达成共识的权衡。对于像我这样的软件开发者来说,历史上,快速评估软件有一些经验法则指标。当我评估FOSS项目时,我会看一系列因素,都是客观和主观的混合,在不同情况下加权不同——项目的年龄;提交活动是否过于稀疏或疯狂;框架和依赖;代码是否组织一致且有注释而不过度抽象;是否有社区;维护者是否有响应;我能否从清晰的README快速启动和运行;文档的质量和深度...
许多这些经验法则信号让人对维护者的心理模型和工作风格以及项目的可能未来轨迹有一个合理的了解。例如,简洁的注释、README和文档表明深思熟虑、额外努力以及对其他开发者(和自我)的同理心。主要是因为,对于像我这样的凡人开发者,文档和测试是必需品,但是令人不快、枯燥和乏味的事情,编写和维护起来也是如此。
好吧,这些概念现在已经被LLM突然和粗暴地抛出窗外。它们现在可以一键生成看起来精美的文档页面、密集(具有讽刺意味的是,学究般详细)README、构建看起来很棒的用户界面、用适当的习语、模式和注释整洁地组织代码。人们不再知道这样的代码库是否是由从未编写过一行代码的非技术人员"vibe编码"的,还是可能使用或可能没有使用LLM辅助的经验丰富的开发者编写的。这些不再指示代码库的质量。相反,看起来越完美或精美的东西,就越可疑——是否是低投入、一键vibe编码的?
有了这些迹象,代码和软件质量的标准经验法则指标完全不复存在,如果不进行更仔细的检查和一些专家法医分析,现在很难区分"小麦"和"垃圾"。现在人们被迫更仔细地查看软件的血统——谁、为什么、他们的跟踪记录以及治理计划。
3、投入
历史上,一个好的开发者需要一段相当长的持续努力和多次迭代优化,才能产生10,000行质量代码,不仅交付有意义的结果,而且易于阅读和维护。虽然代码行数不是代码质量的衡量标准——它往往是成反比的——一个具有10,000行代码的高质量代码库表明投入了大量时间、努力、专注、耐心、专业知识,通常还有项目管理等技能。人类特质。
现在,LLM不仅可以几秒钟内一键生成这些,它们还可以处理软件开发工作流程的许多技术方面,从测试到系统管理到发布。与疯狂vibe编码的不可预测结果不同,当有人类专业知识引导时,输出可以是高质量和高效的。[6]这也是我的个人经验。在定期基础上,我将本来需要我几周甚至几个月的工作压缩到几天甚至几小时内。而且,这一切都没有vibe编码、AGENT.md文件或任何花哨的多代理工作流程或编排。仅仅是手臂长度的LLM代理CLI。
作为一个有无数我希望能够完成或尝试过的事情的开发者,我已经能够使用LLM工具不仅快速原型化和验证复杂想法,而且实际编写优质的生产级软件(我自己的主观指标,当然),其代码比我手工编写的更好——那些我确切知道自己需要做什么但受到物理限制约束的事情,以及那些对我来说不清楚并需要新想法、方法和飞跃的事情。在此过程中,学习和改进我自己的理解。
我通常为实现我想要或能够工程的软件结果而承担的生理、认知和情感成本,无疑减少了几个数量级。这解放的时间和带宽,我现在花在工程、架构、辩论、修补、尝试扩展想象力以及编写更多我真正想要编写的简洁而有意义的代码上。
还记得那句老格言,"编程是90%思考和10%打字"吗?现在确实如此了。
4、垃圾
考虑到所有这些,当代码可以由从未编写过任何代码的人在几秒钟内以工业规模生成时,作为人工制品的代码的价值是什么?除了明显糟糕的LLM生成代码外,当代码整洁地组织且功能正常(是的,当引导得当时,LLM可以编写好代码),什么让它有价值或没有?我们不会希望现实世界中的系统中有LLM生成的代码,而是更喜欢纯正的人类代码,对吗?嗯,那将是一个很棒的笑话。[7][8][9][10][11]
现实是,全球每天编写的绝大多数代码很可能处于垃圾边缘。[12]软件开发甚至不是一个达到任何客观成熟度的学科。医学医生和土木工程师经过严格培训才能获得许可证,该许可证取决于其工作对现实世界的后果。软件开发者和工程师呢?世界运行着由人类编写的工程糟糕、拼凑在一起、臃肿且充满垃圾代码的系统,主要由处于权力地位、具有不正当激励且完全没有技术知识或没有任何人文基础的非技术"技术领袖"的暴政支配。[13]
有人可能,为了触发情绪,争辩说AI垃圾至少比绝大多数人类编写的代码格式整齐、文档更完整且语法更一致。( ͡° ͜ʖ ͡°)
开玩笑 aside,我不是AI垃圾的粉丝。阅读(死)互联网上那些明显没有灵魂的LLM生成消息和文章[14]是对杏仁核中神经元激活的浪费,如果根本没有激活的话。世界各地如此多人在互联网上以完全相同的方式用LLM说话和表达,这是令人毛骨悚然的自我Pluribus-化。[15]没有人类的创造、完美和缺陷,语言、文学、艺术、音乐等都是无法享受的(对大多数人)。无限、可即时生成的东西没有人类约束和限制,实际上很难重视。
那么代码呢?嗯,代码与艺术、文学或任何形式的直接沟通和唤起有点不同。代码一直是达到目的的手段。与诗歌或散文不同,最终用户不阅读或关心代码。他们不关心门户背后的系统是用什么语言或框架或架构构成的。代码是隐藏的。他们通过各种形式的UX与代码的效果和结果交互。我,略带不情愿地说,作为享受编写、组织甚至培育代码的人。对于那些沉浸其中的人来说,其中有创造力和艺术的元素,许多像我这样的人,对所有软件事物都是近乎固执的暴躁者。[16]
忽略完全糟糕的代码,在功能代码如此丰富以至于"好"和"坏"无法区分的世界中,使功能AI代码成为垃圾或非垃圾的是什么?我强烈认为,这是问责制框架,具有讽刺意味的是人类元素。也就是说,所有东西(代码)平等的情况下,至少在情感和道德上(有时也在法律上)能够对人工制品进行问责的能力,赋予了价值。
当有人在开源代码库上获得一个大的PR(拉取请求)时,无论其质量如何,如果它是手工编写的,就有内在的价值和对很可能归因于它的人类时间和努力的同情心。众所周知,在提交PR之前编写大量代码付出了身体和认知成本。这就是使该代码"昂贵"而不是廉价的原因。
当PR明显是LLM生成时,无论它多么好,第一反应很可能是"垃圾!",因为不再可能立即确定其背后的人类努力。另一方面,读取和验证它所需的努力不成比例且呈指数级高——撇开那些也将代码阅读外包给LLM的人。它很可能是功能最好的代码,但它只是无数可能在无需人类成本或努力的情况下生成的变体中的一个。情感上,感觉被这些代码转储负担是错误和不公平的。
此时,我们的现实已经成为巴别塔图书馆的版本。[17]
5、FOSS
谈到库,FOSS也许是人类创造的最伟大的公共资源。FOSS及其前身的起源,各种共享代码的方案,可以追溯到软件成本过高且需要巨大专业技能才能创建的基本前提。当时世界上只有极少数人有能力做到这一点,其他人都被迫使用少数人(无论是专有还是不是)的创作。虽然自那时以来全球开发者生态系统已经爆发,但创作者与用户的比例基本保持不变。大规模FOSS协作和社区动态都源于此——代码库作为有价值的共享人工制品。
在一个代码廉价且中小型软件库和模块可以由专家快速创建、完美定制并根据其需求调整,无论多么小众的世界里会发生什么?忘记专业技能,一个任何相当精通的人都可以vibe编码他们私下需要的小东西,随心所欲。我看到这种情况到处都在发生。StackOverflow正在发生什么[18]软件也在发生,虽然不那么剧烈。这似乎触及了人类动态、社会条件和驱动FOSS协作和共享的激励的核心。此外,如果考虑到FOSS项目以前所未有的规模制造的前寒武纪大爆发,那么保持繁荣和蓬勃发展的优质FOSS项目、专家治理、策展和信任可能比代码本身更有价值。
6、只见树木不见森林
人类在没有语法高亮、IDE或任何形式的工具的情况下编写了令人惊叹的软件。人类也产生了垃圾,尽管世界上有所有这些工具和资源。一个具有良好表达能力技能和关心质量的有能力的开发者,将以自己的方式使用LLM或任何其他工具来产生优质结果。一个表达能力差或缺乏对质量关心的无能开发者,将产生糟糕的东西,无论是否使用LLM。
因此,"代理"vibe编码的狂热支持者,[19]和LLM的彻底谴责者,都只见树木不见森林。存在一条务实的中间道路,那些拥有经验、专业知识、能力和表达能力的人可以使用这些工具,以正确的权衡集获得他们想要的结果。
Vibe编码有其地位,尤其是对于非技术人来说,他们第一次可以修补、探索、玩得开心并通过软件赋能自己。我看到这种情况在我周围到处都在发生。然而,vibe编码的狂热信徒错过了一个让人类认真对待人工制品的非常重要的东西——有限性。他们正在生成一个巨大的巴别塔式图书馆,他们自己很可能淹没在由谄媚代理生成的垃圾海洋中。垃圾,不是因为代码质量差,而是因为任何可以无限生成且没有有意义血统的东西很难重视或认真对待。人类根本上不能很好地处理无限的任何东西供应,尤其是选择。完全不足为奇,因为我们是高度受限的生物存在,在有限星球上以有限资源进化,度过有限寿命。
然后,谴责者们似乎无法从质疑的论证中走出来。[20]他们谴责LLM是因为出于某种原因个人不喜欢,或者无法获得理想结果,或者对它们有错误期望,或者干脆厌倦了它们。但这无关紧要,因为有相当多的人口在使用完全相同的工具并获得相反的体验。我就是其中之一。
综上所述,由炒作、狂热和贪婪助长的广泛脑残和完全愚蠢、有害的实现,是不幸的现实和巨大担忧的原因。AI商业泡沫也许是历史上最大的之一。FOSS AI技术的兴起让人充满希望。然而,将这些技术的根本、物理能力——不是理论上的,而是规律的、已证明和实用的——与坏行为者、不良行为、算计和无意义实现错误地混为一谈,是不理性的。这是只见树木不见森林。
7、人类成本
所有这些都是从经验丰富的开发者和工程师的角度出发的。对于那些经历过足够风霜的人来说,这些AI技术提供了极其有效和强大的协助。
但是对于刚刚起步的年轻人呢?如果一个人没有自己的基础,如果没有发展和对系统和软件开发过程有内在和细致的理解,那么这些技术是不可靠的危险妖怪。你要求代码,它就给代码。你要求更改,它就给更改。很快,你就会被一个你不懂其工作原理的代码库困住,被迫回到妖怪面前并无助地依赖它。因为你上钩并依赖妖怪,否则本来可以让基础和基本技能和理解发展起来的自然情况永远不会出现,从而导致认知衰退。[21]那么整整一代初级开发者将如何,他们从未有机会有意义地成为资深开发者?
就我个人而言,我不在乎极端的vibe编码者或谴责者甚至垃圾。我们都会淹没在垃圾洪流中,从中,理智、复苏和新的软件秩序将涌现。真正的担忧是那些被剥夺了客观区分什么是垃圾和什么不是的机会的学习者一代。更糟糕的是,有效使用这些工具的经验丰富人士可能会因在基础方式指导和培训初级人员而感到失去动力,这是社会演变的自然部分。不仅是软件开发,而且是将代理权和决策制定完全外包给黑盒子。
8、谈话
此时,对于动手开发者来说,阅读和批判性评估代码变得比学习语法并逐行输入更重要。当然,这仍然是一项重要技能,因为有效阅读代码的能力首先来自于此。但是,日常软件开发工作流程已经完全颠覆。
一个能够很好谈话(即想象、表达、定义问题陈述、架构和工程)的经验丰富的开发者,比不能做到的人有巨大优势,而且是前所未有的不成比例地。特定语言、语法和框架的知识——代码——不再是瓶颈。你身体的限制不再是障碍。即时大规模创建代码的机制现在成为每个人都能获得的商品,只需一个pip install等效。它不需要特殊培训,不需要学习新语言或框架,实际上没有进入壁垒——只需要良好的旧批判性思维和基础人类技能以及运行机制的能力。
传统的软件开发方法论和角色——瀑布模型[22]到敏捷,[23]到测试人员,从资深到初级——随着传统边界整合到无法想象的快速、压缩、模糊、迭代"代理"循环而根本性改变。软件开发中的人员、组织和公共社区的动态,非常有共享和协作的人类激励,[24][25][26]都在变化。
有史以来第一次,好的谈话比好的代码具有指数级的价值。其影响是重大和颠覆性的。这一次,感觉不同。
原文链接: Code is cheap. Show me the talk.
汇智网翻译整理,转载请标明出处