Stack Overflow 教學:找到程式問題的解答

Stack Overflow是什麼?工程師的討論區

Stack Overflow 是一個程式設計領域最熱門的工程師技術問答論壇網站。無論程式新手還是老手,都可在論壇內提出和回答問題,進而獲得一些在 Stack Overflow 上的聲望值,工程師遇到程式問題,也常依賴Stack Overflow工程師社區找答案。

另外,你也可以藉由瀏覽各個語言、關鍵字標籤,從他人的回答和分享學習一些新知。若你想要找工作,這邊也成為眾多公司和使用者自由媒合的平台。這篇文章給入門者介紹Stack Overflow,並提供如何使用這個工程師社區的基本指南。

在Stack Overflow累積的聲望值可以獲得更大的網站權限

英文雖說是這個論壇上發問的主要語言,不過不需過度擔心你的英文程度。畢竟,程式語言上所遇到的困難,是沒有國界差別的。

來 Stack Overflow 找程式問題解答

人們在搜尋撰寫程式上所遇到的問題時,與 Stack Overflow 有了第一次接觸(超過 90 % 以上)。換言之,在這累積眾多工程師心血的地方,「下對關鍵字」不光能讓你單純獲得解答。從大家的逐筆回應中,也可以從中一窺自身的觀念和技術的熟悉程度。

如何下關鍵字

雖說 Stack Overflow 本身的網頁上方有個搜尋框,但世界上頂尖的 Google 搜尋引擎,能夠同時搜尋 Stack Overflow 和其他網站的相關結果。從這些內容的交叉比對和閱讀中,你可以了解一個問題的全貌和不同解法。

[使用 Google] <關鍵字1><關鍵字2><…其他…> site:stackoverflow.com</…其他…></關鍵字2></關鍵字1>
// 在尾端不加上 site:<網站網址>,可以得到更多結果</網站網址>

這邊的關鍵字可以是以下內容:

  1. 程式語言名稱:Node.js, Python, JavaScript …, etc.
  2. 套件名稱:Express, Handlebars, BootStrap, …, etc.
  3. 變數類型或是函數:function(), Array, Object, String, null, undefined, etc.
  4. 錯誤訊息和代碼:直接將報錯的訊息複製貼上
  5. 描述你遇到的問題

以下是一些搜尋示範:

  • Two array to key-value javascript
  • nodejs cors
  • Unable to align the tags in Bootstrap 4
  • Handlebars: Access has been denied to resolve the property “username” because it is not an “own property” of its parent.

以最後一點為例:當你將錯誤訊息近乎完整的貼上於 Google 搜尋後,在 Stack Overflow 上已經有人發問過類似問題:Express Handlebars Won’t Render Data – Jan 15th, 2020

stackOverflowExample

解答,有時在意料之外的地方

點進 Express Handlebars Won’t Render Data 這篇文章內,

  1. 你可以從裡頭找到原因:From version 4.6.0 onward Handlebars forbids accessing prototype properties and methods of the context object by default.
  2. 還有可能的解法 I :response converted into JSON
  3. 還有可能的解法 II:Mongoose could be achieved by using lean

雖說你的情境不一定完全一樣,但你可以擷取一些裡頭用來解決問題的關鍵字,去查看你所用的套件官方文件,有無類似的功能和語法,進而解決問題。

常用關鍵字中英對照表

以下列出一些常見名詞的中英對照表。不過有些名詞,直接用英文會比較好理解,像是:API (應用程式介面)、webpack、OAuth …等等。

中文 English

  • 字串 string
  • 數字 number
  • 函式 function
  • 陣列 array
  • 物件 object
  • 類別 class
  • 框架 framework
  • 處理器 processor
  • 渲染 render
  • 套件 package
  • 版面配置 layout
  • 模組 module
  • 測試 test
  • 命令列 command line
  • 函式庫 library
  • 資料庫 database
  • 快取 caching
  • 認證 authentication
  • 授權 authorization

加入 ALPHA Camp 全端開發緊密學習社群,你也能獲得助教與同學的互助支援

