一、写在前面:为什么有这个文档&适合谁

为什么有这个文档?

我其实一直很想重学一下CS。

我相信只会vibe coding,一定会有很大的瓶颈。我也见到了我身边的开发用的Codex、ClaudeCode和我用的非常不一样。

我试图去学习,去找了一些大家转码的经验贴,也去看了一些付费课程,但这往往有以下特征:

  • 科班向的推荐:非常多、非常扎实的资源推荐,学下来至少上千小时,而且里面很多细节其实AI时代不需要掌握了
  • 求职导向:很多八股、面经,快速转开发,偏“应试”导向,而这里面有些上千块的AI开发教程,我去看了看目录,讲 AI IDE、Coding Agent、Supabase 部署,最多加点 web 三件套。这些我基本也都会,依然不本质。

所以我一直在想:

  • Vibe Coding时代,大家该掌握的CS知识到底是哪些?又要怎么学习?
  • AI时代刚开始学计算机的大一新生/其他专业转码的学生又该如何入门?
  • 哪些知识是AI时代,人一定要会的?怎么能更好的知道AI的边界、更好的应用AI?怎么能抓到20/80定律中,计算机领域中那最关键的20%内容?

这个文档是怎么来的?

这件事我思考了很久,也去看了一些大家的经验贴,也问了身边的一些程序员朋友建议,但一般也偏零散不系统。

于是这个周末,我找到了北大的一份很有名的CS学习规划项目(csdiy.wiki),尝试拉身边的程序员V一起划个重点。

V 是 NOI 竞赛出身、北大图灵班本科,从小学开始写过十多年代码,研究生在做编译器,实习做过大模型算法,算是工程和算法都比较懂,并且比较早就用AI辅助编程,知道AI的边界在哪。

他划的重点我感觉也很有个人审美,加上我也只是划了重点还没仔细学,所以可能缺少一些细节。只是给大家分享这个重点,仅供参考,后续学习资料,争取每个模块学完都有点学习笔记。

本次是软件工程开发相关,所以数学和算法等只是简略带过了,这个也之后说。

以下为我和V对着CSDIY项目为主体,个别去看了一些课程/教材目录划出来的重点。

一页总结版如下(是边聊边记的、人写的总结版),懒得看全文的可以保存:

这个文档适合谁?

如果你:

  • VibeCoding遇到瓶颈,希望学习更多技术知识,知道AI的上限是什么、AI具体在做什么
  • 希望在自己工种里成为偏技术的存在(如懂技术的产品、运营,而非直接转开发)
  • 是CS专业的大学新生,希望知道AI时代的专业课哪些是重点

那么你可以看下去。

这依然是一份自学攻略,我相信对于目标人群来说,需要的教程,应该是:

  • 相对轻量化的:因为目标是更好的驾驭AI,知道AI的边界,边界外哪些事不能做、边界内怎么更好指挥
  • 螺旋式的:AI可以帮我们更快做project,我们要想的是怎么在project学习,一个project里怎么和AI分工,项目中学习,而不是死磕概念

前排提醒术语较多,且基于AI Coding的能力来说,所以如果你没有用过vibe coding,对AI没什么了解建议先看我的另一份教程:

另外补充我的基础给大家做参考:

我本科就是数据科学专业,算计算机大类。但当时确定不走技术岗,课上学的只为应付考试:编程语言写过几个学生作业,数据库、操作系统、计算机网络全靠期末抱佛脚,概念之间毫无体系。信息论、图论、离散数学完全没碰过,微积分线性代数也只到应试水平。机器学习知道一些概念,但只会调包,原理一概不熟。

上学期间对软件工程没有实感,写的都是 jupyter notebook 里的小脚本,没想过当程序员。

