本文發(fā)表時(shí)間:2018 年 7 月 13 號(hào)
文章最初發(fā)表于http://sunface.io
前言
技術(shù)男擅于想象也擅于幻想,類如在全球最大同性交友平臺(tái)上,打造你的最強(qiáng)兵器,出盡風(fēng)頭,博得更多的同性友誼。那么問(wèn)題來(lái)了,那么大的用戶群體,你怎么才能脫穎而出,筆者自己也思考了很久,總結(jié)出一套可行的方案。
七種兵器
劍之靈動(dòng),刀之雄厚,七種兵器如果選擇就夠俠者喝一壺了。同時(shí)用千年寒鐵和普通鐵礦打造出的兵器肯定是云泥之別的,但是千年寒鐵肯定是極其稀有的。
各種XXX攻略
君不見最近Github上Star上漲很快的大部分都是XXX攻略,例如架構(gòu)師知識(shí)圖譜,面試知識(shí)圖譜等等,簡(jiǎn)直是開掛般的存在,但是本文的標(biāo)題是‘技術(shù)開源產(chǎn)品’,因此攻略顯然不是產(chǎn)品,這里就排除在外了。
什么是具有可行性的產(chǎn)品
擁有特定的目標(biāo)和用戶群體,能產(chǎn)生出相對(duì)獨(dú)一無(wú)二的價(jià)值,就可以認(rèn)為是一款具有可行性的產(chǎn)品了,這里有三個(gè)對(duì)象:產(chǎn)品目標(biāo)、用戶群體、產(chǎn)品創(chuàng)新,下面我們來(lái)一一分析,該怎么選材
用戶群體
因?yàn)樵蹅円呀?jīng)是技術(shù)開源產(chǎn)品了,用戶群體無(wú)非就是開發(fā)或者測(cè)試,但是考慮到github上絕大部分都是開發(fā),因此排除測(cè)試用戶,至于開發(fā),可以進(jìn)一步細(xì)分為前端、后端、運(yùn)維,產(chǎn)品對(duì)應(yīng)的用戶群體越大,自然收獲的star會(huì)更多。
眾所周知,前端的開發(fā)群體是最多的,因?yàn)樽鳛殚_發(fā)或多或少都要會(huì)一些前端。在前端領(lǐng)域,javascript的開源產(chǎn)品,獲取star的速度明顯是鶴立雞群,藐視一切英雄好漢的,因此如果你具有較好的js和nodejs水準(zhǔn),就可以傾向于打造面向js用戶群體的產(chǎn)品了。
再來(lái)談?wù)労蠖?,后端又分為面向特定領(lǐng)域:云計(jì)算、區(qū)塊鏈等和面向特定語(yǔ)言:python、go、java、rust等,那該怎么選擇呢?
首先是,一定站在風(fēng)口上,豬都能起飛,何況咱們這些高智商人群,因此特定領(lǐng)域的風(fēng)口目前來(lái)看就是k8s+docker生態(tài),區(qū)塊鏈生態(tài),機(jī)器學(xué)習(xí)生態(tài)等,至于特定語(yǔ)言,go和rust是有很大優(yōu)勢(shì)的,因?yàn)檫@兩門語(yǔ)言目前在開源社區(qū)非常受歡迎,附帶著相關(guān)的庫(kù)也會(huì)變得容易獲得青睞。
總結(jié):盡量選擇處于技術(shù)風(fēng)口的技術(shù)領(lǐng)域和編程語(yǔ)言,讓你的目標(biāo)群體放得更大
產(chǎn)品目標(biāo)
產(chǎn)品的目標(biāo)首先來(lái)說(shuō)就是產(chǎn)品的類型
- 一站式平臺(tái)
- 工具類服務(wù)
- 編程框架庫(kù)
其次就是產(chǎn)品難易度,這個(gè)也很重要,你要充分預(yù)估你的時(shí)間能完成的項(xiàng)目是什么樣的?相對(duì)簡(jiǎn)單的產(chǎn)品,同時(shí)還更容易讓社區(qū)中的同性伙伴們參與進(jìn)來(lái),但是換來(lái)的代價(jià)就是你面對(duì)的可能是一片紅海,這個(gè)很自然,簡(jiǎn)單的東西做得人自然更多。
總結(jié):首先根據(jù)自身的時(shí)間/技術(shù)能力選擇一個(gè)最適合的產(chǎn)品類型,同時(shí)要考慮到兩點(diǎn): 未來(lái)社區(qū)的參與度和用戶群體的潛在大小
產(chǎn)品創(chuàng)新
要知道,任何一個(gè)產(chǎn)品都不太可能是完全創(chuàng)新,因此和你的產(chǎn)品重疊的產(chǎn)品可能已經(jīng)存在很多,那么你的產(chǎn)品憑什么突圍而出呢?是時(shí)候祭出我們的尚方寶劍了:微創(chuàng)新。
微創(chuàng)新的概念這里就不談了,我談?wù)剮讉€(gè)點(diǎn):
- 功能上的創(chuàng)新:完善、優(yōu)化等
- 使用體驗(yàn)方面的創(chuàng)新:舉個(gè)例子,區(qū)塊鏈火了后,P2P網(wǎng)絡(luò)也迅速火了,這個(gè)時(shí)候ipfs把自己的p2p技術(shù)棧抽象了出來(lái),形成了一個(gè)庫(kù):libp2p,但是!實(shí)在是太tmd不好用了,誰(shuí)用誰(shuí)熬夜! 這個(gè)時(shí)候,另外一個(gè)主打產(chǎn)品體驗(yàn)的p2p庫(kù)橫空出世,簡(jiǎn)直完爆libp2p,盡管功能上還不完善,穩(wěn)定性上也達(dá)不到生產(chǎn)級(jí)別,但是在可以預(yù)期的未來(lái),這款產(chǎn)品在市場(chǎng)上肯定要大火的
- 生態(tài)的創(chuàng)新:有些產(chǎn)品自成生態(tài),啥都自己來(lái);有些產(chǎn)品選擇三方生態(tài),設(shè)定好基本的產(chǎn)品形勢(shì),讓大家都能參與進(jìn)來(lái)
- 文檔和官網(wǎng)的創(chuàng)新:這個(gè)很重要!有好的官網(wǎng)和文檔,對(duì)比不好的,完全兩碼事,對(duì)了你還需要一個(gè)和產(chǎn)品名字相同的域名,看上去更專業(yè)
- 可維護(hù)性的創(chuàng)新:有些產(chǎn)品天生就難以維護(hù),讓后來(lái)者欲生欲死
總結(jié):一定要考慮清楚產(chǎn)品的微創(chuàng)新是什么,通過(guò)創(chuàng)新給用戶帶來(lái)的價(jià)值是什么?千萬(wàn)不要自我覺(jué)得良好
用戶思維
如果你是XX用戶,你需要什么功能;如果你是一個(gè)小白用戶,該怎么使用這款產(chǎn)品。簡(jiǎn)而言之,要換位思考,換位思考這個(gè)詞大家都知道,但是又有幾個(gè)人真正知道,你做的產(chǎn)品是為你自己虛擬的用戶打造的還是為真是用戶打造的?值得深思。
獨(dú)孤九劍
武器在手,天下我有,哈哈!等等,大俠,你這是?野球拳??!
對(duì)于絕大多數(shù)程序員來(lái)說(shuō),想到了做什么后,緊接著就是簡(jiǎn)單思考一番,就是直接開擼了,但是大俠們,你們是不是略過(guò)了很重要的一步?你還沒(méi)有學(xué)劍譜呢!因此產(chǎn)品設(shè)計(jì)是極其重要的一步,否則做到后面,重構(gòu)或者目標(biāo)偏移都是很正常的事情。
設(shè)定產(chǎn)品價(jià)值觀(產(chǎn)品哲學(xué),英文Philosophy)
大家應(yīng)該都聽說(shuō)過(guò)阿里的六脈神劍價(jià)值觀:客戶第一、團(tuán)隊(duì)合作、擁抱變化、誠(chéng)信、激情、敬業(yè)。
從中可以看出,價(jià)值觀對(duì)于公司行為和員工行為的導(dǎo)向有著極其重要的作用。同樣的,產(chǎn)品價(jià)值觀也是如此,我們做產(chǎn)品時(shí),任何需求的變動(dòng),任何體驗(yàn)的優(yōu)化都應(yīng)該在產(chǎn)品價(jià)值觀的范疇之內(nèi)。
例如一個(gè)新出的小眾語(yǔ)言pony,它的價(jià)值觀就很簡(jiǎn)單:
讓事情能夠簡(jiǎn)單、高效的完成
根據(jù)這個(gè)價(jià)值觀,它分解了幾個(gè)子價(jià)值觀,一起來(lái)看看:
- 正確性
事情能完成的前提條件是它是正確的。因此一切功能特性的添加和修改首先要保證的就是正確性 - 性能
除了正確性之外,最重要的就是性能。因此有損性能的語(yǔ)言特性和功能均不予以添加 - 簡(jiǎn)潔
因?yàn)楹?jiǎn)潔只排到了第三名,因此為了正確性和性能是可以犧牲簡(jiǎn)潔性的,與此相比,另一門很流行的語(yǔ)言go,就把簡(jiǎn)潔性排在了性能前面,因此為了簡(jiǎn)潔可以稍微犧牲性能
從上面看得出,產(chǎn)品價(jià)值觀會(huì)在方方面面指導(dǎo)我們的產(chǎn)品特性和功能該怎么添加、修改,一旦了有邊界,產(chǎn)品就會(huì)按照既定的軌道前行,最終很好的到達(dá)終點(diǎn)。
在價(jià)值觀基礎(chǔ)上分解產(chǎn)品總的目標(biāo),形成幾個(gè)子目標(biāo)
例如,要開發(fā)一款消息平臺(tái),目標(biāo)用戶是外部的用戶,包括了瀏覽器、移動(dòng)客戶端、物聯(lián)網(wǎng)客戶端等,那么這就是我們的產(chǎn)品總目標(biāo),該怎么分解為子目標(biāo)呢?
注意!這里是產(chǎn)品目標(biāo),盡量不要帶上技術(shù)色彩
- 我們需要提供外部用戶連接產(chǎn)品并發(fā)送和消費(fèi)消息的能力
- 消息應(yīng)該是有序的,可持久化的,可從任意位置開始遍歷
- 消息應(yīng)該盡可能快的送到用戶手中
- 要支持單播、廣播等方式,讓消息推送的策略更加靈活
- 消息要能被追蹤,通過(guò)消息ID可以對(duì)消息進(jìn)行可視化
- 完善的數(shù)據(jù)統(tǒng)計(jì)
- 通過(guò)管理后臺(tái)進(jìn)行管理操作
- 需要做業(yè)務(wù)隔離,業(yè)務(wù)之間彼此互不影響
這些產(chǎn)品目標(biāo)加起來(lái),就能形成一個(gè)可用的消息平臺(tái)了,但是到了這一步我們無(wú)法進(jìn)行開發(fā),同時(shí)這些需求也太大了,因此下一步,我們需要根據(jù)這些目標(biāo)對(duì)產(chǎn)品做一下技術(shù)架構(gòu)。
技術(shù)架構(gòu)
整體架構(gòu)可以大概分為三層,客戶端層,服務(wù)器邏輯層,數(shù)據(jù)存儲(chǔ)層。
外部用戶要連接產(chǎn)品并進(jìn)行操作,就需要提供通信協(xié)議和客戶端SDK
通信協(xié)議
然后客戶端和服務(wù)器通信肯定要有一套協(xié)議,按照目前的標(biāo)準(zhǔn),選擇MQTT是合理的選擇。MQTT是應(yīng)用協(xié)議,那網(wǎng)絡(luò)協(xié)議用什么承載呢?TCP、Websocket、Http?按照我們的使用場(chǎng)景,可能都需要支持。
客戶端SDK
再來(lái)看客戶端,我們是否需要SDK?因?yàn)镸QTT協(xié)議本身表達(dá)能力有限,如果要做復(fù)雜的邏輯,可能需要基于MQTT封裝一層自定義協(xié)議,那這個(gè)時(shí)候就需要客戶端的SDK,常用的有安卓、IOS、Javascript、Go、python等。
消息需要有序、持久和遍歷,那么就需要提供數(shù)據(jù)存儲(chǔ)層,同時(shí)我們還是一個(gè)開源項(xiàng)目,在產(chǎn)品價(jià)值觀中,性能肯定是很靠前的,因此我們要重視性能。
數(shù)據(jù)存儲(chǔ)層
這個(gè)時(shí)候選擇mysql等關(guān)系數(shù)據(jù)庫(kù)就不慎可靠了(注意!如果是給公司開發(fā)的內(nèi)部項(xiàng)目,用戶較少,是可以考慮Mysql的,更加方便);hbase很有名,性能也還可以,還能水平擴(kuò)展,但是維護(hù)成本高,遇到問(wèn)題未必hold住。因此Nosql成為比較自然的選擇,例如foundationDB和cassandraDB。同時(shí),為了測(cè)試方便,而且有些用戶不需要持久化消息,那需要提供一種基于內(nèi)存的存儲(chǔ)模式。
剩下的功能,包括后臺(tái)管理都應(yīng)該在服務(wù)器邏輯層了,具體得就不再細(xì)講了,大家有興趣可以自己私下嘗試,或者看看MeQ消息平臺(tái)
對(duì)于產(chǎn)品價(jià)值觀和目標(biāo)、技術(shù)架構(gòu),我們可以寫到產(chǎn)品的首頁(yè)Readme.md中,讓所有用戶看到。
設(shè)定里程碑
有了產(chǎn)品目標(biāo)、技術(shù)架構(gòu)還不夠,還需要為開發(fā)過(guò)程設(shè)定里程碑,在某個(gè)階段我們都應(yīng)該提供一個(gè)可交付的產(chǎn)品,要有詳細(xì)的產(chǎn)品交付目標(biāo)和日期,因此這些就是一個(gè)一個(gè)里程碑,對(duì)應(yīng)敏捷項(xiàng)目管理里,類似一個(gè)一個(gè)迭代。
然后把這些里程碑輸入到項(xiàng)目issues中的milestone里,設(shè)定好截止日期。
需求分解
最后,就是需求分解了,基于產(chǎn)品目標(biāo)和技術(shù)架構(gòu),分解出一個(gè)一個(gè)詳細(xì)的需求,每個(gè)需求都不要太大,以1-5天可以完成為準(zhǔn),然后把這些需求錄入到issues中,再指定到具體的里程碑。
至此,我們的產(chǎn)品就完成了設(shè)計(jì)的過(guò)程,剩余的就是開發(fā)了,相信這個(gè)也是大家最熟悉的部分,就不贅述了。
總結(jié)
我相信,任何事務(wù)都有方法論可以依循,就看我們能不能根據(jù)實(shí)際情況,正確的去發(fā)現(xiàn)和運(yùn)用這些方法了,而且有了方法后,一定要落成文檔,讓更多的人可以復(fù)制你的經(jīng)驗(yàn),更快的走向成功。