答案是:会,而且……
我在蒙大拿州立大学(Montana State University)教授计算机科学。我有三个儿子,都知道我是个程序员,其中至少有一个对这个行业感兴趣。我热爱编程,并努力向我的儿子们、课堂上的学生以及任何愿意倾听的人分享这份热情。
我越来越多地被亲戚、朋友和学生问到这样一个问题:
考虑到 AI,我还有必要考虑成为一名程序员吗?
我的回答是:“会,而且……”
“会”
从根本上说,编程关乎两点:
- 利用计算机解决问题
- 在学习解决这些问题的过程中掌握复杂性控制
我很难想象在一个未来里,懂得如何用计算机解决问题以及如何控制解决方案的复杂性,会比今天变得更不有价值。因此,我认为即便 AI 工具出现,编程依然是一个可行的职业。
“你必须写代码”
话虽如此,我认为 AI 对初级程序员来说非常危险,因为它确实能有效地为许多问题生成代码。如果初级程序员不学习写代码,只是依赖生成,他们就会剥夺自己通过亲历磨练(in the trenches)来获得对代码的直觉理解的机会。
因此,我告诫我的学生:
“是的,AI 可以为这个作业生成代码。别让它代劳。你必须自己写代码。”
我解释说,如果他们不写代码,就无法有效地阅读代码。在基于 AI 的编程未来,阅读代码的能力肯定会很有价值,也许更有价值。
如果你读不懂代码,就会陷入“法师学徒陷阱”,构建出自己无法理解且无法控制的系统。
从 Coding 到 Prompting,就像从汇编到高级语言吗?
有人说,从高级语言到 AI 生成代码的转变,就像当年从汇编语言到高级编程语言的转变一样。
我不认同这个类比。
编译器在很大程度上是确定性的,而当前的 AI 工具并非如此。给定一个高级语言的结构,比如 for 循环或 if 语句,你可以比较有把握地推断出它在特定计算机架构上生成的汇编代码大概是什么样子(至少在优化之前是这样)。
但对于基于 LLM 对某个 prompt 的回答,你没法做出同样的判断。
高级编程语言是一种非常好的方式:用最少的文字,在计算机上构建高度明确的问题解决方案,这是汇编语言做不到的。它们消除了大量偶然复杂性,剩下的(假设代码写得还不错)基本都是本质复杂性。
而 LLM 生成的代码往往并不能消除偶然复杂性,甚至会因为选择了不合适的解题思路、走了捷径等原因,引入大量新的偶然复杂性。
如果你读不懂这些代码,你怎么知道呢?
而要想读懂代码,你就得自己去写代码。
AI 是绝佳的助教
我常对学生说的另一件事是:只要使用得当,AI 是一个极其有效的助教。如果你不是把它当代码生成器,而是当作帮你理解概念和技术的伙伴,它对你的智力成长会有巨大的助益。
学习编程最难的事情之一就是“卡住”。你看不出其中的窍门,甚至不知道从哪里下手才能取得进展。
更糟的是因为偶然复杂性而卡住:你不知道怎么用某个工具链,甚至不知道工具链是什么。
这不是你的问题,而是你所处环境的问题。无谓的卡住不仅剥夺了你真正学习的时间,还常常把人劝退出计算机科学。
(我自己在 Berkeley 自学 Unix 时就卡住了,这也是我从那里的计算机科学专业退学的原因之一。)
用对了方法,AI 能帮你突破这些瓶颈,也能成为一名出色的助教。我发布了一个 AGENTS.md 文件供学生使用,配置编码智能体时,目标是让它像一名优秀的助教,而非单纯的代码生成器,我也鼓励学生们以这种方式使用 AI。
只要使用得当,AI 并不一定会阻碍你作为程序员的能力成长。
“,而且……”
我确实认为 AI 将改变计算机编程。虽然没有些人想的那般剧烈,但在一些根本层面上会有所不同。
裸码编写可能变得不那么重要
编程行为本身正在逐渐失去其相对价值。
对此我有些惋惜:我通常很享受编码的过程,用你那(比喻意义上的)赤手空拳让事物运转起来很有意思。 编写高质量的代码既是一门艺术,也能带来满足感,其中还涉及许多审美判断。
不过,从趋势来看,纯代码编写的熟练度在未来确实可能变得不那么重要。
随着这项技能重要性的相对下降,我相信其他技能会变得更加重要。
沟通能力
例如,与 LLM 和人类一样,清晰写作、思考和沟通的能力在未来可能会显得更为重要。许多程序员本来就对文学有所偏爱,这项技能的价值很可能会随时间增长,值得持续打磨。
阅读书籍、写随笔或博客,似乎都是提升这项技能的绝佳活动。
理解业务
另一件值得下功夫的事,是转移一部分脑力去更好地理解业务(或政府角色等)。
计算机编程是利用计算机解决问题,而企业既拥有计算机,也充满了问题。
一些商界人士看到 AI 会说:“太好了,我们不需要程序员了!”但在我看来,程序员说“太好了,我们不需要业务人员了!” 同样具有合理性。
我认为这两种观点都过于短视。但我确实相信,AI 能让程序员继续以程序员的核心方式工作,同时还能投入更多时间去理解所解决的实际问题(无论是业务层面还是其他)。
这与提升沟通技能相辅相成。
系统化架构
和许多计算机程序员一样,我对“软件架构师”这个头衔抱有矛盾心理。我见过架构宇航员给世界带来过诸多痛苦。
在缺乏更佳术语的情况下,我认为随着时间推移,软件架构将变成一项更重要的技能:即有效组织大型软件系统的能力,以及最关键的一点——控制这些系统的复杂性。
对初级开发者而言,难点在于:传统上,构建大型方案的架构能力源于先构建系统较小部分的经验——从最初做得不好,到随着时间推移变得更加高效。
我遇到的大多数糟糕的架构师,要么是拙劣的程序员,要么干脆几乎没有编码经验。
如果你让 AI 接管“简单”部分的代码生成,你该如何培养成为高效架构师所必需的直觉?
这就是为什么,再次强调,你必须亲手编写代码。
有效使用 LLM
另一项看起来价值会逐渐提升的技能(显而易见)是知道如何有效使用 LLM。我认为目前我们仍在摸索这一概念的具体含义。
我也认为,其具体含义因经验水平而异。
资深程序员
那些在 AI 时代之前已拥有丰富经验的资深程序员,处于有效使用 LLM 的优势位置:他们知道“良好”的代码长什么样,有构建大型系统的经验,并清楚什么重要、什么不重要。资深程序员的危险在于,他们可能完全停止编程,转而遭受大脑腐烂之苦。
尤其危险的是,发出提示词后,在等待结果时被卷入无尽滚动。
问我怎么知道的吧。
我通常是这样使用 LLM 的:
- 分析现有代码,帮助自己理解并发现其中的问题和不一致之处
- 帮我整理做较大项目时的思路
- 为正在开发的系统生成一些较小的代码片段
- 生成我不爱写的代码(比如正则表达式和 CSS)
- 生成 demo 或探索性代码——这类代码可以随时丢弃,也不打算长期维护
- 为我正在开发的某个功能建议测试用例
我尽量不用 LLM 生成需要自己长期维护的完整方案。有时我会在手动编码的同时借助 LLM,帮助我理解 API 以及编码时的各种选择。
我从不让 LLM 来设计我所构建系统的 API。
初级开发者
初级开发者的处境更艰难。我再说一遍:你必须亲自写代码。
用 vibe coding 糊弄过关的诱惑非常大,但你必须抵制这种诱惑。
身边的同事确实会一路 vibe 过去,这会很让人恼火:你得比他们更努力,还可能因为慢而被批评。这里的工作生态需要看清:如果你的公司把速度看得比理解更重要(目前很多公司都是如此),你就得接受现实,别让自己被炒鱿鱼。
不过,我认为这只是暂时的。很快,公司就会意识到,高速 vibe coding 带来的复杂度爆炸问题,比深思熟虑的规范编码严重得多。
到那时,更慢、更审慎、借助 AI 的编码方式,才会被公认为利用这项新技术的最佳途径。
AI 能帮助初级开发者的地方,在于通过消除那些常常让新人栽跟头的偶发复杂度,加速他们成长为高级开发者。如前所述,把 AI 当作一个有用但有时过于热心的助手,而不是唯命是从的仆人,在理解代码库结构、了解解决特定问题可用的 API 和技术、弄清某个构建系统或编程语言的运作方式等方面,会非常有效。
但代码你必须自己写。
公司们也一样:必须让初级开发者亲自写代码。
如今如何找到工作
在 AI 和编程领域,我常被问到的问题核心其实只有一点:如何找一份像样的工作。
程序员就业市场目前很冷,这是公开的秘密。我甚至看到优秀的计算机专业学生也在为找编程岗位而苦苦挣扎。
虽然我没法预测未来,但我相信这只是暂时的,而非永久的困境。程序员就业市场向来有周期,涨落起伏很正常,我相信目前的低谷迟早会回升。
不过,这种“终会好转”的说法对正在找工作的人安慰有限。因此,我想分享我平时给学生的具体求职建议。
家人、朋友,还有朋友的朋友
我认为在线招聘网站基本没什么用,尤其对初级开发者而言。那就像买彩票,命中高薪好岗的概率极低。既然免费,当然可以用,但不值得在上面花太多时间。
更好的策略是聚焦“4F”:Family(家人)、Friends(朋友)& Family of Friends(朋友的朋友/家人圈)。利用你的人脉关系,去投递你内部认识人的公司,这样你具有明显的竞争优势。家人是最强的纽带;朋友往往也起作用;朋友的朋友稍弱,但也值得问问。只要你与目标公司的某位员工认识或只是隔几层关系,你拿到 offer 的概率会大很多。
我常跟学生强调,这并不意味着你的家人必须在 Google 这类大厂上班。
所有有一定规模的公司,都有需要用计算机解决的问题。几乎每个超过 100 人的公司都有某种开发团队,哪怕他们不这么称呼。
举个例子,我曾有个学生很难找工作。我问他父母是做什么的,他说父亲在 Costco 总部工作。
我告诉他,他其实运气非常好,而这就是他进入一家优秀公司的门票。
也许他入职时并不是以“软件程序员”的名义,可能是分析师或其他角色。但在这个角色基础上会编程,价值非常高,很可能为他奠定一段优秀的职业生涯。
结论
因此,我依然认为将计算机编程作为职业是一个好选择。不可否认,当下的就业市场形势严峻,但我相信这只是暂时的。
我确实认为编程的工作方式正在发生变化,程序员应该培养超越“纯粹”编码的技能。这向来都是一个明智的方向。
我不认为编程领域的变化如某些人宣称的那样剧烈。我相信编程的基础,尤其是编写高质量代码和控制复杂度,将始终至关重要。
我希望这篇文章能有助于回答那个问题,特别是对初级程序员,帮助大家更有信心地投身于我深感回馈丰厚、并预期将长期从事的职业。
致各公司:请至少让初级程序员参与部分代码的编写。这符合你们自身的利益。
</>