跳到正文

目录

Coding Interview University:软件工程师求职学习指南

核心判断

Coding Interview University(下文简称 CIU)是一份"按顺序点到底"的面试自学清单,不是教程。它把软件工程师面试要考的知识整理成一份 Markdown 任务清单,每一项都配了书、视频或练习,读者照着勾选进度,从零补齐到能应付大厂面试。知识点讲解全靠外链——YouTube 视频、Coursera 课程、书籍章节——清单本身只负责排顺序和标进度。

作者 jwasham(John Washam)非科班出身,本来是 Web 开发者,为 Google 软件工程师面试做准备时,把要学的东西列成待办清单,清单越滚越大,2016 年 6 月整理成了这份仓库。他按这份计划每天学 8-12 小时、持续 8 个月,最终入职 Amazon 的软件开发工程师岗位(SDE)。他在 README 开头就提醒:你多半不用学那么多,他自己浪费了不少时间在不必要的内容上,清单的目的就是帮你省掉这些弯路。

截至 2026 年 9 月,仓库在 GitHub 上约 36.1 万 Stars、8.5 万 Forks,协议 CC-BY-SA-4.0。main 分支最近一次提交在 2024 年 12 月,之后进入低频维护——内容已经稳定,但个别外链和课程需要自己确认有效性。清单有 16 种语言的完整翻译,简体和繁体中文版都在其中,中文读者可以直接用中文版打卡。

总览:一份清单,四条线

CIU 的 README 表面上是一个文件,实际装着几条不同的线,先别混在一起:

层装的是什么读者把它当什么
使用说明怎么用清单、选哪门语言、读哪些书、怎么抽认卡使用手册
主题清单数据结构、算法、图、动态规划等要考的知识点条目检查清单
求职准备简历、投递、面试流程、向面试官提问临门一脚
可选扩展系统设计、编译器、密码学等延伸主题加餐

“分隔线以下全部可选"是 README 自己标出来的边界:主清单到"最终复习"为止,之后的系统设计(作者标注适合 4 年以上经验)、编译器、Unix 命令行、密码学、Bloom Filter 等几十个条目,属于把人从"能过面试"往"更全面的工程师"再推一步的内容,时间紧可以先跳过。

三条主线各管一件事:知识条目管"铺开广度”,抽认卡和复习管"对抗遗忘",求职动作管"最终目标"。最常见的坑是把"勾完一遍清单"当成"已经学会"——作者自己就是这么栽的,后文细说。

怎么用:fork 一份,按顺序勾

用法本质上就是"勾选进度"。清单依赖 GitHub 的 Markdown 任务列表,[x] 表示完成:

  • 熟悉 git 的人:fork 仓库、建分支,把 [ ] 改成 [x] 后提交,个人进度独立于上游。README 特意给了一条命令 git remote set-url --push upstream DISABLE,防止手滑把个人进度推回原仓库。
  • 不熟悉 git 的人:点 Code 按钮下载 ZIP,在支持 Markdown 的编辑器里勾选。

清单按顺序从上往下排,作者明确要求"按顺序处理",不建议跳跃。前置要求只有三条:会一点编程(变量、循环、函数)、耐心、时间。

这份清单能坚持下来的关键不在内容多,而在"拆得够细"。单是数组一个主题,实现清单就列了十几个方法——size()、push()、insert()、delete(),连"容量满时扩容一倍、元素剩四分之一时减半"这种细节都有对应的勾选格。每完成一格就有正向反馈,进度可见,也更容易长期跟下去。保住节奏比某几天突击更重要。

主题清单:顺序背后的逻辑

选好语言后,主题清单按这个顺序展开:

  • 算法复杂度:Big-O、渐近分析,是一切的基础。
  • 数据结构:数组、链表、栈、队列、哈希表。
  • 更多知识:二分查找、位运算。
  • 树:二叉树、BST、堆、平衡树,遍历(前序/中序/后序/BFS/DFS)。
  • 排序:选择、插入、堆排序、快排、归并。
  • 图:有向/无向、邻接矩阵/邻接表、BFS、DFS。
  • 再加更多:递归、动态规划、设计模式、组合与概率、NP 问题、缓存、进程与线程、测试、字符串、Trie、浮点数、Unicode、字节序、网络等。
  • 最终复习:回到开头把所有主题快过一遍。

