做爲一名程序員,若是沒有聽過 Stackoverflow,那麼你最好去面壁思過一下。程序員最須要閱讀的一本編程書籍(其實編程書留下這本就夠了!):html
那些尚未讀過這本書的程序員,是時候買一本了。若是還在猶豫,那麼先看下這篇文章,看看爲何離不開 stackoverflow。java
當你拋出一個技術問題時,最終是否能獲得有用的回答,每每取決於你所提問和追問的方式。 --Eric S. Raymondpython
有時候,清晰描述一個問題,特別是技術問題沒有想象的那麼簡單。提問歷來就是一門學問,惋惜不少人沒有意識到這一點,或者沒有給予足夠的重視。或者,有的提問者根本不是抱着提問的態度來請求你們的幫助。因此咱們會發現各類讓人沒法解答或者無意解答的問題:git
java正則表達式問題?程序員
sla響應時間是指什麼?github
ATL類與通常的類繼承有什麼區別正則表達式
爲了不上面的問題被關閉或者修改,放一張圖片在這裏,來體會下這種狗屎問題:express
去 segmentfault 的未回答題目中隨便就能找到一堆這樣的問題,因此不少人顯然並無提問的智慧或者沒有很好的態度。Raymond 和 Rick Moen 寫了一份經典的文章 How To Ask Questions The Smart Way專門來描述如何提問,這篇文章被翻譯成各國文字,留傳很廣,能夠在這裏找到中文版。Stackoverflow 和 Segmentfalut 也給出了關於提問的建議:編程
在 Stackoverflow 能夠看到太多經典的問題,咱們能夠從這些問題中學習如何去提問,如何和答題者溝通。當你看習慣了stackoverflow 上面的問題,提問時就會不自覺去模仿,從而避免問出無腦問題。下面是提問時最須要注意的幾個問題:
問搜索引擎沒有滿意答案(google 起碼過四頁)的問題
問那些本身沒法獨立解決,已經作過不少嘗試的問題
儘可能清楚地描述問題:良好的排版,代碼,錯誤提示,圖片等
讓你的問題對別人有幫助
問題要有肯定的答案,不要有太多的主觀性
不少時候咱們但願可以找到一個解決辦法,可是在 stackoverflow 上,常常會有意外的收穫。你可能會看到對一個問題不一樣的解決方案,甚至包括對這些解決方案的比較。
假設如今你想知道 python 中如何調用外部命令,好比 ls -l 來打印某個目錄下面的文章。Google一下 python call system command
,第一條就是stackoverflow 上面的一個相關問題:Calling an external command in Python. (google技術問題,基本都會顯示 stackoverflow 相關問題)。
而後在這個問題下面,有人總結了調用外部命令的幾種方法:
os.system()
os.popen()
subprocess.popen()
subprocess.call()
subprocess.run()
而且還對每一個方法作了介紹,你能夠選擇適合本身應用場景的方法。再好比這個問題 How to check whether a file exists using Python?,介紹了 python 中檢查文件是否存在的不一樣方法。
有許多強有力的工具能夠幫咱們更好地研究問題,你可能知道gdb調試工具,可能知道python的timeit時間監控模塊,可是你不知道那些本身不知道的工具。不少時候,當第一次知道某個工具時,咱們心中會產生相見恨晚的感受。然而,心儀的趁手工具老是那麼可遇不可求。
在 stackoverflow,每個問題答案或者評論中均可能會有一些好的工具,你總有機會發現那些遺落在字裏行間的優秀工具。
下面列出我發現的一些不錯的工具:
truss/strace
:跟蹤進程執行時的系統調用和所接收的信號,strace能夠跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。(來自問題:Why is reading lines from stdin much slower in C++ than Python?)
vprof:一個可視化工具,能夠分析 Python 程序的特色,好比運行時間,內存使用等。(來自問題:How can you profile a Python script?)
Regex 101:一款在線的正則表達式輔助工具,能夠幫助理解正則表達式的含義,方便調試正則表達式以及作一些簡單的嘗試。(來自問題:Learning Regular Expressions)
下面爲 Regex 101 的一個簡單示例:
不少時候,遇到一個問題,咱們根本無從下手,不知道朝哪一個方向思考。可是經過 stackoverflow,咱們能夠輕易知道具體的解決方案,有時候甚至還能知作別人面對這個問題時候是怎麼思考的。
假設你想利用裝飾器來完成一個任務,即在下面say函數返回的字符串先後加上<b><i>
,你想一想這樣定義 say。
@makebold @makeitalic def say(): return "Hello"
每次調用 say 返回 <b><i>Hello</i></b>
。可是要如何實現 makebold 和 makeitalic 呢,這是一個問題。在 stackoverflow 上,有大牛會直接告訴你答案,並扔給你一個裝飾器的文檔連接。可是還有大牛會把本身的思考過程,把本身對裝飾器的理解詳細地告訴你,讓你深刻去理解裝飾器機制。
針對上面的這個問題,有一個答案得到了 3000 多贊,一步步告訴你們如何解決問題。首先告訴咱們python中函數有什麼特色:
函數是對象
函數能夠被賦給一個變量
函數能夠被定義在另外一個函數中
一個函數能夠返回另外一個函數
能夠把函數做爲參數傳遞
而後開始解釋什麼是裝飾器:其實就是封裝器,可讓咱們在不修改原函數的基礎上,在執行原函數的先後執行別的代碼。接下來手工實現了一個簡單的裝飾器原型,緊接着引入 python 中的裝飾器語法。最後還列出了一些裝飾器的高級用法,包括給裝飾器傳遞參數等。讀完整個答案,必定能對裝飾器有較深的理解,而且知道理解裝飾器的思考過程。這樣,沿着這條思考的路徑,你本身就能夠推導出裝飾器的使用方法。
沒有問題要提問時也能夠時常逛一逛 stackoverflow,瀏覽一些投票比較多的問題,看看別人的回答。在這個龐大的知識庫中,你極可能會發現本身的一些認知盲區,發現一些本身從未關注過的內容。
我就發現了一些比較有意思的問題,好比:
我整理了一份 Python 的高質量問題清單,放在這裏以供時常翻閱。
那麼怎麼才能找到 stackoverflow 呢,兩個建議:
英語精確描述問題
用 Google 去搜索
只要你不是第一個碰見某個技術問題的人,你基本就會在 stackoverflow 找到相同或者相似的問題。早日碰見,早日喜歡上 stackoverflow,你會發現生活是如此愜意。
玩轉 Stack Overflow 之提問篇
7 Strace Examples to Debug the Execution of a Program in Linux
How can I make a chain of function decorators in Python?