关注选课和刷课的人们 / 特稿

好久不见的特稿,我们来关注大学里很重要的教学环节:选课。

(1) 背景

选课,说起来是个需要技术和运气的工作。或许你觉得「不就选个课还要什么技术」,可在十年前,当正方教务系统刚刚开始在我们学校运行的时候,学生们可是得提前看着选课手册,在规定时间,到机房去完成这件神圣的事情。而现在,趴在床上或许就把课给选了。

现在北理工采用的是,必修课由教务处老师预先排定,不能更改,自己选择选修课的方法。这样的选课没有以前那么复杂,然而也还是有人说自己「莫名其妙地」被选上了几门通选课,结果没去上课,自然就挂了。要是不重视,怎么会连教务系统也不去看?那里面可是可以自己退掉必修课的呢。

背景介绍完了,上干货。

(2) 年级分布

我通过公开渠道,拿到了教务系统 2016 年 1 月选课期间的一些日志,并进行了分析。这些日志的内容为:某用户在某时间访问了教务系统的某个模块。

这段时间学生在教务系统上的操作总次数为 1434363 次,学生总数为 13205 人,也就是说平均每个人为了选课,需要在教务系统上进行约 109 次操作。

看看年级分布。图中的年份是入学年份。显然各年级参加选课的学生都差不多,大四选课的人变少了很多。至于平均操作次数也是在逐年递减的,大一的时候对系统不熟悉,大二了还有实验选修课要抢,而大三大四在中关村,应该是用不着“抢”课了。

(3) 时间分布

拿到数据,我首先想关注的是,大家什么时间选课比较频繁。所以上图。

横坐标前两位为日期,后两位为小时数

可以看到几个高峰,每小时访问量超过 20000 次,也就是平均每秒钟超过 5 次操作。

  • 选课第一阶段、第一批次(13 日 10 时 - 15 日 10 时)的开始:其中 13 日 10 - 12 点达到最高峰,逼近每小时 70000 次,相信这段时间系统是最卡的。
  • 选课第一阶段、第二批次(15 日 15 时 - 19 日早)的开始:因为教务处对选课进行抽签的速度比较快,大概 11 点就出结果,可以再次选课了,所以系统在中午 12 点到下午 5 点这段时间访问量非常大。
  • 选课第二阶段(19 日 14 时 - 21 日早)的开始:这个阶段与第一阶段不同,是要抢课的,流量自然会很大,14 点的访问量达到 50517 次。不过跟选课刚开始比还是小巫见大巫。

我们学校的选课安排特意在第一阶段使用“抽签”的方法,这样相对也公平,教务系统的负担也没那么重。理论上说这个阶段能不能选到课,跟时间是没有关系的,但是第一阶段的流量依然很大。

你会想,是不是大一初来乍到,还不仔细看通知吗?于是我特意把大一的数据选出来,结果如下。

大一(橙色部分)在第一阶段高峰时期的访问量的确占到了将近 50% ,但是在抽签模式下“抢先”的状况绝非是大一信息不畅的结果,大一不背这个锅。有趣的是,大一们觉得自己可以在第二阶段抢到一些课,而学长学姐们显然已经对抢课不积极了,倒是特别喜欢自由“退换课”的时间。

(4) 看看夜猫子

你或许会留意到,第二阶段的凌晨时分,教务系统的访问量也不少。良乡不是断网了吗?这又是什么鬼呢?

首先,你要知道,中关村校区、一些 WiFi 和 VPN 都可以在凌晨访问校园网。

我特意筛选出了一批夜猫子,他们在选课期间的凌晨(0 - 6 时)访问次数超过上面我们提过的平均值 100 次。

注意,2014 级的最多。而且夜猫子有个特点:寂寞。他们的平均操作次数是大众水平的 1 - 2 倍,甚至 2014 级达到了平均 597 次。

不对啊,597 次,你大半夜的就干这个?

这个有趣的数字引起了我的注意,为了更好地了解一些夜猫子的情况,我在这其中挑了几个用户,深入挖掘他们的访问情况。

我首先计算了一下,每个用户在凌晨时分访问的比例,然后排了个序。排在前面的比例大概是 70%(也就是这个用户有 70% 的访问都是凌晨进行的),几个人都是大三,这也比较符合逻辑(大三在中关村不断网)。

我挑了一个 **20132**1 的用户。他在 13 日和 15 日白天分别进行了选课,这两个时间是新的选课阶段开始的时间。而他凌晨的操作都集中在 20 日,他花了 15 分钟时间,刷通选课。

他的最后几条访问记录

我们也看不出来他到底有没有选到自己想要的课。

另外几个大二的记录也是如此。我可以想象他们在黑暗中,无聊而充满希望地刷新着页面,看看有没有捡漏抢课的机会。然而他们坚持了十几分钟,就决定歇会,要不 2 点的时候再试试?

(5) 接近刷课党

