我是如何在 72 小時(shí)內(nèi)復(fù)刻 ClubHouse 的

大家好,我是白宦成(@bestony),前幾天在 B 站直播寫 ClubHouse 復(fù)刻版的開發(fā)者。當(dāng)然,除了這個(gè)身份,在真實(shí)生活中,我還是 Linux 中國(guó)開源社區(qū)的技術(shù)負(fù)責(zé)人,負(fù)責(zé)開發(fā)我們自己的自用工具和平臺(tái)。
作為一個(gè) indiehacker(自詡的),我想和大家一起來復(fù)盤一下,這一次的直播活動(dòng)和意料之外的爆火。
為什么要做 NESHouse

我其實(shí)想到復(fù)刻 ClubHouse 的時(shí)間是非常早的,我是在 2 月 1 日拿到了 ClubHouse 的邀請(qǐng)碼,在試玩了一段時(shí)間以后,就覺得這個(gè)軟件還不錯(cuò),理念很有意思,但并沒有太在意,放在了一邊。可到了晚上,因?yàn)橹?Elon Musk 要來做分享,作為一個(gè)比較欣賞他的人,我自然不能錯(cuò)過,但遺憾的是,當(dāng)我打開 ClubHouse 的時(shí)候,已經(jīng)有太多的人涌入這個(gè) App,幾乎無法使用,總是不停的卡頓。
這時(shí)讓我產(chǎn)生了懷疑:這個(gè)東西到底有多少的工作量?為什么這么容易性能卡頓?
結(jié)合實(shí)際的使用發(fā)現(xiàn),有些時(shí)候,我可以正常聊天,但是卻會(huì)報(bào)錯(cuò),可以發(fā)現(xiàn)問題不在語音服務(wù),而是在 ClubHouse 自身的業(yè)務(wù)能力不足以支撐超過預(yù)期的訪問量。
我上一份工作是在一家云計(jì)算企業(yè)工作,所以相對(duì)來說,對(duì)云計(jì)算產(chǎn)品有一定的了解。在我看來,這樣的一個(gè)產(chǎn)品的增量,很難把現(xiàn)有的云計(jì)算產(chǎn)品的服務(wù)容量打穿,你能想象 ClubHouse 把 AWS、GCP、Azure 等云服務(wù)廠商打穿么?
我覺得,要么是開發(fā)者的大規(guī)模服務(wù)的架構(gòu)經(jīng)驗(yàn)不足,雖然用了云,但是沒設(shè)計(jì)好,無法充分適應(yīng)彈性;要么是開發(fā)者沒有對(duì)超過預(yù)判的訪問量做的預(yù)案不足。
這就讓我思考,我能否復(fù)刻一個(gè) ClubHouse?用一些更加具有彈性的服務(wù)?給大家打個(gè)樣??云計(jì)算是好,但用起來也要姿勢(shì)對(duì),才能不出問題。
72 小時(shí)復(fù)刻一個(gè) ClubHouse,是一個(gè)什么概念?
既然要復(fù)刻項(xiàng)目,自然要做的不能和碰瓷的一樣(這里鄙視幾家碰瓷的 App,拿很久之前寫的具備了語音聊天的 App,來碰瓷 ClubHouse)。
但我又不希望在這個(gè)事情上花費(fèi)太多的事情,我還有很多更重要的事情要做,所以我選擇了 72 小時(shí)。48 小時(shí)或 24 小時(shí)是一般的 Hackthon 的時(shí)間長(zhǎng)度,但我確實(shí)又不熟悉這個(gè)項(xiàng)目,所以用 72 小時(shí)比較穩(wěn)妥。
于是便立了一個(gè) Flag ,說我要在 72 小時(shí)內(nèi),復(fù)刻一個(gè) ClubHouse。立了個(gè) Flag,說干就干。關(guān)于這 72 小時(shí),我希望可以強(qiáng)調(diào)兩點(diǎn),也希望這兩點(diǎn)能夠幫助到你。

