兩年前這個(gè)公眾號(hào)做過一篇特稿,分析了“公開渠道的教務(wù)系統(tǒng) 2016 年 1 月選課期間的一些日志”。寫那篇文章讓我直面了刷課這個(gè)事情,還意外地小小采(tiao)訪(xi)了下某個(gè)同學(xué)。
兩年過去,變化還是挺大的。比如,我校教務(wù)處終于把新的教務(wù)系統(tǒng)完整上線了。還比如,自從上個(gè)月新教務(wù)系統(tǒng)第一次選課開始,更多的人聽說了“刷課”這個(gè)詞。已經(jīng)不需要搶課的我,只聽說了這次選課期間有人賣課啥的。雖然實(shí)際上可能并沒這么“道德淪喪”,但大家對(duì)這個(gè)行為的不齒,是多了一些。
我好奇的是,為啥 2018 年的刷課行業(yè)發(fā)展成這樣子了?新的教務(wù)系統(tǒng)并沒有可以從公開渠道獲取的日志,不過從舊教務(wù)系統(tǒng)里看過去幾年的趨勢(shì),還是可以的。于是這次我使用 Elastic Stack 處理了更大跨度的數(shù)據(jù)(灌數(shù)據(jù)進(jìn)去挺折騰的,不過非常高效),從 2014 到 2017 年選課期間的本科選課操作日志中,得到了下面的一些數(shù)據(jù)。(以下數(shù)據(jù)均來自舊教務(wù)系統(tǒng),下簡(jiǎn)稱“教務(wù)系統(tǒng)”)
如果太長(zhǎng)不想看,這是五組數(shù)據(jù)的梗概:
一. 大二到大三、2016 至今,進(jìn)入刷課頻道:2017 年暑假 2015 級(jí)選課期間操作次數(shù)人均 496 次,創(chuàng)了記錄。
二. “刷課”一直是少數(shù),但這 0.5% 的玩家越來越多:四年來用戶操作次數(shù)中位數(shù)保持在 50 - 65 之間,刷課的人數(shù)成倍增加,在 2017 年寒假達(dá)到頂峰。
三. 教務(wù)系統(tǒng)的壓力從來不小,峰值 QPS 95,大多因?yàn)椤叭硕唷?/strong>:選課第一天明明不用搶也是擠爆,卡起來就是死 10 秒鐘又閃現(xiàn) 20 秒的體驗(yàn)。
四. 單用戶刷課平均每秒 17 次,問你怕不怕:靠刷課黨們一“己”之力,還是可以把教務(wù)系統(tǒng)搞慢的,最瘋狂的人連續(xù)一分鐘操作 1060 次。
五. 午夜檔的熱鬧從第二階段開始,刷課黨也就個(gè)位數(shù):如 2017 年暑假第二階段的第一場(chǎng)午夜檔 218 人參加,其中操作頻率極高的也就 5 個(gè)人。
一. 大二到大三、2016 至今,進(jìn)入刷課頻道

先看看每個(gè)人選課有關(guān)的操作次數(shù)的年級(jí)平均值。很明顯,人進(jìn)入大二之后,大家開始意識(shí)到選課沒那么容易,選課操作次數(shù)的增加體現(xiàn)出了焦慮感。到了大三,2013 級(jí)和以前是下降的趨勢(shì),而 2014 級(jí)開始,不知是技術(shù)增強(qiáng)了還是啥情況,操作次數(shù)越來越多,直到大四才回歸平靜。

把線平移一下,改改坐標(biāo)軸,2016 年成為了刷課次數(shù)增加的關(guān)鍵之年。這個(gè)圖里 2015 級(jí)的選課次數(shù)沖出了天際,2017 年的兩次選課人均 469、496 次,跟 2014 級(jí)的最高紀(jì)錄 318 次相比,真是要沖破天花板了(順便提示一下 Y 軸是指數(shù)坐標(biāo)軸,所以差距看起來似乎不大)。
二. “刷課”一直是少數(shù),但這 0.5% 的玩家越來越多
提到刷課這個(gè)詞,大家通常會(huì)想到那種技術(shù)宅,通過代碼達(dá)到普通人達(dá)不到的手速和耐心。最初我并不敢這么想,畢竟只要有耐心,刷上幾百次也很正常嘛,這樣的有罪推定還是挺不靠譜的。然而兩年前看過具體的日志之后,我對(duì)當(dāng)時(shí)選課期間操作超過 5000 次的用戶的結(jié)論是:
有的是用類似瀏覽器自動(dòng)刷新的方法在輔助操作,有的是每秒鐘成功刷新五六次(還讓不讓人活了),最厲害的呢,從下午開始連續(xù)刷新了 7 個(gè)小時(shí),肯定是開了掛(我就不信您不吃晚飯)。
這些年過來,刷課的人數(shù)變多了嗎?通過對(duì)每次選課的選課操作次數(shù)的人均分布統(tǒng)計(jì),結(jié)論見下。

