什么是開(kāi)源精神?
【編者按】2013年7月13日, 由阿里巴巴集團(tuán)主辦的ADC·阿里技術(shù)嘉年華將在杭州海外海國(guó)際會(huì)展中心隆重開(kāi)幕,小編也去現(xiàn)場(chǎng)目睹了這場(chǎng)技術(shù)的盛宴。在阿里技術(shù)嘉年華的「夜聊」環(huán)節(jié)中,@左耳朵耗子、@玉伯也叫射雕、@淘寶鬼腳七、@tinyfool、@池建強(qiáng) 這幾位老師分享了技術(shù)及技術(shù)以外的一些勁爆話(huà)題,臺(tái)下的掌聲不斷,非常精彩!本文是玉伯老師在夜聊環(huán)節(jié)中聊到開(kāi)源精神的一個(gè)梳理和總結(jié),一起來(lái)看看。
在技術(shù)嘉年華的「夜聊」中,談到開(kāi)源。當(dāng)時(shí)我的表達(dá)不夠清晰具體,重新梳理如下。
一、開(kāi)源精神里最重要的,是拿來(lái)主義。
這和大部分人的想法不一樣。開(kāi)源需要貢獻(xiàn)、需要付出,但在貢獻(xiàn)和付出之前,首要的是去了解、去使用已經(jīng)存在的。
比如前端工程師,會(huì)經(jīng)常使用模板,天天用著,會(huì)有不爽,就會(huì)想著自己去寫(xiě)一個(gè)模板引擎。直接去寫(xiě)一個(gè)沒(méi)什么不對(duì),但更好的方式是,先去開(kāi)源社區(qū)搜索下同類(lèi)產(chǎn)品。看自己的想法,是否已經(jīng)有人實(shí)現(xiàn)了,看自己的想法中,哪些是靠譜的,哪些是不太靠譜的。
注意不要去做「純調(diào)研」,除非你已經(jīng)是這方面的專(zhuān)家,有過(guò)體系化的研究和深入?!讣冋{(diào)研」是指,找到類(lèi)似的產(chǎn)品,淺嘗輒止地跑跑 demo,就開(kāi)始出表格,橫向比較優(yōu)劣。更笨但更有效地做法是,直接去用,比如我們選擇了 Handlebars ,在項(xiàng)目真正使用過(guò)程中,才能深觸地感受到 Handlebars 的優(yōu)點(diǎn)及其缺點(diǎn)。有過(guò)這么一段深入使用經(jīng)驗(yàn)后,類(lèi)似的前端模板引擎,比如 Mustache、Hogan 等,也有大概清楚個(gè)七七八八了。
拿來(lái)主義不光能省去開(kāi)發(fā)成本,還能讓你擴(kuò)充見(jiàn)識(shí)和想法,而不會(huì)成為井底之蛙還茫然自得。
二、在開(kāi)源世界里,參與比主導(dǎo)更重要。
遵循拿來(lái)主義,可以讓你更懂得他人。在這過(guò)程中,會(huì)有欣賞、感謝,也會(huì)有抱怨、想法。
前端 DOM 操作類(lèi)庫(kù)中,很多公司包括支付寶都選擇了 jQuery。使用過(guò)程中,jQuery 的一些 API 的設(shè)計(jì)非常贊,一些內(nèi)部實(shí)現(xiàn)也非常漂亮。遇到這些讓人欣賞的點(diǎn)時(shí),別忘了將自己的感想寫(xiě)下來(lái)。那怕是一篇微博,或是跟朋友閑聊時(shí)的只言片語(yǔ),所有這些,都是參與,都是正能量的傳播。社區(qū)的贊譽(yù),可以給 jQuery 開(kāi)發(fā)團(tuán)隊(duì)最大的鼓勵(lì)。很多堅(jiān)持,是因?yàn)橛锌隙ā?/p>
當(dāng)然,jQuery 只要存在一天,就一定存在不足。比如 data 的 API 變化,比如動(dòng)畫(huà)不支持純 CSS3 方式,還有 Sizzle 也并非那么完美。所有這些「缺點(diǎn)」,你遇到的 bug,你踩過(guò)的坑,當(dāng)你有好的想法或解決方案時(shí),不要忘記反饋給社區(qū)。jQuery 有詳細(xì)的反饋渠道,一般成熟的開(kāi)源社區(qū)都會(huì)有。比如托管在 GitHub 上的項(xiàng)目,一般都可以通過(guò) Issues 給社區(qū)提交你的想法,甚至可以通過(guò) Pull Request 直接提交你修改過(guò)的代碼。
參與進(jìn)去,可以讓你更懂得美,懂得感恩之心,懂得回饋之情。這在過(guò)程中,你的功力,往往也會(huì)大增。不光是技術(shù)上的進(jìn)步,還包括英語(yǔ)讀寫(xiě)能力。在人性溝通上,你也會(huì)收獲很多,這是無(wú)價(jià)的財(cái)富。
拿來(lái)主義是開(kāi)源的第一步,參與則是開(kāi)源中最漫長(zhǎng)的一步。開(kāi)發(fā)自己主導(dǎo)的項(xiàng)目不是必須的,除非你真的有很好的想法,同時(shí)剛好有旺盛的精力,否則不要輕易開(kāi)始,那不代表什么,往往什么也不是。比如 Sea.js,如果 RequireJS 當(dāng)初能接受我的建議,或者 FlyScript 的作者不退隱江湖,那么就不會(huì)有 Sea.js。讓一些事情自然地發(fā)生,讓豆瓣從土壤中發(fā)芽。更多地去享受參與,保持簡(jiǎn)單與自然。
三、開(kāi)源的是社區(qū),代碼僅是很小的一部分。
雖然代碼很重要,但在開(kāi)源項(xiàng)目里,源碼只是重要的因素之一。
除了代碼,還有文檔、測(cè)試用例、Issues 管理、版本發(fā)布、升級(jí)策略、書(shū)籍、視頻等等。jQuery、Backbone、AngularJS 等成熟項(xiàng)目,成熟的是社區(qū),而不是源碼。好的社區(qū),是在 Google 中一搜索,就能找到不少資料。好的社區(qū),是你踩過(guò)的坑,經(jīng)常已經(jīng)有人也踩過(guò)并整理分享出來(lái)了。
社區(qū)的形成很難,需要核心團(tuán)隊(duì)澎湃持久的激情,還需要天時(shí)、地利、人和。jQuery 已經(jīng)形成龐大的社區(qū),但其兄弟 YUI3 的社區(qū),一直不是很成氣候。兩三年前,我想找 YUI3 的總體設(shè)計(jì)文檔,以及部分組件的設(shè)計(jì)文檔,搜索了很多很多地方,最后給原作者發(fā)信,依舊都未能找到我想要的資料。但 jQuery,基本每個(gè)細(xì)節(jié),都能比較輕松地就找到相關(guān)資料和討論。
沒(méi)有社區(qū)的開(kāi)源項(xiàng)目,其源碼會(huì)一直停留在「孤芳自賞」階段。幾年前的 KISSY,還有百度的 Tangram,個(gè)人覺(jué)得都停留在初始階段,發(fā)展很難。有社區(qū)的開(kāi)源項(xiàng)目,其源碼會(huì)活起來(lái),會(huì)自我不斷進(jìn)化升華。我參與過(guò)的一個(gè)典型項(xiàng)目是 Backbone,倘若你現(xiàn)在再回過(guò)頭去看 Backbone 最初提交的代碼,與現(xiàn)在的相比,真心會(huì)覺(jué)得有點(diǎn)挫了。最讓人不可思議的是,Backbone 最初很挫的代碼,在社區(qū)的參與下,在不斷的討論和 Pull Request 中,現(xiàn)在已經(jīng)演化成非常高質(zhì)量的代碼,甚至每一小段代碼里,都能說(shuō)出一個(gè)故事來(lái)。我現(xiàn)在依舊非常關(guān)注 Backbone 的每一次代碼變化,特別是自己修改過(guò)的部分。從其他人的修改中,能收獲很多很多。
Backbone 的例子,也展示了一個(gè)更好的開(kāi)源方式:有了好的想法,就分享出來(lái),最初的代碼展現(xiàn)基本的思路就好,然后通過(guò)社區(qū)的參與,不斷往前演化,讓大家都成為開(kāi)發(fā)者,群體的力量遠(yuǎn)大于個(gè)體。個(gè)人英雄式的開(kāi)源方式,已經(jīng)過(guò)時(shí)了,就像 sourceforge.net 一樣。
最后,知易行難。上面的道理或許大家都懂,真要做到,則是一場(chǎng)修行。Sea.js 和 Arale 也才剛剛上路,旅途中,有西湖愜意的微風(fēng),也有沙漠般的烈日當(dāng)頭。好在,選擇了,就不怕遠(yuǎn)。
原文出處:https://github.com/lifesinger/lifesinger.github.com/issues/167