SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Downloaden Sie, um offline zu lesen
國際開放原始碼專案經營
從失敗中學習
洪任諭 (PCMan) @ COSCUP 2019
講者簡介
● Appier Software Engineer
● 台大資訊工程研究所畢業
● 前榮總風濕免疫科醫師
● 陽明大學醫學系畢業
● 15 年自由軟體開發
− LXDE / LXQt 桌面環境
− PIME 輸入法平台
− 新酷音輸入法 windows port
− PCMan BBS client 全系列
− IE Tab Firefox 外掛
2
無心插柳的漫長旅程...
● 2001 練習網路 socket 用法 →
● 2004 嘗試開發 Linux 版 → 此成為 Linux 使用者
● 2004 上網求助 → 意外混入 Debian 社群
● 2006 年練習開發 Linux 程式 → 意外成立 LXDE
● 2008 LXDE 走向國際
○ 感謝 Asus EeePC 贊助
○ 感謝德國 Mario Behling
● 2013 和來自歐洲的 Razor-qt 專案合併,成立 LXQt
3
國際專案經營 - 我學到了什麼?
● 使用者需求
● 開發者需求
● 團隊內政治
● 公關行銷 / 市場趨勢
4
我的 UI 在中東壞掉了...
5
RTL Layout 問題 (BiDi支援)
● 文字 (例: 希伯來、阿拉伯)
● 圖示 (箭頭方向)
● UI layout
6
使用者界面尺寸
● 字串翻譯後寬度和高度會發生變化
https://www.w3.org/International/articles/article-text-size.en 7
不是能翻譯就好
● 不同語言複數型不同
− msg = n + (n > 1 ? ' files are found' : ' file is found') X
− msg = n + 'file(s)' X
− 使用 ngettext() O
● 文法不同,翻譯後參數順序可能改變
− 英文: "String `%s' has %d characters"
− 德文: "%d Zeichen lang ist die Zeichenkette `%s'" X
− GNU 擴充: "%2$d Zeichen lang ist die Zeichenkette
`%1$s'" O
● https://www.gnu.org/software/gettext/manual/gettext.html8
外國使用者需求
● 輸入法 (CJK)
● Keyboard Layouts &特殊鍵
− Alt-Gr key 常用右Alt (例: AltGr + C → ©, AltGr + 4 → € )
− Dead key (例:法文 ` A → à )
● Locale:
− 日期
− 數字格式
− 金額格式
− 文字排序
9
排序有多難?
O(NlgN) (誤)
10
字串比大小
● strcmp()? ASCII 字典序? → X
● Unicode: 符合語言學的順序 (collate)
● 檔名排序 - 需考慮數字
− "file_1000", "file_20", "file_300" X
− "file_20", "file_300", "file_1000" O
● 請用 Libraries:
− strcoll(), libICU, glib, Qt
11
開發者需求
12
Code Quality 很重要
● PCMan 2007: 不良的架構、naming 不一致
● PIME: 修不完的 bugs
學到教訓:
● 要寫 tests
● Coding style, readability, design pattern 很重要
成功案例:
● pcmanfm: 因架構清楚可讀,後續有開發者順利接手
13
重寫?別衝動!
LXDE 檔案管理 PCManFM 重寫 3 次:
1. 原始版: 架構簡單但沒彈性 (後來衍生 SpaceFM)
2. 重新設計 UI 和 I/O 核心分離
3. Port to Qt: 原重複利用 libfm,最後完全用 C++ 重寫
學到教訓:
● 下次未必更好,可能問題更多
● 流失現有開發者 / 使用者 (compiz-fusion 也有失敗案例)
● 使用者想要 "功能",不在意 "架構"
● 沒有完美架構,只有 Trade-off 14
真不想承認啊,
這是我太過年輕而犯下的錯
15
冷門技術,找不到開發者 (GTK+)
LXDE 換 Qt / C++ (LXQt) → 開發團隊人數倍增
學到的教訓:
● 一人專案難維持,方便開發很重要!
● 慎選開發工具
16
選錯 License 事後補救?
● Libfm → from GPL to LGPL
● git log 找到所有貢獻者 E-mail
● 逐一詢問是否同意 re-license
● 確保 code 裡面的 license 正確標示 (Debian 很要求)
17
技術問題其實最好解決!
18
Software Skill
19
Software Skill
20
長期經營,是妥協的藝術
21
成員意見不合吵架 - 案例一
● 我重寫了另外一個成員辛苦貢獻的模組
● 後來成員離開...
學到的教訓:
● 不要隨便刪掉別人的 code
(不管你覺得自己是否寫得比較好)
● 技術優劣無絕對,注意團隊成員感受
22
成員意見不合吵架 - 案例二
● 爭吵使用何種線上翻譯平台
○ 自建 server?
○ 換商用系統? (原自建 server 維護者的心血被放棄)
學到教訓:
● 不要搶走別人貢獻的機會
23
成員意見不合吵架 - 案例三
● UI 該如何設計?
● 誰的實做方式比較優越?
學到教訓:
● 沒有絕對正確的設計 → 有錯再改
● 別爭執芝麻綠豆大的事 (看長遠)
● 成功的 teamwork 來自妥協
● 各自提出實做,理性討論,輪流退讓
24
成員意見不合 - LXDE / Razor-Qt 合併 =
LXQt = LXDE + Razor-Qt
衝突:
● Razor-Qt 的名稱不見了
解法: 客觀分析利害得失
● LXDE 知名度可以帶來用戶
● 補償:在 UI / Website 顯眼的地方感謝 Razor-Qt
● 開放態度: 未來可改
25
跨國專案的困擾
● 面對面,沒有一杯啤酒解決不了的問題
● 如果有,就兩杯
● But… 跨國專案你只有 E-mail,時區還相反
學到的教訓:
● 文字易生誤會
● 專業人士自尊強,小心溝通
● 用 code 輔助溝通
26
公關 - 社群維持
27
Release Early, Release Often
● 持續發表消息,刷存在感
● 要一直更新版本,就算很小
● Forum 沒人回比沒有更糟...
28
收到 Patch 時
● 無論 code 或態度好壞,請保持友善
● 如果 patch 品質不好?
− 直接 reject 自己重寫 X
− 往返討論,協助他改善 O
學到經驗:
● 犧牲當下效率,換長期參與者
29
社群風氣維護
● 成員對新手不友善
● 成員對 PR 貢獻者不友善
● 成員跟其他社群發生衝突 (Linux distribution)
學到教訓:
● 爭論易失焦,情緒化
● 不要輕忽仇恨語言的傷害,需要即時緩頰或道歉
● 盡量保持耐性,對新手友善
● 行為準則?
30
今天的新手,是明天的主要貢獻者
31
成員離開
● 開發理念不合
● 爆發言語衝突 (常見)
● 對專案不再有興趣
● 個人時間因素
即使曾發生衝突,還是別忘感謝他們的貢獻
Keep the door open
32
最大的困境 - Governance
Free-style: 任何成員都自由貢獻
造成問題:
● 一致性 (UI / UX, Design decisions)
● 未來 Roadmap 如何決定?
● Core team? Committee? Membership? Foundation?
● 誰代表 "官方"?
● 誰有網站管理權?
33參考: Five years on the Rust core team: a retrospective by Steve Klabnik
為什麼 Open Source 專案應該國際化?
34
誰關注 Open Source?
35https://trends.google.com.tw/trends/explore?q=%2Fm%2F01pjyj
誰開發 Open Source 軟體?
https://medium.com/@hoffa/github-top-countries-201608-13f642493773#.wmm24st82
Top countries by number of github pushes
(Aug 2016, by Felipe Hoffa)
36
跨國合作挑戰多
● 語言造成溝通障礙 – 用 code 溝通
● I18n 議題
● 文化差異 (注意禮貌)
● 來自世界各國, 各行各業的「人」
● Version control systems
● 讀懂別人的code,並且修改
● 外國人也想參加我們的專案!
37
也許世界很大,我們很小
38
透過 OSS,讓台灣被看見
39

