# <i class="fa fa-file-text"></i> HackMD
## 用開放寫作凝聚社群能量
---
<img src="https://i.imgur.com/PTbB46S.jpg" style="width:300px;height:300px;border-radius:50%"/>
## 吳承翰 Max Wu
#### CTO of HackMD
喜歡自己製造、創作軟體的開發者
闖過 COSCUP、MOPCON、SITCON 等研討會
最近致力於打造開發者社群
---
![](https://i.imgur.com/9SI2nZO.png)
<small>
https://www.ptt.cc/bbs/Soft_Job/M.1566115714.A.A2A.html
</small>
:sweat: :ok:
----
![](https://i.imgur.com/IpP2T3W.png)
:sweat_smile: :relaxed:
---
# <i class="fa fa-file-text"></i> HackMD
- 靈感來自 Hackpad
- 更注重速度與靈活度
- 跨平台的筆記服務
----
# <i class="fa fa-file-text"></i> HackMD
- 靈感來自 Hackpad :arrow_right: 已被收購、收攤
- 更注重速度與靈活度 :arrow_right: 不用工具列也能輕鬆寫
- 跨平台的筆記服務 :arrow_right: 不同裝置也可以協作
---
# Hack + MD
----
# Hack
## 用聰明的方法來完成事情<!-- .element: class="fragment" data-fragment-index="1" -->
----
# Markdown
## 輕量的視覺化標記語言<!-- .element: class="fragment" data-fragment-index="1" -->
## 文字就可以排版的語法<!-- .element: class="fragment" data-fragment-index="2" -->
---
## 一個人怎麼實踐理想?
# 「組合肉」<!-- .element: class="fragment" data-fragment-index="1" -->
----
# 起源
## 2014 年 資訊安全 期末專案
<!-- .element: class="fragment" data-fragment-index="1" -->
### 好奇即時協作的原理與其中的安全問題<!-- .element: class="fragment" data-fragment-index="2" -->
### 因為我很懶所以愛上優雅的 Markdown<!-- .element: class="fragment" data-fragment-index="3" -->
----
# 做法:
1. 上網搜尋 Collaborate Editor
2. 找最容易看得懂的範例開始改起
3. 找可以用的 Open Source 套件加料
4. 研究原始碼填補接縫
5. 測試功能正常,美化外皮
----
## 結論:兩天完成的夜市牛排
- 可以多使用者同時協作文字
- 實作對稱式加解密 (AES)
- 其實就是實踐 MVP (最小可行產品) 的過程
----
# 劇終
- 這個專案拿到 99 分
- 做完就去放寒假了 XD
----
![](https://i.imgur.com/r348jfi.png)
---
## Re: 從零開始的協作筆記
- 既然用了 Markdown 就要渲染成 HTML 啊!
- 先來場大亂鬥看看會發生甚麼事情?!
- 有沒有要開源?
---
## 選擇 Markdown renderer
:arrow_down: <!-- .element: class="fragment" data-fragment-index="1" -->
## 要先選擇 Markdown 標準 <!-- .element: class="fragment" data-fragment-index="2" -->
----
## Markdown
2004 年 3 月 19 日
由 John Gruber 提出 (與 Aaron Swartz 協作)
是易讀易寫、容易轉換成 HTML 的標記語法
### 自由格式 <!-- .element: class="fragment" data-fragment-index="1" -->
### 語法相當鬆散 <!-- .element: class="fragment" data-fragment-index="2" -->
----
### 因此有著各式各樣的變體
![](https://i.imgur.com/oUGjW8J.png =400x)
<small>
https://www.iana.org/assignments/markdown-variants/markdown-variants.xhtml
</small>
持續增加中... :1234:
----
## 採用 CommonMark
最新版本為 0.29 (2019-04-06)
![](https://i.imgur.com/0mR7Lsj.png =x400)
----
## 選擇 Markdown renderer
----
# markedjs / marked
<i class="fa fa-star"></i> 20482 <i class="fa fa-exclamation-circle"></i> 74
- 輕量、效能最好
- 遵循原始 Markdown 標準
- 自訂語法較困難
- MIT 授權
----
## markdown-it / markdown-it
<i class="fa fa-star"></i> 8061 <i class="fa fa-exclamation-circle"></i> 4
- 效能佳
- 遵循 CommonMark 標準
- 容易自訂語法
- 外掛多
- MIT 授權
~~jonschlinkert / remarkable~~
已棄用,markdown-it 的前身
<!-- .element: class="fragment" data-fragment-index="1" -->
----
# remarkjs / remark
<i class="fa fa-star"></i> 2476 <i class="fa fa-exclamation-circle"></i> 9
- 效能好
- 遵循 CommonMark 標準
- 外掛多
- MIT 授權
----
實際用過後
## 選擇 markdown-it
:white_check_mark:
----
# 你怎麼選擇開源套件的?
----
- 符合需求?
- 星星多?
- Issue 少?
- 最近還有維護?
- 社群人多?
- 文件完整?
- 程式碼乾淨好讀?
- 容易擴充?
- 授權相容?
- `...`
---
# 上線 & 開源
----
2015 年 3 月 14 日
# <i class="fa fa-file-text"></i> HackMD
## 使用 Heroku 上線服務
----
# 社群推廣大亂鬥
- 分享到 FB 的幾個較大的資訊相關社團
- 自己分享到 Hacker News
- 造成空前的流量,很多人一起測試輸入
----
# 大爆炸 :bomb:
- 有人嘗試輸入 40 萬字,造成 CPU 負載過重
- 有人嘗試輸入 不安全的語法
- 多人一起輸入會搶字
----
當時也還是新手的我
也不知道怎麼解決這些問題
----
但是無論如何
# 取之開源 <!-- .element: class="fragment" data-fragment-index="1" -->
# 回饋開源 <!-- .element: class="fragment" data-fragment-index="2" -->
----
2015 年 5 月 4 日
# <i class="fa fa-file-text"></i> HackMD
## 採用 MIT 授權在 GitHub 開源
~~把債迴向給社群~~
----
其實前一年半幾乎都在自嗨
利用課餘時間刻專案
![](https://i.imgur.com/KbXaV91.png =700x)
----
### 因為線上服務,開始有使用者出現
### 形成以下循環
- 使用者回報需求或是問題
- 研究如何實作或是解決
- 修正程式
- 部署上線
----
### 漸漸的有使用者會在 GitHub 活躍
- 大多數是開功能與增強需求
- 經常有 issue 討論我沒想過的事
- 少數會實際貢獻程式碼
~~星星累計超過一千顆之後就很容易自然成長~~
----
## 經常互動的使用者
## 就可能成為夥伴!
----
![](https://i.imgur.com/JqkacYR.png =500x)
2016 年末,因為要導入 webpack 的機緣
收到 Yukai 的貢獻,並成為我們的一員!
:+1:
----
## 社群開始發展
- 日本網友主動寫 blog 介紹
- twitter 上有很多日文推文
- FB 也有很多中文的討論 ~~抱怨~~
----
### 看到許多有趣的 fork 或是相關 repo
- 日本網友貢獻支援 docker 部署
- 日本網友貢獻支援 abc.js 樂譜功能
:checkered_flag: 網友創意無限 :checkered_flag:
<!-- .element: class="fragment" data-fragment-index="1" -->
----
### GitHub 開始有更多貢獻
- 貢獻文件更新,避免出現隱藏功能 :stuck_out_tongue_winking_eye:
- 貢獻部署方式,可以到處撒種子 :baby:
- 貢獻登入方式,可以跟更多驗證系統整合 :100:
~~想把 repo 變成自己喜歡的形狀~~
:flushed:
<!-- .element: class="fragment" data-fragment-index="1" -->
----
### 2016 年 服務越來越多人使用
- 會員數量突破 1000 人
- 同時線上人數突破 100 人
- 累計超過 1 萬篇筆記被撰寫
- GitHub repo 星星突破 1000 顆
<!-- .element: class="fragment" data-fragment-index="1" -->
----
## 心中有了更多的問題
- 要畢業了,還能持續維護這個專案嗎?
- 要當兵了,還能持續維護這個服務嗎?
- 出社會後,能夠用這個維生嗎?
<!-- .element: class="fragment" data-fragment-index="1" -->
----
### 如果想要持續下去
### 那就用來創業吧!
:rocket:
---
# 商業化 & 社群
----
# 那,你是誰?
- 為什麼會很多人用?
- 都用在什麼地方?
- 產生什麼價值?
----
# 也就是說
- 要賣什麼?
- 要賣給誰?
- 怎麼賣?價錢與計費方式?
- 能夠給予客戶什麼價值?
----
## 不管了,先開發可以賣的功能
- fork 開源的 repo 成閉源版本<!-- .element: class="fragment" data-fragment-index="1" -->
- 檢查替換不能授權商用的 dependency<!-- .element: class="fragment" data-fragment-index="2" -->
- GPL
- LGPL
- AGPL
- 檢查是否有正確的使用授權<!-- .element: class="fragment" data-fragment-index="3" -->
- Apache 2.0
----
## 2017 年 11 月,推出企業方案
## HackMD Enterprise Edition
- 主打知識庫,適合團隊內部使用
- :boom: 有更多已成熟的解決方案可以使用<!-- .element: class="fragment" data-fragment-index="1" -->
- 有幾位國外客戶聯絡想要客製化
- :boom: 客製化的成本很高,人力不足<!-- .element: class="fragment" data-fragment-index="2" -->
- 試試看去賣台灣的公司
- :boom: 客戶想要更細緻的權限控制<!-- .element: class="fragment" data-fragment-index="3" -->
----
## 同時開源專案更名為
## HackMD Community Edition
- 更改授權為 AGPL<!-- .element: class="fragment" data-fragment-index="1" -->
- 避免有人另開服務來競爭<!-- .element: class="fragment" data-fragment-index="2" -->
- 但也讓我們不能使用開源版的貢獻<!-- .element: class="fragment" data-fragment-index="3" -->
**AGPL 是把雙刃劍** :fork_and_knife:
<!-- .element: class="fragment" data-fragment-index="4" -->
----
## 開源專案轉換授權
- 分析並找出所有程式的貢獻者<!-- .element: class="fragment" data-fragment-index="1" -->
- 請所有貢獻者簽署同意變更授權<!-- .element: class="fragment" data-fragment-index="2" -->
- 未來的貢獻者都要 Sign-off commits<!-- .element: class="fragment" data-fragment-index="3" -->
**這是一個漫長的過程...** :cry:
<!-- .element: class="fragment" data-fragment-index="4" -->
----
# 然後就被抓去當兵了...
消失到 2018 年 1 月
<!-- .element: class="fragment" data-fragment-index="1" -->
----
### 回來後專注在開發企業版功能
### 並開始找尋資金,申請創業加速器
----
開源社群對於 HackMD CE 這個名字有些誤解
認為是 Open Core 的商業模式
- 例如:GitLab<!-- .element: class="fragment" data-fragment-index="1" -->
- CE 與 EE 採用相同的核心模組並開源<!-- .element: class="fragment" data-fragment-index="2" -->
- 擴充與延伸模組收費,但是不一定開源<!-- .element: class="fragment" data-fragment-index="3" -->
**但是其實我們是 fork**<!-- .element: class="fragment" data-fragment-index="4" -->
----
為了避免更多的誤解,由社群更名為 CodiMD
---
## 2018 年 產品逐漸轉型
經過不斷的訪談與了解使用者需求<!-- .element: class="fragment" data-fragment-index="1" -->
重新定位成開發者文件社群產品
希望透過公開協作,促進社群討論的能量
<!-- .element: class="fragment" data-fragment-index="2" -->
----
## 經過創業加速器的訓練
- 有了初始資金
- 有了全職的夥伴與辦公室
- 有了銷售流程
**開始探索更好的商業模式**<!-- .element: class="fragment" data-fragment-index="1" -->
----
### 但是,開源社群產生了變化
當時主要維護社群的兩位德國貢獻者
認為專案在我們的組織底下,無法自由掌握發展方向
因此提議開設另一個組織,另行維護
----
### 實際上,我們給予社群完全的自由
兩位主要貢獻者擁有 repo 的管理與整合服務權限<!-- .element: class="fragment" data-fragment-index="1" -->
我們提案改採用 Open Core 模式
希望能夠相容社群與商業的需求
<!-- .element: class="fragment" data-fragment-index="2" -->
----
### 還是不夠自由?
他們認為即使是 Open Core 模式<!-- .element: class="fragment" data-fragment-index="1" -->
當 CE 想要開發與 EE 相同的功能時
還是有利益衝突,不符合自由精神
<!-- .element: class="fragment" data-fragment-index="2" -->
----
# 其實...
- 目前開源專案 80% 的核心功能仍是我們貢獻的
- 安全漏洞由我們第一時間修補與貢獻
----
## 有商業意圖的開源專案就不自由了?
---
## 開源專案是誰在維護?
- 原始作者?
- 社群?
- 公司?
- 其實單純使用的人比較多?
----
## 實際上...
- 大多數貢獻都比較小
- 貢獻核心功能需要掌握架構,很容易做到放棄
- 主要貢獻者如果想法一致,可以養成核心維護團隊
- 貢獻功能後誰來審核與合併?
- 如何 release?民主制度還是專制?
- 怎麼決定 roadmap?誰來決定?
---
## 開源專案怎麼永續?
- 找 sponsor 贊助
- 收 donation
- 找商業模式
- 一起做公益、做功德?
<small>
https://en.wikipedia.org/wiki/Business_models_for_open-source_software
</small>
---
## 開源專案怎麼推廣?
- 貼社群網路
- 買廣告
- 跑研討會、聚會
- 有人使用就是做好的推廣!
- 誰在後面給予協助推廣?
---
## 或許未來我們會這樣開源
- 說明我們就是商業化的專案
- 告知社群未來的 roadmap
- 請所有貢獻者簽署 CLA
- 貢獻後我們可以修改與使用在商業上 :gift:
- 提供開源與商業版本的比較
----
### 其實也有相當多其他專案遇到類似問題
- Open Distro for Elasticsearch
- npm ban terminal ads
- standard.js
- core.js
- handsometable drop MIT license
- Docker vs Mobi
- RedHat vs Linux
----
## 勇者們,選擇你的授權吧!
https://choosealicense.com
https://opensource.org/licenses
https://en.wikipedia.org/wiki/Comparison_of_free_and_open-source_software_licenses
---
<div class="big-table">
|Markdown 台灣|VSCode 台灣|
|:--:|:--:|
|![](https://i.imgur.com/eWHTcRt.png =350x)|![](https://i.imgur.com/QKTWhcH.png =350x)
|https://bit.ly/2MNfisR|https://bit.ly/2MO833E
</div>
<style>
.reveal section .big-table img {
max-width: unset;
max-height: unset;
}
</style>
---
# 謝謝大家!
{"metaMigratedAt":"2023-06-15T00:08:16.849Z","metaMigratedFrom":"YAML","title":"開源之旅:HackMD 的發展與挑戰","breaks":true,"lang":"zh-tw","disqus":"hackmd","slideOptions":"{\"width\":1200}","contributors":"[{\"id\":\"61af98f4-b303-4819-b08b-aa32cf6677a8\",\"add\":9518,\"del\":369}]"}