最近学到一个很重要的教训:不要给自己同时开太多新坑。

我自己就是最近才发现,我经常会在浏览器里开着几十个标签页,各种 Gemini、GPT 的会话窗口也一直摆着,电脑舍不得关,Obsidian 里全是零散的笔记。GitHub 上也收藏、拉取了一大堆项目,本来想用 Codex 慢慢分析、学习,结果往往只看了一点就懒得继续了。

这些没完成的东西堆在那里,会让我又焦虑又难受。再加上各种竞赛、方向选择、算法、开发、AI 应用,每个看起来都很有用,每个都像是“应该学”的东西。最后反而会陷入一种混乱:到底该学什么?到底该先做什么?

计算机和互联网本身就是一个非常广的领域,里面有太多东西都很有意思:算法、Qt、Web3、密码学、前端、UI/UX 设计、后端、数据库、运维部署、音视频编解码、LLM、AI、机器学习……几乎每个方向展开之后,都能形成一套庞大的知识体系。

尤其是 Computer Science 这种学科,它和软件工程、区块链技术、AI之类的细分专业不一样,本身就有一种“广而全”的属性。外界对这个领域的评价,也经常鼓励你最好什么都懂一点。某种程度上,这确实是对的。广泛了解不同方向,能帮助你建立更完整的技术地图,也能让你在遇到问题时更容易找到关联。

但在实际学习和做项目的过程中,这件事很容易带来另一种问题:FOMO,也就是害怕错过;更具体一点说,是 FOMO 之下的 Shiny Object Syndrome,总是被新的、有趣的、看起来很有价值的东西吸引过去。

计算机领域尤其容易触发这种状态。因为这个行业本身就一直在迭代:新的框架、新的工具、新的论文、新的项目、新的范式层出不穷。GitHub、Awesome List、技术博客、B 站、知乎、推特、Reddit,随便刷一刷,都可能看到一个让你觉得“这个我也得学一下”的东西。

于是资源囤积癖、完美主义焦虑、开坑冲动,就很容易发生。

新坑太多,会压垮旧坑

开太多新坑最大的问题,不只是“学不过来”,而是它会让你长期处在一种半成品状态。

尤其是对于刚入门的人来说,这个问题会更明显。比如很多大一新生会发自己的博客,或者自己做的网站,有的人甚至已经部署上线了。看起来很酷,也确实很有成就感。

但如果你真的从一个网页开始,一路做到部署上线,就会发现中间有太多东西要处理:前端页面、后端接口、文件读写、数据库、登录注册、权限管理、部署环境、域名、HTTPS、异常处理、日志、性能优化、数据备份……

这些东西每一个单独展开,都不是一两句话能搞定的。

尤其是在 AI 很好用的今天,做出一个 demo 变得非常容易。你可能花两个小时,让 AI 帮你写代码、改 bug、跑起来一个小项目。这个过程非常爽,很投入,也很有成就感。你会觉得:我做出了一个属于自己的东西。

但问题是,demo 跑起来不代表你真的掌握了它。

很多时候,一个两小时做出来的 demo,背后可能欠下了二十小时甚至更多的技术债。

比如:

  • 登录注册怎么做?
  • 密码怎么安全存储?
  • 用户数据怎么设计?
  • 数据库表怎么拆?
  • API 怎么设计?
  • 前后端怎么通信?
  • 错误状态怎么处理?
  • 文件上传怎么做?
  • 权限系统怎么写?
  • Token 怎么刷新?
  • 支付 SDK 怎么接?
  • 数据可视化怎么做?
  • 日志怎么收集?
  • 项目怎么部署?
  • 环境变量怎么管理?
  • 线上报错怎么排查?
  • 数据怎么备份?
  • 代码结构怎么整理?
  • 后续功能怎么扩展?

这些才是真正的学习成本。

所以这里会出现一个 mismatch:你投入了两个小时,体验到了做项目的快乐;但你其实打开了一个需要二十小时、五十小时,甚至更久才能真正填完的坑。

我的几个解决思路

我目前想到的解法,不是完全不接触新东西,而是要更有意识地控制开坑方式。

第一,不要一上来就依赖最强的 AI Agent

尤其是新手,最好不要完全把项目交给 AI Agent 自动生成。哪怕代码是 AI 写的,文件最好也要自己建,结构最好也要自己看,内容最好也要自己复制进去、跑一遍、改一遍。

这样做看起来慢,但它能让你知道项目里到底有哪些文件,每个文件大概负责什么,代码是怎么连接起来的。

