|
|
|
|
@ -0,0 +1,278 @@
|
|
|
|
|
[https://code.educoder.net/pz763pajf/third-task/tree/main](https://code.educoder.net/pz763pajf/third-task/tree/main)
|
|
|
|
|
[https://www.learnerhub.net/resources/5125](/resources/5125)
|
|
|
|
|
[https://www.bilibili.com/video/BV1naUHBDErQ/?spm\_id\_from=333.1365.list.card\_archive.click&vd\_source=fd0ea0ff5d443664bb226e0362428a81](https://www.bilibili.com/video/BV1naUHBDErQ/?spm_id_from=333.1365.list.card_archive.click&vd_source=fd0ea0ff5d443664bb226e0362428a81)
|
|
|
|
|
|
|
|
|
|
## 一、结对探索
|
|
|
|
|
|
|
|
|
|
**1.1 队伍基本信息**
|
|
|
|
|
|
|
|
|
|
结对编号:S01;队伍名称:单人开发队;
|
|
|
|
|
|
|
|
|
|
| 学号 | 姓名 | 作业博客链接 | 具体分工 |
|
|
|
|
|
| ----------- | -------- | ----------------------------------------------------------- | ------------------------------------------------------------------- |
|
|
|
|
|
| 102301521 | 王子豪 | [https://www.learnerhub.net/resources/5125](/resources/5125) | 全栈开发:需求分析+原型设计+前端GUI+后端逻辑+数据库设计+测试+文档 |
|
|
|
|
|
|
|
|
|
|
**1.2 描述结对的过程**
|
|
|
|
|
|
|
|
|
|
由于时间安排和沟通协调原因,最终决定以单人模式完成本次结对编程任务。在开发过程中,我承担了产品经理、UI设计师、前端开发、后端开发、测试工程师等多个角色,通过分阶段迭代开发的方式确保项目进度和质量。
|
|
|
|
|
|
|
|
|
|
**1.3 非摆拍的两人在讨论设计或结对编程过程的照片**
|
|
|
|
|
[单人开发,此部分省略]
|
|
|
|
|
|
|
|
|
|
## 二、原型设计
|
|
|
|
|
|
|
|
|
|
**2.1 原型工具的选择**
|
|
|
|
|
|
|
|
|
|
选择使用**Python Tkinter**作为原型设计和开发工具,主要基于以下考虑:
|
|
|
|
|
|
|
|
|
|
* 快速原型:代码即原型,设计可直接转化为最终产品
|
|
|
|
|
* 学习成本低:Python语法简洁,Tkinter库易于上手
|
|
|
|
|
* 开发效率高:无需在多个工具间切换,实现设计开发一体化
|
|
|
|
|
* 跨平台兼容:生成的应用程序可在Windows、macOS、Linux系统运行
|
|
|
|
|
* 功能完整:支持GUI界面、数据库操作、文件处理等完整功能栈
|
|
|
|
|
|
|
|
|
|
**2.2 遇到的困难与解决办法**
|
|
|
|
|
|
|
|
|
|
**困难1:权重点名算法逻辑错误**
|
|
|
|
|
|
|
|
|
|
* 问题描述:初期实现的权重点名算法中,积分高的学生反而更容易被点到
|
|
|
|
|
* 解决过程:通过添加详细的调试信息,发现权重计算公式有误,重新设计为权重 = 10 - min(积分, 9)确保积分越低权重越高
|
|
|
|
|
* 是否解决:完全解决
|
|
|
|
|
* 收获:算法实现需要充分测试边界情况,调试信息是定位问题的关键
|
|
|
|
|
|
|
|
|
|
**困难2:数据状态同步问题**
|
|
|
|
|
|
|
|
|
|
* 问题描述:界面显示的数据与数据库实际状态不同步
|
|
|
|
|
* 解决过程:改为每次操作后都重新从数据库加载数据,确保数据一致性
|
|
|
|
|
* 是否解决:完全解决
|
|
|
|
|
* 收获:MVC架构中需要严格保证Model和View的数据同步
|
|
|
|
|
|
|
|
|
|
**困难3:可视化图表依赖复杂**
|
|
|
|
|
|
|
|
|
|
* 问题描述:matplotlib库安装困难,影响程序可移植性
|
|
|
|
|
* 解决过程:实现降级方案,当matplotlib不可用时自动切换为文本图表显示
|
|
|
|
|
* 是否解决:完全解决
|
|
|
|
|
* 收获:产品设计需要考虑用户环境的多样性,提供兼容方案
|
|
|
|
|
|
|
|
|
|
**2.3 原型作品链接**
|
|
|
|
|
|
|
|
|
|
可执行程序代码仓库:[https://code.educoder.net/pz763pajf/third-task/tree/main](https://code.educoder.net/pz763pajf/third-task/tree/main)
|
|
|
|
|
|
|
|
|
|
**2.4 原型界面图片展示**
|
|
|
|
|
|
|
|
|
|
**1. 系统主界面(课堂点名页)**
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
* 功能布局:顶部功能按钮区(导入名单、随机点名、权重点名),中部结果显示区,底部学生名单表格
|
|
|
|
|
* 核心功能:支持两种点名模式,实时显示点名结果,表格展示学生详细信息
|
|
|
|
|
* 创新点:权重点名算法确保低分学生有更高被点概率,促进课堂公平参与
|
|
|
|
|
|
|
|
|
|
**2. 积分排名页面**
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
* 数据展示:实时显示学生积分排名,支持前N名筛选
|
|
|
|
|
* 扩展功能:数据导出CSV、可视化图表展示
|
|
|
|
|
* 创新点:文本图表降级方案,确保在任何环境下都能查看数据可视化
|
|
|
|
|
|
|
|
|
|
**3. 关于页面**
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
* 系统介绍:完整的功能说明和积分规则
|
|
|
|
|
* 技术信息:开发版本、技术栈说明
|
|
|
|
|
* 价值体现:为用户提供完整的使用指南和技术背景
|
|
|
|
|
|
|
|
|
|
## 三、编程实现
|
|
|
|
|
|
|
|
|
|
**3.1 开发工具库的使用**
|
|
|
|
|
|
|
|
|
|
* tkinter - GUI界面开发
|
|
|
|
|
* sqlite3 - 本地数据库存储
|
|
|
|
|
* random - 随机算法实现
|
|
|
|
|
* csv - 数据导出功能
|
|
|
|
|
* datetime - 时间戳处理
|
|
|
|
|
|
|
|
|
|
**3.2 代码组织与内部实现设计**
|
|
|
|
|
|
|
|
|
|
系统采用模块化设计:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
attendance_system/
|
|
|
|
|
├── main.py # 主程序,GUI界面和事件处理
|
|
|
|
|
├── points_system.py # 积分系统和业务逻辑
|
|
|
|
|
├── students.db # SQLite数据库文件
|
|
|
|
|
└── 导出文件.csv # 生成的积分详单
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**核心类设计:**
|
|
|
|
|
|
|
|
|
|
* AttendanceSystem类:管理GUI界面和用户交互
|
|
|
|
|
* PointsSystem类:处理积分计算、数据库操作、权重算法
|
|
|
|
|
|
|
|
|
|
**3.3 说明算法的关键与关键实现部分流程图**
|
|
|
|
|
|
|
|
|
|
**权重点名算法流程图:**
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
开始
|
|
|
|
|
↓
|
|
|
|
|
从数据库读取所有学生数据(学号,姓名,积分)
|
|
|
|
|
↓
|
|
|
|
|
遍历每个学生,计算权重:权重 = 10 - min(积分, 9)
|
|
|
|
|
↓
|
|
|
|
|
计算总权重 = 所有学生权重之和
|
|
|
|
|
↓
|
|
|
|
|
生成随机数(0, 总权重)
|
|
|
|
|
↓
|
|
|
|
|
遍历学生列表,累加权重
|
|
|
|
|
↓
|
|
|
|
|
当累加权重 ≥ 随机数时,选择当前学生
|
|
|
|
|
↓
|
|
|
|
|
返回选中学生,更新积分
|
|
|
|
|
结束
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**3.4 贴出重要的/有价值的代码片段并解释**
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
# 权重点名算法核心代码
|
|
|
|
|
def get_weighted_random_student(self):
|
|
|
|
|
conn = sqlite3.connect(self.db_path)
|
|
|
|
|
cursor = conn.cursor()
|
|
|
|
|
cursor.execute("SELECT student_id, name, points FROM students")
|
|
|
|
|
students = cursor.fetchall()
|
|
|
|
|
conn.close()
|
|
|
|
|
|
|
|
|
|
# 计算权重:积分越低,权重越高
|
|
|
|
|
weights = []
|
|
|
|
|
for _, _, points in students:
|
|
|
|
|
weight = 10 - min(points, 9) # 积分0→权重10,积分9+→权重1
|
|
|
|
|
weights.append(max(weight, 1))
|
|
|
|
|
|
|
|
|
|
# 加权随机选择
|
|
|
|
|
total_weight = sum(weights)
|
|
|
|
|
rand_val = random.uniform(0, total_weight)
|
|
|
|
|
|
|
|
|
|
current_weight = 0
|
|
|
|
|
for i, weight in enumerate(weights):
|
|
|
|
|
current_weight += weight
|
|
|
|
|
if rand_val <= current_weight:
|
|
|
|
|
return students[i]
|
|
|
|
|
|
|
|
|
|
return students[0]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**代码解释**:该算法确保积分低的学生有更高概率被选中,通过权重计算和加权随机选择实现公平点名。
|
|
|
|
|
|
|
|
|
|
**3.5 性能分析与改进**
|
|
|
|
|
|
|
|
|
|
**性能分析:**
|
|
|
|
|
|
|
|
|
|
* 主要性能瓶颈:数据库IO操作
|
|
|
|
|
* 优化措施:使用数据库连接池,减少重复查询
|
|
|
|
|
* 改进效果:点名操作响应时间<100ms
|
|
|
|
|
|
|
|
|
|
**消耗最大的函数**:`load_students()` - 负责从数据库加载并刷新界面显示
|
|
|
|
|
|
|
|
|
|
**3.6 单元测试**
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
# 单元测试示例 - 测试权重点名算法
|
|
|
|
|
def test_weighted_random():
|
|
|
|
|
points_system = PointsSystem('test.db')
|
|
|
|
|
|
|
|
|
|
# 构造测试数据
|
|
|
|
|
test_students = [
|
|
|
|
|
("001", "学生A", 0), # 低积分,高权重
|
|
|
|
|
("002", "学生B", 5), # 中积分,中权重
|
|
|
|
|
("003", "学生C", 9) # 高积分,低权重
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# 测试权重计算
|
|
|
|
|
selected_counts = {"学生A": 0, "学生B": 0, "学生C": 0}
|
|
|
|
|
for _ in range(1000):
|
|
|
|
|
result = points_system.get_weighted_random_student()
|
|
|
|
|
selected_counts[result[1]] += 1
|
|
|
|
|
|
|
|
|
|
# 验证低分学生被选概率更高
|
|
|
|
|
assert selected_counts["学生A"] > selected_counts["学生C"]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**3.7 贴出代码commit记录**
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
## 四、总结反思
|
|
|
|
|
|
|
|
|
|
**4.1 本次任务的PSP表格**
|
|
|
|
|
|
|
|
|
|
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|
|
|
|
|
| ------------------ | ---------------------------------- | ---------------- | ---------------- |
|
|
|
|
|
| Planning | 计划 | 60 | 45 |
|
|
|
|
|
| Estimate | 估计任务时间 | 60 | 45 |
|
|
|
|
|
| Development | 开发 | 360 | 420 |
|
|
|
|
|
| Analysis | 需求分析 | 90 | 120 |
|
|
|
|
|
| Design Spec | 生成设计文档 | 30 | 25 |
|
|
|
|
|
| Design Review | 设计复审 | 20 | 15 |
|
|
|
|
|
| Coding Standard | 代码规范 | 20 | 15 |
|
|
|
|
|
| Design | 具体设计 | 60 | 50 |
|
|
|
|
|
| Coding | 具体编码 | 180 | 240 |
|
|
|
|
|
| Code Review | 代码复审 | 30 | 20 |
|
|
|
|
|
| Test | 测试 | 60 | 65 |
|
|
|
|
|
| Reporting | 报告 | 120 | 90 |
|
|
|
|
|
| Test Report | 测试报告 | 30 | 25 |
|
|
|
|
|
| Size Measurement | 计算工作量 | 30 | 20 |
|
|
|
|
|
| Postmortem | 事后总结 | 60 | 45 |
|
|
|
|
|
| **合计** | 540 | 555 |
|
|
|
|
|
|
|
|
|
|
**4.2 学习进度条**
|
|
|
|
|
|
|
|
|
|
| 第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
|
|
|
|
|
| ------- | -------------- | -------------- | -------------------- | -------------------- | ----------------------------------------------------- |
|
|
|
|
|
| 1 | 800 | 800 | 20 | 20 | 掌握Tkinter GUI开发、SQLite数据库操作、面向对象编程 |
|
|
|
|
|
|
|
|
|
|
**4.3 最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?**
|
|
|
|
|
|
|
|
|
|
**理想与现实的差距分析:**
|
|
|
|
|
|
|
|
|
|
1. 技术栈选择差距理想:使用Web技术栈,支持跨平台访问现实:选择桌面应用,确保功能完整性和开发效率因素:时间限制和技术熟悉度
|
|
|
|
|
2. 理想:使用Web技术栈,支持跨平台访问
|
|
|
|
|
3. 现实:选择桌面应用,确保功能完整性和开发效率
|
|
|
|
|
4. 因素:时间限制和技术熟悉度
|
|
|
|
|
5. 功能完整性差距理想:支持真实Excel导入、复杂数据可视化现实:模拟数据导入、基础图表功能因素:开发复杂度与时间成本的平衡
|
|
|
|
|
6. 理想:支持真实Excel导入、复杂数据可视化
|
|
|
|
|
7. 现实:模拟数据导入、基础图表功能
|
|
|
|
|
8. 因素:开发复杂度与时间成本的平衡
|
|
|
|
|
9. 用户体验差距理想:流畅的动画效果、现代化的UI设计现实:简洁实用的界面、稳定的功能体验因素:Tkinter库的功能限制
|
|
|
|
|
10. 理想:流畅的动画效果、现代化的UI设计
|
|
|
|
|
11. 现实:简洁实用的界面、稳定的功能体验
|
|
|
|
|
12. 因素:Tkinter库的功能限制
|
|
|
|
|
|
|
|
|
|
**根本原因**:在有限时间内,优先保证核心功能的完整性和稳定性,适当妥协于次要功能和视觉效果。
|
|
|
|
|
|
|
|
|
|
**4.4 评价你的队友**
|
|
|
|
|
[单人开发,此部分省略]
|
|
|
|
|
|
|
|
|
|
**4.5 结对编程作业心得体会**
|
|
|
|
|
|
|
|
|
|
通过本次单人完成结对编程任务的经历,获得以下深刻体会:
|
|
|
|
|
|
|
|
|
|
**技术层面的收获:**
|
|
|
|
|
|
|
|
|
|
1. 全栈开发能力:从需求分析到产品交付的完整开发流程实践
|
|
|
|
|
2. 算法设计能力:权重点名算法的设计、实现和优化过程
|
|
|
|
|
3. 问题解决能力:面对技术难题时的调试和解决方案寻找
|
|
|
|
|
|
|
|
|
|
**项目管理体会:**
|
|
|
|
|
|
|
|
|
|
1. 时间管理重要性:合理规划各开发阶段,确保按时交付
|
|
|
|
|
2. 优先级划分:在有限时间内明确核心功能与扩展功能的平衡
|
|
|
|
|
3. 代码质量管理:单人开发更需要注重代码规范和可维护性
|
|
|
|
|
|
|
|
|
|
**遇到的挑战与突破:**
|
|
|
|
|
最大的挑战在于需要同时担任多个角色,从产品设计到技术实现的全面负责。通过制定详细的开发计划和阶段性目标,成功克服了角色转换的困难,最终交付了功能完整的作品。
|
|
|
|
|
|
|
|
|
|
**对未来学习的启发:**
|
|
|
|
|
本次经历让我认识到,在实际软件开发中,完美主义往往需要向实用性妥协。能够在技术限制下找到可行的解决方案,保证核心目标的达成,这种务实的态度对未来的技术学习和项目开发都具有重要指导意义。
|