
進(jìn)入新公司后,接手小程序3周,接連被”故障”強(qiáng)奸兩次。
?說(shuō)實(shí)話(huà),我到現(xiàn)在內(nèi)心是崩潰的,甚至有點(diǎn)”恐懼”,一聽(tīng)到”故障”我現(xiàn)在都會(huì)手腳出汗。
不過(guò)遇到”故障”,必須要直面面對(duì),這也是開(kāi)發(fā)和成長(zhǎng)的一部分,所以我必須選擇一種直面應(yīng)對(duì)”故障”的方案,因?yàn)橹灰页掷m(xù)開(kāi)發(fā)下去,肯定會(huì)有”故障”出現(xiàn),但是我可以規(guī)避一些”故障”和快速發(fā)現(xiàn)一些”故障”。
(如果目前你也沒(méi)有建立起”故障”的概念,我希望用過(guò)這篇文章能讓你對(duì)”故障”產(chǎn)生一定的意識(shí),因?yàn)檫@對(duì)于你以后可能會(huì)有所幫助。)”故障”,
在每個(gè)公司可能名稱(chēng)不一樣。
我理解的”故障”是bug的升級(jí)版,一般在生產(chǎn)環(huán)境下發(fā)生的問(wèn)題我認(rèn)為叫做”故障”,而在開(kāi)發(fā)環(huán)境下一般叫做bug。
以前所在的公司,因?yàn)橛脩?hù)消費(fèi)行為比較少,對(duì)于”故障”的概念,并沒(méi)有完整意義的理解,也不會(huì)引起代碼本能的意識(shí)。
但是目前的公司,因?yàn)橛脩?hù)量和用戶(hù)行為與消費(fèi)直接掛鉤,一旦發(fā)生故障,就會(huì)對(duì)業(yè)務(wù)產(chǎn)生影響。
故障一般都是從bug隱藏開(kāi)始的,因?yàn)閷?shí)際的生產(chǎn)環(huán)境和開(kāi)發(fā)環(huán)境有著很大的不同,在開(kāi)發(fā)環(huán)境下,不管是程序員本身還是測(cè)試人員,都不能夠覆蓋到所有的bug。
而在生產(chǎn)環(huán)境下,用戶(hù)基數(shù)變大、場(chǎng)景變化以及設(shè)備多樣性還有很多不定項(xiàng)的因素,這些因素都是在測(cè)試環(huán)境下很難模擬的。一經(jīng)生產(chǎn)環(huán)境下一定用戶(hù)的使用,就會(huì)觸發(fā)bug,進(jìn)而影響業(yè)務(wù)進(jìn)行,升級(jí)為”故障”。
這也是為什么產(chǎn)品小步快跑,這樣不僅可以驗(yàn)證產(chǎn)品本身的正確性,也可以在可控范圍內(nèi)查看產(chǎn)品本身是否就具有bug。
有必要說(shuō)一下,在經(jīng)歷了這段恐怖的日子以后,我總結(jié)了幾點(diǎn)規(guī)避”故障”和定位”故障”的經(jīng)驗(yàn)
一 做好足夠的經(jīng)驗(yàn)儲(chǔ)備
(是的 雖然你被強(qiáng)奸了,但是還是要寫(xiě)出你的經(jīng)驗(yàn)!)
這一點(diǎn)我認(rèn)為是最重要的,發(fā)生”故障”雖然恐怖但是可以容忍,
但是再次發(fā)生同樣的”故障”這就是極大的錯(cuò)誤和失敗。
所以,每次發(fā)生”故障”,解決以后,你必須要做好文檔和解決方案的編寫(xiě),避免再次發(fā)生。
具體就是維護(hù)一個(gè)常見(jiàn)的”故障”庫(kù),每次進(jìn)行”故障”review,都要寫(xiě)明”故障”的原因、發(fā)現(xiàn)、解決、規(guī)避的過(guò)程,形成文檔這樣也可以讓這份文檔,成為代碼review、測(cè)試參考、編寫(xiě)規(guī)范的一部分,有效的規(guī)避出現(xiàn)同樣的錯(cuò)誤什么叫做專(zhuān)家? 每行每業(yè)經(jīng)驗(yàn)多了,踩坑填坑填多了就變成了專(zhuān)家。所以經(jīng)驗(yàn)是很重要的,切記切記。
二 收集環(huán)境變量,所謂環(huán)境即用戶(hù)使用的環(huán)境,確定這些環(huán)境是否發(fā)生變化。
(注意查看強(qiáng)奸現(xiàn)場(chǎng), 保存證物)
比如,對(duì)于小程序而言,影響因素有很多,手機(jī)型號(hào)(iOS/Android)、手機(jī)版本(iOS10.0.x or iOS9.x)、微信版本(6.5.4/6.5.6)、小程序的SDK版本等。
我遇到的”故障”中,如果是在全量下發(fā)生的”故障”,基本上可以肯定是代碼錯(cuò)誤或者是邏輯錯(cuò)誤,但是比較難發(fā)現(xiàn)和定位的基本上就是在特定機(jī)型或者特定版本上發(fā)生了”故障”,這點(diǎn)是很痛苦的。