Weitere ähnliche Inhalte

Was ist angesagt?

Python&GUI
Python&GUIPython&GUI
Python&GUILeo Zhou
 
軟體組裝心得分享
軟體組裝心得分享軟體組裝心得分享
軟體組裝心得分享Wen Liao
 
大家一起玩 PYPY
大家一起玩 PYPY大家一起玩 PYPY
大家一起玩 PYPYwilhelmshen
 

Was ist angesagt? (6)

Python&GUI
Python&GUIPython&GUI
Python&GUI
 
Go Lang
Go LangGo Lang
Go Lang
 
Go
GoGo
Go
 
軟體組裝心得分享
軟體組裝心得分享軟體組裝心得分享
軟體組裝心得分享
 
大家一起玩 PYPY
大家一起玩 PYPY大家一起玩 PYPY
大家一起玩 PYPY
 
Rootkit tw(0224)
Rootkit tw(0224)Rootkit tw(0224)
Rootkit tw(0224)
 

Ähnlich wie COSCUP 2019 國際開放原始碼專案經營 - 從失敗中學習

OpenLab.Taipei #2 PORTA2030
OpenLab.Taipei #2 PORTA2030OpenLab.Taipei #2 PORTA2030
OpenLab.Taipei #2 PORTA2030Rex Tsai
 
U boot 程式碼打掃計畫
U boot 程式碼打掃計畫U boot 程式碼打掃計畫
U boot 程式碼打掃計畫Macpaul Lin
 
