如何從零開始設計一款好的技術開源產品

本文發表時間:2018 年 7 月 13 號
文章最初發表於http://sunface.io

前言

技術男擅於想象也擅於幻想,類如在全球最大同性交友平臺上,打造你的最強兵器,出盡風頭,博得更多的同性友誼。那麼問題來了,那麼大的用戶羣體,你怎麼才能脫穎而出,筆者自己也思考了很久,總結出一套可行的方案。

七種兵器

劍之靈動,刀之雄厚,七種兵器如果選擇就夠俠者喝一壺了。同時用千年寒鐵和普通鐵礦打造出的兵器肯定是雲泥之別的,但是千年寒鐵肯定是極其稀有的。

各種XXX攻略

君不見最近Github上Star上漲很快的大部分都是XXX攻略,例如架構師知識圖譜,面試知識圖譜等等,簡直是開掛般的存在,但是本文的標題是‘技術開源產品’,因此攻略顯然不是產品,這裏就排除在外了。

什麼是具有可行性的產品

擁有特定的目標和用戶羣體,能產生出相對獨一無二的價值,就可以認爲是一款具有可行性的產品了,這裏有三個對象:產品目標、用戶羣體、產品創新,下面我們來一一分析,該怎麼選材

用戶羣體

因爲咱們已經是技術開源產品了,用戶羣體無非就是開發或者測試,但是考慮到github上絕大部分都是開發,因此排除測試用戶,至於開發,可以進一步細分爲前端、後端、運維,產品對應的用戶羣體越大,自然收穫的star會更多。

衆所周知,前端的開發羣體是最多的,因爲作爲開發或多或少都要會一些前端。在前端領域,javascript的開源產品,獲取star的速度明顯是鶴立雞羣,藐視一切英雄好漢的,因此如果你具有較好的js和nodejs水準,就可以傾向於打造面向js用戶羣體的產品了。

再來談談後端,後端又分爲面向特定領域:雲計算、區塊鏈等和麪向特定語言:python、go、java、rust等,那該怎麼選擇呢?

首先是,一定站在風口上,豬都能起飛,何況咱們這些高智商人羣,因此特定領域的風口目前來看就是k8s+docker生態,區塊鏈生態,機器學習生態等,至於特定語言,go和rust是有很大優勢的,因爲這兩門語言目前在開源社區非常受歡迎,附帶着相關的庫也會變得容易獲得青睞。

總結:儘量選擇處於技術風口的技術領域和編程語言,讓你的目標羣體放得更大

產品目標

產品的目標首先來說就是產品的類型
- 一站式平臺
- 工具類服務
- 編程框架庫

其次就是產品難易度,這個也很重要,你要充分預估你的時間能完成的項目是什麼樣的?相對簡單的產品,同時還更容易讓社區中的同性夥伴們參與進來,但是換來的代價就是你面對的可能是一片紅海,這個很自然,簡單的東西做得人自然更多。

總結:首先根據自身的時間/技術能力選擇一個最適合的產品類型,同時要考慮到兩點: 未來社區的參與度和用戶羣體的潛在大小

產品創新

要知道,任何一個產品都不太可能是完全創新,因此和你的產品重疊的產品可能已經存在很多,那麼你的產品憑什麼突圍而出呢?是時候祭出我們的尚方寶劍了:微創新。

微創新的概念這裏就不談了,我談談幾個點:
- 功能上的創新:完善、優化等
- 使用體驗方面的創新:舉個例子,區塊鏈火了後,P2P網絡也迅速火了,這個時候ipfs把自己的p2p技術棧抽象了出來,形成了一個庫:libp2p,但是!實在是太tmd不好用了,誰用誰熬夜! 這個時候,另外一個主打產品體驗的p2p庫橫空出世,簡直完爆libp2p,儘管功能上還不完善,穩定性上也達不到生產級別,但是在可以預期的未來,這款產品在市場上肯定要大火的
- 生態的創新:有些產品自成生態,啥都自己來;有些產品選擇三方生態,設定好基本的產品形勢,讓大家都能參與進來
- 文檔和官網的創新:這個很重要!有好的官網和文檔,對比不好的,完全兩碼事,對了你還需要一個和產品名字相同的域名,看上去更專業
- 可維護性的創新:有些產品天生就難以維護,讓後來者欲生欲死

總結:一定要考慮清楚產品的微創新是什麼,通過創新給用戶帶來的價值是什麼?千萬不要自我覺得良好

用戶思維

如果你是XX用戶,你需要什麼功能;如果你是一個小白用戶,該怎麼使用這款產品。簡而言之,要換位思考,換位思考這個詞大家都知道,但是又有幾個人真正知道,你做的產品是爲你自己虛擬的用戶打造的還是爲真是用戶打造的?值得深思。

獨孤九劍

武器在手,天下我有,哈哈!等等,大俠,你這是?野球拳??!

對於絕大多數程序員來說,想到了做什麼後,緊接着就是簡單思考一番,就是直接開擼了,但是大俠們,你們是不是略過了很重要的一步?你還沒有學劍譜呢!因此產品設計是極其重要的一步,否則做到後面,重構或者目標偏移都是很正常的事情。

