基础培训 编程作业迭代更新
10分钟讲授内容
by @jiegec
1. 什么时候需要迭代更新一项编程作业?
举例来说,当作为助教的你听到了如下的说法:
- 作业好卷,时间都花在卷上了,没什么收获
- 上手好难,第一步就卡住了,担心自己做不出来
- 求求助教延迟 deadline 吧
- 垃圾题目,挂朋友圈/知乎
- 这么多年前的祖传作业,怎么还在出
- 和教学内容没有关系,和前后的作业也没有关系
- 缺少评分标准,不知道写多少合适
或者在答疑/批改的时候冒出了如下的想法:
- 这个作业批改起来太费劲了,两百多人,批改起来累死了
- 如果让我做这个作业,我都不想做
举例:
某课的某实验:实验涉及到的服务端搭建困难,实验教材上写的是 Windows XP;Linux 上虽然可以起服务端,但是涉及到虚拟机、WSL 等等,配环境的复杂性过大,和实验本身无关。
修改:提供实验的观察结果,不再需要配置环境和复现实验过程
某课某年某实验:针对基础实现,文档提供了 A、B、C、D 四条不同的优化路径,但设置了过高的性能要求,导致只有 D 优化路径可以达到要求。同学完成 A ,发现性能达不到要求,又去做 B,再次发现性能达不到要求,会感到十分气馁。
修改:提供更多提示,改进性能要求
2. 编程作业的变与不变
确定一项编程作业需要迭代更新后,首先需要思考:什么要变?什么不变?
什么是不变的:
作业被设计出来是为了什么?
数据结构:上课讲了数据结构和算法,那么 PA 就要把上课讲的内容用代码实现出来,应用在特定的问题上
网络原理:同学很少处理二进制数据,并且后续的实验也涉及到很多二进制数据的处理,因此把二进制数据的处理拆出来单独练习
这些教学目标是不应该变的,要传授的知识尽量保留(除非超纲/过时)
什么是要变、可以变的:
- 作业内容:涉及哪些环节,布置哪些要求
- 时间安排:什么时候开始,什么时候结束
- 评分标准:做到多少给多少分
- 难度梯度:整体都很简单/从易到难/整体都很难
3. 如何迭代更新编程作业
决定了哪些东西要变,哪些东西不变以后,就要开始动手了!
动手时机:
- 开学前尽早动手,至少要在布置作业前完成
注重反馈:
- 布置作业后及时收集反馈,补救发现的问题, 学期内也可以根据前面作业的反馈修改后面的作业
沟通协调:
- 课程内助教间做好沟通,不要把半成品公布出去,如果要临时把半成品放到公开的网站,那么要明确打上标记:TODO/半成品/非最终版
- 课程间助教沟通:DDL 避免冲突,工作量大的作业尽量错开
更多注意事项:
- 迭代更新不一定一个学期/学年就要做完:可能需要多年逐渐改进,甚至多个助教接力进行改进
- 做好代码和文档管理,整理好 FAQ,保证延续性和可更新性,保留原始文件,避免出现祖传一份 PDF 还没法改的情况
- 合理利用 GitLab,清华云盘,腾讯文档,问卷等工具
- 找其他助教/同学评估新的作业难度,自己也至少要做一遍
- 预想一些可能出现的情况,思考一些应对方法:太难、太易、有错等等
参考其他优秀的编程作业, 可以从中获取启发。
国外:
- CSDIY.wiki
- SIGCSE Nifty Assignments
- MIT opencourseware
- Stanford/CMU/Berkeley......等学校的公开课程
- 注意: 课程名未必一一对应, 即使课程名翻译后相同, 课程定位也未必相同
国内也有一些优秀的编程作业可参考。例如清华: https://lab.cs.tsinghua.edu.cn/#/sypt/sywd
讨论话题
- 最近几年你都改过什么编程作业?迭代更新的背后有什么有趣故事?
- 讲讲你正在上的本科生课/研究生课,它的作业有没有觉得需要修改的,可以怎么改?
- 如何评估作业迭代后的效果?改得更好了,还是更不好了,还是毁誉参半?
- 如何把作业迭代成 LLM 不会做的形式?
一些观点:
可以考虑将更接近真实世界情景的项目和问题拿到课程中来,或者考虑增加一些可视化、画图的环节。
把作业迭代成LLM不会做的形式, 不应当是为难同学、为了让作业变难而变难。而是更类似于: 线性代数课程在计算机和matlab等作业发明后, 不在作业中过多要求学生完成本应当由计算机和matlab完成的任务。