技術論壇求生實錄

常看到國外有許多什麼什麼 Survival Guide 之類的書, 內容無非是一些方針原則之類的。我現在要寫的, 就是類似的內容。但是我知道, 像這種東西, 看在不同人的眼裡, 或許會有不同的解讀...

常看到國外有許多什麼什麼 Survival Guide 之類的書, 內容無非是一些方針原則之類的。我現在要寫的, 就是類似的內容。但是我知道, 像這種東西, 看在不同人的眼裡, 或許會有不同的解讀; 所以在你開始往下看之前, 你必須認知本文所持的以下幾個前題, 那就是, 一、這篇文章的出發點完全是基於善意, 我無意冒犯任何人。二、我會盡量讓文章內所描述的任何行為都是經由廣泛的客觀觀察而歸納獲得的, 而不是個別的、針對性的指涉。三、在我的設定中, 本文讀者是發問者, 而非解答者。

二十年前, 由於受命接管公司的 BBS, 我開始接觸這種與人離線交談的系統。然後, 一直到後來的新聞群組, 甚至在網際網路發達之後, 又有所謂的論壇、社群等等; 我和許多人一樣, 可以說都是透過網路和無數同好進行溝通交流。當 .Net 出現之際, 基於個人興趣, 我回歸程式設計的行列。由於當時 .Net 資源稀少, 周圍根本找不到任何人可以諮詢, 偏偏我一開始就挑了 .Net 領域中最複雜難懂 (或者說是最違反傳統程式設計思維) 的 ASP.NET 作為開始學習的起點; 在無人可問、無書可查的情況下, 每有問題, 就只能到各大論壇上面尋求先進同好的協助。

發問者與答題者的立場差異

何謂小白?

由於我那時候所面臨的狀況, 使得我和現在各大論壇被歸類為小白的提問者, 在行為上似乎有點類似。其實, 即使距今將近十年, 我也還記得自己或多或少幹過一些蠢事。以下, 我把最普遍常見的小白行為歸納一下 (雖然其中有一部份是我從未犯過, 但是整體而言也算是很常見的):

  1. 認為自己遇到的問題別人一定都遇過, 所以在問題的描述上十分隨便, 並且認定別人一定一看就懂
  2. 把論壇當作提款機; 反正發問不用錢, 而且人家也不認識我, 以致於每有問題就往上面亂丟亂問
  3. 懶得去歷史帖子裡翻, 所以經常問到別人已經問過五百遍的問題
  4. 天真的以為自己寫的程式是什麼不可傳人的心血結晶, 所以想問問題, 卻又不願意把程式貼上來
  5. 缺乏描述問題的能力, 或者文筆不好; 主詞、動詞、受詞完全不講究, 讓人家完全看不懂問的是什麼
  6. 並未把問題的重點講清楚, 雖然表達了問題, 卻未交待問題發生的確實步驟
  7. 把熱心人士的答覆視為理所當然, 如果未得到期待的答案, 甚至會發出攻擊或嘲諷
  8. 毫不尊重回覆者的心理感受; 問了問題之後, 不管有沒有獲得解答, 就再也不予理會
  9. 由於在部份論壇上總有許多熱心的答覆者, 導致部份發問者異想天開, 把自己的工作, 甚至學校的作業當作問題來發問, 期待能撈到免費的答案
  10. 把論壇當成了申訴或埋怨的另種管道

其實我當時所處的環境, 和現在的環境幾乎是截然不同的。在那個 .Net 初興的階段, 我所提出的問題, 不管問得好或是不好, 幾乎有高達七八成以上, 完全無法得到解答。而現在 .Net 人才濟濟, 連許多極為冷門的問題, 都有能人異士答得出來; 只要發問者在態度上沒有問題, 通常都能得到超乎預期的協助。

但不管如何, 我還是十分感謝當初那些熱心回答我的問題的朋友們。在那段知識黑暗期, 如果不是這群不求回報的先進同好的熱心幫忙, 我今天不但不可能成為 MVP, 甚至早就放棄 .Net 了。

