🎯 自我评估矩阵
点击星星标注当前掌握程度(1=完全不会 → 5=能深入讲解),制定复习优先级
📘 第1周 · 计算机基础 + 语言深度
夯实计算机基础八股 + Python/C# 语言深度,确保基础题不丢分。8年应用层开发后基础容易生锈,这周优先补强。
📗 第2周 · 框架原理 + 架构设计
Qt/PySide6 + WPF 框架底层原理、MVVM 架构、IoC/DI、设计模式实战、C++/Python 互操作。这是展现资深度和架构能力的关键周。
📙 第3周 · 项目深度复盘 + 领域知识
逐个深挖 5 个项目,每个能讲 3 层深度(业务 → 架构 → 实现)。覆盖 BLE Mesh、FFmpeg/MPV、CI/CD、数据库 ORM 等领域知识。
📕 第4周 · 模拟面试 + 系统设计 + 手撕代码
3 轮模拟面试 + 系统设计题 + 手撕代码练习。查漏补缺,确保面试当天状态在线。
⚙️ 1.1 操作系统核心 必考
- 进程和线程的区别?为什么线程切换比进程切换快?
- 死锁的四个必要条件?如何避免?你在项目中遇到过死锁吗?
- Python 的 GIL 和操作系统的线程是什么关系?GIL 是操作系统层面的还是 Python 层面的?
- 你在 BLE 指令节流管道中用了哪些同步机制?为什么选这些?
- 虚拟内存的作用?缺页中断是什么过程?
- C# 的 GC 分几代?大对象为什么放在 LOH?
- Python 的垃圾回收和 C# 的 GC 有什么本质区别?
- 你在桌面应用中遇到过内存泄漏吗?怎么排查的?
🌐 1.2 计算机网络 必考
- TCP 为什么是三次握手不是两次?四次挥手为什么需要 TIME_WAIT?
- TCP 的滑动窗口是什么?拥塞窗口和接收窗口有什么区别?
- HTTPS 的握手过程?对称加密和非对称加密在哪里用?
你的 IM 项目中组织架构增量同步、离线消息本地存储(SQLite)、上线后增量拉取 — 这些都是面试官会追问的网络通信实战点,准备好具体的技术方案。
- BLE Mesh 和普通 BLE GATT 有什么区别?为什么要用 Mesh?
- 你的 BLE 指令三级节流管道(LIFO 栈去重 → ID 版本号失效 → 定时串行消费)能详细讲讲设计思路吗?
- BLE Mesh 网络状态机有哪 6 种状态?状态转换的守卫机制是什么?
- Composition Data 你是怎么解析的?Unicast 地址分配算法是什么?
- 快速拖拽时蓝牙指令洪泛崩溃,具体表现是什么?你是怎么定位和解决的?
第 1 层:业务场景(灯光控制需要实时响应)→ 第 2 层:架构设计(三级管道各解决什么问题)→ 第 3 层:实现细节(LIFO 为什么不是 FIFO、200ms 怎么定的、版本号怎么生成)
🐍 1.3 Python 高级特性 必考
- 元类和装饰器都能修改类行为,什么时候用哪个?你项目里 LightControlMeta 为什么选元类?
- 解释一下描述符协议?property 和普通 attribute 有什么区别?
- __getattr__ 和 __getattribute__ 的区别?什么时候用哪个?
- 你元类中自动生成属性和信号的具体实现是什么?如果让你重新设计,有更好的方案吗?
🔷 1.4 C# 核心机制 必考
- async/await 的底层原理?编译器生成了什么?
- Task 和 Thread 有什么区别?什么时候用 Task 什么时候用 Thread?
- async void 为什么危险?在什么场景下必须用 async void?
- ConfigureAwait(false) 在什么场景下必须用?不写会怎样?
📊 1.5 数据结构与算法基础 重要
每日 LeetCode 2 题,Python 和 C# 交替刷。桌面端面试手撕代码通常不会太难(中等难度为主),重点练:链表操作、二叉树遍历、字符串处理、动态规划基础题。面试可能指定语言。
🎯 2.1 PySide6 / Qt 核心机制 必考
- QThread 的 moveToThread 和继承 QThread 有什么区别?你在项目中用的哪种?为什么?
- Qt 的信号槽跨线程是怎么传递的?QueuedConnection 的底层机制?
- Qt 事件循环如果被阻塞了怎么办?processEvents 有什么风险?
- 你在 Amaran Desktop 中多线程是怎么管理的?BLE 通信在哪个线程?
🎨 2.2 WPF 核心机制 必考
- 依赖属性和普通 CLR 属性有什么区别?为什么要用依赖属性?
- WPF 路由事件的冒泡和隧道有什么区别?你在项目中怎么用的?
- 你的 HSI 色轮取色器为什么用 WriteableBitmap 而不是 Shape?性能差异在哪?
- CommunityToolkit.Mvvm 的 [ObservableProperty] 是怎么工作的?Source Generator 原理?
- 你的全局快捷键系统是怎么设计的?键盘钩子有什么风险?
🏗️ 2.3 MVVM 架构深度 必考
- 你在 PySide6 项目中是怎么实现 MVVM 的?Qt 没有原生 Binding,你怎么解决?
- ViewModel 之间需要通信怎么办?你用过 Messenger 模式吗?
- 40+ 服务依赖注入,启动性能如何?有没有懒加载?
- 你的动态主题系统 JSON 驱动具体怎么做的?100+ 变量实时切换的性能怎么样?
💉 2.4 IoC / DI 容器 重要
- 为什么需要 IoC 容器?不用 IoC 直接 new 有什么问题?
- Transient 和 Singleton 有什么区别?什么场景用哪个?
- 你的三种注册配置是什么?为什么需要多种注册方式?
- 循环依赖怎么解决?punq 支持属性注入吗?
- MEF 和普通 DI 容器有什么区别?为什么 Revit 插件用 MEF?
🎭 2.5 设计模式实战 重要
- 你的同步框架为什么用策略模式而不是 if-else?策略怎么注册和发现?
- 状态机和策略模式有什么区别?你的 BLE Mesh 状态机怎么防止非法状态转换?
- MEF 的插件是怎么发现和加载的?和 .NET 自带的 DI 有什么区别?
- 设计模式你实际用过哪些?手写一个线程安全的单例模式。
🔗 2.6 C++/Python 互操作 简历亮点
- SIP 和 pybind11 有什么区别?你在项目中为什么两个都用了?
- C++ 代码中如果不释放 GIL 会怎样?你在哪里用了 gil_scoped_release?
- MPV 嵌入到 Qt 窗口的技术原理是什么?为什么不用 Python 直接调?
- SIP 生成绑定的流程是什么?.sip 文件怎么写?
- 你的 C++ 水平到什么程度?能独立写 C++ 模块吗?(坦诚回答使用范围)
📦 2.7 CI/CD 与构建发布 展现工程化
- Nuitka 和 PyInstaller 有什么区别?为什么选 Nuitka?
- macOS 签名和公证的完整流程?不公证会怎样?
- 你的 Jenkins Pipeline 是怎么设计的?多平台构建怎么并行?
- 应用自动更新怎么做的?增量更新原理是什么?
📡 2.8 日志与可观测性 重要
💡 3.1 Amaran Desktop — 增量同步框架 重点深挖
- 9 种冲突类型能列举几个?最复杂的是什么?
- Flag 位运算聚合状态,现场写一下位运算逻辑
- 如果同时有 100 个设备离线操作后上线,同步怎么处理?
- 你觉得这个框架还有什么可以改进的地方?
📶 3.2 BLE 指令节流管道 + Mesh 状态机 重点深挖
- LIFO 栈去重为什么用 LIFO?FIFO 有什么问题?
- ID 版本号失效的机制是什么?版本号怎么生成?
- 200ms 定时间隔怎么确定的?太长太短各有什么问题?
- BLE Mesh 6 种状态能画一下状态转换图吗?
- 快速拖拽导致蓝牙崩溃的具体表现是什么?你怎么定位的?
- Unicast 地址分配算法的边界情况?设备数量超过地址范围怎么办?
面试时如果被问到 BLE Mesh 状态机,主动说"我可以在白板上画一下状态转换图" — 这比纯口述更有说服力,展现你对其了如指掌。
🎬 3.3 Sidus TC Sync — 跨平台素材同步 深挖
- timecode 同步和 date 同步有什么区别?哪种更准?
- FFmpeg 是用命令行还是 API?性能如何?500+ 条素材导入要多久?
- AAF 和 FCPXML 格式有什么区别?为什么需要导出这么多格式?
- macOS 沙盒对文件访问有什么限制?你怎么处理的?
- SIP 生成 PyQt6 绑定的完整流程?
🎛️ 3.4 Sidus Link WPF — 蓝牙 Mesh 控制器 深挖
💬 3.5 企业级 IM 桌面客户端 深挖
📐 3.6 三维算量 For Revit — BIM 插件 了解即可
🗄️ 3.7 数据库与 ORM 重要
- SQLite 的 WAL 模式是什么?和默认模式有什么区别?
- SQLAlchemy 的 N+1 查询问题是什么?怎么解决?
- Alembic 的 autogenerate 为什么不能完全信任?
- EF Core 的 DbContext 是线程安全的吗?多线程怎么处理?
- 你在 Amaran Desktop 中用 SQLAlchemy,在 Sidus Link WPF 中用 EF — 两个 ORM 有什么体验差异?
📝 4.1 桌面端高频面试题 必准备
🏗️ 4.2 系统设计题 加分项
① 需求澄清(问清楚约束)→ ② 容量估算(用户量/QPS/数据量)→ ③ 高层架构(画图)→ ④ 核心模块设计 → ⑤ 数据存储方案 → ⑥ 扩展性和容错 → ⑦ 瓶颈和优化
💻 4.3 手撕代码高频题型 每日练习
用 Python 和 C# 各刷一遍,面试可能指定语言。桌面端面试手撕代码通常中等难度,重点是写对 + 讲清思路。每日 2 题,4 周约 40 题。
🎤 4.4 模拟面试安排 实战演练
| 轮次 | 建议时间 | 主题 | 重点 |
|---|---|---|---|
| 第1轮 | 周一 | 自我介绍 + 项目概览 | 3分钟自我介绍、项目一句话概括、技术栈总览。录音回放检查表达流畅度 |
| 第2轮 | 周三 | 项目深挖 + 架构设计 | Amaran Desktop 同步框架 / BLE 节流管道 / C++/Python 互操作链路。准备白板画图 |
| 第3轮 | 周五 | 八股文 + 手撕代码 | Python/C#/Qt/WPF 基础题 + 2道算法题(限时40分钟) |
① 用手机录音/录像,回放检查语速、停顿、口头禅 ② 找朋友/同事模拟面试官提问 ③ 每轮结束后复盘未答好的点,第二天补强 ④ 模拟真实面试时长(1-1.5 小时)
📅 每日时间分配建议
| 时间段 | 内容 | 时长 | 说明 |
|---|---|---|---|
| 09:00 - 10:00 | LeetCode 2题 | 1h | Python/C# 交替,重点刷字符串/数组/树/DP |
| 10:00 - 12:00 | 当日主题学习 | 2h | 对照计划中的 checklist 逐项复习,做笔记 |
| 14:00 - 16:00 | 项目复盘 + STAR 话术 | 2h | 每天深挖 1 个项目,整理"面试官追问"的答案 |
| 16:00 - 17:00 | 面试题口述练习 | 1h | 口述回答高频面试题,录音回放检查表达 |
| 20:00 - 21:00 | 薄弱项补强 | 1h | 计算机基础 / C++基础 / JS基础 |
| 21:00 - 21:30 | 当日总结 | 0.5h | 记录未掌握的知识点,第二天优先复习 |
🎯 面试策略与注意事项
1. 自我介绍 — 准备两个版本
3 分钟版:8年双栈桌面端 → 核心项目(Amaran / TC Sync / Sidus Link)→ 技术亮点(BLE Mesh + C++/Python 互操作 + MVVM 架构)
1 分钟版:只讲标签和代表作 — "8年桌面端,Python/C# 双栈,专注跨平台应用和 BLE 硬件通信,独立交付过 3 款产品"
2. 项目讲解 — STAR 模型
S (Situation):业务背景和痛点 → T (Task):你的职责和目标 → A (Action):技术方案和实现(重点) → R (Result):成果和数据
每个项目准备 2 分钟版和 5 分钟版,根据面试官反应调整深度。
3. 技术深度 — 三层递进
面试官说"再深入讲讲"时,要能层层递进:
业务层 → 解决什么问题 → 架构层 → 怎么设计的 → 实现层 → 代码怎么写的 → 原理层 → 底层机制是什么
4. 不熟就说 — 坦诚是最好的策略
简历写了 C++ 但标注"仅互操作层",被问 C++ 深入问题时坦诚说明使用范围,不要硬撑。可以说:"C++ 我主要在 SIP/pybind11 互操作层面使用,没有做过大型 C++ 项目,但在互操作方面经验比较深入。"然后引导到自己擅长的领域。
5. 薄弱项应对 — 用优势补叙事
学校背景(湖南人文科技学院)是客观短板,但你有 8 年实战经验 + 独立交付能力 + 架构设计经验 + BLE 硬件通信稀缺技能。面试时主动引导到项目深度和技术广度上。
6. 引导话题 — 主动展现亮点
面试官的问题往往有多个方向可以展开。比如问"你在项目中遇到过什么难点",不要随便讲一个 bug,要讲 BLE 指令三级节流管道或 增量同步框架的冲突处理 — 这些是你最亮眼的、最能展现技术深度的内容。