全文5507字,阅读约需9分钟。
本报记者李润泽经济大学2018级本科生姜贤昱 社会学系2018级本科生王,外国语学院2019级本科生凌晨1点,手机闹钟唤醒了趴在桌子上的晏安。浏览器已帮他自动填入密码,他迅速按下了选课系统的登录按钮。浏览器弹出提示:“正在登录…”。他憋住一口气,准备好看到空余名额后立即输入验证码补选。可惜期待落空,这门课仍是选满的状态。延安这次放弃了英语课。他决定熬夜补考,因为他听说选课网会在晚上发布课程数量。当时他不会想到这也是一个补选的课程,有人只需要配置一个程序,然后输入指令运行,然后就可以放心睡觉了。补选的所有操作将由程序自动完成。在校内,这种程序被称为:刷课机。△根据322份问卷调查结果,问卷发放给北京大学本科生
选课网与刷课机“刷机一般是指通过模拟用户操作,不断选择课程,从而尝试选择某一门课程的程序。”这是MediaWiki平台开发者亨利在2012年对刷机的定义。2007年,根据教务部的要求,计算中心开始承担选课系统的开发工作。当时的选课流程与现在并无二致,均包括预选、抽签、补退选、补选四个阶段,2016年起补退选中增加了跨院系选课阶段。学生在预选阶段将目标课程加入列表,并在不同的课程间分配总和为99的“意愿点”,以提高抽签选中概率。补退选阶段,学生自由选课或退课,多人抢同一节课时先到先得。△旧版本选课网络预选界面
在补退选阶段,对于手动选课者,先到先得的方法保证了公平,但操作费时费力。选课者需要不断刷新页面,查看待选课程有无空余名额。简单的重复过程正适合用程序执行,据计算中心应用二室主任来天平回忆,刷课机在选课网投入使用的时候就出现了。虽然最早的程序没有经过验证,但是刷类机的工作原理基本相同。萧百图是开源平台GitHub上的一个类刷机项目PKUAutoElective的作者。他说:刷课机的核心是程序自动刷新界面,一旦发现要选择的班级超过空个名额,就会立即选择。此外,为了模拟人的行为,刷课机还要设置刷新间隔,在每次刷新之间进行短暂的停止。实际暂停时间围绕设定值上下浮动,主要取决于偏移量的大小。这些设置一般采用默认参数,但也允许用户自行修改。在原有的选课系统中,补选过程中不需要输入验证码,因此开发刷课机非常困难。为了限制刷课机的使用,计算中心在这个阶段增加了一个验证码,要求学生输入验证码后才能进行补选操作。起初验证码的模式比较简单,但后来计算中心增加了复杂度,要求区分大小写,形成了现在的验证码形式。但增设验证码的作用有限,“人工填写验证码、程序自动刷课”的方式让刷课机避开了识别验证码的过程。“PKU选课助手”是基于JavaScript语言编写的Chrome浏览器插件,能够在用户自己输入验证码后自动刷新意向课程,发现有空余名额后立即选课。该插件曾在Chrome网上应用商店发行,但于2019年1月下架。△PKU选课辅助界面
萧柏途表示,早在2016年前后,浏览器的选课插件就已经在GitHub上开源了。当时他认为这个插件不够智能,仍然要靠手动输入验证码,因而产生了开发一个“全自动”刷课机的想法。2019年2月,萧百图在GitHub上开设了pkuautautical。程序基于Python编写,无需任何人工操作,即可自动完成从登录系统、填写验证码、反复刷新、选择目标课程的所有步骤。他为此专门开发了验证码识别模块,使得识别准确率达到95.6%。但选课网也对刷课行为设定了防护,短时间内多次点击“选课”的操作会被后台判定为刷课机,系统将发出提示并退出登录,用户必须重新登录才能继续选课。但因为设置了刷新间隔,多数刷课机不会产生上述违规行为,当前的防护水平主要防止了刷课机高频率选课操作干扰系统正常运行。随着刷机功能的日益强大,批评和质疑也逐渐增多。随着“退课事件”的发生,关于刷机安全性和稳定性的争议成为焦点。“退课漏洞”和刷新间隔2月19日,树洞里有很多帖子说选的课被刷课机拒绝了。一天后,用户cbwang2016对PKUAutoElective项目进行了反馈,称“开启刷机一段时间后,他的课掉了一半”,并上传了系统环境和配置信息。△树洞#1192621
宋睿曾使用过该程序,并亲自检查了源码。由于未在程序中发现可以导致退课的代码,他怀疑退课的问题出在选课系统上。当事人上传的配置信息显示,刷课机的刷新间隔被设置为0.1秒,他猜测因为选课网短时间内收到的大量请求,导致系统返回的数据出现错误。“但这是一个非常严重的bug。”宋瑞说,“这不应该发生在普通服务器上。”来天平认为这种情况不可能发生。他表示,选课和退课操作有不同的“通道”,即使在选课高峰期系统也不会将二者混淆。此外,选课与退课的条件不同,为了避免意外操作,退课前系统也会发出提醒。“无论是理论上还是实践中,这个问题都不应该发生”。每年计算中心都会接到学生的电话,说“还没选的课程已经选了”或者“还没退的课程已经退了”。但是查看选课系统的日志后发现,造成退课的一般是用户自己的操作,而不是系统故障。“有时候可能是学生忘了退学,但选课系统有完整的日志。我们可以了解学生什么时候登录系统,做过哪些数据操作。”为了平衡解释。项目开发者萧柏途怀疑这是部分使用者为了阻止别人使用刷课机而散布的谣言。为了在抢课时取得优势,使用者不得不缩小刷新间隔,逐渐形成了恶性竞争。“一方面,说刷课机会退课会吓走外行人,第二,把退课原因归结到刷新间隔太短也能防止其他人设置低间隔。”萧柏途说。记者调查了80位刷类机用户设置的刷新间隔,发现只有2.5%的用户使用默认参数,5秒是最常见的设置,占比18.8%。间隔不超过1秒的总人数占23.9%,最小间隔设置为0。△刷机80用户设置的刷新间隔
萧柏途表示,在刷课机中设置“0间隔”意味着当上一轮刷新结束,程序判定待选的课仍然没有空余名额时,就立即开始下一轮刷新。但由于网页的加载需要时间,刷新速度依然受到限制。他估计正常情况下,这种设置最快可以实现每秒10至20次刷新。一位刷课机的用户说,他在补录退选前两天使用默认刷新间隔,发现效果不好,就依次调整为6秒、4秒、2秒。最后缩短到1秒,成功入选热门课程《逻辑导论》。然而,他没有注意到辍学的隐患,因为他没有看到明确的辍学证据。目前,GitHub上该问题已被用户cbwang2016关闭。调查发现,该用户也是Chrome刷课插件“PKU选课助手”的开发成员,记者尝试联系该用户,截至发稿时,尚未收到回复。监管困境“请不要使用刷课机,否则会受到学校严厉处分!”选课系统的错误提示让经济学院2018级本科生王馨第一次知道刷课机的存在。她从未见过真正的刷课机,并认为学校应该查明真正的刷课机使用者,把他们违规选上的课全部退掉。△选课系统弹出警告
但在技术层面,甄别刷课机并非易事。“如果有人用刷课机每隔2秒刷新一次,和他手动在界面上每隔2秒点一次刷新,两种操作后台是区分不出来的。”来天平说,“目前还没有一种机制,能准确、直接地判断出选课操作是不是刷课机执行的。”模糊的标准使得惩罚难以实施。即使计算中心掌握了选课账号的异常操作数据,学生不承认使用过刷课机也很难处罚。作为技术部门,计算中心只能和学生交流。只有当学生的行为造成非常恶劣的后果,影响到整个系统的正常运行时,才会将情况上报教务处或研究生院,按规定进行处罚。实际上,达到这样的标准并不容易。2月21日17:00跨院系选课开放时,选课系统出现近2小时的无响应,有BBS用户指责刷课机的过度使用造成了选课网崩溃。但计算中心的分析表明,刷课机并不是系统异常的主要原因。赖田萍解释说:“异常是选课网络无法登录,但当时选课网络和服务器基本没有压力,学生在别处被‘封杀’。”但由于疫情期间学生在家中选课,网络条件复杂,虽然计算中心立即组织技术团队对各节点数据进行联合诊断检查,但仍无法确认具体原因。对选课系统而言,高频率的选课操作影响较大,但设定了防护机制;而简单的刷新操作,如果达不到DDoS攻击的规模,对系统的影响也不明显。“可以说,在目前的情况下,刷课机不足以对选课系统形成太大压力。”来天平表示。2011年前后,计算中心试图通过“严厉的判决”阻止学生使用刷课机。一旦系统检测到异常行为,就会将用户拉入黑名单,不再允许他们选课。但在这样的处罚标准下,如果出现误判,学生就会错失抢课的机会,以后也无法补救。部分浏览器在用户点击“选课”后会继续操作两次,造成了以往的误判,耽误了学生选课。最后,计算中心恢复了原来的标准。“选课网从2007年到现在,十多年来遇到奇怪的案例太多了,现在可以说是一个多年磨合后的平衡状态。”来天平说,“一方面,完全禁止使用刷课机困难较大,但避免‘严判’也能防止给正常选课的同学造成不可恢复的损害。”清华大学的WL方案在一定程度上限制了刷机。学生在预选阶段确定自己的志愿者,包括必修课、有限课和选修课。每个班有一名第一志愿、一名第二志愿和多名第三志愿,总学分不超过32学分。抽奖结束后,未选择的课程将自动加入课程的WL,排队顺序将根据志愿者优先级确定。在其他阶段,学生也可以进入WL课程,并按时间顺序排在队伍的最后。当课程还剩空个名额时,选课系统会根据WL排队顺序自动进行补选。WL方案节省了手动抢课的时间,但缩小了调整计划的空间。一位清华大学的学生表示,自己选课时会尽量把想选的课都放在选课志愿中,如果等到抽签结束后再去排队,通常难以选上课。赖田萍认为,WL方案是一个设想,但仍有许多细节需要考虑。他说,计算中心组织了一个研究小组,研究刷机的精准判断,希望通过分析现有刷机的网络链接、应用访问行为和特征行为,为判断刷机建立科学依据。选课“公平”关于刷机的争论归结为“破坏公平”。“道德上,这种行为显然侵犯了正常选课同学的权益。”法学院2016级硕士研究生张磊认为,刷课机的使用会导致选课制度演变为“丛林法则”,掌握相关技术或拥有刷课机资源的人选课成功率更高,符合规则的手动刷新反而选不上课。长此以往,为了选上课,会有越来越多的人选择使用刷课机。一位刷课机用户表示,刷课机的强大功能让他深受感动。到了下学期,因为一门课两个班都满了,他找了教务老师要求在上课前扩大课程数量。“我看着老师在教务处放了20个名额,还没等手机上的验证码丢失,这20个名额就没了”。回到寝室后,他决定向室友学习刷课机的配置方法。之后的选课阶段,刷课机帮他补上了超过8学分的课程。然而,并不是每门课程都有扩大名额的可能,大多数候选人需要等有人退学后才能进行补选。2007年后,计算中心采用“随机退课时间”,退课后系统会随机释放空额外名额,所以大部分人工选课者需要定期查看选课系统。刷机一旦配置好,就会自动运行,后期几乎不需要额外的努力。一位中文系本科生曾在抽签阶段“掉课”14学分,但因为担心安全问题决定不用刷课机。“手动补选主要是耗费大量时间,如果一直刷课,什么课都能补选上。但我们肯定不会一直盯着,这样效率挺低的。”她曾看到身边的同学一整节课都在刷新选课网,完全没有听课。在为期两周的补考和退考过程中,正常的考生需要很长时间来温习课程,然后才能补考目标课程。但是有了刷机,你可以选择成功率更高的目标课程。同样的回报,但报酬的差异,刷机成了造成这种不公平的原因。但对于开发者,编写刷课程序并不比手动选课轻松。验证码识别功能依赖于机器学习模型,是刷课机自动抢课的核心。开发上一代模型时,萧柏途人工识别了3000个验证码。“有一段时间,整天在那里看验证码。”他说,“如果只看劳动量,其实开发刷课机可能更费时间。”另外,不是每个人都有能力使用刷机。流行的刷机程序没有图形界面,需要编辑配置文件才能运行。PyTorch的安装也很困难。门槛高让一些想用刷机的人气馁,加剧了原本的不公平。△刷类机配置文件
萧柏途也承认自己的刷课机使用难度过高,但由于不会开发图形界面,他也无法有效降低使用门槛。而由于刷课机在GitHub上开源,萧柏途无法确定使用者的确切数目。“如果只有少部分人用刷课机,其实无所谓。但用的人多了,这个群体对公平的影响就不能忽视了。”他坦言现在有些后悔将刷课机开源。但是由于代码已经流传开来,现在即使重新闭源,也无法阻止刷课机的扩散了。除了对正常选课的学生造成负面影响外,章雷认为刷机本身“钻了选课系统的空”,是对选课规则的破坏。为了保障选课的公平性,计算中心设置了选课的频率限制和验证码。但是刷机在公差范围内选择更高的频率,自动识别验证码,这是故意破坏这种保护。“换句话说,学校服务器的容量是否足够大,可以让所有学生使用刷机?”张磊问道。来天平考虑过这个方案,他说:“这不仅仅是一个技术问题”。严判刷课机,容易造成误判甚至使学生错过选课;提高验证码难度,则会加大正常选课操作难度;WL方案也有很多细节需要研究和完善。“总之,得研究一个机制或者办法,让大家抢课的时候不用刷课。”萧百图猜测,如果大家都用刷机,能否选课就要看运气了。“但这样一来,大家就不用整天看选课网了,可能更容易弥补退课。”但也有人说,单纯靠运气可以保证公平,但会让大家完全失去影响结果的可能,觉得“不靠谱”。2月27日9:00,随着选课系统关闭,2020年春季学期的选课告一段落。但关于选课模式的讨论仍在继续,如来天平所说:“大家可以共同想办法,好的方案我们也可以尝试,北大是大家的北大。”图2来源:北京大学教务处《2007级新生选课指南》图3来源:YouTube视频:北京大学选课刷课 Chrome Extension图4来源:P大树东网络版图6来源:本科生选课系统文中延安、萧百图、宋瑞、阿瑞尔、章雷为化名