在長達兩、三年的摸索期當中, 那群先進朋友們所提供的最大協助, 就是幫我打通了任督二脈 (其中最重要的, 就是讓我終於搞懂了網頁生命週期、事件處理模式和離線資料庫操作等觀念), 而我也基於回饋的心理, 志願擔任起義務解答者的角色, 並於2004年起當選了 MVP。

坦白說, 我是自從開始幫人家解決問題之後, 才慢慢體會並反省自己以前犯過的小白行為。我覺得很多事情都是如此, 如果你未曾從事某個角色, 你就不會站在那個角色的立場去思考。我相信各技術論壇上永遠不缺乏白目的初學者, 但我也相信除了極少數的例外, 應該不會有人是刻意跑出來討人嫌的。那麼, 為什麼我們還是常在各論壇上聞到濃濃的火藥味呢?

技術論壇的定位問題

我個人認為, 小白之所以成為小白, 主要在於他們對技術論壇的認知有問題。

如果我在我的噗浪上面寫了一行字「Pro 可 D/L 了!」請問你看得懂嗎? 這行字沒頭沒尾的, 除非你擁有絕佳的猜謎能力, 否則你絕不可能知道我在寫些什麼。

但是, 我說過了, 我是寫在我個人的噗浪上面, 我還限制只有朋友可以看到。由於這行字是寫給他們看的, 我不需要寫得太詳細, 在那個時間點上, 他們完全可以理解, 也不用猜。

但是在論壇(而不是你的個人噗浪頁)上, 你想問的問題, 不可能直接映入眾多陌生人的心坎裡。如果你也寫得那麼的惜字如金, 請問你是來問問題的, 還是來出題給人猜燈謎的? 你有提供獎品嗎?

我從2002開始在論壇上義務回答 .Net 問題以來, 直到現在, 我認為我在論壇上所花的時間, 差不多有百分之五十以上, 是浪費在一個字上面: 「猜」! 我很少看到有發問者能夠一次就把問題描述得很清楚詳細的; 相反的, 大部份人的問題都十分的模擬兩可、不清不楚、若隱若現、若有似無、霧裡看花、令人墜入十里霧中...

我相信論壇上的義務解答者絕大部份都不是什麼天生嫉惡如仇、動輒發脾氣的人, 但是一旦小白看太多了, 火氣就很容易冒上來了。所以我們時常可以看到像是又有小白被修理了, 小白反擊了之類的戲碼, 搞得大家心情都不好。

對我個人而言, 我算是比較「認命」的。像這種問題不清楚的, 我現在幾乎都已經懶得問了。有時候問題一看就知道毛病出在什麼地方的話, 我就直接做個假設, 然後就提出我的建議。反正, 如果回答的方向不對, 發問者應該再次說明、再次發問。

但是版上的其他解答者也許並不像我這麼想得開; 他們可能馬上把版規給搬出來, 甚至開罵了。

經過二十年的歷練, 我發現小白是絕對不會消失的; 版規定得再好、再嚴謹, 小白照樣源源不絕的跑出來。把原來的小白教好了, 新來的小白還是會再度出現。對於現在的我來講, 我已經懶得跟這些人奮戰了。

我認為, 除非這些技術論壇能夠自己把自己的定位說明得十分清楚, 而且, 最重要的是, 要能確保剛來的發問人也同樣十分清楚, 否則像這種生小白滅小白的戲碼, 永遠會重複上演。

拿我最常上的 MSDN 技術論壇來做例子好了。基本上, MSDN 是微軟官方成立的技術論壇, 對於發問人的資格是毫無設限的, 所以從前這裡也是最多小白出沒之處。眾小白的最大共通點, 在於他們把這裡當作微軟的客服中心, 把在這裡義務解答的朋友當作微軟請來的員工。所有發問與解答者最大的摩擦, 通通源自於這個認知上的差異。

事實上, MSDN 論壇並不是微軟的客服中心, 而在上面義務回答的人也不是微軟請來的。就算是名為 Microsoft MVP 的朋友, 即使是冠上了一個 Microsoft 的字樣, 都不是微軟付錢請來的員工 (MVP 是一個獎項、一個資格, 並不是職稱; 有點像是一個人如果拿到了 Microsoft MCP 執照, 並不代表他在 Microsoft 從事 "MCP" 這個職務)。所以, 即使大家在上面義務幫忙解答, 事實上, 都沒有領微軟的半毛薪水。

