你在寫程序的時候經歷過哪些有趣的事?

從你在做生物實驗的時候經歷過哪些有趣的事?的問題來的,順口提一個。


講一個前幾天剛發生的事情。

胖胖過來賣萌,下巴放在我鍵盤上。一開始沒當回事,摸幾下轟走就是了。沒想到之後我的程序就不work了。運行看起來一切正常,就是輸出文件沒有變化。

調試了半天,才發現有一行代碼

//config.Save();

被注掉了!這顯然不是我乾的啊,一定是胖胖的下巴正好落在/鍵上,時間又正好打出兩個/。。。該回去後一切正常。

/鍵上面還隱約能看到他的口水痕迹。

@Murasaki 說,胖胖的表情和這個一摸一樣


這是一個很久以前的,悲傷的故事。

那時候我才年畢業於一年左右,那時系統用的還是WINDOWS NT,用的是SQL SERVER。

在一個月黑風高的晚上,我正在通過mstsc(遠程桌面)連接到伺服器上進行SQL SERVER資料庫備份,由於一些程序一直連接到資料庫的,所以備份老是不成功。

一個一個的去關程序好麻煩,於是我靈光一閃,我真他媽的是靈光一閃:我如果把網卡給禁用了,程序不就連接不上來了嗎?我就可以安心的離線備份了,哈哈,我TMD的太聰明了。。。

然後,我就飛快的去把網卡給禁用了,懵逼了2s過後,再然後,我TMD的就半夜(其實只是21點左右)打車去了機房。。。

嗯,最後,各位coder些,注意身體,早睡早起,加強鍛煉,人到中年,不服老不行啊,有喜歡太極拳的朋友不妨一起交流交流,嘎嘎嘎。。。


大學寫一個qq象棋的外掛

所有的彈窗一律拒絕

勝率85% 寫完我去睡覺了

電腦在哪裡自動下棋

早上醒來發現正在下棋的人語言粗俗

甚是疑惑

仔細一看已經平局

但是對方申請平局均被拒

結果這個人很固執的跟我的電腦走來走去下了一晚上

………………………………………………………………

統一回復:

勝率85%是qq象棋給的平均勝率

09年的qq象棋平台,所以對平台做強制平局的判斷已經不記得啦

演算法是 棋子OCR+當年開源的象棋小巫師演算法+模擬滑鼠走棋

這個確實是個bug,外掛前期沒有對平局做判斷~~囧~~


寫x86模擬器實驗的時候,有一個測試樣例死活通不過,那是一個大矩陣運算,除此以外所有測試樣例都能過。因為是在自己寫的模擬器上,大矩陣乘法跑一次要好幾分鐘,然後才能看到一個鮮紅的HIT BAD TRAP,所以tm調試的時候痛苦的一筆。

關鍵是,當我試圖在測試樣例裡面列印變數的值的時候(加一條列印語句),這個測試樣例又tm過了!!!當時我內心是相當懵逼的,彷彿這個bug在躲著我,一旦我去調他,他就消失不見了。因為是跑在自己寫的模擬器上,除了列印變數,幾乎沒有調試工具!!

然後一整個下午加晚上我都在一條指令一條指令的比對,然後發現某一段內存似乎出了點問題。具體來說,測試樣例初始化的時候會往這一段內存里寫入兩個大矩陣(對應.data節),然後後面又會從這裡把數據讀出來進行運算。問題就出在這裡,從某一個位置開始,讀出來的數據和寫進去的數據就不一樣了。

