学习内容清单 — DMSD / QTS / 编程 / AC 入試
起草: 2026-05-25 by CC,2026-05-26 扩展(新增 DMSD 第 9-12 章 + QTS Part B 全 16 章),2026-05-28 扩展(第 7 章点呼机深度知识包 7.6-7.16 + 第 1 章 1.7 项目进度全景 12 小节:阶段 0-8 + 里程碑 + 决策记录 + 仓库地图)
对象: itsuki — 编程零基础但已实装 5 端项目 DMSD,想利用在校浪费时间反向工程自己项目;同时正在筹备 QTS 量化交易系统(节奏让位于 DMSD)
性质: 学习内容清单,不是学习计划(itsuki 原话:「不是说计划,就把要学的内容列出来」)
结构: 分两大块 — Part A · DMSD + AC 入試(眼前主线,第 0-13 章)/ Part B · QTS 量化交易(终极地图,Q1-Q16,按 #008 决策让位 DMSD 优先,是「方向地图」不是「明天就要学」)
关联: 跟
对象: itsuki — 编程零基础但已实装 5 端项目 DMSD,想利用在校浪费时间反向工程自己项目;同时正在筹备 QTS 量化交易系统(节奏让位于 DMSD)
性质: 学习内容清单,不是学习计划(itsuki 原话:「不是说计划,就把要学的内容列出来」)
结构: 分两大块 — Part A · DMSD + AC 入試(眼前主线,第 0-13 章)/ Part B · QTS 量化交易(终极地图,Q1-Q16,按 #008 决策让位 DMSD 优先,是「方向地图」不是「明天就要学」)
关联: 跟
02_分析与调研/AC入試制度総覧_2027.html 配套 —
Part A 内容直接对应 AC 评分 3 点(关心 / 能力 / 表达)
这份清单的写法:
- 每个条目带 3 个角度:是什么 / DMSD 里哪里用了 / 学了能讲什么 AC 故事
- 不按学校式教材排序,按「DMSD 里最常碰 + 学了立刻能用」排
- 优先级 4 档:必学高优中优低优
- 难度 5 档:★(很易)〜 ★★★★★(很难)
- 不强制顺序 — itsuki 哪天有时间学哪段都行,章末有「推荐顺序」给参考
目录
Part A · DMSD + AC 入試
- 第 0 章 — 这份清单为什么这样写
- 第 1 章 — 自己项目熟悉度(最优先 / 0 编程门槛)
- 第 2 章 — 基础通用知识(5 端都要)
- 第 3 章 — Python(backend + 点呼机,2 端用)
- 第 4 章 — Swift + SwiftUI(iOS / AC demo 重点)
- 第 5 章 — Kotlin + Compose(Android)
- 第 6 章 — TypeScript + Vue(老师 Web)
- 第 7 章 — 硬件 + 嵌入式(点呼机)
- 第 8 章 — AC 入試 直接相关知识
- 第 9 章 — 项目底层运转逻辑 🆕
- 第 10 章 — 计算机科学基础(情报科学類 1-2 年共通课预习)🆕
- 第 11 章 — 信息安全深度(CTF / SecHack365)🆕
- 第 12 章 — 软件工程(DMSD 工程化的理论)🆕
- 第 13 章 — 推荐学习顺序(给参考,非强制)
第 0 章 — 这份清单为什么这样写
0.1 itsuki 当前位置
- 编程经验:零基础(2026-03-11 学第一天 Python 后停了 1 个月)
- 但已实装项目:DMSD 5 端 monorepo(同一个仓库里 5 个端的代码) — iOS / Android / Backend / Web / 点呼机
- 2026-05-25 项目状态:v0.8 之后累积 15+ commit(commit = git 里一次代码提交记录)
- 距 R9 募集要项公表 21 天,距出愿截止 101 天
0.2 AC 入試 3 个评分点跟学习的关系
| 评分点 | AC 要求 | 学习怎么对应 |
|---|---|---|
| 关心 | 对信息科学有强烈兴趣,有持续追踪轨迹 |
学习记录(05_logs/learning_path.md)就是追踪证据 —
每学一块写 1 条「为什么学 / 学了什么 / 感悟」
|
| 能力 | 自己设定课题 + 创造性解决 | DMSD 项目本身就是核心证据 — 学得越深越能解释自己的设计选择 |
| 表达 | 逻辑说明过程与结果(书面 + 口头) | 不追求广,追求每个学过的东西能讲清楚 — 评委问「为什么用 NFC」要从物理原理讲到代码 |
0.3 学习设计 5 条原则
- 每学一块都跟 DMSD 现有代码联动 — 不学跟项目无关的东西
- 每学一块都能写一句「我用它做了什么」 — 这就是 AC 面接素材
- 不追求广,追求能讲清楚 — 评委问到任何技术细节都能从原理讲到代码
-
边做边学(已有原则,
05_logs/learning_path.md§核心学习哲学)— 不走「先学几个月编程再开始」的传统路径 - 三条铁律:每行代码能解释 / 先猜后跑 / 写 dev_log(dev_log = 开发日志,记每天碰到什么改了什么)
第 1 章 — 自己项目熟悉度(最优先 / 0 编程门槛)
itsuki
原话:「我现在连自己项目的文件都认不全」。这一章不需要写一行代码,只需要读
+ 看 + 在脑中建立项目地图。这是优先级最高的,因为 AC
面接评委问「你的项目里有什么」如果自己答不全,是最致命的翻车。
1.1 项目地图(630+ 文件按目录分布)
DMSD 顶层目录结构(11 个目录)
DMSD 项目根
~/dev/DMSD/ 下 11 个目录,每个干什么用
读
.claude/skills/project-overview/SKILL.md §1 —
这份文件就是 itsuki 让 CC 替他维护的「项目文件总览」,630+
文件全清单。读 1 遍能知道每个文件干什么。
AC 故事:评委问「你的项目有多大」→ 答「11
个顶层目录,约 630+ 文件,分 5 端代码 + 规格 + 设计 + 运维 + 日志 +
资产」
5 端代码分布(
03_dev/ 下 5 个子目录)
backend(后端)/ student_ios(iOS 学生端)/ student_android(Android
学生端)/ teacher_web(老师网页端)/
rollcall_device(点呼机端,跑在树莓派上)
读
03_dev/ 目录每个子目录的 README 或 DESIGN_LOG.md 文件
AC 故事:评委问「为什么做 5 端」→
答「学生用手机签到(iOS /
Android)、老师用电脑管学生(Web)、签到刷在硬件上(点呼机)、所有数据汇总到一个后端」
1.2 项目演变(v0.1 → v0.8 决策线)
8 次版本迭代每次做了什么 / 为什么
v0.1 规格冻结 → v0.3 规格大改 → v0.4 拍板分数体系 → v0.5 设计文档重写 →
v0.6 三端代码 bootstrap(bootstrap = 把项目最初框架搭起来)→ v0.7
学生注册码 + 老师公告 → v0.8 工具链定型
读
CHANGELOG.md(顶层)+
00_admin/progress_overview.md
AC 故事:评委问「项目怎么演化的」→
能逐版本讲清楚每次为什么 bump(bump = 版本号升级)。这是 AC
最爱听的「迭代思考过程」
1.3 规格文档(spec)— 项目「不写代码的真值源」
RollCall 规格 = 点呼系统的需求定义
spec = specification(规格说明书)— 在写代码之前先用文字 +
表格定义「这个功能要做什么 / 不做什么 / 错误怎么处理」。所有 5
端代码必须按规格实装。
读
01_specs/rollcall/RollCall_Spec_v0.1.md(主体)+
01_specs/rollcall/字典/ 下三件套(术语字典 / 状态字典 /
错误字典)
AC 故事:评委问「你怎么保证 5 端行为一致」→
答「先冻结规格再实装,规格是单源真值,5 端都按规格做」
1.4 设计文档双层结构
共用层 vs 専属层
2
端以上涉及的设计写共用层(
02_design/system_features.md),单端涉及的写専属层(每端各自的
*_DESIGN_LOG.md)。这样改的时候不会重复改 5 处。
读
02_design/system_features.md(共用层 830 行)+ 任一端的
DESIGN_LOG(先挑 iOS 看,比较直观)
AC 故事:评委问「5 端文档怎么不打架」→ 答「双层结构 +
文件联动矩阵」
1.5 文件联动矩阵
改 A 必查 B 的 17 条规则
5 端项目最大风险 = 改了一处忘改另一处导致字段对不上。DMSD
用「联动矩阵」(matrix) 把 17 条「改 A 必查 B」规则写死,每次 CC
写代码自动跑联动检查脚本。
读
.claude/skills/file-linkage/SKILL.md +
00_admin/hooks/lib/sync-rules.sh
AC 故事:评委问「5 端代码怎么不漂移」→ 答「PostToolUse
hook 自动跑 sync-check 脚本,改一处立刻提醒查另一处」
1.6 项目工具链(hook / skill / agent)
DMSD 装的 7 个 PostToolUse hook + 1 SessionStart hook + 30+ skill
hook = 钩子,特定事件发生时自动跑的脚本(比如 CC
改完文件自动跑联动检查)。skill = 技能,CC
触发特定关键词时自动加载的工作手册。DMSD 已配 7 个 hook + 30+ skill 防止
CC 失职。
读
00_admin/hooks/README.md +
.claude/skills/ 下各 SKILL.md(先挑 session-wrap 和
version-bump 看,最常用)
AC 故事:评委问「跟 AI 协作怎么管」→ 答「自己设计 hook
+ skill 让 AI 按规矩做事,AI 不是黑盒是工具」
1.7 项目进度全景(v0.1 → v0.8 + 之后累积推进)
🆕 2026-05-28 加入:这一节是 DMSD 项目状态总览的镜像
(等同
00_admin/progress_overview.md)。
itsuki 有时间就过一遍,了解每个目录/阶段的左右两侧(前因后果 + 当前状态)。
详细日志在 05_logs/,本节只是快照。
1.7.1 项目身份卡
- 仓库 / 开发代号:
DMSD(Dormitory Management System Digitalization) - 系统 / 产品名(对外):Tomoshibi(灯火 / ともしび,2026-04-21 定名)
- 一句话:把宿舍的纸质点呼考勤、纪律管理流程数字化,通过 NFC 卡 + 后端服务器 + 手机 App 实现
- 开发者:itsuki(一人独立开发)
- 起始时间:2026 年 2 月
- GitHub:
otogi2025/DMSD(2026-04-29 起 public)
1.7.2 分阶段策略(2026-04-19 G2 决策后已取消分阶段)
⚠️ 2026-04-19 G2 决策:原计划「Phase 1 = 卡 + 点呼机 / Phase 2 = 手机 App」已废弃。
v1.0 直接 iOS + Android + 卡 一次上线。
理由:itsuki 拍板「分阶段会让用户体验割裂、维护双套逻辑增本」。
内部开发节奏仍按 M1 → M5 里程碑(兜底:做不完至少 M1 + M2 可 demo)。
4-19 之前的旧分阶段(历史记录)
| 阶段 | 内容 | 不需要 |
|---|---|---|
1.7.3 系统架构(5 端 monorepo 真实拓扑)
点呼室入口 VPS 服务器
┌─────────────┐ ┌──────────────┐
│ 点呼机 A │───── HTTP ──────→│ │
│ (Pi 3A+ + │←── 学生名字 ─────│ FastAPI │
│ PN532 V3 + │ │ + PostgreSQL│
│ USB 音响) │ │ + Alembic │
└─────────────┘ │ │
│ │
┌─────────────┐ │ │
│ 点呼机 B │───── HTTP ──────→│ │
│ (Pi 3A+ + … │←── 学生名字 ─────│ │
└─────────────┘ │ │
│ │
┌─────────────┐ │ │
│ 学生 App │───── HTTP ──────→│ │
│ (iOS Swift /│←── JWT / data ───│ │
│ Android │ │ │
│ Compose) │ └──────┬───────┘
└─────────────┘ │ HTTP
↓
┌──────────────┐
│ 老师 Web │
│ (HTML stand, │
│ Ryō 风格, │
│ iPad 浏览器)│
└──────────────┘
NFC 卡 / 标签(学生持卡 + 入口动态标签):
- NTAG215 (学生卡, 7B UID)
- ST25DV16K (动态标签, 每 10 秒刷新 nonce)
老师 Web 决策漂移注:2026-05-02 立项 TS + Vite + Zustand 实装版,
2026-05-26 itsuki 拍板整体废弃(不是他心里的 Ryō 24 学生座席表 + 实时点呼仪表盘),
回到 4-21 Ryō standalone 单 HTML 主线。Vite 实装版 13 文件归档到
99_archive/2026-05-26_teacher_web_vite实装作废/。
1.7.4 核心功能:点呼系统流程
点呼一轮跑下来的 8 步
- 老师在管理端点击「开始点呼」
- 学生把 NFC 卡(或 Phase 2 的手机)贴到点呼机
- 点呼机读到 UID → 发给后端 → 返回学生姓名
- 点呼机扬声器播报学生姓名(防作弊关键设计)
- 老师站在旁边对照人脸
- 系统自动判定:准时 / 迟到 / 缺席
- 老师可以手动改判(需填写理由,系统留审计记录)
- 到时间未结束 → 系统自动结束并结算
纪律规则(扣分体系)
- 迟到:+0.5 分
- 缺席:+1.0 分
- 月累计 ≥ 4.0 → 下月罚扫
- 月累计 ≥ 8.0 → 下月禁足
00_admin/文档同步点清单.md §10 +
01_specs/rollcall/v0.1_冻结决策.md §1。
防作弊核心 = 语音播报
点呼机读卡后自动播报学生姓名,老师人眼对照。
把「机器识别身份」和「老师人眼识别」实时配对 →
攻击者必须本人到场(详见
05_logs/decision_log.md)。
1.7.5 整体进度(阶段 0 → 阶段 8)
阶段 0 — 规格设计 ✅ 已完成(2026-02 月)
- [x] 确定项目范围和功能边界
- [x] 编写点呼规格书(RollCall_Spec_v0.1)
- [x] 定义 API 约定、枚举字典、字段字典、错误码
- [x] 编写 8 条验收测试场景
- [x] 编写可执行开发清单
- [x] v0.1 规格冻结(2026-02-12)
阶段 0.5 — 架构决策 ✅ 已完成(2026-04-12)
- [x] NFC vs 二维码技术选型
- [x] 卡 vs 手机架构 → 分阶段策略
- [x] 点呼机硬件方案:Raspberry Pi + PN532
- [x] 语音播报防作弊设计
- [x] 更新
executable_dev_checklist.md
阶段 0.6 — 版本管理与记录体系 ✅ 已完成(2026-04-13)
- [x] SemVer 语义化版本规范确立
- [x] 所有 spec 文件 v1.0 → v0.1 重命名
- [x] 建立
CHANGELOG.md - [x] 建立 AC 记录体系(raw/ + polished/ + 双日期 + decision_log + interview_log + monthly_review)
- [x] 版本管理实践指南(移至 iCloud 通用指南)
阶段 1 — 项目搭建 ✅ 已完成(2026-03-10)
- [x] Mac 本地建立项目目录
- [x] 学会 Git 基础(init, add, commit, push, pull, status, log)
- [x] 创建 GitHub 私有仓库并推送代码
- [x] VPS 上克隆项目并配置 Git
- [x] 建立 Mac ↔ GitHub ↔ VPS 的同步流程
阶段 2 — 编程学习 🔄 进行中
- [x] Python 第 1 天:变量、数据类型(str/int/float/bool)、print、if/elif/else
- [ ] Python 第 2 天:for 循环、列表(list)
- [ ] Python 第 3 天:while 循环、字典(dict)
- [ ] Python 第 4 天:函数(function)
- [ ] Python 第 5 天:类(class)
- [ ] Swift 基础学习
- [ ] SwiftUI 基础学习
阶段 3 — 后端开发 🔄 进行中(v0.7 - v0.8 大量推进)
- [x] FastAPI 项目骨架搭建(v0.7)
- [x] SQLite + Alembic migration 框架(v0.7-v0.8)
- [x] 数据库建表(students / accounts / teachers / applications / approvals / audit_log / study_* / rollcall_* / teacher_invitations)
- [x] 登录与权限系统(JWT + Keychain 持久化)
- [x] 出寮届 API(create / list / detail / update / approve / reject / audit log)
- [x] 学習出席 API(attendees / checkin / finalize / absence-request / decision)
- [x] 点呼 API(
rollcall.py— sessions / checkin / events / board / summary) - [x] 教师管理 API(invitation / register)
- [x] 学生注册码 API(admin/registration-code/{current,refresh,history} + POST /accounts 校验)— 2026-05-04 加,App Store 上架对策(v1.0)
- [x] 老师公告 API(announcements 列表/详情/未读数/回复发删 + 老师投稿/编辑/软删)— 2026-05-04 加(v1.0)
- [x] 邮件通知(SendGrid 框架)
- [x] 食堂 Excel 导出
- [x] pytest 测试套件(37 case 全 pass — 含 12 注册码 + 6 公告新测试)
- [ ] 扣分系统 cron job(自动月结算)
- [ ] PostgreSQL 切换(v1.0 上线前从 SQLite 迁移)
- [ ] 部署到 VPS(uvicorn + nginx + systemd)
阶段 4 — 点呼机设备开发 🔄 进行中(设计层完成 / 硬件采购 + Pi 上手编程未开始)
已完成(设计层 + 文档层):
- [x] 硬件全定稿(2026-05-08):Pi 3A+(推翻 4-20 Pi 4B 2GB 决策)+ PN532 V3 SPI + 01Studio USB 小音响 + LED 模块 5 色套装 + ST25DV16K × 2 + NTAG215 × 50 + 配件
- [x] 设计文档双层:
02_design/hardware_design.md(物理硬件 / BOM / 接线)+03_dev/rollcall_device/ROLLCALL_DEVICE_DESIGN_LOG.md(226 行软件设计 / 6 个 D1-D6 待 itsuki 拍板的决策点) - [x] 代码骨架:
03_dev/rollcall_device/src/main.py占位 - [x] 5 端 new-feature skill 升级:5-10 把 4 端模板升级到 5 端,加点呼机 step 5
未开始(实物层 + 实装层):
- [ ] 采购:Pi 3A+ × 3 / PN532 V3 × 3 / ST25DV16K × 2 / NTAG215 × 50 / LED 套装 / USB 小音响 / 外壳 / 杜邦线(详
hardware_design.md §4) - [ ] Raspberry Pi 系统安装与配置
- [ ] NFC 读卡 Python 代码(SPI PN532)
- [ ] ECDSA / 设备认证
- [ ] HTTP 通信后端 + session 幂等
- [ ] 语音播报(pyttsx3 或 TTS)
- [ ] 外壳 + 贴墙安装(4 寮位置待勘察)
阶段 5 — 老师端 Web/iPad 界面 🔄 进行中
- [x] teacher_web v1 启动(TS + Vite + Zustand,5 page 起手)— v0.8 (5-26 整体废弃,回到 Ryō standalone HTML)
- [x] Demo 接真后端(
demo_server.py加/api/v1/代理 + JWT 真实认证) - [x] 学習管理全屏会话(StudyLanding + LiveStudySession + 3-tap NFC + 相位条)
- [x] iPad 点呼
live-roll-call.jsx(Demo 4-28 用过) - [ ] 学生注册码生成面板(v1.0 待实装,spec §7.16.5)
- [ ] 老师公告投稿 / 编辑 / 删除 / 回复管理面板(v1.0 待实装,spec §7.15.7)
- [ ] 出寮届审批 chain(pending list + approve/reject + 评论)
- [ ] 出寮者一覧 PC 端(事務室 + 1·2 寮 / 4 寮 分别表示,§7.8 + R4)
- [ ] 学生指导履历 / 事案录入(§7.9)
- [ ] 学生个人数据汇总 view(§7.10)
阶段 6 — iOS 学生 App 🔄 进行中(v0.8 + 之后多次未 bump 推进)
已完成(v0.8 close 5-02):
- [x] iOS 网络层完整建设(APIClient + KeychainService + Endpoints/ + NetworkModels)
- [x] AppStore 切真后端(login + applications + study)
- [x] iOS ↔ backend 字段对齐(F1-F5 + Q1 7 处失配修复)
- [x] Foundation 层 17 文件 1861 行(网络 / Keychain / Route / AppStore)
- [x] 5 大功能屏完整体(Auth / Home / Apply / MyPage / Schedule / StayList / Bus / Study / NfcScan / RollCallSheet)
- [x] 注册码 RegisterStep5(POST /accounts wire 通 + RegistrationDraft 累积 Step1-4 真字段)— 2026-05-04(v1.0)
- [x] 老师公告 列表/详情/回复 view(最小可工作版)— 2026-05-04(v1.0)
- [x] Apple Image Playground 集成(注册时 AI 头像生成,iOS 18.2+)
v0.8 之后推进(pending bump):
- [x] 2026-05-04 — 文件联动工具(pre-commit + sync-check.sh + 13 → 18 联动规则)
- [x] 2026-05-08 — Apply / MyPage v2 等扩展
- [x] 2026-05-11 — reviewer 后门修复(5-08 VPS CC seed.py 默默挑凭证翻车的教训落地)
- [ ] AI 摘要(Foundation Models, iOS 26)— v1.1
- [ ] 翻译(Translation framework, iOS 17.4+)— v1.1
- [ ] Push 通知(APNs)— v1.1
阶段 7 — Android 学生 App 🔄 进行中(v0.8 + 之后多次未 bump 推进)
已完成(v0.8 bootstrap 5-02):
- [x] Compose 工程框架从零搭建(21 → 23 个 .kt + 10 → 22 屏 UI)
- [x] 实装方针拍板:CC 主导逐屏对译 Compose(不派 sub agent)
- [x] 单 repo 收回 — 2026-05-06 退役独立 repo
otogi2025/Tomoshibi-Android,全部代码移入DMSD/03_dev/student_android/v1/
v0.8 之后推进(pending bump):
- [x] 5-08 → 5-19 — 屏数 10 → 22 持续扩展
- [ ] 注册码 RegisterStep5 镜像 iOS(v1.0 待实装)
- [ ] 老师公告 列表/详情/回复 view(v1.0 待实装)
- [ ] Push 通知(FCM)— v1.1
v0.8 之后未 bump 的累积推进(5-04 → 5-22)
| 日期 | 关键节点 |
|---|---|
| 2026-05-04 | 文件联动工具(pre-commit + sync-check.sh + 18 条规则代码化)+ 中文铁律加重 |
| 2026-05-08 | 硬件全定稿(PN532 V3 + LED + 喇叭 + 外壳)+ system_features 4-30 大重写 |
| 2026-05-10 | ac-radar skill 上线(全局 AC 素材实时捕获,跨项目 inbox) |
| 2026-05-11 | cc-comm-rules skill 立项(沟通规则)+ graphify 测试 + 术语表 HTML + reviewer 后门修复跨机器协作 |
| 2026-05-13 | 文件大整理(26 文件 rename / archive)+ project-overview skill 建立(630+ 文件清单) |
| 2026-05-14 | anti-ai-flavor skill 立项 + cc-comm-rules 规则升到 v0.5.0 |
| 2026-05-16 | 跨项目大修(SC26 / Tango / cc-project-template)+ AC 合格率评估 |
| 2026-05-19 | project-overview 大改造(9 处漂移修 + §0.1 重算 957 文件)+ 防漂 C 方案(hook 全覆盖 + 启动对账)+ post-edit-format.sh + check_overview_drift.sh |
| 2026-05-20+ | 131 条 bug findings 4 会话并行修复(主会话 + Fix-Bot 1/2/3) |
| 2026-05-21 | teacher_web/demo 整组 158 文件归档到 99_archive/ + Fix-Bot 4 effective_* 字段彻底删(spec 主体 + 字典三件套 + backend models + 新建 alembic 迁移) |
| 2026-05-22 | project-overview §0.1 再校准 957 → 980 + 加 系统bug专栏.md / codex_audit_prompt.md 引用 + Codex 第二轮全文件覆盖 audit(1003 文件 / 39 条 = 24 独立 + 13 复核 + 2 positive)+ session-coord 跨会话协作板(3 会话并行:主 + 点呼机 + iOS 修复) |
阶段 8 — 部署与试运行 ⬜ 未开始
- [ ] PostgreSQL 部署到 VPS
- [ ] FastAPI uvicorn + nginx + systemd
- [ ] iOS App Store 上架(Apple Developer Program 已付,99 USD/年)
- [ ] Android Google Play 上架
- [ ] 点呼机 4 台部署到宿舍
- [ ] keystore 备份(本地 Mac + 后端服务器加密 + 纸质密码)
1.7.6 项目里程碑(v0.4 → v0.8 + 之后)
4 月底到 5 月初的密集推进总览。详细 commit 历史 →
git log /
CHANGELOG.md。
| 版本 | 日期 | 主题 | 重点产出 |
|---|---|---|---|
| v0.4 - v0.5 | 2026-04-17 → 04-29 | RollCall spec 重写 + 项目审查 + 文档体系建立 | RollCall_Spec v0.2 字典三件套 + v0.3 主体重写 / 项目审查 backlog 87 条 / 单源真值 + 同步点清单 + pre-commit hook 三件套 |
| v0.6 | 2026-04-29 | 老师反馈 38 条受领 + 系统功能大重写 | 老师 LINE 38 条要件清单 + R1-R4 硬约束 / system_features.md 中文骨架大重写 / Demo 4-28 给宿舍管理员演示 + 4-29 口头同意采纳 |
| v0.7 | 2026-04-30 | 三轨 A+B+C 同日完成 38 条消化 | A 状态盘点 / B §9 拍板 / C 实装 brief 起草(backend / iOS / Web 各端 REQUIREMENTS / DESIGN_LOG)+ 帰省実物表 evidence 入手 |
| v0.8 | 2026-05-02 | 三端代码层全启动 | Android Compose bootstrap(21 .kt + 10 屏)/ iOS 网络层完整建设 + AppStore 切真后端 / teacher_web v1 TS+Vite+Zustand 升级 + 5 page / backend rollcall+study+teachers routers + Alembic / iOS↔backend 字段对齐 F1-F5+Q1 |
| v0.8 之后(pending bump) | 2026-05-03 → 05-04 | 注册码 + 公告 + 文件联动工具 | App Store 上架对策(学生注册码 6 桁 5 分钟有效)/ 老师公告功能(4 端,backend + iOS 完成)/ A+B 文件联动工具(pre-commit + sync-check.sh + 13 条规则代码化)/ 中文铁律加重(被骂 3 次后扩到规范文档) |
1.7.7 技术学习时间线
| 日期 | 学了什么 | 关键收获 |
|---|---|---|
| 2026-02 月 | 项目规格设计 | 学会如何定义系统需求、冻结范围、写规格文档 |
| 2026-03-10 | Git 基础 | 理解版本控制的意义,建立多设备同步流程 |
| 2026-03-11 | Python 变量、数据类型、条件判断 | 第一次写代码并运行 |
| 2026-03-11 | 前端 / 后端 / API / 数据库概念 | 理解整个系统的通信架构 |
| 2026-04-10 | NFC 与 NFD(Unicode normalization) | 跨平台开发的隐藏坑,错误信息可能是误导 |
| 2026-04-12 | NFC 原理(电磁感应 + 13.56MHz + UID) | NFC 不是黑科技,是高中物理的应用 |
| 2026-04-12 | iOS Core NFC 框架 + SwiftUI 基础 | 读卡核心逻辑 ~60 行 Swift |
| 2026-04-12 | Python nfcpy + pyttsx3 | Raspberry Pi 设备端代码 ~20 行 |
| 2026-04-13 | SemVer 语义化版本规范 | 版本号是给「发布」用的,不是每次 commit |
1.7.8 关键决策记录(索引)
详细前因后果见
05_logs/decision_log.md。
| 日期 | 决策 |
|---|---|
| 2026-02-12 | v0.1 规格冻结 |
| 2026-03-10 | 用 Git + GitHub 管理代码 |
| 2026-03-11 | 练习代码放 ~/dev/practice/,不放 DMSD |
| 2026-03-11 | 用 Claude Code 辅助开发 |
| 2026-04-12 | NFC 而非二维码(防作弊) |
| 2026-04-12 | 分阶段上线(Phase 1 卡 + Phase 2 App) |
| 2026-04-12 | 点呼机 = Raspberry Pi(不是 iPad) |
| 2026-04-12 | 语音播报防作弊设计 |
| 2026-04-13 | 版本号体系重置 v1.0 → v0.1 |
| 2026-04-19 | G2 决策:取消分阶段,v1.0 直接 iOS + Android + 卡 一次上线 |
| 2026-04-19 | 单源真值 + 同步点清单 + pre-commit hook 三件套确立(防止文档版本号漂移) |
| 2026-04-20 | 动态 NFC 贴纸 ST25DV16K(10 秒 nonce)+ Pi 4B 2GB × 4 采购拍板 |
| 2026-04-21 | 系统 / 产品名定为 Tomoshibi(灯火 / ともしび) |
| 2026-04-28 | Demo 4-28 给宿舍管理员演示(NFC → 后端 → iPad 座位变绿 + 语音播报) |
| 2026-04-29 | 管理员口头同意采纳系统;GitHub repo 首次 public |
| 2026-04-29 | 老师 LINE 反馈 38 条要件 + R1-R4 硬约束(邮件通知 / 老龄 UX 一本道 / 教师单独账号 / 1·2 寮 4 寮分别表示) |
| 2026-04-29 | 禁足阈值 ≥9 → ≥8 单源真值统一 |
| 2026-05-02 | Android 实装方针拍板:CC 主导逐屏对译 Compose(不派 sub agent) |
| 2026-05-03 | 学生注册码拍板(教师生成 6 桁数字、5 分钟有效)— App Store 上架对策 |
| 2026-05-03 | 老师公告功能拍板(Classroom 风、scope=all/male/female、学生回复全员互见) |
| 2026-05-03 | Apple Intelligence on-device AI 路线统一(Image Playground 头像 / Foundation Models 摘要 / Translation framework) |
| 2026-05-04 | A+B 文件联动工具拍板(pre-commit 内容检查 + bin/sync-check.sh 中途随时查) |
| 2026-05-04 | 中文铁律强化(覆盖范围扩到规范文档、被骂 3 次) |
1.7.9 问题解决记录(索引)
详细记录在
05_logs/problem_solving/。
| 日期 | 问题 | 类型 |
|---|---|---|
| 2026-03-10 | tar 打包报错「no files or directories specified」 | 命令行 |
| 2026-03-10 | scp 传文件缺少目标路径 | 命令行 |
| 2026-03-11 | Python NameError(变量未定义) | 编程 |
| 2026-03-11 | Python 布尔值必须大写 True / False | 编程 |
| 2026-04-10 | Git pull 失败:NFC vs NFD 跨平台编码差异 | Git / 跨平台 |
1.7.10 开发环境
2026-04-19 更新:VPS 已停用 for DMSD(itsuki 决定不再从学校 iPad 推进 DMSD 工作)。
当前只有家里 Mac 一台主机。
- 家里 Mac(
~/dev/DMSD)→ Claude Code + Xcode(iOS 开发)+ VS Code — 当前唯一 dev 环境 - GitHub
otogi2025/DMSD= 唯一远端真值,2026-04-29 起 public - 独立 repo:
otogi2025/Tomoshibi-iOS(iOS Swift 实装镜像)+otogi2025/Tomoshibi-Android(Android Compose)
1.7.11 当前待办
优先(短期)
- [ ] 填 4-10 dev_log 的 4 个【】占位符
- [ ] 填 reflection_2026-04-10 的 5 个【】占位符(已迁 iCloud
AC素材_成品/reflection/) - [ ] 回答
AC素材_成品/ac_入試准备/项目起源_真实观察.md里的 AC 起源问题(已迁 iCloud) - [ ] 继续 Python 学习(下一个:循环 + 列表)
中期
- [ ] .pages 文件转换为 Markdown(4 个文件)
- [ ] 删除 / 归档早期 throwaway iOS 代码
- [ ] 学习 Swift / SwiftUI 基础
- [ ] VPS 安装 PostgreSQL
- [ ] 搭建 FastAPI 后端骨架
长期
- [ ] 采购 Raspberry Pi + NFC 模块,搭建第一台点呼机原型
- [ ] 建
README.md(开始写代码时) - [ ] 和真人讨论项目(填 iCloud
AC素材_成品/interview_log/) - [ ] 月度回顾(每月最后一周,填 iCloud
AC素材_成品/monthly_review/)
1.7.12 仓库结构地图(顶级目录骨架)
2026-05-21 重写:原静态结构图严重过期。
真值已迁 →
.claude/skills/project-overview/SKILL.md
(630+ 文件清单 + 每个文件作用 + 状态 + AC 价值,957 文件全统计 2026-05-16)。
本节只列顶级目录骨架(防漂),详细看上面 skill。
| 顶级目录 | 干嘛 | 文件数(截至 2026-05-16) |
|---|---|---|
| 根级 6 文件 | CLAUDE / README / CHANGELOG / LICENSE / .gitignore / .graphifyignore | 6 |
00_admin/ | 项目管理(WIP / TODO / progress_overview / hooks / 文档同步点清单) | 18 |
01_specs/ | 规格文档(rollcall 字典三件套 + 主体) | 13 |
02_design/ | 设计文档(system_features / hardware / flow) | 3 |
03_dev/ | 5 端代码(backend / teacher_web / student_ios / student_android / rollcall_device) | 546 |
04_ops/ | 运维 | 2 |
05_logs/ | 开发 log(raw / dev_log / problem_solving / decision_log / learning_path / project_evolution) | 75 |
06_assets/ | 4 icon + 术语表 + 实样 | 7 |
99_archive/ | 早期归档 | 273 |
.claude/ | CC 配置 + 7 skill | 9+ |
bin/ | 脚本(sync-check / check_overview_drift / create_local_dev_symlink) | 3 |
docs/ | Matt Pocock 外部 skill 适配配置 | 3 |
| 总计 | 957 |
第 2 章 — 基础通用知识(5 端都要)
这一章是「不学就根本理解不了 5 端在干嘛」的底层知识。不限语言,5
端都用。每个条目都已经在 DMSD 里实装过,不是抽象学。
2.1 命令行 / 终端基础
cd / ls / cat / grep / find
cd = change directory 切目录 / ls = list 列文件 / cat = 看文件内容 /
grep = 找匹配文字 / find = 找文件。Mac 终端(Terminal.app)和 zsh(Mac
默认 shell 命令行解释器)的基本操作。
DMSD 里日常碰:跑
bash bin/sync-check.sh 跑联动检查 / 用
git status 看改动 / 用
find . -name "*.md" 找文档
AC 故事:能在面接现场用终端打开项目目录展示文件 =
加分项
2.2 Git 版本控制
commit / branch / push / pull / log
Git = 代码版本管理工具。commit = 保存一次改动快照 / branch =
分支(同时开发不同功能不互相干扰)/ push = 推到远程仓库 / pull =
拉远程最新 / log = 看历史。DMSD 截至 v0.8 已有 200+ commit。
DMSD 里日常碰:每次会话结束 CC 起草 commit message(commit 说明文)让
itsuki 拍板。pre-commit hook(提交前自动跑的脚本)已在
00_admin/hooks/pre-commit
AC 故事:评委可能查 GitHub
otogi2025/DMSD 看 commit 历史 → 200+ commit
本身就是「持续追踪」证据
2.3 文件路径 / 目录结构
绝对路径 vs 相对路径 / 隐藏文件 / 软链接
绝对路径 = 从根开始(
/Users/kurekoduki/dev/DMSD/)/
相对路径 = 从当前位置出发(./03_dev/)/ 隐藏文件 =
点开头(.claude/)/ 软链接 = 一个文件指向另一个的快捷方式
DMSD 里:
.claude/skills/ 是隐藏目录 / 各种相对路径在脚本里
/ Cloud iCloud 路径
~/Library/Mobile Documents/com~apple~CloudDocs/ 是 Mac 上
iCloud 的真实位置
2.4 JSON / YAML / Markdown
3 种文本格式
JSON = JavaScript Object Notation,对象数据格式,API 数据传输标准(DMSD
backend 返回的就是 JSON)
YAML = YAML Ain't Markup Language,缩进式配置格式(hooks 配置用 YAML)
Markdown = 轻量文档格式(DMSD 几乎所有
YAML = YAML Ain't Markup Language,缩进式配置格式(hooks 配置用 YAML)
Markdown = 轻量文档格式(DMSD 几乎所有
.md 文件都是)
DMSD 里:API 返回 JSON / hooks 配置 / 所有 spec + design + log 都是
Markdown
2.5 HTTP / API 客户端-服务器架构
客户端怎么跟服务器说话
HTTP = HyperText Transfer Protocol
超文本传输协议(网络上客户端和服务器通信的规则)
GET / POST / PUT / DELETE = 4 种 HTTP 请求方法(GET 取数据 / POST 创建 / PUT 更新 / DELETE 删除)
API = Application Programming Interface 应用程序接口(服务器对外开放的「能让客户端调用的功能列表」)
REST = Representational State Transfer 表现层状态转移(API 设计风格的一种,DMSD 用这个)
状态码 = 200 OK / 401 没授权 / 404 没找到 / 500 服务器爆炸
GET / POST / PUT / DELETE = 4 种 HTTP 请求方法(GET 取数据 / POST 创建 / PUT 更新 / DELETE 删除)
API = Application Programming Interface 应用程序接口(服务器对外开放的「能让客户端调用的功能列表」)
REST = Representational State Transfer 表现层状态转移(API 设计风格的一种,DMSD 用这个)
状态码 = 200 OK / 401 没授权 / 404 没找到 / 500 服务器爆炸
DMSD 里:iOS / Android / Web 3 个客户端都通过 HTTP 跟 backend
说话。backend 在
03_dev/backend/routers/ 下定义 API
端点(API endpoint = 一个具体的 URL 路径)
AC 故事:评委问「客户端怎么获取数据」→ 能从 HTTP
请求讲到 backend route 讲到数据库查询
2.6 数据库基础(PostgreSQL)
表 / 字段 / 主键 / 外键 / 索引 / 查询
PostgreSQL = Postgres,一个免费开源的关系型数据库(DMSD
用这个存所有数据)
表 (table) = 像 Excel 的工作表,每行一条数据
字段 (column) = 表的列,比如 student_id / name / dorm_room
主键 (primary key) = 唯一标识一行的字段(通常是 id)
外键 (foreign key) = 指向另一个表主键的字段(学生表里的 dorm_id 指向宿舍表的 id)
索引 (index) = 给字段加速查找的数据结构
SQL = Structured Query Language 结构化查询语言(跟数据库说话用的语言)
表 (table) = 像 Excel 的工作表,每行一条数据
字段 (column) = 表的列,比如 student_id / name / dorm_room
主键 (primary key) = 唯一标识一行的字段(通常是 id)
外键 (foreign key) = 指向另一个表主键的字段(学生表里的 dorm_id 指向宿舍表的 id)
索引 (index) = 给字段加速查找的数据结构
SQL = Structured Query Language 结构化查询语言(跟数据库说话用的语言)
DMSD 里:
03_dev/backend/models.py 定义所有表 /
alembic/versions/ 下是迁移脚本(migration =
数据库表结构变更记录)
AC 故事:评委问「点呼记录怎么存」→
能从表设计讲到字段类型讲到查询性能
2.7 安全基础(hash / 加密 / 签名 / nonce)
为什么 DMSD 防作弊用这些
hash = 哈希,把任意长度数据压成固定长度指纹(密码不直接存,存哈希)
加密 (encryption) = 把数据变成只有持密钥的人能读懂的乱码
签名 (signature) = 证明「这条数据是某人发的、没被改过」
nonce = number used once 一次性随机数(防重放攻击 — 攻击者不能录下一次通信再发一遍)
ECDSA = Elliptic Curve Digital Signature Algorithm 椭圆曲线数字签名算法(DMSD 防代签到用这个)
加密 (encryption) = 把数据变成只有持密钥的人能读懂的乱码
签名 (signature) = 证明「这条数据是某人发的、没被改过」
nonce = number used once 一次性随机数(防重放攻击 — 攻击者不能录下一次通信再发一遍)
ECDSA = Elliptic Curve Digital Signature Algorithm 椭圆曲线数字签名算法(DMSD 防代签到用这个)
DMSD 里:NFC 卡 ST25DV16K 用动态 nonce 每 10 秒刷新 / 学生注册码用 hash
验证 / 老师权限用 ECDSA 签名
AC 故事:评委问「怎么防代签到」→ 能从物理 NFC
距离限制讲到 nonce 防重放讲到 ECDSA 签名 = 完整的防御链 = 极强加分
第 3 章 — Python(backend + 点呼机,2 端用)
Python 优先级最高的原因:DMSD 5 端里 2 端用(backend +
点呼机),学一次能看懂 2 端代码,投入产出比(ROI = Return on
Investment)最高。
3.1 Python 基础语法
展开 6 个子条目
变量 / 类型 / 字符串 / 数字 / 布尔
DMSD
03_dev/backend/main.py 第 1 行开始就能看到
列表 / 字典 / 元组 / 集合
list 有序可变 / dict 键值对 / tuple 有序不可变 / set 无序去重。Python
4 种基本容器。
backend 里 API 返回的数据结构基本都是 dict 嵌套 list
if / for / while / try-except
控制流 + 异常处理。except = 捕获错误不让程序崩溃。
函数 / 参数 / 返回值 / 默认值 / 关键字参数
类 / 对象 / 继承 / 方法
面向对象编程(OOP = Object-Oriented Programming)入门。SQLAlchemy 的
model 就是类。
模块 / 包 / import / __init__.py
模块 = 一个
.py 文件 / 包 = 装多个模块的目录。backend
代码分了 routers/ services/ models/ schemas/ 几个包。
3.2 FastAPI(backend 用的网络框架)
FastAPI = Python 写后端 API 的框架
框架 (framework) = 别人写好的代码骨架,自己只填业务逻辑
Route = 路由,一个 URL 对应一个函数(GET /students 调 list_students() 函数)
依赖注入 (Dependency Injection) = 函数需要的东西(数据库连接 / 当前用户)让框架自动塞进来
OpenAPI = 自动生成的 API 文档(FastAPI 跑起来自带
Route = 路由,一个 URL 对应一个函数(GET /students 调 list_students() 函数)
依赖注入 (Dependency Injection) = 函数需要的东西(数据库连接 / 当前用户)让框架自动塞进来
OpenAPI = 自动生成的 API 文档(FastAPI 跑起来自带
/docs 路径能看到所有 API)
DMSD
03_dev/backend/routers/ 下所有 .py 文件 /
03_dev/backend/main.py 装配
AC 故事:评委问「为什么选 FastAPI 不选 Django /
Flask」→ 答「自动生成 OpenAPI 文档对 5 端联动有用 / 性能比 Flask 高 / 比
Django 轻量适合 demo 阶段」
3.3 SQLAlchemy(数据库 ORM)
用 Python 类操作数据库表
ORM = Object-Relational Mapping 对象关系映射 — 让 Python
类对应数据库表,不用直接写 SQL。
Model = 一个 Python 类对应一张表(
Session = 一次数据库会话,做完一组操作 commit(提交)或 rollback(回滚)
Model = 一个 Python 类对应一张表(
class Student(Base))Session = 一次数据库会话,做完一组操作 commit(提交)或 rollback(回滚)
DMSD
03_dev/backend/models.py — 5
端里所有数据库表的定义都在这一个文件
3.4 Pydantic(数据校验)
API 输入输出的「类型守门员」
Pydantic = Python 数据校验库 — 客户端发什么数据过来 /
服务器返什么数据出去,都用 Pydantic
schema(模式)定义。如果字段类型不对自动报错。
Schema = 模式 / 数据形状定义 — 跟 model 不同:model 是数据库表,schema 是 API 进出口
Schema = 模式 / 数据形状定义 — 跟 model 不同:model 是数据库表,schema 是 API 进出口
DMSD
03_dev/backend/schemas.py — 跟 models.py 配套
AC 故事:评委问「客户端发错数据怎么办」→ 答「Pydantic
自动拒绝并返 422 错误(HTTP 状态码 = 数据格式错)」
3.5 Alembic(数据库迁移)
改表结构不丢数据的工具
Alembic = 跟 SQLAlchemy 配套的数据库迁移工具
迁移 (migration) = 改表结构的脚本(加字段 / 删字段 / 改类型),有版本号能回滚
DMSD 已有 30+ 个 migration 脚本
迁移 (migration) = 改表结构的脚本(加字段 / 删字段 / 改类型),有版本号能回滚
DMSD 已有 30+ 个 migration 脚本
DMSD
03_dev/backend/alembic/versions/ 目录
3.6 nfcpy(点呼机用的 NFC 库)
Python 读 NFC 卡的库
点呼机端用这个库通过 PN532 模块(NFC 读写模块)读 NTAG215 卡(NFC
卡的一种型号)和 ST25DV16K(动态 NFC 卡)。
DMSD
03_dev/rollcall_device/src/ 下
第 4 章 — Swift + SwiftUI(iOS 学生端 / AC demo 重点)
Swift 优先级仅次于 Python — 因为 iOS 是 itsuki
给宿舍管理员演示用的端(4-28 demo 就是 iPhone)。AC 面接如果带 iPhone
当场演示,Swift 代码必须能讲清楚。
4.1 Swift 语法基础
展开 6 个子条目
let / var / Optional / 类型推断
let = 常量(不能改)/ var = 变量
Optional = 可空类型 — Swift 区分「这个值可能为空」和「这个值一定有」,用
Optional = 可空类型 — Swift 区分「这个值可能为空」和「这个值一定有」,用
? 表示可空。零基础容易翻车的语法。
struct / class / enum
struct = 结构体(值类型,赋值是复制)/ class =
类(引用类型,赋值是同一份)/ enum = 枚举(有限取值集合)。SwiftUI 里
View 几乎都是 struct。
func / 闭包 / 高阶函数(map / filter / reduce)
闭包 (closure) = 匿名函数,可以传给别的函数。Swift 里到处都是。
protocol / extension
protocol = 协议,定义「实现我的类型必须有这些方法」/ extension =
扩展,给已有类型加新方法。Swift 的「面向协议编程」核心。
async / await(异步编程)
网络请求要等几百毫秒,不能堵住 UI。async 函数表示「我会异步」,await
表示「在这里等结果」。Swift 5.5+ 的现代异步语法。
Codable(JSON 解码)
让 Swift 结构体能自动把 JSON 转成 struct 实例(解码 /
decode)或反过来(编码 / encode)。DMSD iOS 端跟 backend
通信全靠这个。
4.2 SwiftUI 声明式 UI
SwiftUI = Apple 的现代 UI 框架
声明式 (declarative) = 写「UI 长什么样子」而不是「怎么一步步画出来」
View 协议 = 所有 UI 元素都实现 View 协议
组合 = 复杂 UI 由简单 View 拼起来
跟传统的命令式 UIKit 是两套思路
View 协议 = 所有 UI 元素都实现 View 协议
组合 = 复杂 UI 由简单 View 拼起来
跟传统的命令式 UIKit 是两套思路
DMSD
03_dev/student_ios/ 下所有 .swift 文件 /
Foundation/ 下是基础 component
4.3 状态管理(@State / @Binding / @ObservedObject / @StateObject / @EnvironmentObject)
SwiftUI 5 个数据流注解
@State = 本地状态(这个 View 内部用)
@Binding = 子 View 拿到父 View 的状态引用
@ObservedObject = 监听外部对象的变化
@StateObject = 自己创建并持有外部对象
@EnvironmentObject = 全局共享对象(不用层层传)
@Binding = 子 View 拿到父 View 的状态引用
@ObservedObject = 监听外部对象的变化
@StateObject = 自己创建并持有外部对象
@EnvironmentObject = 全局共享对象(不用层层传)
DMSD iOS 端到处都是。零基础最容易翻车的点 —
错用导致状态不更新或者无限循环。
4.4 导航(NavigationStack / Sheet / Alert)
屏幕之间跳转
DMSD
03_dev/student_ios/Route.swift +
RootView.swift 是导航中枢
4.5 Core NFC(iOS 系统 NFC 框架)
iPhone 读 NFC 卡 / 触发 URL
Core NFC = iOS 系统层提供的 NFC 操作接口
BTR = Background Tag Reading 背景标签读取(不用打开 App,靠近 NFC 就触发)
Universal Link = 通用链接(特定 URL 不打开 Safari 而是直接跳 App)
AASA = Apple App Site Association(Universal Link 配置文件)
BTR = Background Tag Reading 背景标签读取(不用打开 App,靠近 NFC 就触发)
Universal Link = 通用链接(特定 URL 不打开 Safari 而是直接跳 App)
AASA = Apple App Site Association(Universal Link 配置文件)
DMSD iOS 端点呼相关代码
AC 故事:评委问「学生怎么签到」→ 「碰 NFC 卡 → BTR 触发
Universal Link → 跳 App 自动签到 → 后端记录」全链路能讲
4.6 URLSession(网络请求)
iOS 发 HTTP 请求的系统库
DMSD
03_dev/student_ios/Endpoints/ 下各个
*API.swift 文件
第 5 章 — Kotlin + Compose(Android 学生端)
Kotlin 跟 Swift 概念高度相似(都是现代静态语言 + 声明式 UI),学完 Swift
再学 Kotlin 时间能减半。Android 端学习优先级排第三。
5.1 Kotlin 跟 Swift 的对应关系
| Swift | Kotlin | 说明 |
|---|---|---|
| let / var | val / var | 常量 / 变量 |
Optional (?) |
Nullable (?) |
可空类型 |
| struct | data class | 数据类 |
| protocol | interface | 协议 / 接口 |
| extension | extension function | 给已有类型加方法 |
| async / await | suspend / coroutine | 异步编程 |
| Codable | kotlinx.serialization | JSON 解码 |
5.2 Jetpack Compose(Android 声明式 UI)
SwiftUI 的 Android 对应物
Compose 函数 (@Composable) = SwiftUI 的 View
remember / mutableStateOf = SwiftUI 的 @State
ViewModel + StateFlow = SwiftUI 的 @StateObject + ObservableObject
remember / mutableStateOf = SwiftUI 的 @State
ViewModel + StateFlow = SwiftUI 的 @StateObject + ObservableObject
DMSD
03_dev/student_android/ 下 10+ 屏 Compose 代码
5.3 Ktor / Retrofit(Android 网络库)
Android 发 HTTP 请求
iOS 用 URLSession 系统库,Android 通常用第三方库 Ktor 或 Retrofit(DMSD
用哪个看
03_dev/student_android/ build.gradle)
5.4 Android NFC API
Android 读 NFC
Android 对 NFC 支持比 iOS 早 + 更开放(不用配置 AASA),但要处理
Intent(Android 应用间消息机制)。
第 6 章 — TypeScript + Vue(老师 Web 端)
老师 Web 端使用频率最低 —
在校老师电脑上跑,不像学生手机端那么个人化。优先级排第 4。但 AC
面接如果问「为什么不全用 App」要能解释。
6.1 TypeScript 基础
TypeScript = JavaScript + 类型系统
JavaScript = 浏览器跑的脚本语言(动态弱类型,写错了运行时才知道)
TypeScript = JS 加类型检查 — 写代码时编辑器就报错 — 大型项目几乎都用 TS
interface / type alias = 定义数据形状
泛型 (generics) = 参数化类型
TypeScript = JS 加类型检查 — 写代码时编辑器就报错 — 大型项目几乎都用 TS
interface / type alias = 定义数据形状
泛型 (generics) = 参数化类型
6.2 Vue 3 Composition API
Vue = 前端框架
Vue = Web 前端框架(跟 React / Angular 并列三大)
Composition API = Vue 3 的新写法(跟 React Hooks 类似思路)
ref / reactive = 响应式数据
computed / watch = 计算属性 / 监听
Single File Component =
Composition API = Vue 3 的新写法(跟 React Hooks 类似思路)
ref / reactive = 响应式数据
computed / watch = 计算属性 / 监听
Single File Component =
.vue 文件里同时写 template(模板)+
script(逻辑)+ style(样式)
DMSD
03_dev/teacher_web/src/ 下 .vue 文件
6.3 Vite(前端打包工具)
Vite = 现代前端开发服务器
Vite = 法语「快」/ 前端项目本地开发 + 打包工具
Hot Module Replacement (HMR) = 改代码不用刷新页面,浏览器自动更新
跟老的 Webpack 比启动快 10 倍
Hot Module Replacement (HMR) = 改代码不用刷新页面,浏览器自动更新
跟老的 Webpack 比启动快 10 倍
6.4 Pinia(Vue 状态管理)
跨组件共享数据
Pinia = Vue 官方推荐的状态管理库(替代老的
Vuex)。多个组件要共享数据时不用一层层传 props(属性),存到 Pinia
store。
第 7 章 — 硬件 + 嵌入式(点呼机端)
硬件层是 DMSD 区别于纯 App 项目的「实物作品」证据 — AC 面接评委看到 itsuki
自己组装的 Pi + NFC 模块 = 极强加分。这一章学的不是写代码,是搞懂硬件原理
+ 能讲清楚每个零件为什么选。
7.1 NFC 物理原理
电磁感应是怎么传数据的
NFC = Near Field Communication 近场通信 — 工作距离 4cm 以内
原理 = 13.56 MHz 电磁场感应(高中物理课的法拉第电磁感应定律的应用)
被动卡 (passive tag) = 自己没电,被读卡器的磁场激活 — NTAG215 就是被动卡
动态卡 (dynamic tag) = 有微控制器能改内容 — ST25DV16K 就是动态卡
原理 = 13.56 MHz 电磁场感应(高中物理课的法拉第电磁感应定律的应用)
被动卡 (passive tag) = 自己没电,被读卡器的磁场激活 — NTAG215 就是被动卡
动态卡 (dynamic tag) = 有微控制器能改内容 — ST25DV16K 就是动态卡
02_design/hardware_design.md +
05_logs/learning_path.md 2026-04-12 条目已写
AC 故事:评委问「为什么 4cm 限制是优势」→
「电磁场强度随距离立方衰减 → 远了根本耦合不上 → 物理上必须靠近 →
防作弊」
7.2 NFC 卡型号对比(NTAG215 / ST25DV16K)
为什么 DMSD 选 ST25DV16K
NTAG215 = NXP 公司的被动卡 — 内容写死,便宜(约 5 元 / 张)
ST25DV16K = STMicroelectronics 公司的动态卡 — 内容能被微控制器实时改(DMSD 每 10 秒刷新 nonce)— 贵(约 25 元 / 张)
选 ST25DV16K = 防 URL 复制攻击(NTAG215 内容固定,攻击者抄一份内容贴别处也能签到)
ST25DV16K = STMicroelectronics 公司的动态卡 — 内容能被微控制器实时改(DMSD 每 10 秒刷新 nonce)— 贵(约 25 元 / 张)
选 ST25DV16K = 防 URL 复制攻击(NTAG215 内容固定,攻击者抄一份内容贴别处也能签到)
02_design/hardware_design.md §卡选型决策
7.3 PN532 模块
点呼机用的 NFC 读卡模块
PN532 = NXP 公司的 NFC 收发芯片
跟 Pi 的连接接口 = I2C / SPI / UART 3 种(DMSD 选 V3 版本 — 接线方式见硬件设计)
跟 nfcpy 库配合在 Python 里读卡
跟 Pi 的连接接口 = I2C / SPI / UART 3 种(DMSD 选 V3 版本 — 接线方式见硬件设计)
跟 nfcpy 库配合在 Python 里读卡
02_design/hardware_design.md +
03_dev/rollcall_device/
7.4 树莓派 GPIO + 外设
Raspberry Pi 3A+ 跟外设接线
Raspberry Pi (树莓派) = 信用卡大小的微型电脑,跑 Linux(DMSD 用 3A+
型号)
GPIO = General Purpose Input / Output 通用输入输出针脚 — Pi 上 40 个针脚能接 LED / 喇叭 / 模块
DMSD 点呼机外设 = PN532 NFC 模块 + LED 灯(签到成功显示绿)+ 喇叭(日语播报「○○ さん おかえりなさい」)
GPIO = General Purpose Input / Output 通用输入输出针脚 — Pi 上 40 个针脚能接 LED / 喇叭 / 模块
DMSD 点呼机外设 = PN532 NFC 模块 + LED 灯(签到成功显示绿)+ 喇叭(日语播报「○○ さん おかえりなさい」)
02_design/hardware_design.md §接线 GPIO + 模块选型
7.5 防作弊机制(nonce + ECDSA)
3 层防御
第 1 层 (物理) = NFC 4cm 距离限制,远程攻击不了
第 2 层 (动态) = ST25DV16K 每 10 秒刷新 nonce — 录下一次 URL 再发就过期了
第 3 层 (签名) = ECDSA 椭圆曲线签名 — 服务器验证「这个 nonce 是我发的」攻击者伪造不出来
第 2 层 (动态) = ST25DV16K 每 10 秒刷新 nonce — 录下一次 URL 再发就过期了
第 3 层 (签名) = ECDSA 椭圆曲线签名 — 服务器验证「这个 nonce 是我发的」攻击者伪造不出来
02_design/system_features.md §防作弊设计 +
03_dev/backend/services/ 下签名验证代码
AC 故事:评委问「为什么 3 层不是 1 层」→
「单层都有可能被绕(物理近距离也能用强磁场放大 / nonce 在硬件被破解 /
签名密钥泄露)→ 3 层叠加任何 1 层守住就安全」= 防御深度的思考 = 极强加分
🆕 2026-05-28 扩展:点呼机深度知识包(7.6 - 7.16)
下面从「整体构造 → 配件清单 → 工作原理 → 各部件深度 → 关键概念 → 失败模式」 6 层把点呼机讲到能上 AC 答辩的颗粒度。这一段是面接评委问「你自己组装的这台盒子里面到底是什么」时的弹药库。
下面从「整体构造 → 配件清单 → 工作原理 → 各部件深度 → 关键概念 → 失败模式」 6 层把点呼机讲到能上 AC 答辩的颗粒度。这一段是面接评委问「你自己组装的这台盒子里面到底是什么」时的弹药库。
7.6 整体构造与设计原则
点呼机 = 一台微型电脑 + 几个模块的盒子
点呼机是 Tomoshibi 系统 5 端中的一端,4 台部署在宿舍楼层走廊,
干一件事:让学生回宿舍时签到,把签到数据发给后端。
核心设计原则 — thin client / thick server(瘦客户端 / 厚服务器):
核心设计原则 — thin client / thick server(瘦客户端 / 厚服务器):
- 点呼机只负责搬运数据(读卡、发网络请求、声光反馈)
- 所有业务判断(是否准时 / 是否缺席 / 扣几分)全在后端服务器,
以服务器时间
server_now(JST 日本标准时)为准 - 点呼机本身不做任何「判断对错」的逻辑
Raspberry Pi 3 Model A+(主板 / 大脑) ├─ PN532 读卡器模块 → 读学生 NFC 卡(路径 A) ├─ ST25DV16K 贴纸模块 → 给手机碰一下的动态贴纸(路径 B) ├─ LED 状态灯(4 色) → 蓝待机 / 绿成功 / 红失败 / 白启动 ├─ USB 小喇叭 → 日语播报学生姓名 ├─ 散热风扇 → 24×7 运行散热 └─ micro-USB 电源 → 墙插供电
02_design/hardware_design.md(硬件选型单源真值)+
03_dev/rollcall_device/ROLLCALL_DEVICE_DESIGN_LOG.md
AC 故事:评委问「这台盒子是什么」→
「Raspberry Pi 微型电脑 + 5 个外设模块,只搬运数据不做判断 —
所有业务逻辑都在服务器,硬件端尽可能简单 = 故障率低、好维护、单台坏了不影响整体」=
瘦客户端架构思想的实战。
7.7 完整配件清单(11 项 + 单价 + 渠道)
方案 A 首单 1 台演示机 — 日本本地采购
首单合计约 19,800 日元。部署 4 台总计约 56,600 日元。
| # | 部件 | 型号 / 规格 | 单价 (¥) | 渠道 | 接口 |
|---|---|---|---|---|---|
| 1 | 主板 | Raspberry Pi 3 Model A+(512MB / 双频 WiFi / 1× USB / 40-pin GPIO / 3.5mm 音频) | 5,580 | 秋月電子 (114878) | — |
| 2 | 电源 | micro-USB 5V 3A AD-K50P300 | 1,100 | 秋月電子 (112001) | micro-USB |
| 3 | 读卡器 | PN532 V3 红板(3.3V/5V 自适应 / SPI/I²C/UART) | 约 1,100 | Amazon JP(Hailege 套件) | SPI(推荐) |
| 4 | 动态贴纸 | ST25DV16K(Adafruit 4701 / STEMMA QT / 16 Kbit)× 5(4 部署 + 1 备用) | 968 × 5 = 4,840 | Switch Science (7903) | I²C |
| 5 | 学生卡 | NTAG215 空白白卡 10 枚装(86×54mm) | 约 1,500 | Amazon JP | — |
| 6 | 状态灯 | 5mm LED 红/绿/蓝/白各 1 + 220Ω 抵抗 × 4 | 约 100 | 秋月電子(绿 OSPG5111A / 112117) | 数字 GPIO |
| 7 | 散热 | 5V 30×30×7mm 静音风扇 ⚠️ 必须 5V 不是 12V | 约 800 | Amazon JP | 5V 电源脚 |
| 8 | 喇叭 | USB 取电 + 3.5mm 音频输入小音响 ⚠️ 不要买 USB DAC 型 | 约 1,300 | Amazon JP | USB + 3.5mm |
| 9 | 面包板 | 170 孔迷你面包板(BB-601 / SJB-17WH) | 150 ~ 439 | 秋月電子 / Sunhayato | — |
| 10 | 接线 | 杜邦线 40P 母-母 | 约 250 | 秋月電子 (g115868) | — |
| 11 | 转接线 ⚠️ | STEMMA QT 转杜邦公头转接线(ST25DV 必需) | 约 200 | Amazon / Switch Science | — |
砍掉的:外壳(暂不买)/ microSD 卡(已有)
正式部署升级项:学生卡 NTAG215 → NTAG424 DNA(防克隆,约 200-400 日元/张 × 100+ 张)
正式部署升级项:学生卡 NTAG215 → NTAG424 DNA(防克隆,约 200-400 日元/张 × 100+ 张)
02_design/hardware_design.md §配件单(单源真值)
7.8 两条签到路径(工作原理)
路径 A — 刷 NFC 卡(没手机 / 主力方式)
学生把 NTAG215 卡放到点呼机 PN532 读卡器上 → PN532 读出卡的 UID(7 字节唯一编号) → 点呼机通过 WiFi 发 HTTP POST:UID + 点呼机编号 → 后端 → 后端查 UID 绑定的学生账户 + 判定是否准时 → 后端推 WebSocket 消息给老师端,座位实时变绿 → 后端回点呼机:成功 → 绿灯 + 喇叭播报「○○ さん、お帰りなさい」
路径 B — 手机碰一下(动态贴纸防代刷)
点呼机 Python 程序每 10 秒(仅在点呼时间窗内):
向后端请求新 nonce(10 秒时效的一次性随机码) → 拼 NDEF URL:https://.../checkin?device=DEV001&nonce=XXX → 通过 I²C 把 URL 写进 ST25DV16K 的 EEPROM 学生手机(iPhone/Android)碰一下贴纸 → 手机 NFC 读出贴纸里的 URL → 触发 Universal Link 打开学生 App → App 调签到 API(带 nonce) → 后端验证 nonce 是否在 10 秒有效期内 → 完成签到路径 B 防代刷原理:贴纸里的 URL 每 10 秒变一次。 学生想复制 URL 发给同学代签 → 10 秒后那个 URL 就失效了。
AC 故事:评委问「为什么不用静态 NFC 贴纸」→
「静态贴纸 URL 不变,学生抄一份发到群里就能远程代签 →
ST25DV16K 动态贴纸每 10 秒换一次 URL → 复制行为没意义」=
从攻击者视角设计防御 = 安全工程思维。
点呼机本机 6 项职责
- 读 PN532 上的 NFC 卡 UID(路径 A)
- 通过 I²C 写 ST25DV16K 的 NDEF URL(路径 B 刷新 nonce)
- HTTP POST 签到数据到后端
- WebSocket 订阅后端播报指令
- 播放日语语音(pyttsx3 / OpenJTalk → 3.5mm 喇叭)
- 点亮 LED 状态灯
7.9 Raspberry Pi 3 Model A+(主板深度)
为什么选 3A+ 不选 4B / Zero / ESP32
规格:4 核 1.4GHz CPU / 512MB 内存(紧但够)/ 双频 WiFi /
1× USB 2.0 / 40 针 GPIO / 3.5mm 模拟音频口 / micro-USB 供电。
选型对比:
系统 ~100MB + Python 程序 ~50MB + 语音引擎 ~30MB + 驱动 ~50MB + 缓存 ~100MB ≈ 330MB,余约 180MB。
优化手段:关 swap 改 zram(内存压缩)/ GPU 内存设 16-32MB / 不在本机跑 VOICEVOX(要 2GB)。
headless 部署:不插键盘鼠标显示器,全程 SSH 远程登录调试 (因为 USB 口被喇叭占了,没法插键鼠 hub)。
选型对比:
- vs Pi 4B:4B 性能过剩(点呼机是瘦客户端用不到); 3A+ 是「最便宜含 3.5mm 音频口」的官方 Pi
- vs Pi Zero:Zero 无 3.5mm 音频口 → 没法直接接喇叭
- vs ESP32:跑不了完整 Python + 本地日语语音合成
系统 ~100MB + Python 程序 ~50MB + 语音引擎 ~30MB + 驱动 ~50MB + 缓存 ~100MB ≈ 330MB,余约 180MB。
优化手段:关 swap 改 zram(内存压缩)/ GPU 内存设 16-32MB / 不在本机跑 VOICEVOX(要 2GB)。
headless 部署:不插键盘鼠标显示器,全程 SSH 远程登录调试 (因为 USB 口被喇叭占了,没法插键鼠 hub)。
AC 故事:评委问「为什么选这块 Pi」→
「3A+ 是最便宜的同时含 3.5mm 模拟音频口的官方 Pi —
瘦客户端用不到 4B 的性能,Zero 没音频口,ESP32 跑不了 Python +
本地日语 TTS。这是按需求倒推选型,不是越贵越好」。
7.10 PN532 读卡器(深度)
为什么选 SPI 不走 I²C / 为什么不选 RC522
PN532 = NXP 公司出品的 NFC 读卡器界事实标准芯片。
读 13.56MHz / ISO 14443A 标准的卡(NTAG215 学生卡属于这类)。
V3 红板支持 SPI / I²C / UART 三种接口,板上跳线切换。
接口选 SPI(推荐)的 4 个原因:
不选 RC522 的原因:RC522 不支持 NFC 标签写入 / P2P, 跟项目(要写动态 nonce 到 ST25DV)不兼容。
接口选 SPI(推荐)的 4 个原因:
- I²C 总线冲突:ST25DV 已占了 I²C 总线,PN532 再走 I²C 容易总线锁死 → 一锁死整机 NFC 全停只能重启
- 踩坑多:PN532 走 I²C 在 Pi 上历史问题多
- 主流库支持:SPI 模式主流 Python 库支持更完整
- 教程丰富:新手教程基本都讲 SPI 接法
不选 RC522 的原因:RC522 不支持 NFC 标签写入 / P2P, 跟项目(要写动态 nonce 到 ST25DV)不兼容。
AC 故事:评委问「PN532 三种接口为什么选 SPI」→
「I²C 总线已经被 ST25DV 占用,两个 NFC 芯片走同一根 I²C 容易锁死,
一锁死整机得重启 → 让两个 NFC 子系统物理隔离在不同总线上 = 故障隔离」=
系统设计的容错思想。
7.11 ST25DV16K 动态贴纸(深度)
双接口 EEPROM + 寿命算法 + Mailbox 模式
ST25DV16K = 一种「双接口 EEPROM」:
一边手机能当 NFC 贴纸读(ISO 15693 / NFC Type 5),
一边点呼机能通过 I²C 写。16 Kbit = 2KB 容量(NDEF URL 约 80 字节,绰绰有余)。
EEPROM 擦写寿命(关键参数):
结论:nonce 刷新必须限定在点呼时间窗内执行,不能全天候跑。
为什么不用静态 NTAG215 当贴纸: 静态贴纸 URL 不变 → 学生复制后永久有效 → 代签漏洞。 ST25DV 能动态改 URL 防代签。
Mailbox / Fast Transfer Mode:ST25DV 有个 256 字节内存缓冲区, 走内存不写 EEPROM,几乎不耗寿命。但只适合「主机 ↔ 手机 App 实时双向握手」, 不适合「手机被动读 NDEF」(手机读的是 EEPROM 不是 Mailbox)→ DMSD 路径 B 用 NDEF 模式不用 Mailbox。
STEMMA QT / Qwiic 接口:4 针 JST-SH 即插即用口, 杜邦线插不进去,要专用转接线(配件单 #11)。
EEPROM 擦写寿命(关键参数):
- 官方 25°C 约 100 万次
- 85°C 约 60 万次
- 数据保持约 40 年
| 策略 | 每天写 | 磨穿时间 |
|---|---|---|
| ❌ 7×24 全天每 10 秒刷 | 8,640 次 | 100 万 ÷ 8,640 = 116 天磨穿 |
| ✅ 仅点呼时间窗内刷 | 120 ~ 360 次 | 7 ~ 22 年 |
为什么不用静态 NTAG215 当贴纸: 静态贴纸 URL 不变 → 学生复制后永久有效 → 代签漏洞。 ST25DV 能动态改 URL 防代签。
Mailbox / Fast Transfer Mode:ST25DV 有个 256 字节内存缓冲区, 走内存不写 EEPROM,几乎不耗寿命。但只适合「主机 ↔ 手机 App 实时双向握手」, 不适合「手机被动读 NDEF」(手机读的是 EEPROM 不是 Mailbox)→ DMSD 路径 B 用 NDEF 模式不用 Mailbox。
STEMMA QT / Qwiic 接口:4 针 JST-SH 即插即用口, 杜邦线插不进去,要专用转接线(配件单 #11)。
AC 故事:评委问「贴纸不是会写坏吗」→
「每 10 秒刷一次确实会,全天候跑 116 天就报废 →
所以代码里 nonce 刷新只在点呼时间窗内启动 →
实际写入次数从 8,640 次/天降到 120-360 次/天 → 寿命从 116 天延长到 7-22 年」=
理解硬件物理约束并写进软件控制 = 嵌入式工程思维。
7.12 NTAG215 学生卡 → NTAG424 DNA 升级路径
UID 克隆漏洞 + AES-128 + SUN 机制
NTAG215:NXP 出品的 NFC 卡,CR80 标准(85.6×54mm,银行卡大小)。
7 字节 UID / 540 字节 EEPROM(项目只用 UID,不写数据)。
致命局限:只读 UID 的方案,UID 能被
学生卡生命周期: 入学发卡 + App 绑 UID → 日常签到 → 丢失换卡作废旧 UID → 毕业清绑定回收给下一届。
致命局限:只读 UID 的方案,UID 能被
- Flipper Zero(便携黑客 NFC 工具)克隆
- Android HCE(手机模拟卡功能 Host Card Emulation)克隆
- 内置 AES-128 加密引擎
- SUN(Secure Unique NFC)动态签名 — 每次刷卡输出不同加密密文
- 物理克隆 UID 也通不过签名验证
学生卡生命周期: 入学发卡 + App 绑 UID → 日常签到 → 丢失换卡作废旧 UID → 毕业清绑定回收给下一届。
AC 故事:评委问「NTAG215 不是能被克隆吗」→
「对,这是有意识的成本权衡:演示阶段先用 NTAG215(5 元/张)跑通流程;
正式部署升级到 NTAG424 DNA(200-400 日元/张)—
内置 AES-128 + SUN 动态签名,每次刷卡密文都不一样,物理克隆 UID 也通不过验证」=
阶段性技术决策能力 + 知道更高级方案存在。
7.13 LED / 风扇 / 喇叭 / 接线(外设坑总集)
LED 状态灯 — 数字 GPIO 不走 PWM
4 颗 5mm LED:蓝=待机 / 绿=签到成功 / 红=失败 / 白=系统启动中。
接数字 GPIO(红 17 / 绿 27 / 蓝 22 / 白 23,BCM 编号),共地。
每颗串一个 220Ω 限流抵抗(防止电流过大烧坏 LED)。
不走 PWM(脉宽调制调亮度),简单数字开关即可。
接数字 GPIO(红 17 / 绿 27 / 蓝 22 / 白 23,BCM 编号),共地。
每颗串一个 220Ω 限流抵抗(防止电流过大烧坏 LED)。
不走 PWM(脉宽调制调亮度),简单数字开关即可。
散热风扇 — 必须 5V + 接电源脚不接 GPIO 信号脚 ⚠️
30×30×7mm 风扇,必须 5V(不是 12V — 12V 接 Pi 5V 脚转不起来)。
接法关键:
接法关键:
- ✅ 接 5V 电源脚(物理第 2 或第 4 针)+ 接地脚
- ❌ 不能接 GPIO 信号脚(信号脚最大 16 mA,风扇要 100 mA 会烧坏 Pi)
烧主板典型新手坑:「GPIO 针脚都长一样,随便插」→
信号脚电流上限 16 mA,风扇启动瞬间 100+ mA 直接烧坏 GPIO 驱动电路 →
整块 Pi 报废。这条务必记。
USB 小喇叭 + 日语语音合成方案对比
喇叭选型:USB 取电 + 3.5mm 音频输入
(不要买 USB 数据传声型 / USB DAC,那种占 Pi 唯一 USB 口)。
Pi 3A+ 默认音频走 HDMI,要用
日语语音合成 3 方案对比:
Pi 3A+ 默认音频走 HDMI,要用
raspi-config
命令改成「模拟音频」走 3.5mm 口。日语语音合成 3 方案对比:
| 方案 | 说明 | 评价 |
|---|---|---|
| A 推荐 | 预生成语音文件缓存 — 开发电脑上用 OpenJTalk 提前把每个学生名字生成 .wav,存到 Pi,运行时直接播 | ✅ 最稳 + 音质最好 + 省资源 |
| B | Pi 上装 OpenJTalk 实时合成 | 音质好,每次延迟 1-2 秒 |
| C 不推荐 | pyttsx3 + espeak / VOICEVOX | espeak 日语人名发音机械(最弱场景)/ VOICEVOX 要 2GB 内存跑不动 |
AC 故事:评委问「日语播报怎么实现」→
「3 方案都试过,最后选预生成缓存 — 因为学生名字是固定名单,开学一次性生成,
运行时只播 .wav 不做合成 → CPU 占用低、零延迟、音质好。
实时合成是处理不可预测输入用的,这场景不需要」=
理解工程权衡的「按数据特性选方案」。
接线坑 — BCM 编号 vs 物理针脚编号
开发期:面包板 + 杜邦线,不焊接(随时改接法,失败不报废板子)。
部署期:建议改焊接到万能板(perfboard),防走廊振动接线松脱。
GPIO 编号坑(100% 会踩):
部署期:建议改焊接到万能板(perfboard),防走廊振动接线松脱。
GPIO 编号坑(100% 会踩):
- BCM 编号:代码里用(如
GPIO.setmode(GPIO.BCM)) - 物理针脚编号:板子上印的,从 1 开始数
- 两套编号完全不一样,第一次接线 100% 会搞混 → LED 不亮 / 模块识别不到
gpio readall 看物理 ↔ BCM 对照表。
7.14 关键技术概念词典(20 个)
下面这 20 个词出现在 hardware_design.md / ROLLCALL_DEVICE_DESIGN_LOG.md / flow_design.md 里,
AC 面接可能被问到任意一个。每个词都要能用一句话说清。
| 概念 | 解释 |
|---|---|
| NFC | 近场通信,13.56MHz 短距离(2-5cm)无线技术 |
| ISO 14443A | NFC 标准之一,NTAG215 学生卡走这个,PN532 读这个 |
| ISO 15693 / NFC Type 5 | 另一个 NFC 标准,ST25DV 贴纸走这个。 PN532 读不了这个(所以两个芯片不会互相误读) |
| UID | 卡的唯一编号,7 字节,出厂固定 |
| NDEF | NFC 数据交换格式,贴纸里存 URL 用的标准格式 |
| I²C | 两根线(数据 SDA + 时钟 SCL)的低速通信总线,ST25DV 接这个 |
| SPI | 四根线的高速通信总线,PN532 推荐接这个 |
| UART | 串口通信,PN532 第三种可选接口 |
| GPIO | 通用输入输出针脚,Pi 上 40 针,接 LED / 模块 |
| EEPROM | 可反复擦写的存储芯片,有擦写次数寿命上限 |
| nonce | 一次性随机码,10 秒时效,防 URL 复制代签 |
| Universal Link | iOS/Android 的深度链接,点 URL 直接打开 App |
| WebSocket | 长连接协议,后端实时推消息给点呼机 / 老师端 |
| HTTP POST | 点呼机发签到数据给后端的网络请求方式 |
| thin client | 瘦客户端,只搬数据不做判断 |
| headless | 无显示器/键鼠,靠 SSH 远程操作 |
| SSH | 远程登录另一台电脑命令行的工具 |
| AES-128 | 128 位高级加密标准,NTAG424 DNA 防克隆用 |
| SUN | Secure Unique NFC,NTAG424 DNA 每次输出不同密文的机制 |
| PWM | 脉宽调制,调 LED 亮度 / 风扇转速用(本项目 LED 不用) |
7.15 24×7 部署常见失败模式(按发生概率)
6 类失败模式 + 对应防御
| # | 失败模式 | 原因 | 防御 |
|---|---|---|---|
| 1 | 面包板杜邦线接线松脱 | 走廊振动 + 温度变化 | 部署期改焊接到万能板 |
| 2 | SD 卡损坏 | 频繁写日志 + 停电 | 用高耐久卡(Sandisk Max Endurance) |
| 3 | 学校 WiFi 认证门户 / WebSocket 被代理拦 | 校园网常见限制 | 本地签到队列缓冲 + 自动重连 |
| 4 | 供电电压不稳 | 走廊插座共用电路欠压让 Pi 降频 | 用 5V 3A 稳压电源 + 监控 throttled 状态位 |
| 5 | 风扇积灰 / 损坏 | 无尘网 + 长期运转 | 定期巡检 + 备件 |
| 6 | ST25DV EEPROM 磨穿 | 错误地全天候刷新 nonce | 只在点呼时间窗内刷(见 7.11) |
AC 故事:评委问「24×7 运行你怎么保证稳定」→
「列了 6 种最可能的故障模式,每种都有对应防御 —
从硬件(焊接、稳压电源)到软件(本地队列缓冲)到运维(定期巡检)。
重点是承认硬件一定会坏,关键是坏了系统不崩」=
可靠性工程思想(Reliability Engineering)。
7.16 学习材料起点(文档定位)
3 份文档读完点呼机就懂了
02_design/hardware_design.md— 硬件选型 + 配件单单源真值03_dev/rollcall_device/ROLLCALL_DEVICE_DESIGN_LOG.md— 点呼机软件层02_design/flow_design.md— 签到流程端到端
第 8 章 — AC 入試 直接相关知识
这一章不是技术,是 AC 面接评委可能问 + itsuki 必须答得上来的「为什么选筑波
/ 为什么选情报科学類」类问题的背景知识。
8.1 情报科学類的 3 个分野
软件科学 / 信息系统 / 智能信息媒体
软件科学 (ソフトウェアサイエンス) = 软件本身的理论 + 设计
信息系统 (情報システム) = 支撑情报社会的基础设施
智能信息媒体 (知能情報メディア) = 给计算机「眼·智·安全」
信息系统 (情報システム) = 支撑情报社会的基础设施
智能信息媒体 (知能情報メディア) = 给计算机「眼·智·安全」
读
02_分析与调研/AC入試制度総覧_2027.html §1.2 + 大学案内
2027 P80
AC 故事:评委问「入学后想学哪个分野」→ DMSD 项目跨这 3
个分野(软件设计 + 后端架构 + NFC 安全),要能挑 1 个主要方向 + 解释理由
8.2 CTF(信息安全竞技)
Capture The Flag 抢旗赛
CTF = 信息安全领域的竞赛形式 — 找系统漏洞 / 破解密码 / 逆向分析
SECCON = 日本最大 CTF 之一
情报科学類学生 2026-03 在 SECCON CTF 14 学生队伍优胜 — 这是 coins 官网最新的对外宣传成绩
SECCON = 日本最大 CTF 之一
情报科学類学生 2026-03 在 SECCON CTF 14 学生队伍优胜 — 这是 coins 官网最新的对外宣传成绩
AC 故事:评委问「入学后想做什么」→ 答「DMSD
已做防作弊设计 → 想进一步学 CTF 攻防 → 跟筑波在 SECCON 的实绩对接」=
高度匹配筑波招生方向
8.3 SecHack365(日本总务省人才育成项目)
青年信息安全人才项目
SecHack365 = 日本总务省主办的 25 岁以下青年信息安全人才育成项目(1
年期)。情报科学類学生 2026-03 获优秀修了认定。
AC 故事:可以提「入学后想申请 SecHack365」— 让评委看到
itsuki 知道筑波的资源
8.4 大学案内 P80 人材养成目的
情报科学類想培养什么人
原文:「能定义问题 + 用信息技术创造性解决 +
能解释自己为什么这么做」的人。这就是 AC 入試 3 个评分点(关心 / 能力 /
表达)的源头。
读
02_分析与调研/AC入試制度総覧_2027.html §1.2
第 9 章 — 项目底层运转逻辑(你的项目怎么从源代码变成跑起来的东西)🆕
itsuki 原话:「想搞懂自己项目怎么运转起来的」。这一章是「从你写一行代码到用户手机上跑出来」整条链路。AC 评委如果问「你的 iPhone 怎么把数据传到后端」,必须能答全链路 — 从应用层一路讲到物理层。
9.1 操作系统基础
9.1.1 进程 / 线程 / 协程(process / thread / coroutine — 操作系统跑程序的 3 种粒度)
进程 = 操作系统给程序分的独立内存空间(互相隔离)/ 线程 = 进程内部能并行的执行流(共享内存)/ 协程 = 程序自己调度的轻量级线程(不需要操作系统切换)
DMSD 里:FastAPI(后端框架)每个请求一个协程 / iOS Swift
async-await(异步语法)底层是协程
AC 故事:评委问「100 个学生同时签到怎么不卡」→ 答「协程让一个线程能处理上千请求,不用为每个请求开一个进程」
9.1.2 内存管理(memory management — 程序怎么用内存)
栈(stack 自动分配局部变量,函数返回就回收)/ 堆(heap 手动分配复杂对象)/ ARC(Automatic Reference Counting 自动引用计数,编译期决定释放点)/ GC(Garbage Collection 垃圾回收,运行时定期扫描)
DMSD 里:Swift 用 ARC / Kotlin + Python 用 GC
AC 故事:评委问「为什么 Swift 不用 GC」→ 答「ARC 编译期决定释放点更可预测,移动端避免 GC 暂停带来的卡顿」
9.1.3 文件系统(filesystem — 文件怎么存在硬盘上)
inode(文件元信息:大小 / 时间戳 / 权限位)/ 目录树(树形组织)/ 权限位
rwx(read 读 / write 写 / execute 执行)
DMSD 里:Mac 上 APFS(Apple File System 苹果文件系统)/ Raspberry Pi 上 ext4(Linux 文件系统)
9.2 网络底层(iPhone → 后端 的物理链路)
9.2.1 TCP/IP 4 层模型(互联网通信的分层标准)
链路层(Wi-Fi / 网线 — 物理传输)/ 网络层(IP 地址 + 路由 — 知道发去哪台机器)/ 传输层(TCP 可靠有序 / UDP 不可靠但快)/ 应用层(HTTP / WebSocket / DNS 等)
DMSD 里:你的 HTTP 请求实际是「HTTP 装在 TCP 里、TCP 装在 IP 里、IP 装在 Wi-Fi 帧里」一层层包起来发出去
AC 故事:评委问「断网怎么办」→ 能从 TCP 重传机制讲到应用层重试策略
9.2.2 DNS(Domain Name System 域名解析系统)
把
dmsd.example.jp 这样的域名变成 IP 地址。电脑先问 DNS 服务器「这名字对应哪个 IP」才能连过去。
DMSD 里:iPhone 怎么找到后端服务器 — 先 DNS 查询拿到 backend 的 IP,再发 HTTP 请求
9.2.3 TLS / HTTPS(Transport Layer Security 传输层安全)
HTTP 明文传输能被中间人窃听 / TLS 在 TCP 之上加密 + 用证书验证服务器身份 / HTTPS = HTTP + TLS
DMSD 里:NFC 防作弊设计第 3 层 ECDSA 签名跟 TLS 证书用的是同一种椭圆曲线数学
AC 故事:评委问「攻击者截获学生签到 URL 怎么办」→ 能讲 HTTPS 防窃听(加密)+ ECDSA 防伪造(签名)双重保护
9.3 编译与解释(你写的代码怎么变成能跑的东西)
9.3.1 编译型 vs 解释型
编译型:Swift / Kotlin / Rust — 编译器(compiler)把源代码一次性翻译成机器码或字节码再跑(运行快、错在编译期发现)
解释型:Python / JavaScript — 解释器(interpreter)边读源代码边跑(启动快、错在运行时才发现)
解释型:Python / JavaScript — 解释器(interpreter)边读源代码边跑(启动快、错在运行时才发现)
DMSD 里:iPhone 上跑的是 Swift 编译后的 ARM 机器码 / 后端跑的是 Python 解释器读
.py 源码
9.3.2 字节码 / 虚拟机(bytecode / virtual machine — 中间形态)
源代码先编译成跨平台的「中间码」(字节码),运行时再由虚拟机翻译成机器码。好处:一份代码跑多平台。
Kotlin → JVM 字节码(Java Virtual Machine Java 虚拟机执行的中间码)→ Android 上由 ART 运行时翻译成 ARM 机器码
Kotlin → JVM 字节码(Java Virtual Machine Java 虚拟机执行的中间码)→ Android 上由 ART 运行时翻译成 ARM 机器码
DMSD 里:你的 Android 代码就走这条路
9.3.3 抽象语法树(AST = Abstract Syntax Tree — 编译器看源代码的内部数据结构)
你写的
let x = 1 + 2 编译器先把它变成一棵树(赋值节点 → 加法节点 → 两个数字叶子)才能处理。
DMSD 里:你装的
graphify 工具就是用 AST 分析代码结构画依赖图
9.4 数据库底层
9.4.1 B 树索引(B-tree / B+ 树 — PostgreSQL 默认索引结构)
一种平衡多叉树数据结构,让百万行表的查询从 O(n) 全表扫降到 O(log n) — 100 万行查询从 100 万次比较降到约 20 次。
DMSD 里:
students 表的 student_id 主键自动建 B 树索引;想给 school_id 字段加索引也是建 B 树
9.4.2 事务 ACID(Atomicity / Consistency / Isolation / Durability — 数据库事务 4 性质)
原子性(一组操作要么全成功要么全失败)/ 一致性(事务前后数据库都满足约束)/ 隔离性(并发事务不互相干扰)/ 持久性(提交后哪怕断电也不丢)
DMSD 里:学生签到 + 扣分必须同一个事务 — 不能签到成功但扣分失败,否则学生白扣或白签
AC 故事:评委问「签到中途数据库挂了怎么办」→ 答「事务回滚机制保证不会出现签到了但没扣分的脏数据」
9.4.3 锁与并发控制(lock / MVCC = Multi-Version Concurrency Control 多版本并发控制)
传统锁:读写互相阻塞 / MVCC:每次写产生新版本,读永远不阻塞(PostgreSQL 默认用这个)
DMSD 里:100 个学生同时签到 PostgreSQL 用 MVCC 处理并发不冲突
AC 故事:评委问「同一秒 50 个签到怎么处理」→ 能讲 MVCC 多版本机制不需要排队
9.5 异步编程深度
9.5.1 事件循环(event loop — async 怎么实现的)
单线程靠不停切换任务模拟并发:碰到 I/O 等待就挂起当前任务转去跑别的,I/O 回来再恢复。比多线程省内存(不用为每个任务分配线程栈)。
DMSD 里:FastAPI 后端 + iOS Swift
async 都用事件循环
9.5.2 回调地狱 → Promise → async/await(异步编程演进史)
3 代异步语法:
① 回调(callback)— 嵌套深难读,错误处理散乱
② Promise / Future — 链式调用
③ async/await — 写起来像同步代码,实际是异步
① 回调(callback)— 嵌套深难读,错误处理散乱
② Promise / Future — 链式调用
.then().then()③ async/await — 写起来像同步代码,实际是异步
AC 故事:评委问「为什么不直接用回调」→ 能讲异步语法演进史
第 10 章 — 计算机科学基础(情报科学類 1-2 年共通课预习)🆕
大学案内 P80 写情報科学類 1-2 年共通课 = 线性代数 / 微积分 / 概率统计 / 逻辑 / 形式语言 / 编程入门 / 计算机硬软件结构 / 数值算法 / 面向对象编程。这一章把这些预习一遍。AC 面接评委问「入学后想学什么」答得出具体科目 = 加分。
10.1 离散数学(discrete mathematics)
10.1.1 命题逻辑 / 谓词逻辑
数学逻辑基础 — 编程的
if 判断 / 布尔代数 and / or / not / 量词「存在 / 任意」全是从这来的
10.1.2 集合 / 关系 / 函数
数据库表的理论基础就是「集合 + 关系代数」— SQL 的 SELECT / JOIN / UNION 全是关系运算
DMSD 里:你写 SQL 查学生表关联出席表本质就在做关系代数运算
10.1.3 图论(graph theory)— 顶点 + 边
社交网络 / 路径规划 / 网页链接全是图。算法:最短路径 / 最小生成树 / 拓扑排序
DMSD 里:学生宿舍楼层平面图就是图(房间 = 顶点,相邻 = 边);模块依赖也是图
10.1.4 组合数学 — 排列组合 / 容斥原理
概率计算的前置 / 算法复杂度分析 / 密码学搜索空间估算全要
10.2 线性代数(linear algebra)
向量 / 矩阵 / 线性变换 / 特征值
机器学习 / 计算机图形学 / 信号处理 / 量子计算全靠线性代数
AC 故事:评委问「想做机器学习吗」→ 答得出「先要补线性代数」就是会读 paper 的基础
10.3 微积分(calculus)
极限 / 导数 / 积分 / 多元微积分
信号处理 / 机器学习里的梯度下降 / 物理模拟全要。导数 = 变化率,积分 = 累计量。
10.4 概率与统计(probability and statistics)
概率 / 条件概率 / 贝叶斯定理 / 大数定律 / 假设检验
贝叶斯定理 = 用观测到的证据更新先验信念 / 假设检验 = 判断观察结果是否够「显著」
DMSD 里:你的扣分体系用了平均值 + 阈值 = 简单统计
AC 故事:评委问「为什么扣 8 分不是 10 分」→ 能讲统计分布 / 历史出席数据的均值方差
10.5 算法与数据结构(algorithms and data structures)
10.5.1 数据结构 — 数组 / 链表 / 栈 / 队列 / 树 / 图 / 哈希表
每种结构擅长不同操作:数组随机访问快 / 链表插入快 / 哈希表查找 O(1) / 树形维持有序
10.5.2 排序算法 — 冒泡 / 快速 / 归并 / 堆排序
经典面试题。各自的时间复杂度 / 稳定性 / 适用场景。
10.5.3 搜索算法 — 二分 / 深度优先 DFS / 广度优先 BFS
二分 = 有序数组里 O(log n) 找元素 / DFS = 一条路走到黑 / BFS = 一层一层扩展
10.5.4 复杂度分析 — 大 O 记号 O(1) / O(log n) / O(n) / O(n²)
描述算法在输入规模增大时的时间 / 空间增长速度。判断算法好坏的通用语言。
AC 故事:评委可能直接出算法题
10.6 计算机体系结构(computer architecture)
CPU / 寄存器 / 缓存 L1 L2 L3 / 内存 / 硬盘 — 存储层级
越靠近 CPU 越快但越小 / 越远越慢但越大。缓存命中率决定程序性能。
指令集(ISA = Instruction Set Architecture)— ARM 苹果用 / x86 桌面用
ARM = 精简指令集(RISC,省电,移动端 / Mac M 系列) / x86 = 复杂指令集(CISC,性能高,Intel / AMD 桌面)
AC 故事:评委问「为什么 iPhone 比 Pi 快」→ 能从指令集 + 缓存大小 + 时钟频率讲
10.7 形式语言与自动机(formal languages and automata)
正则表达式 / 上下文无关文法 / 图灵机
正则 = 描述字符串模式 / 上下文无关文法 = 描述编程语言语法 / 图灵机 = 可计算性理论的源头
DMSD 里:你已用过正则(验证学生注册码格式)
AC 故事:这是编译原理基础,能说出「想学编译原理」很加分
10.8 面向对象编程理论(OOP 理论)
封装 / 继承 / 多态 / 抽象 — 4 原则
封装 = 隐藏内部细节只暴露接口 / 继承 = 子类复用父类 / 多态 = 同一接口多种实现 / 抽象 = 提取共性
DMSD 里:后端 SQLAlchemy model / iOS Swift class 都用 OOP
SOLID 5 原则
S 单一职责 / O 开闭 / L 里氏替换 / I 接口分离 / D 依赖倒置 — OOP 进阶设计准则
第 11 章 — 信息安全深度(CTF / SecHack365 方向预习)🆕
coins 官网 2026-03 实绩 = SECCON CTF 14 学生优胜 + SecHack365 优秀修了。AC 面接答「入学后想做信息安全方向」必须对这领域有概念。这一章把 DMSD 防作弊已经在用的密码学拉到数学层,再往外扩展到 CTF 5 大类。
11.1 密码学基础
11.1.1 对称加密 — AES(Advanced Encryption Standard 高级加密标准)
同一把钥匙加密又解密 / AES 是现役标准 / DES 是被淘汰的老旧标准
11.1.2 非对称加密 — RSA / ECC
公钥加密、私钥解密 / RSA 是最经典(大整数分解难题)/ ECC 椭圆曲线密码(同等安全密钥更短)
11.1.3 哈希函数 — MD5(弃用)/ SHA-256(现役)
单向不可逆 / 任意长度输入 → 固定长度输出 / 雪崩效应(输入改一个 bit 输出完全变)
DMSD 里:学生注册码用 hash 防伪
11.1.4 数字签名 — 用私钥签名 + 公钥验证
证明「这消息确实是私钥持有者发的」+「没被篡改」
DMSD 里:NFC 防作弊第 3 层 ECDSA 签名
11.2 椭圆曲线密码学(ECC = Elliptic Curve Cryptography)
椭圆曲线的数学(
y² = x³ + ax + b)
椭圆曲线上定义「加法运算」/ 选一个基点 G / 反复加 G 得到的点构成密钥空间
离散对数难题 — 为什么 ECC 难破
给点 P 和 G,求出 k 让 P = k·G 在椭圆曲线上是已知最难的数学问题之一 — 这就是 ECC 安全的源头
ECDSA(Elliptic Curve Digital Signature Algorithm 椭圆曲线数字签名算法)
基于 ECC 的数字签名算法 / 比特币 / TLS 1.3 / 现代 NFC 卡都用
DMSD 里:NFC 防作弊第 3 层
AC 故事:评委问「为什么不用 RSA」→ 答「ECC 256 位密钥相当于 RSA 3072 位的安全级别,密钥短 10 倍,适合 NFC 卡的小存储空间」
11.3 网络安全攻击与防御
11.3.1 SQL 注入(SQL injection)
把 SQL 字符串跟用户输入拼起来 → 攻击者输入
' OR '1'='1 就能绕过登录验证。防御:用参数化查询,不要字符串拼接。
DMSD 里:SQLAlchemy ORM 默认用参数化查询,所以本身就防 SQL 注入
11.3.2 XSS(Cross-Site Scripting 跨站脚本)
把恶意
<script> 注入网页 → 别人访问时执行偷 cookie / 改 DOM。防御:输出时转义 / CSP 头限制脚本来源。
11.3.3 CSRF(Cross-Site Request Forgery 跨站请求伪造)
诱导已登录用户的浏览器去发请求(比如点击伪造链接转账)/ 防御:CSRF token / SameSite cookie
11.3.4 中间人攻击(Man-in-the-Middle / MITM)
攻击者卡在通信双方中间窃听 / 篡改 / 防御:TLS 证书验证 + 公钥固定(pinning)
11.3.5 重放攻击(replay attack)
录下合法请求再发一遍冒充合法用户 / 防御:nonce(一次性随机数)+ 时间戳
DMSD 里:NFC 防作弊第 2 层动态 nonce(每 10 秒刷新)就是防重放
11.4 CTF 5 大类
11.4.1 Reverse Engineering 逆向工程
反编译别人的二进制程序找逻辑 / 找漏洞 / 工具:IDA Pro / Ghidra / radare2
11.4.2 Web — 网站漏洞利用
SQL 注入 / XSS / SSRF / 命令注入等利用 / 跟你 DMSD backend 直接相关
11.4.3 Crypto 密码学
破解弱加密 / 找密码协议漏洞 / 跟你的 ECDSA 知识衔接
11.4.4 Pwn 二进制利用
缓冲区溢出 / ROP / 内存破坏漏洞利用 / 最硬核的一类
11.4.5 Forensics 取证
从数据残留(内存 dump / 网络包 / 磁盘镜像)找证据
AC 故事:能讲「CTF 5 大类我对 Web + Crypto 最感兴趣 + 为什么」= 高度匹配筑波 SECCON 实绩
第 12 章 — 软件工程(DMSD 工程化实践对应的理论)🆕
DMSD 已经在做的工程化(规格冻结 / 联动检查 / hooks / commit 规范 / 文档先行)背后都有理论。AC 评委问「为什么这么做」时要能引用理论术语,不是只会说「感觉这样好」。
12.1 版本控制理论
Git 内部结构 — blob / tree / commit / ref
blob = 文件内容快照 / tree = 目录结构 / commit = 一次提交快照(指向一个 tree + 父 commit)/ ref = 分支指针(branch 本质是指向某个 commit 的可移动指针)
DMSD 里:你已经积累 200+ commit,理解 Git 内部模型后能更安全地用 rebase / cherry-pick
merge vs rebase — 两种合并策略
merge = 保留分支历史,产生 merge commit / rebase = 把分支提交「移植」到主干上,历史变直线 / 各有取舍
12.2 测试理论
12.2.1 单元测试(unit test)
测一个函数 / 方法的行为 / 跑得快 / 数量最多 — 测试金字塔的底
12.2.2 集成测试(integration test)
测多个组件一起协作(比如后端 + 数据库一起跑)/ 数量中等 / 比单测慢
12.2.3 端到端测试(E2E = end-to-end)
模拟真实用户全流程(启动 app → 点按钮 → 看结果)/ 慢 + 脆 / 数量最少
12.2.4 TDD(Test-Driven Development 测试驱动开发)
红 → 绿 → 重构循环:先写失败的测试 → 写最少代码让它通过 → 重构 / 强制思考接口设计
12.3 设计模式(design patterns)
GoF 23 种常见模式 — 选 5-6 个先看
Singleton 单例 / Observer 观察者 / Factory 工厂 / Strategy 策略 / Decorator 装饰器 / Adapter 适配器 — 常见的先掌握
DMSD 里:SwiftUI 的
@ObservedObject / @StateObject 就是观察者模式
12.4 重构(refactoring)
不改功能改结构 — 让代码更易懂
代码异味(code smell)信号:长函数 / 重复代码 / 上帝类(一个类管所有事)/ 神秘命名
DMSD 里:v0.5 → v0.6 你重写
system_features.md 357 行 → 830 行 = 文档级重构
12.5 持续集成 / 持续部署(CI/CD = Continuous Integration / Continuous Deployment)
CI 每次 push 自动跑测试 / CD 测试过自动部署
减少「在我电脑上能跑」类问题 / 工具:GitHub Actions / GitLab CI / Jenkins
DMSD 里:目前没正式 CI/CD,但 pre-commit hook + sync-check.sh 算 CI 的雏形
12.6 监控 / 日志 / 可观测性(observability)
日志 / 指标 / 链路追踪 — 3 大支柱
日志(log 事件流)/ 指标(metrics 数值时序)/ 链路追踪(trace 跨服务调用链)/ 系统跑起来才能查问题
DMSD 里:backend 已有日志输出,但还没结构化日志 + Prometheus 指标
12.7 文档驱动开发(DDD = Documentation-Driven Development)
先写规格 / 设计文档 → 再写代码
DMSD 用的方式 / 跟 TDD 测试驱动并列的另一种开发哲学 / 适合多端协同的项目(先对齐接口再各端实现)
DMSD 里:
02_design/system_features.md 就是「先冻结再写代码」的载体
AC 故事:评委问「为什么先写文档再写代码」→ 能讲 DDD 理论 + 跟 DMSD 5 端同步的实际收益
第 13 章 — 推荐学习顺序(给参考,非强制)
以下顺序按「AC
时间表」+「学一个能立刻看懂代码」+「先易后难」综合排。itsuki
可以按自己节奏调整。新增的第 9-12 章建议「Part A 主线穿插」— 学到具体技术点时顺手翻对应底层章节(比如学 backend HTTP 时翻 9.2 网络)/ 不单独安排时段。
阶段 A — 现在到 6/15 R9 募集要项公表(21 天)
| 周 | 学什么 | 预期产出 |
|---|---|---|
| 第 1 周(5/25-5/31) | 第 1 章项目熟悉(全章 6 节) | 能口头说清楚 DMSD 11 个顶层目录干嘛 + 5 端各自的代码在哪 |
| 第 2 周(6/1-6/7) | 第 2 章通用基础(2.1-2.4 命令行 / Git / 路径 / JSON) | 能用终端 + Git 操作项目(不依赖 CC 替你跑命令) |
| 第 3 周(6/8-6/14) | 第 2 章通用基础(2.5-2.7 HTTP / 数据库 / 安全) | 能讲清楚 DMSD 的「客户端 → HTTP → backend → 数据库」全链路 |
阶段 B — 6/15 到 9/3 出愿截止(11 周)
这 11 周 itsuki 的主任务是写志愿理由书 + 自我推荐书 + 收集添付资料 —
学习时间应该减量,不要为了学新东西耽误出愿。
| 周 | 学什么 | 预期产出 |
|---|---|---|
| 第 4-6 周 | 第 3 章 Python(3.1-3.4 语法 + FastAPI + SQLAlchemy + Pydantic) | 能读懂 DMSD backend 60% 的代码 |
| 第 7-9 周 | 第 4 章 Swift + SwiftUI(4.1-4.4 语法 + UI + 状态 + 导航) | 能读懂 DMSD iOS 端 60% 的代码 — AC demo 演示能讲 |
| 第 10-12 周 | 第 8 章 AC 直接相关(人材养成 / CTF / SecHack365)+ 第 7 章硬件原理(7.1-7.2) | 面接素材成型 — 能讲为什么选筑波 / 入学后想做什么 |
| 第 13-14 周(出愿前最后 2 周) | 停止学新东西,全力写 / 检查出愿材料 | 9/3 出愿截止前所有材料准备完成 |
阶段 C — 9/3 出愿后到 11/2 最终合格(约 8 周)
| 阶段 | 学什么 | 预期产出 |
|---|---|---|
| 9/3 - 10/1(第 1 段结果通知前) | 不学新东西,把已经学过的所有内容做「能讲清楚」训练 — 每个条目对着镜子或者跟 CC 模拟问答 1 遍 | 每个学过的技术点都能用 30 秒讲清楚原理 + 1 分钟讲清楚 DMSD 怎么用 |
| 10/1 - 10/17(第 2 段面接前) | 第 7 章硬件深度(7.3-7.5 模块 / GPIO / 防作弊 3 层)+ 第 2 章 2.7 安全深度 | 面接评委问技术细节能完整答 |
| 10/17 - 10/20(面接期间) | 不学新东西,专注面接 | — |
| 11/2 最终合格发表后 | 看结果调整 — 合格则继续学 Kotlin / Vue 等剩余章节为入学准备 | — |
不在阶段 A/B/C 主线的章节
| 章节 | 建议学习时机 |
|---|---|
| 第 5 章 Kotlin + Compose | 合格之后 → 入学前的「先发优势」准备 |
| 第 6 章 TypeScript + Vue | 合格之后 / 老师 Web 端有具体功能要做时再学 |
| 第 3.5 Alembic 数据库迁移 | backend 真上线前学(demo 阶段不需要) |
| 第 3.6 nfcpy | 点呼机硬件到货后再学(实物在手才有意义) |
Part B
QTS 量化交易 — 终极知识地图
16 章 / 90+ 条目 · 不是「明天就要学完」/ 是「沿着 QTS 这条线走到能上实盘路上会撞到的知识全集」
按 #008 决策 DMSD 优先 · QTS 节奏让位 · 这里是「方向地图」让 itsuki 知道前面有什么山要爬
清单本身可以当 AC 素材 — 「面对完全陌生领域自己拆解出 16 大类知识地图」这件事就是 AC 入試可展示的能力
Part B 引言 — 为什么 QTS 单列一块
跟 Part A 的关系:Part A(DMSD + AC)是眼前主线,时间冲突时 Part A 优先。Part B 提到的「Python / 数据库 / Linux / Docker / 安全」等也在 Part A 出现过 — 不重复列,QTS 自己的特化部分(金融 / 市场 / 回测 / 策略)才是 Part B 的真核心。
性质:「终极清单」不是「学习计划表」/ 零基础起步 / 按学习路径顺序排(前置基础 → 金融认知 → 策略 → 回测 → 实盘 → 进阶)。
范围限定 QTS 相关:没列日语 / AC 出愿准备 / 数学高考。如果未来要扩到「全部学习内容」由 itsuki 拍板。
性质:「终极清单」不是「学习计划表」/ 零基础起步 / 按学习路径顺序排(前置基础 → 金融认知 → 策略 → 回测 → 实盘 → 进阶)。
范围限定 QTS 相关:没列日语 / AC 出愿准备 / 数学高考。如果未来要扩到「全部学习内容」由 itsuki 拍板。
QTSQ1 — 编程基础(前置必备)
写代码本身的能力 — 没有这个连别的都学不动。跟 Part A 第 3 章 Python 部分重叠,QTS 角度补充:量化界几乎垄断用 Python,所以学 Python 是双向投资。
Q1.1 Python 基础语法
Python = 量化界几乎垄断的工具 / 变量 / 流程控制 / 函数 / 类
QTS 视角:所有量化库(pandas / numpy / backtrader / vnpy)都是 Python
Q1.2 命令行 / 终端基础
cd(切目录)/ ls(列文件)/ 管道 | / 重定向 >
Q1.3 Git 版本控制
commit / 分支 / 远程仓库 — 策略迭代必须有版本管理,不然哪天回测好了不知道是哪版策略
Q1.4 数据结构基础
列表 / 字典 / 集合 / 树 / 图 — 处理行情数据每天都要用
Q1.5 调试与测试
打日志 / 断点 / 单元测试 — 策略代码错一个符号能亏几百万,必须能调能测
QTSQ2 — 数学与统计基础
量化交易的本质是用数学描述市场,没有这块连别人在说什么都听不懂。
Q2.1 概率论
条件概率 / 贝叶斯定理 / 常见分布(正态 / 对数正态 / 泊松)/ 股价对数收益率近似正态是大多数模型的前提
Q2.2 描述统计
均值 / 方差 / 偏度(分布是否对称)/ 峰度(尾部多厚)/ 分位数 — 因子分析必备
Q2.3 假设检验
t 检验 / 卡方 / p 值(统计显著性指标)— 判断因子是不是「真的有效」还是运气
Q2.4 线性代数
矩阵运算 / 特征值 / 主成分分析 PCA — 多因子合成 + 风险模型必备
Q2.5 时间序列
自相关 / 平稳性 / ARMA / ARIMA(时间序列预测模型)/ 行情数据本质就是时间序列
Q2.6 微积分基础
导数 / 积分 / 最优化 — 组合优化 / 期权定价全要
Q2.7 随机过程
布朗运动 / 鞅 / 马尔可夫链 — 期权定价 / 高频建模理论源头
QTSQ3 — 金融市场基础
搞清楚自己在跟什么打交道。
Q3.1 金融市场分类
一级(发行)/ 二级(流通)/ 场内(交易所)/ 场外(OTC)
Q3.2 市场参与者
散户 / 机构(公募 / 私募 / 对冲基金)/ 做市商 / 监管
Q3.3 主要金融工具
股票(普通股 / 优先股 / ADR 美国存托凭证)/
债券(国债 / 公司债 / 收益率曲线)/
期货(合约 / 保证金 / 移仓换月)/
期权(Call 看涨 / Put 看跌 / Greeks 希腊字母 / Black-Scholes 期权定价模型)/
ETF(交易所交易基金 / 指数 / 杠杆 / 反向)/
外汇 / 加密货币
Q3.4 各市场特点(美 / 日 / 港 / A 股)
交易时段 / 涨跌停 / 结算规则差异 — 跨市场策略前必须搞清楚
QTSQ4 — 市场微观结构
「订单怎么撮合成交」的底层机制 — 影响所有实盘细节。
Q4.1 订单簿(买卖双方挂单的队列)
五档 / 十档 / 全息(完整 limit order book)
Q4.2 撮合机制
连续竞价(盘中)/ 集合竞价(开盘 / 收盘)
Q4.3 流动性 / 买卖价差 / 市场深度
流动性 = 想成交多快能成交 / spread = 买一卖一价差 / 深度 = 每档挂单总量
Q4.4 做市商角色
同时挂买卖单赚价差 / 提供流动性 / 承担库存风险
Q4.5 高频交易对市场的影响
提供流动性 / 缩小价差 / 但加剧极端行情(闪崩)
QTSQ5 — 日本市场特化(TSE + moomoo)
非通用知识 — 但 QTS 要在日本跑就必须懂。itsuki 在日本 + 用 moomoo,这一章是「不能跳的章」。
Q5.1 东证 TSE(Tokyo Stock Exchange 东京证券交易所)规则
前场(9:00-11:30)/ 后场(12:30-15:30)/ 立会外取引 / 涨跌停规则 / 单位股数(100 株)
Q5.2 税务制度
特定口座源泉征收 / 一般口座 / NISA(少额投资非课税制度)/ 报税流程
Q5.3 法律
金融商品取引法 / 内幕交易禁止(インサイダー取引)/ 高频交易限制
Q5.4 moomoo / 富途日本
可交易品种 / 手续费结构 / openD 网关 / moomoo OpenAPI 接口文档 / 模拟盘 vs 实盘差异
QTSQ6 — 量化交易理论
真正进入「量化」这门学科。
Q6.1 什么是量化交易
跟主观交易 / 高频交易的区别 / 共同特征:规则化 + 数据驱动 + 可回测
Q6.2 alpha / beta 概念
alpha = 超额收益(跑赢市场的部分)/ beta = 跟市场的相关性 / 策略目标通常是「正 alpha + 可控 beta」
Q6.3 策略大类
趋势跟踪(动量 / 突破)/
均值回归(统计套利 / 配对交易)/
套利(跨市场 / 跨期 / 三角)/
事件驱动(财报 / 并购)/
因子投资(价值 / 动量 / 质量 / 低波动)/
高频做市 /
机器学习驱动策略
Q6.4 因子模型
CAPM 资本资产定价模型 / Fama-French 三因子 + 五因子 / APT 套利定价理论
Q6.5 投资组合理论
Markowitz 均值方差 / Black-Litterman / 风险平价(risk parity)
Q6.6 经典著作
Ernest Chan《Quantitative Trading》系列 / López de Prado《Advances in Financial Machine Learning》/ Rishi Narang《Inside the Black Box》
QTSQ7 — 数据
没有干净的数据,再好的策略也是空中楼阁。
Q7.1 行情数据类型
tick 逐笔 / 1 分钟 / 5 分钟 / 日线 / 周线 — 频率决定策略类型
Q7.2 基本面数据
财报 / 估值 / 行业分类
Q7.3 另类数据
新闻 / 卫星图像 / 社交媒体 / 搜索趋势 — 现代量化的 alpha 增量
Q7.4 数据问题(陷阱)
复权(前复权 / 后复权)/ 时区 / 时间戳对齐 / 缺失值 / 异常值 / 幸存者偏差(已退市股票被剔除导致回测虚高)
Q7.5 数据存储
CSV / Parquet(列式存储格式,pandas 友好)/ HDF5 / 时序数据库(InfluxDB / TimescaleDB)/ 关系数据库(SQLite / PostgreSQL)
QTSQ8 — 数据处理工具链(编程层)
Q8.1 pandas(Python 的表格数据库)
DataFrame 操作 / 时序对齐 / groupby 分组聚合 — 量化每天都用
Q8.2 numpy(Python 的数值计算库)
向量化运算 — 用 numpy 写比纯 Python 循环快 100 倍
Q8.3 可视化 — matplotlib / plotly
画 K 线图 / 回测净值曲线 / 因子分布 / 不可视化就发现不了问题
Q8.4 SQL(结构化查询语言)基础
查询 / 联表 JOIN / 聚合 GROUP BY — 跟 DMSD 后端 SQLAlchemy 知识可复用
QTSQ9 — 策略开发
Q9.1 因子构造
技术因子(动量 / 反转 / 波动率 / 成交量)/
基本面因子(PE 市盈率 / PB 市净率 / ROE 净资产收益率 / 增长率)/
情绪因子(新闻情感 / 论坛热度)
Q9.2 信号生成
单因子检验(IC / IR)/ 多因子合成 / 因子正交化(剔除因子间相关性)
Q9.3 仓位管理
等权 / 市值加权 / 风险加权 / Kelly 凯利公式 / 固定比例
Q9.4 组合优化
均值方差优化 / 风险预算 / 行业 + 个股 + 换手率约束
QTSQ10 — 回测(陷阱比方法重要)
回测是量化交易最容易自欺欺人的环节。这一章的「陷阱知识」比「方法知识」更重要 — 大多数策略失败是因为回测设计错了,不是策略本身错了。
Q10.1 回测引擎设计 — 事件驱动 vs 向量化
事件驱动 = 一根 bar 一根 bar 模拟,更真实更慢 / 向量化 = 整段时间一次性算,快但易出错
Q10.2 常见偏差识别(重点)
前视偏差(look-ahead bias — 用了未来才知道的信息)/
幸存者偏差(survivorship bias — 退市股被剔除导致样本偏好)/
过拟合(参数调得太合历史数据反而在未来失效)/
数据窥探(data snooping — 同一份数据反复试到看起来有效为止)
Q10.3 现实约束建模
手续费 / 滑点(实际成交价比预期差)/ 涨跌停 / 停牌 / 流动性约束 — 不建模这些回测全是假的
Q10.4 评估指标
年化收益 / 最大回撤 / Sharpe 夏普比率(单位风险换多少收益)/ Sortino 索提诺比率 / Calmar 卡玛比率 / 胜率 / 盈亏比 / 换手率
Q10.5 鲁棒性验证
样本内 vs 样本外 / Walk-forward 滚动窗口验证 / 蒙特卡洛模拟 / 参数敏感性分析
QTSQ11 — 风险管理
Q11.1 风险度量
VaR 在险价值(一定置信度下最大亏损)/ CVaR 条件在险价值 / 最大回撤 / 波动率
Q11.2 风险控制
止损规则 / 仓位上限 / 行业 + 个股 + 杠杆约束
Q11.3 资金管理
资金分配 / 仓位调整 / 黑天鹅应对
Q11.4 心理纪律
信号执行不打折扣 / 亏损时不撤单 / 系统化的最大价值就是把这种纪律外包给机器
QTSQ12 — 实盘部署
Q12.1 系统架构
数据接入 → 信号生成 → 下单 → 风控 → 监控 这条主链 / 每一环都能挂掉,要有容错
Q12.2 异步 / 并发基础
同步阻塞 vs 异步事件循环 — 跟 Part A 第 9.5 节衔接
Q12.3 订单执行
订单类型(市价 / 限价 / 止损 / 冰山)/ 执行算法 TWAP(时间加权平均价格)/ VWAP(成交量加权平均价格)/ POV(参与率)
Q12.4 监控与告警
实时持仓 / 盈亏 / 异常检测 / 报警通道(电邮 / Slack / Telegram)
Q12.5 日志审计(QTS 核心特色:可审计性)
订单 / 信号 / 决策证据完整留档 — 这块是 QTS 跟传统量化的差异化点
Q12.6 容错与故障恢复
断网 / 服务重启 / 数据回补 — 实盘随时会出意外,预案要事先写好
QTSQ13 — 机器学习在量化的应用
Q13.1 监督学习基础
回归(预测连续值)/ 分类(预测类别)
Q13.2 时序预测
ARIMA / LSTM 长短期记忆网络 / Transformer
Q13.3 强化学习在交易
Q-learning / 策略梯度 — 让 agent 自己学最优执行
Q13.4 集成学习
XGBoost / LightGBM — 两个梯度提升模型,因子合成里非常常用
Q13.5 LLM 在交易
LLM = Large Language Model 大语言模型 / 新闻情绪分析 / 财报解读 / 决策辅助 — 跟 Q14 衔接
Q13.6 机器学习陷阱(重点)
数据泄露(label 不小心包含未来信息)/ 时序交叉验证(不能随机切分)/ 过拟合 / 市场非平稳性(历史数据上学的模式未来失效)
QTSQ14 — AI Agent 多层架构(QTS 特色)
跟 archive 里的「人机协同 + 可审计」定位对应,是 QTS 跟传统量化的差异化点。
Q14.1 多层架构设计
策略层 / 决策层 / 执行层 — 各自职责清晰,方便审计 + 替换
Q14.2 prompt 工程
怎么让大模型按需要输出 — 结构化提示词 / 角色设定 / few-shot 示例
Q14.3 证据包设计
每个决策都能追溯到「为什么这么决定」 — 这是 QTS 的差异化卖点
Q14.4 LLM 输出验证
防止大模型胡说八道直接进入交易 — 多模型交叉验证 / 规则白名单 / 人工 review 关卡
QTSQ15 — 行为金融与心理
Q15.1 常见认知偏差
确认偏差(只看支持自己结论的数据)/ 锚定效应 / 过度自信 / 处置效应(赚了就跑亏了死扛)
Q15.2 纪律性 / 系统化思维
为什么要让机器执行而不是手动 — 机器没情绪,不会因为亏了就乱改规则
Q15.3 亏损心态管理
连续亏损时还能不偏离原计划 — 比策略本身更难
QTSQ16 — 工程与运维
策略写完不是结束 — 能稳定跑下去才是。跟 Part A 第 9 / 12 章衔接。
Q16.1 Linux 基础
服务器常用命令 / 进程管理 / cron 定时任务
Q16.2 Docker 容器化
打包应用环境 / 一次构建到处跑 / docker-compose 编排多服务
Q16.3 云服务基础
VPS(Virtual Private Server 虚拟专用服务器)/ 部署流程 / SSH 远程操作
Q16.4 监控 — Prometheus + Grafana
一对监控数据收集 + 可视化工具 / 实盘必备
Q16.5 CI/CD(持续集成 / 持续部署)基础
每次 push 自动跑测试 + 部署到服务器 — 跟 Part A 12.5 衔接