我在编程路上踩过的那些坑,以及后来学会的「笨办法」

4 阅读10分钟

我在编程路上踩过的那些坑,以及后来学会的「笨办法」


十年前,我刚入行的时候,觉得自己特别聪明。

你看啊,我学 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(主动回忆)

什么意思?简单说就是:不要复习「答案」,而要复习「问题」

举个例子。

以前我复习算法题,是这样做的:打开一道题,看一眼题目,然后直接翻到答案页,开始抄。抄完了,点点头,懂了懂了。

这是被动学习。你只是在「读取」信息,大脑根本没动。

现在我是这样做的:

  1. 看到一道题,先自己思考 15 分钟
  2. 哪怕想不出来,也要硬写
  3. 写不出来?没关系,在纸上画,把能想到的可能性都写出来
  4. 最后再去看答案,对比自己的思路

这个过程极其痛苦,但极其有效。

为什么?因为你在主动召回大脑里的知识。每次你努力回忆,大脑就会强化那条神经回路。哪怕最后没想出来,这个「尝试回忆」的过程,比你看十遍答案都管用。

有个研究数据特别有意思:同样是学习一组单词,先测试后学习的学生,比先学习后测试的学生,最终成绩高出 50%。

这告诉我们一个反常识的道理:考试不是学习的终点,而是学习的一部分

所以我现在刷 LeetCode,根本不追求「刷了多少道」。我追求的是:每一道题,做完之后能否在不看答案的情况下,从头写出来

如果不能,就说明这道题还没真正「学会」。


第二个笨办法:间隔重复

如果说主动回忆是「怎么学」,那间隔重复就是「什么时候学」。

我问你一个问题:同样是背十个单词,下面两种方式,哪个记得更牢?

方式一:周一学一遍,然后周一到周五每天复习一遍 方式二:周一学一遍,然后下周一再复习

答案是:方式一记得更牢?错!

答案是:方式二记得更牢

因为记忆这玩意儿,它有个特性,叫做「遗忘曲线」。刚学完的东西,记得最牢;过了几天忘了大半;再往后,忘得就慢了。

所以最有效的复习策略是:在即将遗忘的时候复习

这就是所谓的 Spaced Repetition(间隔重复)

具体怎么操作?我给你讲讲我的笨办法。

我用的是 Anki,一个基于间隔重复算法的记忆卡片软件。

我把我不会的东西,全部做成卡片:

  • 「HashMap 的底层实现是什么?」
  • 「Redis 的持久化机制有哪些?」
  • 「TCP 三次握手的过程是什么?」

每天早上,我花 15 分钟复习这些卡片。

关键是,Anki 会根据我的记忆情况,自动安排复习时间。记住了的卡片,它会推迟到明天、后天、甚至一周后;没记住的卡片,它会让我今天再复习一遍。

就这么简单的一个习惯,我坚持了两年。

两年后,我发现自己变了。以前别人问我一个技术问题,我要么说「等我查一下」,要么就开始胡扯。现在我可以自信地说:「这个问题是这样的……」

不是因为我变聪明了,而是因为那些卡片,我已经复习了无数遍

有个读者曾经问我:「卡片要怎么做?太花时间了吧?」

我的回答是:花时间做卡片,就是在学习本身

做卡片的过程,本身就是一种深度加工。你要把一个概念用自己的话解释清楚,写在卡片上——这个过程,比你刷十篇博客都管用。


第三个笨办法:讲给别人听

这是我从费曼那里学来的方法,叫做 Feynman Technique(费曼学习法)

核心思想一句话:如果你不能用自己的话把一个概念讲清楚,说明你还没真正懂

我第一次用这个方法,是在 2019 年。

那年公司有个内部技术分享,主题是「分布式事务」。我被赶鸭子上架,要求讲 30 分钟。

我花了三天准备,查阅了十几篇文章,做了二十多页 PPT,自认为准备充分了。

结果讲的时候,出了个大洋相。

讲到一个关键点,一位同事突然问我:「那如果数据库挂了,事务怎么回滚?」

我当场卡住。PPT 上明明有答案,但我突然发现自己根本不理解那个机制。

那一分钟的沉默,让我无地自容。

从那以后,我每次学新技术,都会问自己一个问题:如果我要讲给一个完全不懂的人听,我能不能讲清楚?

这个方法特别好用。为什么?因为它能瞬间暴露你的认知盲区。

你知道那种感觉吗?看文章的时候,觉得「哇塞这个好简单」,结果自己复述一遍,发现「咦,这里好像不太对」——恭喜你,你发现了自己的知识盲区。

所以我现在学新技术,都会做两件事:

  1. 写博客:用自己的话,把学到的东西写下来
  2. 讲给同事听:不管有没有人听,我都会对着空气讲一遍

你别说,这个方法帮我避开了很多「面试造火箭,工作拧螺丝」的坑。因为当我试图讲清楚一个概念时,我才会发现:原来这个知识点,我根本没有真正理解。


第四个笨办法:刻意练习

最后一个办法,是「刻意练习」。

这个词已经被说滥了,但我还是要讲,因为它太重要了。

什么是刻意练习?不是我今天刷了 50 道 LeetCode,也不是我今天写了 1000 行代码。

刻意练习 = 走出舒适区 + 持续反馈 + 针对性改进

翻译成程序员能听懂的话,就是:不要写你擅长的代码,要写你不会的代码

举个例子。

我之前面过一个高级开发的岗位,面试官让我写一个 LRU 缓存。

我当场就崩了。LRU 是什么我知道,但怎么写?对不起,我没用过。

后来我痛定思痛,开始「刻意练习」那些我不熟悉的数据结构和算法。

我的练习方法是这样的:

  1. 每天一道算法题,不看答案,硬做
  2. 不会做怎么办?先想 30 分钟,想不出来再看答案
  3. 看懂答案之后,不急着下一道,而是问自己:这道题考察的是什么?我下次怎么能想起来?

就这么简单的方法,我坚持了三个月。

三个月后,我再面试同一个岗位,面试官又问了 LRU。

我当场写出来了。

不是因为我背了答案,而是因为我在练习的过程中,真正理解了 HashMap + 双向链表的组合用法。这个组合我用过一次,就再也忘不了了。

所以我现在特别相信一句话:你不需要更聪明,你只需要更刻意


写在最后

写了这么多,你会发现一个规律:这些方法,都不是什么「捷径」。

它们甚至听起来有点「笨」:

  • 不看答案,硬想 —— 笨
  • 做卡片,天天复习 —— 笨
  • 讲给别人听,写博客 —— 笨
  • 专门挑不会的做 —— 笨

但正是这些「笨办法」,让我从一个「面试被吊打」的小透明,变成了一个「能从容应对技术面试」的资深开发。

有时候,最难的不是学什么,而是承认自己之前的方法是错的,然后愿意从零开始。

如果你也是一个程序员,如果你也觉得自己「学了很多,但还是很菜」——不妨试试这几个笨办法:

  1. 主动回忆:不要看答案,先自己写
  2. 间隔重复:用 Anki 复习,越学越轻松
  3. 讲给别人听:写博客,讲技术,让自己无可遁形
  4. 刻意练习:专挑不会的练,别死在舒适区

如果你想聊聊具体的执行方法,欢迎在评论区留言。我不是什么大神,只是一个踩过无数坑、正在慢慢爬出来的程序员。

咱们一起进步