两年前这个公众号做过一篇特稿,分析了“公开渠道的教务系统 2016 年 1 月选课期间的一些日志”。写那篇文章让我直面了刷课这个事情,还意外地小小采(tiao)访(xi)了下某个同学。
两年过去,变化还是挺大的。比如,我校教务处终于把新的教务系统完整上线了。还比如,自从上个月新教务系统第一次选课开始,更多的人听说了“刷课”这个词。已经不需要抢课的我,只听说了这次选课期间有人卖课啥的。虽然实际上可能并没这么“道德沦丧”,但大家对这个行为的不齿,是多了一些。
我好奇的是,为啥 2018 年的刷课行业发展成这样子了?新的教务系统并没有可以从公开渠道获取的日志,不过从旧教务系统里看过去几年的趋势,还是可以的。于是这次我使用 Elastic Stack 处理了更大跨度的数据(灌数据进去挺折腾的,不过非常高效),从 2014 到 2017 年选课期间的本科选课操作日志中,得到了下面的一些数据。(以下数据均来自旧教务系统,下简称“教务系统”)
如果太长不想看,这是五组数据的梗概:
一. 大二到大三、2016 至今,进入刷课频道:2017 年暑假 2015 级选课期间操作次数人均 496 次,创了记录。
二. “刷课”一直是少数,但这 0.5% 的玩家越来越多:四年来用户操作次数中位数保持在 50 - 65 之间,刷课的人数成倍增加,在 2017 年寒假达到顶峰。
三. 教务系统的压力从来不小,峰值 QPS 95,大多因为“人多”:选课第一天明明不用抢也是挤爆,卡起来就是死 10 秒钟又闪现 20 秒的体验。
四. 单用户刷课平均每秒 17 次,问你怕不怕:靠刷课党们一“己”之力,还是可以把教务系统搞慢的,最疯狂的人连续一分钟操作 1060 次。
五. 午夜档的热闹从第二阶段开始,刷课党也就个位数:如 2017 年暑假第二阶段的第一场午夜档 218 人参加,其中操作频率极高的也就 5 个人。
一. 大二到大三、2016 至今,进入刷课频道
先看看每个人选课有关的操作次数的年级平均值。很明显,人进入大二之后,大家开始意识到选课没那么容易,选课操作次数的增加体现出了焦虑感。到了大三,2013 级和以前是下降的趋势,而 2014 级开始,不知是技术增强了还是啥情况,操作次数越来越多,直到大四才回归平静。
把线平移一下,改改坐标轴,2016 年成为了刷课次数增加的关键之年。这个图里 2015 级的选课次数冲出了天际,2017 年的两次选课人均 469、496 次,跟 2014 级的最高纪录 318 次相比,真是要冲破天花板了(顺便提示一下 Y 轴是指数坐标轴,所以差距看起来似乎不大)。
二. “刷课”一直是少数,但这 0.5% 的玩家越来越多
提到刷课这个词,大家通常会想到那种技术宅,通过代码达到普通人达不到的手速和耐心。最初我并不敢这么想,毕竟只要有耐心,刷上几百次也很正常嘛,这样的有罪推定还是挺不靠谱的。然而两年前看过具体的日志之后,我对当时选课期间操作超过 5000 次的用户的结论是:
有的是用类似浏览器自动刷新的方法在辅助操作,有的是每秒钟成功刷新五六次(还让不让人活了),最厉害的呢,从下午开始连续刷新了 7 个小时,肯定是开了挂(我就不信您不吃晚饭)。
这些年过来,刷课的人数变多了吗?通过对每次选课的选课操作次数的人均分布统计,结论见下。
把图做完之后我还蛮意外的,曲线统一的形状让我一度以为自己算错了。然后我在 Access 里折腾了好久把中位数算出来,都在 50 - 65 之间,所以应该没错。
图的结论就是,这么多年,选课次数分布没有大的变化,但刷课顶峰值是一年比一年高,尤其从 2016 年暑假那次选课开始。结合第一节的图,2017 暑的回落可能的原因是 2014 级变成大四老油条了,和 2016 级迷之不抢课、选课次数减少。再次提示,这回 X 轴是指数坐标轴。
再仔细看看顶峰 3% 的三五百人。两年前的“5000 次操作就是刷课”的假设暂且可以沿用下来,因为这部分人数保持在占全体 0.5% 以内。随着年份推进,刷课的人数成倍增加,尤其在 2017 寒达到顶峰。至于说 2018 寒的情况,这里没有数据,不过我猜是少不下来了。
三. 教务系统的压力从来不小,峰值 QPS 95,大多因为“人多”
刷课对教务系统会有多大影响呢?虽然有些不控制频率的刷课行为是很不好的(我方表示强烈谴责),然而目前教务系统的主要压力还是来自“人多”。
先介绍一个指标 QPS (Queries Per Second),也就是每秒钟服务器处理的请求数。采用了新的统计工具之后,我终于能快速地从日志中观察这个指标了。
1.1 和 1.2 是第一阶段的两个小阶段,分别进行一次抽签,选课没有先后。2 阶段是先到先得,3 阶段是退换课,也是先到先得。刷课是第 2、3 阶段会出现的。
从表里可以看到,选课刚开始的 1.1 阶段人是最多的(14 寒那个不知道是什么鬼情况)。明明是抽签,登录系统选课并没有先后,但开放选课的第一天就是容易挤爆门。然后旧教务系统的 QPS 极限大概就是 95 了。当然 2017 年寒假第 2 阶段的爆炸挺反常,那一分钟服务器只接待了 12 人,跟之前 200+ 的水平差距太多。看来区区几个人还是有能力把系统刷爆的,我们待会看。
从日志就可以感受到人最多的时候,那种服务器的卡顿,就是死个 10 秒钟又闪现 20 秒的体验。
最糟的莫过于整台服务器“挂了”,就是连续一两分钟服务器都没反应那种。2016 年寒假开放选课第一天,这种情况就出现了三次。
四. 单用户刷课平均每秒 17 次,问你怕不怕?
刚才提到 2017 年寒假第 2 阶段的疯狂,究竟是怎么一回事呢,今天让我们走近科学(误)。
先看上面这个图的高峰时段。1.1 阶段第一天的高峰,主要集中在 10 点和
12 点两拨,基本上可以看出各年级的上课时间(和上课专心程度)。1.1 和 1.2 阶段之间的高峰,主要是因为教务系统抽签结果通常会提前发布、大家迫不及待想知道选上课了没。
回到我们关注的第 2 阶段。还是要接着解释一下曲线,顺便对比一下的。
- 大一青色曲线的高峰出现在 11 号 17:57,也就是快要开始第二阶段的时候。可以认为是大量萌新出来捡漏。
- 大二红色曲线可就厉害了,几个非常诡异的顶峰出现在 13 号的白天。最顶峰在当天晚上 9 点左右,基本可以认定是他们把教务系统推到了 QPS 90 的高度。
- 大三黄色的顶峰出现在 13 号 0 点。这是学长学姐熬夜比较强的意思吗。
- 大四黑色冒出来的那 15 个小时只有一个人操作频繁。我看了下,是个法学院的妹子……
具体看 13 号晚上 8:00 - 9:30 的数据。每分钟操作频率超过 60 次的朋友有 7 位,其中 6 位是大二。他们分别来自软院、法学、机车、数院(这里不跟上次一样挂人了,没意思)。其中最疯狂的朋友在连续的一分钟内刷新了 1060 次,也就是平均每秒 17 次,让我大开眼界。原来靠他们一己之力,还是可以把教务系统搞慢的。
于是在 21:13:20, 教务系统的 QPS 达到 90 之后又坚持了 20 秒,终于撑不住歇了一会。
五. 午夜档的热闹从第二阶段开始,刷课党也就个位数
从 2016 年暑假选课开始,午夜档剧场就开始热播了。这时候,午夜档还只在第二阶段最后一天凌晨开播。而到了 2017 年寒假,午夜档从第二阶段开始连播三天(最后一天人少得很)。上面这图是 2017 年暑假的午夜档,也是从第二阶段开始连播两天,最后一天就散场了。
基本上,都是第一场午夜档最热闹。比如上面这图,2017 年暑假第二阶段的第一场,218 人参加,不过显然大部分人还是看热闹,还没坚持到 2 点就睡着了。2:00 - 6:59 参加的有 45 人,不过每个小时最多就 17 个人,开个小厅给他们就足够了,因为不少人还会出去看看月亮,找个地方静静。而这四十多人里,操作频率极高的也就 5 个人,整场下来上万次吆喝,对他们来说是再正常不过了。
好多人想趁第 2 阶段换课啥的,在这种情况下似乎挑午夜档也并不保险,操作需要智慧,也需要运气。当然新教务系统是个什么情况我就不知道了。
结语
看完数据,感觉刷课的人还是那么少,虽然数量在增加,但“少数”这个性质没变。可能人数变多了,接着有人得瑟起来之后,大家就都知道这种不齿的行为了。
写这种文章还是得站个队的。两年前写完那篇特稿之后的下一次选课,我用了不到 100 行代码,捡了一门别人的退课(上过课才知道为啥他们退课),说起来也不是那么光彩。不过我的观点依然跟两年前一样,所以直接引用之前写过的话好了:
教务系统没有对刷新频率做限制,这个是很不好的做法。但这也不意味着说,一个网站亦或系统的用户,可以采用非正常的方法,一秒钟连续刷新页面好多次,无端地增加系统负荷,这叫做“滥用”。想彻底避免道德问题,还是得用技术方法来解决。
这个事情,跟抢火车票差不多的道理。技术可以代替人的重复劳动,从对信息的了解和技术的掌握而言,“抢”这个规则本身还是存在不公平的。从反制的角度说,技术可以解决一部分问题,但更重要的是制定规则,这样之后,刷课技术的加成导致的落差就没那么悬殊了。
转过头想,似乎管选课这个事情还是挺难的,难在要面对其他人的态度。或许这就是社会主义初级阶段吧。
本文采用知识共享“署名-非商业性使用 4.0”许可协议授权,如需额外授权请与本人联系。本文的 1 次修改记录主要是润色句子,基本数据不变。