Tech Interview Handbook 技术解析:一份面向忙碌工程师的面试准备资料库与 Docusaurus 内容工程实践
Tech Interview Handbook 是一个免费、精编(curated)的技术面试准备资料仓库,其 README 明确了定位:为没有时间为数百道算法题逐一“刷”完的工程师提供最小必要知识,覆盖从投递、编码面试、行为面试到 Offer 谈判的全流程。本文以仓库根目录 README.md 为主体,结合仓库源码(Docusaurus 站点配置、pnpm monorepo 工程脚本、实验性算法实现与 Grind 75 边缘函数)说明这份资料库的内容组织方式、与同类面试仓库的差异,以及如何在本地运行其网站与子应用。
一、README 的核心定位:为谁解决什么问题
README 开篇直接回答了“这是什么”:这是作者(Blind 75 选题清单的原作者)面向忙碌工程师整理的免费面试准备材料,覆盖算法题之外的实战内容,并明确宣称已有超过一百万人从中受益(此为仓库自述口径)。README 中列出的核心内容清单如下,每一项都对应仓库 apps/website/contents/ 下的具体文档:
- 编码面试的最佳实践题目清单(Best practice questions),对应 coding-interview-study-plan.md;
- Grind 75——Blind 75 的下一代演进版本,题目更大更全(见下文“Grind 75 入口”一节);
- 编码面试的准备方法(How to prepare),对应 coding-interview-prep.md;
- 编码面试 Do's and Don'ts 速查表,对应 coding-interview-cheatsheet.md;
- 按主题分类的算法速查表与技巧,入口为 study-cheatsheet.md;
- 分步式的 Software Engineer 简历指南,对应 resume.md;
- 头部科技公司常问的行为面问题,对应 behavioral-interview-questions.md;
- 前端面试内容已迁移至独立站点(README 中说明为 Front End Interview Handbook,外链不在本文输出范围内)。
“Why would you read this”一节给出了两个关键设计原则:
- 实用性(practical):内容覆盖技术面试的所有阶段——从申请工作、通过面试到 Offer 谈判;即使技术上很强的候选人,也能从非技术内容中获益。
- 信息压缩(condensed):作者刻意控制篇幅,只讲“最小必要知识”(the minimum you need to know),把练习时间留给读者本人,因为“技术面试成功的关键是持续练习”。
“Who is this for”则明确目标读者:想进科技公司但没经历过技术面试的新人、很久没坐到面试官对面的资深工程师,以及任何想提升技术面试能力的人。
二、与同类面试仓库的差异:内容直接可读,而非链接聚合
README 的“How is this repository different”一节点出了本仓库的差异化主张:GitHub 上很多面试仓库(包括一些知名书籍的配套仓库)本质上只是外部资源的链接聚合,而本仓库提供的是直接可消费的精编内容;并且现有资源大多只覆盖算法题,缺少领域特定内容与非技术内容的覆盖,本手册则刻意覆盖典型算法编码题之外的内容。
这个主张在仓库结构中可以得到印证——仓库不是“一堆 Markdown 链接”,而是包含真实实现代码的内容工程。apps/website/experimental/utilities/ 目录下维护着两套算法工具的实现:
- JavaScript 版:binarySearch.js、mergeSort.js、intervalsMerge.js、graphTopoSort.js、matrixTranspose.js 等;
- Python 版:union_find.py、trie.py、quick_select.py、graph_dfs.py、heap.py 等。
这些可运行的参考实现与 apps/website/contents/algorithms/ 下按主题划分的速查表文档(array.md、linked-list.md、tree.md、dynamic-programming.md 等)相互印证,构成“文档 + 代码”的双层内容。
三、内容组织:侧边栏就是面试流程的阶段划分
README 的“Contents”一节说明:项目使用 Docusaurus 构建了独立网站以提供更好的阅读体验。具体到本仓库,阅读路径的组织逻辑集中在 sidebars.js 中,其分类顺序恰好对应一次技术面试的完整生命周期:
| 侧边栏分类 | 包含文档 | 对应面试阶段 |
|---|---|---|
| Introduction | software-engineering-interview-guide | 面试流程总览 |
| Getting an interview | resume | 投递与简历 |
| Coding interview preparation | coding-interview-prep、programming-languages-for-coding-interviews、coding-interview-study-plan、coding-interview-cheatsheet、coding-interview-techniques、mock-interviews、coding-interview-rubrics | 编码面试准备 |
| System design interview preparation | system-design | 系统设计 |
| Behavioral interview preparation | behavioral-interview、behavioral-interview-rubrics、behavioral-interview-questions、behavioral-interview-senior-candidates、self-introduction、final-questions | 行为面试 |
| Salary and offer negotiation preparation | understanding-compensation、negotiation、negotiation-rules、choosing-between-companies | 薪酬与 Offer 谈判 |
| Algorithms study cheatsheets | study-cheatsheet 及其下 Basics / Data structures / Advanced data structures / Additional 四个子分类,共 19 篇按主题划分的算法文档 | 算法刷题 |
| Beyond the interview | interview-formats-top-companies、landscape、engineering-levels、career-growth、interviewer-cheatsheet、best-coding-interview-courses、best-practice-questions | 面试之外的职业发展 |
这套侧边栏结构(见 sidebars.js)与 README 中“practical content that covers all phases of a technical interview”的表述一一对应:README 承诺的“全流程覆盖”,在工程上就落实为这八个内容分类。站点元信息则定义在 docusaurus.config.js 中,标题为 “Tech Interview Handbook”,tagline 为 “Free curated interview preparation materials for busy people”,导航栏入口包括 Start reading(/software-engineering-interview-guide/)、Coding、Algorithms、Blog 与 Grind 75 等(见 docusaurus.config.js)。
另外,仓库根目录下的 algorithms/README.md 只有一行“内容已迁移至网站”的说明并附有 TODO: Remove in future 注释,这印证了仓库的内容重心已从静态 Markdown 目录整体迁移到 Docusaurus 站点,阅读时以 apps/website/contents/ 下的文档为准。
四、Grind 75 入口:一个边缘函数做的域名重写
README 将 Grind 75 描述为“Blind 75 的下一个进化版本,更大更好”。在工程实现上,仓库内保留了 Grind 75 的访问入口:functions/grind75/[[catchall]].js 是一个边缘函数,其逻辑非常短——
const SOURCE_HOST = 'https://grind75.pages.dev';
export async function onRequest(context) {
const { request } = context;
const url = new URL(request.url);
// Rewrite to the new domain, preserving the original path and query string
const newURL = SOURCE_HOST + url.pathname + url.search;
return await fetch(newURL, request);
}
它保留原始请求的路径与查询串,将请求转发到独立部署的 Grind 75 站点。从源码结构看,Grind 75 的主体内容独立于本站部署,本仓库中的 catch-all 函数仅承担旧路径到新域名的兼容重写职责。
五、Monorepo 工程:本地如何运行这份手册
README 没有展开工程细节,但仓库当前是一个 pnpm monorepo,所有“运行手册网站”的操作都以 monorepo 为粒度进行。根目录 package.json 声明了两个 workspace 组(packages/* 与 apps/*),并用 vite-plus(vp)作为统一的脚本运行器:
- 工作区声明:package.json 的
workspaces字段; - 脚本定义:package.json——
build(对全部包并行执行 build)、ci(check + test + build)、clean(清理缓存)、dev:portal(仅对@tih/portal执行 dev)、dev(默认对@tih/website执行 dev)、prepare(生成 vp 配置); - 运行时约束:
engines锁定node 25.8.1与pnpm 10.32.1,并以packageManager: pnpm@10.32.1声明包管理器,本地运行需按此版本准备环境; - 依赖目录:pnpm-workspace.yaml 将
apps/*与packages/*声明为工作区包,并通过catalog统一 vite/vitest 版本(映射到@voidzero-dev的 vite-plus 系列包),再由overrides强制全仓一致。
在此基础上,各子应用提供了自己的操作文档。以 Docusaurus 网站为例,apps/website/README.md 给出完整流程:
- 安装:在仓库根目录执行
vp install,由 Vite+ 统一管理 monorepo 依赖安装; - 本地开发:仓库根目录执行
vp run dev(即根脚本dev,等价于对@tih/website执行 dev),启动本地开发服务器并自动打开浏览器;对 JavaScript 和 Markdown 文件的修改大多即时热更新,无需重启; - 构建:
vp run --filter @tih/website build,静态产物输出到build目录,可用任意静态托管服务分发; - 部署:文档给出的 GitHub Pages 部署方式为
cd apps/website后设置GIT_USER=<GitHub 用户名>与USE_SSH=1环境变量,再执行vp run deploy,该命令会构建站点并推送到gh-pages分支。
静态资源方面,网站的自定义主题(侧边栏移动端适配、目录 TOC、文档内容区等)位于 apps/website/src/theme/,博客文章按日期命名存放于 apps/website/blog/,与 README 导航栏中的 “Blog” 入口对应。
六、从内容仓库到社区产品:Portal 子应用
README 的“Contents”只提到 Docusaurus 网站,但 monorepo 中还有一个规模更大的子应用 apps/portal,承载社区的互动功能(简历提交与评论、Offer 数据提交与分析、面试问题库等)。从其 README 可知,它是按 T3-Stack 引导创建的 Next.js 应用,技术栈为 Next-Auth(认证)、Prisma(数据层)、TailwindCSS(样式)与 tRPC(类型安全 API);仓库中可见 prisma/schema.prisma、按领域划分的 tRPC 路由(offers、questions、resumes 等)以及数十个数据库迁移文件。本地开发该应用使用根脚本 dev:portal(即对 @tih/portal 执行 dev)。从源码结构看,这部分是 README 主内容之外的社区产品扩展,阅读面试资料本身不需要运行它。
七、贡献、赞助与许可证
README 的收尾部分说明了三件事:
- 贡献方式:目前没有正式的贡献规范(“things are still in flux”),欢迎任何人提交认为对同行工程师有帮助的内容;想贡献其他领域内容时,先创建 issue 或提交 pull request 再讨论。仓库中同样提供了 CONTRIBUTING.md 供参考。
- 相关项目:作者提到对数据结构实现感兴趣的读者可以关注其 JavaScript 数据结构与算法库 Lago(README 中标注为 WIP 状态)。
- 许可证与免责声明:仓库代码以开源许可证提供(仓库根目录 LICENSE 为 MIT 许可);由于是个人仓库,代码授权的授予方是作者本人而非其雇主(Meta)。
小结
Tech Interview Handbook 的 README 看似简短,实际勾勒了一套完整的技术面试准备方法论:用“压缩到最小必要信息”的原则覆盖简历、编码、系统设计、行为面与 Offer 谈判全流程,并用 Docusaurus 站点、按阶段组织的侧边栏、可运行的算法参考实现与独立部署的 Grind 75 将其落地。对准备面试的读者,阅读顺序建议就是 sidebars.js 的分类顺序;对想参与内容的贡献者,则可以直接基于 apps/website/contents/ 下的 Markdown 文档与 monorepo 的 vp run dev 工作流展开。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00