1. 程式人生 > >提問的智慧(How-To-Ask-Questions-The-Smart-Way)

提問的智慧(How-To-Ask-Questions-The-Smart-Way)

簡介

黑客的世界裡,當你丟擲一個技術問題時,最終是否能得到有用的回答,往往取決於你所提問和追問的方式。本指南將教你如何正確的提問以獲得你滿意的答案。

不只是黑客,現在開源(Open Source)軟體已經相當盛行,你常常也可以由其他有經驗的使用者身上得到好答案,這是件好事;使用者比起黑客來,往往對那些新手常遇到的問題更寬容一些。然而,將有經驗的使用者視為黑客,並採用本指南所提的方法與他們溝通,同樣也是能從他們身上得到滿意回答的最有效方式。

首先你應該明白,黑客們喜愛有挑戰性的問題,或者能激發他們思維的好問題。如果我們並非如此,那我們也不會成為你想詢問的物件。如果你給了我們一個值得反覆咀嚼玩味的好問題,我們自會對你感激不盡。好問題是激勵,是厚禮。好問題可以提高我們的理解力,而且通常會暴露我們以前從沒意識到或者思考過的問題。對黑客而言,"好問題!"是誠摯的大力稱讚。

儘管如此,黑客們有著蔑視或傲慢面對簡單問題的壞名聲,這有時讓我們看起來對新手、無知者似乎較有敵意,但其實不是那樣的。

我們不諱言我們對那些不願思考、或者在發問前不做他們該做的事的人的蔑視。那些人是時間殺手 —— 他們只想索取,從不付出,消耗我們可用在更有趣的問題或更值得回答的人身上的時間。我們稱這樣的人為 失敗者(擼瑟) (由於歷史原因,我們有時把它拼作 lusers)。

我們意識到許多人只是想使用我們寫的軟體,他們對學習技術細節沒有興趣。對大多數人而言,電腦只是種工具,是種達到目的的手段而已。他們有自己的生活並且有更要緊的事要做。我們瞭解這點,也從不指望每個人都對這些讓我們著迷的技術問題感興趣。儘管如此,我們回答問題的風格是指向那些真正對此有興趣並願意主動參與解決問題的人,這一點不會變,也不該變。如果連這都變了,我們就是在降低做自己最擅長的事情上的效率。

我們(在很大程度上)是自願的,從繁忙的生活中抽出時間來解答疑惑,而且時常被提問淹沒。所以我們無情的濾掉一些話題,特別是拋棄那些看起來像失敗者的傢伙,以便更高效的利用時間來回答贏家(winner)的問題。

如果你厭惡我們的態度,高高在上,或過於傲慢,不妨也設身處地想想。我們並沒有要求你向我們屈服 —— 事實上,我們大多數人非常樂意與你平等地交流,只要你付出小小努力來滿足基本要求,我們就會歡迎你加入我們的文化。但讓我們幫助那些不願意幫助自己的人是沒有效率的。無知沒有關係,但裝白痴就是不行。

所以,你不必在技術上很在行才能吸引我們的注意,但你必須表現出能引導你變得在行的特質 -- 機敏、有想法、善於觀察、樂於主動參與解決問題。如果你做不到這些使你與眾不同的事情,我們建議你花點錢找家商業公司籤個技術支援服務合同,而不是要求黑客個人無償地幫助你。

如果你決定向我們求助,當然你也不希望被視為失敗者,更不願成為失敗者中的一員。能立刻得到快速並有效答案的最好方法,就是像贏家那樣提問 -- 聰明、自信、有解決問題的思路,只是偶爾在特定的問題上需要獲得一點幫助。

在提問之前

在你準備要通過電子郵件、新聞群組或者聊天室提出技術問題前,請先做到以下事情:

  1. 嘗試在你準備提問的論壇的舊文章中搜索答案。
  2. 嘗試上網搜尋以找到答案。
  3. 嘗試閱讀手冊以找到答案。
  4. 嘗試閱讀常見問題檔案(FAQ)以找到答案。
  5. 嘗試自己檢查或試驗以找到答案。
  6. 向你身邊的強者朋友打聽以找到答案。
  7. 如果你是程式開發者,請嘗試閱讀原始碼以找到答案。

當你提出問題的時候,請先表明你已經做了上述的努力;這將有助於樹立你並不是一個不勞而獲且浪費別人的時間的提問者。如果你能一併表達在做了上述努力的過程中所學到的東西會更好,因為我們更樂於回答那些表現出能從答案中學習的人的問題。