設定產品價值觀(產品哲學,英文Philosophy)

大家應該都聽說過阿里的六脈神劍價值觀:客戶第一、團隊合作、擁抱變化、誠信、激情、敬業。

從中可以看出,價值觀對於公司行爲和員工行爲的導向有着極其重要的作用。同樣的,產品價值觀也是如此,我們做產品時,任何需求的變動,任何體驗的優化都應該在產品價值觀的範疇之內。

例如一個新出的小衆語言pony,它的價值觀就很簡單:

讓事情能夠簡單、高效的完成

根據這個價值觀,它分解了幾個子價值觀,一起來看看:
- 正確性
事情能完成的前提條件是它是正確的,一切功能特性的添加和修改首先要保證的就是正確性
- 性能
除了正確性之外,最重要的就是性能, 有損性能的語言特性和功能均不予以添加
- 簡潔
簡潔只排到了第三名,爲了正確性和性能是可以犧牲簡潔性的,與此相比,另一門很流行的語言go,就把簡潔性排在了性能前面,爲了簡潔可以稍微犧牲性能

從上面看得出,產品價值觀會在方方面面指導我們的產品特性和功能該怎麼添加、修改,一旦了有邊界,產品就會按照既定的軌道前行,最終很好的到達終點。

在價值觀基礎上分解產品總的目標,形成幾個子目標

例如,要開發一款消息平臺,目標用戶是外部的用戶,包括了瀏覽器、移動客戶端、物聯網客戶端等,那麼這就是我們的產品總目標,該怎麼分解爲子目標呢?

注意!這裏是產品目標,儘量不要帶上技術色彩
1. 我們需要提供外部用戶連接產品併發送和消費消息的能力
2. 消息應該是有序的,可持久化的,可從任意位置開始遍歷
3. 消息應該儘可能快的送到用戶手中
4. 要支持單播、廣播等方式,讓消息推送的策略更加靈活
5. 消息要能被追蹤,通過消息ID可以對消息進行可視化
6. 完善的數據統計
7. 通過管理後臺進行管理操作
8. 需要做業務隔離,業務之間彼此互不影響

這些產品目標加起來,就能形成一個可用的消息平臺了,但是到了這一步我們無法進行開發,同時這些需求也太大了,因此下一步,我們需要根據這些目標對產品做一下技術架構。

技術架構

整體架構可以大概分爲三層,客戶端層,服務器邏輯層,數據存儲層。

外部用戶要連接產品並進行操作,就需要提供通信協議和客戶端SDK

通信協議

然後客戶端和服務器通信肯定要有一套協議,按照目前的標準,選擇MQTT是合理的選擇。MQTT是應用協議,那網絡協議用什麼承載呢?TCP、Websocket、Http?按照我們的使用場景,可能都需要支持。

客戶端SDK

再來看客戶端,我們是否需要SDK?因爲MQTT協議本身表達能力有限,如果要做複雜的邏輯,可能需要基於MQTT封裝一層自定義協議,那這個時候就需要客戶端的SDK,常用的有安卓、IOS、Javascript、Go、python等。

消息需要有序、持久和遍歷,那麼就需要提供數據存儲層,同時我們還是一個開源項目,在產品價值觀中,性能肯定是很靠前的,因此我們要重視性能。

數據存儲層

這個時候選擇mysql等關係數據庫就不慎可靠了(注意!如果是給公司開發的內部項目,用戶較少,是可以考慮Mysql的,更加方便);hbase很有名,性能也還可以,還能水平擴展,但是維護成本高,遇到問題未必hold住。因此Nosql成爲比較自然的選擇,例如foundationDB和cassandraDB。同時,爲了測試方便,而且有些用戶不需要持久化消息,那需要提供一種基於內存的存儲模式。

剩下的功能,包括後臺管理都應該在服務器邏輯層了,具體得就不再細講了,大家有興趣可以自己私下嘗試,或者看看MeQ消息平臺

對於產品價值觀和目標、技術架構,我們可以寫到產品的首頁Readme.md中,讓所有用戶看到。

設定里程碑

有了產品目標、技術架構還不夠,還需要爲開發過程設定里程碑,在某個階段我們都應該提供一個可交付的產品,要有詳細的產品交付目標和日期,因此這些就是一個一個里程碑,對應敏捷項目管理裏,類似一個一個迭代。

然後把這些里程碑輸入到項目issues中的milestone裏,設定好截止日期。

需求分解

最後,就是需求分解了,基於產品目標和技術架構,分解出一個一個詳細的需求,每個需求都不要太大,以1-5天可以完成爲準,然後把這些需求錄入到issues中,再指定到具體的里程碑。

至此,我們的產品就完成了設計的過程,剩餘的就是開發了,相信這個也是大家最熟悉的部分,就不贅述了。

總結

我相信,任何事務都有方法論可以依循,就看我們能不能根據實際情況,正確的去發現和運用這些方法了,而且有了方法後,一定要落成文檔,讓更多的人可以複製你的經驗,更快的走向成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章