Add 2025软工L班结对编程任务.md

main
pz763pajf 5 months ago
parent 37fcd4591f
commit dac2cf3c1a

@ -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. 系统主界面(课堂点名页)**
![](https://file.learnerhub.net/tinymce-image-1763799566538--image.png)
* 功能布局:顶部功能按钮区(导入名单、随机点名、权重点名),中部结果显示区,底部学生名单表格
* 核心功能:支持两种点名模式,实时显示点名结果,表格展示学生详细信息
* 创新点:权重点名算法确保低分学生有更高被点概率,促进课堂公平参与
**2. 积分排名页面**
![](https://file.learnerhub.net/tinymce-image-1763800764371--image.png)
* 数据展示实时显示学生积分排名支持前N名筛选
* 扩展功能数据导出CSV、可视化图表展示
* 创新点:文本图表降级方案,确保在任何环境下都能查看数据可视化
**3. 关于页面**
![](https://file.learnerhub.net/tinymce-image-1763799806710--image.png)
* 系统介绍:完整的功能说明和积分规则
* 技术信息:开发版本、技术栈说明
* 价值体现:为用户提供完整的使用指南和技术背景
## 三、编程实现
**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记录**
![](https://file.learnerhub.net/tinymce-image-1763800118183--image.png)
## 四、总结反思
**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. 代码质量管理:单人开发更需要注重代码规范和可维护性
**遇到的挑战与突破:**
最大的挑战在于需要同时担任多个角色,从产品设计到技术实现的全面负责。通过制定详细的开发计划和阶段性目标,成功克服了角色转换的困难,最终交付了功能完整的作品。
**对未来学习的启发:**
本次经历让我认识到,在实际软件开发中,完美主义往往需要向实用性妥协。能够在技术限制下找到可行的解决方案,保证核心目标的达成,这种务实的态度对未来的技术学习和项目开发都具有重要指导意义。
Loading…
Cancel
Save