小白小白我不愛你

由於上述的錯誤認知, 而且基於客戶就是大爺的心態, 曾經有極少數小白在 MSDN 論壇上, 充分發揮了「天大地大, 林北我最大」的梁山泊氣概, 在論壇上呼風喚雨, 把那些義務回答的朋友當作家丁一樣的使喚。這下, MSDN 上的義務解答者群情激憤, 幾場言論略嫌激烈的筆仗就出現了。

幸好這種混亂的場面規模並不大 (如果和那些政治討論區比起來, 這簡直只能算是茶壺裡的小漣渏而已), 但是受到傷害的解答群, 對於層出不窮的種種小白行為, 卻變得愈來愈無法忍耐了。

在這種情況下, 幾個不好的影響出現了:

  1. 小白行為被從寬認定 - 發問者的某些言詞, 不管是有意還是無意, 都很容易被解答者歸類為小白
  2. 一旦被歸類為小白, 發問者所問的問題可能會得到輕率 (有時甚至是憤怒) 的回應 - 解答者的回答品質無形中降低了
  3. 除非發問者在論壇上已經建立了良好而且長久的名聲, 否則剛出現的新面孔, 可能會被懷疑是舊小白利用新帳號捲土重來的, 結果不管有沒有小白行為, 都有可能得不到應有的尊重

所幸, 以上這幾種情況並不嚴重, 就算存在, 也都只是個案。

真正壞的影響, 恐怕是那些曾被歸類為小白的人, 以及其他雖未被稱為小白, 但看到小白遭遇的人, 從此再也不來了。

說到底, 這就又回到論壇定位的問題了。小白們把技術論壇當作微軟客服, 這固然是錯的; 但從另一個角度來想, 微軟確實把自己的官方論壇當作其「支援」的一部份。大家想一想, 論壇既是放在微軟的網站下, 而且論壇的設備和程式也都是微軟自己提供的; 在微軟的支援網頁中, 包括 MSDN 論壇、Answers 等等, 都是其所承諾的「技術支援」的一部份 (在「技術支援」畫面中點選右上角「開發人員」, 在出現的「最新消息」中就有「造訪 MSDN 論壇尋求專家協助」這一項)。

我不是微軟的員工, 我也不知道微軟自己是怎麼想的; 但是我認為有一件事情應該是可以確定的: 不管成效大還是小, MSDN 論壇肯定是微軟行銷工具其中的一環。以微軟產品之繁多, 連微軟員工自己都無法搞懂自己的每一樣產品了; 因此像各種技術論壇、使用者俱樂部之類的獨立工具或組織, 勢必是微軟求之不得的合作夥伴。

同樣的產品, 如果一個是發現問題時有很多人可以問, 另一個是沒人可以問, 請問你會採用哪一個? 這答案應該很明顯吧! 而由於微軟自己都照顧不了所有的產品, 於是它發動或鼓勵其它獨立團體或個人來共襄盛舉, 這當然也是完全合理的行為。

小白固然討人厭, 也好歹是微軟的潛在客戶。把小白嫌疑犯通通趕走了, 表面上看來似乎令人稱快, 結果卻是害了微軟 (就算影響層面不大)。

以成敗論英雄

在這個社會上, 我們對於「成功」的定義, 並不在於一個人學問大不大、知識廣不廣, 而是「解決問題的能力」! 俗語「不以成敗論英雄」這句話通常是用在失敗者身上的, 表示這個人雖敗猶榮。但是敗了就是敗了, 我們不能因此就把獎牌硬是頒給了他, 否則還有天理可言嗎?

那麼, 若回到論壇成立的初衷, 我們應該很清楚的看到它原本應該達到的功能, 那就是有人問、有人答, 就這麼簡單! 問多答少, 或是問少答多, 都不是正常現象。照說應該是很多人問, 很多人答, 這才是最大的成功。如果能達成這個目標, 那才能算是真英雄。

