千里之堤溃于蚁穴,质量问题警钟长鸣
千里之堤潰于蟻穴,質(zhì)量問題警鐘長鳴
是能用就行,還是精益求精?
水文一篇,一點(diǎn)點(diǎn)小感慨。事情緣由如下:
緣起
早上來,打開代碼就看到了一個(gè)提交。
改動(dòng)上沒啥問題,不過用到了 ES2015 的新語法,老舊瀏覽器上語法不識別,會(huì)直接導(dǎo)致整個(gè)文件掛掉,馬上通知了開發(fā)立即修復(fù)。
之所以對這個(gè)問題這么敏感。
其一是這真的是一個(gè)嚴(yán)重的問題,甚至可以說是事故。因?yàn)椴恍捱@個(gè)bug好歹是在特定的場景下才會(huì)發(fā)生,這個(gè)會(huì)直接導(dǎo)致特定瀏覽器中整個(gè)應(yīng)用直接完全崩掉。如果用受眾來對比的話,就是不改的情況下,只是一部分用戶在一部分場景下出問題;改了之后則是,一部分用戶整個(gè)系統(tǒng)直接完全無法使用。
其二則是因?yàn)?6年剛?cè)肼毜臅r(shí)候,一位公司前輩的給我留下的印象,當(dāng)時(shí)我雖是初入前端,但那會(huì)前端都不是個(gè)部分,甚至只是一個(gè)小組,我作為專業(yè)前端的產(chǎn)出物,被非前端專業(yè)人士發(fā)現(xiàn)了bug。當(dāng)時(shí)出問題的代碼大概是 {default:"某個(gè)值"} ,你可能看不出問題,這里實(shí)際是default 是保留關(guān)鍵字,某些瀏覽器中不能直接當(dāng)成key值,如果要用得這樣寫 {"default":"某個(gè)值"} 或者是 var obj = {}; obj["default"] = "某個(gè)值" ,取值、賦值均一樣。 這件事之所以印象深刻,是因?yàn)楫?dāng)時(shí)對方不是系統(tǒng)掛了發(fā)現(xiàn)的,而是直接搜索得出的,我當(dāng)時(shí)問你還這么細(xì)心 ,對方說“被你們前端坑的次數(shù)多了,就得長點(diǎn)心”。 這點(diǎn)當(dāng)時(shí)對我觸動(dòng)非常大,因?yàn)榇_實(shí)很清楚事情的影響面,那會(huì)IE8還是比較常見的。
這次的“事故”雖然很快修復(fù)了,但還是造成了真實(shí)的影響。
想著我們是有代碼檢查的,都用3年了,這個(gè)代碼里理論上是根本提交不了的才對。 做了自查才發(fā)現(xiàn)原來我們在自己的倉庫開發(fā)再將構(gòu)建產(chǎn)物放入框架,大約半年前,我們的源碼也遷移到了框架的倉庫,漏了將檢測的工具遷移過來。
然而就是這個(gè)疏漏,不經(jīng)意間不知道已經(jīng)引入了多少風(fēng)險(xiǎn)。
再繼
接著下午的時(shí)候評審了一個(gè) merge_requests
其實(shí)這個(gè)如果單純從測試提的 bug 場景來說,提交的代碼是解決問題的。
但是他能想到加個(gè) if 分支,就沒有想到“即使有成員,也不一定有四個(gè)成員”嗎? 我覺得肯定有意識到,只是從直覺中覺得沒有必要不會(huì)遇到,心里可能在假設(shè)真實(shí)的場景要么就有要么就沒有,不會(huì)只有一部分。
但是作為開發(fā)者,有個(gè)常識叫一切客戶端輸入都不可信。做框架做組件做底層來說,你怎么知道別人會(huì)怎么來用這個(gè)東西呢,會(huì)給它提供什么樣的輸入呢?基于這些,所以我給了上面的建議。
本文打算再次強(qiáng)調(diào)下下面幾點(diǎn),是希望每一個(gè)人都能在開發(fā)過程中及時(shí)地去處理掉發(fā)現(xiàn)的問題。
- 修復(fù) bug 要抓住本質(zhì),不要無腦往上堆。
- 過程中要不斷對代碼進(jìn)行重構(gòu)。
- 如果一定有問題,請將問題暴露出來,而不是藏起來,假裝它不存在。
寫到這里,又想起一件事:
之前某個(gè)頁面上的某個(gè)按鈕功能不能用了,有人找到我排查。最終發(fā)現(xiàn)是 js 代碼和頁面都不匹配了。
幾經(jīng)溝通,找到了調(diào)整的人員,答復(fù)是: 這個(gè)頁面不用了,遷移到了新的頁面,系統(tǒng)內(nèi)是調(diào)整過的,這里的問題可能是外部直接引用了這個(gè)地址,從而引發(fā)的錯(cuò)誤。
我的建議是:
- 不用就刪,反正不能正常用的。 這只是一個(gè)頁面,不是底層庫,只影響一個(gè)頁面,不能用對方能馬上發(fā)現(xiàn)問題,這樣看起來正常,用到才會(huì)發(fā)現(xiàn)問題,溝通和排查都是很高的成本。
- 原頁面直接提示已經(jīng)棄用請使用xxx,或者干脆直接重定向到新的頁面去,來實(shí)現(xiàn)外部的無縫切換。
后記
程序員中經(jīng)常流傳一句話,說自己維護(hù)的“屎山”代碼,這可能是想表達(dá)之前的代碼很爛吧。
假設(shè)我們不得不面對這樣“不好”的東西,我們應(yīng)該如何處理呢?我認(rèn)為底線就是做好隔離不讓它污染和擴(kuò)散到更多的地方,更好點(diǎn)呢可能是要想辦法把這個(gè)玩意清理干凈。畢竟誰家都有衛(wèi)生間不是?它不僅很有用也可以很干凈。
不過想想一直圖這么吐槽的這些人又是怎么對待“屎山”的呢?可能最常見的就是繼續(xù)在“屎山”上拉吧。如果這樣,他又有什么資格這樣說呢?
可現(xiàn)實(shí)的問題是那真的是“屎山”嗎? 你真的就寫得更好嗎?甚至你能寫得出來嗎?
可怕的不是“屎山”,可怕的是繼續(xù)在“屎山”上拉,可怕的是自己成為制造“屎山”的人。
你寫的每一行代碼都是你的名片
愿與諸君共勉。 你不是碼農(nóng),你不是程序員,你是開發(fā)者,你是研·發(fā)·工·程·師,愿你在成長的時(shí)候,你寫代碼也在伴隨著你一起成長。
總結(jié)
以上是生活随笔為你收集整理的千里之堤溃于蚁穴,质量问题警钟长鸣的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AtCoder Beginner Con
- 下一篇: 从GPT定制到Turbo升级再到Assi