Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 其他内容 / Other Topics

项目实践 / Projects

CWFrame 项目 / CWFrame Project

1. 计算机宇宙探索器 / Computer Universe Explorer

2. CWFrame v0.1 26/3/25 前端渲染逻辑总结 / CWFrame Frontend Rendering Architecture Review

3. 🛡️ Computer-WorldFrame 项目技术面试指南 / A Technical Interview Guide for the Computer-World Frame Project

项目经历 / Project Experience

C++ 项目 / C++ Projects

1. C++ 技能要求列表 / C++ Skills and Competency Requirements

DHAttack 案例 / DHAttack Case Study

1. 某评估仿真系统主控平台项目总结 / Master Control Platform Project for an Evaluation and Simulation System

StructKernelBench 案例 / StructKernelBench Case Study

1. StructKernelBench:面向结构仿真的 CPU/GPU 核心算子优化实验平台 / A CPU-GPU Structural Simulation Kernel Optimization Platform

本页目录

🛡️ Computer-World_Frame 项目技术面试指南 / A Technical Interview Guide for the Computer-World Frame Project ​

面试背景:面试官更看重你“为什么不这么做”而不是“怎么做”。他们会针对你的设计选择进行深度“拷问”,以验证你的技术深度和决策逻辑。

目录 ​

  1. 系统架构与设计模式 (Architecture)
  2. API 设计与前后端通信 (API & Communication)
  3. 数据建模与图论逻辑 (Data Modeling)
  4. 工程化与测试 (Engineering & Quality)
  5. 开放性思考与未来演进 (Future)

<h2 id="1">一、 系统架构与设计模式</h2>

Q1:为什么在后端采用了 Controller -> Service -> Repository 的分层架构?对于一个原型项目,这是否过度设计? ​

  • 面试官提问:我看你的后端代码分层非常明确,甚至还写了 Repository 层。你为什么不直接在 Controller 里写业务逻辑和文件读写?这样做有什么好处?
  • 回答参考:
    1. 职责分离 (SoC):Controller 负责解析 HTTP 请求,Service 处理纯业务逻辑,Repository 负责数据持久化(目前是 JSON 文件读写)。
    2. 可测试性:分层后可以脱离 Express 服务器对 Service 进行独立单元测试,Mock 掉 Repository 即可验证逻辑。
    3. 可扩展性(可插拔设计):通过 Repository 模式屏蔽了存储细节。

      技术细节:目前使用的是 Node.js 内置的 node:fs(文件系统模块)读写 JSON。未来如果要切换到 MySQL 或 MongoDB,只需更换 Repository 实现,Service 层的业务逻辑一个字都不用改。

  • 回答解析:展示你对单一职责原则和代码可维护性的重视。

Q2:你为什么给所有的 Service 和 Repository 都导出了一个单例? ​

  • 面试官提问:你在每个文件末尾都 export const xxxService = new XxxService(),基于什么考虑?
  • 回答参考:
    1. 无状态工具类:Service 和 Repository 内部不维护随调用改变的“私有状态”(如 this.currentUser),它们更像功能纯净的“计算器”。
    2. 资源开销与 GC 压力:
      • 非单例:每次请求都 new 一个对象,高并发下会产生大量重复对象,增加内存占用和 Node.js 垃圾回收(GC)的负担。
      • 单例:全局只有一个实例。无论多少人调用,内存里永远只有那一个对象。内存占用极低,且性能好。
    3. 一致性:确保全局使用的是同一个逻辑实例,方便后续在构造函数中统一注入配置。
  • 回答解析:展示你对 Node.js 内存管理 和 设计模式 的理解。

<h2 id="2">二、 API 设计与前后端通信</h2>

Q3:为什么要在 shared/contract.ts 中统一定义接口?这种“契约先行”的设计解决了什么痛点? ​

  • 面试官提问:我注意到你有一个共享文件夹。为什么不让前端和后端各自维护一套接口定义?
  • 回答参考:
    1. 端到端类型安全:TypeScript 强制前端返回符合 CWFrameProgress 格式的代码。后端改字段名,前端编译立刻报错,消灭运行时 undefined。
    2. 开发效率:定义一次,全栈复用。
    3. 动态文档:contract.ts 就是最准确的 API 文档。
  • 回答解析:重点在于类型系统的闭环和全栈开发的一致性。

Q4:谈谈你设计的 ApiResponse<T> 泛型结构。为什么不直接返回数据内容? ​

  • 回答参考:
    1. 统一处理逻辑:前端封装 requestJson 统一处理 success: false 时的报错。
    2. 业务错误 vs 网络错误:HTTP 状态码(如 404)表示网络层,ApiErrorCode(如 USER_NOT_FOUND)表示业务层,职责清晰。

