程序員如何做到『編程速度又快,Bug 數(shù)量又少』?
有網(wǎng)友在 Quora 提問(wèn):如何把自己訓(xùn)練得『編程速度又快,Bug 數(shù)量又少』?下面是 Glyn Williams 的回復(fù)很精彩,4.5 k 贊。
三個(gè)程序員被要求穿過(guò)一片田地,到達(dá)另一側(cè)的房子。
菜鳥程序員目測(cè)了一下之間很短的距離,說(shuō):“不遠(yuǎn)!我只要十分鐘。”
資深程序員看了一眼田地,想了一會(huì),說(shuō):“我應(yīng)該能在一天內(nèi)過(guò)去。”菜鳥程序員很驚訝。
大神程序員看了一眼田地,說(shuō):“看起來(lái)要十分鐘,但我覺(jué)得十五分鐘應(yīng)該夠了。” 資深程序員冷笑了一聲。
菜鳥程序員出發(fā)了,但只過(guò)了一會(huì),地雷爆炸了,炸出了巨大的洞。這下他必須偏移預(yù)定的路線,原路返回,反復(fù)嘗試穿過(guò)田地。最后他花了兩天到達(dá)目的地,到的時(shí)候顫顫發(fā)抖,還受了傷。
資深程序員一出發(fā)就匍匐前進(jìn),仔細(xì)地拍打地面,尋找地雷,只有在安全的時(shí)候才前進(jìn)。他在一天的時(shí)間內(nèi)小心謹(jǐn)慎地緩慢爬過(guò)了這片地,只觸發(fā)了幾個(gè)地雷。
大神程序員出發(fā)之后徑直穿過(guò)了田地,十分果斷。他只用了十分鐘就到了另一邊。
“你是怎么做到的?”另外兩個(gè)人問(wèn)道,“那些地雷怎么沒(méi)有傷到你?”
“很簡(jiǎn)單,”他回答道,“我最初就沒(méi)有埋地雷。”
當(dāng)我們遇到我們(或其他人)給自己埋下的邏輯炸彈,編程會(huì)變得很困難。我們天天在編寫邏輯炸彈。它們就在地表下靜靜地待著,等著爆炸。一旦爆炸,通常就帶來(lái)不可預(yù)測(cè)的嚴(yán)重后果。
隨著新的代碼模塊被加入到項(xiàng)目中,項(xiàng)目的復(fù)雜度會(huì)上升。這種上升不是線性的,而是呈某種指數(shù)形式。
程序員的精力是一種有限的資源,所以這種爆炸式增長(zhǎng)的復(fù)雜度最終會(huì)淹沒(méi)程序員。你的大腦最終會(huì)不堪重負(fù),這是一個(gè)轉(zhuǎn)折點(diǎn)。
這就是炸彈開始爆炸的時(shí)刻。有各種各樣的炸彈:在遍歷時(shí)修改數(shù)組,數(shù)組下標(biāo)偶爾變成負(fù)數(shù),另一個(gè)線程在你的函數(shù)執(zhí)行的起點(diǎn)和終點(diǎn)中間改變對(duì)象的狀態(tài)。轟,轟,轟……
我認(rèn)為最快捷可靠的程序設(shè)計(jì)需要培養(yǎng)一種避免這些問(wèn)題的風(fēng)格。
編寫明確表達(dá)行為的代碼。選擇有意義、準(zhǔn)確、無(wú)歧義的符號(hào)名字。嚴(yán)格執(zhí)行命名方案,不要用不同的單詞描述同一個(gè)事物。
如果有,采用最簡(jiǎn)單的解決方案。不要為速度優(yōu)化,而是為可讀性和透明度優(yōu)化。
如果你在最初編寫代碼時(shí)沒(méi)有注意可重用性,不要欺騙自己相信代碼可以很神奇地被重用。相反,應(yīng)該從一種情形著手,保持代碼的具體性。如果值得修改代碼讓它一般化,那么應(yīng)該做好徹底重寫的準(zhǔn)備。