首页 > 代码库 > 课程助教实战

课程助教实战

原谅我的标题党啦 LOL,借用 《xx 实战》(xx in practice)这个经典的标题,只为了记录自己第一次助教的体会。

如果把第一次助教的经历看做是一个项目,那这个项目也是在我不断的调优中走上正轨的。

需求

导师人很好,给我留的活儿不多,但实践起来还是比预想要复杂一些。助教期间,我主要负责的任务有:

  • 平时作业的批改和成绩录入

    每周老师会将所有学生(大约 80 人)的作业本交给我,由我评分、录入成绩后返回给老师。

  • 课程实验和大程的指导、评分和成绩录入

    一共有五个课堂实验,要求每周完成一个,以实验报告的形式提交;期末要求完成一个大程序,评分有现场验收和大程报告两部分。

  • 协助老师批改期末试卷和成绩录入

最后的批改试卷是在老师们的指导下完成,有良好的规范和流程。而前面两步中关于作业评分、登分的部分则有较大的自由实现空间。下面介绍的就是个人对这部分内容经验总结。

初步实现策略

最朴素的实现方法,会耗费很多的时间,但至少能完成任务:

  • 平时作业的批改和成绩录入
1
2
3
4
5
6
7
8
//拿到所有作业本后,每周我都需要完成如下过程:
loop in 80+个作业本
  拿起笔,翻开每本作业本;
  在作业本上标记成绩;
  放下笔,关上作业本;
  在成绩记录表格上上 CTRL+F 查找到对应的学生;
  输入成绩;
end loop
  • 课程实验和大程的指导、评分和成绩录入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

  //邮件查收实验报告
  loop in 80+个学生的实验报告邮件;
      保存附件;
      回复已经收到;
  end loop
  
  //收集齐所有报告后,开始批改报告
  loop in 80+个学生的实验报告
      双击打开报告;
      浏览评分;
      在成绩记录表格上 CTRL+F 查找到对应的学生;
      输入成绩;
      关闭报告;
  end loop

性能调优

最朴素的方法在使用中带来了巨大的性能瓶颈。

  • 平时作业的批改和成绩录入

实践发现,批改平时作业和登分的过程中,会花掉非常多的实践在拿起笔、放下笔上,就像程序的上下文切换,比较耗时。将批改作业和录入成绩分解成两个集中循环过程,就可以避免这一切换的开销。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

  //改作业
  拿起笔
  loop in 80+个作业本
      翻开作业本;
      在作业本上标记成绩;
      关闭作业本;
  end loop
  放下笔
  
  //录入成绩
  loop in 80+个作业本
      翻开作业本,查看成绩
      在成绩记录表格上上 CTRL+F 查找到对应的学生;
      输入成绩;
      关闭作业本;
  end loop

以上的实现中,作业登分时还是会有大量的翻开、关闭作业本的操作。实际上,批改作业的等级是非常有限的,一般集中在 A+、A、A- 这几个分数上,其他分数如 B+、B、B-只是极少数。很容易想到桶排序的方式:批改作业时,将不同评分的作业放在专属的作业堆中,录入成绩时,只需要按照不同的作业堆录入,而不用翻开作业本。另外,由于书桌空间有限无法设定较多的作业堆,可以将出现较少的 B+、B、B-等分入到 Else 作业堆,批改时再特殊处理。

在给同学登分时,每次都需要根据学号或者姓名 CTRL+F 查找,比较繁琐。优化的方法是建索引。在成绩录入表中给所有同学设定一个简单的编号,然后在同学的作业本的封皮上标记出来,以后每次登分,直接根据 [1, n]的索引就可以快速检索到了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

  //预处理
  给作业本建索引

  //改作业
  拿起笔
  loop in 80+个作业本
      翻开作业本;
      在作业本上标记成绩;
      关闭作业本;
      将作业按照评分放入 A+、A、A-和 Else 这四个堆中
  end loop
  放下笔
  
  //录入成绩
  loop in A+、 A、 A-、 Else 这四个作业堆
      loop in 作业堆
          if 作业堆 == Else 
              翻开作业本;
              查看成绩;
              关上作业本;
          end if
          根据索引查找到学生;
          输入成绩;
      end loop
  end loop
  • 课程实验和大程的指导、评分和成绩录入

在收集实验报告的时候,每次回复邮件也是很头痛的一件事情,容易漏掉回复或者漏掉保存附件。而给报告评分时,也得不断的点开某个文档,然后录入成绩,再关闭这个文档,容易漏评。虽然以在给所有同学评分完毕后再依次清查漏掉的情况,但这个方法确实不够优美。

改进方法是:放弃使用邮件提交报告的方法,搭建 FTP;使用工具(比如 Acrobat)将所有报告连接成单个 pdf 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13

//预处理
FTP 收集报告
使用 Acrobat 将所有 pdf 报告连接成一个汇总报告

//批改报告和录入成绩
双击打开汇总报告;
loop in 80+个学生的实验报告
  浏览评分;
  在成绩记录表格上 CTRL+F 查找到对应的学生;
  输入成绩;
end loop
关闭汇总报告;

总结

以上记录的是可以用工程的优化方法解决的小问题。实际助教的过程中,还有不少是沟通的问题。比如即使告诉过学生们一定使用 pdf 和姓名加学号的命名提交作业,也一定会有学生会使用 doc 格式……还有一些策略权衡的问题,面对几十个学生不比一对一的交流,合适的方法会双方更高效。

做助教容易,做好不易,且行且珍惜。