程序員解決問(wèn)題的 60 個(gè)策略
根本的指導(dǎo)方針
1. 首先寫(xiě)代碼的時(shí)候***不要有缺陷。***的修復(fù)方法就是讓 bug 胎死腹中。
良好的單元測(cè)試
強(qiáng)制數(shù)據(jù)庫(kù)約束
使用輸入驗(yàn)證框架
避免未實(shí)現(xiàn)的“else”條件
在應(yīng)用到主程序之前知道如何在孤立的情況下使用
日志
2. print 語(yǔ)句。往往額外輸出個(gè)一兩行將有助于隔離問(wèn)題。
3. 切換至詳細(xì)的日志記錄。詳細(xì)的日志記錄有助于發(fā)現(xiàn)更多的線(xiàn)索。
4. 搜索日志。如果日志太多,可采取關(guān)鍵字或錯(cuò)誤代碼來(lái)搜索日志文件。
5. 開(kāi)啟自動(dòng)換行和關(guān)閉自動(dòng)換行??刂迫罩镜淖詣?dòng)換行也非常有用。
6. 搜索不同的日志。主服務(wù)器的日志可能并不是唯一有用的日志。
7. Windows 事件日志。日志文件的另一個(gè)來(lái)源可能是操作系統(tǒng)本身。
8. 制作有用的日志記錄。有時(shí),如果你沒(méi)有得到任何有用的日志記錄,那么你可能需要自己寫(xiě)。
與其他人交流
9. 詢(xún)問(wèn)一些可能知道問(wèn)題答案的人。
10. 問(wèn)”愚蠢“的問(wèn)題。可能你覺(jué)得這些問(wèn)題很愚蠢,但其實(shí)并不是。
11. 將問(wèn)題解釋給隊(duì)友。他們可能知道答案或者能提出一些你并沒(méi)有想到過(guò)的事情。
12. 將問(wèn)題解釋給你的狗。述說(shuō)的對(duì)象是誰(shuí)其實(shí)沒(méi)有關(guān)系,但是能讓你從不同角度分析問(wèn)題。
寫(xiě)作
13. 描述問(wèn)題。用最準(zhǔn)確和最精確的語(yǔ)句描述問(wèn)題,有助于你去思考可能的解決方案。
14. 問(wèn)題日記。創(chuàng)建一個(gè)文本文件來(lái)記錄已經(jīng)嘗試的各種方法,包括代碼片段、配置設(shè)置以及產(chǎn)生的任何錯(cuò)誤。
15. 記錄問(wèn)題和解決方案。有沒(méi)有這樣的情況,突然看到一個(gè)似曾相識(shí)的問(wèn)題,只記得解決過(guò)但卻忘記了是如何解決的?可以將問(wèn)題和解決方案記錄到一個(gè)容易搜索的地方,如維基、缺陷跟蹤,甚至可以發(fā)送電子郵件給自己。
支持
16. 閱讀 FAQ。
17. 提交支持請(qǐng)求。如果有可用的產(chǎn)品/庫(kù)的支持,那么就用。
18. 在你點(diǎn)擊 send 之前,請(qǐng)三思。寫(xiě)支持請(qǐng)求能讓你再一次思考問(wèn)題,有時(shí)候就在你點(diǎn)擊 send 按鈕之時(shí),突然靈機(jī)一動(dòng)就想到了解決問(wèn)題的方法或者是新的線(xiàn)索。
19. 其他方面的支持??梢耘c開(kāi)發(fā)人員直接面對(duì)面交流,***是實(shí)時(shí)聊天/ SKYPE/屏幕共享。
離開(kāi)鍵盤(pán)
20. 散散步。
21. 打個(gè)盹。
22. 重置優(yōu)先級(jí)。暫時(shí)從鍵盤(pán)上離開(kāi)還有一個(gè)好處就是可以讓你重新評(píng)估這個(gè)問(wèn)題的重要性,也許這個(gè)問(wèn)題只是個(gè) CSS/布局問(wèn)題,根本不值得你花上 16 個(gè)小時(shí)。總之要有效分配和使用時(shí)間。
23. 暫時(shí)將這個(gè)問(wèn)題放在一邊。實(shí)在解決不了的話(huà),可以將這個(gè)問(wèn)題先擱置起來(lái)。也許幾天后你在閱讀相關(guān)問(wèn)題的時(shí)候,突然一個(gè)激靈,解決問(wèn)題的關(guān)鍵就來(lái)了。
隔離
24. 確定是哪行代碼。首先要確定是哪行代碼導(dǎo)致的問(wèn)題,以便于插入 print 語(yǔ)句。
25. 將問(wèn)題分割為一個(gè)單獨(dú)的程序。有時(shí)候?qū)τ趲?kù)和產(chǎn)品的問(wèn)題,我們可以將它的相關(guān)代碼從主程序中分離開(kāi)來(lái)。這可能需要一點(diǎn)時(shí)間,但往往處理一個(gè)孤立的程序比應(yīng)對(duì)整個(gè)的項(xiàng)目構(gòu)建過(guò)程要容易得多。然后在解決這個(gè)單獨(dú)程序的基礎(chǔ)上再去和主程序作比較。
更改代碼
即使你一點(diǎn)都不知道如何解決問(wèn)題,更改代碼也是一個(gè)挺有效的解決方法。
26. 寫(xiě)新的單元測(cè)試。
27. 重構(gòu)。有問(wèn)題的代碼往往顯得有點(diǎn)亂,通過(guò)一些簡(jiǎn)單的重構(gòu)方法,例如重命名變量或展開(kāi)嵌套的 if / then/ else 模塊等都可以讓代碼整潔起來(lái)。
28. 發(fā)現(xiàn) bug。另一個(gè)整潔代碼的手段是查閱相關(guān)代碼的“Find Bugs” 報(bào)告,我們之所以首先要整潔代碼是因?yàn)椋鹤鳛橐粋€(gè)能讓我們的大腦專(zhuān)注于代碼的方法,既簡(jiǎn)單又劃算。
29. 重寫(xiě)。轉(zhuǎn)存所有的相關(guān)代碼,從頭開(kāi)始重寫(xiě)。一個(gè)全新的視角也許能讓你完全規(guī)避這個(gè)問(wèn)題。
30. 為一些不必要的代碼添加注釋——或者至少是你以為是不必要的。然后你會(huì)發(fā)現(xiàn)可能這些代碼流并不像你曾經(jīng)以為的那樣“沒(méi)有必要”。
31. 實(shí)驗(yàn)。如果你不能確定底層產(chǎn)品或庫(kù)是如何工作的,那么一些小實(shí)驗(yàn),特別是圍繞邊界條件的實(shí)驗(yàn)會(huì)非常有用。
32. 回到干凈的狀態(tài)。如果你在代碼中做了各種變動(dòng),或者是搞了很多配置設(shè)置,那么定期回到一個(gè)干凈的狀態(tài)就非常重要。否則,實(shí)驗(yàn)結(jié)果可能會(huì)影響正確答案,這樣你就永遠(yuǎn)也找不到正確的解決方案了。
33. 切換技術(shù)。
產(chǎn)品
34. 升級(jí)到更高的版本。也許你正在處理的問(wèn)題已經(jīng)被修復(fù)了,可以試試先升級(jí)到另一個(gè)版本。
35. 降級(jí)到以前的版本。也許問(wèn)題正是由于與你目前正在使用的其他產(chǎn)品/庫(kù)不兼容而引起的。
36. 打補(bǔ)丁。
37. 下載并安裝源代碼。
文件
38. 閱讀手冊(cè)。大多數(shù)開(kāi)發(fā)人員可能會(huì)認(rèn)為這是一個(gè)低概率的策略,但是,嘿嘿,你永遠(yuǎn)不知道,也許答案就在文檔中。
39. 閱讀手冊(cè)的正確版本。
40. 手冊(cè)是否正確?有時(shí)候代碼已被更新,但手冊(cè)還沒(méi)有。
調(diào)試器
41. 了解鍵盤(pán)上的快捷鍵。
42. 倒退。這是調(diào)試器的一個(gè)功能,讓你的代碼退后一步。
43. 編寫(xiě)斷點(diǎn)代碼。
44. 異常中斷。調(diào)試器的一個(gè)蠻有用的功能就是可以捕捉到任何地方的特定異常。
45. 專(zhuān)業(yè)化的調(diào)試工具。例如:
Plumbr
AppDynamics
Chronon
Wireshark
HTTP profilers:Fiddler2、Charles、Live Http Headers
源代碼控制
46. 對(duì) bug 缺陷進(jìn)行編號(hào)標(biāo)記。你有沒(méi)有碰到過(guò)這樣的問(wèn)題:先是用這種方式被修復(fù)了,然后幾周后又成為了 bug 被其他人用另一種方法修復(fù)了。這樣問(wèn)題貌似就有兩個(gè)正確答案。解決辦法就是對(duì)源代碼中相關(guān)的 bug 缺陷進(jìn)行標(biāo)記,并記錄一些關(guān)于為何改變以及誰(shuí)參與決策等更為詳細(xì)的說(shuō)明。
47. Blame 功能。這個(gè)可愛(ài)的小工具能告訴你是誰(shuí)***更改的代碼。
48. Git bisect 功能。Git 有一個(gè)有意思的“bisect”命令,能自動(dòng)通過(guò)你提交的歷史進(jìn)行二進(jìn)制搜索發(fā)現(xiàn)故障。
尋找答案
49. 谷歌搜索。
50. 論壇帖子。
52. 搜索堆棧交流。
53. 創(chuàng)建堆棧問(wèn)題。
其他
54. 聘請(qǐng)專(zhuān)家??赡茉诙虝r(shí)間內(nèi)成本很高。
55. 招實(shí)習(xí)生。聘請(qǐng)專(zhuān)家的相反方法就是聘請(qǐng)新手。有時(shí)候初學(xué)者飽滿(mǎn)的熱情能讓他們從不同的角度來(lái)解決問(wèn)題。
56. 改變要求。如果你不能修復(fù)缺陷,那么可以改變要求。通過(guò)解釋各種成本需要,也許能讓客戶(hù)改變他們的初衷。
57. 更改上/下游系統(tǒng)。
58. 循序漸進(jìn)地學(xué)習(xí)技術(shù)。
59. 通過(guò)斷點(diǎn)檢查配置。更改關(guān)鍵配置值,并確保已經(jīng)斷點(diǎn),這樣能夠讓我們無(wú)所顧忌地設(shè)置配置。
60. 系統(tǒng)化。有時(shí)候我們需要將三四件事情組合在一起,那么可以將已經(jīng)試過(guò)的組合記錄下來(lái),如果需要的話(huà)一定要嘗試各種的組合。