代碼和bug如影隨形,每一個(gè)應(yīng)用程序都有bug。從理論上講,因?yàn)闇y試無法覆蓋所有情形,所以存在bug的可能性一直有。
水平再高的工程師,也無法一次寫出沒有bug的代碼,更不能一次性修復(fù)所有bug,這和不能一步登天是一個(gè)道理。
從另一個(gè)角度講,程序中的bug有不同的種類,原因也各不相同,甚至可以劃分為三六九等。可以這么說,"不同水平"的bug,一定程度上反映了軟件工程師的專業(yè)水平。
1, 文案bug
這類bug大多可以避免,原因多是因?yàn)榇中摹]有認(rèn)真檢查,或者多次反復(fù)修改文案造成。
2, 代碼級(jí)別的bug
代碼中常見bug很多,比如變量引用錯(cuò)誤、計(jì)算公式錯(cuò)誤,還有常見的異常處理等錯(cuò)誤。
這類問題容易修復(fù),并且能夠通過代碼檢查、功能測試等方式減少甚至避免。
初級(jí)工程師寫代碼時(shí)常犯這類錯(cuò)誤,隨著水平提高和經(jīng)驗(yàn)積累,代碼質(zhì)量逐步提升,bug也就隨之減少。
3, 邏輯錯(cuò)誤
實(shí)現(xiàn)業(yè)務(wù)邏輯時(shí),如果代碼和業(yè)務(wù)需求不一致,比如計(jì)算每月的最后一天,如果使用30天或者31天,都會(huì)引起錯(cuò)誤,因?yàn)槊吭绿鞌?shù)不固定。
那么應(yīng)該如何避免這類bug,又不至于將代碼變得過于復(fù)雜呢?經(jīng)常使用一些數(shù)學(xué)算法、公共代碼庫或者第三方開發(fā)包等。比如上個(gè)例子,可以使用下個(gè)月的1日減去一天,得到本月最后一天。
這類bug經(jīng)常由于測試覆蓋不到而較難發(fā)現(xiàn),比較好的方式通常采用單元測試,覆蓋足夠的業(yè)務(wù)場景,從而保證代碼邏輯符合預(yù)期。
4, 調(diào)用模塊錯(cuò)誤
開發(fā)應(yīng)用系統(tǒng)時(shí),經(jīng)常調(diào)用一些功能模塊,比如Python開發(fā)時(shí)使用的urllib,還有自己開發(fā)的應(yīng)用服務(wù),比如訂單配送管理。
應(yīng)用上線后,業(yè)務(wù)逐漸豐富完善,系統(tǒng)功能越來越復(fù)雜,常常進(jìn)行模塊服務(wù)劃分,然后通過接口調(diào)用協(xié)作。
不同模塊的接口、數(shù)據(jù)、版本不一致時(shí),會(huì)產(chǎn)生一些bug,不僅難于發(fā)現(xiàn),而且較難修復(fù)。這類問題常常需要配合單元測試、自動(dòng)化測試,并在修復(fù)后回歸測試。
為了提高工作效率,自動(dòng)化測試工具配合構(gòu)建服務(wù)器,在每次代碼提交時(shí)或者每天定時(shí)構(gòu)建時(shí),自動(dòng)觸發(fā)任務(wù),確保測試用例覆蓋業(yè)務(wù)場景。
5, 系統(tǒng)集成bug
2020年4月22日,發(fā)生了令人不可思議的中行原油寶穿透事件。原油寶交易系統(tǒng)在提交價(jià)格時(shí),對(duì)負(fù)數(shù)價(jià)格進(jìn)行驗(yàn)證,判定無效,所以也就禁止了進(jìn)一步提交操作。從單個(gè)系統(tǒng)看,這樣做是沒有問題的。
但是還有CME的WTI原油期貨交易系統(tǒng),它是允許負(fù)數(shù)價(jià)格的,這就悲劇了。
4月20日,因?yàn)橐咔閻夯绹推谪浐霞s結(jié)算價(jià)格暴跌,報(bào)出了-37.63美元/桶的歷史性負(fù)數(shù),下跌306%,引爆全球市場。根據(jù)中行4月22日公告,旗下理財(cái)產(chǎn)品原油寶將按照-37.63美元/桶的官方結(jié)算價(jià)定價(jià)。
這意味著投資者所有本金都將蕩然無存,還要倒欠銀行錢。
多個(gè)系統(tǒng)間的bug需要通過完整的用例設(shè)計(jì)來避免,比如中行原油寶,測試要覆蓋到交易所系統(tǒng)的完整用例。