Stack Overflow 導覽

網站簡介

Stack Overflow 的首頁是作為商業展示用途。若要進入到公開的會員問答區塊的話,請點選左上角的漢堡”三”圖示,就可以看到 PUBLIC 的 Stack Overflow。若你想觀看特定的主題標籤(Tag)或是某些名人(User),你也可以點選這兩個選項來找尋你想要的資訊。

搜尋你的第一個問題

網站導覽列上的搜尋框,用英文搜尋關鍵字。

1. [JavaScript]:搜尋有 JavaScript 這個 Tag 的問題
2. user:tomfrank:搜尋使用者 tomfrank
3. “words here”:精確搜尋 “words here”

此外還有照「回答問題數」、「文章評價」、「發文者是否選出最佳解答」,一共六種搜尋方法。

Search Field

註冊一個帳號

註冊一個帳號是發問問題的必須步驟,步驟非常簡單。

  1. 登入首頁,點選右上角的 Sign Up
Stack Overflow Index
  1. 使用 Github, Google 或是 Facebook 快速完成註冊即可
Stack Overflow Registration Page

發問你在 Stack Overflow 的第一個問題

如何發出一個好問題?

好的問題,除了被他人回答的意願比較高外,你的思考模式和嘗試過的歷程,無論好壞結果,對於日後有遇到類似問題的人們,都是寶貴的指引。在提問之前,你得先自己測試過,並條列疏理下你所遇到的情況:

  1. 思考方向
  2. 已試過的方式
  3. 預期結果
  4. 出現的錯誤訊息
  5. 跟問題有關的檔案配置
  6. 所用的程式語言

最後,請使用英語發問,畢竟這是個以英語為主的論壇。你可以使用 Google Translate 或是有道翻譯等工具來幫助你在自然語言上的難題。

Title 問題標頭

描述你所遇到的困難 + 所使用的語言。
描述困難的方式,可以採用以「目標」或是「差異」的方面來撰寫,像是:

1. How to get repeated objects in json array in javascript?
如何在陣列中取得重複的物件 (JavaScript) ?

2. How to suppress “Undefined” errors before fetching data in Vue?
如何在 Vue 中取得抓取資料前 undefined 錯誤訊息?

3. JavaScript – if else problem (changing style color if a number is negative or positive)
JavaScript 的 if/else 問題:當數字為正或負數時,改變文字顏色

Body 問題內文

精確的描述你的問題。一個「精確」的問題,通常會包含以下的元素:

  1. 問題發生的環境,視情況加上版本號:Python3, JavaScript, MacOSX, Windows10
  2. 你對於你的問題的理解
  3. 你曾經做過什麼樣的嘗試

簡言之,盡可能的想像要回答你問題的人,要如何在其電腦上重置你所遇到的環境。如此一來,才能快速的幫你解決問題。
範例:

I used the node.js, mongoDB to make a shorten-links generator.
My pseudo code is like this:

app.post(‘/’, (req, res) => {
 to generate a short link
 while(if there is the same short link in database ) {
   to generate a short links (until no match in database)
 }
 save the short link to database
 res.render
});

I would like to avoid the same pattern.
However, I could not find a better way to jump out the while loop successfully?
Could anyone give some hints?

Here are my codes below:
<your code=””></your>

Tags 問題標籤

幫你的問題上一些關鍵字標籤,方便他人的尋找,像是 Python, JavaScript, React, Vue.js …等。

等候他人回應

如果你掌握以上的原則,你可能會得到兩種結果:

  1. 重複的問題:收到這個也不用太過緊張,代表論壇管理員覺得你的提問,在早些日子已經有人回答過了。你可以點擊他們所提供的連結前往查看。
  2. 有他人回答(Reply)或是回應(Comment)在下方:仔細閱讀他們的回應,然後從中去修正你的程式碼。每人的回答方式不同,有些會幫你寫好解法;有些則是給你一些提示讓你探索。

與他人互動

你可以在每個人的回答(Reply)內進行回應(Comment)。回應內,你可以進一步的作提問,或是表達感謝。

