向開(kāi)源社區(qū)提問(wèn)的技巧
使用軟件產(chǎn)品,或多或少都會(huì)遇到問(wèn)題。對(duì)于商業(yè)產(chǎn)品,我們可以咨詢客服尋求幫助。對(duì)于公司自己研發(fā)的產(chǎn)品,我們可以直接請(qǐng)教專家同事。但對(duì)于開(kāi)源軟件,在遇到問(wèn)題時(shí),如何才能及時(shí)有效地尋求幫助呢?
本文以開(kāi)源類庫(kù) SeaJS 為例,說(shuō)說(shuō)我心目中的***實(shí)踐。
提問(wèn)前
遇到問(wèn)題時(shí),心里都很著急。在決定向開(kāi)源社區(qū)提交問(wèn)題前,***先做做以下功課:
嘗試從官方文檔中找到答案
確保自己閱讀過(guò)至少一次官方文檔。這樣在遇到問(wèn)題時(shí),如果能回憶起只言片語(yǔ),就可以再去讀一遍相關(guān)文檔,問(wèn)題往往也就解決了。
Google 是你的朋友
對(duì)于成熟的開(kāi)源項(xiàng)目,你遇到的問(wèn)題,很可能別人也遇到過(guò)。這時(shí)通過(guò) Google、StackOverflow 等網(wǎng)站的搜索服務(wù),可以幫你快速定位并解決問(wèn)題。永遠(yuǎn)記住,地球上的你并不孤單,包括你遇到的問(wèn)題。
挖掘 Bug 寶藏
開(kāi)源軟件一般都會(huì)有自己的 Bug 管理方案,比如 WebKit、V8、jQuery、SeaJS 等等。從它們的官網(wǎng)上找到 Bug 管理地址,然后通過(guò)搜索看看有無(wú)你遇到的問(wèn)題。對(duì)于活躍社區(qū)來(lái)說(shuō),這一招經(jīng)常很管用。比如 jQuery 的 Bug Tracker,通過(guò)右上角的 Search Tickets 可以找到非常多有用的信息。一個(gè)運(yùn)作良好的 Bug 庫(kù),經(jīng)常是一座巨大的寶藏。SeaJS 是直接通過(guò) GitHub Issues 來(lái)管理,你可以在 Issues 中找到很多信息。
求助身邊的朋友
如果你使用的開(kāi)源軟件,在朋友圈或同事圈里也有人使用,那么抬起你的腳、或拿起你的電話,真摯誠(chéng)懇的探討不會(huì)遭遇拒絕,而會(huì)增進(jìn)友誼。不要猶豫,你的內(nèi)心渴望面對(duì)面交流,你的朋友也是。
如果以上 4 步都無(wú)法解決你遇到的問(wèn)題,也別猶豫,立馬向開(kāi)源社區(qū)提交問(wèn)題就好。
提問(wèn)時(shí)
提問(wèn)有很多種,比如你認(rèn)識(shí)作者,直接面對(duì)面請(qǐng)教就行。下面探討的是如何通過(guò)互聯(lián)網(wǎng)的方式來(lái)問(wèn)問(wèn)題。
平和對(duì)等的心態(tài)
很多開(kāi)源軟件都是免費(fèi)的,作者往往是業(yè)余時(shí)間出于興趣在維護(hù),沒(méi)有義務(wù)回答社區(qū)問(wèn)題。提問(wèn)時(shí),不要把自己擺在顧客的位置,比如
-
項(xiàng)目馬上要上線了,請(qǐng)務(wù)必幫忙解決
- 這是我的郵箱,請(qǐng)及時(shí)聯(lián)系我
另外,也不要把自己擺在乞食者的位置,比如
-
冰天雪地跪求解答
- 救命啊,我的網(wǎng)站掛了
在開(kāi)源社區(qū),一切皆是朋友。無(wú)論對(duì)方是 Linux 內(nèi)核的作者,還是某個(gè) jQuery 插件的作者,你和作者都是對(duì)等的。你的提問(wèn)是在幫助開(kāi)源軟件完善。平和對(duì)等的心態(tài),可以讓你的問(wèn)題贏得更多人的閱讀和思考。
通過(guò)正確的途徑提交
如果遇到問(wèn)題的開(kāi)源軟件有專門的 Bug 管理系統(tǒng),請(qǐng)***到這些指定系統(tǒng)中提交。比如,對(duì)于前端開(kāi)發(fā)工程師來(lái)說(shuō),下面這些 Tracker 系統(tǒng)很重要。
- jQuery Tickets
- WebKit Bugzilla
- Mozilla Bugzilla
還有各個(gè)開(kāi)源類庫(kù)的 Issues 庫(kù),比如 SeaJS 的是:seajs/issues
最不好的途徑是
-
QQ 、阿里旺旺、微信等群組。這些群組主要是用來(lái)工作或休閑的。對(duì)開(kāi)源項(xiàng)目來(lái)說(shuō),在這些地方提問(wèn),作者一般不會(huì)關(guān)注,效率非常低。
-
微博、Facebook 等社交網(wǎng)絡(luò)。不少人在微博上通過(guò) at 或私信詢問(wèn) SeaJS 問(wèn)題,這些我經(jīng)常看不到。看到了,也不情愿回復(fù)。微博是扯淡、交流情感的地方,一般是寫(xiě)代碼寫(xiě)累了,才去逛逛,很少會(huì)有在社交網(wǎng)絡(luò)上回答技術(shù)問(wèn)題的心情。
通過(guò)正確的途徑提交問(wèn)題,一般可以讓你的問(wèn)題得到及時(shí)準(zhǔn)確的回復(fù)。
使用明確、有意義的標(biāo)題
抱著平和對(duì)等的心態(tài),找到合適的途徑后,就得靜下心來(lái)將遇到的問(wèn)題寫(xiě)成文字。書(shū)寫(xiě)文字不是一件簡(jiǎn)單的事情,我們可以從遵循一些簡(jiǎn)單的規(guī)則開(kāi)始。
首先是標(biāo)題要簡(jiǎn)潔清晰,要言之有物。比如:
- 我遇到了一個(gè) Ajax 問(wèn)題
- SeaJS 在我的瀏覽器上運(yùn)行不了
上面的標(biāo)題很糟糕,光看標(biāo)題作者無(wú)法知道發(fā)生了什么事。當(dāng)開(kāi)源社區(qū)的問(wèn)題很多時(shí),上面這類標(biāo)題,經(jīng)常會(huì)讓作者直接忽視或?qū)?yōu)先級(jí)降到很低。更妥當(dāng)?shù)臉?biāo)題是
- Ajax 請(qǐng)求未返回正確的 responseXML
- SeaJS 2.0 在 IE6 上運(yùn)行時(shí)拋錯(cuò)
明確、有意義的標(biāo)題,可以幫助作者確定問(wèn)題具體是什么類型、預(yù)估需要多少時(shí)間解決、是否現(xiàn)在馬上解決等。一個(gè)好的標(biāo)題,也有利于社區(qū)知識(shí)的沉淀和后期搜索。標(biāo)題有如一個(gè)人的顏面衣著,雖然不是關(guān)鍵,但在嘈雜的信息社區(qū)中,這很重要。
遵循良好的模板
如果社區(qū)提供了問(wèn)題模板,一定要仔細(xì)看下。比如 Google Code 社區(qū),當(dāng)你創(chuàng)建一個(gè)問(wèn)題時(shí),會(huì)自動(dòng)提供以下模板:
What steps will reproduce the problem?
該問(wèn)題的重現(xiàn)步驟是什么?
1.
2.
3.
What is the expected output? What do you see instead?
你期待的結(jié)果是什么?實(shí)際看到的又是什么?
What version of the product are you using? On what operating system?
你正在使用產(chǎn)品的哪個(gè)版本?在什么操作系統(tǒng)上?
Please provide any additional information below.
如果有的話,請(qǐng)?jiān)谙旅嫣峁└嘈畔ⅰ?/p>
遵循這個(gè)模板去描述問(wèn)題,經(jīng)常能省很多事。作者一般也非常歡迎通過(guò)模板提交的問(wèn)題。如果社區(qū)沒(méi)有提供模板,也可以自己遵循以上模板來(lái)提交。
下面針對(duì)問(wèn)題內(nèi)容,具體說(shuō)說(shuō)一些需要注意的點(diǎn)。
語(yǔ)法正確、格式清晰
雖然我們不是作家,但正確的語(yǔ)法、清晰的格式,可以讓讀者賞心悅目,也就更有心情幫你一起思考解決問(wèn)題。
對(duì)于很多需要代碼來(lái)描述的問(wèn)題,要尤其注意格式,比如
seajs.use('jquery',function($){$(document).ready(function() { /* ... */ })});
可讀性不如
seajs.use('jquery', function($) { $(document).ready(function() { // ... }); });
GitHub 的 Markdown 語(yǔ)法可以很好地支持代碼排版、語(yǔ)法高亮等,建議書(shū)寫(xiě)代碼時(shí),一定要先閱讀下說(shuō)明:GitHub Flavored Markdown。這能讓你的內(nèi)容看起來(lái)很專業(yè),社區(qū)也就更有意愿會(huì)去幫助你,否則糟糕的排版,經(jīng)常帶來(lái)的是發(fā)帖之后的石沉大海。
描述事實(shí)、而不是猜測(cè)
事實(shí)是指,依次進(jìn)行了哪些操作、產(chǎn)生了怎樣的結(jié)果。比如
我在 Windows XP 下用 IE6 打開(kāi) seajs.org 后,點(diǎn)擊“5 分鐘上手 SeaJS”,這時(shí)瀏覽器彈出腳本錯(cuò)誤提示,例子顯示不正確。
上面是一段比較好的事實(shí)描述(更好的是把錯(cuò)誤提示也截圖上來(lái)),而不要像下面這樣猜測(cè):
SeaJS 在 IE6 下運(yùn)行不正常,我懷疑是源碼第 213 行有問(wèn)題。
上面的描述,會(huì)讓作者一頭霧水、甚至很惱火。盡量避免猜測(cè)性描述,除非你能先描述事實(shí),在事實(shí)描述清楚之后,再給出合理的猜測(cè)是歡迎的。
對(duì)于前端項(xiàng)目來(lái)說(shuō),如果能提供可重現(xiàn)錯(cuò)誤的在線可訪問(wèn)代碼,那是***不過(guò)的。一旦你這么用心去做了,作者往往也會(huì)很用心地立馬幫你解決。
描述目標(biāo)、而不是過(guò)程
經(jīng)常會(huì)有這種情況,提問(wèn)者在腦袋里有個(gè)更高層次的目標(biāo),他們?cè)谧砸詾槟苓_(dá)到目標(biāo)的特定道路上卡住了,然后跑來(lái)問(wèn)該怎么走。比如
SeaJS 的 parseMap 方法在遇到 map 的多個(gè)配置項(xiàng)同時(shí)匹配同一個(gè)路徑時(shí),應(yīng)該允許用戶指定是全部生效還是僅***個(gè)匹配的配置項(xiàng)生效。
上面這個(gè)問(wèn)題的背后,提問(wèn)者實(shí)際上想解決的是如何通過(guò) SeaJS 來(lái)做版本管理。提問(wèn)者選擇了通過(guò) map 的方式來(lái)實(shí)現(xiàn),但這過(guò)程中遇到了問(wèn)題,因此跑過(guò)來(lái)繼續(xù)怎么走。然而,如果只是描述過(guò)程,往往會(huì)把作者也繞進(jìn)去。
實(shí)際情況卻是,提問(wèn)者選擇的路本身就是一條崎嶇之路,對(duì)于要解決的問(wèn)題,實(shí)際上有更好的方式。這種情況下,描述清楚目標(biāo),講清楚要干什么非常重要。
在描述自己是怎么做之前,一定要先描述要做什么。提問(wèn)題時(shí),What 往往比 How 更重要。
要有具體場(chǎng)景
無(wú)論在開(kāi)源社區(qū),還是微博、知乎等平臺(tái)上,有一種非常常見(jiàn)的問(wèn)題:
- 如何維護(hù) JavaScript 代碼?
- 如何使用 SeaJS 進(jìn)行模塊化開(kāi)發(fā)?
這類問(wèn)題還有很多,每每遇到,只能笑笑,然后悄悄地忽略掉。因此這類問(wèn)題很難回答,就如下面這些問(wèn)題一樣:
- 如何才能讓生命有意義?
- 如何打敗淘寶?
這類提問(wèn)者,一般比較浮躁,經(jīng)常對(duì)問(wèn)題本身也沒(méi)有經(jīng)過(guò)思考。踏實(shí)的提問(wèn)者,不會(huì)讓問(wèn)題浮在空中無(wú)法回答,而會(huì)在具體場(chǎng)景中讓問(wèn)題落地:
我的項(xiàng)目有 20 多個(gè) JS 文件,接下來(lái)還會(huì)急劇增加。目前遇到以下問(wèn)題……(省略五百字)…… 請(qǐng)問(wèn)如何維護(hù)?
仔細(xì)檢查、確保準(zhǔn)確
是人都會(huì)犯錯(cuò)誤,特別是在如此快節(jié)奏的互聯(lián)網(wǎng)環(huán)境下。好不容易把問(wèn)題描述清楚時(shí),不要急著立刻提交。在提交前,至少保證從頭到尾再仔細(xì)閱讀一遍,比如語(yǔ)法錯(cuò)誤、錯(cuò)別字、標(biāo)點(diǎn)符號(hào)、排版等等。做到這些,不光是尊重別人,也是尊重自己。
提問(wèn)后
提交問(wèn)題后,建議通過(guò)郵件等方式訂閱回復(fù)。互聯(lián)網(wǎng)上最有效的溝通方式是異步溝通,不要期待作者馬上回復(fù),也不要心煩意亂著急地等待。出去看看天,數(shù)數(shù)云朵,你會(huì)逐步明白什么是風(fēng)輕云淡。
盡可能補(bǔ)充信息
在接收到回復(fù)時(shí),仔細(xì)閱讀。最經(jīng)常的情況是,社區(qū)回復(fù)的,經(jīng)常不是你想要的。比如
根據(jù)你的描述,問(wèn)題無(wú)法重現(xiàn)。能否提供具體使用環(huán)境和重現(xiàn)步驟?
這時(shí)要淡定。仔細(xì)看看自己提交的問(wèn)題描述是否足夠清晰,如果有可補(bǔ)充的信息,盡量補(bǔ)充,以幫助作者能盡快定位問(wèn)題。比如
很抱歉,我前面有一步描述不正確,實(shí)際情況是我是在 IETester 中運(yùn)行的……
謙和淡定的交流,不光能幫助你解決問(wèn)題,還有助于你結(jié)交更多朋友。
適當(dāng)?shù)目偨Y(jié)
當(dāng)問(wèn)題終于解決時(shí),建議對(duì)問(wèn)題進(jìn)行總結(jié)。可以編輯原帖,也可以通過(guò)博客等方式總結(jié)。你的總結(jié),會(huì)讓遇到同樣問(wèn)題的朋友們受益,并且對(duì)自己的技能也是一種提高。前端業(yè)界,無(wú)論國(guó)內(nèi)還是國(guó)外,有很多牛人之所以成為牛人,很大程度上都是因?yàn)橛锌偨Y(jié)思考的好習(xí)慣。
不要忘記感謝
***,記得感謝。很多開(kāi)源軟件的作者,都是利用業(yè)余時(shí)間在創(chuàng)作代碼。你的感謝,匯集許許多多大家的感謝,會(huì)讓開(kāi)源社區(qū)充滿愛(ài)與力量。