CS入门学生不要为自己开过多的新坑
最近学到一个很重要的教训:不要给自己同时开太多新坑。
我自己就是最近才发现,我经常会在浏览器里开着几十个标签页,各种 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 这些状态。也许中文技术社区里也有很多相关讨论,只是我之前关注得少。
总之,对我来说,现阶段最重要的不是再开更多新坑,而是先把已经开的坑填起来。
新东西当然可以看,也可以记下来。 但主线不能丢。
完成比收藏重要,填坑比开坑重要。
收录于知乎专栏「学习方法与底层原理」· 查看知乎原文