提問的藝術之3WH提問框架

別笑,提問也是一種特殊的技能,我算是見得多了,從高中開始爲各種親戚朋友同學老師修電腦電視洗衣機,真的是感觸良多,剛開始我還認真的排除錯誤,比如任務管理器打不開了,先不說他們不會使用百度,很多人連話都說不明白,於是只能遠程找病毒,真的是一行一行的註冊表在改(誇張修辭)。後來我算是明白了,他們那需要保有數據,於是之後,軟件毛病一律重裝,硬件毛病一律換零件。

但他們大多都是一些非本計算機專業的人,他們又不靠這東西吃飯,而出毛病最多的編程方向,更是有衆多的人說的不知所云,亂七八糟。我隱約記得小學時好像有一個老師給我講過一種學習方法,就是重點是什麼(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無關的東西,就是提問的禮儀:

  1. 無論解答者是否給出了你滿意的答案,一定要說謝謝,這是禮貌問題
  2. 向別人請教就需要放低身段,不要倨傲自大
  3. 別人有不爲你無償解答的權利,很多時候大神也很忙
  4. 提問前一定一定要事先百度一下,遇事就問絕不是一種好習慣
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章