如果完全让 Agent 一键生成,你可能短时间内得到了一个能跑的项目,但你对它的理解会非常浅。后面一旦报错,或者想改一个功能,就很容易陷入“项目是我的,但代码不是我的”的状态。

第二,把大项目拆成一个个小 demo

你可以有一个大项目。这个大项目可以来自你的某个真实需求,比如一个能提高自己生产力的软件系统,一个自己的博客系统,一个 AI 工具,一个知识管理应用,或者一个自动化工作流。

但大项目本身一定是复杂的。如果直接硬啃,很容易被前端、后端、数据库、部署、AI 接口、用户系统、支付系统这些东西一起淹没。

更好的方法是:把大项目拆成一个个单独的小 demo。

比如你要做一个知识管理系统,那可以拆成:

  • Markdown 渲染 demo
  • 代码高亮 demo
  • 本地文件读取 demo
  • 标签系统 demo
  • 搜索功能 demo
  • 登录注册 demo
  • 用户数据存储 demo
  • 数据库 CRUD demo
  • 图片上传 demo
  • 数据可视化 demo
  • 部署 demo

仅仅是 Markdown 渲染这一块,就可以拆出很多东西:标题、列表、代码块、表格、链接、图片、数学公式、目录生成、样式覆盖。这里面随便展开一下,就够学好几个小时。

再比如做 AI 应用,也可以拆成:

  • 调用 LLM 的基础 demo
  • 流式输出 demo
  • JSON Output demo
  • Function Calling / Tool Calling demo
  • 多轮 messages 管理 demo
  • Prompt 模板 demo
  • 用户输入清洗 demo
  • 结果解析 demo
  • 错误重试 demo
  • API Key 管理 demo
  • Token 统计 demo
  • 多模型切换 demo
  • 对话历史存储 demo

你的大项目里可能有好几个 JSON Output,可能都是 AI 帮你一次性写好的。但真正学习的时候,完全可以把它们拆开,每个功能单独写一个 demo。这样会清晰很多,也更容易真正吃透。

第三,切断新坑的信息源

很多新坑不是你主动找来的,而是信息流推给你的。

B 站、知乎、抖音、推特、Reddit、GitHub Trending、Awesome List、技术博客、书单、课程推荐、大佬的个人网站……这些东西确实很有价值,也确实很有意思。

但问题是,当你无意识地刷到它们时,它们很容易把你的注意力从旧坑里拉走。

你本来打算今天补一下 Chat Completions API,结果刷到一个很酷的 Web3 项目;刚想继续学数据库,又看到有人推荐一本编译原理神书;准备写前端,又看到一个很炫的 UI 框架;想做 AI 应用,又刷到一个 Agent 项目。

每个东西看起来都值得学,但你真正能投入的时间和注意力是有限的。

所以我觉得,对于新手来说,控制信息源很重要。不是说永远不看,而是不要让它们在你还没填完旧坑的时候,不断把新的坑推到你面前。

可以先把新东西记到一个列表里,但不要立刻跳进去。比如开一个“以后可能学”的文档,把感兴趣的项目、文章、方向都放进去。这样既不会完全丢掉兴趣,也不会马上打断当前主线。

不是不学新东西,而是要有主线

我并不是说计算机学习不能广泛涉猎。恰恰相反,计算机领域本来就需要一定的横向理解。很多知识之间是相互连接的,你懂得越多,越容易形成体系。

但问题在于:广泛涉猎不能替代深度完成。

如果一个人永远在开新坑,永远在看新项目,永远在收藏资源,永远在被新的概念吸引,却很少真正把一个东西从头到尾做完,那他的知识体系就会变得很碎。

真正有效的学习,可能不是“我知道很多方向”,而是:

我有一个主线项目。 我知道自己当前最应该补哪一块。 我允许自己了解新东西,但不让它随便打断主线。 我把大项目拆成小 demo,一个个填坑。 我不是靠收藏资源获得安全感,而是靠完成具体任务获得真实进步。

最近查了一些国外社区的讨论,发现类似的问题在计算机学习者里面其实很常见。很多新手都会陷入 tutorial hell、resource hoarding、shiny object syndrome 这些状态。也许中文技术社区里也有很多相关讨论,只是我之前关注得少。


总之,对我来说,现阶段最重要的不是再开更多新坑,而是先把已经开的坑填起来。

新东西当然可以看,也可以记下来。 但主线不能丢。

完成比收藏重要,填坑比开坑重要。


收录于知乎专栏「学习方法与底层原理」· 查看知乎原文