把圖做完之后我還蠻意外的,曲線統(tǒng)一的形狀讓我一度以為自己算錯(cuò)了。然后我在 Access 里折騰了好久把中位數(shù)算出來,都在 50 - 65 之間,所以應(yīng)該沒錯(cuò)。
圖的結(jié)論就是,這么多年,選課次數(shù)分布沒有大的變化,但刷課頂峰值是一年比一年高,尤其從 2016 年暑假那次選課開始。結(jié)合第一節(jié)的圖,2017 暑的回落可能的原因是 2014 級(jí)變成大四老油條了,和 2016 級(jí)迷之不搶課、選課次數(shù)減少。再次提示,這回 X 軸是指數(shù)坐標(biāo)軸。

再仔細(xì)看看頂峰 3% 的三五百人。兩年前的“5000 次操作就是刷課”的假設(shè)暫且可以沿用下來,因?yàn)檫@部分人數(shù)保持在占全體 0.5% 以內(nèi)。隨著年份推進(jìn),刷課的人數(shù)成倍增加,尤其在 2017 寒達(dá)到頂峰。至于說 2018 寒的情況,這里沒有數(shù)據(jù),不過我猜是少不下來了。
三. 教務(wù)系統(tǒng)的壓力從來不小,峰值 QPS 95,大多因?yàn)椤叭硕唷?/h2>
刷課對(duì)教務(wù)系統(tǒng)會(huì)有多大影響呢?雖然有些不控制頻率的刷課行為是很不好的(我方表示強(qiáng)烈譴責(zé)),然而目前教務(wù)系統(tǒng)的主要壓力還是來自“人多”。

先介紹一個(gè)指標(biāo) QPS (Queries Per Second),也就是每秒鐘服務(wù)器處理的請(qǐng)求數(shù)。采用了新的統(tǒng)計(jì)工具之后,我終于能快速地從日志中觀察這個(gè)指標(biāo)了。
1.1 和 1.2 是第一階段的兩個(gè)小階段,分別進(jìn)行一次抽簽,選課沒有先后。2 階段是先到先得,3 階段是退換課,也是先到先得。刷課是第 2、3 階段會(huì)出現(xiàn)的。
從表里可以看到,選課剛開始的 1.1 階段人是最多的(14 寒那個(gè)不知道是什么鬼情況)。明明是抽簽,登錄系統(tǒng)選課并沒有先后,但開放選課的第一天就是容易擠爆門。然后舊教務(wù)系統(tǒng)的 QPS 極限大概就是 95 了。當(dāng)然 2017 年寒假第 2 階段的爆炸挺反常,那一分鐘服務(wù)器只接待了 12 人,跟之前 200+ 的水平差距太多??磥韰^(qū)區(qū)幾個(gè)人還是有能力把系統(tǒng)刷爆的,我們待會(huì)看。
從日志就可以感受到人最多的時(shí)候,那種服務(wù)器的卡頓,就是死個(gè) 10 秒鐘又閃現(xiàn) 20 秒的體驗(yàn)。

最糟的莫過于整臺(tái)服務(wù)器“掛了”,就是連續(xù)一兩分鐘服務(wù)器都沒反應(yīng)那種。2016 年寒假開放選課第一天,這種情況就出現(xiàn)了三次。

四. 單用戶刷課平均每秒 17 次,問你怕不怕?
剛才提到 2017 年寒假第 2 階段的瘋狂,究竟是怎么一回事呢,今天讓我們走近科學(xué)(誤)。