Demo Question

禮多人不怪

這個由 2008 年起,匯聚眾多撰寫程式碼的工程師論壇。發問的時候客氣一下,會比較有機會得到友善的回應。當然,這必須要建構在你已經事先做足發問的準備下(如使用過 Google,在問題中詳述你的情況)。最後問題如果解決,留下簡短的補充說明,像:

  1. Thanks! .lean() solves my issue.
  2. Thanks, @anonymous! The only problem is that it’s counting user #1 twice because he has 6 orders.

如何解讀他人回答

RTFM / STFW

當你看到類似以下的回應時:

  • Read The Fxxxing Manual
  • Search The Fxxxing Web
  • 問題評價總和為負
  • 一些略帶貶意的的字眼

代表你的問題其實就在官方說明文件內,或是簡易的 Google 搜尋就可以找到的東西。別忘了,Stack Overflow 已經有了將近10 年以上的問題累積量,你可以先用 site:stackoverflow.com 來找是否有人回答過的。

當你看不懂對方寫什麼,該怎麼辦

  • Tag 對方(@anonymous),等待對方看見再給你一些說明
  • 從對方的給予的回答中,釐清一些方向後,自行排除問題

別忘記,會使用 Stack Overflow 上的人們,普遍認為人們需要有主動面對、解決問題的能力。你可以將嘗試後的結果寫在新的 Comment 裡,給遇到類似問題的人們參考。

地雷和坑不要踩 – 發問錯誤示範

你還未嘗試尋找答案

1. 我能在哪找到某程式或資源?
2. 我如何取得一個陣列的第一個值?

以上這類的問題,註定是會被忽略甚至會招惹一些貶意評論。畢竟,能夠 Google 搜尋到或是官方文件就有的答案,不要直接發表出來。

沒有完善的描述你曾做過的努力

各位大大請幫忙,我的程式不會動了,以下是程式碼……

沒有描述過你曾經對於你想要解決的問題,作過什麼樣的嘗試,而要他人憑空猜想你可能遇到什麼問題的話,被忽略或是得到噓聲的機率是很高的。

尋求大方向的討論

Hi 大家,關於 「2020 第一季要出現的 BootStrap 5 框架拿掉了 jQuery」一事,有什麼樣的看法呢?

Stack Overflow 上頭,問題多半是以解決工程師在實際寫程式中,遇到的疑難雜症。這種大方向的討論,會有很高比例被酸說「請自己做回家功課」。

無關程式的事情

Stack Overflow 不是 PTT 八卦版或是 DCard 閒聊版,跟程式沾不上邊的問題就請另尋他處吧。

即使你很急也不要在標題寫緊急

緊急,是你自己的個人感覺,沒有人需要為你的情緒負責。在問題標頭打上緊急(Hurry)之類的字樣,並不會讓你得到比較快的回覆。反之,被噓、被管理員刪除的可能性還比較大一些。

重複張貼問題

如果你的問題沒有得到回應,或許你該在你原先的問題上,充實一下內容來吸引他人關注,進而獲得回覆。重複張貼問題有很大的機會會被管理員視為鬧版。屢勸不聽的話,日後的發問權限有可能會到受到限制。

試著回答問題

Stack Overflow 是一個幫助在寫程式的人們解決問題的平台,隨著時間的經過,過往的方法可能不再管用,或是有新的簡潔方法可以取而代之。如果你有發現你可以回答或是補充的問題,不要吝嗇你的想法,勇敢的整理一下自己的思緒後,寫成文字發表上去吧。

結語

Stack Overflow 已經成為有撰寫程式需求的人,不可或缺的好幫手。你或許會不習慣它所形塑的互動生態,但你一定可以多少藉由在上頭閱覽多篇問答的過程中,掌握一些日後解決問題的能力。

參考資料

  1. How To Ask Questions The Smart Way (繁中翻譯版)
  2. 如何優雅的使用 Stack Overflow

3分鐘測驗,找到你的客製化全端開發學習路徑