你也注意到了,为什么晚上会有机会”刷到课“呢?

总会有同学之间想交换自己选到的课程的情况。大概的做法是,在”先到先得“的选课阶段(不抽签),A 先把课退了,就有一个空位,B 马上再选课,就完成了换课的过程。

然而,这个过程如果在人多的时候做,自然不安全,要是课被别人抢走了呢?所以自然是大多数人都睡觉的时候来换课咯。

当然也可能有一种情况,翻来覆去睡不着,终于想定了,这门选修课我不上了。打开电脑把课退了,然后睡个安心觉。

还记得大二平均值接近 600 次的情况吗?我挑了夜间操作次数最多的一位同学出来,他是 **20142**1,来自软件学院。然后我就看到了下面这一幕。

接近 4 点,这位同学还醒着,然后就开始刷通选课了。他的操作相当有规律,平均 2 秒提交一次请求,看起来似乎是浏览器的自动刷新。也就是说,换课的同学如果没法在 2 秒钟内完成操作,你的课就会被别人收了。

而另外的几位同学,根据操作间隔,看得出是手工刷新的。的确人家也是想用自己的一点勤奋,来拯救自己的运气。

(6) 可怕的技术宅

究竟刷了多少次可以定义为刷课呢?我拉了各年级的操作次数分布图出来。

横坐标为操作次数,纵坐标为人数

基本上,超过 1000 次的都算作是比较不正常的操作了。注意到大一大二的峰谷位置差不多,而大二的“长尾”很明显,毕竟大二的课程需求比较迫切。大二超过 1000 次操作的人一共 37 个,这部分的操作次数平均值为 3405,标准差 3410。

在刷课这个行当里面,最可怕的,莫过于借助“自动”工具的暴力刷课了。比如刚才我们看到的浏览器自动刷新。

为了直面现实,我查询了一下整个选课期间,操作次数最多的用户,超过 5000 次的,也大概是前五,如下。

用户 总操作次数
**20141**1(信息与电子学院) 15400
**20141**9(光电学院) 12379
**20142**9(软件学院) 10151
**20141**2(信息与电子学院) 9741
**20142**0(软件学院) 6912
**20141**0(信息与电子学院) 6845

注:学院信息是我通过其他渠道获得的,非日志内容,不代表我对任何学院的看法。

可以说,超过 5000 次的都是在刷课,不会冤枉错人。我也一个一个看了,有的是用类似浏览器自动刷新的方法在辅助操作,有的是每秒钟成功刷新五六次(还让不让人活了),最厉害的呢,从下午连续刷新了 7 个小时,肯定是开了挂。

当然了,教务系统没有对刷新频率做限制,这个是很不好的做法。但这也不意味着说,一个网站,亦或系统的用户,可以采用非正常的方法,一秒钟连续刷新页面好多次,无端地增加系统负荷,这叫做“滥用”。想彻底避免道德问题,还是得用技术方法来解决。

(7) 我跟一位刷课党聊了聊

在这次选课之后,也是准备做这个专题之前,我无意采访到了一位刷课党。

我想他是一个萌弟纸,但是他运气特别不好,实验选修课三个学期都没“自然”选上。而且他还准备留学,学分不够多怎么行啊。他也想了很多办法,比如跟熟悉的老师“蹭”实验课,但这种好事也不可能常有。最终今年,他在听了同 (ji) 学 (you) 的建议之后,自己动手码代码了。

结果呢,刷课开始一个小时,他就停下来了,也就是刷到课了。

当然这种事情也不是太光彩,他也是十分低调的。最早呢是他来问我为什么周围同学会有丢课的情况,我试着把日志抓了下来,丢课问题没研究,倒是发现了新大陆。我一个微笑发过去,他就发了个害羞回来。

结果在我没话找话之下,他吐了一会槽之后,我倒是能理解他了。也是心疼这个弟纸。

毕竟他自己也说,下次要是能自己选到课,才不刷课呢。

(8) 关于丢课,还有建议

最近终于抽出几个小时的空闲,研究丢课的问题。根据日志,选课期间没有人为了“偷课”而在短时间内“遍历”超过 50 个人的账号,不过猜密码和抓自己班里成绩的倒是有。

所以如果真的有丢课的情况,更可能是熟人作案。因为有可能是一台电脑大家借着用,校园网的 IP 也是动态分配、可以复用的,所以我没有办法在得到当事人确认的情况下,判定谁在“偷”。

如果你在年初的选课期间遇到了丢课的问题,不妨在下面留言,我跟你私聊看,帮你查查有可能是什么问题。

还是想提醒各位,教务系统很重要,改一下默认密码总比不改安全

而如果你准备换课,我建议你在太阳还没升起之前的一段时间来换,这样是相对比较安全的。换完课了顺便看看日出,多好。至于说退课,随便什么时间都可以退,反正别反悔就是了,你也没机会反悔的。

“关注选课和刷课的人们 / 特稿”的一个回复

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)