如今的大環(huán)境下,很多企業(yè)還存在著一個(gè)錯(cuò)誤的想法,覺得測(cè)試的崗位沒有開發(fā)重要。認(rèn)為測(cè)試上手快,技術(shù)和經(jīng)驗(yàn)要求低,因此測(cè)試相對(duì)開發(fā)而言會(huì)不受到重視一些。
其實(shí),這樣的想法,對(duì)企業(yè)自身的發(fā)展是很不利的。要知道,一個(gè)產(chǎn)品的質(zhì)量取決于這個(gè)產(chǎn)品鏈上最薄弱的環(huán)節(jié)。如果把程序員比作鑄造城墻的勇士,那測(cè)試員就是作為把關(guān)大門的檢驗(yàn)師,設(shè)計(jì)開發(fā)和測(cè)試是對(duì)等的,設(shè)計(jì)強(qiáng)而測(cè)試弱,產(chǎn)品的質(zhì)量一樣上不去。
軟件的質(zhì)量在很大程度上依賴測(cè)試人員,取決于測(cè)試人員的素質(zhì)和管理者對(duì)測(cè)試的理解。如果不注重這一塊在產(chǎn)品上線時(shí),就很容易發(fā)生問題。近日,就因?yàn)橐粋€(gè)程序Bug,某項(xiàng)目方直接損失了 2.2 億人民幣。
程序Bug,損失2.2億人民幣
前段時(shí)間在NFT圈子里發(fā)生了的一件事,某項(xiàng)目方因?yàn)樽约旱某绦虼a出錯(cuò),導(dǎo)致鎖定的 11539.5 個(gè) ETH(以太坊代幣)無法取出,按照目前的價(jià)格,這些 ETH 總價(jià)值 2.2 億人民幣。
什么是NFC呢,它是一種非同質(zhì)化代幣,屬于區(qū)塊鏈領(lǐng)域的一種應(yīng)用, 可以理解為一種虛擬的數(shù)字資產(chǎn)。比如你買了一張NFC的頭像,那這張圖片的所有權(quán)就是你的了。
而這次出事的是一個(gè)叫 Akutar的 NTF 項(xiàng)目方,他們發(fā)起了一個(gè) NFT 產(chǎn)品售賣,為了激勵(lì)用戶早點(diǎn)下單,其采用的是由高到低出價(jià)的拍賣方式,也就是假設(shè)一件產(chǎn)品的定價(jià)是 10000 元,想買入的就直接按照這個(gè)價(jià)格下單。如果最終成交價(jià)是 8000 元,那項(xiàng)目方會(huì)退你 2000 元。
很快,這個(gè)項(xiàng)目就完成了預(yù)定銷售額,之后就是項(xiàng)目方需要履行后續(xù)的環(huán)節(jié),退款和提現(xiàn),也就是項(xiàng)目方需要先退回最終成交價(jià)和定價(jià)之間的差額給用戶,然后才能自己提走項(xiàng)目售賣收益。
而為了讓客戶安心,項(xiàng)目方在智能合約里規(guī)定了需要先完成差價(jià)退款才能提現(xiàn)。而就是這份智能合約中的代碼中的判斷條件,出現(xiàn)了問題。
在智能合約代碼里就有這么一個(gè)判斷條件。
懂點(diǎn)技術(shù)的讀者知道,這是一段函數(shù)代碼,這個(gè)函數(shù)的作用是項(xiàng)目方用來提現(xiàn)的。
其中被紅框標(biāo)記起來的是一個(gè)判斷條件, refundProgress >= totalBids,問題也恰恰出在這里。
按照定義,變量 refundProgress 表示 已經(jīng)完成的用戶退款數(shù),而變量 totalBids 表示 所有用戶下單的 NFT 總數(shù)。
因?yàn)橐粋€(gè)用戶可以購(gòu)買多個(gè) NFT,所以 totalBids 的數(shù)值一定是大于或等于 refundProgress 的。
也就是說,不可能出現(xiàn)像智能合約代碼中 refundProgress >= totalBids 的情況。
因此,當(dāng)代碼執(zhí)行到這里的時(shí)候,這個(gè)判斷條件始終不會(huì)成立,后面的合約代碼就無法執(zhí)行。
看懂的讀者應(yīng)該知道了,這個(gè) Bug 的關(guān)鍵點(diǎn)就是這兩個(gè)變量之間的判斷符號(hào)寫反了。
程序員寫的是 >=,而正確的應(yīng)該是寫成 <=。用戶無法獲得退款,項(xiàng)目方也無法提現(xiàn)。
對(duì)用戶來說,雖然不能獲得退款,但至少還是買到了 NFT。但對(duì)于項(xiàng)目方來說, 這價(jià)值 2.2 億人民幣的收益就直接被永久鎖定了,無法提走。
對(duì)于項(xiàng)目方而言,就像拿了一個(gè)永遠(yuǎn)無法打開的巨額錢包,一個(gè)符號(hào),價(jià)值 2.2 億,可以說是一個(gè)驚天Bug 了。
而這個(gè)失誤,則和上線前沒有精準(zhǔn)測(cè)試有關(guān),項(xiàng)目方認(rèn)為能夠跑通全流程就可以了,這也是沒有進(jìn)行極端情況測(cè)試所留下的弊端。
因Bug虧損30億、致6人死亡
其實(shí)這件事不是個(gè)例,近幾年因?yàn)槌绦?Bug 導(dǎo)致產(chǎn)品重大損失的案例并不在少數(shù)。
幾個(gè)歷史數(shù)據(jù)轉(zhuǎn)儲(chǔ)邏輯Bug或發(fā)貨邏輯Bug,就能讓幾十萬輕松蒸發(fā):
還有因?yàn)閷懗鯞ug差點(diǎn)進(jìn)去的,有碼農(nóng)表示自己參與開發(fā)的一款發(fā)薪軟件曾出現(xiàn)Bug,會(huì)導(dǎo)致發(fā)放的薪資變成雙倍,總共能多發(fā) 2000多萬。
當(dāng)時(shí)查出Bug的時(shí)候發(fā)薪單已經(jīng)生成,就差批量任務(wù)向銀行發(fā)起請(qǐng)求了。
而縱觀全球性的Bug所帶來的損傷更是難以估量。比如在1996年,歐洲運(yùn)載火箭Ariane 5在發(fā)射37秒后當(dāng)場(chǎng)爆炸。
一瞬間, 70億美元的開發(fā)費(fèi)用白費(fèi), 5億美元的設(shè)備原地蒸發(fā)。
這一切都由一個(gè)整數(shù)溢出 (Integer Overflow)的Bug引起。
有時(shí),甚至?xí)硪馔馑劳觥?/div>
1985年到1987年間,由加拿大AECL公司開發(fā)的Therac-25放射線療法機(jī)器在軟件互鎖機(jī)制上出現(xiàn)了Bug,從而使輻射能量變成了正常劑量的 100倍。
最終,至少有6名來自美國(guó)和加拿大地區(qū)的患者由于遭受 過量輻射而意外死亡。
種種案例,都無不告訴我們,在項(xiàng)目上線前,找一個(gè)靠譜的測(cè)試團(tuán)隊(duì)是多么重要,為了省錢而省去一些步驟,可能只會(huì)挖出更大的坑。
軟件測(cè)試的重要性
有很多比較小的企業(yè)認(rèn)為,測(cè)試的工作可以由開發(fā)一并兼容了,但其實(shí)很多時(shí)候從開發(fā)人員的角度會(huì)比較難發(fā)現(xiàn)產(chǎn)品出現(xiàn)了問題,這個(gè)道理很簡(jiǎn)單,因?yàn)殚_發(fā)人員是制造者,而不是使用者。很多軟件人員除了編譯自己的軟件外,從來不使用自己寫的軟件。這樣,他們根本不知道自己寫出來的東西究竟好不好。
生產(chǎn)者很難客觀地審查和評(píng)價(jià)自己辛苦創(chuàng)造的東西,所以他們對(duì)自己的產(chǎn)品不如使用者了解。
而測(cè)試人員在長(zhǎng)時(shí)間的測(cè)試過程中,逐漸了解了軟件和系統(tǒng)存在的各種問題,對(duì)可能出現(xiàn)的問題更加敏銳。那些架構(gòu)師們也許只需要花上半天時(shí)間,找測(cè)試人員聊聊,就知道自己設(shè)計(jì)出來的東西有多么大的問題了。
因此對(duì)于很多企業(yè)而言,提高測(cè)試人員的責(zé)任感和素質(zhì),對(duì)于提升產(chǎn)品質(zhì)量是很重要的。并且,測(cè)試人員是其中非常重要的一個(gè)組成,他們不僅僅是測(cè)試的執(zhí)行者,更是理解需求,審查需求分析,討論軟件架構(gòu),尋找系統(tǒng)瓶頸的重要參與者,更是用戶的代言人。
寫在最后
當(dāng)然,我們不難發(fā)現(xiàn),伴隨著互聯(lián)網(wǎng)行業(yè)的發(fā)展,高水平的測(cè)試工程師在企業(yè)中的地位越來越重要,越來越被認(rèn)可。
所以可以預(yù)測(cè)的是,在未來,測(cè)試人員的需求也會(huì)不斷增加,希望大家能夠不斷提升技能、掌握最新技術(shù)需求,在測(cè)試崗位上有更深遠(yuǎn)的發(fā)展。
(責(zé)任編輯:代碼如詩(shī)) |