计划写一系列随笔,记录一个工具软件的开发过程,这是第一篇随笔,写本篇随笔的初衷是帮助我整理一下当前的需求详情,同时复习最近所需的软件工程相关知识,如果能对读者有所帮助,那算是这篇文章产生的额外价值了。需要注意的是,这不是一篇遵循标准规格的需求文档,因为其中可能夹杂着知识注解和引用,以及个人观点。
背景信息
在小学实习期间(2024年3月1日 - 2024年7月10日),与老师的交流中发现,每当新学期开始都要人工排一次课表,并且这个过程较为繁琐,总是遇到教师课程冲突的状况,一旦发生这种情况,在重排的过程中就会影响到诸多已经排好的项目。如果能够解决上述排课冲突问题,那将会给排课老师带来极大的便利,这便是我着手开发这个小工具的初衷。除此以外,在最近的软件设计师资格考试备考期间,较为全面但却相当浅薄的学习了软件工程相关知识,考虑到使用工程化的方法流程解决该课题的过程会增进我的软件工程技能,这是我能坚持做这件事的原因。以上便是该项目的背景信息。
需求概述
该软件的定位是一个具有单一功能小工具,运行在单一用户的电脑上,在操作上,该用户通过某种方式输入课程相关数据,提交过后程序将全年级的课表以某种格式输出出来。排课结果应遵行基本的原则是一个教师不能在同一天的同一课次出现在两个或多个不同的班级,除此之外还有一些次要约束。用户期望每个班级的课表以一个带有指定样式的 Word 文件输出出来。用户希望该工具的操作界面应该尽可能简单,数据的输入可以在 Excel 表格中进行,输出的信息可以直接投入使用,而不必再次经过手工处理。
在与实际用户详细沟通需求之前,我已经交付了一个简陋的应用原型,该原型实现了用户所需的主要功能,在该原型下,用户的工作流是这样的:首先用户在一个 Excel 工作区中分别建立课表模板、课程信息、以及职责分配信息这三个表,完成上述表格的编辑后,打开软件将该 Excel 工作区导入,并选择课表的输出路径,其中一个可选项为是否在输出结果中显示每节课的教师名称,随后提交数据,程序输出一个 Excel 工作区,该工作区中包含所有班级的课表数据。
用户对此软件的使用工作流比较满意,在后面的交流中用户依旧表示可以继续沿用这种数据的输入与输出方式,在操作界面上不需要有过多的更改。经过进一步地沟通,现在基本上已经可以确定用户的需求有哪些:
界面需求
用户对于程序操作页面没有添加新的要求,所以可以延续原型的样子。
在输入上延续原始的输入方式,即用户在 Excel 工作区中编辑三个表,分别是课表模板表、课程信息表以及教师职责信息表。
模板信息表的第一行用来标注星期(从星期一到星期五),第一列用来标注上课的节次,在接下来的行和列中,空单元格预留给待分配的课表项目,将固定分配的课表项目填写到指定位置,这代表该年级中的每个班级都会在这个时刻上这节课,且不会出现课程冲突,这种固定项往往出现在每天的最后一节课或者每周的班会课。
课程信息表的第一行数据为四个课程属性:序号、课程名、每周上课次数以及优先级,其中优先级决定了那些学科分布在课表的前列,那些分布在后列。经过商议,该用户不需要编辑优先级这一列的值,因为一年级的课程信息几乎没有变动过,总是语文、数学以及科学占满了每个班级、每一天的前两节课,其余的科目不做过多的限制。所以在接下来的设计中不在提供给用户编辑优先级的接口。
教师职责信息表的第一行数据为课程信息数据,该行数据应该与课程信息表中的课程名信息保持一致,其实这两个表可以合并为一个表。第一列数据为班级,每个班级以及科目决定一位教师,这是这三个表中最为关键的一个表。
在输出上用户提出了新的需求。用户希望每个班级的课表输出在一个 Word 表格文件中,并且设置为指定的样式,这样就可以直接使用该输出结果打印每个班级的课表。该样式是这样的:
功能需求
编号 | 名称 | 说明 |
1 | 无时间冲突 | 在某一时刻(同一天的同一节次)一个教师不能被分配到两个或两个以上不同的班级 |
2 | 分级填充 | 高优先级的科目应尽可能填充课表的前半部分,低优先级的科目只有在高优先级科目分配完成后前半部分依旧存在空缺的情况下才能分配到前半部分 |
3 | 完整性检测 | 要确保所有教师负责的科目的总节次的数目等于全年级课表可分配节次的总数。同时每个班级各个科目被分配的相应课程的节次总数等于课程信息表中指定的次数。 |
4 | 非连续性分配 | 不能让同一个班级在同一天中连续上同一个学科的课程 |
5 | 均匀分配 | 同一学科的课程应尽可能均摊到每一天中 |
总结
除了上述界面需求以及功能需求外,用户在性能、文档、安全保密、可靠性以及其他非功能需求上没有做要求,所以我自然不必在这些需求上投入过多的时间和精力。在已经开发完成的原型程序中,已经实现了上述功能需求中的第 1,4,5 条,可是代码相当令人难以直视。核心文件是一个 python 单文件,GUI 使用 QT 构建,最终形成的竟然是一个超过 44M 的可执行文件。暂且不谈这个程序的臃肿程度,在我的核心代码中,使用的 for 循环层数达到了 4 层,我希望接下来能够找到一种适用于课表的数据结构以及算法来缓解这种问题。
标签:需求,课表,班级,排课,用户,信息,搜集,课程,整合 From: https://www.cnblogs.com/gaotianchi/p/18161826/course-scheduling-gadget-collection-and-inte