我后来做了一年半的产品经理实习,对一个应用的上线有哪些工作有了实感,和UI/UX、前端、后端、算法、测试等工种都有一定接触了解;同时vibecoding写过几个自己能用的小服务,和能有部署的、有数据库的网页,但多一点就觉得吃力了;再后来打黑客松&后续进一步做项目,跟更专业的技术组队时,发现自己的技术术语和边界认知明显不够。

二、划重点:要学什么&怎么学?

《提问的智慧》

这是Github一个经典博客文章,V认为这是第一步,对于程序员如何思考问题。强烈推荐所有想和程序员交流、想转技术的人都先看看。

它教你怎么在开源社区、技术论坛上正确地提问——怎么描述问题、怎么给上下文、怎么展现你已经做过的尝试。看完它的收益是:你以后向 AI 提问、向人提问,都会更有章法。

环境、工具与命令行

这部分以MIT的项目 Missing Semester 为主,拓展《命令行的艺术》。

需要掌握的内容有

Git & Version Control

  • 学什么: 分支、合并(merge/rebase)、推送、版本回退。
  • 学到什么程度: 能在终端里独立创建分支、合并代码、解决冲突、推送到远程。不是"AI 帮我配好了我会点按钮",而是你知道每一步在干什么。

SSH

  • 学什么: 公钥/私钥的原理,怎么在终端连接远程服务器。
  • 学到什么程度: 能在终端里独立连上一台 Linux 服务器,知道公钥存在哪、私钥存在哪、连接过程中发生了什么。没有 AI人也能连。

Tmux

  • 学什么: 终端复用器,解决"网络断了/终端关了,服务器上的进程就消失了"的问题。
  • 学到什么程度: 能在服务器上跑一个进程,用 Ctrl+b 然后 d detach,关掉终端,重新连上服务器,attach 回去,进程还在。理解 session、pane、window 的基本概念。

Shell 命令行

  • 学什么: Linux/Unix 哲学的核心,知道每个工具只做一件事,用管道(pipe)连接起来完成复杂任务。
  • 学到什么程度: 能读懂 Missing Semester 的 shell 教程,知道 shell 可以编程。能独立写出类似 ls | grep epub | wc -l 这种过滤+统计的命令链,知道 grep、awk、sed 是干嘛的。

Vim

  • 学什么: 终端里的文本编辑器,服务器上没有 VS Code 时的兜底方案。
  • 学到什么程度: 知道 i 进入输入模式、esc 退出输入模式、:wq 保存并退出、:q! 强制退出。主要是这几个指令,不需要成为 Vim 高手,但要知道怎么进去、怎么出来、怎么改个文件。
Missing Semeter的目录

Make

  • 学什么: 定义依赖关系,让计算机按顺序完成一系列步骤。它不一定是用来编译的,它本质上是"我要做 X,X 依赖 Y 和 Z,Y 又依赖 A..."这种依赖图的自动化执行。
  • 学到什么程度: 简单学学,知道 Makefile 是干嘛的,能读懂一个简单的 Makefile,知道 target、dependency、command 三个部分的关系。不需要自己写复杂的 Makefile。

Docker

  • 学什么: 容器化技术。理解镜像(image,一整个 Linux 环境的定义)和容器(container,跑起来的实例)的区别。容器里的程序默认看不到镜像以外的任何东西,除非你主动 mount 进去。
  • 学到什么程度(初级): 能跑起一个容器,在容器里面写一个文件,知道怎么进入容器、怎么退出。
  • 学到什么程度(进阶): 能打包一个镜像出来,理解 Dockerfile 的基本指令。

环境配置

  • 学什么: AI 时代环境配置没那么痛苦了,但不是不存在。
  • 学到什么程度: 当 AI 帮你配环境的时候,看一看它的 CoT(思维链),通过 CoT 来学习,能看懂 AI 在做什么就行。
CSDIY项目的说明

编程语言

学什么: 这里大学基础课会有C、C++、Python、Java等语言,这部分是知道所有编程语言都有的概念,例如数组、循环、判断、函数。至少得读懂这些语法。

