AI 时代生存指南 第7篇:写给初级开发者的特别指南 - 与 AI 共同成长
在写这篇文章之前,我想起了最近遇到的几位初级开发者。
刚从编程训练营毕业、正在找第一份工作的26岁开发者 Suhyeon 说了这样一句话:"Copilot 把代码都写好了……我真的有必要努力学算法吗?会不会像我这样的初级开发者已经变得不再需要了?"
已经工作8个月的28岁开发者 Minjun 则不同:"其实我只是直接用 Copilot 吐出来的代码……但不知道这样对不对。感觉不到自己的实力在提升。"
而大四学生 Jiyoung 则坦率地问道:"我看到一篇文章说 AI 会让初级开发者的岗位全部消失,我是不是干脆该换个方向?"
这三位的不安与困惑,正是我写这篇文章的原因。先把结论说在前面。
AI 不会取代初级开发者。但根据你如何使用 AI,两年后的你可能会成为一名完全不同的开发者。
1. 理解初级开发者的不安
老实说,不安并非毫无理由。让我们直面现实。
正在发生的事情
GitHub Copilot、Cursor、Claude、GPT-4 这类 AI 工具会生成代码。过去初级开发者要花上一整天才能写完的样板代码、CRUD API、简单的工具函数,如今几秒钟就能生成出来。
一些公司正在放缓招聘速度,理由是"有了 AI,现有团队就能做更多事,没必要再招新人"。
面试也在改变。"在白板上解这道算法题"正在变成"用 AI 展示你能多快、多好地解决这个实际问题"。
但在回应这种不安之前
让我们先回顾一下历史。
1990年代,编译器让汇编开发者感到担忧。2000年代,高级框架(Rails、Django)曾引发"这样下去会培养出一批不懂基础的开发者"的忧虑。2010年代,云计算与 DevOps 自动化被认为会让系统管理员的工作消失。
结果如何?开发者的需求持续增长,而且每当工具进化一次,开发者能够解决的问题的规模与复杂度就随之扩大。
AI 时代也在发生同样的事情。只是,速度更快。
2. 好消息:AI 不是取代初级开发者,而是放大他们
AI 是杠杆
一个真正懂得如何使用 AI 编程工具的初级开发者,和不用 AI 的初级开发者相比,生产力差距会有多大?
从实际现场的反馈来看,善于利用 AI 的开发者在重复性的编码工作中能体验到3到5倍的速度提升。这意味着他们能尝试更多东西——可以做更多实验,学到更多样的方法。
"放大"意味着什么
问题在于,放大的究竟是什么。
没有实力时,AI 就是一个能快速生成烂代码的工具。有实力时,AI 就是一个能快速做出好代码的工具。
# AI 可能生成的代码示例(功能可用,但存在问题的版本)
def get_user_data(user_id):
conn = psycopg2.connect("postgresql://localhost/mydb")
cursor = conn.cursor()
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
return cursor.fetchone()
这段代码能运行,但存在多个问题:有 SQL 注入漏洞,连接没有被正确关闭,也没有使用连接池。要在 AI 生成这段代码时就意识到"这里有问题",需要基础知识作为支撑。
有基础的初级开发者会立刻发现问题并修正它,没有基础的初级开发者则会直接复制粘贴。一年之后,这两个人之间的差距将会是巨大的。
3. AI 时代依然不可或缺的基本功
计算机科学基础:数据结构与算法
"算法反正 AI 都能搞定,没必要学"——这种想法很危险。
学习数据结构和算法的目的,并不只是为了通过面试。核心在于理解「什么样的工具适合什么样的场景、为什么适合」这一点。
# 如果让 AI "写一段能快速查找用户数据的代码"
# 它会提出好几种方法
# 方法1:列表顺序查找 - O(n)
def find_user_list(users, user_id):
for user in users:
if user['id'] == user_id:
return user
return None
# 方法2:字典哈希查找 - O(1)
def find_user_dict(users_dict, user_id):
return users_dict.get(user_id)
# 方法3:对已排序列表做二分查找 - O(log n)
import bisect
def find_user_sorted(sorted_ids, users, user_id):
idx = bisect.bisect_left(sorted_ids, user_id)
if idx < len(sorted_ids) and sorted_ids[idx] == user_id:
return users[idx]
return None
如果只有10个用户,方法1就足够了。但如果有1亿用户呢?方法2就是必需的。要做出这个判断,需要具备时间复杂度的概念。当 AI 说"两种都可以用"的时候,该选哪一个,是需要你自己来决定的。
系统层面的理解:操作系统、网络、数据库
这三者是所有软件的基础。要理解 AI 生成的代码"为什么慢"、"为什么偶尔会崩溃",都需要系统层面的知识。
操作系统方面的理解
进程与线程的区别、内存管理的基础、文件系统的运行方式——不了解这些,就无法调试并发相关的 bug 或内存泄漏问题。
# 你能看出这段代码为什么有问题吗?
import threading
counter = 0
def increment():
global counter
for _ in range(100000):
counter += 1 # 出现竞态条件!
threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads: t.start()
for t in threads: t.join()
print(counter) # 不会打印出 1000000
如果不理解竞态条件,就发现不了这段代码的问题。AI 有可能生成这样的代码,问它的话也能告诉你问题所在。但当这个问题真的在生产服务中出现时,能凭直觉判断出"这是竞态条件",靠的正是系统层面的知识。
网络方面的理解
HTTP/HTTPS、TCP/UDP、DNS、CDN 的基本概念。当收到 API "很慢"的反馈时,你需要知道该从哪里开始排查。
# 网络调试工具 —— 基本理解必不可少
curl -v https://api.example.com/users # 查看 HTTP 请求/响应详情
traceroute api.example.com # 追踪数据包路径
dig api.example.com # DNS 查询
netstat -an | grep ESTABLISHED # 查看当前连接状态
数据库方面的理解
索引为什么必要、N+1 查询问题是什么、事务为什么重要——不了解这些,就无法阻止 AI 生成的 ORM 代码把数据库拖垮。
# N+1 查询问题示例
# 错误做法:会产生 N+1 查询
orders = Order.objects.all()
for order in orders:
print(order.user.name) # 每个订单都会触发一次单独的查询!
# 100个订单 = 101次查询
# 正确做法:使用 prefetch_related
orders = Order.objects.prefetch_related('user').all()
for order in orders:
print(order.user.name) # 只需2次查询即可解决
AI 有可能生成第一种写法的代码。这是不是问题,判断权取决于你的数据库知识。
代码阅读能力:验证 AI 代码
不能盲目相信并直接使用 AI 生成的代码,必须亲自阅读并理解它。
培养代码阅读能力的方法:
- 阅读知名开源项目的代码(requests、Flask、FastAPI 等)
- 主动参与 PR 评审
- 不要直接照搬 AI 生成的代码,而是逐行理解之后再使用
调试能力:最重要的基础能力
需要摆脱"到处打印 print"的方式,学会系统化的调试方法。
# Python 调试器 pdb 的基础用法
import pdb
def calculate_discount(price, user_type):
pdb.set_trace() # 在这里暂停执行,进入交互模式
if user_type == "vip":
discount = price * 0.2
elif user_type == "member":
discount = price * 0.1
else:
discount = 0
return price - discount
# pdb 命令:
# n (next):执行下一行
# s (step):进入函数内部
# p 变量名:打印变量值
# c (continue):继续执行直到下一个断点
# l (list):查看当前位置附近的代码
你可以让 AI"帮忙找 bug"。但复杂的状态相关 bug、时序问题、依赖特定环境才会出现的 bug,还是需要你亲自用调试器去追踪。
4. 把 AI 当作学习加速器来使用的方法
现在进入重点。如果正确使用 AI,学习速度可以提高3到5倍。
向 AI 请求解释,边学边用
不要只是接收代码,一定要顺便请求解释。
# 不好的做法
"用 Python 写一段二分查找代码"
# 好的做法
"用 Python 写一段二分查找代码,
并举例说明为什么这个方法是 O(log n)。
另外也告诉我这段代码会在哪些边界情况下失效。"
理解了解释之后,请务必自己重新动手写一遍。理解一件事,和能亲手写出来,是两回事。
理解并修改 AI 写的代码
拿到 AI 写的代码后,请遵循以下步骤。
第1步:阅读代码,理解整体流程
第2步:把不理解的部分拿去问 AI
第3步:思考代码可能失败的场景
第4步:亲自编写边界情况的测试
第5步:尝试修改可以改进的部分
# 把 AI 生成的代码用于学习的示例
# 从 AI 那里拿到的代码:
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
# 学习活动:亲自编写测试用例
def test_merge_sort():
assert merge_sort([]) == [] # 空列表
assert merge_sort([1]) == [1] # 只有1个元素
assert merge_sort([3, 1, 2]) == [1, 2, 3] # 基本情况
assert merge_sort([1, 1, 1]) == [1, 1, 1] # 重复元素
assert merge_sort([3, 2, 1]) == [1, 2, 3] # 逆序
print("所有测试通过!")
test_merge_sort()
与 AI 结对编程
这是一种不把 AI 当作单纯的代码生成器,而是把它当作经验丰富的同事来使用的方法。
# 结对编程风格的提示词示例
"我正在做一个用户认证系统。
我想用 JWT token,先不要直接给我代码,
帮我说明一下应该怎么思考这个问题,
只告诉我核心概念和需要考虑的要点,让我自己先设计一遍。"
# 然后自己设计完,再追问:
"我是这样设计的:
[我的设计内容]
这个方案有没有遗漏的地方,或者可以改进的地方?"
用这种方式使用 AI,能学到的东西远比单纯拿到代码要多得多。
用 AI 学习概念
当有些概念看教科书或官方文档还是理解不了时:
"我不太理解异步编程里事件循环(event loop)的概念。
请用一个比喻来解释,就当作我是一个人在餐厅里独自跑堂。
然后再用一个简单的例子告诉我 Python 的 asyncio 是怎么实现这个机制的。"
你也可以让它用5种不同的方式解释同一个概念。其中总有一种方式能让你真正理解。
5. 两年内从初级成长为中级/资深的策略
为什么"两年"是可能的
传统上,从初级成长为资深需要5到7年。而在 AI 时代,只要有意识地努力,就有可能缩短到2到3年。不过,这是有条件的。
- 被动地使用 AI,成长会很慢
- 把 AI 当作主动的学习工具来使用,才能加速成长
年度成长路线图
第1年目标:打好扎实的基础 + 养成与 AI 协作的习惯
每日实践:
- 写代码时,同时向 AI 请求解释
- 收到的代码务必理解透彻
- 没理解的概念,一定当天就整理清楚
每周实践:
- 解3道算法题(LeetCode、Programmers 等)
- 从 AI 生成的代码里找出1处可以改进的地方
每月实践:
- 尝试提交1个开源 PR
- 把学到的内容写成博客文章
# 到第1年年底应该能做到的事:
# - 独立设计并实现一个简单的 CRUD API(可以借助 AI)
# - 能说明自己写的代码的时间/空间复杂度
# - 理解基本的 SQL 查询优化
# - 对部署流水线有基本理解(CI/CD)
# - 养成系统化调试 bug 的习惯
第2年目标:系统设计 + 熟练运用 AI
到了第2年,你应该能超越单纯的实现,说明"为什么要这样设计"。
# 第2年适合和 AI 一起做的活动:
# 1. 系统设计练习
# "帮我设计一个 URL 短链接服务。不过我先把自己的设计给你看,
# 请你给我反馈"
# 2. 代码评审学习
# "请从资深开发者的视角评审这份 PR 代码,
# 从性能、可读性、安全性、测试覆盖率这几个方面来看"
# 3. 理解架构决策
# "我们团队决定用 Redis 做缓存。
# 请说明什么时候缓存有用,什么时候会适得其反"
资深与初级的真正差异
很多初级开发者认为资深开发者就是"写更复杂的代码"。实际上并非如此。
资深开发者是这样的人:
- 能把复杂问题变简单的人
- 会先问"为什么要做这个"的人
- 能预见未来的变化,并做出灵活设计的人
- 能帮助团队更好地运转的人
在 AI 时代,资深开发者还要再加上这些:
- 能快速判断 AI 生成代码质量的人
- 懂得向 AI 提出正确问题的人
- 懂得用 AI 工具提升整个团队生产力的人
6. 打造善用 AI 的作品集
初级开发者作品集的陷阱
很多初级开发者会把"待办事项 App"或"天气 App"当作作品集。老实说,这类项目很难让你脱颖而出。
AI 时代的初级开发者作品集,应该有所不同。
作品集策略1:利用 AI 工具做实用项目
打造一个用 AI 解决了你自己真实需求的项目。
例如:
- 用 AI 检索自己读书笔记的 App
- 能总结 YouTube 字幕的 Chrome 扩展
- 能轻松检索韩语法律文书的服务
# Chrome 扩展 + AI API 集成示例(background.js 概念)
# 用户在网页上选中文本后自动生成摘要的功能
# 在 manifest.json 中配置好 permissions 之后
# 在 content script 中检测被选中的文本
# 在 background service worker 中调用 AI API
async function summarizeText(selectedText) {
const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`
},
body: JSON.stringify({
model: 'gpt-4o-mini',
messages: [
{role: 'system', content: '请把这段文字总结成3行。'},
{role: 'user', content: selectedText}
]
})
});
const data = await response.json();
return data.choices[0].message.content;
}
作品集策略2:开源贡献
为知名开源项目做贡献,是一种强有力的证明。一开始可以从小事做起。
- 修正文档中的错别字
- 添加测试用例
- 修复简单的 bug
借助 AI,可以加快开源贡献的速度。
# 借助 AI 进行开源贡献的流程
# 1. 阅读项目的 CONTRIBUTING.md
# 2. 寻找带有 "good first issue" 标签的 issue
# 3. 请 AI 帮忙理解代码库
# "在这个 Python 项目的 src/core/parser.py 里,
# 我看到这个模式反复出现,请说明一下这是什么结构"
# 4. 实现修改内容(与 AI 结对编程)
# 5. 编写测试
# 6. 提交 PR
作品集策略3:记录 AI 辅助开发的过程
展示"我是如何与 AI 协作开发的"这件事本身,就是一份作品集。可以写在开发博客里,比如:
- "我是如何运用 AI 代码评审的"
- "发现并修复 AI 生成代码中 bug 的案例"
- "靠 AI 把生产力提升3倍的个人工作流"
这类文章能同时展示你的技术实力与 AI 应用能力。
7. 现实的求职策略:AI 时代招聘的变化
招聘流程的变化
编程面试的变化
许多公司正在摆脱传统的算法测验,转而采用:
- 贴近实际工作的课题(带回家做的作业)
- 结对编程环节(和面试官一起写代码)
- 允许使用 AI 工具的编程挑战
在允许使用 AI 的面试中,重要的不是你能多快生成代码,而是你能多好地理解 AI 生成的代码、提出正确的问题、并对其加以改进。
作品集审查的重要性正在提升
比起简历,公司会更多地查看你实际写的代码。GitHub 主页、真实上线服务的链接、技术博客都变得更加重要。
求职策略
策略1:优先考虑创业公司
大公司更看重学历与履历,创业公司看的则是"你行不行"。如果你是一个实力过硬的初级开发者,创业公司能给你更快的职业成长机会。
策略2:结合领域专长
比起单纯的"Python 开发者","具备医疗健康领域知识 + AI API 应用能力的开发者"更能形成差异化。把你感兴趣的领域和开发能力结合起来。
策略3:善用人脉网络
活跃于开发者社区,对求职有帮助。
- 参与 OKKY、Programmers 等社区活动
- 参加开源相关会议(PyCon Korea、JSConf Korea 等)
- 参加黑客松(AI 黑客松尤其推荐)
策略4:在申请材料中明确写出 AI 应用能力
# 作品集/简历中可以包含的内容示例:
#
# 技术栈部分:
# - AI 工具:使用 GitHub Copilot、Claude、Cursor 的经验
# - AI 集成经验:基于 OpenAI API、LangChain 开发应用
#
# 项目描述:
# "独立完成了利用 AI API 打造 X 服务的策划-设计-开发-部署全过程。
# 借助 Claude 和 GitHub Copilot 把开发时间缩短了40%,
# 但所有生成的代码都经过我本人审查,并编写了测试"
写在最后:致各位初级开发者
感到不安是很自然的。但这种不安不应该导向"反正 AI 都能搞定,没必要学"这样的结论。
最危险的开发者,是那种认为"AI 都替我做了,我还学什么"的初级开发者。他们一年后依然发现不了 AI 生成的烂代码,两年后还在重复同样的错误。
成长最快的开发者,是那种会想"AI 为什么要这样写?有没有更好的方法?"的初级开发者。他们把 AI 既当老师又当工具来用,一年之后,即便没有 AI 也能写出好代码。
基本功不会背叛你。数据结构、算法、系统知识——即便 AI 工具在变、编程语言在变,这些东西依然会留下来。在 AI 替你写代码的时代,能理解"代码为什么会这样运作"的开发者,价值反而会变得更高。
而且最重要的是,第一次把服务部署上线、看到真实用户在使用它的那种感动,是 AI 给不了的。为了体验那份感动而在今天依然敲着代码的你,做得已经很好了。
本系列的下一篇,将探讨 AI 时代设计师的生存策略。
현재 단락 (1/224)
在写这篇文章之前,我想起了最近遇到的几位初级开发者。