做卓有成效的程序员
做卓有成效的程序员做卓有成效的程序员
做卓有成效的程序员Lv Jian
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇Shengyou Fan
 
Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture lusecheng
 
如何設計電腦 -- 還有讓電腦變快的那些方法
如何設計電腦  -- 還有讓電腦變快的那些方法如何設計電腦  -- 還有讓電腦變快的那些方法
如何設計電腦 -- 還有讓電腦變快的那些方法鍾誠 陳鍾誠
 
在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生Rick Hwang
 
Debian & Packaging
Debian & PackagingDebian & Packaging
Debian & PackagingLI Daobing
 
20170905 dev ops in hiiir
20170905 dev ops in hiiir20170905 dev ops in hiiir
20170905 dev ops in hiiirIsaac Tseng
 
20121115 Slides
20121115 Slides20121115 Slides
20121115 SlidesTonyq Wang
 
[精彩回顾]Linux新手教程
[精彩回顾]Linux新手教程[精彩回顾]Linux新手教程
[精彩回顾]Linux新手教程NJU OPEN
 
Adorable python
Adorable pythonAdorable python
Adorable pythonRhythm Sun
 
Linux运维趋势 第0期 运维自动化
Linux运维趋势 第0期 运维自动化Linux运维趋势 第0期 运维自动化
Linux运维趋势 第0期 运维自动化51CTO
 
Monster Processing Workshop (dayOne)
Monster Processing Workshop (dayOne)Monster Processing Workshop (dayOne)
Monster Processing Workshop (dayOne)Akinori Kinoshita
 
20030623 linuxbasic and-security
20030623 linuxbasic and-security20030623 linuxbasic and-security
20030623 linuxbasic and-security建融 黃
 
Xcode tutorial
Xcode tutorialXcode tutorial
Xcode tutorialMarch Liu
 
Windows Mobile 6 程式開發入門
Windows Mobile 6 程式開發入門Windows Mobile 6 程式開發入門
Windows Mobile 6 程式開發入門Chui-Wen Chiu
 

Ähnlich wie COSCUP 2019 國際開放原始碼專案經營 - 從失敗中學習 (20)

OpenLab.Taipei #2 PORTA2030
OpenLab.Taipei #2 PORTA2030OpenLab.Taipei #2 PORTA2030
OpenLab.Taipei #2 PORTA2030
 
U boot 程式碼打掃計畫
U boot 程式碼打掃計畫U boot 程式碼打掃計畫
U boot 程式碼打掃計畫
 
Build Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratchBuild Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratch
 
做卓有成效的程序员
做卓有成效的程序员做卓有成效的程序员
做卓有成效的程序员
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
 
Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture
 
如何設計電腦 -- 還有讓電腦變快的那些方法
如何設計電腦  -- 還有讓電腦變快的那些方法如何設計電腦  -- 還有讓電腦變快的那些方法
如何設計電腦 -- 還有讓電腦變快的那些方法
 
在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生
 
Debian & Packaging
Debian & PackagingDebian & Packaging
Debian & Packaging
 
20170905 dev ops in hiiir
20170905 dev ops in hiiir20170905 dev ops in hiiir
20170905 dev ops in hiiir
 
20121115 Slides
20121115 Slides20121115 Slides
20121115 Slides
 
[精彩回顾]Linux新手教程
[精彩回顾]Linux新手教程[精彩回顾]Linux新手教程
[精彩回顾]Linux新手教程
 
Adorable python
Adorable pythonAdorable python
Adorable python
 
Linux运维趋势 第0期 运维自动化
Linux运维趋势 第0期 运维自动化Linux运维趋势 第0期 运维自动化
Linux运维趋势 第0期 运维自动化
 
Monster Processing Workshop (dayOne)
Monster Processing Workshop (dayOne)Monster Processing Workshop (dayOne)
Monster Processing Workshop (dayOne)
 
2016 年春季嵌入式作業系統課程說明
2016 年春季嵌入式作業系統課程說明2016 年春季嵌入式作業系統課程說明
2016 年春季嵌入式作業系統課程說明
 
20030623 linuxbasic and-security
20030623 linuxbasic and-security20030623 linuxbasic and-security
20030623 linuxbasic and-security
 
Xcode tutorial
Xcode tutorialXcode tutorial
Xcode tutorial
 
Taiwanese Experience in IT
Taiwanese Experience in ITTaiwanese Experience in IT
Taiwanese Experience in IT
 
Windows Mobile 6 程式開發入門
Windows Mobile 6 程式開發入門Windows Mobile 6 程式開發入門
Windows Mobile 6 程式開發入門
 

COSCUP 2019 國際開放原始碼專案經營 - 從失敗中學習