Q5:在 cwframe.api.ts 中,你是如何处理后端返回的成功与失败的? ​

  • 回答参考:采用 Fail-fast (快速失败) 哲学。在 requestJson 中发现 success: false 慢立刻 throw Error。这强制调用方必须通过 try/catch 处理异常,比返回 null 更健壮。

<h2 id="3">三、 数据建模与图论逻辑</h2>

Q6:在 CWFrameNode 中,你为什么选择用 dependencies: number[] 来描述节点关系? ​

  • 回答参考:实现 逻辑解耦。节点只需关注自己的前置条件。解锁逻辑简单自然:canUnlock = deps.every(id => unlockedNodes[id])。

Q7:unlockedNodes 为什么设计成 Record<number, ...> 映射对象,而不是简单的 number[] 数组? ​

  • 面试官提问:用 [1, 2, 5] 数组不是更省空间吗?
  • 回答参考:
    1. 查询性能 ($O(1)$ vs $O(n)$ ):
      • 数组:查找 5 号节点需要从头遍历,时间复杂度是 $O(n)$,数据越多越慢。
      • 对象/映射:利用“哈希算法”精准定位,查找时间复杂度是 $O(1)$。无论存 10 个还是 1 万个,查找速度都是恒定的。
    2. 元数据扩展:方便记录 unlockedAt 时间戳等额外信息,便于做“学习足迹”展示。
  • 回答解析:展示你对算法复杂度和高性能数据结构的权衡。

<h2 id="4">四、 工程化与测试</h2>

Q8:你为什么选择 Vitest 而不是成熟的 Jest? ​

  • 面试官提问:Jest 是目前的主流,为什么要在这个项目里用 Vitest?
  • 回答参考:
    1. 生态契合度:前端用 Vite,Vitest 可零配置复用 vite.config.ts 中的别名(如 @shared)。
    2. 极速反馈:HMR(热更新)极快,大大提升测试驱动开发(TDD)的效率。
    3. 原生 ESM 支持:
      • CJS (CommonJS):像“老式磁带”,语法是 require,浏览器不原生支持。Jest 为了兼容它有很多历史包袱。
      • ESM (ECMAScript Modules):像“现代 MP3”,语法是 import。它是 JavaScript 唯一的国际标准,Vitest 天生支持,无需像 Jest 那样通过 Babel 进行繁琐的转译。
  • 回答解析:展示你紧跟技术前沿并具备工程化嗅觉。

<h2 id="10">五、 开放性思考与未来演进</h2>

Q9:什么是 BFF (Backend For Frontend) 层?为什么大厂(阿里/字节)喜欢加这一层? ​

  • 面试官提问:在大厂架构中,Node.js 通常作为 BFF 层,它解决了什么问题?
  • 回答参考:解决 “多端适配” 和 “数据聚合” 问题。
    1. 数据聚合 (Aggregation):后端由 Java/Go 微服务构成(用户中心、商品中心、物流中心)。如果没有 BFF,前端需要发 3 个慢速的外网 HTTP 请求(路长、握手多)。
    2. 性能优势:前端只发 1 次 请求给 Node.js BFF。BFF 在机房内网(极速、低延迟)里同时呼叫多个微服务,组装后一次性返回。
    3. 数据裁剪:BFF 负责把后端返回的冗余字段删掉,只给前端最精简、最舒服的 JSON,节省移动端流量。
  • 回答解析:展示你对 大厂微服务架构 和 移动端性能优化 的深度理解。

Q10:如果节点增加到 10,000 个,目前的 JSON 存储如何优化? ​

  • 回答参考:
    1. 存储迁移:迁移至 PostgreSQL 或 Neo4j(图数据库),利用索引加速。
    2. 水平加载:前端采用分页或“视口占位(Lazy Loading)”,只显示当前视野内的节点。

Q11:你的“语义匹配”模型如何实现“苹果系统”映射到“macOS”? ​

  • 回答参考:
    1. 后端实现:放在 MatchingService,不给前端增加计算负担。
    2. 方案:
      • 简单:维护同义词表(Synonyms)。
      • 高级:使用 Embedding 向量模型计算余弦相似度。

📈 设计原则总结 (Design Principles) ​

  • KISS (Keep It Simple, Stupid):针对原型开发,用最轻量的 JSON 存储换取最快迭代。
  • Contract-First (契约先行):接口即文档,全栈共用一套 TS 类型定义。
  • Layered Architecture (分层架构):为未来的数据库迁移(MySQL/Mongo)预留插拔空间。
  • Full-stack Type Safety (全栈类型安全):利用 TypeScript 消灭端到端的数据 Bug。

最后更新于:

Pager
上一篇2. CWFrame v0.1 26/3/25 前端渲染逻辑总结 / CWFrame Frontend Rendering Architecture Review
下一篇1. C++ 技能要求列表 / C++ Skills and Competency Requirements

持续记录,持续成长

Copyright © Tidenflow