坦白從寬; 我承認我也曾在 MSDN 論壇上罵過人 (我是不會口出惡言, 但口吻上可能嚴厲了點)。但是罵了幾次之後, 我發現這是在為微軟樹立敵人。所以在那之後, 我就再也沒罵過人了。不過該講的話還是要講, 我多半會採用稍為委婉的語氣去予以引導。後來則是採用更消極的態度去面對, 就是我在上面說過的, 不用猜了, 直接給他我認為的解法。

老子說「夫唯不爭, 故天下莫能與之爭」; 我在 MSDN 上既不去爭什麼最佳解答之類的頭銜, 所以我並沒有什麼得失壓力。所以即便小白們時常來個「射後不理」, 我也不再覺得有什麼好不高興的。我覺得上來 MSDN 問問題的人, 應該會很高興看到有人回應, 而我提供了我的解法, 已經盡了我的義務了。對我來講, 事情已經成功了、結束了。

以上, 是我面對小白朋友們的消極態度。但是對於不想當小白的朋友們, 我還是會採取較為積極的態度。

初學者的幸福

要知道, 有時候光為了回答一個問題, 就算那個問題很簡單, 我可能也得為它新建一個專案, 寫幾個程式, 反覆驗證。這事聽起來很簡單, 但是實際上, 我們這種義務解答者平常都是有工作在身的! 為了回答問題, 我可能必須把手頭上的事情先完成, 然後專心的把解答做好並且驗證過, 時間不知不覺就要花掉幾十分鐘, 甚至幾個小時。如果公司臨時又有事情, 時間會耗費更久。經常有時候花了許多時間把解答做好, 回覆之後, 結果才發現有其他熱心民眾已經搶先解答過了, 以致於我又得把我準備好的解答捨棄掉 - 幾個小時的工夫就完全浪費了!

近一兩年來, 我發現這種浪費時間的事情愈來愈多。一方面, 論壇上的義務解答者變多了, 另一方面, 問問題的人似乎愈來愈少了 (至少沒有增加)。看起來, 答題的人似乎比發問的人還多。

在這種情況之下, 我愈不會主動去搶先解答了! 為什麼? 因為解答的人既多又快, 我解答得慢 (因為手頭上事情多), 每次答完才知道跟別人的答案重複, 然後又得把自己的解答捨棄, 怎麼算都是一件沒有意義的事情。

不管如何, 這種現象代表一件事情, 那就是懂得發問的人有福了!

站在 .Net 初學者的立場, 你們現在是佔有天大優勢的。怎麼說呢? 在微軟的經營之下, 現在要學習 .Net 已經變成很容易的事情了! 尤其是如果你不排斥英文的話, 那麼從 Beta 版開始, 就常有影音版的教學影片出現, 而差不多每個國內外 MVP 都有技術部落格, 可以提供許多最新的技術或消息; 等到正式版上市, 又有完全免費的 Express 版本可以用。遇到任何問題, 都可以在各大技術論壇發問, 有很多人可以提供很專業的諮詢。

若對照我在七八年前所處的學習環境, 現在的初學者真的太幸福了!

趕快從小白學校畢業

在這種環境下, 如果你還不能把 .Net 學好, 那就真的說不過去了! 本文的終極目的, 就是幫你認清楚技術論壇的種種生態。所以, 如果你不清楚自己是否已經進入小白學校的話, 那麼你可以回頭去看看最前面的小白十大症狀, 反省一下自己有沒有誤觸哪一條, 並且痛定思痛, 趕快從這所討人厭的學校畢業。

我相信, 以 MSDN 技術論壇中眾多解答者的陣容, 你應該可以問些很深入 (但不是很複雜) 的問題。可惜的是, 我倒是很少在這些論壇上看到真正精彩的對話。你想想, 如果發問者都十分粗魯,  而解答者都在懷疑來者是否小白的時候, 兩邊怎麼可能擦出光彩奪目的火花呢?

相反的, 我在論壇上看得最多、也最令人不耐煩的問題, 幾乎都是在 GridView/DetailsView 之類控制項的動態操作, 或者企圖去顛覆這些容器物件的原先設計, 把許多它原本沒打算支援的特技給加上去, 結果搞到最後陷在不同控制項的事件生命週期中反覆打滾, 然後又來版上討救兵。