運用某些策略,比如先用 Google 搜尋你所遇到的各種錯誤資訊(既搜尋 Google 論壇,也搜尋網頁),這樣很可能直接就找到了能解決問題的檔案或郵件列表線索。即使沒有結果,在郵件列表或新聞組尋求幫助時加上一句 我在 Google 中搜過下列句子但沒有找到什麼有用的東西 也是件好事,即使它只是表明了搜尋引擎不能提供哪些幫助。這麼做(加上搜索過的字串)也讓遇到相似問題的其他人能被搜尋引擎引導到你的提問來。

彆著急,不要指望幾秒鐘的 Google 搜尋就能解決一個複雜的問題。在向專家求助之前,再閱讀一下常見問題檔案(FAQ)、放輕鬆、坐舒服一些,再花點時間思考一下這個問題。相信我們,他們能從你的提問看出你做了多少閱讀與思考,如果你是有備而來,將更有可能得到解答。不要將所有問題一股腦丟擲,只因你的第一次搜尋沒有找到答案(或者找到太多答案)。

準備好你的問題,再將問題仔細的思考過一遍,因為草率的發問只能得到草率的回答,或者根本得不到任何答案。越是能表現出在尋求幫助前你為解決問題所付出的努力,你越有可能得到實質性的幫助。

小心別問錯了問題。如果你的問題基於錯誤的假設,某個普通黑客(J. Random Hacker)多半會一邊在心裡想著蠢問題…, 一邊用無意義的字面解釋來答覆你,希望著你會從問題的回答(而非你想得到的答案)中汲取教訓。

絕不要自以為夠格得到答案,你沒有;你並沒有。畢竟你沒有為這種服務支付任何報酬。你將會是自己去掙到一個答案,靠提出有內涵的、有趣的、有思維激勵作用的問題 —— 一個有潛力能貢獻社群經驗的問題,而不僅僅是被動的從他人處索取知識。

另一方面,表明你願意在找答案的過程中做點什麼是一個非常好的開端。誰能給點提示?我的這個例子裡缺了什麼?以及我應該檢查什麼地方請把我需要的確切的過程貼出來更容易得到答覆。因為你表現出只要有人能指個正確方向,你就有完成它的能力和決心。

Stack Overflow

搜尋,然後 在 Stack Exchange 問。

近年來,Stack Exchange community 社群已經成為回答技術及其他問題的主要渠道,尤其是那些開放原始碼的專案。

因為 Google 索引是即時的,在看 Stack Exchange 之前先在 Google 搜尋。有很高的機率某人已經問了一個類似的問題,而且 Stack Exchange 網站們往往會是搜尋結果中最前面幾個。如果你在 Google 上沒有找到任何答案,你再到特定相關主題的網站去找。用標籤(Tag)搜尋能讓你更縮小你的搜尋結果。

Stack Exchange 已經成長到超過一百個網站,以下是最常用的幾個站:

  • Super User 是問一些通用的電腦問題,如果你的問題跟程式碼或是寫程式無關,只是一些網路連線之類的,請到這裡。
  • Stack Overflow 是問寫程式有關的問題。
  • Server Fault 是問伺服器和網管相關的問題。

使用有意義且描述明確的標題

在郵件列表、新聞群組或論壇中,大約 50 字以內的標題是抓住資深專家注意力的好機會。別用喋喋不休的幫幫忙跪求(更別說救命啊!!!!這樣讓人反感的話,用這種標題會被條件反射式地忽略)來浪費這個機會。不要妄想用你的痛苦程度來打動我們,而應該是在這點空間中使用極簡單扼要的描述方式來提出問題。

一個好標題範例是目標 —— 差異式的描述,許多技術支援組織就是這樣做的。在目標部分指出是哪一個或哪一組東西有問題,在差異部分則描述與期望的行為不一致的地方。

蠢問題:救命啊!我的膝上型電腦不能正常顯示了!

聰明問題:X.org 6.8.1 的滑鼠游標會變形,某牌顯示卡 MV1005 晶片組。

更聰明問題:X.org 6.8.1 的滑鼠游標,在某牌顯示卡 MV1005 晶片組環境下 - 會變形。

編寫目標 —— 差異 式描述的過程有助於你組織對問題的細緻思考。是什麼被影響了? 僅僅是滑鼠游標或者還有其它圖形?只在 X.org 的 X 版中出現?或只是出現在 6.8.1 版中? 是針對某牌顯示卡晶片組?或者只是其中的 MV1005 型號? 一個黑客只需瞄一眼就能夠立即明白你的環境你遇到的問題。