这个顺序有讲究。Big-O 先行,是因为它是"衡量一切"的尺子——后面每个数据结构都要拿它算时间与空间开销;图、DP、递归这些难点,又都建立在前面相对简单的基础之上。清单里每个知识点都跟着同一套动作:看视频或书、用自己选的语言实现一遍、勾掉格子。作者专门写了练习代码仓库(C、C++、Python 各一个),卡住的时候可以对照,但他的要求是"理解到能自己写出来",不是背模板。

最终复习不是重复学习,而是一批 2-5 分钟的短视频:一组 23 个快速回顾视频,加上 Michael Sambol 的 48 个数据结构短视频(配套 msambol/dsa 代码示例),适合在面试前几天集中刷。

三个教训:作者踩过的坑

README 里最有价值的部分,不是知识清单,而是"Don’t Make My Mistakes"一节——作者把 8 个月里最贵的三个教训写在前面。

教训一:记不住,就做抽认卡

作者看了几十个小时视频、记了大量笔记,几个月后发现大半都忘了,又花了 3 天把笔记改成抽认卡重学一遍。他的结论:光"看过"不算数,得靠间隔重复把知识固定下来。

他做了一个开源的抽认卡站点,并放出了自己的两套卡片库:普通版 1200 张、extreme 版 1800 张。但他在 README 里明确不推荐直接用——这批卡覆盖面失控了,从汇编语言、Python 冷知识一路排到机器学习和统计,远超面试所需。更实际的路径是用 Anki(iOS 版 25 美元,其他平台免费)导入社区转换好的 Anki 卡组,挑跟自己目标匹配的部分。

使用上有一条重要提醒:第一次答对不要标记"已掌握",同一张卡要多次答对才算真的记住。这条规则对抗的正是"看答案眼熟"造成的假掌握。

教训二:边学边做题,不是学完再刷

“THIS IS VERY IMPORTANT”——README 用全大写强调这条:从学习的第一周就开始做面试题。

节奏是作者给的:学完一个主题(比如链表),马上打开面试书或刷题站做 2-3 道链表题;然后进入下一个主题;过一阵子回来再做 2-3 道链表题。每个主题都这么循环。“你不是靠知识被录用,而是靠运用知识”——只勾清单不返工,会被题目暴露;只刷题不铺知识,会在不熟悉的主题上卡住。

做题方式也要刻意:在白板或纸上写代码,不是在电脑上。写完先用几个样例输入手动过一遍,再敲进电脑验证。作者家里没有白板,就去美术用品店买了块大画板坐在沙发上练——他管这叫"沙发白板",并且建议用铅笔,因为用钢笔写到一半就会想擦。面试官要看的是你一边写代码一边讲思路,这种临场表达只有提前这么练才出得来。

教训三:专注

清单越长,越容易被无关内容吸引。作者的建议朴素到近乎无聊:戴上耳机放没有歌词的音乐,把注意力保住。8 个月里他花时间学的相当一部分东西最后没考——他不想你再交一遍这个学费。

资源配置:书、题、视频

清单本身不讲课,讲课的是它链接到的资源。这几类配置值得提前知道:

打底书按语言选一本。 Python 配《Coding Interview Patterns》(作者主推),C 配 Sedgewick 的《Algorithms in C》,Java 和 C++ 各有两个选择(Goodrich/Tamassia 或 Sedgewick & Wayne,后者有作者本人讲授的 Coursera 免费课)。C 的角色特殊:指针和内存管理在高阶语言里是看不见的,用 C 实现一遍数据结构,才能"在骨头里感受到"它怎么工作——但作者也说了,C 不用学太深,能舒服地读写就够。

面试书三本递进。 《Programming Interviews Exposed》(第 4 版)当热身,《Cracking the Coding Interview》(第 6 版)当主力,时间充裕再做《Elements of Programming Interviews》(有 C++、Python、Java 三个版本)。

刷题站按需选。 作者最推 LeetCode,并且算过账:备考期 1-2 个月,订阅费是值得的。HackerRank、TopCoder、Codeforces、Codility、GeeksforGeeks 都是备选;Project Euler 偏数学,不适合面试练手。看别人讲题也有现成资源:Nick White 的 187 个 LeetCode 解答视频、IDeserve 的 88 个算法视频,都在清单里。