额外知道几个区别:

  • Python 是解释性语言,所以它慢。它先把代码变成字节码,再用解释器一条一条执行,没有直接变成机器码。C/C++ 是直接编译成机器码的。
  • 面向对象编程的知识(类、继承、多态),知道概念就行。V 表示他不太喜欢那一套,但确实是经典基础。

学到什么程度: 不用重新学,随便复习一下就好。能读懂常见语法,知道不同语言大概在什么场景下用(比如你要用的库只有 Python 版,你就用 Python)。

菜鸟编程这个网站学语言时可以看看

数据结构与算法

所有代码人一定绕不过去的部分,但不应试的话,我们的目标不是手撕 LeetCode 难题。

V推荐的学习方法是每个概念找leetcode题大概看看,AI 写完你"抄一遍",至少看懂 AI 在写什么,知道关键步骤。不转开发导向的话,知道概念就行,难度的话basic即可。当然如果想面试转行的话需要自己刷、上点难度。

具体需要哪些概念如下

数学基础部分

  • 模运算:知道基本运算法则,比如 (a * b) % 9 = ((a % 9) * (b % 9)) % 9
  • 时间复杂度、空间复杂度:必须学会,知道哪些是 O(n)、哪些是 O(n²)、哪些是 O(n log n)
  • 摊还分析:了解一下这个概念(有些操作单次很贵,但平均下来很便宜)

扫一眼就能过的

  • 表、栈、队列、优先队列:知道有这些东西,大概是啥,不用会写
  • 算法设计思路(贪婪、分治、动态规划等):思路重要,具体题不一定重要

重点

  • 树:二叉树、平衡树。最关键要知道——深度和节点数之间的关系是 log。比如 1000 个节点,深度大概是 10;100 万个节点,深度大概是 20。这是核心。
  • 红黑树:知道有这个名字就行,知道它是个自平衡二叉搜索树,细节不用管。
  • 散列(哈希表):重点!很重要。知道哈希函数、冲突解决、为什么查询是 O(1)。
  • 排序:重点看。插入排序、归并排序、快速排序都要看,知道它们的时间复杂度和基本思想。冒泡排序一般。
  • 不相交集(并查集):知道无向图、连通性。核心操作就是:插一条边,判断两个点是否连通。知道这个操作速度非常快(近似 O(1))就行。
leetcode

软件工程

这部分V会觉得他现在也不知道还有哪些值得学的。因为过往的软件工程经验在失效,旧的课和教材都旧了,新的还没有共识。

如果不亲自当开发写大型项目,V认为这部分就当词典查,知道概念就行,部分概念如下

  • 黑盒测试 / 白盒测试:黑盒就是你不知道里面在干嘛,只测输入输出;白盒就是你要看代码内部逻辑来测试
  • Unit Testing:一次只测一个小功能(一个函数、一个模块)
  • CI/CD:每提交一次代码,自动跑一段测试/自动部署
  • A/B Testing:同时上线两个版本,看哪个效果更好
  • Infrastructure as Code:不是手装软件,而是写配置文件告诉服务器该装什么

学到什么程度: 当词典查,听到这些词知道别人在讲什么。要做项目的话,项目中再理解。让专门的开发去搞。

CSDIY的说明

体系结构、操作系统、系统

这部分看教学材料都感觉特别复杂深奥。V 只划了很宽松的重点,核心是会用 GDB 指令来学习。

体系结构

广告媒流(小程序)-小红书
  • 学什么:
  • 计算机是怎么运行的。CPU 只有少量寄存器(工作记忆),每条指令只做一件事,要么改一个寄存器的值,要么改一块内存的值。程序就是一条条这种基本指令拼凑出来的。编译器的作用就是把高级语言翻译成这些基本指令。
  • 边界意识: 体系结构要知道什么是计算机能写的、什么是不能写的。比如你想写个程序让电脑去给一盆花浇水——前提是你得有一根线从电脑连到机械臂上。计算机本身不能"长出手来"浇花,它只能通过已连接的硬件来控制物理世界。
  • 学到什么程度: 写一个简单程序,用 GDB 逐行执行,看懂每一条指令在改哪个寄存器、哪块内存。理解"每条指令只做一件事"这个核心思想。