比如在這個(gè)”故障”中,當(dāng)你在輸出超過(guò)4位時(shí),只在Android 微信版本為6.5.6的下才會(huì)被觸發(fā),實(shí)際上很簡(jiǎn)單,只要修改value不再綁定test值即可,這個(gè)在MVVM中很容易出現(xiàn)的”循環(huán)綁定”,但是這個(gè)問(wèn)題卻在其他機(jī)型和系統(tǒng)上不會(huì)出現(xiàn)。
最后,才發(fā)現(xiàn)是因?yàn)榍皫滋煳⑿虐姹旧?jí)后,不再”包容”這個(gè)錯(cuò)誤,然后點(diǎn)燃了這顆”炸彈”。
所以及時(shí)的關(guān)注這些環(huán)境變量,一旦發(fā)生環(huán)境變量變化,自己主動(dòng)去驗(yàn)證在這種環(huán)境變量發(fā)生變化后,程序會(huì)不會(huì)發(fā)生”故障”,及時(shí)發(fā)現(xiàn)及時(shí)修正
三 做好版本管理,發(fā)生故障,切回上一個(gè)版本,看是否是在以往代碼就已經(jīng)存在,縮小”故障”點(diǎn)排查范圍
(及時(shí)的擺正心態(tài),應(yīng)對(duì)強(qiáng)奸)
這一點(diǎn),比較容易理解,不再展開(kāi)。
四 做一個(gè)代碼保守派
(大半夜,別出門(mén)。老老實(shí)實(shí)在家了,減少遇到壞人的幾率)
盡可能使用流行方案編寫(xiě)你的程序,除非你想要嘗試新東西,并且自己有足夠的實(shí)力來(lái)進(jìn)行維護(hù)新庫(kù)。
新的代碼庫(kù),可能引發(fā)一些未知的錯(cuò)誤,所以如果業(yè)務(wù)面向的是用戶(hù),那么選擇一種比較流行的代碼庫(kù)是一個(gè)明智的選擇??梢詤⒖糶ithub的star數(shù),因?yàn)樵绞橇餍械拇a庫(kù),遇到的問(wèn)題、修復(fù)的問(wèn)題、存在的問(wèn)題都會(huì)被及時(shí)有效的控制,你也可以在相關(guān)issue或者社區(qū)中找到解決方案的答案,即使沒(méi)有,你也可以提出問(wèn)題,獲取其他人的幫助。
反觀(guān)新庫(kù),由于種種原因,可能不適合你在生產(chǎn)環(huán)境下使用,風(fēng)險(xiǎn)太大。
但是,對(duì)于你來(lái)說(shuō),如果發(fā)現(xiàn)一個(gè)新代碼庫(kù)比較好,可以嘗試在平時(shí)關(guān)注和提出你的想法,維護(hù)和壯大這個(gè)庫(kù),來(lái)讓大家更放心的使用。
比如小程序中使用”es6-promise”\在OC中使用AFNetworking\在PHP中使用TP\在Node中使用Express等
五 盡可能的自己測(cè)試
(多學(xué)一點(diǎn)防狼術(shù), 遇到壞人,一招斃命)
這一點(diǎn)基本上公司是會(huì)提供支持,不管是QA,還是你需要的設(shè)備已經(jīng)環(huán)境,可以和相關(guān)的人進(jìn)行申請(qǐng),不要認(rèn)為這是在增加你的工作量,相信我,你越是測(cè)試的多,越是能保證你自己的工作進(jìn)度和心情。
為什么不讓QA進(jìn)行測(cè)試?我告訴你,”故障”的直接責(zé)任人是你,但是你可以盡可能的陪同QA進(jìn)行測(cè)試。
關(guān)于修復(fù)”故障”方面
不同技術(shù)有不同的方案
對(duì)于后端來(lái)說(shuō),代碼可以及時(shí)的在服務(wù)器上修正或者回滾
對(duì)于前端來(lái)說(shuō),代碼可以及時(shí)的在服務(wù)器上修正或者回滾對(duì)于
iOS/Andorid, 也有類(lèi)jsPatch(不知道蘋(píng)果爸爸還讓不讓用)的熱修復(fù)方案
我舉的幾個(gè)例子,可能太多以小程序?yàn)槔?,畢竟小程序是一個(gè)特例,發(fā)生故障后,時(shí)間修復(fù)問(wèn)題的時(shí)間是不可控的,因?yàn)楸旧硇〕绦虿恢С譄嵝迯?fù)和回滾版本。
但是對(duì)于小程序,我目前沒(méi)有很好的方案來(lái)做一個(gè)bak方案,如果你有更好的方案,可以留言或者找我,非常感謝。如果代碼強(qiáng)奸了你,別反抗別掙扎,嘗試去享受.
201704061140:翻過(guò)珠穆朗瑪峰,你還害怕阿爾卑斯山嗎?
Di 訂閱號(hào)“小碼消息” - 或許,只有小碼消息才可以拯救中國(guó)程序員