總而言之,請想像一下你正在一個只顯示標題的存檔討論串(Thread)索引中查尋。讓你的標題更好地反映問題,可使下一個搜尋類似問題的人能夠關注這個討論串,而不用再次提問相同的問題。

如果你想在回覆中提出問題,記得要修改內容標題,以表明你是在問一個問題, 一個看起來像 Re: 測試 或者 Re: 新 bug 的標題很難引起足夠重視。另外,在不影響連貫性之下,適當引用並刪減前文的內容,能給新來的讀者留下線索。

對於討論串,不要直接點選回覆來開始一個全新的討論串,這將限制你的觀眾。因為有些郵件閱讀程式,比如 mutt ,允許使用者按討論串排序並通過摺疊討論串來隱藏訊息,這樣做的人永遠看不到你發的訊息。

僅僅改變標題還不夠。mutt 和其它一些郵件閱讀程式還會檢查郵件標題以外的其它資訊,以便為其指定討論串。所以寧可發一個全新的郵件。

在網頁論壇上,好的提問方式稍有不同,因為討論串與特定的資訊緊密結合,並且通常在討論串外就看不到裡面的內容,故通過回覆提問,而非改變標題是可接受的。不是所有論壇都允許在回覆中出現分離的標題,而且這樣做了基本上沒有人會去看。不過,通過回覆提問,這本身就是曖昧的做法,因為它們只會被正在檢視該標題的人讀到。所以,除非你只想在該討論串當前活躍的人群中提問,不然還是另起爐灶比較好。

話不在多而在精

你需要提供精確有內容的資訊。這並不是要求你簡單的把成堆的出錯程式碼或者資料完全轉錄到你的提問中。如果你有龐大而複雜的測試樣例能重現程式掛掉的情境,儘量將它剪裁得越小越好。

這樣做的用處至少有三點。 第一,表現出你為簡化問題付出了努力,這可以使你得到回答的機會增加; 第二,簡化問題使你更有可能得到有用的答案; 第三,在精煉你的 bug 報告的過程中,你很可能就自己找到了解決方法或權宜之計。

描述問題症狀而非你的猜測

告訴黑客們你認為問題是怎樣造成的並沒什麼幫助。(如果你的推斷如此有效,還用向別人求助嗎?),因此要確信你原原本本告訴了他們問題的症狀,而不是你的解釋和理論;讓黑客們來推測和診斷。如果你認為陳述自己的猜測很重要,清楚地說明這只是你的猜測,並描述為什麼它們不起作用。

蠢問題

我在編譯核心時接連遇到 SIG11 錯誤, 我懷疑某條飛線搭在主機板的走線上了,這種情況應該怎樣檢查最好?

聰明問題

我的組裝電腦是 FIC-PA2007 主機板搭載 AMD K6/233 CPU(威盛 Apollo VP2 晶片組), 256MB Corsair PC133 SDRAM 記憶體,在編譯核心時,從開機 20 分鐘以後就頻頻產生 SIG11 錯誤, 但是在頭 20 分鐘內從沒發生過相同的問題。重新啟動也沒有用,但是關機一晚上就又能工作 20 分鐘。 所有記憶體都換過了,沒有效果。相關部分的標準編譯記錄如下…。

由於以上這點似乎讓許多人覺得難以配合,這裡有句話可以提醒你:所有的診斷專家都來自密蘇里州。 美國國務院的官方座右銘則是:讓我看看(出自國會議員 Willard D. Vandiver 在 1899 年時的講話:我來自一個出產玉米,棉花,牛蒡和民主黨人的國家,滔滔雄辯既不能說服我,也不會讓我滿意。我來自密蘇里州,你必須讓我看看。) 針對診斷者而言,這並不是一種懷疑,而只是一種真實而有用的需求,以便讓他們看到的是與你看到的原始證據儘可能一致的東西,而不是你的猜測與歸納的結論。所以,大方的展示給我們看吧!

描述目標而不是過程

如果你想弄清楚如何做某事(而不是報告一個 Bug),在開頭就描述你的目標,然後才陳述重現你所卡住的特定步驟。

經常尋求技術幫助的人在心中有個更高層次的目標,而他們在自以為能達到目標的特定道路上被卡住了,然後跑來問該怎麼走,但沒有意識到這條路本身就有問題。結果要費很大的勁才能搞定。

蠢問題

我怎樣才能從某繪圖程式的顏色選擇器中取得十六進位制的的 RGB 值?

聰明問題

我正試著用替換一幅圖片的色碼(color table)成自己選定的色碼,我現在知道的唯一方法是編輯每個色碼區塊(table slot), 但卻無法從某繪圖程式的顏色選擇器取得十六進位制的的 RGB 值。

