Go 遙測(cè)將可選擇加入!Google 收集數(shù)據(jù)的黑歷史對(duì) Go 有負(fù)面影響。。。
大家好,我是煎魚(yú)。
前兩天有讀者提醒我關(guān)注 Go 大當(dāng)家 Russ Cox 發(fā)起的 Go 工具鏈中的遙測(cè)(telemetry in the Go toolchain[1])討論。不看不知道,一看下一跳。
今天來(lái)分享一些看法和信息。
為什么要收集數(shù)據(jù)
Russ Cox(下稱 rsc)發(fā)起的背景是 Go 開(kāi)源項(xiàng)目的開(kāi)發(fā)者(例如:Go 核心團(tuán)隊(duì))在沒(méi)有遙測(cè)的情況下,會(huì)遇到如下的場(chǎng)景:
- 需要依賴外部的錯(cuò)誤報(bào)告(例如:GitHub issues)來(lái)了解他們自己寫(xiě)的軟件如何在意料之外發(fā)生異常。
- 調(diào)研用戶是如何使用自己寫(xiě)的開(kāi)源項(xiàng)目,是否符合預(yù)期,又或是創(chuàng)造出了新的用法。
這么一聽(tīng),好像和我們平時(shí)的認(rèn)知也差不多。換位思考一下,Go 核心開(kāi)發(fā)者就比較頭疼了。認(rèn)為這兩種方式作用都很有限,達(dá)不到他們想要的效果。
因此想要抽樣收集用戶的使用數(shù)據(jù),便于 Go 團(tuán)隊(duì)更好的開(kāi)發(fā)和調(diào)研。
被局限的例子
錯(cuò)誤報(bào)告
我們會(huì)提交錯(cuò)誤報(bào)告,一般只會(huì)出現(xiàn)在類似 ”我們預(yù)期這事應(yīng)該能正常跑起來(lái),但你居然沒(méi)有跑起來(lái)“ 的場(chǎng)景下。在現(xiàn)有的情況下,如果程序在不影響正確性的情況下出現(xiàn)了錯(cuò)誤行為,用戶就不可能注意到。
反之,如果實(shí)施了遙測(cè)(收集數(shù)據(jù)),開(kāi)發(fā)者就可以通過(guò) Go 工具鏈?zhǔn)占蟻?lái)的統(tǒng)計(jì)數(shù)據(jù)發(fā)現(xiàn)異常。(有抓手了)
具體案例,rsc 說(shuō)明了在 Go 1.14 版本的發(fā)布中,對(duì) macOS Go 發(fā)行版的構(gòu)建方式進(jìn)行了更改,造成使用 net 包(使用 cgo )編譯任何程序都需要安裝 Xcode。
這不是他們所預(yù)期的,是意外之外的。
但在發(fā)生這問(wèn)題的三年內(nèi),沒(méi)有任何人報(bào)告過(guò)這個(gè)錯(cuò)誤。用戶只是簡(jiǎn)單地接受了這是必要的安裝。
直至近期,Go 核心團(tuán)隊(duì)排查其他問(wèn)題,才發(fā)現(xiàn)有這個(gè)坑。如果有遙測(cè)收集使用數(shù)據(jù),那這個(gè)問(wèn)題完全可以被避免。
調(diào)查用戶
Go 開(kāi)發(fā)團(tuán)隊(duì)想知道 ”用戶想用 Go 做什么“,或是想基于數(shù)據(jù)用于做一些新老功能版本的決策。
但現(xiàn)在開(kāi)源項(xiàng)目普遍都很難,他們只能發(fā)調(diào)查報(bào)告,就像我們每年填的 Go 開(kāi)發(fā)者調(diào)查報(bào)告,就是這個(gè)目的。
Go Developer Survey 2022 Q2 Results
但是 rsc 對(duì)調(diào)查報(bào)告也是不滿足的。因?yàn)橹皇且粋€(gè)小樣本,效果有限。且需要大量的用戶選項(xiàng)和回復(fù)才能得到相對(duì)準(zhǔn)確的測(cè)量結(jié)果,比較浪費(fèi)時(shí)間。
具體案例,rsc 舉例 go 開(kāi)源項(xiàng)目,經(jīng)常會(huì)在新版本增加開(kāi)關(guān),再逐步去掉的做法。像最近宣布 Go 1.21 起將不再支持 macOS1.13/1.14,馬上就收到了用戶的反饋,要求保留。
如果有遙測(cè)收集使用數(shù)據(jù),這個(gè)問(wèn)題將有具體的數(shù)據(jù)作為決策支撐。就跟我們平時(shí)前端同學(xué),會(huì)收集用戶端的操作系統(tǒng)和版本作為是否支持 IE 的依據(jù)等。
想收集什么數(shù)據(jù)
說(shuō)要收集,會(huì)在哪收集,具體要收集什么呢?會(huì)收集的地方主要是 Go 工具鏈,例如:Go 命令、Go 編譯器、Gopls 等地方。
收集的數(shù)據(jù),將至少包含工具鏈的基本信息,例如:
- Go 工具鏈版本。
- 是什么操作系統(tǒng)和架構(gòu)構(gòu)建的。
- 主機(jī)操作系統(tǒng)版本(例如:Windows8)。
- Go 工具鏈?zhǔn)褂玫钠渌ぞ叩拇致孕畔?,例如本?C 編譯器(例如:gcc 2.95)。
不會(huì)包含任何形式的身份信息,例如:
- 沒(méi)有用戶登錄。
- 沒(méi)有機(jī)器 ID。
- 沒(méi)有 MAC 地址。
- 沒(méi)有 IP 地址,沒(méi)有 IP 地址前綴。
- 沒(méi)有地理位置信息
- 沒(méi)有隨機(jī)生成的偽 ID,沒(méi)有其他種類的標(biāo)識(shí)符。
收集的數(shù)據(jù)會(huì)在 Go 網(wǎng)站上公布,定時(shí)展示統(tǒng)計(jì)圖表等,便于所有 Go 開(kāi)發(fā)者審閱和查看。
社區(qū)爭(zhēng)議滿滿
絕大部分開(kāi)發(fā)者是沒(méi)有直接同意 rsc 這么干的,主流的回復(fù)分成了三派。
大致如下:
- 直接拒絕,覺(jué)得這是在侵犯?jìng)€(gè)人隱私。
- 建議做成可選項(xiàng),例如:限時(shí)選擇上報(bào)、選擇上報(bào)(使用 Go 時(shí)彈出 Cookie 彈窗、拋出異常時(shí)彈出彈窗)等。
- 直接抵制,認(rèn)為 Go 重蹈 Google 后路。用詞強(qiáng)烈,要求 rsc 公開(kāi)道歉,表示這是推下懸崖的選擇,降低了信任。
整體來(lái)看,參與討論的 Go 開(kāi)發(fā)者都非常關(guān)注 ”隱私“ 的問(wèn)題。更建議做成可選項(xiàng),也就是用戶選擇上報(bào)。
如果以后寫(xiě) Go 的時(shí)候彈出 Cookie 彈窗還是很 ”有趣“的吧(doge。
總結(jié)
Go 核心團(tuán)隊(duì)本身的出發(fā)點(diǎn)是好的,他們?cè)诰S護(hù) Go 開(kāi)源項(xiàng)目時(shí),經(jīng)常拿不到一些關(guān)鍵數(shù)據(jù)和信息,導(dǎo)致在做決策時(shí)很糾結(jié)。
這在業(yè)務(wù)應(yīng)用中,比較常見(jiàn)的是在前端埋探針,獲取你的客戶端信息等。但這是閉源的,整體風(fēng)險(xiǎn)沒(méi)有那么大。
但對(duì)于開(kāi)源項(xiàng)目來(lái)講,這是開(kāi)源的,受到所有人的檢閱。這類隱私數(shù)據(jù)收集,在臺(tái)面上直接默認(rèn)上報(bào)肯定是不可行的,爭(zhēng)議會(huì)比較大。
從結(jié)果來(lái)看,由于沒(méi)有更多新的內(nèi)容,比較情緒化,這個(gè)討論已經(jīng)被中止。未來(lái)如果做,我猜更大概率是做成可選項(xiàng),詢問(wèn)式。