如果你是今天的软件开发者,几乎不可能避开人工智能带来的种种影响。早上打开X或LinkedIn,你看到的大多数帖子都在谈论科技行业正在大规模裁员的事情。
再继续往下浏览,就会看到有人声称上周推出的某种新人工智能工具已经让初级开发人员变得过时了。你去YouTube上,会发现一些视频的缩略图在宣扬“所有技术都已经失效了,所有的开发岗位也都不存在了”;而同时,也有一些个人创业者宣称他们仅用五分钟就利用人工智能工具开发出了价值一百万美元的全栈应用程序。
到了某个时候,你会开始感到不知所措。你会开始质疑自己过去那些用来学习新技术、编写代码的夜晚是否还有意义。你会问自己一个非常令人不安的问题:“我的职业前景还安全吗?”
这种担忧是合理的。我们不应该用一些激励性的语言或虚假的积极言论来忽视这个问题,而应该面对现实。这个行业正在发生根本性的变化,招聘模式也在不断改变,对于初级和高级开发人员的期望值都在呈指数级上升。而人工智能,正是推动这一切变化的主要力量。
然而,人们对当前发生的这些变化存在很多误解。“人工智能正在取代开发人员”这种说法缺乏很多具体的细节,因此它引发了不必要的恐慌——因为它没有明确说明到底发生了什么。
很少有开发者会出来解释这些细节,因为其中很多人仍在观察形势的发展,而另一些人则利用这种恐惧来为自己谋取利益。
那么,我的观点是:人工智能并不是在取代所有的软件工程师,而是在取代某些特定类型的工作。那些低层次、重复性强的工作正在被人工智能迅速取代,这一过程比任何人想象的都要快。因此,这迫使我们重新思考在当今的市场环境中,成为一名软件工程师到底意味着什么。
这篇文章就是为了探讨这个话题而写的。它深入分析了软件开发领域正在发生的变化,探讨了从“以努力为导向”的开发模式向“以成果为导向”的开发模式的转变,并提供了一份实用、可行的发展路线图,帮助你在人工智能辅助编码的时代继续保持竞争力。
目录
教程驱动时代的终结
让我们暂时退一步,看看在过去的十年左右时间里,我们大多数人是如何学习软件开发技术的。
从2010年到2023年,整个行业里到处都是依靠教程来学习的开发者。我们是通过遵循一步步的指导来学习如何开发软件的。
像待办事项应用、天气面板,或是YouTube或Spotify的仿制版本这类项目,在开发者中非常受欢迎。这些项目让我们获得了信心,帮助我们记住了语法规范,学会了如何使用各种库,也弄清楚了如何编写基础的前端和后端代码。
很长一段时间里,这样的学习方式就已经足够了。我们的目标很简单:“我能否开发出一个能够正常运行的全栈应用呢?“
只要你会写代码,能连接一些API,并且能构建出可用的用户界面,企业就会愿意雇用你。他们将初级开发者视为一种投资对象,认为这些员工是可以通过培训来提升能力的:你会先编写一些标准化的基础代码,然后在工作中逐步了解系统架构的复杂性。当时,整个行业也有足够的预算和耐心来支持这种学习过程。
然而,在我们忙于记忆语法规范、完成Udemy课程的同时,各种开发工具也在悄悄地发展变化。如今,人工智能已经将这一进程推向了另一个极端。
过去我们需要手动完成的大量工作,现在都可以通过人工智能在几秒钟内自动完成、得到辅助或获得建议。
-
需要配置一个具备速率限制和CORS功能的Express服务器吗?人工智能可以帮您生成相关代码。
-
需要用React编写一个响应式导航栏吗?人工智能可以为您提供设计帮助。
-
需要编写一条标准的SQL查询语句来获取公司数据吗?人工智能可以为您推荐合适的查询语句。
如果机器能够以更快、更便宜的方式完成某项任务,并且其完成质量也相当不错,那么这项具体的任务就不再会成为就业市场中的区别因素了。因此,当人们说人工智能正在取代初级开发者时,他们实际上是指人工智能已经自动化了这些基础性的工作。
但这是否意味着开发者已经不再被需要了呢?并不如此。其实这意味着我们工作的价值层次已经发生了变化。开发待办事项应用、天气面板或网站仿制版本这类项目,已经不再是衡量一个开发者能力的重要指标;它们只不过是一些入门级的练习而已。
让我们揭开“人工智能正在抢走工作机会”这一谣言的真相
传统上,软件工程师会接到开发任务要求,然后他们编写代码并确保这些代码能够正常运行。软件工程师的价值往往与他们的实际工作成果紧密相关。即使在面试中,人们也会重点考察候选人的编码能力及对各种技术细节的记忆情况:
-
你能从零开始编写一个链表吗?
-
你能判断这段文字是否是回文吗?
-
你能找出这个数字数组中的重复项吗?
如果你是一个花费大量时间分析问题需求、手动调试复杂问题、并亲手编写数千行代码的开发者,那么你就会被认为是一名敬业且价值很高的员工。
如今,仅仅付出努力已经不再是衡量成功与否的标准。
如果你花费数小时去编写那些人工智能在两分钟内就能完成的正则表达式或标准认证流程,行业并不会认可你这六小时的辛勤工作。他们会问:“除了机器能够生成的内容之外,你还带来了什么价值?”
这个事实可能令人不快,但接受它或许会成为你职业生涯的转折点。一旦你认识到人工智能也能够编写代码,你的思维方式就会发生变化。你会开始意识到自己不再需要担心执行速度的问题,而应该将重点放在系统架构设计和抽象思维上。
如果你现在是一名前端开发人员,你的工作已经不再仅仅局限于将Figma设计图转换成完美的React组件了。人工智能辅助编程工具只需寥寥几条指令,就能完成其中80%的工作。因此,作为前端开发人员的职责现在已经发生了变化,具体体现在以下几个方面:
-
当这个用户界面与后端系统连接起来,同时有1万名用户登录时,系统会如何运行?
-
假设某位客户签订了服务等级协议,规定在速度较慢的4G网络环境下,仪表盘必须在1.2秒内显示所有数据;在速度较快的4G网络环境下,这个时间应为500毫秒;而在5G网络环境下,则应在12毫秒内完成渲染。那么你应该如何设计Next.js应用程序来满足这些要求呢?
-
你是否正确地运用了服务器端渲染、静态资源生成或边缘缓存技术?
-
对于使用屏幕阅读器的用户来说,这个应用程序的表现如何?
源代码已经不再是最终产物。它应该是你思考和推理过程的副产品。你需要预见到各种极端情况,而最重要的是,你必须对自己的工作负责。
人工智能确实可以编写API,但它无法与愤怒的客户坐下来解释为什么生产环境中的数据库会出现故障。系统故障带来的后果必须由你来承担,这种责任完全属于你。
应用清晰的架构设计
假设你让一个大型语言模型来构建一个复杂的应用程序,比如一个具备排序、过滤和分页功能的电商产品仪表盘。它很乐意生成那些可以在浏览器中运行的代码。然而,人工智能有一个非常明显的特点:它倾向于创建庞大的单体应用程序。
人工智能生成的代码很可能长达1000多行,状态管理、用户界面渲染、数据获取以及业务逻辑都会被集成到同一个文件中。虽然这样的代码在技术上可以在浏览器中运行,但对其进行测试、维护和扩展将会变得非常困难。
这时就需要人类软件工程师发挥作用了。现代的工程师了解清晰代码原则和设计模式。他们不会盲目接受人工智能生成的单一文件代码,而是会考虑如何将这些React组件像拼积木一样组合起来使用。
一位能力出众的工程师在了解相关需求后思考道:“我们不应该把所有内容都放在一个文件里。在这里,我们应该运用复合组件模式来提高用户界面的灵活性;同时使用插槽模式在布局中设置相应的接口,这样该组件的使用者就可以插入他们自己定制的元素,而不会破坏系统的底层逻辑。”
你需要运用抽象思维来提出一些关于系统架构的问题:
-
我们该如何处理副作用与数据获取之间的关联?
-
以后是否可以通过很小的代码修改就能更换支付服务提供商呢?
-
如果用户在筛选数据时网络连接中断,会发生什么情况?
AI为我们提供了原始的、基础性的材料,但我们还需要运用工程学的知识将这些材料转化为可实际使用的系统。
人工智能时代实用的工程发展路线图
现在,是时候思考如何帮助那些依赖教程学习的开发者转变为具备实战能力的现代工程师了。下面为你提供一份实用的分步发展路线图。
第一步:夯实基础知识
如果你不理解AI生成的代码,就无法有效地使用它。过去,对某个框架有表面的了解就足以让你完成任务了;你可能根本不需要了解它的内部工作原理。
但如今,AI已经抽象化了这些框架的结构。如果系统的某部分出现了问题,你要找到真正的原因可能需要花费很多时间和精力。因此,扎实的基础知识能够帮助你应对这类挑战,也会让你更加享受与AI一起工作的过程。
你必须深入学习计算机科学和Web技术的基础知识:
-
互联网是如何运行的?了解网络基础知识。
-
不要只学会编写JavaScript中的Promise对象,还要理解事件循环机制、调用栈的结构以及内存分配的工作原理。
-
如果一个React应用程序存在内存泄漏问题,而这个问题分散在多个文件中,AI可能很难找到问题的根源。因此,你需要掌握如何使用Chrome DevTools的内存分析工具。
-
与其专注于一些复杂的算法练习,不如注重抽象思维的应用。例如,在开发实时协作文档编辑器时,你该如何设计数据结构以支持并发编辑操作?在当今的技术面试中,正是通过这类问题来检验候选人的实际能力。
第二步:构建真正实用但可能带来挑战的系统
不要再开发那些只能在理想化的本地环境中运行的简单CRUD应用程序了,而是要学习如何构建能够应对各种故障的现实系统。
不要只是复制现有的电子商务系统,而应该尝试开发一个自动处理电子书配送和排队管理的系统。例如……
-
所使用的技术栈:前端使用 Tanstack,API 使用 NestJS,数据库使用 Supabase,支付处理服务采用 Razorpay,社交登录功能由 Firebase 提供,邮件发送则通过 Resend 完成。
-
面临的挑战:不能仅仅满足于让系统能够正常运行。如果用户在完成支付后,Razorpay 的 Webhook 无法成功连接到你的服务器,该如何处理?如何实现重试机制?如何利用 RLS(行级安全功能)来保护 Supabase 数据库,以确保用户只能下载自己购买的书籍?如何防止候补名单中出现重复注册的情况?
在构建这样的系统时,你必然会遇到各种复杂的实际问题。解决这些问题,你就会掌握那些企业目前迫切需要的技能。
步骤 3:掌握调试技巧
当系统在生产环境中出现故障时,恐慌就会随之而来。那些能够保持冷静、分析问题根源并加以解决的开发者,无疑具有极高的价值。
AI 在解释孤立出现的错误信息方面确实很出色,但它无法轻松地调试那些由后端微服务的竞争条件导致的分布式系统故障。这类问题就需要你熬夜加班去解决了。
无论处于哪个级别的软件开发人员,都应该做到以下几点:
-
学习如何在代码中实现结构化的日志记录功能。
-
学会如何系统地分析堆栈跟踪信息。
-
练习修复性能瓶颈,同时确保不会对应用程序的其他部分造成负面影响。
-
了解Web Vitals(如 LCP、CLS、INP 等指标),并掌握如何分析渲染速度缓慢的页面。
步骤 4:将 AI 作为工具使用,而非依赖它
首先,不要盲目复制 AI 提供的代码。应该把 AI 看成是一个速度极快、可靠性很高,但偶尔会犯些小错误的“初级开发者”。
-
用它来生成模板代码:需要配置 ExpressJS 或 Zustand 仓库吗?让 AI 为你完成这些工作吧。
-
用它来进行研究:正在学习 Rust、Go 或网络安全等相关知识吗?让 AI 根据你现有的编程基础,生成一份为期 30 天的学习计划。
-
用它来辅助内容创作:需要编写阅读指南文件或构思项目大纲吗?AI 可以成为你的得力助手。
-
用它来搭建系统框架:需要为某个实用函数编写单元测试代码吗?让 AI 为你生成相应的测试脚本吧。
需要注意的是,每次你不加理解地复制 AI 生成的代码时,其实都在无形中积累技术债务。你的任务是确保 AI 提供的解决方案能够最适合生产环境的使用需求。
如果让 AI 编写复杂的数据聚合逻辑,而它生成了 72 行代码,千万不要直接将其复制过来。你应该逐行阅读这些代码,并思考:这样的实现方式真的是最优的吗?这段代码的时间复杂度是多少?还有没有办法让它更易于阅读呢?
步骤5:建立强有力的工作成果证明
如今,一份列出你技能的简历或参加培训营后获得的证书,并不能算是有力的工作成果证明。
所谓强有力的工作成果证明,应该包括以下内容:
-
一个GitHub仓库,其中包含一个复杂的实际应用项目,同时附有详细解释设计思路的README文件。
-
对开源项目的实质性贡献,你的代码必须经过资深维护者的严格审核才能被采纳。
-
撰写深入的技术文章或在LinkedIn上发布帖子,说明你是如何解决某个复杂的渲染问题的,或者为什么为某个项目选择了特定的数据库架构。
-
参加黑客马拉松,开发出具有潮流性、有可能迅速传播、能够带来收益的产品,或者同时具备这些特点的项目。
不要只是孤立地编写代码,而应该公开分享自己的成果,并向他人解释自己的思考过程。当你公开表达自己的工程理念和决策时,你就能与那些仅仅依赖ChatGPT或其他AI工具的开发者区分开来。
下图以可视化的形式展示了这五个步骤,你可以随时查看它们之间的联系。
你可以从这里下载这个技术发展路线图以及许多其他资源 。
必须进行的思维模式转变
“一切都始于你的思想,也终结于你的思想。你赋予力量的事物,也会反过来控制你。”——莱昂·布朗
如果你目前正在寻找工作,那么你应该立即停止问自己“我能否找到工作?”这个问题是错误的。如果你不能给出一个能让公司认为应该雇用你的理由,你就无法确定自己一定能得到工作。
相反,你应该仔细阅读招聘公告,看看那些你钦佩的公司,然后问问自己:“在当前这种情况下,他们为什么应该雇用我?”
如果你还没有找到令人信服的答案,那也没关系!这恰恰说明了你的不足之处,你的任务就是弥补这些差距。
我们现在所处的阶段,对软件工程师的要求比以往任何时候都要高。标准更严了,但期望也更加明确。如果你拒绝适应这种变化,仍然坚持停留在简单的执行层面,那么前行的道路将会异常艰难。你将不得不与那些不眠不休的AI工具,以及那些利用这些工具来完成原本需要三个人才能完成的工作的开发者们竞争。
但如果你能够接受这种转变,转向抽象思维、深入研究基础知识、系统架构以及真正承担起责任,那么机会将是无穷的。你不再需要与所有人竞争了——你的竞争对手将只是一小部分愿意迎接挑战、积极追求进步的开发人员。
未来的软件工程(或者说,当下的软件工程)并不只是关于在编辑器中编写代码语法,而是要弄清楚应该构建什么、为什么需要构建它、它会对业务产生怎样的影响、如何设计才能使其具有持久性,以及如何利用人工智能这一工具来让开发效率呈指数级提升。
如果你已经读到了这里……
非常感谢你!
我是一名全栈软件工程师,拥有超过二十年的产品开发经验。目前,我正在推动自己的创业项目CreoWis Technologies的发展,并通过我的YouTube频道tapaScript为开发者们提供教学和指导。
能够在freeCodeCamp平台上发表我的第50篇文章,我感到无比激动;能够将自己的知识回馈给开发者社区,我也感到非常自豪。如果你想与我保持联系,可以:
期待在下一篇文章中与大家再见。在此之前,请照顾好自己,继续努力学习吧。
