別笑,提問也是一種特殊的技能,我算是見得多了,從高中開始爲各種親戚朋友同學老師修電腦電視洗衣機,真的是感觸良多,剛開始我還認真的排除錯誤,比如任務管理器打不開了,先不說他們不會使用百度,很多人連話都說不明白,於是只能遠程找病毒,真的是一行一行的註冊表在改(誇張修辭)。後來我算是明白了,他們那需要保有數據,於是之後,軟件毛病一律重裝,硬件毛病一律換零件。
但他們大多都是一些非本計算機專業的人,他們又不靠這東西吃飯,而出毛病最多的編程方向,更是有衆多的人說的不知所云,亂七八糟。我隱約記得小學時好像有一個老師給我講過一種學習方法,就是重點是什麼(what),重點在哪(where),什麼時候進行復習(when),於是我對這一整套的標準加以改造,形成了我所謂的3WH,這個框架是借用了編程語言中的概念,沒別的意思,可以理解爲模板,當然3WH是專爲編程設計,其他方面暫不清楚
什麼是3WH
所謂3WH(What,Where,When,How),是一種用來描述和記錄編程故障(Bug)的信息語言,分別指程序中出現錯誤的一切便於診斷的信息。如果看不明白也沒事,這不重要。
What(是什麼)
what一般來說就是故障的報錯信息,是程序對用戶的直接反饋,它應按如下規則敘述:
你可能需要提供:
錯誤信息(控制檯的錯誤信息(包含單元測試),客戶端(瀏覽器)報錯信息,非程序錯誤信息(如IDE設置錯誤),數據庫錯誤信息)
//一個經典的算數異常,您需要至少提供一下的內容
java.lang.ArithmeticException: / by zero
at cn.tineaine.pj.common.dao.testCode.testAty01(testCode.java:16)
Where(在哪裏)
錯誤出現的位置和範圍,這部分信息是輔助於錯誤信息來判斷錯誤原因的,爲了表述清楚可以截圖附加發送過去
所謂位置,就是指代碼中發生故障的位置,而範圍,就是指移除該範圍內代碼程序便可恢復正常,也就是說該範圍內存在錯誤,位置和範圍最大的區別就是位置是在不清楚代碼那一部分有錯誤,而範圍則將錯誤收斂到一個最小的異常單元,已經找到了哪裏出現問題,但不知道如何解決
你可能需要提供:
故障位置/範圍(語句級,方法級,類級,項目級)
按下面這種方法提供故障位置:
//StudentControllor.java類中出現異常,源程序片段如下:
@Test
public void testAty01() {
...
System.out.println(0/0); //這一行提示錯誤,只要移除該行代碼正常運行
...
}
//如上所示,用戶已經確定了故障的範圍,只要移除打印語句,代碼即可正常執行,因此這種情況下需要說明最小範圍是語句範圍
When(觸發時機)
觸發時機比較好理解,就是指在執行哪一步時出現問題和做了什麼之後出現問題,也就是說,代碼在執行到哪一步出現問題?你做了什麼才導致這個程序報錯?需要提供在最早出現故障前對程序的修改操作
你可能需要提供:
代碼週期(編輯期【在IDE中就報錯,無法編譯】,編譯期【在編譯期報錯,無法編譯】,運行期【在執行時出現故障】,非預期【程序可以正常運行,但是運行結果不符合預期】)
最晚操作(故障出現前對代碼做過哪些修改?)
//假設一個經典的數組引用越界異常(引用不存在的數組下標)
故障週期(編譯期)
最晚操作(試圖遍歷一個數組)
How(提問者/解答者)
這個一般是爲了故障的存檔而保存的數據,特別是在一對多或多對多的情況下確定是爲誰解答,向誰提問
提問者:
解答者:
總結
其實這種提問模式不難理解,就是要向解答者(比如老師)傳遞儘可能多的有效信息,從而儘可能的讓解答者更輕鬆的進行判斷
另外,再說一些和3WH無關的東西,就是提問的禮儀:
- 無論解答者是否給出了你滿意的答案,一定要說謝謝,這是禮貌問題
- 向別人請教就需要放低身段,不要倨傲自大
- 別人有不爲你無償解答的權利,很多時候大神也很忙
- 提問前一定一定要事先百度一下,遇事就問絕不是一種好習慣