操作系统

  • 学什么:
  • 进程、线程、内存:一个进程有一块内存,里面可以有很多线程。线程共享同一块内存,你在一个线程写东西,另一个线程迟早会看到。但每个线程有自己的寄存器,看不到别的线程的寄存器。
  • 二进制、电路设计、汇编语言:大概知道基本概念
  • 文件系统、IO 设备、死锁:这些知道在干啥就行
  • 学到什么程度: 理解进程、线程、内存的关系就行。其他的翻翻教科书,知道概念。用 GDB 跑起来看里面发生了什么,比纯看书有用。

并行与分布式系统

  • 学什么:
  • Raft:分布式共识算法。核心要求是——至少一半以上的服务器在线,系统才能正常工作。比如三个服务器,至少要两个在线,否则系统不可用。
  • 并发编程相关概念:deadlock(死锁)、各种 lock(锁)、multithread(多线程)、context switch(上下文切换)
  • 学到什么程度: 知道 Raft 的"过半存活"原则,知道并发编程里有哪些经典问题。不需要自己实现一个分布式系统。

编译原理

  • 学什么:
  • 上下文无关语法:最核心的概念。知道什么是"上下文无关"——就是你可以挑出其中一小段,只要这段本身符合语法规则,它外面的东西不受影响。比如 HTML 标签,你把一个 div 改成 span,周围的东西不用改,它还是合法的。
  • 学到什么程度: 知道编译器是把高级语言翻译成机器码的,知道"上下文无关语法"是什么意思。不需要自己写编译器。

V 的建议: 体系结构和操作系统这两块,写点代码然后用 GDB 跟 AI 一起学,看里面发生了什么。AI 不一定能直接操作 GDB,你操作完截图问它就行。

gdb指令

计算机网络

  • 学什么: 了解现在的网络结构,以及各个协议的通信方式。
  • 核心概念
  • TCP vs UDP:TCP 是可靠的(有重传机制),UDP 是快速的(不保证送达)
  • 丢包率、延迟、带宽:这三个指标要知道是什么,怎么影响网络体验
  • IPv4、IPv6:知道有这两个版本,IPv6 地址更长
  • 端口号:知道是什么(同一个 IP 上不同服务的区分方式)
  • 局域网地址:知道 10.x.x.x 和 192.168.x.x 是经典的局域网地址段
  • 学习方法:装一个 Wireshark,抓包看看里面发生了什么。发过去一个请求,它就是一个包,而且这个包可能只有 1000 多字节,每个包都可能会丢。程序要设计得即使丢包了也不该直接出问题。
  • 学到什么程度:用 TCP 写一个小聊天程序,能和另一台机器(或同一台机器的另一个端口)建立连接、互相发消息。能通就算过关。
实操用wireshark看看

数据库系统

  • 学什么:
  • 增删改查(CRUD):基本功
  • 索引:知道能干啥,为什么有索引查询就快(从 O(n) 变成 O(log n) 或 O(1))
  • 排序(ORDER BY):知道怎么排,多列排序是什么意思(第一列相等看第二列)
  • Group By:分组聚合
  • 求和等聚合函数
  • 学到什么程度: 能用 SQLite 写点小练习,知道增删改查、索引、排序、分组这些操作在底层大概是怎么执行的。不需要深入数据库引擎的实现。

Web 开发

V偏后端,这个他也不太熟了,但核心东西就这些

  • 学什么:
  • 三件套:CSS / HTML / JS,知道各自负责什么(结构、样式、交互)
  • 一个前端框架:React(生态大、复杂)或 Vue(简单一点)
  • 学到什么程度: 知道这些里面有什么东西就行。AI 时代不需要自己从零手写,但要能看懂框架生成的代码,知道组件、状态、路由这些基本概念。

