十年積累,5.4萬GitHub Star一朝清零:開源史上超大意外損失
2022 年 2 月 15 日,GitHub 通過推特平臺廣播了一則消息:「我們的朋友 HTTPie 最近不小心將自己設(shè)為了私密,丟掉了所有的 Star。如果你仍然愛它,就給它一顆 Star 作為情人節(jié)禮物。」
10 年攢下的 Star 突然清零?這是怎么回事?
昨天,項目作者 Jakub Rozto?il 在博客中正式回應(yīng)了這一事件。
十年獲得 5.4W Star 的開源項目
HTTPie 項目的第一次提交還是在十年之前。
可能一些人對這個項目不夠熟悉,這是一個開源 CLI HTTP 客戶端。團隊從頭開始構(gòu)建了它,以使終端的 API 交互盡可能人性化。
HTTPie(發(fā)音為 aitch-tee-tee-pie)可用于測試、調(diào)試以及通常與 API 和 HTTP 服務(wù)器交互。http&https 命令允許創(chuàng)建和發(fā)送任意 HTTP 請求。它們使用簡單自然的語法,并提供格式化和彩色輸出。
從 2012 年 2 月 25 日在哥本哈根的第一次公開提交之后,項目作者 Jakub Rozto?il 就一直在 GitHub 平臺上托管該項目。他自己也是 GitHub 平臺的忠實粉絲。
這些年來,HTTPie 逐漸成長為平臺上最受歡迎的 API 工具,收獲了 5.4W 個 Star 和 1k 的關(guān)注。
HTTPie 項目受益于 GitHub 的「social coding」功能,同時,GitHub 也受益于自身平臺上托管的這個受歡迎的項目。在過去十年中,可能有數(shù)百萬開發(fā)人員訪問了 HTTPie 項目的 GitHub 頁面。
但在幾周前,HTTPie 項目積累的 5.4W Star 一夜清零。
在這篇博客中,項目作者 Jakub Rozto?il 詳細介紹了事情經(jīng)過:
發(fā)生了什么?
我不小心將項目的 repo 設(shè)為了私有,GitHub 級聯(lián)刪除了我們花費 10 年時間建立的社區(qū)。
這意味著什么?
如果你是一位下游維護者,或者曾經(jīng)關(guān)注過 HTTPie 以獲取通知,你可能需要重新關(guān)注一下 repo。
Star 也是一樣,如果過去十年里你曾為該項目加注 Star,那現(xiàn)在 HTTPie 應(yīng)該已不再是你的 Star 項目列表中的一員。
為什么要將 repo 設(shè)為私有?
將 repo 設(shè)為私有會永久刪除所有關(guān)注者和 Star,這是 GitHub 的一個特性。我知道這一點,而且我顯然無意 httpie/httpie 隱藏。
最直接的原因是我認為我在另一個 repo 中——一個沒有內(nèi)容且 0 Star 的項目。我真正打算做的是隱藏 HTTPie 組織的配置文件 README,這是我在一周前創(chuàng)建但沒有機會填充的。
讓我走上錯誤道路的是一個完全不相關(guān)的操作:我剛剛在我的個人資料上做了同樣的事情(即隱藏了一個空的 README),將其設(shè)為 jakubroztocil/jakubroztocil 私有。
在配置文件和存儲庫方面,GitHub 的概念模型會將用戶和組織視為非常相似的實體。在這種情況下,由于我只是想在我們組織的個人資料上重復(fù)相同的操作,我的大腦切換到了「自動駕駛」模式。
目前我沒有意識到這個包含配置文件 README 的特殊 repo 的命名存在不一致問題,并且它對于用戶和組織有所不同:name/name 與 name/.github.
這就是為什么我一開始要隱藏 httpie/httpie,而不是 httpie/.github,并且沒有意識到我的錯誤。
但是,還有一個確認流程?
確實有一個確認框,旨在阻止像我這樣的情況下的用戶做一些愚蠢的事情。它會告訴你「你將永遠失去這個存儲庫的所有 Star 和關(guān)注者」。
問題在于,對于沒有提交和任何 Star 的 repo ,它的提示框和具有 10 年歷史及 55k Star 與關(guān)注者的 repo 是完全一樣的。它說的是:「警告:這是一個潛在的破壞性行動。」
套用一句話:一個盒子告訴你「你要拆房子!如果里面有人,他們都會死?!沟绻慊煜说刂凡⒄J為你正準備拆的是一個空房子,那后果將不堪設(shè)想。
實際上,此處的對話應(yīng)該更加結(jié)合上下文,并且再次解釋一下情況,比如說「你即將殺死 55000 人?!鼓强隙〞屛彝O聛?。
一番操作之后
當我回到組織頁面時,你可以想象我的困惑,我不僅仍然可以看到空的 README,同時我們最受歡迎的 repo 找不到了。片刻之后,我意識到發(fā)生了什么事。所以我回到 repo 的設(shè)置來翻轉(zhuǎn)開關(guān)。但 GitHub 不允許我這樣做——整整半個小時。
為什么這么久呢?因為這是 GitHub 級聯(lián)刪除我們 10 年來的 Star 和關(guān)注者所花費的時間。而且我沒有辦法阻止這個過程。我所能做的就是開始發(fā)消息給 GitHub 尋求支持,刷新頁面并等待 Star 數(shù)量達到零,然后才能再次將其公開。
為什么 GitHub 不給我們恢復(fù)呢?
GitHub 顯然有備份,并且有恢復(fù) repo 的方法。GitHub 團隊曾經(jīng)自己不小心將 GitHub 桌面應(yīng)用程序 repo 設(shè)為私有,然后他們在幾個小時內(nèi)就恢復(fù)了一切,當時前 GitHub CEO 給出的解釋是:
然而,在我們的事件中,他們拒絕這樣做,理由是操作具有不良影響,并且會消耗資源成本。我們甚至提出為所需的任何資源提供經(jīng)濟補償,但遺憾的是,他們還是拒絕了。相對于在 GitHub 上恢復(fù)最受歡迎的社區(qū)項目之一以外,他們還有其他優(yōu)先事項。
因此,GitHub 恢復(fù)存儲庫的前提是他們自己的項目,而不是社區(qū)項目。
經(jīng)驗教訓(xùn)
這次危機讓我們得到了很多教訓(xùn),這里主要分享 3 點:
教訓(xùn) 1:UI/UX 設(shè)計
彈出的對話框要清晰明了,減少抽象的文字說明。以一種不需要用戶思索的方式設(shè)計確認對話框。當用戶要刪除或損壞某些文件時,不要用抽象的語言描述,以免讓用戶難以了解即將發(fā)生的狀況,特別是會造成級聯(lián)刪除的行為。例如,以下是我們在 HTTPie for Desktop 中的處理方式:
對話框需要反映操作影響的嚴重性。當完全沒有額外影響時,對話框應(yīng)該盡量簡單,否則會浪費用戶有限的注意力,從而降低用戶的敏感度:
教訓(xùn) 2:數(shù)據(jù)庫設(shè)計
使用軟刪除(soft-delete)。人非圣賢,孰能無過。人們在刪除操作上可能會犯錯誤,因此應(yīng)該盡可能使用軟刪除,延遲硬刪除(hard-delete)操作。
教訓(xùn) 3:與 GitHub 的關(guān)系
這是我們的人為錯誤,GitHub 明確表示他們沒有法律義務(wù)幫助我們。我們長達十年的互惠互利關(guān)系是根據(jù) GitHub 的服務(wù)條款確定的,除此之外,再無其他。
畢竟,GitHub 有過有爭議的行為,這些行為違背了開源社區(qū)的精神。微軟(已收購 GitHub)盡管擁有一定的開源精神,但并不總是有很好的聲譽。
我們希望 GitHub / 微軟 有朝一日能夠改變他們的態(tài)度,并恢復(fù)我們的項目社區(qū),他們擁有實現(xiàn)這一點的所有數(shù)據(jù)和方法。我們也希望他們改進 UI 和數(shù)據(jù)庫設(shè)計,以防止這種情況未來發(fā)生在其他團隊身上。
最后,盡管我們的 GitHub star 量化為虛無,但 HTTPie 現(xiàn)在發(fā)展得非常好,從最初作為一個副項目到現(xiàn)在變成了一家公司,我們的團隊正在將 HTTPie 發(fā)展成一個 API 開發(fā)平臺。用于 Web 和桌面的 HTTPie 私有測試版收到了很好的反饋,我們迫不及待地想在接下來的幾周內(nèi)公開發(fā)布它。