1. 明確自己要做的和不要做的
我的時(shí)間和精力以及資源都有限,所以并不是什么東西我都能要的。比如在做復(fù)刻的時(shí)候,考慮到我如果開發(fā)原生的 App 或者小程序,就需要提交審核。那我就不能選擇做 App,不然 72 小時(shí)到了,審核還沒過,就食言了。也是出于審核的考慮,我最終選擇了使用 Web 的方式來開發(fā) NESHouse。
而到了具體的功能特性層面,受限于 Web 和 App 的機(jī)制不同,我很難要求用戶必須做什么樣的操作,也很難確保 App 響應(yīng)什么樣的功能,因此,我對(duì)于 ClubHouse 的功能進(jìn)行了一些刪減,邀請(qǐng)上臺(tái)之類的功能,我就選擇性的先不做,將重點(diǎn)放在更加重要的功能中。
在開發(fā)黑客松項(xiàng)目的時(shí)候,一定要先想清楚自己要什么,不要什么,這樣才能確保自己在給定的時(shí)間內(nèi)完成自己的工作。不然大概率會(huì)發(fā)現(xiàn)時(shí)間馬上要截止,但核心功能還沒有研發(fā)完成。
2. 選擇一些新的、以后可能會(huì)用到的技術(shù)
在這次項(xiàng)目開發(fā)的時(shí)候,我選擇的前端技術(shù)棧并非我過去慣用的 React、Vue ,而是一個(gè)相對(duì)小眾 JS 框架的 Alpine.js。
選擇 Alpine.js 的原因很簡(jiǎn)單,我后續(xù)需要在其它的項(xiàng)目上使用這個(gè)框架,但我此刻確實(shí)也不熟悉。如果我在這 72 小時(shí)里把這個(gè)工具用了一遍,如果評(píng)估覺得不錯(cuò),我就可以在后續(xù)的項(xiàng)目中使用,如果這次我用的不太好,那我損失的也只有 72 小時(shí),比在正式項(xiàng)目中使用的損失成本要低很多。
而在另外的兩個(gè)服務(wù),選擇起來就簡(jiǎn)單多了:
LeanCloud 的云服務(wù)我使用了很多年,使用體驗(yàn)也很不錯(cuò),而且他們這種 Serverless 云服務(wù),可以讓我在開發(fā) NESHouse 的時(shí)候,免于去寫很重的部署和基礎(chǔ)邏輯,更加專注在業(yè)務(wù)邏輯上。 音頻服務(wù)我則選擇了國(guó)內(nèi)用戶比較多,開發(fā)起來也比較方面的聲網(wǎng),聲網(wǎng)的 API 比較簡(jiǎn)單, NESHouse 中的聲網(wǎng)音頻接入只用 4 行代碼就實(shí)現(xiàn)了。
除此之外,便是使用了 NES.css 這樣的 CSS 框架,來讓這個(gè)項(xiàng)目更加的有趣,更加的 Funny。
對(duì)于開發(fā)黑客松項(xiàng)目的時(shí)候,可以想想自己能否接受這一次的失敗,如果可以接受自己的失敗,不妨將這次黑客松看做是一次玩的機(jī)會(huì),玩一玩新的技術(shù),就算失敗了,也不過是損失給定的時(shí)間。但如果你在工作項(xiàng)目中出現(xiàn)了問題,損失可就大了。
總結(jié)
72 個(gè)小時(shí)的復(fù)刻對(duì)于我來說不算難,實(shí)際上我也只花了 55 個(gè)小時(shí)就復(fù)刻成功了。但更難的,是如何讓一個(gè)開源項(xiàng)目持續(xù)的成長(zhǎng)下去,持續(xù)的獲得用戶、獲得關(guān)注。
最后,在思否發(fā)文章,給自己的項(xiàng)目求個(gè) Star 不過分吧,項(xiàng)目求 Star:
https://github.com/bestony/neshouse
