我有三个儿子,他们都知道我是一个计算机程序员,其中至少有一个对这个领域表达了兴趣。我热爱计算机编程,并且努力把这种热爱传达给我的儿子们、课堂上的学生,以及任何愿意倾听的人。
近来,我越来越频繁地从亲戚、朋友和学生那里听到一个问题:
在人工智能已经出现的今天,我还应该考虑成为一名计算机程序员吗?
我对此的回答是:“是的,而且……”
“是的”
从根本上说,计算机编程关乎两件事情:
使用计算机解决问题
在解决这些问题的过程中学会控制复杂性
我很难想象在未来,懂得如何用计算机解决问题,以及如何控制解决方案中的复杂性,会比今天更没有价值。因此,即便有了人工智能工具,我仍然认为这会是一条可行的职业道路。
“你必须自己写代码”
话虽如此,我认为人工智能对初级程序员来说是非常危险的,因为它能够为许多问题高效地生成代码。如果一名初级程序员没有真正学会写代码,而只是生成代码,那么他们其实是在剥夺自己获得那种“身临其境”的代码理解力的机会——那种理解只有在一行一行敲代码、亲自踩坑的过程中才能形成。
因此,我会警告我的学生:
“是的,AI可以为这次作业生成代码。但不要让它这么做。你必须自己写代码。”
我会解释,如果他们不写代码,就无法真正有效地阅读代码。而在一个以人工智能为基础的编程未来,阅读代码的能力很可能会变得更加重要。
如果你无法读懂代码,你就会掉入“魔法学徒的陷阱”:创建出自己并不理解、也无法控制的系统。
编程变成提示词,是否就像汇编变成高级语言?
有些人说,从高级语言转向由AI生成代码,就像当年从汇编语言转向高级编程语言一样。
我不同意这种类比。
编译器在很大程度上是确定性的,而当前的AI工具并不是。给定一个高级语言结构,例如一个for循环或if语句,你通常可以相当确定地预测,在特定计算机架构下(至少在优化之前)生成的汇编代码大致会是什么样子。
但对于基于大语言模型的提示生成方案,却无法做到这一点。
高级编程语言是一种非常好的方式,可以用更少的文本创建高度明确的问题解决方案,这是汇编语言难以做到的。它们消除了大量“偶然复杂性”,留下的(如果代码写得合理)大多是“必要复杂性”。
而LLM生成的代码,往往并不能消除偶然复杂性,甚至可能通过选择不恰当的问题解决方法、走捷径等方式,引入更多的偶然复杂性。
如果你不能读懂代码,你又如何分辨这一点?
而如果你想读懂代码,你就必须自己写代码。
AI是一个很棒的助教
我还会告诉学生,如果使用得当,AI是一个极其高效的助教。如果你不把它当成代码生成器,而是把它当成帮助你理解概念和技术的学习伙伴,它将极大地促进你的智力成长。
学习计算机编程最困难的事情之一,就是“卡住”。你看不出诀窍,也不知道该从哪里开始,无法取得进展。
更糟糕的是,你可能因为偶然复杂性而卡住:比如不知道如何使用某个工具链,甚至不知道什么是工具链。
这不是你的问题,而是环境的问题。毫无意义地卡住会剥夺你真正学习的时间,甚至会把人从计算机科学这个领域中击退。
(我在伯克利自学Unix时就曾经卡住,这也是我后来退出那里的计算机科学项目的原因之一。)
AI可以帮助你跨越这些障碍,如果使用得当,它会是一个很好的助教。我发布过一个AGENTS.md文件,供学生配置编码代理,使其表现得像一个优秀的助教,而不是代码生成器。我鼓励他们以这种方式使用AI。
只要使用得当,AI不必成为阻碍你成长为优秀程序员的因素。
“而且……”
我确实认为AI会改变计算机编程。它的改变可能没有某些人想象得那么剧烈,但在某些根本层面上,它确实会带来变化。
纯粹写代码的价值可能会下降
写代码这一行为本身,可能会相对贬值。
我对此感到有些遗憾。我通常很享受写代码的过程,用(比喻意义上的)双手让某个东西动起来是一件很有乐趣的事情。把代码写好是一门艺术,也是一种满足,其中有许多审美上的选择。
然而,看起来纯粹的代码书写能力,在未来可能会变得相对不那么重要。
当这一点的重要性下降时,我认为其他技能会变得更加重要。
沟通能力
例如,清晰地写作、思考和表达——无论是与大语言模型交流,还是与人类交流——在未来很可能会变得更加重要。许多程序员本来就有文学倾向,而这项技能的价值很可能会随着时间推移而提升,非常值得刻意培养。
阅读书籍、撰写文章或博客,都是有助于提升这方面能力的活动。
理解商业
你还可以将部分精力投入到更好地理解商业(或者政府角色等)上。
计算机编程本质上是用计算机解决问题,而企业里充满了各种需要解决的问题。
有些商业人士看到AI会说:“太好了,我们不需要程序员了!”但在我看来,同样也可以设想程序员会说:“太好了,我们不需要商业人士了!”
我认为这两种观点都很短视。不过,我确实认为AI可能赋予程序员一种能力:在本质上仍然从事编程工作的同时,投入更多时间去理解他们正在解决的现实世界问题(无论是商业问题还是其他问题)。
这与提升沟通能力是相辅相成的。
系统“架构”能力
和许多程序员一样,我对“软件架构师”这个词持复杂态度。我见过一些“架构宇航员”给世界带来了很多痛苦。
不过,找不到更好的词语来形容的话,我认为软件架构能力会随着时间变得更加重要:即有效组织大型软件系统的能力,尤其是控制这些系统复杂性的能力。
对初级开发者来说,这其中的一个难点在于:传统上,良好的系统架构能力来自于构建小模块的经验——最初可能做得不好,但随着时间推移逐渐改进。
我遇到的大多数糟糕架构师,要么是糟糕的程序员,要么几乎没有编程经验。
如果你让AI接管“简单部分”的代码生成,你又如何培养成为优秀架构师所需的直觉?
这就是为什么我再次强调:你必须自己写代码。
有效使用LLM
另一个显然会越来越重要的技能,是如何有效地使用大语言模型。我认为目前我们仍在探索这究竟意味着什么。
而且我也认为,这个答案会因经验水平不同而不同。
资深开发者
那些在AI出现之前就积累了大量经验的资深程序员,其实处于一个很好的位置来有效使用LLM。他们知道什么是“好代码”,他们有构建大型系统的经验,知道什么重要,什么不重要。资深程序员的危险在于,他们可能完全停止编程,从而出现思维退化。
尤其危险的是:发出提示之后,在等待过程中沉迷于无尽的滚动浏览。
问我怎么知道的。
我通常这样使用LLM:
用它分析现有代码,以便更好地理解代码并发现问题和不一致之处
帮助我为想要开展的大型项目整理思路
为我正在构建的系统生成相对较小的代码片段
生成我不喜欢写的代码(例如正则表达式和CSS)
生成我愿意丢弃或不打算长期维护的演示或探索性代码
为某个功能建议测试用例
我尽量不使用LLM生成我需要长期维护的完整解决方案。有时我会在手动编码的同时使用LLM,帮助我理解API以及在编码过程中有哪些选择。
我绝不会让LLM为我构建的系统设计API。
初级开发者
初级开发者的处境更为艰难。我再说一遍:你必须自己写代码。
用“氛围感”去糊弄问题的诱惑非常非常强烈,但你必须与这种诱惑作斗争。
你的同龄人可能会用这种方式糊弄过去,这会让人烦躁:你必须比他们更努力,甚至可能因为“慢”而受到批评。这里的工作动态非常重要:如果你的公司目前优先考虑速度而非理解(许多公司确实如此),你需要接受这一现实,同时避免因此被解雇。
不过,我认为这是一种暂时的状况。很快,公司会意识到,快速“氛围编程”带来的复杂性爆炸问题,比有理解、有节制的编码更严重。
到那时,我预计人们会认识到:较慢、更深思熟虑、并辅以AI帮助的编程方式,才是利用这项新技术的最佳方式。
AI可以帮助初级开发者的地方,在于加速他们成为资深开发者的过程——通过消除那些常常绊倒新手的偶然复杂性。正如我之前所说,把AI视为一个有用但有时过于热心的帮手,而不是仆人,有助于理解代码库的结构、特定问题可用的API和技术、构建系统或编程语言的工作方式等等。
但你必须自己写代码。
而公司也必须允许初级开发者写代码。
关于现在找工作
围绕AI和编程的问题,归根结底都与找到一份体面的工作有关。
众所周知,目前程序员就业市场并不好。我看到很多优秀的计算机科学学生在寻找编程职位时苦苦挣扎。
虽然我没有水晶球,但我相信这是一种暂时现象,而不是永久状态。程序员就业市场通常是周期性的,有繁荣也有低谷。我相信我们终将从当前的低谷中恢复。
但对于现在正在找工作的人来说,这种判断并不能带来太多安慰。因此,我想分享一些我给学生的具体求职建议。
家人、朋友、朋友的家人
我认为在线招聘网站基本上没有太大意义,尤其对初级开发者而言。那更像是一种彩票,通过它找到好工作的概率很低。既然是免费的,可能还是值得用一用,但不值得投入大量时间。
更好的方法是所谓的“四个F”:Family(家人)、Friends(朋友)以及Friends的Family(朋友的家人)。利用你的人际关系,在那些你有熟人优势的公司寻找机会。家人是最有力的资源。朋友通常也很好。朋友的家人虽然关系更远,但也值得询问。如果你认识或与你只隔几层关系的人在某家公司工作,你获得那家公司职位的机会会大大提高。
我经常强调,这并不意味着你的家人必须在谷歌或其他大型科技公司工作。
任何规模较大的公司,都有需要用计算机解决的问题。几乎所有超过一百人的公司,都有某种形式的开发团队,即便他们不这么称呼。
举个例子,我有一个学生一直找不到工作。我问他的父母做什么,他说父母在Costco总部工作。
我告诉他,其实他非常幸运,这正是他进入一家优秀公司的门票。
也许他不会一开始就以“计算机程序员”的身份入职,也许他会以分析师或其他角色开始。但在那个角色之上具备编程能力,将极具价值,并很可能为他铺就一条出色的职业道路。
结论
因此,我仍然认为把计算机编程作为职业追求是一个好主意。当前的就业市场确实低迷,但我认为这只是暂时的。
我确实认为计算机编程的方式正在改变,程序员应该着眼于培养超越“纯粹写代码”的技能。这一直以来都是明智之举。
我并不认为编程会像某些人声称的那样发生剧烈变化。我相信编程的基本功——尤其是写出好代码以及控制复杂性的能力——将始终具有重要意义。
我希望这篇文章能够帮助回答这个问题,尤其是对初级程序员有所帮助,让人们更有信心进入这个我认为非常有回报、并且我预计会长期从事下去的职业。
最后,对公司来说:请让初级开发者至少写一部分代码。这符合你们自身的利益。