第八十九章嚇一跳
當(dāng)蕭天收到來(lái)自曹慶陽(yáng)發(fā)來(lái)的消息的時(shí)候,也是有點(diǎn)懵的狀態(tài)。
你說(shuō)你怎么接的懸賞現(xiàn)在一直有問(wèn)題??!
不過(guò),畢竟是大學(xué)一個(gè)宿舍里面的哥們,所以蕭天也是回復(fù)了過(guò)去。
天天:叫我一聲爸爸,爸爸幫你搞定。
曹慶陽(yáng):別鬧,跟你說(shuō)認(rèn)真的,我先傳給你,到時(shí)候給我搞定一下。這個(gè)我真的找不出來(lái)好像,不只是一點(diǎn)頭緒沒(méi)有,關(guān)鍵是有的地方是看不懂的的,看不懂那我只能放棄了,總不可能讓我瞎貓碰著死老鼠吧?
天天:我現(xiàn)在有點(diǎn)忙,等著吧,等有空的時(shí)候我?guī)湍憧匆幌滦邪桑?p> 曹慶陽(yáng):行,有你這句話(huà),我就放心了。
天天:滾蛋吧你。
蕭天躺在床上,享受著張雪帶來(lái)的服務(wù)。
吃的小臉蛋通紅的張雪看著蕭天聊天都能夠聊出笑容,不由得有些好奇,“誰(shuí)啊?”
“一個(gè)朋友,你也知道,曹慶陽(yáng),他又接了一個(gè)懸賞,聽(tīng)說(shuō)是五千塊錢(qián)的,沒(méi)解決掉。我估摸著他是在拿我當(dāng)苦力使喚呢?!笔捥煺f(shuō)著,當(dāng)然當(dāng)苦力就是一句玩笑話(huà)。
“那你幫不幫他呢,五千塊錢(qián)懸賞應(yīng)該算是簡(jiǎn)單的任務(wù)了吧,蕭老板你應(yīng)該能輕松解決吧?”張雪想著這件事情,也是有點(diǎn)覺(jué)得挺有意思的。
“那當(dāng)然,我是誰(shuí)?這么一個(gè)小懸賞肯定能解決的,不過(guò)曹慶陽(yáng)那家伙畢竟是初級(jí)程序員了,一般來(lái)說(shuō)這種懸賞應(yīng)該是小問(wèn)題的,但是竟然還沒(méi)有解決,看樣子這個(gè)懸賞有點(diǎn)坑啊?!?p> 蕭天說(shuō)起這個(gè)也是稍微的認(rèn)真了點(diǎn),那畢竟是他的新能力大觸級(jí)別的嘛。
張雪對(duì)于這一切自然是不知道的,她大學(xué)學(xué)的又不是這些,學(xué)的是傳媒專(zhuān)業(yè)的,只不過(guò)沒(méi)有從事傳媒專(zhuān)業(yè)這方面的工作而已。
“算了,不說(shuō)這些了,我們先樂(lè)呵樂(lè)呵?!?p> 蕭天實(shí)際上對(duì)這件事情沒(méi)有太過(guò)于放在心上,畢竟只是一個(gè)小小的事情罷了,在曹慶陽(yáng)的眼中可能是無(wú)法解決的難題,但是現(xiàn)在在他的眼中,其實(shí)也可能就是那么回事。
區(qū)區(qū)小問(wèn)題,不足以?huà)忑X。
“嗯,對(duì)了蕭老板,我想問(wèn)你一個(gè)問(wèn)題啊,你喜歡女孩多一點(diǎn)還是喜歡男孩多一點(diǎn)?”
張雪也是突然的問(wèn)道,蕭天聽(tīng)著這個(gè)問(wèn)題,簡(jiǎn)直是莫名其妙啊。
這個(gè)問(wèn)題怎么回答呢?
當(dāng)然是女孩子了,他又不是男同,但是……
蕭天突然之間明白了什么,聲音有些磕磕巴巴的。
“……有……有了?”
張雪看著蕭天那個(gè)表情,也是笑了笑,不過(guò)還是點(diǎn)了點(diǎn)頭。
“嗯……這個(gè)月一直沒(méi)來(lái)我就發(fā)現(xiàn)有問(wèn)題了。已經(jīng)快一個(gè)月了……”
不是吧?
這么快就有了?
蕭天愣了愣,快一個(gè)月了,那不就是上個(gè)月做的嗎……
這……
倒也沒(méi)有什么大事情,主要是張雪大著肚子,她父母怎么解決呢?
蕭天有些惆悵了。
他現(xiàn)在可沒(méi)有打算結(jié)婚的念頭啊,頭有些疼。
孩子當(dāng)然得要了,畢竟是他的精華結(jié)晶。
張雪看著蕭天的表情,也是捂嘴笑了笑,“騙你的,你還當(dāng)真了。”
蕭天的表情一瞬間又是放松了下去,然后翻了翻白眼,“嚇我一跳,不過(guò)為什么要問(wèn)男孩女孩的問(wèn)題啊?”
“這不是問(wèn)問(wèn)嘛……你又不帶那個(gè)東西,現(xiàn)在天天都要來(lái)幾次,遲早都要懷上?!睆堁┌琢耸捥煲谎?。
蕭天也是思考了一下,說(shuō)的不錯(cuò),不帶那個(gè)東西,又天天日夜笙歌,那的確是很快就要懷著。
不過(guò)……
懷著就懷著吧。
蕭天倒是不怕,他養(yǎng)得起,就是怕張雪會(huì)被人說(shuō)閑話(huà)。
畢竟他現(xiàn)在給不了名分之類(lèi)的東西。
想到這里,蕭天也是朝著張雪露出一抹歉意。
張雪也是了解,他知道這個(gè)男人的想法,畢竟已經(jīng)在一起不算短了,她還是能夠猜透身邊這個(gè)男人的心思的。
她是有一點(diǎn)遺憾,但是這是早就預(yù)料到的結(jié)果,倒還不至于太難過(guò)。
當(dāng)然現(xiàn)在的氣氛不打擾蕭天再來(lái)一次白日宣音。
……
當(dāng)百萬(wàn)雄兵戰(zhàn)死沙場(chǎng),蕭天也是空閑了下來(lái),所以蕭天也是準(zhǔn)備直接花費(fèi)一點(diǎn)時(shí)間幫曹慶陽(yáng)給搞定。
打開(kāi)文件,蕭天看著這個(gè)代碼,陷入了沉思,他陷入沉思的原因不是因?yàn)檫@個(gè)修復(fù)漏洞很難,相反,很簡(jiǎn)單,蕭天半個(gè)多小時(shí)就給它修復(fù)好了。
他感覺(jué)到的只是修改BUG和找BUG那真的是兩個(gè)情況。
不過(guò)有些人也肯定很疑惑,出現(xiàn)BUG是必然出現(xiàn)的情況還是程序員水平有限導(dǎo)致的?
這個(gè)嘛……仁者見(jiàn)仁,智者見(jiàn)智。
就比如這個(gè)——
print(“hello, world.“)
你看,這個(gè)“程序”就是沒(méi)有BUG漏洞的……
實(shí)際上但凡有過(guò)一點(diǎn)正式開(kāi)發(fā)經(jīng)驗(yàn)的程序員,寫(xiě)個(gè)簡(jiǎn)單的hello world都能寫(xiě)出BUG的恐怕不多見(jiàn)吧。
別說(shuō)hello world了,一個(gè)簡(jiǎn)單的、不涉及“隱秘”機(jī)制的百行小程序,絕大多數(shù)資深程序員也可以直接寫(xiě)成0 bug。
因?yàn)檫@些實(shí)際上是對(duì)計(jì)算機(jī)的原理深度決定的,比如你對(duì)計(jì)算原理或者語(yǔ)言機(jī)制理解越深,對(duì)你來(lái)說(shuō)“隱秘”的東西就越少,寫(xiě)出高質(zhì)量代碼的機(jī)率就越高。
而且,就像黑土平臺(tái)里面的交流板塊哪怕只是在上敲一篇一千個(gè)字的灌水文,有幾個(gè)可以保證無(wú)語(yǔ)法錯(cuò)誤、無(wú)錯(cuò)別字且標(biāo)點(diǎn)符號(hào)使用正確呢?
尤其這還是在機(jī)器替你寫(xiě)字,使得“提筆忘字”“書(shū)寫(xiě)錯(cuò)誤”之類(lèi)錯(cuò)誤無(wú)法存在的前提下:這樣你都不能保證全對(duì)……
那么不僅大小寫(xiě)敏感、而且邏輯更為曲折復(fù)雜、容不得半點(diǎn)含糊的計(jì)算機(jī)程序呢?
因此,有BUG漏洞那真的是無(wú)可避免。
當(dāng)然還有一種情況,你的程序本身是無(wú)bug的;但支持環(huán)境比較坑……
這種正常來(lái)說(shuō)不算程序bug,當(dāng)然實(shí)踐中,你可能沒(méi)辦法坐等OS或者瀏覽器等廠(chǎng)商修改——所以結(jié)果就是你只好積極行動(dòng)起來(lái),在自己的程序里為別人的錯(cuò)誤擦屁股……
這在業(yè)界被稱(chēng)為workaround: Workaround - Wikipedia。
正常來(lái)說(shuō),workaround是臨時(shí)的,并且,如果不是諸如0day之類(lèi)特別關(guān)鍵、刻不容緩的問(wèn)題,搞workaround往往是出力不討好的——因?yàn)樗顺舐?,易錯(cuò),含糊,難以理解;而且等OS或者瀏覽器等的原始廠(chǎng)商修了它自己的bug,你原本好好運(yùn)行的workaround往往反而會(huì)引起問(wèn)題。
尤其是,有時(shí)候OS或者瀏覽器廠(chǎng)商修復(fù)速度比較慢、致使某種workaround反倒成為“主流技術(shù)”;那么當(dāng)“正統(tǒng)”修復(fù)方案和workaround沖突時(shí),OS或者瀏覽器廠(chǎng)商往往不得不將錯(cuò)就錯(cuò),以免搗毀那些用了workaround的實(shí)現(xiàn)……
這類(lèi)復(fù)雜情況暫不討論,提它主要是為了說(shuō)明,搞清楚bug的真正發(fā)生點(diǎn)是極為重要的。
修不到bug的根源、濫用workaround,度過(guò)的是眼前的難關(guān),犧牲的卻是整個(gè)項(xiàng)目的穩(wěn)固性。
類(lèi)似的,盡量把程序?qū)懙摹按蟊娀币稽c(diǎn),沒(méi)有必要不碰新特性,也可以在很大程度上避免“遭遇官方bug”問(wèn)題——如果你自己理解上再有點(diǎn)偏差,用新特性就和作死無(wú)異了。
不過(guò)……
有的人敲字灌水都錯(cuò)字連篇,但是有人手寫(xiě)幾十上百萬(wàn)字的小說(shuō),隨便截一段都差不多能進(jìn)語(yǔ)文課本……
所以,人與人還是有極大差別的。
不能因?yàn)椤癓inus也寫(xiě)bug”甚至“Linus也寫(xiě)過(guò)低級(jí)bug”,就認(rèn)為“我寫(xiě)個(gè)一百個(gè)整數(shù)里找最大值的簡(jiǎn)單程序出三十個(gè)bug也是正常的”——初學(xué)者搞出這事,正常。
至于專(zhuān)業(yè)人員嘛……出一個(gè)都不正常。
不僅如此。
既然“寫(xiě)長(zhǎng)篇出bug正常,發(fā)條短信就那么十幾個(gè)字,錯(cuò)一個(gè)都不應(yīng)該”;那么我們把長(zhǎng)篇拆開(kāi)成若干章,一章只寫(xiě)三千字呢?再把一章拆開(kāi)成若干段,一段只寫(xiě)數(shù)百個(gè)字呢?
這就是為何寫(xiě)程序要先做模塊設(shè)計(jì)、然后再把模塊按職責(zé)拆分成類(lèi)、類(lèi)按功能拆分成函數(shù)、最后還要求一個(gè)函數(shù)不要超過(guò)一屏(大約80行)的原因了。
經(jīng)過(guò)拆分之后,一個(gè)一個(gè)函數(shù)填寫(xiě)實(shí)現(xiàn)、然后再一個(gè)一個(gè)函數(shù)做單元測(cè)試,測(cè)完再組合起來(lái)搞功能測(cè)試、集成測(cè)試……
這樣寫(xiě)程序,當(dāng)然還是無(wú)法杜絕bug出現(xiàn);但出bug的機(jī)率就微乎其微了。
而且程序和長(zhǎng)篇小說(shuō)不同。
小說(shuō)里的角色,尤其是主角和主要配角往往是貫穿始終的,這就使得小說(shuō)章與章之間存在很多內(nèi)部聯(lián)系;稍微搞不好就會(huì)導(dǎo)致前后失去呼應(yīng),比如主角一會(huì)兒傷在左手一會(huì)兒傷在右臂、或者前面挖個(gè)坑然后設(shè)個(gè)伏筆后面卻忘了用,等等。
但是在程序里面,不同模塊甚至不同函數(shù)之間,應(yīng)該是毫無(wú)瓜葛的,每一個(gè)都可以摘出來(lái)獨(dú)立成庫(kù)——有瓜葛就說(shuō)明用了全局變量或者靜態(tài)對(duì)象,或者通過(guò)參數(shù)或者約定等傳遞了過(guò)多的東西——這就叫“低耦合”。
做到了“低耦合”,你就可以把一個(gè)復(fù)雜的大程序當(dāng)一組簡(jiǎn)單的短文甚至短信寫(xiě)。
這樣自然就很難出錯(cuò)了。
當(dāng)然了,有些情況下,程序邏輯非常復(fù)雜且無(wú)法拆分,也就是所謂“無(wú)法約分的復(fù)雜性”,這種代碼就必須端起十二分小心來(lái),當(dāng)然即便如此,bug出現(xiàn)率仍然要遠(yuǎn)高于其他代碼。
一般來(lái)說(shuō),要把程序拆成“不可約分”的一組最小單元來(lái)寫(xiě)。
這個(gè)“不可約分”就是術(shù)語(yǔ)說(shuō)的“高內(nèi)聚”:這段程序只做一件事,這件事已經(jīng)沒(méi)法拆的更簡(jiǎn)單了,只能把它們放在同一段代碼里一舉解決掉。
因此,寫(xiě)程序時(shí),事先的“謀劃”非常重要。
一個(gè)有經(jīng)驗(yàn)的資深工程師,可以在動(dòng)手前就把一個(gè)復(fù)雜的大項(xiàng)目拆成一堆幾乎互不關(guān)聯(lián)的小程序,然后逐一實(shí)現(xiàn)它們、實(shí)現(xiàn)完再把它們組合起來(lái)就行了。
顯然,“謀劃”好了,一個(gè)程序的難度降低若干個(gè)數(shù)量級(jí)都是可能的。
說(shuō)實(shí)話(huà),在絕大部分能見(jiàn)到的軟件中,都是或多或少的有bug的……
只不過(guò),第一開(kāi)發(fā)可能沒(méi)想到,第二測(cè)試沒(méi)測(cè)到,第三用戶(hù)沒(méi)碰到,第四客服的反饋沒(méi)收到,那么——這就是一個(gè)“成熟穩(wěn)健”的產(chǎn)品。