7
| 本文作者: 知社學(xué)術(shù)圈 | 2015-12-04 14:29 |
在現(xiàn)今數(shù)字年代,計(jì)算機(jī)bug不但困擾著每個(gè)程序員,更會無可避免影響我們的生活,小到每個(gè)人的衣食住行,大到國家經(jīng)濟(jì),世界局勢。隨著我們的生活方式漸漸的數(shù)字化、互聯(lián)網(wǎng)化,數(shù)字世界的找蟲和殺蟲就變得越來越重要。
軟件史上有哪些著名的bug呢?讓我們一起來回顧一下:
(軟件史上第一蟲)
1947年9月9日下午3點(diǎn)45分,Grace Murray Hopper在她的記錄本上記下了史上第一個(gè)計(jì)算機(jī)Bug——在Harvard Mark II計(jì)算機(jī)里找到的一只飛蛾,她把飛蛾貼在日記本上,并寫道”First actual case of bug being found”。這個(gè)發(fā)現(xiàn)奠定了Bug這個(gè)詞在計(jì)算機(jī)世界的地位,變成無數(shù)苦逼程序員的噩夢。 從那以后,Bug這個(gè)詞在計(jì)算機(jī)世界表示計(jì)算機(jī)程序中的錯(cuò)誤或者疏漏,它們會使程序計(jì)算出莫名其妙的結(jié)果,甚至引起程序的崩潰。Grace Murray Hopper是歷史上最早一批程序員,而且還是個(gè)女程序員,服役于美國海軍,官至準(zhǔn)將。
這是流傳最廣的關(guān)于計(jì)算機(jī)Bug的故事,可是歷史的真相是,Bug這個(gè)詞早在發(fā)明家托馬斯·愛迪生的年代就被廣泛用于指機(jī)器的故障,這在愛迪生本人的1870年左右的筆記里面也能看得到。而電氣電子工程師學(xué)會IEEE也將Bug這一詞的引入歸功于愛迪生。
(1999年給了嘩眾取寵的雜志小報(bào)極好的題材)
在上個(gè)世紀(jì),軟件業(yè)者從來沒想過他們的代碼和產(chǎn)品會跨入新千年。因此,很多軟件業(yè)者為了節(jié)省內(nèi)存省略掉代表年份的前兩位數(shù)字”19”,或者默認(rèn)前兩位為”19”。
而當(dāng)日歷越來越接近1999年12月31日時(shí),人們越來越擔(dān)心在千禧年的新年夜大家的電腦系統(tǒng)都會崩潰,因?yàn)橄到y(tǒng)日期會更新為1900年1月1日而不是2000年1月1日,這樣可能意味著無數(shù)的災(zāi)難事件,甚至是世界末日。
到今天,我們可以調(diào)侃這個(gè)滑稽的故事,因?yàn)楹藢?dǎo)彈并沒有自動發(fā)射,飛機(jī)也沒有失控從天上掉下來,銀行也沒有把國家和用戶的大筆存款弄丟。
千年蟲Bug是真實(shí)的,全球花了上億的美金用來升級系統(tǒng)。而且,也發(fā)生了一些小的事故:
在西班牙,停車場計(jì)費(fèi)表壞了;法國氣象局公布了19100年1月1日的天氣預(yù)報(bào);在澳洲,公共汽車驗(yàn)票系統(tǒng)崩潰。就這樣而已。最后盤點(diǎn)的結(jié)果是軟件公司賺了大錢,八卦小報(bào)銷量大增,很多程序員的千禧年夜party泡湯了,幾個(gè)中國文盲老太太被人騙了養(yǎng)老金,不可謂不嚴(yán)重。
在1991年2月的第一次海灣戰(zhàn)爭中,一枚伊拉克發(fā)射的飛毛腿導(dǎo)彈準(zhǔn)確擊中美國在沙地阿拉伯的宰赫蘭基地,當(dāng)場炸死28個(gè)美國士兵,炸傷100多人,造成美軍海灣戰(zhàn)爭中唯一一次傷亡超過百人的損失。
在后來的調(diào)查中發(fā)現(xiàn),由于一個(gè)簡單的計(jì)算機(jī)bug,使基地的愛國者反導(dǎo)彈系統(tǒng)失效,未能在空中攔截飛毛腿導(dǎo)彈。當(dāng)時(shí),負(fù)責(zé)防衛(wèi)該基地的愛國者反導(dǎo)彈系統(tǒng)已經(jīng)連續(xù)工作了100個(gè)小時(shí),每工作一個(gè)小時(shí),系統(tǒng)內(nèi)的時(shí)鐘會有一個(gè)微小的毫秒級延遲,這就是這個(gè)失效悲劇的根源。愛國者反導(dǎo)彈系統(tǒng)的時(shí)鐘寄存器設(shè)計(jì)為24位,因而時(shí)間的精度也只限于24位的精度。在長時(shí)間的工作后,這個(gè)微小的精度誤差被漸漸放大。在工作了100小時(shí)后,系統(tǒng)時(shí)間的延遲是三分之一秒。
對一般人人來說,0.33秒是微不足道的。但是對一個(gè)需要跟蹤并摧毀一枚空中飛彈的雷達(dá)系統(tǒng)來說,這是災(zāi)難性的——侯賽因飛毛腿導(dǎo)彈空速達(dá)4.2馬赫(每秒1.5公里),這個(gè)”微不足道的”0.33秒相當(dāng)于大約600米的誤差。在宰赫蘭導(dǎo)彈事件中,雷達(dá)在空中發(fā)現(xiàn)了導(dǎo)彈,但是由于時(shí)鐘誤差沒有能夠準(zhǔn)確地跟蹤它,因此基地的反導(dǎo)彈并沒有發(fā)射。
(宰赫蘭導(dǎo)彈事件圖解)
火星氣候探測者號在1997年發(fā)射,目的為研究火星氣候,但是它沒有能夠達(dá)成這項(xiàng)花費(fèi)3億多美元的使命。
探測者號在太空中飛行幾個(gè)月以后,由于導(dǎo)航錯(cuò)誤,最終在火星大氣層解體。探測器的控制團(tuán)隊(duì)使用英制單位來發(fā)送導(dǎo)航指令,而探測器的軟件系統(tǒng)使用公制來讀取指令。這一錯(cuò)誤大大改變了導(dǎo)航控制的路徑。最后探測器進(jìn)入過低的火星軌道(大約100公里誤差),在過大的火星大氣壓力和摩擦下解體。
(公尺還是英尺?偏離100公里?。?/span>
程序員在編程時(shí)必須定義程序用到的變量,以及這些變量所需的計(jì)算機(jī)內(nèi)存,這些內(nèi)存用比特位定義。
一個(gè)16位的變量可以代表-32.768到32.767中間的值。而一個(gè)64位的變量可以代表?9.223.372.036.854.775.808到9.223.372.036.854.775.807中間的值。
1996年6月4日,阿麗亞娜5型運(yùn)載火箭的首次發(fā)射點(diǎn)火后,火箭開始偏離路線,最終被逼引爆自毀,整個(gè)過程只有短短30秒。阿麗亞娜5型運(yùn)載火箭基于前一代4型火箭開發(fā)。在4型火箭系統(tǒng)中,對一個(gè)水平速率的測量值使用了16位的變量及內(nèi)存,因?yàn)樵?型火箭系統(tǒng)中反復(fù)驗(yàn)證過,這一值不會超過16位的變量,而5型火箭的開發(fā)人員簡單復(fù)制了這部分程序,而沒有對新火箭進(jìn)行數(shù)值的驗(yàn)證,結(jié)果發(fā)生了致命的數(shù)值溢出。發(fā)射后這個(gè)64位帶小數(shù)點(diǎn)的變量被轉(zhuǎn)換成16位不帶小數(shù)點(diǎn)的變量,引發(fā)了一系列的錯(cuò)誤,從而影響了火箭上所有的計(jì)算機(jī)和硬件,癱瘓了整個(gè)系統(tǒng),因而不得不選擇自毀,4億美金變成一個(gè)巨大的煙花。
(花費(fèi)4億美金的阿麗亞娜5型煙花,軟件bug出品)
彩蛋:Windows 98藍(lán)屏死機(jī) (比爾·蓋茨在Windows 98現(xiàn)場展示會上與觀眾共同見證死機(jī)藍(lán)屏)
【作者介紹】知社學(xué)術(shù)圈(zhishexueshuquan),海歸學(xué)者發(fā)起的公益學(xué)術(shù)交流平臺,旨在分享學(xué)術(shù)信息,整合學(xué)術(shù)資源,加強(qiáng)學(xué)術(shù)交流,促進(jìn)學(xué)術(shù)進(jìn)步。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。