然後我圍繞這一條指令開始二分調試模擬器,同時臨時造了一個輪子監視這一段內存,最後發現這一段內存是在處理器中某一個單元測試被改掉的,由此逆推,最終發現是頁表實現的時候邏輯地址轉化為線性地址右移運算符特么被我手殘寫成了左移運算符(╯°口°)╯(┴—┴。

當然到這裡還沒完,還記得一開始那個加一條調試指令就過的bug嗎,具體來說,這個測試樣例.text的節的大小正好在臨界值,加一條print語句就會導致.text多佔一個頁從而把.data往後擠了一個頁,而右移寫成左移的那個地方正好會把模擬器單元測試的地址轉化到這一段被擠出來的一個頁內。而一旦沒有這條調試語句,這個地方就會被.data節佔據,進而導致內存的值被修改引發bad trap (′?_?`)。

========

這個bug直到凌晨才調出來,前後總計花了六個小時,bug本身一環扣一環,當時調試的時候真的是欲哭無淚。。


這代碼開過光的

-----------------------分享代碼--------------------

// _ooOoo_

// o8888888o

// 88" . "88

// (| -_- |)

// O = /O

// ____/`---"\____

// ." \| |// `.

// / \||| : |||//

// / _||||| -:- |||||-

// | | \ - /// | |

// | \_| ""---/"" | |

// .-\__ `-` ___/-. /

// ___`. ." /--.-- `. . __

// ."" "&< `.___\_&<|&>_/___." &>""".

// | | : `- `.;` _ /`;.`/ - ` : | |

// `-. \_ __ /__ _/ .-` / /

//======`-.____`-.___\_____/___.-`____.-"======

// `=---="

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

// 佛祖保佑 永無BUG

// 本模塊已經經過開光處理,絕無可能再產生bug

//=============================================


在外地teamviewer連家裡電腦,感覺網比較卡,就說換個wifi吧,點擊斷開連接,,,,

,就沒有然後了


從一個歪果學長哪裡聽來的段子。程序運行到不該運行的地方,一般都會報錯。通常就是把癥狀描述一下,方便debug。然後有位歪果壯士,這個壯士寫的程序是在飛機上運行的(什麼公司我也不能說)。然後這位壯士英勇得寫下「If you are here, you are fucked". 腦補下當時機長看到這個的時候是什麼心情。據說這位壯士後來再也沒有出現過。

禁止轉載


曾經一度喜歡將Makefile中的目標clean,改名為love。

所以當我每次要清除所有編譯後的文件的時候,

整個世界都變得美好了。


很早之前我一直想寫一個圖片轉Ascii碼的小程序,流程大概就是根據各個像素點的灰度值找相應的字元替換,效果就是這樣:

大家一定感覺很簡單吧,但是當時我一直苦於找不到這個對應關係。突然有一天我靈光一閃,如果我拿一個灰度漸變的圖片去提供這種服務的網站(可以搜到很多)轉一下不就拿到這個轉換關係了嗎!於是我找了一張圖片:

之後終於拿到了灰度到字元的轉換關係,灰度從高到低: 「MND8OZ$7I?+=~:,..」。

雖然現在看感覺可能沒什麼,但當時確實讓我興奮了好一會兒。


1、

make的時候一直報某行shell命令有錯,大意是參數跟得不對;使勁盯著那行命令看了半天,沒發覺任何錯誤;把makefile里的那行命令展開後(這玩意展開後巨長)複製到terminal中執行,報錯;然後對著那行巨長的命令一個字元一個字元照著打了一邊,執行,成功;

Σ(⊙▽⊙"a 誒,怎麼還有這種玄妙的現象?!

用手指戳著屏幕一個字元一個字元又比對了一邊,倆命令長一樣,沒毛病啊╰( ̄▽ ̄)╭

然後分別把這兩條命令作為字元串寫進文件里,diff一發,誒,果然不一樣?!

趕緊切換到16進位顯示下比對,發現有一處不同,執行失敗的命令是0xC2A0,另一個命令中是0x20;後者我熟悉,就是一空格,那前者難道也是……空格?嗯,中文空格;

之所以Makefile是新寫起來的,是因為那天寫的是個新開的項(tian)目(keng),所以恰好有屏幕錄像(用來留作開坑紀念的);回頭去翻看了下錄像,唔,有個命令是當時網上查完資料後,順手從某博文上複製粘貼來的。

2、

高中搞OI的時候,有次比賽,才開始了一會兒,同校的一大神就開碼了;開碼沒事啊,關鍵是手速快啊;手速快問題不大,關鍵是鍵盤敲得重啊;鍵盤敲得重也還好,關鍵這敲擊力度還是階梯式上升的啊;

大概就這樣:「噗噗噗噗,嗒嗒嗒嗒,咔咔咔咔,叭叭叭叭,咣咣咣咣,哐哐哐哐」

感覺整個機房都震動起來了,所有人都把視線從題面移到了同一個人身上。

3、

剛接觸DSP的時候,用CCS寫好了代碼,順利編譯調試;結果改完cmd文件後死活燒不進去,板子重新上電調試器重連電腦都沒用,學長懷疑是JTAG介面問題,各種按壓擰扭JTAG介面,並沒有效果;

最後解決方案是:JTAG口拔了重插一下。

4、

剛開始學著寫kernel那會兒,lgdt時要先寫好6位元組的GdtPtr;

用nasm寫大概就是dd BASE dw LIMIT這樣;

一開始寫的是dd BASE dd LIMIT_RIGHT;

寫完後抽風了一下被我改成了dd BASE dd LIMIT_WRONG;

然後因為LIMIT寫錯了,跑起來妥妥地錯了,然後各種調試;

然後無意中看到參考資料上的一句話,大意是「特別要注意LIMIT是16位的,要用dw寫而不是習慣性地用dd寫」;我抬眼一看,喲,說得太好了,這不就是我犯的錯嗎?

於是就改過來,成了dd BASE dw LIMIT_WRONG;

然而LIMIT是錯的,所以跑起來依然妥妥地錯了,然後各種調試;

後來終於檢查出來是LIMIT寫錯了,激動地我一拍大腿,卧槽一開始LIMIT就是寫對的,怎麼就被我抽風改錯了呢!真的蠢!

反手兩個Ctrl+Z,變回了dd BASE dd LIMIT_RIGHT;

哈,這下LIMIT終於對了,所以跑起來依然……誒,怎麼還是妥妥地錯了?


2009年,當時在寫Ext JS

記得我寫了段代碼是這樣寫的(具體實在記不清了)

Ext.namespace("Application.switch");//開關

程序運行,Okay,繼續開發了將近一個月。

上線的時候,因為這貨太重,打算拿JSBuilder(Ext JS自己封裝了一下JSBuilder)打個包,壓縮一下。

壓縮後死活不通過,因為剛開始搞前端,當時有ActiveX插件,所以只能用IE6,實在不知道哪裡出錯了。

想了大概三天三夜。

最後就幾乎放棄了,打算就這樣上線吧(打開一個頁面起碼七秒鐘)。

無聊翻代碼,忽然看到這段代碼,就尋思著,這個switch是關鍵字……難道字元串裡面也不能用關鍵字嗎?

改了個名字,成功運行。

尼瑪!!!!

不死心,翻看編譯後的源碼……原來他自己封裝的JSbuilder會將這個字元串解析成一段代碼。

靠!


emmm,講講一個跟資料庫有關的東西吧。

項目要做微信登錄,目的是要錄入微信的用戶信息。然後我行雲流水一般構建,測試,打包,部署。線上測試(微信這逼登錄必須公網環境)一次成功,心情那個爽,喝著可樂唱著歌。

悠哉悠哉過了兩天,期間發在公司微信群里讓他們試試登錄,看著辦公室其他程序員都在忙,心裡充滿了鄙夷。

「在但是之前的都是狗屁。」

但是,前台小姐姐說她登不上……我心想別人都能成功,為什麼就你不行,肯定是你的原因!不過也沒直說,提交了 Bug 並準備看看是什麼鬼。

一看看了兩天,別人都忙完了就等我這邊……心裡那個急啊!關鍵是別人都能登錄就她不行,期間也拿小姐姐手機進行過多次測試,Bug 沒解決,天倒是聊了不少。項目推倒了重構還是不行……

馬上周末了,好氣啊!為什麼不行!晚上加了小姐姐微信然後我準備連夜測試。這周之內必須解決!

然後我發了個你好就楞在那了,你名字怎麼有個 emoji 啊啊啊啊啊!

蒼天吶!emoji 加在名字里有什麼意義啊!為什麼會有人在名字里加 emoji!為什麼要開發 emoji 啊!QQ 表情不是夠用了嗎!

默默把資料庫全改成 utf8mb4,另外 JDBC 會默認全局使用 utf8mb4 所以也不用改代碼。

別想了,我和小姐姐什麼也沒發生……


很多人關心後來怎麼樣了,比如說回滾之類的,當時心挺慌的,就想著怎麼終止執行,點了stop後等了好久還是不行,就打開了任務管理器。。。

你們懂的 |?ω?`)

之後就是找到三天前的自動備份,單獨把這個表的數據恢復回去了,然後跟客戶說了這個情況,還好客戶好說話,這個表的數據也不是特別重要的,有一些能手工做回去的就手工做了,遇到貴人,保住了工作

∠( ? 」∠)_

【以下是原答案】

不是寫程序,是SQL。

有一天客戶說要刪除系統某一天前的記錄,就是直接資料庫操作了,謹慎得我刪除之前肯定要先查詢一下:

select * from 表

再帶參數查詢一下

select * from 表

where XXtime&<"2017-01-01"

還好,記錄不是很多

查完沒問題就要刪除了

delete 表

where XXtime&<"2017-01-01"

嗯?怎麼執行了5分鐘還沒執行完?電腦卡了?

20分鐘了,我擦,還沒完啊,也就幾萬記錄而已。

結果一看,選中執行的只有:

delete 表

當時剛工作,還沒操作前備份資料庫的習慣。

驚不驚喜,意不意外?


以前在Linux伺服器上寫了個批量加密程序,關於RSA和AES-128的。測試時做100個都要不了2秒,然後就先上線了…上線了…

第二天一早經理就說了,這個有問題啊,5萬個密鑰生成了一晚上都沒做好!當時很蒙啊,100個2秒,5萬個再慢也就1個小時吧!自己測試了一下發現前500個很快,10秒搞定,然後需要10秒左右才能出來一個…難道是因為多線程做的哪裡阻塞了?還是I/O讀寫頻率過快要加鎖?Debug了一次又一次都沒改善,崩潰啊!

最後問題在哪裡呢?原來是在計算RSA的時候用到了系統的Random函數,Linux的Random默認是真隨機數,在內核里會保存500個左右的「種子」,這也就是為什麼前500很快的原因。之後要生成真隨機數的話是比較費時間的。

不要問我怎麼發現的,我不會告訴你我妄圖拋棄openssl自己造輪子的。


有一次我在擼代碼的時候

我家娃問我:爸,你在幹嘛

我:孩子,我在寫程序

娃:程序是什麼

我:程序可以變出很多你喜歡的東西

娃:可以給我變個棒棒糖嗎

我:……不能

娃:能把媽媽變走嗎

我:……不能

娃:能把隔壁班的朵朵變到我們家嗎

我……

……


硬體測試,批量開關機。100多台,並發。執行關機,全都ping不通,OK關機成功。批量開機,5分鐘過去了,還是ping不通。打電話給機房幫忙看看。Md跳閘了。


1、NOIP2006 TGT2,老師說有人能做出來他吃鍵盤。

然而我做出來了。

然而老師沒有履行。

2、小學的時候,班級有測試。我只用了老師給的時間一半就做出來了,然後第一。然後我看到了一堆傻逼程序,比如:結尾end後面不加點的,每一個語句都有begin end的(我當時學pascal),笑抽。

貢獻一批奇葩程序:

你們自找亮點吧……啊不,亮點標出來了

3、曾經看到過一個16NOIP提高某題目的程序。笑抽了,太TM政治敏感了,都發不出來……大概是四句話,然後加上兩個方框什麼的。然後我傳播到我們班級裡面,然後那個課都沒有上成……

4、高精度乘法這樣子打,一眼沒看出來什麼錯,改了一個小時:

for (int i=1;i&<=a[0];i++) //數組下標0表示這個數字有幾位 for (int j=1;j&<=b[0];j++) c[i+j-1]=a[i]*b[j]

中間嘛還信誓旦旦地保證這個和網上的高精度沒有區別。。

5、某道和素數有關的題目,我打了一個4600元素的表,總時間300ms急速通過20個點……時限調到100ms-300ms。然後出了洛谷公開賽,雖然被爆破了,但是貌似坑了一批人,呵呵……這種事情我不做了。

6、const int q=((1&<&<31)-1)*3*5*7*11;查了10分鐘。

7、看上個月的代碼:卧槽我寫了什麼?

PS:我真不是信競大佬,16年提高都沒有上200分,雖然和年齡有點關係,目前開學才8年級,但是真心比不過某些6年級提高300的那種。

8、距離noip還有70天,我連一個高級數據結構都沒有背出來……以下為我打高級數據結構的情景:

卧槽這個線段樹怎麼push_down?

卧槽splay怎麼寫?全忘了!

卧槽旋轉怎麼寫?

然後拍桌不寫o(*≧▽≦)ツ┏━┓

另附rotate的寫法,因為高級數據結構太長了。

void Rotate(int x,int p)
{
int fx=t[x].fa;
Push_Down(fx);
Push_Down(x);
t[fx].son[p^1]=t[x].son[p];
t[t[x].son[p]].fa=fx;
t[x].fa=t[fx].fa;
if(t[x].fa)
t[t[x].fa].son[t[t[x].fa].son[1]==fx]=x;
t[x].son[p]=fx;
t[fx].fa=x;
Push_Up(fx);
Push_Up(x);
}

等等,說好的不要壓行呢?

自打臉呢!

9、我覺得大家應該都知道某個ascii碼是會發出聲音的吧,應該是7。然後我在處理高精度的時候,因為種種不慎,然後電腦就不斷的在beep beep的叫,差點以為電腦壞了準備拆機……

做完之後電腦藍屏了……總不可能是巧合吧……

10、NOIP據說可以考場上瞄一眼別人的程序看別人怎麼做,可能因為我所在的考場紀律不嚴格。我右邊是省選大佬,8年級入市隊的那種。去年D1T2是著名的噁心毒瘤好題。正解是tarjan求lca然後樹上差分。(現在才想出來的我)

然後我看到了那位大佬的屏幕上有著以下三個函數(除了main的)

doit(好像有)

dfs

lca

然後想著:lca沒學過,看起來這道題要炸。於是寫了個25分的n^2騙分。然後寫騙分的時候電腦開始高能。

我用的是GUIDE,應該處於鄙視鏈的末端了。在寫n^2程序的時候,出現了以下幾個錯誤:

1、程序段莫名其妙地被覆蓋。

2、編譯出現靈異現象

簡直無解……

然後這個事情導致我都沒法做T3。霉運順便傳到了那個大佬的頭上。據說他lca寫炸了,然後蚯蚓的手寫堆也寫炸了。

我還能說什麼好?

11、我們都做不出來面向對象編程,因為我們沒有______

12、隔壁某佛祖保佑的高級圖像:

13、當年要求寫2^n的時候,據說有一堆人的寫法如下:

1、2^n(中槍)

2、pow(2,n)

3、

int ans=1;
for (int i=1;i&<=n;i++) ans*=2;

4、2n

正解是1&<&

14、某題用了vector & vec[100050]超時,然後使勁常數優化,還是tle

然後後來改成了vector &&> vec(100050) 編譯錯誤,本機可以。

然後對著poj的那一坨英語對照,才發現是評測機的gcc太老,不支持C++11

然後改成了vector& &> vec(100050)才可以。

花了半個小時

15、我從未想過,一個沒有cout也沒有printf的程序可以輸出,直到我遇到了名字中有空格的程序。

16、聽到的一個故事:

一個acm icpc的強校,有一個學長來參觀。

當時的那個冠軍下飛機之後,學長問她參加的是不是internation computer programming competition,她說是。據說當時場面尤為壯觀。可能是大家對programming看的比較重吧。感覺這樣也好。


我來講幾個我覺得挺有興趣的事情

一個段子,親身經歷

一次我面試,人挺多的,一組四個人讓他們先自我介紹,前兩個說的很好,各種語言都能說出來心得。

這位小牛出場。一句話震驚我在內的所有人

我會熟練的用20多種語言……(好牛逼有沒有)編出「hello world」

---下邊是以前的回答……

看到有些童鞋說程序員找不到女朋友,我說個例子,告訴你們是為什麼。

一個哥們學Basic語言,談了個B的,吹了以後,開始學C語言,找了個C的,後來學Dephi,找了個D的。吹了以後,學了java,就單身狗了。

---下邊是以前的回答……

以前談戀愛的時候。當著妹子擼代碼。

花了2周寫出來一個醜陋無比的俄羅斯方塊。

她崇拜的說:你敲代碼真像敲鋼琴,有藝術氣息,完成了一件偉大的作品,好崇拜。

結婚了以後,她說,你敲代碼吵到我睡覺了。

然後-------------

我就變成了經常跪鍵盤……


/*————————————————————————————————

1.把int main(),寫成int mian()。編譯不通過還以為編譯器有問題。

—————————————————————————————————

2.剛開始學C語言的時候,教程說「;」號為每個語句結束的標誌,然而在寫if,fo,while的時候加上了分號,然後就Debug一下,發現不能通過,有一點英吹斯聽, 想了半天不知道哪錯了,然後就百度了,找答案後的我又碰見了do while.心酸。

————————————————————————————————*/


剛開始接觸opengl那會兒,看師兄寫的程序輔助學習。

師兄其實特別厲害來的,代碼非常工整嚴謹,註記也寫得很詳細很漂亮,讀起來就沒啥壓力的那種。

就是每次調用打開關閉狀態或者緩衝區之後,都要空上個四五行。

每個人都有自己的寫代碼的風格的這個我知道,恰巧我的風格里有一條是特別討厭胡亂空行,實在忍不住了就問了下師兄。

師兄說,狀態開了就要關,對象綁了就要解,緩衝區建了就要刪,知道嗎?

我說,知道啊,但是你空這麼多行幹什麼?

師兄說,那是給你在底下跟著多敲幾遍這個調用,這樣記得牢些。

留給我跟著多敲幾遍

跟著多敲幾遍

多敲幾遍

幾遍

你當我是在幼兒園學寫字嗎!

我說我沒啥基礎那是謙虛啊謙虛,不是幼兒園那種沒基礎啊QAQ


推薦閱讀:

面對荒謬的邏輯應該如何進行反擊?
如何培養講笑話的能力?
作為單身汪時你被虐汪虐的最慘的一次?
你最傻的時候是什麼時候?
有沒有本來很美,但細思很污的詩詞?

TAG:互聯網 | 程序員 | 編程 | 搞笑 | OI |