第二種提問法比較聰明,你可能得到像是建議採用另一個更合適的工具的回覆。

清楚明確的表達你的問題以及需求

漫無邊際的提問是近乎無休無止的時間黑洞。最有可能給你有用答案的人通常也正是最忙的人(他們忙是因為要親自完成大部分工作)。這樣的人對無節制的時間黑洞相當厭惡,所以他們也傾向於厭惡那些漫無邊際的提問。

如果你明確表述需要回答者做什麼(如提供指點、傳送一段程式碼、檢查你的補丁、或是其他等等),就最有可能得到有用的答案。因為這會定出一個時間和精力的上限,便於回答者能集中精力來幫你。這麼做很棒。

要理解專家們所處的世界,請把專業技能想像為充裕的資源,而回復的時間則是稀缺的資源。你要求他們奉獻的時間越少,你越有可能從真正專業而且很忙的專家那裡得到解答。

所以,界定一下你的問題,使專家花在辨識你的問題和回答所需要付出的時間減到最少,這技巧對你有用答案相當有幫助 —— 但這技巧通常和簡化問題有所區別。因此,問我想更好的理解 X,可否指點一下哪有好一點說明?通常比問你能解釋一下 X 嗎?更好。如果你的程式碼不能運作,通常請別人看看哪裡有問題,比要求別人替你改正要明智得多。

詢問有關程式碼的問題時

別要求他人幫你除錯有問題的程式碼,不提示一下應該從何入手。張貼幾百行的程式碼,然後說一聲:它不能工作會讓你完全被忽略。只貼幾十行程式碼,然後說一句:在第七行以後,我期待它顯示 <x>,但實際出現的是 <y>比較有可能讓你得到迴應。

最有效描述程式問題的方法是提供最精簡的 Bug 展示測試用例(bug-demonstrating test case)。什麼是最精簡的測試用例?那是問題的縮影;一小個程式片段能剛好展示出程式的異常行為,而不包含其他令人分散注意力的內容。怎麼製作最精簡的測試用例?如果你知道哪一行或哪一段程式碼會造成異常的行為,複製下來並加入足夠重現這個狀況的程式碼(例如,足以讓這段程式碼能被編譯/直譯/被應用程式處理)。如果你無法將問題縮減到一個特定區塊,就複製一份程式碼並移除不影響產生問題行為的部分。總之,測試用例越小越好(檢視話不在多而在精一節)。

一般而言,要得到一段相當精簡的測試用例並不太容易,但永遠先嚐試這樣做的是種好習慣。這種方式可以幫助你瞭解如何自行解決這個問題 —— 而且即使你的嘗試不成功,黑客們也會看到你在嘗試取得答案的過程中付出了努力,這可以讓他們更願意與你合作。

如果你只是想讓別人幫忙審查(Review)一下程式碼,在信的開頭就要說出來,並且一定要提到你認為哪一部分特別需要關注以及為什麼。

不該問的問題

以下是幾個經典蠢問題,以及黑客沒回答時心中所想的:

問題:我能在哪找到 X 程式或 X 資源?

回答:就在我找到它的地方啊,白痴 —— 搜尋引擎的那一頭。天哪!難道還有人不會用 Google 嗎?

問題:我怎樣用 X 做 Y?

回答:如果你想解決的是 Y ,提問時別給出可能並不恰當的方法。這種問題說明提問者不但對 X 完全無知,也對 Y 要解決的問題糊塗,還被特定形勢禁錮了思維。最好忽略這種人,等他們把問題搞清楚了再說。

問題:如何設定我的 shell 提示??

回答:如果你有足夠的智慧提這個問題,你也該有足夠的智慧去 RTFM,然後自己去找出來。

問題:我可以用 Bass-o-matic 檔案轉換工具將 AcmeCorp 檔案轉換為 TeX 格式嗎?

回答:試試看就知道了。如果你試過,你既知道了答案,就不用浪費我的時間了。

問題:我的{程式/設定/SQL 語句}不工作

回答:這不算是問題吧,我對要我問你二十個問題才找得出你真正問題的問題沒興趣 —— 我有更有意思的事要做呢。在看到這類問題的時候,我的反應通常不外如下三種

  • 你還有什麼要補充的嗎?
  • 真糟糕,希望你能搞定。
  • 這關我有什麼屁事?

問題:我的 Windows 電腦有問題,你能幫我嗎?

回答:能啊,扔掉微軟的垃圾,換個像 Linux 或 BSD 的開源作業系統吧。

