“编程大神”DHH谈AI写代码热潮:掌握编程的,永远是动手写的人
- DHH对“氛围编程”是否能发展为一项技能持怀疑态度。他认为编辑和修正代码的能力建立在是否具备创作能力之上,就像编辑一本书的人通常也要具备写作能力。
- DHH强调AI应服务于程序员,而非主导代码生成流程。过度依赖AI将削弱人与代码的连接,损害学习效果和创造力。
- AI在复杂项目中的表现尚不成熟,容易产生隐藏bug、安全问题和可维护性差的问题。它仍像一个“初学程序员”。
- DHH称自己为“软件写作者”,追求优雅可读代码;希望AI编程助手有“严格模式”,生成逻辑清晰、结构良好的代码。
- 对编程初学者,DHH推荐Ruby(语法简洁、表达力强)、JavaScript(Web 开发核心)、Go(适合高性能系统)这三门语言。
“氛围编程”是一种利用生成式AI,通过自然语言提示快速生成代码,再进行修改迭代的编程方式。它最大的优势在于降低门槛,让不懂代码的人也能构建原型,极大加速了从创意到实现的过程。多位技术领域的知名人士对这一趋势表示认可。Y Combinator CEO Garry Tan 曾在播客节目中表示:“Vibe Coding 将成为未来编码的主流方式。如果你不采用这种方式,可能会在竞争中被甩在后面”。
不过,也有人对此表示质疑。近日,编程界大神戴维·海涅迈尔·汉森(David Heinemeier Hansson,英文名缩写DHH)做客知名播客节目主持人莱克斯·弗里德曼(Lex Fridman)的访谈节目,围绕“氛围编程”,以及“编程的未来”等话题进行了深入探讨。
DHH对“氛围编程”是否能发展为真正的技能持怀疑态度,甚至直言是“白日梦”。他认为编辑和修正代码的能力建立在是否具备创作能力之上,就像编辑一本书的人通常也要具备写作能力。
DHH还强调,AI应成为开发者的助手,而非主导者。程序员应通过亲手编程保持技能与创造力的成长,而非完全依赖AI生成结果。他还鼓励新手开发者相信直觉,勇于实践,在不断尝试中形成“内在的超级计算机”式判断力。
DHH是开源框架Ruby on Rails的创造者。该框架用于构建网站和Web应用程序开发,强调“约定优于配置”和敏捷开发理念,使开发者能够更快、更高效地搭建功能完善的应用系统,彻底改变了Web应用的开发方式,推动了敏捷开发和初创企业的技术爆发。他以“软件写作者”的身份重新定义了编程的意义,强调代码应具备表达力、美感和人性。
在AI浪潮席卷技术行业的当下,DHH持续发声,主张AI应为程序员赋能而非取代,呼吁开发者保持创造力、掌控力与人文视角。
以下是DHH接受播客专访的主要内容:
01. “氛围编程”的边界与陷阱
弗里德曼:什么是“氛围编程”?它在新手程序员的学习过程中扮演怎样的角色?
DHH:“氛围编程”指的是利用生成式AI工具,根据直觉或创意通过自然语言提示快速生成初始代码草稿,然后通过手动修改或进一步的提示进行迭代优化的编程方式。这种方法非常适合快速验证创意或想法。就像Excel或Access数据库让非程序员也能构建业务模型一样,“氛围编程”也让创意更容易变成现实。
不过,“氛围编程”并不利于深入掌握编程技能。学习编程就像学弹吉他,需要亲手练习,才能内化知识。我建议新手程序员把大部分时间用于从零开始编写代码,AI工具可以作为辅助,提高效率,但不应成为主导工具。只有通过实践,才能真正建立扎实的技术能力。
弗里德曼:你怎么看待“氛围编程”作为一种新兴技能的可能性?在AI辅助下快速生成和迭代代码,是否可能成为一种新的编程方式?
DHH:我持怀疑态度,那是提示工程师的梦想,但我认为这完全是白日梦。编辑和修正代码的能力建立在你是否具备创作能力之上,就像编辑一本书的人通常也要具备写作能力。
我举个自己的例子。在开发Omakub(专为DHH主导开发的Ubuntu操作系统设计,旨在简化Web开发环境的搭建过程)时,我尝试用AI生成Bash脚本(该脚本于1987年由布莱恩·福克斯为了GNU计划而编写,通常运行于文本窗口中,并能执行用户直接输入的命令)。由于我对Bash不熟悉,一开始依赖AI生成代码,但我很快发现这并不能让我真正理解语法和结构,必须自己动手写代码,才能掌握这门语言。
“氛围编程”可以提高短期效率,尤其是在你不熟悉的领域,但如果只靠它写代码,就难以建立深层次的编程能力。AI的理想状态是让非技术人员通过自然语言构建复杂系统,但目前这仍是一种愿景,距离完全实现还有很长的路要走。现在我们仍需要人类来审查和确保代码的正确性。
弗里德曼:如果尝试用“氛围编程”构建类似Basecamp这样的复杂系统,会遇到哪些挑战?
DHH:目前,“氛围编程”在处理复杂系统时会很快触及能力瓶颈。AI生成的代码虽然在表面上看起来功能正常,但经常隐藏着一些严重问题,比如泄露API密钥、以明文存储密码等安全漏洞。这些问题也许可以逐步修复,但更棘手的是维护性差,一处修改往往会牵一发而动全身,导致更多新问题。
这就像一个初级程序员在管理大型项目时可能犯下的错误。我举个例子,开发者皮特·莱维尔斯(Pieter Levels)曾用AI辅助开发飞行模拟器,但项目代码在复杂到一定程度后就开始“自噬其尾”——修一个bug 会引出三个新bug。这说明AI在复杂系统开发中还处在“初学者阶段”,需要人类开发者的监督与干预,才能确保系统稳定和可维护。也许未来AI能克服这些问题,但至少目前,它还远不能独立胜任这种级别的开发任务。
弗里德曼:对于新手程序员来说,该如何在“氛围编程”和手动编码之间找到平衡?
DHH:我建议新手程序员将70%到80%的时间花在从零开始写代码上,真正理解每一行代码的含义和背后的逻辑。“氛围编程”可以占用20%到30%的时间,用来验证创意、加快迭代速度,或解决特定问题。
如果只靠AI生成代码,很容易陷入“空洞的学习”状态:任务完成了,但知识没掌握。技能的成长需要亲手实践,就像健身或弹吉他一样,必须亲自投入其中。合理结合AI的辅助能力和传统的编程训练,新手才能在效率和能力之间取得平衡,确保技能不断成长,同时不过度依赖工具。
02. AI只是助手,不是编程的主角
弗里德曼:你如何看待编程的未来?Ruby on Rails在其中扮演怎样的角色?
DHH:编程的未来应着眼于提升开发者的生产力,而不仅仅是追求运行时性能。Ruby on Rails之所以成功,是因为它赋予了开发者从想法到实现的完整能力,特别适合初创公司进行快速迭代。例如,Shopify 的创始人托比·卢特克(Toby Lütke)在最初就是凭借Rails开发出Snow Devil,并最终将其发展成全球领先的电商平台。
相比之下,大公司开发的工具(比如React)往往反映了它们自身复杂的组织架构,反而加重了开发者的负担。Rails一直致力于保持简单性和长久的适用性,既适合初学者,也能支撑复杂的大型应用,让开发者能高效地构建系统,同时保持创造力。
弗里德曼:你怎么看待AI在编程中的作用?它将如何影响未来的编程实践?
DHH:AI在编程中确实有显著的辅助作用,比如查询API、生成代码草稿或提供“第二意见”。Ruby的一个优势在于它具有极高的表达性——每个字符传达的语义更多,这使得它非常适合与AI协作,有点像 Neuralink提升人机交互带宽的理念。AI所生成的代码必须具备良好的人类可读性,以便团队协作和后续维护。
我更倾向于将AI作为一个在单独窗口中运行的辅助工具,而不是主导代码生成的核心。我试过Cursor这类工具,但发现一旦让AI主导代码编写,我和代码之间的直接联系就会被削弱,学习过程也会变得不再“即时”。编程不仅仅是一个实现功能的过程,它更是一种创造力的表达,类似于弹吉他。自己动手写代码,是保持技能、积累经验的关键。过度依赖AI,可能反而会导致技能退化。
弗里德曼:你在学习Bash(命令处理器,通常运行于文本窗口中,能执行用户直接输入的命令)的过程中意识到AI生成代码的局限性。能否具体讲讲?
DHH:在开发Omakub这个基于开源操作系统Ubuntu的Linux配置项目时,我首次尝试使用AI协助编写Bash脚本。由于我对Bash不够熟悉,就把写条件语句、逻辑控制等任务交给AI。然而我很快发现,哪怕我多次询问同样的问题,也始终没能真正掌握这些知识点。这种“空洞的学习”让我警觉,就好像知识从手指间溜走了。我突然意识到,学习编程其实就像学吉他,必须亲自去做,才能真正掌握。于是我调整了方法,自己动手写代码,把AI当作参考工具,结果学得更快也更扎实。这让我更加确信:AI是一个很棒的助手,但不能代替手动编码这一学习过程。
弗里德曼:你会给新手程序员什么建议,如何在AI辅助与传统学习之间找到平衡?
DHH:对初学者来说,最重要的是通过亲自编程来建立技能基础,而不是过度依赖AI生成代码。AI可以作为辅助工具,比如帮你查文档、生成草稿或提供修改建议,但它不能代替你自己写代码的过程。
我建议新手把大部分时间用在从零写代码上,通过亲手实践来建立直觉和创造力。AI应该像是对编程有经验的搭档,在你需要时提供建议,而不是主导整个开发过程。就像我学习Bash的经历一样,真正的掌握来自于动手操作,而不是旁观AI把一切做完。
弗里德曼:如果未来AI生成代码成为主流,会对编程的乐趣和学习过程造成什么影响?
DHH:对很多人来说,编程不仅仅是一种完成任务的经济行为,更是一种人类创造力的表达形式,就像弹吉他一样。即使我们早已有完美的音乐录音,人们仍会为了乐趣去学习乐器。同样,编程的乐趣也在于自己写代码的过程,而不仅仅是得到一个结果。
如果有一天AI完全接管了代码编写,开发者可能就变成了“AI涂鸦管理员”——我们只是维护AI编写的系统,而不再亲自创作代码,那将极大削弱编程的成就感和创造力。我早年从事编程时,最初只是为了完成工作目标,但后来我真正爱上了编码本身。即使AI可以让我提高效率,我也不会放弃动手写代码的乐趣,因为这正是技术成长与满足感的来源。
03. AI会取代程序员吗?DHH持“谨慎乐观”态度
弗里德曼:你如何看待AI的未来?它将如何影响编程职业?
DHH:我对AI的未来持谨慎乐观态度。以DeepSeek在本地运行的表现为例,它通过“思考框”展示自我对话的过程生成回答,给人一种接近人类思维的感觉,令人印象深刻。但我仍然怀疑AI能否真正取代程序员。毕竟,创造力和直觉是AI难以复制的核心能力。
Shopify首席执行官卢特克曾经建议在招聘时问一句:“AI是否可以胜任这个职位?”这体现了AI对程序员岗位的潜在冲击。未来,AI可能会降低对传统程序员的需求,使编程变得像骑马一样,从实用技能转为某种“娱乐性”活动。但至少在可预见的短期内,我们仍然需要人类来验证AI生成代码的正确性,确保功能完善且安全可靠。
弗里德曼:你提到DeepSeek的“思考过程”让你感到震惊甚至有些不安,能否详细谈谈?
DHH:是的,DeepSeek的本地运行表现确实令人震撼。它通过“思考框”展示模型内部自我对话的过程,仿佛在推理、权衡和思考。这种近似人类的逻辑过程让我一度怀疑这是不是某种表演效果。但如果这真的是它的实际工作方式,那确实令人感到震撼,甚至有些不安。
这意味着,AI在编程领域的能力可能比我们预期更强。然而,我依然认为它无法完全取代人类,尤其是在系统架构、复杂设计和审美判断等方面。AI更适合作为开发者的助手,而不是独立的系统设计者或决策者。
弗里德曼:技术发展的不可预测性是否可能使AI变成另一个“未兑现承诺的虚拟现实”?它对编程的未来意味着什么?
DHH:技术的发展往往出人意料。比如1995年的电影《割草者》预测虚拟现实会迅速普及,但30年后的今天,虚拟现实仍局限于游戏等小众领域。
航空技术也是如此。从1903年莱特兄弟首次飞行,到1950年代波音747的出现,发展极为迅速;但之后几十年里,进步变得缓慢。因此,AI也可能经历类似曲线:短期爆发,随后稳定或受限于某些特定应用场景。
即便如此,像COBOL(面向商业的高级程序设计语言)这样的语言至今仍在支撑关键基础设施,例如社会保障系统,这也说明了某些技术可能长期存在,与新技术共存而非被完全取代。AI的未来也可能如此:它既可能彻底变革行业,也可能局限于特定用途——没有人能准确预测。
弗里德曼:你提到COBOL仍在使用,这为我们理解编程的未来提供了哪些启示?
DHH:COBOL的顽强生命力说明了一点:稳定性和历史路径依赖可能远比“新潮”技术重要。许多上世纪70年代写的COBOL代码,今天仍在运行美国的社会保障系统,这些系统之所以难以替换,是因为世界上真正理解这些代码的人已经不多了。
这让我意识到,即使AI技术发展迅猛,像Ruby on Rails这样的系统也很可能在几十年后仍在运行,成为新基础设施的一部分。程序员应该保持谦逊,重视当前的技能积累,而不是盲目追逐潮流技术。
弗里德曼:对于刚入行的程序员来说,如何选择职业路径,以更好地应对AI的影响?
DHH:没有人能准确预测未来的技术趋势,哪怕是现在最热门的AI。在过去,我们曾以为机器人会首先取代蓝领工作,但现在,生成式AI对艺术家、音乐人这类创意职业带来了巨大冲击。而像Tesla Bot这样的机器人又让蓝领岗位的威胁回到台面。
因此,我建议年轻程序员不要一味考虑“什么不会被取代”,而应选择自己真正热爱的方向。就算将来这个方向被颠覆,你也不会后悔投入过。我在37signals开发新产品时,哪怕项目失败,我依然享受编写 Ruby代码的过程。编程的乐趣就像写作、画画或弹吉他,是一种自我表达的方式。如果你能热爱这项工作,无论技术如何演进,都不会被轻易淘汰。
04. 给编程初学者的建议
弗里德曼:对于初学者,你推荐哪些编程语言?为什么?
DHH:我推荐三门语言:Ruby、JavaScript和Go,各有侧重。
●Ruby:因为它语法简洁、表达力强,而且“仪式感”低,特别适合初学者学习编程的基本概念。例如,Ruby的“Hello World”程序只需一行代码:puts "Hello World"。
相比Go或Java,需要写更多“样板代码”,Ruby更能让人专注于核心逻辑。《Learn to Program》这本书就使用Ruby来教授编程入门,非常适合初学者。
●JavaScript:作为Web开发的核心语言,它在构建业务逻辑和协作型软件时不可或缺。不论你在Web开发的哪个领域工作,JavaScript都是你绕不开的语言。
●Go:适合构建需要高性能的系统,比如HTTP代理服务。我们公司最近就用Go构建了几个高效的代理应用,表现非常好。但我不建议用Go编写复杂业务逻辑,因为它的表达能力不如Ruby。
我对函数式语言(比如OCaml)兴趣不大,那种思维方式与我不太契合。我更倾向面向对象的编程方法,它更适合构建Web应用和业务系统。
弗里德曼:你曾说自己是“软件写作者”(software writer),而不是“软件工程师”,能否解释这个定位?
DHH:是的,我更愿意称自己为“软件写作者”。因为对我来说,编程更像是一种写作行为,而不是单纯的工程实践。我十年前在RailsConf上就提出过这个观点。编程不仅是解决技术问题,更是一种面向人的表达方式。我追求的是优雅、可读、具有美感的代码,就像一篇精心打磨的文章。
我主要使用Ruby开发协作软件和任务管理系统,这类应用强调人与人之间的沟通,非常适合“写作式”思维。当然,如果我从事的是3D游戏引擎开发,那就更像是“数学家”或“工程师”的角色了。
“软件工程师”这个标签过于单一,无法概括编程中各种抽象层次的创造力。有些人是“软件数学家”,擅长算法与逻辑结构;而我,是一个“软件写作者”。
弗里德曼:在你看来,AI编程助手应具备怎样的“写作标准”?
DHH:我希望AI在接受输入时要求更高一些。现在的AI对模糊、含糊其辞的句子也能生成代码,这让我觉得不够严谨。我希望未来的AI能有一个“严格模式”,要求用户输入明确、清晰、完整的表达,就像好文章要求语言简洁、精准一样。编程其实和写作类似,不只是功能实现,更是思想表达。好的代码应该像好的文章一样,既实用又优美。AI在生成代码时,也应遵循这一原则——让输出不仅可运行,还应具备清晰的逻辑和良好的结构。
本文来自“腾讯科技”,作者:无忌,36氪经授权发布。