原谅我的标题党啦 LOL,借用 《xx 实战》(xx in practice)这个经典的标题,只为了记录自己第一次助教的体会。
如果把第一次助教的经历看做是一个项目,那这个项目也是在我不断的调优中走上正轨的。
需求
导师人很好,给我留的活儿不多,但实践起来还是比预想要复杂一些。助教期间,我主要负责的任务有:
-
平时作业的批改和成绩录入
每周老师会将所有学生(大约 80 人)的作业本交给我,由我评分、录入成绩后返回给老师。
-
课程实验和大程的指导、评分和成绩录入
一共有五个课堂实验,要求每周完成一个,以实验报告的形式提交;期末要求完成一个大程序,评分有现场验收和大程报告两部分。
-
协助老师批改期末试卷和成绩录入
最后的批改试卷是在老师们的指导下完成,有良好的规范和流程。而前面两步中关于作业评分、登分的部分则有较大的自由实现空间。下面介绍的就是个人对这部分内容经验总结。
初步实现策略
最朴素的实现方法,会耗费很多的时间,但至少能完成任务:
- 平时作业的批改和成绩录入
1 2 3 4 5 6 7 8 |
|
- 课程实验和大程的指导、评分和成绩录入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
性能调优
最朴素的方法在使用中带来了巨大的性能瓶颈。
- 平时作业的批改和成绩录入
实践发现,批改平时作业和登分的过程中,会花掉非常多的实践在拿起笔、放下笔上,就像程序的上下文切换,比较耗时。将批改作业和录入成绩分解成两个集中循环过程,就可以避免这一切换的开销。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
以上的实现中,作业登分时还是会有大量的翻开、关闭作业本的操作。实际上,批改作业的等级是非常有限的,一般集中在 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 |
|
- 课程实验和大程的指导、评分和成绩录入
在收集实验报告的时候,每次回复邮件也是很头痛的一件事情,容易漏掉回复或者漏掉保存附件。而给报告评分时,也得不断的点开某个文档,然后录入成绩,再关闭这个文档,容易漏评。虽然以在给所有同学评分完毕后再依次清查漏掉的情况,但这个方法确实不够优美。
改进方法是:放弃使用邮件提交报告的方法,搭建 FTP;使用工具(比如 Acrobat)将所有报告连接成单个 pdf 文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
总结
以上记录的是可以用工程的优化方法解决的小问题。实际助教的过程中,还有不少是沟通的问题。比如即使告诉过学生们一定使用 pdf 和姓名加学号的命名提交作业,也一定会有学生会使用 doc 格式……还有一些策略权衡的问题,面对几十个学生不比一对一的交流,合适的方法会双方更高效。
做助教容易,做好不易,且行且珍惜。