這些事情不是不能問, 但是這種問題卻足以令我退避三舍。為什麼呢? 首先, 如果你願意去歷史討論串去搜尋一下的話, 此種相關的問題只能用「罄竹難書」或「族繁不及備載」來形容。如果再讓我看到這類問題, 我在腦子裡一定會馬上出現「怎麼又來了」這句話。

其次, 像 GridView 這種控制項有完整的生命週期和資料繫結功能, 它是很好用沒錯, 但是它畢竟只是 ASP.NET 眾多功能的一小部份。但偏偏為什麼眾多初學者硬是要把它當作是 ASP.NET 的全部呢? 搞到最後, FileUpload 也要放在它的樣版裡面, DetailsView/FormView 也要放在它的樣版裡面, iFrame 也要放在裡面, 不然就是要把 GridView 放在另一個 GridView 裡面... 不但如此, 還有人硬是要把上述各種不同的控制項動態產生。要知道, 放在 GridView 樣版裡的東西本來就已經是動態產生的, 你現在又要把所有控制項再以動態產生... 這種情況就好比說只是想要找個位子來坐坐而已, 但明明有幾百個沙發放著讓你隨便坐, 你就偏偏要學李堂華特技團, 硬要把板凳疊到五十層那麼高, 並且堅持要坐在最上面。然後再時不時出來訴苦說為什麼爬不上去或者老是掉下來!

遇到這類問題, 我如果不是連看都懶得看的話, 那麼我通常會問說「你原本想達到什麼功能?」然後可能會建議一個不使用 GridView 就可以辦到的簡單辦法 (就算他的問題是 GridView 相關)。但如果發問者一定要去耍那個特技的話, 沒辦法, 那我只好不予奉陪了。

不瞞各位, 我在很久以前也是很喜歡耍這類特技的。那時候更沒有書會寫這種東西, 也沒人可以問, 只能從網路上東翻西找以尋求靈感, 不然是就不斷的進行錯誤嘗試。所以每當做出一個自以為前無古人後無來者的新奇功能時, 就難免自 high 個老半天。然而, 像這種專門破解 (說好聽點是「擴充」) 既有控制項功能的特技, 很快就會面臨瓶頸。

怎麼說呢? DataGrid/GridView/DetailsView/FormView 這些控制項有它固定的事件與生命週期, 但是它的設計模式並不是為了讓你能夠任意的動態加上其它內嵌控制項用的。你所加入的動態控制項也有它的生命週期, 若再加上網頁本身的生命週期一起來攪和, 你很容易就會遇到當你要用到某個控制項時, 它都還沒有被 render 出來的情形, 這就陷入了死結 (dead lock)。因此, 除非你對於各種控制項的生命週期十分了解, 否則你會發現你老是在處理相同的問題, 搞得自己痛苦不堪。

後來我發現一件事 - 我觀察到所有採用 ASP.NET 的大型網站, 幾乎沒有一個是在 DataGrid/GridView 這些控制項上面大作文章的。相反的, 對於我以為酷炫的特技, 他們都採用很簡單 (雖然可能既不酷也不炫) 的方法在處理, 例如跳出新頁、放置在不同地方等等。事實上, 愈是大型網站, 愈不會把精力放在那些所謂的 rich control 上面。其實這些網站上面也不缺乏花俏的特技, 但是他們多半是用在前端程式 (JavaScript、Flash 等等) 上面。

慢慢的, 我開始覺得把時間和精力浪費在鑽牛角尖是完全沒意義的。

對同樣一件事情, .Net 總是提供了很多很多種不同的方法或功能。如果你發現這種方法行不通, 你可以改採另一種方法。所以, 請不要再在 GridView 這類控制項上面浪費太多時間了! 有時只要換一種心境, 那麼同一件事情可以在五分鐘之內做好, 而不是五個禮拜。

所以, 有時候只要在心境上稍為改一下, 我相信要成為一個足以令所有人都能公正對待的發問人, 應該不是難事才對。


Dev 2Share @ 點部落