我在编程路上踩过的那些坑,以及后来学会的「笨办法」
十年前,我刚入行的时候,觉得自己特别聪明。
你看啊,我学 JavaScript,三天就能上手写页面;学 Python,一周就能跑爬虫;学 React,半个月就能做小项目。招聘网站上那些岗位要求,我扫一眼,差不多都能对上。
那时候我膨胀到什么程度呢?我在网上买了个 99 块钱的「21天学会Python」课程,愣是三天就读完了。书桌上还摆着一摞《7天精通Java》《30天成为架构师》——当然,一本都没看完。
十年后的今天,我想把这些书一本本吃掉。
不是因为我变笨了,而是因为——我终于承认,当年的「学会」,其实只是「看过」。
那些年,我以为的「学会」
让我问你几个问题:
- 打开 VS Code,不用百度,能写出一个二分查找吗?
- 别人问你 HashMap 的底层实现,你能讲清楚吗?
- 接手别人的代码,能快速说出这段逻辑在干什么吗?
如果你跟我十年前一样自信满满地说「当然可以」,那太好了,咱们是一路人。
但如果你犹豫了——别担心,这不是你的错。这是我们这行最普遍的幻觉:看文档等于学会了,抄 Demo 等于掌握了,收藏等于学习了。
我给你讲个真实的笑话。
2016年,我刚转后端,自学 MySQL。我把《高性能 MySQL》翻了三遍,笔记记了半本,自认为「精通」了。结果有一次面试,面试官问我:「事务隔离级别有哪些?」
我想都没想:「读未提交、读已提交、可重复读、串行化。」
面试官点点头:「那它们分别解决了什么问题?」
我:「……」
面完出来,我在公司楼下坐了十分钟。我突然意识到一个恐怖的事实:我他妈的背了答案,但我根本不知道那些词是什么意思。
这就是我踩的第一个坑——被动学习。
被动学习:最大的时间杀手
你有没有过这种经历:
- 看技术文档,一边看一边点头,感觉自己懂了
- 刷技术博客,这个也收藏,那个也收藏
- 听技术分享,听的时候热血沸腾,听完就忘
恭喜你,你正在进行「被动学习」。
不是我吓你,科学数据是这样的:美国缅因州国家训练实验室的研究表明,被动学习(听讲、阅读)的知识留存率,只有 5% 到 10% 。
而主动学习(讨论、实践、教授他人),知识留存率高达 50% 到 90% 。
这是个什么概念?你花一个小时「看」教程,实际上只记住了 5 到 10 分钟的东西。剩下 50 分钟,相当于喂了狗。
但作为一个程序员,我们天生就是被动学习的受害者。
为什么?因为我们太容易「看代码」了。
- GitHub 上 Star 一个项目,哇塞源码好棒,收藏
- 掘金上刷到一篇好文,收藏
- 知乎上看到一个「完全理解 XXX」的系列,收藏
收藏夹里躺了几百篇文章,真正打开看过的,不到十分之一。
我后来戒掉了收藏癖,不是因为我突然变勤快了,而是因为我发现——收藏的文章,三年后还是新的,而我的技术,早就过时了。
第一个笨办法:主动回忆
转折点发生在 2018 年。
那一年,我开始刷 LeetCode。刚开始刷的时候,我自信心爆棚——毕竟「中等难度」嘛,看答案能有什么难度?
结果第二天做题傻眼了:昨天看答案觉得挺简单,今天自己写,完全下不去手。
我当场心态崩了。这感觉就像看了一场 NBA,觉得自己也能扣篮——结果连球都运不好。
我开始反思:为什么看答案会,做题就不会?
后来我学到了一句话,叫做 Active Recall(主动回忆) 。
什么意思?简单说就是:不要复习「答案」,而要复习「问题」。
举个例子。
以前我复习算法题,是这样做的:打开一道题,看一眼题目,然后直接翻到答案页,开始抄。抄完了,点点头,懂了懂了。
这是被动学习。你只是在「读取」信息,大脑根本没动。
现在我是这样做的:
- 看到一道题,先自己思考 15 分钟
- 哪怕想不出来,也要硬写
- 写不出来?没关系,在纸上画,把能想到的可能性都写出来
- 最后再去看答案,对比自己的思路
这个过程极其痛苦,但极其有效。
为什么?因为你在主动召回大脑里的知识。每次你努力回忆,大脑就会强化那条神经回路。哪怕最后没想出来,这个「尝试回忆」的过程,比你看十遍答案都管用。
有个研究数据特别有意思:同样是学习一组单词,先测试后学习的学生,比先学习后测试的学生,最终成绩高出 50%。
这告诉我们一个反常识的道理:考试不是学习的终点,而是学习的一部分。
所以我现在刷 LeetCode,根本不追求「刷了多少道」。我追求的是:每一道题,做完之后能否在不看答案的情况下,从头写出来。
如果不能,就说明这道题还没真正「学会」。
第二个笨办法:间隔重复
如果说主动回忆是「怎么学」,那间隔重复就是「什么时候学」。
我问你一个问题:同样是背十个单词,下面两种方式,哪个记得更牢?
方式一:周一学一遍,然后周一到周五每天复习一遍 方式二:周一学一遍,然后下周一再复习
答案是:方式一记得更牢?错!
答案是:方式二记得更牢。
因为记忆这玩意儿,它有个特性,叫做「遗忘曲线」。刚学完的东西,记得最牢;过了几天忘了大半;再往后,忘得就慢了。
所以最有效的复习策略是:在即将遗忘的时候复习。
这就是所谓的 Spaced Repetition(间隔重复) 。
具体怎么操作?我给你讲讲我的笨办法。
我用的是 Anki,一个基于间隔重复算法的记忆卡片软件。
我把我不会的东西,全部做成卡片:
- 「HashMap 的底层实现是什么?」
- 「Redis 的持久化机制有哪些?」
- 「TCP 三次握手的过程是什么?」
每天早上,我花 15 分钟复习这些卡片。
关键是,Anki 会根据我的记忆情况,自动安排复习时间。记住了的卡片,它会推迟到明天、后天、甚至一周后;没记住的卡片,它会让我今天再复习一遍。
就这么简单的一个习惯,我坚持了两年。
两年后,我发现自己变了。以前别人问我一个技术问题,我要么说「等我查一下」,要么就开始胡扯。现在我可以自信地说:「这个问题是这样的……」
不是因为我变聪明了,而是因为那些卡片,我已经复习了无数遍。
有个读者曾经问我:「卡片要怎么做?太花时间了吧?」
我的回答是:花时间做卡片,就是在学习本身。
做卡片的过程,本身就是一种深度加工。你要把一个概念用自己的话解释清楚,写在卡片上——这个过程,比你刷十篇博客都管用。
第三个笨办法:讲给别人听
这是我从费曼那里学来的方法,叫做 Feynman Technique(费曼学习法) 。
核心思想一句话:如果你不能用自己的话把一个概念讲清楚,说明你还没真正懂。
我第一次用这个方法,是在 2019 年。
那年公司有个内部技术分享,主题是「分布式事务」。我被赶鸭子上架,要求讲 30 分钟。
我花了三天准备,查阅了十几篇文章,做了二十多页 PPT,自认为准备充分了。
结果讲的时候,出了个大洋相。
讲到一个关键点,一位同事突然问我:「那如果数据库挂了,事务怎么回滚?」
我当场卡住。PPT 上明明有答案,但我突然发现自己根本不理解那个机制。
那一分钟的沉默,让我无地自容。
从那以后,我每次学新技术,都会问自己一个问题:如果我要讲给一个完全不懂的人听,我能不能讲清楚?
这个方法特别好用。为什么?因为它能瞬间暴露你的认知盲区。
你知道那种感觉吗?看文章的时候,觉得「哇塞这个好简单」,结果自己复述一遍,发现「咦,这里好像不太对」——恭喜你,你发现了自己的知识盲区。
所以我现在学新技术,都会做两件事:
- 写博客:用自己的话,把学到的东西写下来
- 讲给同事听:不管有没有人听,我都会对着空气讲一遍
你别说,这个方法帮我避开了很多「面试造火箭,工作拧螺丝」的坑。因为当我试图讲清楚一个概念时,我才会发现:原来这个知识点,我根本没有真正理解。
第四个笨办法:刻意练习
最后一个办法,是「刻意练习」。
这个词已经被说滥了,但我还是要讲,因为它太重要了。
什么是刻意练习?不是我今天刷了 50 道 LeetCode,也不是我今天写了 1000 行代码。
刻意练习 = 走出舒适区 + 持续反馈 + 针对性改进
翻译成程序员能听懂的话,就是:不要写你擅长的代码,要写你不会的代码。
举个例子。
我之前面过一个高级开发的岗位,面试官让我写一个 LRU 缓存。
我当场就崩了。LRU 是什么我知道,但怎么写?对不起,我没用过。
后来我痛定思痛,开始「刻意练习」那些我不熟悉的数据结构和算法。
我的练习方法是这样的:
- 每天一道算法题,不看答案,硬做
- 不会做怎么办?先想 30 分钟,想不出来再看答案
- 看懂答案之后,不急着下一道,而是问自己:这道题考察的是什么?我下次怎么能想起来?
就这么简单的方法,我坚持了三个月。
三个月后,我再面试同一个岗位,面试官又问了 LRU。
我当场写出来了。
不是因为我背了答案,而是因为我在练习的过程中,真正理解了 HashMap + 双向链表的组合用法。这个组合我用过一次,就再也忘不了了。
所以我现在特别相信一句话:你不需要更聪明,你只需要更刻意。
写在最后
写了这么多,你会发现一个规律:这些方法,都不是什么「捷径」。
它们甚至听起来有点「笨」:
- 不看答案,硬想 —— 笨
- 做卡片,天天复习 —— 笨
- 讲给别人听,写博客 —— 笨
- 专门挑不会的做 —— 笨
但正是这些「笨办法」,让我从一个「面试被吊打」的小透明,变成了一个「能从容应对技术面试」的资深开发。
有时候,最难的不是学什么,而是承认自己之前的方法是错的,然后愿意从零开始。
如果你也是一个程序员,如果你也觉得自己「学了很多,但还是很菜」——不妨试试这几个笨办法:
- 主动回忆:不要看答案,先自己写
- 间隔重复:用 Anki 复习,越学越轻松
- 讲给别人听:写博客,讲技术,让自己无可遁形
- 刻意练习:专挑不会的练,别死在舒适区
如果你想聊聊具体的执行方法,欢迎在评论区留言。我不是什么大神,只是一个踩过无数坑、正在慢慢爬出来的程序员。
咱们一起进步