先看上面這個(gè)圖的高峰時(shí)段。1.1 階段第一天的高峰,主要集中在 10 點(diǎn)和
12 點(diǎn)兩撥,基本上可以看出各年級(jí)的上課時(shí)間(和上課專心程度)。1.1 和 1.2 階段之間的高峰,主要是因?yàn)榻虅?wù)系統(tǒng)抽簽結(jié)果通常會(huì)提前發(fā)布、大家迫不及待想知道選上課了沒。
回到我們關(guān)注的第 2 階段。還是要接著解釋一下曲線,順便對(duì)比一下的。
- 大一青色曲線的高峰出現(xiàn)在 11 號(hào) 17:57,也就是快要開始第二階段的時(shí)候??梢哉J(rèn)為是大量萌新出來?yè)炻?/li>
- 大二紅色曲線可就厲害了,幾個(gè)非常詭異的頂峰出現(xiàn)在 13 號(hào)的白天。最頂峰在當(dāng)天晚上 9 點(diǎn)左右,基本可以認(rèn)定是他們把教務(wù)系統(tǒng)推到了 QPS 90 的高度。
- 大三黃色的頂峰出現(xiàn)在 13 號(hào) 0 點(diǎn)。這是學(xué)長(zhǎng)學(xué)姐熬夜比較強(qiáng)的意思嗎。
- 大四黑色冒出來的那 15 個(gè)小時(shí)只有一個(gè)人操作頻繁。我看了下,是個(gè)法學(xué)院的妹子……
具體看 13 號(hào)晚上 8:00 - 9:30 的數(shù)據(jù)。每分鐘操作頻率超過 60 次的朋友有 7 位,其中 6 位是大二。他們分別來自軟院、法學(xué)、機(jī)車、數(shù)院(這里不跟上次一樣掛人了,沒意思)。其中最瘋狂的朋友在連續(xù)的一分鐘內(nèi)刷新了 1060 次,也就是平均每秒 17 次,讓我大開眼界。原來靠他們一己之力,還是可以把教務(wù)系統(tǒng)搞慢的。
于是在 21:13:20, 教務(wù)系統(tǒng)的 QPS 達(dá)到 90 之后又堅(jiān)持了 20 秒,終于撐不住歇了一會(huì)。

五. 午夜檔的熱鬧從第二階段開始,刷課黨也就個(gè)位數(shù)

從 2016 年暑假選課開始,午夜檔劇場(chǎng)就開始熱播了。這時(shí)候,午夜檔還只在第二階段最后一天凌晨開播。而到了 2017 年寒假,午夜檔從第二階段開始連播三天(最后一天人少得很)。上面這圖是 2017 年暑假的午夜檔,也是從第二階段開始連播兩天,最后一天就散場(chǎng)了。

基本上,都是第一場(chǎng)午夜檔最熱鬧。比如上面這圖,2017 年暑假第二階段的第一場(chǎng),218 人參加,不過顯然大部分人還是看熱鬧,還沒堅(jiān)持到 2 點(diǎn)就睡著了。2:00 - 6:59 參加的有 45 人,不過每個(gè)小時(shí)最多就 17 個(gè)人,開個(gè)小廳給他們就足夠了,因?yàn)椴簧偃诉€會(huì)出去看看月亮,找個(gè)地方靜靜。而這四十多人里,操作頻率極高的也就 5 個(gè)人,整場(chǎng)下來上萬次吆喝,對(duì)他們來說是再正常不過了。
好多人想趁第 2 階段換課啥的,在這種情況下似乎挑午夜檔也并不保險(xiǎn),操作需要智慧,也需要運(yùn)氣。當(dāng)然新教務(wù)系統(tǒng)是個(gè)什么情況我就不知道了。
結(jié)語
看完數(shù)據(jù),感覺刷課的人還是那么少,雖然數(shù)量在增加,但“少數(shù)”這個(gè)性質(zhì)沒變。可能人數(shù)變多了,接著有人得瑟起來之后,大家就都知道這種不齒的行為了。
寫這種文章還是得站個(gè)隊(duì)的。兩年前寫完那篇特稿之后的下一次選課,我用了不到 100 行代碼,撿了一門別人的退課(上過課才知道為啥他們退課),說起來也不是那么光彩。不過我的觀點(diǎn)依然跟兩年前一樣,所以直接引用之前寫過的話好了:
教務(wù)系統(tǒng)沒有對(duì)刷新頻率做限制,這個(gè)是很不好的做法。但這也不意味著說,一個(gè)網(wǎng)站亦或系統(tǒng)的用戶,可以采用非正常的方法,一秒鐘連續(xù)刷新頁(yè)面好多次,無端地增加系統(tǒng)負(fù)荷,這叫做“濫用”。想徹底避免道德問題,還是得用技術(shù)方法來解決。
這個(gè)事情,跟搶火車票差不多的道理。技術(shù)可以代替人的重復(fù)勞動(dòng),從對(duì)信息的了解和技術(shù)的掌握而言,“搶”這個(gè)規(guī)則本身還是存在不公平的。從反制的角度說,技術(shù)可以解決一部分問題,但更重要的是制定規(guī)則,這樣之后,刷課技術(shù)的加成導(dǎo)致的落差就沒那么懸殊了。
轉(zhuǎn)過頭想,似乎管選課這個(gè)事情還是挺難的,難在要面對(duì)其他人的態(tài)度?;蛟S這就是社會(huì)主義初級(jí)階段吧。
本文采用知識(shí)共享“署名-非商業(yè)性使用 4.0”許可協(xié)議授權(quán),如需額外授權(quán)請(qǐng)與本人聯(lián)系。本文的 1 次修改記錄主要是潤(rùn)色句子,基本數(shù)據(jù)不變。