今天在北京聯想參加了「開源中國」的「源創會」,在會場上做了關於《Ubuntu Tweak五年之歷程》的分享。
這是至今為止我參加過人數最多的活動,大概有300+。看著這麼多人,我剛上台的時候大概緊張了1分鐘,但是之後我就進入狀態了,而且完全沒有看演講稿,就很自然地講下去了。整個演講大家都給了我很大的支持與鼓勵,我得以順利地完成。
這是我自己感覺最好的一次活動,我也完全地把自己想表達的東西表達了出來,現場大家的提問也非常好,可見大家都聽懂了 :) 總之,真的很享受這次活動。
我把Slides和演講稿放出來,感興趣的朋友可以一邊讀文字一邊對照Slides。
Slides下載地址:five-years-of-ubuntu-tweak.pdf
大家好,
我是來自 Canonical 的周鼎,今天我很榮幸收到開源中國的邀請在這裡與大家聊聊有關開源的一些東西。
我想跟大家分享一下過去五年來,自己在 Linux 開源世界的一些認識、經歷和收獲。我可能是現場唯一講桌面軟件和桌面系統的,與大家的技術交集不多,因為現在的主流是 Web、移動應用和雲計算平台。但是,桌面系統是我們工作離不開的平台,桌面系統對我們來說是最重要且最直接的工具,我相信大家都是在桌面系統裡編程和創 造,而不是在浏覽器和手機裡。沒有桌面系統,我們就無法創造 Web 及移動平台,所以在未來還是會繼續發揮其重要的作用。
在這裡我想簡單的了解一下,有多少朋友是寫代碼的?(現場幾乎全部舉手)
很高興看到這麼多朋友是寫代碼的,那麼請允許我代表你們一下:作為一個開發者,大家都是希望能做出自己的作品的,是不是!(現場反響)
所以今天我在這裡與大家分享一下我的個人作品——Ubuntu Tweak,希望通過個人技術和產品上的經歷,能與大家產生一些共鳴。
在講 Ubuntu Tweak 之前,我先來提一下 Ubuntu 吧。今天,我想首次以官方人士的身份,向大家宣布 Ubuntu 的中文名——友幫拓。但是我不要求大家用它,因為我自己也不說。
然後我來講 Ubuntu Tweak 吧。首先,它不是「優化大師」,它是一個桌面系統的調整工具,我從2007年7月開始做這個軟件,現在最新版本是0.7.2,已經做了五年,有了50多個 版本。它大概有不到2萬行代碼,最多一次下載有50萬,支持多國語言,軟件本身是由很多貢獻者完成的。
我相信現場有些朋友可能沒用過 Ubuntu Tweak,我來做個簡單的演示:
我是在2006年末開始接觸Linux,並且試了幾個發行版後,就選擇了 Ubuntu。所有 Linux 使用經歷在五年以上的朋友應該知道,那時 Linux 很不好用,尤其是中文支持方面,沒有像現在這樣好的微米黑了。當時用 Linux,基本上一裝好系統就要各種配置,折騰下字體、折騰下輸入法,再折騰下系統主題啥的,讓系統更漂亮,畢竟是天天工作的系統,讓它變得賞心閱目是 必要的。
當時我非常喜歡把我的 Ubuntu 美化成 Mac OS X,已經到了以假亂真的地步了。
因為那時 Linux 很不好用,我又喜歡解決問題,於是,做一個系統傻瓜配置工具的想法,就這樣冒出來了。
2007 年的暑假,當時我僅有一些C語言和 Java 的基礎,我就參照著另外一款開源軟件,開始寫 Ubuntu Tweak。當時我進入開源世界感覺真的非常棒,當時沒有 Github 這樣的方便的交流溝通平台,所有能接觸到的源碼最全而且最方便的,就是 Linux 操作系統。你想想,一句「apt-get source foobar」,就能把一個開源項目的源碼自動下載好並解開來,馬上就可以看了,這對剛剛開始學習編程且如饑似渴的人來說,簡直是如魚得水啊。
實際上是現在回想,開源世界也有一個缺點,就是文檔不夠齊全。很多庫的文檔都不完善,你只有自己親自去試才能理解更深。甚至有時候,你必須得去看這 個庫本身是怎麼實現的。很多事情都是兩面的,於是這實際上這也是一個優點,只有在開源的 Linux 操作系統上,你才有機會因為文檔的不齊全直接去接觸問題的本質,去看一個具體的庫是怎麼實現的,從而解決問題。我覺得使用 Linux 而且在 Linux 平台上編程有助於培養從本質上解決問題的能力。
當時我真的什麼都不懂,但是意識裡還有一些現代項目管理的意思,比如我還不知道什麼是「版本控制」,但是我自創了基於文件夾的「人肉版本控制」,還 挺自豪地寫了篇文章。後來馬上有前輩告訴我該去用 SVN(當時 Git 還不流行)。我馬上采納了意見,學習了下 SVN,並且入駐了當時比較流行的 Google Code。
這裡是當時第一個做出的功能,把我激動了好一會,就是把系統配置讀出並響應到一個響應的顯示上,如果勾選了這個按鈕,就把系統配置也改掉了。
利用好開源世界開源的特性,多讀源碼這個「文檔」
而這是當時把界面差不多建立好的樣子,沒錯,當時我為了更中文化改名叫了「Ubuntu優化大師」,不過後來又給我改回來了。
大概邊學邊做一個暑假,在開學的時候,我就推出了 Ubuntu Tweak 的第1個版本:0.1.2。這個版本的 Ubuntu Tweak 是用C語言寫的,很不好用,界面非常破,功能也有限,但總歸有了一個開始。而且因為我曾經是做 Linux 資訊網站(Linux 桌面中文網)的,很自然地就把它放在自己的網站和其他論壇上進行推廣,也引起了不少關注。很快就有朋友說要幫我編譯一個64位的版本,還有朋友又說要幫我 翻譯成繁體中文。
當時我還在「LUPA」這個開源社區混,當時我在杭州讀書,LUPA 也正好是杭州的。剛剛 LUPA 准備搞一個開源沙龍,看到我發的這個東西,就被當時 LUPA 社區的主管發現了,他就邀請我去 LUPA 沙龍上講講。於是這次是我在開發了這個軟件發布沒幾天後,就第一次在線下跟大家分享了,這給當時的我有著很大的鼓舞。真的很感謝當時邀請我分享這個軟件的 LUPA 社區,就像今天開源中國邀請我讓我有機會得以貫穿一下這五年。
主動進行宣傳,願意參與的人可能比你想像中的還要多
專注 coding 之外,也要混一下社 區。
在發布第一個版本之後,我還注冊了 ubuntu-tweak.com 的域名,,我馬上搭起了一個 WordPress,用英語向世界廣播。這個意義也是相當巨大的。正所謂開源無國界,如果你做的東西沒有區域限制,那麼不要怕英文不好,推出國際版可以說是必備的。
然後因為我還在學校,經常逃課不去上課,時間非常多,基本上是全身心放在做這款軟件上了。PS:我當時還是學習委員。
我的迭代開發速度很快。很快半個月後,我又發布了一個新版本,0.1.4。這個版本依然還是比較差的,但是修正了很多 bug,最重要的是,給關注它的用戶看到了我願意在上面傾注的熱情,然後這個版本自然有了比之前更多的關注量。
在連發兩個版本後,我馬上意識到了之前的方式雖然 quick 但是 dirty,隨著功能開發越來越多,會越來越難以維護和很多潛在的問題。於是我立馬放慢了速度,嘗試去學習了一些設計模式,把軟件的框架變得更加靈活而且 容易控制,記得那個時候就接觸了 MVC 設計模式。而且這個版本得到了當時在北京朋友的支持,他為 Ubuntu Tweak 設計了全新的Logo,讓 Tweak 得以在後面爭氣一下「好歹要對的起這個專業的設計師設計的Logo是吧?」我開始花精力在界面的設計上,而不是僅僅在代碼的設計上。當然這個過程非常的漫 長。
在一個半月後,2007年11月,經過無論是結構還是用戶界面改良的 Ubuntu Tweak 0.2發布了。當時我繼續像以往一樣,寫了一篇很詳細的、圖文並茂的發布文章。這個習慣一直沿用到現在,我覺得雖然不會有人看也不一定會關心你修了幾個 bug 或內部有用什麼設計模式,但是就當為自己寫。
寫詳細的發布通告,至少讓自己知道這個版本做了什麼變動
然後在這個版本後,因為用戶增多了,大家需要一個報告問題的方式,於是當時我把 Ubuntu Tweak 放在了 Launchpad 進行管理,當時只接受 Bug報告,也沒有所謂的項目管理,基本上是我想到做什麼功能就馬上去做。當時收到的第一個Bug報告是:UT Logo takes too much place.
當時我不以為然,因為我喜歡自己的設計,一直沒采納這個用戶的意見,修正這個 bug 大概花了一年多。
然而,我還是認為堅持自己的意見很重要,因為自己慢慢認識及爭論的過程,比毫無保留地接受第三方的意見要好。
在0.2版本發布以後,我還是不滿意當前的構架,而且那次在 LUPA 的活動上,一個大學的教授向我推薦了 Python 這門編程語言。我當時是除了Basic、C 和 Java 沒接觸過其他語言,而且我好奇心比較強,既然有大學教授向我推薦了 Python 這個新東西,那我就去學學好了。
於是我又是一邊學習 Python,一邊把 Ubuntu Tweak 用 Python 重寫了。很快,在12月中旬,我就發布了完全用 Python 重寫後的新版本0.2.4,這個版本繼續增加了更多功能,比如 Compiz 3D桌面的設置,比如增加了德語、波蘭語。
無論是 Ubuntu Tweak 的圖形編程 GTK,還是後來用 Python,基本上我都是現學現用,我覺得這個還是很重要的。
學以致用,邊學邊用。
當時 Ubuntu Tweak 的多語言支持是通過 Gettext 來支持的,當時項目托管平台 Launchpad 有著對 Gettext 的在線翻譯的支持,而且後來還增加了一個叫“PPA”的機制,即:Personal Package Archive,可以通過該渠道發布軟件,用戶只需要加這個源,就可以獲得持續更新。相信用 Linux 的朋友都知道這是怎麼一回事。
於是,我為 Ubuntu Tweak 建立起了翻譯平台,還開啟了這個PPA。這使得參與 Ubuntu Tweak 的翻譯不需要通過手動提交Pot文件,任何人都能在網上自己翻譯了,另外PPA的增加,也使得軟件的分發變得非常方便,用戶不需要每次下載、安裝,只需要 每次更新就能用最新的東西了。
這些因素讓 Ubuntu Tweak 後來擁有了30幾國語言的支持、更快的流通奠定了基礎。
關注開發以外的事物,優化分發流程。
2008年1月,我已經發布到 Ubuntu Tweak 0.2.5版本了。當時我已經不做間接宣傳了,而只在自己的blog上做主動宣傳,當時效果很好,linux.com 報道了 Ubuntu Tweak。當時的美味書簽:del.icio.us 也上頭版了。這對當時來說是很大的鼓勵。
基本上我以每月兩個版本的速度開發著…半年的時候,我就發布了11個版本,而且只是0.1 ~ 0.2。不知道這個頻率是不是太快,但是對於一個正在學習階段的我來說,還是比較合適的。
然後我繼續緊著不斷開發,完善各個方面的功能。
Release Soon, Release Often
2008年4月,我發布了 Ubuntu Tweak 0.3,一個顯著的變化是,我調小了 Banner 的尺寸(邁出這一步是很不容易的…),增加了自動更新功能。與此同時,Ubuntu Tweak 第一次在國內的《程序員》雜志被報道了。
2008的7月,我又發布了 Ubuntu Tweak 0.3.4,這個版本增加了一個比較重要的東西,那就是第三方源的東西。這個功能把一些常用的PPA軟件收集起來,讓用戶可以隨時保持軟件的最新版本。這個功能在後來不斷完善,成為了用戶最受歡迎的一個功能。
我又馬不停蹄的開發出來了0.4.0版本,這個最顯著的改進是,因為我終於去掉了界面那個長條,界面變成了這個樣子,同時加入了軟件包清理的功能。 任何操作系統在長期地使用後,都會留下緩存和垃圾文件,因此 Ubuntu Tweak 增加這個功能可以幫助用戶方便地去清理垃圾文件。
這個時候,Ubuntu Tweak 已經有了一些知名度,我的野心也有點開始膨脹,因為我不斷地改善了 Ubuntu Tweak 的核心功能,使其可以根據環境動態加載模塊,理論上可以支持除 Ubuntu 以外的發行版本了,於是在2008年12月,推出它以後,反響不如期望之熱烈,於是我就沒有繼續唯一,而專注在當前的 Ubuntu 平台了。
現在想想,當時它的失敗是注定的,如果叫「Tweak for Fedora」,那還有點希望。作為一個用Fedora的用戶,誰願意用一個 Ubuntu 開頭的軟件呢?要我自己也是不願意的。
先專注做好一個平台
2009年,我已經開始工作了,基本上就只在業余時間繼續更新著這個項目。工作給我很多的收獲,讓我學習到了如何使用規范的流程去發布軟件。於是在 這一年,我最大的改變就是開始詳細地應用項目管理模式去管理我的每個發布,因為很多時候你無法在工作中去隨心所欲地應用一些無論是技術還是其他方面,但是 在自己的軟件中就可以盡管去嘗試。
從0.4.4版本開始,我開始不再像以前一樣想到什麼就開發什麼,而是計劃好要開發的內容,定制發布計劃,遵守特性計劃、實現和凍結等項目周期。在這2009年這一年,我以幾乎每月一個版本的頻率,發布了10個版本。好好地打磨了一遍。
在這背後,還有一年顯著的變化,那就是我在2008年末,正式用 Git 取代了 SVN,將其作為 Ubuntu Tweak 的源碼版本控制軟件,並將其轉移到了Github上去。對於主要是一個人寫代碼的項目來說,Git的多人協作的優勢並沒有完全體現出現,但是我已經開始通 過Github接受到一些patch。
另外,Git 的無痛 branch,讓我在這一年0.4版本和0.5版本的並行開發得到了可能。
實施軟件工程+應用 Git 技術,進 一步優化軟件開發流程。
然後到了2010年1月1日,我發布了 Ubuntu Tweak 0.5版本, 這個版本最大的特色是,結合我當時跟另外的朋友一塊做的網站,將一些數據給網絡化了,而不是像以前一樣是寫死在代碼裡的。
我用 Django 做了這個網站,當時這個網站的設計師是 Kevin Chou,而前端也就是實現的則是 Keke,而我就負責前後端的結合,我們這個團隊當時分布在全國各地,就通過Git和網絡把它做出來了。這是做 Ubuntu Tweak 以來首次真正通過團隊協作完成的一個附加作品。
我在這次合作中認識到了,很多產品雖然剛開始都是一個人做出來的,但是想要把它做的更好,團隊的力量是少不了的。特別是對於開源軟件來說,團隊並不是僅僅是參與開發這個項目的人,很多用戶,包括翻譯者,他們也是團隊的一員。
然後這一年,Ubuntu Tweak 收到了更多的榮譽,首先是在 OMG!Ubuntu! 上,它被評為了「最佳系統清理工具」,日本的 Linux 雜志,也相繼報道了它。這裡要很感謝將其告之我的朋友們。
到了這個時候,Ubuntu Tweak 整體上實際上已經比較成熟而且穩定,特別是代碼方面,已經有了比較靈活的可擴展機制。這個時候,我把重點轉向了用戶界面方面,因為隨著功能的增多,現在的界面已經不適合越來越多的功能了。
早在2009的11月,我就把我的想法與當時團隊的設計師 Kevin 分享了,而他也能非常領會我的意思,於是很快就做出了一版 Ubuntu Tweak 0.6的草圖。但是在後來的2010年,我把重心放在維護和更新0.5版本上,就沒有精力去實現這個0.6版本。
但是在2010年,我在繼續維護當前版本的同時,也一起與朋友設計未來的版本,並以此為意見。這是當時另外一個朋友 Jeonkwan Chan 設計的草圖,我們已經在討論一些非常細節的東西了。
這個經歷非常美好,我們雖然位於不同的地方,但是對於如何設計一個簡潔好用的用戶界面有著一樣的熱情。
一直到了去年,我才開始嘗試實現這個全新的用戶界面,並且在一邊實現一邊改善。2011年愚人節的時候,我還不知道我能不能完成這個版本,但是索性就發表了一篇「初探下一代Ubuntu Tweak」,提前公布一下,借此激勵自己去完成這個版本。
後來因為工作的變動和個人的一些事情,特別是我來到北京以後,軟件中斷開發了很久很久。我曾一度以為這個版本再也做不出來了。
後來經過自己的努力,在2011年就要結束的時候,我砍掉一些功能,終於將設計中的 Ubuntu Tweak 0.6 發布了出來。從設計稿出現到最終發布,整整花了兩年時間,具體地說是,兩年的業余時間。
這個版本雖然砍掉了一些如第三方源的功能,但還是很受歡迎的。對自己而言,這是一次從設計的角度把草稿變成現實的過程,而不是之前從程序的角度變成現實。大概從這以後,我慢慢地有著「以設計驅動開發」的思想。本質上,無論是軟件構架還是用戶界面,都是一個設計的過程。
嘗試設計驅動開發
然後2012年來了,在維護了 Ubuntu Tweak 0.6.0 兩個版本之後,我又積累了一些程序和設計方面的需求,於是我制定了0.7版本的開發計劃,並且在兩個月的集中式開發之後,它又被順利地實現出來了。
2012年4月25日,也就是兩個月前 Ubuntu 12.04 發布的前夜,我同期發布了 Ubuntu Tweak 0.7.0。它比0.6版本更接近於我們之前的設計稿,不僅將之前砍掉的功能全部帶回,而且實現了全局模糊搜索、用戶界面的進一步磨。這個版本,我才可以 說是,達到了我心目中該有的 Tweak 的樣子。
而這5年來,Ubuntu本身也有著巨變,Ubuntu 有了自己特色的鮮明的黑色系主題,有了自己的 Unity 桌面,甚至有了自己的軟件中心,裡面還有賣很多商業軟件和商業游戲,這在五年前是不可想像的。
於是我意識到,Ubuntu Tweak 也已經實際上達到我心目中的樣子了,而且它也不像以前那麼重要了。因為在開發 Ubuntu Tweak 這五年,Ubuntu 本身有了非常大的改進,以前總會折騰輸入法、折騰界面,但是現在 Ubuntu 默認安裝好,都已經非常好用了。
於是上個月,我宣布了不再為 Ubuntu Tweak 開發新功能,而只進行維護和更新等工作。從2007年7月中旬開始開發,到現在馬上就要滿5年了。這五年我還做了其他很多事情,但基本都是小小的事情,很 多也都半途而廢了,只有這件事情堅持了下來。也是這件事情帶給我最多的收獲。
接下去的5年,Ubuntu 會繼續越來越好,而 Ubuntu Tweak 會慢慢地淡出去。但是這五年我學到的東西,仍然繼續影響著我之後要做的事情。
花五年時間,認真、專注、持續不斷 地去做一款軟件,慢慢把它做好...
謝謝大家!