注意:如果程式有官方版 Windows 或者與 Windows 有互動(如 Samba),你可以問與 Windows 相關的問題, 只是別對問題是由 Windows 作業系統而不是程式本身造成的回覆感到驚訝, 因為 Windows 一般來說實在太爛,這種說法通常都是對的。

問題:我的程式不會動了,我認為系統工具 X 有問題

回答:你完全有可能是第一個注意到被成千上萬使用者反覆使用的系統呼叫與函式庫檔案有明顯缺陷的人,更有可能的是你完全沒有根據。不同凡響的說法需要不同凡響的證據,當你這樣聲稱時,你必須有清楚而詳盡的缺陷說明檔案作後盾。

問題:我在安裝 Linux(或者 X )時有問題,你能幫我嗎?

回答:不能,我只有親自在你的電腦上動手才能找到毛病。還是去找你當地的 Linux 使用群組者尋求實際的指導吧(你能在這兒找到使用者群組的清單)。

注意:如果安裝問題與某 Linux 的發行版有關,在它的郵件列表、論壇或本地使用者群組中提問也許是恰當的。此時,應描述問題的準確細節。在此之前,先用 Linux 和所有被懷疑的硬體作關鍵詞仔細搜尋。

問題:我怎麼才能破解 root 帳號/竊取 OP 特權/讀別人的郵件呢?

回答:想要這樣做,說明了你是個卑鄙小人;想找個黑客幫你,說明你是個白痴!

好問題與蠢問題

最後,我將透過舉一些例子,來說明怎樣聰明的提問;同一個問題的兩種問法被放在一起,一種是愚蠢的,另一種才是明智的。

蠢問題

我可以在哪兒找到關於 Foonly Flurbamatic 的資料?

這種問法無非想得到 STFW 這樣的回答。

聰明問題

我用 Google 搜尋過 "Foonly Flurbamatic 2600",但是沒找到有用的結果。誰知道上哪兒去找對這種裝置程式設計的資料?

這個問題已經 STFW 過了,看起來他真的遇到了麻煩。

蠢問題

我從 foo 專案找來的原始碼沒法編譯。它怎麼這麼爛?

他覺得都是別人的錯,這個傲慢自大的提問者。

聰明問題

foo 專案程式碼在 Nulix 6.2 版下無法編譯通過。我讀過了 FAQ,但裡面沒有提到跟 Nulix 有關的問題。這是我編譯過程的記錄,我有什麼做的不對的地方嗎?

提問者已經指明瞭環境,也讀過了 FAQ,還列出了錯誤,並且他沒有把問題的責任推到別人頭上,他的問題值得被關注。

蠢問題

我的主機板有問題了,誰來幫我?

某黑客對這類問題的回答通常是:好的,還要幫你拍拍背和換尿布嗎?,然後按下刪除鍵。

聰明問題

我在 S2464 主機板上試過了 X 、 Y 和 Z ,但沒什麼作用,我又試了 A 、 B 和 C 。請注意當我嘗試 C 時的奇怪現象。顯然 florbish 正在 grommicking,但結果出人意料。通常在 Athlon MP 主機板上引起 grommicking 的原因是什麼?有誰知道接下來我該做些什麼測試才能找出問題?

這個傢伙,從另一個角度來看,值得去回答他。他表現出瞭解決問題的能力,而不是坐等天上掉答案。

在最後一個問題中,注意告訴我答案給我啟示,指出我還應該做什麼診斷工作之間微妙而又重要的區別。

事實上,後一個問題源自於 2001 年 8 月在 Linux 核心郵件列表(lkml)上的一個真實的提問。我(Eric)就是那個提出問題的人。我在 Tyan S2464 主機板上觀察到了這種無法解釋的鎖定現象,列表成員們提供瞭解決這一問題的重要資訊。

通過我的提問方法,我給了別人可以咀嚼玩味的東西;我設法讓人們很容易參與並且被吸引進來。我顯示了自己具備和他們同等的能力,並邀請他們與我共同探討。通過告訴他們我所走過的彎路,以避免他們再浪費時間,我也表明了對他們寶貴時間的尊重。

事後,當我向每個人表示感謝,並且讚賞這次良好的討論經歷的時候, 一個 Linux 核心郵件列表的成員表示,他覺得我的問題得到解決並非由於我是這個列表中的人,而是因為我用了正確的方式來提問。

黑客從某種角度來說是擁有豐富知識但缺乏人情味的傢伙;我相信他是對的,如果我個乞討者那樣提問,不論我是誰,一定會惹惱某些人或者被他們忽視。他建議我記下這件事,這直接導致了本指南的出現。

摘抄自

提問的智慧