构建进程调度模拟器:重新学习 TypeScript 与降低 AI 依赖
Source: Dev.to
几周来,我没有写任何真正的 Next.js 或 TypeScript 代码,而是严重依赖 AI 工具。在操作系统课程中学习 CPU 调度算法时,我决定为它们构建一个可视化工具。结果它成了迫使我重新手动编码的完美项目。
问题
- 我只能完成基本的 Next.js 模板。
- 简单的任务——创建一个虚拟数据对象、按到达时间对进程进行排序——让我束手无策。
- 我最近的课程是 C++/Java,所以我甚至在 TypeScript 中写了
int而不是number。
领悟: 技能如果不练习就会退化。
重置
我设定了一个简单的规则:核心逻辑不使用 AI。
如果我忘记了某件事,我会:
- 查看官方文档。
- 在 Stack Overflow 上搜索。
- 以传统方式查阅参考资料。
起初感觉很慢且令人沮丧,但逐渐地:
- TypeScript 类型和数组方法恢复了。
- 设计 TypeScript 接口很快恢复(结构化思维比语法细节更持久)。
调整我的 AI 使用
完全拒绝 AI 并不现实;现代开发拥抱各种工具,包括 AI。
我没有让 AI 完全生成整个应用,而是将它用于:
- 讨论组件结构和界面设计。
- 审查我已经编写的代码。
- 质疑命名选择和架构决策。
- 建议更清晰的变量、类型和函数名称。
- 在决定之前探索设计权衡。
Result: 我编写了代码,AI 对其进行了审查。 这种区别很重要——代码更整洁,命名更好,文件夹结构更有条理,同时不牺牲学习。
项目:交互式进程调度模拟器
用户可以做什么
- 输入 进程列表(到达时间、CPU 时间、可选优先级)。
- 运行 多种调度算法。
- 即时查看 结果,通过甘特图和详细的指标表。
支持的算法
| Algorithm | Description |
|---|---|
| FCFS – First Come First Serve | 简单的非抢占式。 |
| SJF – Shortest Job First (non‑preemptive) | 选择最短的 CPU 时间。 |
| SRTF – Shortest Remaining Time First (preemptive) | 每一步跟踪剩余的 CPU 时间。 |
| Priority Scheduling – preemptive & non‑preemptive | 使用进程优先级。 |
| Round Robin – configurable time quantum | 维护就绪队列和时间片。 |
计算的指标(每种算法)
- 完成时间
- 周转时间
- 等待时间
- 响应时间
也会计算平均值。
一个小但重要的细节:模拟器能够正确处理 CPU 空闲时间,这在学习调度时很容易被忽视。
Source: …
技术栈
- 框架: Next.js(App Router)
- 语言: TypeScript 5
- UI 组件:
shadcn/ui+ Radix UI - 样式: Tailwind CSS v4
- 表单与验证: React Hook Form + Zod
- 图标与主题: Lucide React,
next-themes
架构要点
- 关注点分离: 算法逻辑独立于 UI,便于测试和推理。
- 验证: Zod + React Hook Form 提供干净的验证,即使在动态数量的进程和字段间约束下也能正常工作。
- 严格类型: 确保算法之间的一致性。
我曾短暂考虑为这些算法创建共享抽象以减少重复,但最终仍将它们分开。目标是理解每个算法,而强行使用通用抽象会掩盖我需要看到的细微差别。
- 显式代码 > 学习时的巧妙抽象。
- 常量(
fcfs、sjf、srtf,…)取代魔法字符串,提供自动完成和类型安全。
经验教训
技术
- 加深了对调度概念的理解:
- Preemption
- Context switching
- Starvation(尤其在 SJF 中)
- Impact of time quantum in Round Robin
个人
| 极端做法 | 结果 |
|---|---|
| AI 完成整个项目 | 代码可运行,学习最少。 |
| 完全不使用 AI | 高尚,但在现代开发中不切实际。 |
有效的折中方案: 自己编写逻辑,让 AI 完善它。 这保持了我的思考过程,同时仍受益于另一双眼睛的审视。
开源
项目已在 GitHub 上提供:
🔗 (仓库名称已截断以示简洁)
随意探索、分叉或贡献吧!
Cess 调度可视化
实时演示:
🔗
如果你正在学习操作系统,并且想了解调度算法在实际中的表现,这个工具可能会有所帮助。
即将推出的想法
- 多级队列调度
- 多级反馈队列调度
- 时间线动画
- 自动化测试
- CSV 导入输入和导出结果
- 步骤式执行并附解释
最好的学习项目是那些在开始时感觉稍微有点困难的项目。如果从第一行起一切都很舒适,你可能并没有在成长。