一个现实约束:部分链接指向 Coursera 或 EdX 的 MOOC,课程不在开课期时要等上几个月。作者自己也希望逐步把这些替换成随时可看的公开视频,现阶段遇到开课等待期,先用 YouTube 上的大学公开课顶上是可行的。

求职准备:清单的最后一程

主清单走完不等于结束,“Getting the Job"一节接着处理面试本身:

  • 简历:按《Cracking the Coding Interview》作者 Gayle McDowell 的简历指南和 Tech Interview Handbook 的逐页教程改,重点是一页纸、写清楚影响而不是职责。
  • 行为面试:README 提醒读者预备约 20 个这类问题(清单给出十几个示例:最难的问题、最大的挑战、最难的 Bug、学到了什么),每个至少准备一个回答,并且准备成故事——“人人都喜欢听故事”,只摆数据不行。
  • 问面试官的问题:团队规模、开发流程、加班节奏、技术选型怎么做——README 给了一份现成清单,面试尾声拿出来问,既是机会也是信号。
  • 模拟面试:Pramp(同行互练)、interviewing.io(匿名匹配资深工程师)、Gainlo 等服务都在清单里——Gainlo 那条作者自述用过,帮他放松了电话面试和现场面试。白板上的临场表达,靠模拟面试磨比靠背题快。

拿到 offer 之后那节只有几句话:恭喜,继续学习,别停下来。清单管送你进门,进门之后的路另算。

边界:它不覆盖什么

CIU 是软件工程师面试清单,不是前端或全栈路线图。作者在 README 开头就划清:JavaScript、HTML/CSS、SQL 这些主流技术明确不在计划内,前端方向直接去 roadmap.sh。它覆盖的深度约为大学 CS 课程的 75%——够面试用,不是完整 CS 教育;想补全的话,作者把完整自学路线也交给了 roadmap.sh 的计算机科学路线图。系统设计相关放在可选区,标注适合 4 年以上经验的候选人。

采用建议

  • 非科班、想进大厂当软件工程师:最贴合。按顺序勾选,每天 2-4 小时、持续数月,配合"边学边做题"的节奏,比盲目刷题更系统。
  • 已有 CS 基础、想自查:把清单当查漏补缺工具,跳过已掌握的主题,重点做最终复习。
  • 前端 / 全栈方向:不适合,改看 roadmap.sh 的对应路线。
  • 中文读者:直接用仓库里的简体中文版清单,内容与英文版同步勾选。
  • 维护状态:main 分支自 2024 年 12 月后没有新提交。书单和视频大多是经典资源,主体内容仍可用,但动手前把打算跟的外链过一遍,失效的自己找替代。

常见问题

Q:刷够多少题才算准备好? A:CIU 没有给固定题数,重心在"按主题补知识 + 反复练习”。更稳的做法是覆盖所有主题、每类题做熟并完成复习,而不是追求总数。

Q:需要先学 C 吗? A:不必。作者用 C 是为了贴近底层,你也可以用 Python 或 Java 一门语言全程走完。关键是理解数据结构,而不是绑定语言。

Q:系统设计怎么准备? A:CIU 把它放在可选区,适合 4 年以上经验。规划时单独看 System Design 相关资源,不要占用主题清单的进度。

Q:仓库不更新了,清单还值得跟吗? A:值得,但要带着预期。这份清单的内容是数据结构与算法基础,十年内不会过期;风险集中在外链上——MOOC 开课周期、YouTube 视频下架、书籍版本更替。动手前把打算跟的资源逐个点开验一遍,失效的就搜资源名找官网或替代视频,比中途断链再回头找的成本低得多。

自测题

  1. CIU 和 LeetCode 这类刷题站在备考中各承担什么角色?只做其中一个,会缺什么?
  2. 作者为什么说第一次答对的抽认卡不要标记"已掌握"?这条规则在对抗什么?
  3. “边学边做题"的具体节奏是什么?如果一个人打算"先勾完清单再集中刷题”,风险在哪?
  4. 哪三类技术 CIU 明确不覆盖?前端方向应该去哪里找路线?
  5. fork 之后,哪条 git 命令能防止个人进度被推回上游仓库?

GitHub:jwasham/coding-interview-university。

参与讨论

使用 GitHub 登录。欢迎补充事实、异议与实践。