標籤:

對一個bug的深度思考

程序員,是指從事代碼編寫相關工作的人。

寫程序,是指通過人來編寫命令控制計算機運行。這個多年前只有科學家才能幹的事情,隨著科學技術的不斷發展,越來越普及。可謂:舊時王謝堂前燕,飛入尋常百姓家。

bug本意為臭蟲,是指潛伏在程序命令中的問題,像臭蟲一樣可惡,所以程序界以這個意為程序中的問題。

bug也像幽靈一樣,讓每個程序員如坐針氈、如履薄冰。

怎麼認識bug?

首先,它是一個客觀的存在,絕對的唯物。也就是,我們首先要認識到:程序員出bug並不可恥,原因當然很顯然,人哪有不出錯的時候呢?既然是客觀存在的,我們怎麼來對待bug這種事物? 接下來的態度有幾種: ①.極端的剋制出現 ②.相殺相愛 ③.習以為常 這是和bug三種的相處狀態。先說第一種:既然出現在所難免,但我們是可以做到盡量少的。極端的剋制bug的出現,首先是一種處事的態度。有些人利用更多休息時間能讓自己維護的代碼bug極少出現,剋制自己不要好大喜功,一件件事在客觀規律周期內做好。更有甚者,就算時間周期有限也可以高質量無bug情況下完成任務。這類人,有態度,有擔當。優秀的程序員,多半從這類人群中誕生。 第二種程序員對待bug的態度是相殺相愛,很憎恨但可容忍。顯然,相對第一種人他們態度是明確的,但錯誤也是要犯的。而且這類人群很大。原因也很簡單,多數人都很懶,這東西和聰明程度沒啥關係。所以寫代碼的時候可以普普通通搞架構,普普通通想演算法,普普通通寫代碼。完事之後發現:唉?這東西居然有問題?先忍忍,先忍忍,自己默念幾分鐘之後解脫了自己。這個不可怕,但可怕的事,他最後忘了這件事...最後居然很坦然的把問題埋藏在內心深處,不出大問題,永遠不去解決。其實程序員把功能做完是知道哪兒有坑的,只是經過測試了,他認為這東西測試都沒出現,抱著僥倖心理,結果某個時候就捅個大簍子!第三類人,對bug習以為常。聽起來簡直無法忍受是不是?是的,這類人很多。在他們腦海里,出現bug正常啊,不寫幾個bug都沒存在感。甚至為了實現一個功能不惜留下很多坑。為了所謂的搶時間,趕快上一個功能,留下一堆關於修復bug的故事。這個問題是要深思的: 要麼這個功能在客觀情況下根本完成不了老闆讓你搞,是老闆的問題。要麼這東西你知識面太窄想的太簡單,你自己的問題。要麼好高騖遠好大喜功的去刷存在感,也是你自己的問題。這類人不會算賬,你的能力是1天寫個功能,非得半天寫完。最後又用了1天解決bug。最後時間多花了,自己的口碑下去了,對外項目口碑下去了。多方面都有問題,很多情況下,管理者不自省、程序員不自省。長期以往,市場會給你反饋是一條負斜率的曲線,而且不可逆。

怎麼處理bug?

優秀的程序員,是真正把bug當做臭蟲的,他們眼睛裡留不得這粒沙子。所以,他們會極端的剋制bug的出現。就算出現了,他們也可能寢食不思的就因為這粒沙子的存在。這東西不需要有多聰明,是一種態度。其實一個bug的出現,是給你了一次機會,一次層次越級的機會。工程師的本質工作是解決問題的,出現問題不解決是可恥的。當一個bug出現的時候,首先要查明原因。這個步驟,就像偵探分析案情的過程。是對你判斷定位能力的考驗。很多時候,解決起來代碼幾行,但是查問題用了幾小時。這裡考驗了你幾點:對自己寫過的代碼的再思考的能力、邏輯思考能力。好的程序員:根據問題出現的場景,第一感覺就可以定位到是哪個模塊的什麼文件出了問題。如果你做不到,就可能對代碼不夠熟悉,對使用的框架理解有問題。問題出現之後,接下來思考一下怎麼來解決,這裡是普通程序員和優秀程序員升級的分水嶺。為什麼一個簡單的bug就是你技術提升的機會呢? 普通的人會想我堵住這個窟窿就可以了,所謂解決了一個bug,可量化的出現在你的工作報告中。但優秀的人是可以看透這個bug背後的問題,比如架構是不是有問題?演算法是不是有問題?使用的框架是不是有問題? 根據經驗,一般此時是可以成長的最快的機會。如果你看到了架構出了問題,你敢不敢給他重構換一種更好更穩當的架構? 如果演算法出了問題,你敢不敢去研究新的演算法替換掉它? 如果你敢去這麼做了,假以時日,你不想成為高手都難。但絕大多數人,原地的修復了這個窟窿再也沒有前行,由此失去了成為高手的可能。人最害怕的是偏平的做一件件重複的事情,且自我認為做的多就是好。你解決了1000個bug,和你寫一個框架的更新誰的技術含量更高呢?一個非常簡單的問題。

深度處理bug,需要做好這幾點。一.面向技術方案解決問題。不要面向問題本身,問題的出現,有其必然原因。此時多思考,把解決一個問題解決成一個方案。 二.按理想設想來設計技術方案。如果本身技術方案或者框架出現了問題,理解它的前提下。按最優化的理想方案畫出方案圖。這樣才能跳出原來的圈子,這才是真正的思考方式。 三.按工程思維來實施方案。架構裡面有很重要的一種思維是面向領域建模。用在實際中是一樣的,它的思路不一定是一個很大的系統。分解成某個領域內也可以被分割成某個領域。試著想想如果在理想情況下出了一種技術方案或者框架,本次由於工程上時間上的要求無法完成怎麼辦?很簡單,把理想情況下適合當下的領域的工作完成。通俗一點就是常說的把這個場景的粒度分離出來,留個介面,共外面使用就好了。以後再持續的在整體理想的設想框架內其它方面逐步按這個邏輯完成即可。所以,小小一枚bug。認真處理了,一個新的技術創新點可能被激發;一個新專利可能誕生;一次新的架構升級可能由此起航。

常有人說:「所有的成長,都是反人性的」。反在需要你需要克服懶惰、慾望和更加勤奮的思考、執行。「成功都是從小事做起」,做為程序員,我想沒有比bug更小的事情了吧。

以上,與君共勉。

2018.9.12 13:30

推薦閱讀:

TAG:Bug |