這是一道關(guān)于符號調(diào)試器實現(xiàn)原理的討論題枢冤。目的不是考察調(diào)試經(jīng)驗或者調(diào)試器設(shè)計,只是想借助這個話題來考察候選人的計算機基礎(chǔ)知識和工作性格铜秆。
一般這樣開頭:有用過調(diào)試器吧淹真?都用過那些功能?接下來和候選人探討調(diào)試器背后的實現(xiàn)原理羽峰,比如如何實現(xiàn)查看變量趟咆,查看內(nèi)存,查看調(diào)用棧梅屉,如何實現(xiàn)斷點等值纱。選擇這個話題的原因之一是有話可說,幾乎所有程序員都有使用調(diào)試器的經(jīng)歷坯汤;其二是絕大多數(shù)人都沒有親自設(shè)計調(diào)試器的機會虐唠,反饋出來的信息能反映候選人的真實水平。
好處之一惰聂,識別沒有鉆研精神的候選人
我理解很多工程師在生產(chǎn)活動中并不使用調(diào)試器疆偿,但是調(diào)試器基本上是初學編程階段的必備工具。在初學者眼中搓幌,調(diào)試器就像一個上帝般的存在杆故,他和我們自己編寫的程序有很大的不同--他能窺探和操縱別的程序。很難想象一個對計算機軟件真正感興趣的程序員從來沒有考慮過這家伙背后的原理溉愁。
如果一個工程師從來不思考調(diào)試器的原理处铛,那么他及有可能也不會去思考數(shù)據(jù)庫的原理,不會去思考操作系統(tǒng)的原理拐揭,甚至也不會去思考經(jīng)常使用的某個第三方庫的原理撤蟆。這些沒有思考過的地方都是他的知識盲區(qū),導致他永遠無法有把握的編程堂污。而且這種候選人有個對工程師來說的致命傷--缺乏主動探索的好奇心家肯。通常進來有什么技能,出去還是那些技能盟猖。
好處之二讨衣,識別基礎(chǔ)知識有瑕疵的候選人
當我們討論如何獲取調(diào)用棧,如何查看變量時扒披,真實的意圖是考察候選人對程序運行時刻環(huán)境的理解值依;當我們討論斷點的設(shè)計時,其實也是在考察類似于中斷/信號這種體系結(jié)構(gòu)/操作系統(tǒng)方面的基礎(chǔ)知識碟案。
這些知識是編寫靠譜軟件最最基本的知識,比數(shù)據(jù)結(jié)構(gòu)還要基礎(chǔ)颇蜡。搞不清楚調(diào)用棧布局的工程師無法理解局部變量寫越界后程序為什么飛到一個莫名其妙的地方价说,因此他很難真正理解安全編程規(guī)范辆亏;而理解了對象運行時形態(tài)的工程師不會無意識寫出故意和垃圾回收做對的代碼;有些工程師在軟件不能正常工作時只能通過不斷回退版本分析代碼文本來定位鳖目,沒辦法拿著core dump直接了當?shù)姆治鰡栴}扮叨,原因就是他腦袋里只有源代碼,沒有程序的運行時模型领迈。這種候選人其實就是所謂的邏輯編程者彻磁,他們認為數(shù)學過關(guān)就能編好程序。
實戰(zhàn)中的反饋
以下是面試過程中收到的一些反饋:
- 如果是嵌入式工程師狸捅,他們會講到JTAG的原理
- 如果是c/c++程序員衷蜓,他們會聊到編譯原理,操作系統(tǒng)尘喝,處理器
- 如果是java或者python程序員磁浇,他們會聊到虛擬機,聊到運行時對象模型
下次招人的時候朽褪,我推薦你不妨也試試這把錘子置吓。它未必能幫你發(fā)現(xiàn)優(yōu)秀的程序員,但是能幫你識別不靠譜的程序員缔赠。
作者的其他文章:為「PPT架構(gòu)師」正名
姊妹篇:一道題識別優(yōu)秀的程序員