菜单

题库系统

相关源文件

目的与范围

题库系统是一个社区驱动的平台,用于分享、发现和讨论技术面试问题。它允许用户浏览顶尖科技公司提出的问题,贡献他们在面试中遇到的问题,按公司、职位和类型过滤问题,并将问题整理到个人列表中。本文档涵盖了系统的架构、核心组件、数据模型和关键功能。

系统概览

题库是 Tech Interview Handbook 门户的三大主要组成部分之一,另外两个是简历评审系统和 Offer 系统。它提供了一个协作空间,求职者可以通过访问公司实际提出的问题来为技术面试做准备。

来源: apps/portal/src/components/questions/QuestionsNavigation.tsx apps/portal/src/pages/questions/browse.tsx

主要功能

  1. 问题浏览:按公司、地点、问题类型等多种标准搜索和过滤问题
  2. 问题贡献:添加面试中遇到的新问题
  3. 答案与评论:为问题提供答案并参与讨论
  4. 遭遇跟踪:记录在特定公司遇到特定问题的实例
  5. 个人列表:创建和管理个人问题列表,以便有条理地准备
  6. 投票系统:对问题和答案进行点赞和点踩,以实现社区策展

核心数据模型

题库系统围绕几个相互关联的数据模型构建

来源: apps/portal/src/server/router/questions/questions-question-router.ts apps/portal/src/types/questions.d

用户界面组件

主页

主页提供了一个简单的入口点,通过搜索界面,用户可以根据类型、公司和地点快速查找问题。

来源: apps/portal/src/components/questions/LandingComponent.tsx

浏览界面

浏览界面是探索问题的中心枢纽,它具有

  1. 顶部的贡献卡片,用于添加新问题
  2. 带有内容搜索、排序选项和过滤开关的搜索栏
  3. 显示问题内容和元数据的问题卡片
  4. 用于按公司、职位、问题类型等细化结果的过滤侧边栏

来源: apps/portal/src/pages/questions/browse.tsx65-606 apps/portal/src/components/questions/QuestionSearchBar.tsx

问题详情视图

问题详情视图显示

  1. 带有元数据的完整问题内容
  2. 关于问题的评论
  3. 贡献答案的表单
  4. 带有投票和评论功能的现有答案列表

来源: apps/portal/src/pages/questions/[questionId]/[questionSlug]/index.tsx

列表管理

列表页面允许用户

  1. 创建和管理个人问题列表
  2. 将问题添加到列表或从列表中移除
  3. 浏览每个列表中的问题

来源: apps/portal/src/pages/questions/lists.tsx apps/portal/src/components/questions/AddToListDropdown.tsx

关键工作流程

贡献问题

问题贡献工作流程旨在防止重复问题并收集结构化信息

该过程包括

  1. 输入问题内容、类型、公司、职位、地点和日期
  2. 检查类似现有问题以防止重复
  3. 记录遇到的现有问题或提交新问题

来源: apps/portal/src/components/questions/forms/ContributeQuestionForm.tsx apps/portal/src/components/questions/ContributeQuestionCard.tsx

记录问题遭遇

用户可以通过一个分步表单表明他们在面试中遇到了一个现有问题,该表单收集

  1. 遇到问题的公司
  2. 面试的地点
  3. 他们面试的职位
  4. 遇到问题的日期

这些数据有助于跟踪问题在公司和职位之间的频率和相关性。

来源: apps/portal/src/components/questions/forms/CreateQuestionEncounterForm.tsx

过滤和搜索问题

该系统提供全面的过滤功能

过滤类别描述
公司按特定公司过滤(例如,Google、Meta)
角色按职位过滤(例如,软件工程师)
问题类型按问题类别过滤(编码、系统设计、行为、理论)
问题年龄按近期性过滤(上个月、最近 6 个月、去年、全部)
位置按地理位置过滤
排序类型按点赞数、年龄或遭遇次数排序
排序顺序按升序或降序排序

来源: apps/portal/src/pages/questions/browse.tsx70-151 apps/portal/src/utils/questions/constants.ts23-105

UI 组件和交互

问题卡片

题库在不同上下文中使用了各种卡片组件来显示问题

BaseQuestionCard 为各种问题显示上下文提供了基础,处理

  1. 问题内容和元数据
  2. 投票控件
  3. 公司、地点和职位统计信息
  4. 适合上下文的操作按钮

来源: apps/portal/src/components/questions/card/question/BaseQuestionCard.tsx

答案和评论组件

答案和评论也有类似的组件层级结构,并有专门的组件用于

  1. 带有投票和评论的答案卡片
  2. 问题评论列表项
  3. 答案评论列表项

来源: apps/portal/src/components/questions/card/AnswerCard.tsx apps/portal/src/components/questions/comments/CommentListItem.tsx

API 层

题库 API 使用 tRPC 实现,并组织在多个路由文件中

问题路由

处理问题的 CRUD 操作,包括

  • 创建问题
  • 按 ID 检索问题
  • 搜索和过滤问题
  • 查找相关问题

关键端点

  • getQuestionsByFilter:根据过滤条件检索问题
  • getQuestionById:按 ID 获取特定问题
  • getRelatedQuestions:查找与给定输入相似的问题
  • getQuestionsByFilterAndContent:将过滤与内容搜索结合

来源: apps/portal/src/server/router/questions/questions-question-router.ts

其他路由

其他路由负责系统的各个方面

  • 答案路由:管理问题答案
  • 评论路由:处理问题和答案上的评论
  • 列表路由:管理个人问题列表
  • 投票路由:处理问题、答案和评论的投票
  • 遭遇路由:记录和检索问题遭遇数据

搜索和过滤实现

该系统使用 PostgreSQL 全文搜索来查找相关问题。它通过以下方式预处理搜索查询

  1. 移除特殊字符
  2. 将文本分解为单词
  3. 使用 OR 运算符创建搜索查询
// Example of search query processing
const query = input.content
  .replace(escapeChars, ' ')
  .trim()
  .split(/\s+/)
  .join(' | ');

使用 PostgreSQL 的 ts_rank_cd 函数执行相关性排名。

来源: apps/portal/src/server/router/questions/questions-question-router.ts226-283

问题聚合和统计

该系统聚合了关于问题遭遇的数据,以提供以下方面的见解

  1. 哪些公司最常提出每个问题
  2. 问题在哪些地点/国家被问到
  3. 通常哪些职位会问到每个问题

这些数据通过实用函数进行处理,并在问题卡片上显示,以帮助用户了解问题与他们具体情况的相关性。

来源: apps/portal/src/utils/questions/server/aggregate-encounters.ts apps/portal/src/components/questions/QuestionAggregateBadge.tsx

集成点

题库系统集成了技术面试手册的其他组件

  1. 身份验证系统:用于用户识别和访问控制
  2. 导航:共享的导航组件提供题库的访问入口
  3. UI组件:在门户网站中使用了通用的UI组件

来源: apps/portal/src/components/questions/QuestionsNavigation.tsx