Skip to content

基础培训 编程作业迭代更新

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完成的任务。