一個(gè) Github Star 值多少錢(qián)?
大家好,我卡頌。
當(dāng)我們看一個(gè)開(kāi)源項(xiàng)目時(shí),基本都會(huì)看下他有多少star。雖然Github Star是一個(gè)虛榮指標(biāo),但卻有實(shí)際意義,比如:
- 很多開(kāi)發(fā)者會(huì)關(guān)注Github Star增長(zhǎng)趨勢(shì),更多的star會(huì)獲得更多關(guān)注
- star數(shù)量往往是技術(shù)選型的一個(gè)依據(jù)。即使你的團(tuán)隊(duì)最終沒(méi)有使用一個(gè)star很多的開(kāi)源庫(kù),但通常也不會(huì)使用一個(gè)star很少的庫(kù)
換個(gè)思路來(lái)看也許更能體現(xiàn)Github Star的價(jià)值 —— 「軟件開(kāi)源」并不意味著不賺錢(qián),這只是一種產(chǎn)品開(kāi)發(fā)策略。star數(shù)一定程度上反映了這種策略執(zhí)行的是否成功。
而「策略執(zhí)行是否成功」又會(huì)影響投資人的投資決策,以及團(tuán)隊(duì)能否以更低成本(甚至白嫖)招募優(yōu)秀的開(kāi)發(fā)人員。
有利益驅(qū)動(dòng)就會(huì)有刷量、造假行為出現(xiàn)。既然微博僵尸粉都能影響廣告主的投放決策,那Github Star造假就不足為奇了。
那么,一個(gè)Github Star值多少錢(qián)?
Star的售價(jià)
網(wǎng)上已經(jīng)有公開(kāi)渠道購(gòu)買(mǎi)Github Star,比如:GitHub24或Baddhi Shop[1](在這個(gè)網(wǎng)站,你能花錢(qián)刷各種網(wǎng)站的行為數(shù)據(jù),甚至能刷IMDb電影評(píng)分)。
Star的售價(jià)差異很大,比如:
- 64刀可以買(mǎi)到1000個(gè)三無(wú)賬號(hào)的star。
- 要買(mǎi)到100顆有活躍行為賬號(hào)的star,可能得85刀。
如何識(shí)別刷Star
之所以?xún)烧卟町惥薮?,是因?yàn)殍b別難度不同。
對(duì)于這個(gè)zadahmed/music_recommender[2]倉(cāng)庫(kù),可以明顯看到有部分點(diǎn)贊者的賬號(hào)是同一天注冊(cè)的:
再深究的話,會(huì)發(fā)現(xiàn)這些點(diǎn)贊賬號(hào)還有很多共性,比如:
- Followers < 1。
- Following < 1。
- 個(gè)人公開(kāi)倉(cāng)庫(kù)數(shù)量 < 4。
- 很多個(gè)人信息(比如郵箱、簡(jiǎn)介)為空。
這類(lèi)共性讓這些假賬號(hào)很容易被識(shí)別,Github官方會(huì)定期清理這些賬號(hào)。所以,如果你花錢(qián)刷了1000star,可能過(guò)一個(gè)月就都消失了。
除了Github官方以外,還有些工具可以識(shí)別假賬號(hào),比如:
- astronomer[3]
- fake-star-detector[4]
想想,如果自己的項(xiàng)目好不容易做出點(diǎn)名氣,但被人扒出曾經(jīng)刷star,那就尷尬了。
識(shí)別高端造假
但對(duì)于那些高價(jià)刷的star,這類(lèi)檢測(cè)機(jī)制就不太好用了。因?yàn)檫@類(lèi)賬號(hào)會(huì)模仿正常開(kāi)發(fā)者的行為,光從行為數(shù)據(jù)上,很難將他們和正常開(kāi)發(fā)者區(qū)分。
這里開(kāi)源編排平臺(tái)dagster[5]提供了一個(gè)檢測(cè)思路 —— 他們使用一種被稱(chēng)為unsupervised clustering(無(wú)監(jiān)督聚類(lèi))的機(jī)器學(xué)習(xí)技術(shù)。簡(jiǎn)單來(lái)講,我們可以用一組行為特征來(lái)描述一個(gè)Github賬號(hào),比如:
- 提交代碼。
- 給其他倉(cāng)庫(kù)提PR。
- star某個(gè)項(xiàng)目。
- 修改個(gè)人簡(jiǎn)介。
這樣就能將這個(gè)Github賬號(hào)表示為高維向量空間中的一個(gè)點(diǎn)。那些向量空間中相近的點(diǎn)對(duì)應(yīng)的Github賬號(hào),可以被歸類(lèi)為同類(lèi)賬號(hào)。
基于以上原理,dagster成員新建了個(gè)倉(cāng)庫(kù),并高價(jià)刷了star:
這么做的目的是用那些點(diǎn)star的Github賬號(hào)做聚類(lèi)分析,標(biāo)記出一個(gè)類(lèi)。當(dāng)完成聚類(lèi)后,如果發(fā)現(xiàn)某個(gè)Github賬號(hào)也屬于這個(gè)類(lèi),那就可以懷疑這個(gè)賬號(hào)也是假賬號(hào)。
那么,為什么假賬號(hào)能夠聚類(lèi)呢?這是因?yàn)檫@些賬號(hào)雖然在模仿正常開(kāi)發(fā)者,但他們之間也有很多類(lèi)似行為,比如:
- 他們的行為可能都是同一個(gè)腳本在操作,那么在行為邏輯、行為執(zhí)行的時(shí)間上比較類(lèi)似。
- 他們都會(huì)給同一批倉(cāng)庫(kù)(服務(wù)的買(mǎi)主)點(diǎn)star。
舉個(gè)例子,有兩個(gè)Github賬號(hào),雖然他們之間并無(wú)交集(倉(cāng)庫(kù)的編程語(yǔ)言不同、開(kāi)發(fā)者國(guó)籍不同...),但他們都在某幾天做著同類(lèi)的事(比如先瀏覽一些倉(cāng)庫(kù),再發(fā)表評(píng)論,最后給某個(gè)倉(cāng)庫(kù)star),那么他們會(huì)被劃分為同類(lèi)。
如果他們的同類(lèi)中有實(shí)錘的假賬號(hào),那么他們大概率也是假賬號(hào)。
在下面的圖表中,衡量了上述刷star的倉(cāng)庫(kù)(100% star都是刷的)中,點(diǎn)了star的那些Github賬號(hào)的行為,其中:
- 橫軸是日期跨度。
- 縱軸是賬號(hào)交互的倉(cāng)庫(kù)總數(shù)。
- 藍(lán)色部分是所有用戶(hù)。
- 紅色部分是明確的假Github賬號(hào)。
- 黃色部分是根據(jù)聚類(lèi),被懷疑的假賬號(hào)。
由于已知這個(gè)倉(cāng)庫(kù)的所有star都是刷的,所以其實(shí)黃色部分的賬號(hào)也都是假賬號(hào),通過(guò)聚類(lèi)的方式他們被很好的識(shí)別出來(lái)了(和紅色部分同類(lèi))。
而對(duì)于完全沒(méi)有刷star的項(xiàng)目(這里以dagster[6]為例),點(diǎn)star的用戶(hù)行為基本不會(huì)與假賬號(hào)有交集:
對(duì)于一個(gè)刷了star,同時(shí)又有實(shí)際參與者的項(xiàng)目,分析結(jié)果如下圖:
總結(jié)
雖然star數(shù)是虛榮指標(biāo),但由于他是很多決策的參考依據(jù),這就誕生了「刷star」的需求。
比如,okcash[7]是一款開(kāi)源的加密貨幣,有578star。
但是,經(jīng)過(guò)上述dagster的方式檢測(cè)后會(huì)發(fā)現(xiàn),所有為okcash點(diǎn)star的賬號(hào)中,疑似虛假刷star的賬號(hào)占比達(dá)到97% 。相信這一結(jié)果會(huì)對(duì)這款加密貨幣的市場(chǎng)信心造成一定影響。
如果你也想用dagster的方式檢測(cè)其他開(kāi)源庫(kù),可以參考這里[8]。
參考資料
[1]Baddhi Shop:https://baddhi.shop/shop/。
[2]zadahmed/music_recommender:https://github.com/zadahmed/music_recommender/stargazers。
[3]astronomer:https://github.com/Ullaakut/astronomer。
[4]fake-star-detector:https://github.com/dagster-io/fake-star-detector/blob/main/fake_star_detector/assets/simpler_model.py。
[5]dagster:https://dagster.io/blog/fake-stars#lets-go-star-shopping。
[6]dagster:https://github.com/dagster-io/dagster。
[7]okcash:https://github.com/okcashpro/okcash。
[8]這里:https://github.com/dagster-io/fake-star-detector/blob/main/fake_star_detector/assets/complex_model.py。