十、数学相关

这部分对偏工程的朋友其实可以跳过,但希望和各种算法打交道的、尤其是CS科班的还是得学,依然划了个重点。

微积分

  • 学什么:微分(尤其重要)、积分
  • 学到什么程度: 知道导数是什么意思(变化率)、积分是什么意思(累积)。能算基本的求导和积分(比如 x³ 的积分是 1/4 x⁴)。不需要背一大堆凑微分、换元的技巧。

线性代数

这里我学得还行就没划太多重点。可以找3B1B的视频看看,理解下线性变换

信息论

  • 学什么
  • 编码、压缩、通信
  • 信息熵:公式要记住,H(X) = -Σ p(x) log p(x),衡量信息量的大小
  • 学到什么程度: 只需要有概念就行,不需要算。找点科普看看,或者跟 AI 聊聊:"我是个 80 岁好学的人,你给我介绍一下什么是信息论。" 知道信息熵、编码、压缩这些词大概在说什么。

图论

  • 学什么:无向图、有向图("向"是方向的向)、连通性、最短路、树、环
  • 学到什么程度: 知道这些概念,能看懂算法题里的图论描述。不需要手写最短路算法。

密码学

  • 学什么
  • 对称加密解密:一把钥匙锁和开(AES 等)
  • 非对称的公钥私钥:公钥加密、私钥解密,和 SSH 的密钥对是一个道理(RSA 等)
  • 签名 / 验证签名:证明这个文件确实是我发的
  • 密钥交换:双方怎么安全地协商出一个共同密钥(DH 等)
  • 密码学的哈希函数:SHA256,要知道它是干什么的(防篡改、唯一标识)
  • 学到什么程度: 知道这些概念分别解决什么问题,知道公钥私钥和对称加密的区别。不需要自己实现加密算法。

信号与系统

  • 傅立叶变换:知道基本概念就行——任何信号都可以拆解成不同频率的正弦波的叠加

图形学

  • 学什么
  • 三角形:渲染的最低单位。游戏里的球,其实是一堆三角形拼出来的。三角形越多,渲染越复杂,游戏就越卡。
  • 投影:3D → 2D 的转换
  • 学到什么程度: 知道渲染的基本单位是三角形,知道投影是什么。不需要写渲染引擎。

三、写在最后

以上不是教程,只是个学习目录,仅供参考。

我的计划是按这个目录,每个模块去找科普视频、教学博客或者教材的对应章节,把划重点的部分看了。看不懂的地方问 AI,跟 AI 一起读代码、看解释。中间混一点点练习,比如GDB 跑一遍、Docker 起个容器、TCP 写个聊天程序,不需要多,够理解概念就行。还是计划从项目中学习。

粗略估算,全部过一遍应该不会超过 100 小时。但这是螺旋式的:第一遍肯定不可能完全理解,很多概念要到具体项目里才会真的懂。后续做 project 遇到问题时,再回来补对应的部分。

如果是计算机科班、希望转行的,对这些概念的理念+实践项目,应该是一年所有的时间深入学习。

这些补到最后,目的不是变成专业开发,而是能做更多 project、能读代码、能在实践中继续学。V 说学完至少能知道什么是计算机能做到的、什么是不能做到的,知道 AI 的边界在哪里,不至于 vibe coding 的时候完全失控,跟技术团队沟通时也能听懂他们在说什么。

我后续争取每个模块学完都补点学习笔记。如果有同样在学习的朋友,欢迎交流 benchmark 和踩坑经验。

其他参考链接:

https://bugstack.cn/md/road-map/road-map.html

https://www.programmercarl.com/

https://csdiy.wiki/

https://www.douban.com/group/topic/316068246

https://www.douban.com/group/topic/303221274