作为一个从土木工程转行的开发者,我花了整整一年时间学习前端三件套、React、Spring Boot,却一直潜意识认为"算法是研究算法的人才需要学的,和前后端开发没关系"。直到最近在学习 Spring Boot 的过程中,我突然意识到:算法不是独立的学科,而是整个编程语言的地基。这个认知转变,让我重新审视了过去一年的学习路径,也让我意识到自己错过了什么。
🤔 曾经的误解:算法与我无关
转行初期的学习路径
我的转行路径是这样的:
- 2024年下半年:从零开始学习 HTML / CSS / JavaScript 三件套
- 2025年上半年:学习 React,做了几个项目(包括现在这个个人网站)
- 2025年下半年:开始学习 Java 基础 + Spring Boot,目标是转型后端开发
在这个过程中,我一直专注于"技术框架"的学习:
- 怎么用 React Hooks?
- 怎么用 Spring Boot 搭建 RESTful API?
- 怎么用 MySQL 设计数据库?
- 怎么用 Nginx 部署项目?
对算法的刻板印象
而对于算法,我的态度一直是:"那是研究算法的人应该学的,和我写业务代码有什么关系?"
"框架教我怎么快速开发,算法太底层了,等我工作稳定了再说吧。"
这种想法听起来合理吗?在转行初期,面对海量的新知识,我选择了"先学能用的,底层的以后再说"。但现在回头看,这是一个巨大的误区。
💡 认知转变的契机:Spring Boot 中的性能问题
第一次遇到性能瓶颈
转折点发生在我学习 Spring Boot 的时候。我在做一个简单的用户查询功能:
// 我的第一版代码(初学者写法)
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
List<User> users = userRepository.findAll(); // 查询所有用户
for (User user : users) {
if (user.getId().equals(id)) {
return user; // 找到就返回
}
}
return null;
}
这段代码功能上没问题,测试通过了。但当我把数据库用户数量从 100 个增加到 10000 个时,接口响应时间从 10ms 飙升到 500ms。
我的第一反应是:"是不是数据库慢了?"、"是不是网络问题?"。直到我看了一篇关于时间复杂度的文章,才突然意识到:
我的代码是 O(n) 线性查找,10000 个用户就要遍历 10000 次。而如果用 HashMap,时间复杂度是 O(1),无论多少用户都是常数时间。
第二版代码:数据结构的力量
// 改进版:用 HashMap 缓存
private Map<Long, User> userCache = new HashMap<>();
@PostConstruct
public void initCache() {
List<User> users = userRepository.findAll();
for (User user : users) {
userCache.put(user.getId(), user); // O(n) 初始化
}
}
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
return userCache.get(id); // O(1) 查询
}
改用 HashMap 后,10000 个用户的查询时间降到了 5ms。性能提升了 100 倍,而我只是换了一个数据结构。
这一刻,我意识到:选对数据结构 > 优化算法 > 优化框架配置。
🧠 算法的真实定位:编程语言的地基
我的新认知
经过这次经历和深入思考,我对算法的理解发生了质的飞跃:
- 算法不是独立的学科:它是编程语言的基础,就像"地基"之于建筑
- 框架教你"怎么做":Spring Boot、React 教你快速开发
- 算法教你"怎么做得更好":性能优化、资源节约、用户体验
- 后端 = 框架 + 算法 + 系统设计:框架是工具,算法是能力
算法不是"研究算法的人"才需要学的,而是每个开发者的必修课。
后端开发中的算法
后端作为企业稳定性的代表,算法扮演着非常重要的角色:
- 性能优化:O(n) vs O(n²) 在百万级数据下差距巨大
- 缓存设计:LRU 算法决定了缓存淘汰策略
- 限流算法:滑动窗口、令牌桶保护系统稳定性
- SQL 优化:索引 = B+树算法,理解算法才能写出高性能 SQL
前端开发中的算法
即使是前端,算法也无处不在:
- React Virtual DOM Diff:树的最小编辑距离算法(O(n) 优化版)
- 大列表渲染:虚拟滚动算法(只渲染可见区域)
- 搜索、筛选、排序:数组操作的时间复杂度直接影响用户体验
- 状态管理:Zustand、Redux 内部用哈希表存储状态
⚠️ 我的认知盲点:不只是算法,还有这些
盲点 1:数据结构比算法更基础
之前我只关注"算法"(排序、查找),却忽略了数据结构才是基础中的基础。
举个例子:
// ❌ 用 ArrayList 查找(O(n))
List<User> users = new ArrayList<>();
users.contains(targetUser); // 线性查找,慢
// ✅ 用 HashSet 查找(O(1))
Set<User> users = new HashSet<>();
users.contains(targetUser); // 哈希查找,快
工作中最常用的数据结构:
- HashMap / HashSet:后端缓存、去重、快速查找
- LinkedList vs ArrayList:插入删除 vs 随机访问
- TreeMap:有序数据、范围查询
- Queue / Stack:任务队列、浏览器历史
很多性能问题不是算法写得不好,而是数据结构选错了。
盲点 2:空间复杂度也很重要
之前我只关注时间复杂度(代码跑得快不快),却忽略了空间复杂度(占用多少内存)。
后端场景:服务器内存有限,处理百万级数据时,O(n) 空间可能导致 OOM(内存溢出)。
// ❌ 空间复杂度 O(n) - 可能 OOM
List<Integer> result = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
result.add(i * 2); // 一次性加载百万数据到内存
}
// ✅ 空间复杂度 O(1) - 流式处理
Stream.iterate(0, i -> i + 1)
.limit(1000000)
.map(i -> i * 2)
.forEach(System.out::println); // 边生成边处理,不占内存
盲点 3:SQL 优化 = 算法思维
之前我以为 SQL 优化就是"加索引",现在才明白索引的本质是 B+树算法。
-- ❌ 没索引:O(n) 全表扫描
SELECT * FROM users WHERE email = 'test@example.com';
-- ✅ 有索引:O(log n) B+树查找
CREATE INDEX idx_email ON users(email);
SELECT * FROM users WHERE email = 'test@example.com';
理解算法后,我才明白:
- 为什么要建索引?因为 B+树查找是 O(log n)
- 为什么联合索引有顺序?因为树的左子树规则
- 为什么慢查询?可能是算法退化到 O(n)
盲点 4:框架内部也在用算法
之前我把框架当成"黑盒",现在才明白框架 = 算法 + 设计模式 + 工程经验。
Spring Boot 内部算法:
- Bean 管理:哈希表(beanName → BeanDefinition)
- 依赖注入:拓扑排序(解决循环依赖)
- AOP 代理:责任链模式 + 动态代理
React 内部算法:
- Virtual DOM Diff:树的最小编辑距离(O(n) 优化版)
- Fiber 架构:链表 + 优先级队列
- Hooks:链表存储状态
学算法 → 理解框架 → 更好地使用框架。这是一个正向循环。
🎯 算法的层次:不是所有场景都需要复杂算法
工作中真正需要的算法
意识到算法重要后,我又陷入了另一个误区:"是不是要刷 LeetCode Hard?"
后来我发现,工作中 80% 的场景只需要基础算法。
| 层次 | 内容 | 工作占比 | 优先级 |
|---|---|---|---|
| 必须掌握 | 排序、二分查找、哈希表、链表、栈/队列 | 80% | ⭐⭐⭐⭐⭐ |
| 进阶掌握 | 树(BST/红黑树)、堆、图(BFS/DFS) | 15% | ⭐⭐⭐⭐ |
| 选学 | 动态规划、贪心、回溯、字符串匹配 | 5% | ⭐⭐⭐ |
Spring Boot 后端开发中的真实场景
- 排序:订单按时间排序、商品按价格排序
- 哈希表:缓存用户信息、去重
- 二分查找:在有序数据中快速定位
- 队列:消息队列、任务调度
- 树:部门层级、评论楼层
不需要刷 LeetCode Hard,但基础必须扎实。
📚 给转行开发者的学习建议
第 1 阶段:基础数据结构(当前最重要)
时间:1-2 个月
内容:
- 数组、链表、栈、队列
- HashMap、HashSet 原理
- 排序(快排、归并)、二分查找
学习方式:
- ✅ 结合项目实践:不要只刷题,要在 Spring Boot 项目中应用
- ✅ 理解 Java 集合框架源码:ArrayList、HashMap 是怎么实现的?
- ✅ LeetCode Easy 题目:每天 1-2 道,培养思维
第 2 阶段:树和图(3 个月后)
内容:
- 二叉树遍历、BST、红黑树
- BFS、DFS
- MySQL B+树原理
第 3 阶段:系统设计(6 个月后)
内容:
- 缓存算法(LRU、LFU)
- 限流算法(滑动窗口、令牌桶)
- 一致性哈希(分布式系统)
学习资源推荐
- 书籍:《算法图解》(入门)、《算法第四版》(进阶)
- 视频:CS61B(伯克利数据结构课程)
- 刷题:LeetCode(按标签刷,不要盲目)
- 实践:在自己的项目中应用(最重要)
💭 最后的思考
转行一年后的感悟
如果回到一年前,我会告诉那个刚开始学前端三件套的自己:
"算法不是'以后再说'的东西,而是应该和框架同步学习的基础能力。"
现在我的学习节奏是:
- 上午:学习 Spring Boot 新知识
- 下午:在项目中应用
- 晚上:刷 1-2 道 LeetCode,巩固算法思维
给转行开发者的建议
如果你也是转行开发者,不要犯我曾经犯过的错误:
- ❌ 不要觉得"算法是算法研究者才需要的"
- ❌ 不要觉得"框架学会了就够了"
- ❌ 不要觉得"算法太难,以后再说"
- ✅ 要把算法当成"编程语言的地基"
- ✅ 要在项目中主动应用算法思维
- ✅ 要从基础数据结构开始,循序渐进
结语
从"算法与我无关"到"算法是地基",这个认知转变让我重新审视了自己的学习路径。算法不是独立的学科,而是每个开发者的必修课。
我很庆幸在转行一年后就意识到了这一点,而不是等到工作中遇到性能瓶颈时才追悔莫及。
"技术的深度决定了职业的高度。框架会过时,但算法思维会伴随你整个职业生涯。"
这篇文章献给所有转行开发者,希望我的认知转变能给你一些启发。

读者评论
分享你的想法,与作者和其他读者交流
发表评论