編程里的玄學能有科學解釋嗎?

或許你也有過這種經歷。

對我來說,

我最近寫程序,

寫完後,總跑不了。

但是debug走一遍後,

沒改任何代碼與數據

最後竟然可以跑了,

這能用科學解釋嗎?

//能給一個小例子出來更好


所以推廣形式證明還是有必要的,免得老有人把一些蠢錯誤甩鍋到玄學。

明明煉丹調參才能說是真·玄學。


同一個程序,同樣的運行環境和同樣的測試,運行結果不一樣一般稱為Flaky Test。

原因有很多, 比如並行問題,內存泄漏,網路,隨機性等。

參考:http://mir.cs.illinois.edu/~qluo2/fse14LuoHEM.pdf

要解決的話可以根據以上主要原因來排查,如是否有racing情況,是否有訪問不安全的內存等。


對於C或者C++來說…

主要是編譯器幫忙優化的太好了

看一下彙編你會發現再鬼的問題都有原因…


應該就是內存和野指針啥的有關了,你要是用GC+VM的語言一般就沒這問題

用Proof語言也沒問題


編程本來就是玄學啊。

這段代碼不能運行,I dont know why

這段代碼可以運行,I dont know why, neither

我經常時不時就莫名其妙地解決了一些 bug,看來平時要多拜拜神明。


編程沒有玄學都是科學,很正常,肯定還是程序有bug,首先debug模式下編譯器會自動處理些事情,比如幫你做初始化或者申請一些內存,使本來有bug的程序湊巧可以運行,又或者,會放慢你的代碼執行速度從而繞過問題,我今天剛遇到一個偶發bug,release執行10次會崩潰1次,debug版毫無問題,最後找到是一段內存申請代碼的問題,解決後release測試幾十次,沒崩潰。以前還遇到過一個偶發bug,也是debug版毫無問題,最後是編譯器生成的析構函數出問題,調整下變數聲明的次序就解決了,很神奇,但都是很普通的bug。

這一般都跟申請內存或者指針變數方面的問題有關。


有可能是debug 的時候許可權高,要讀取什麼文件沒有就創建文件,許可權高就創建成功了,或者是條件編譯的時候有創建文件的動作。創建成功後再跑的時候這個文件存在了就不出錯了。

或者是資料庫內容之類的。

總之改變了什麼持久化的內容,甚至是域賬戶,註冊表等等。


說一下今天凌晨發現的一個問題。將txt文件中的內容存到資料庫中,然後怎麼也無法通過第一個欄位查到第一行的數據,後來用Linux打開txt文件,第一行有隱藏的字元。當時是怎麼想到第一行有問題的呢?我是在第一行加了一條假記錄,原來第一行的記錄可以被查詢到了,假記錄無法被查詢到。為什麼會想到隱藏字元的問題呢?因為Claris老師在某場比賽有一次也發現了一樣的問題。當我在一開始查不到第一行數據的時候,我也以為會是玄學問題,但是實際上大家都知道,代碼怎麼會有玄學呢,只不過是因為技術太菜了吧……


總會有一個人告訴你 編程中根本沒有什麼「奇怪」的問題 肯定都是有原因的 而99%的可能就是你自己的原因


大概是因為換上女裝的效果吧。


編程里還有玄學?搞硬體的表示不服


之前出了一個bug 根本排查不出來原因

為了查bug 我們在一個關鍵函數前面加了一個log

然後bug消失了。。。

我們注釋掉了這個log。bug再現了!

於是我們組了一個log進去。耶


大概是神仙看神仙打架能看出門道來

凡人看神仙打架就是玄學了

嗯,我寫代碼一定要找旭東奶一口


編程沒有玄學,只有自己的無知。

JavaWeb 編程時

改過自己電腦時間

新文件時間早於舊文件

tomcat始終執行舊的

給新人解釋過不止一次了,

給相同的人解釋過不止一次了

不能走點心嗎?

要是覺得計算機也會騙人,活該這種程序猿蠢死。

我從來沒聽說工地小工覺得砌牆也有玄學的

握住你的小推車,認真賣力氣就好了


。。。肯定是寫的有問題


計算機也會失誤吧


從理論上講當然是沒有玄學的,如果你夠閑/強/無聊,說不定你能把看似隨機的野指針,多線程問題都手動模擬。

但是實際上來說,我們往往並沒有那麼多時間找到事情的根源問題。往往能重啟解決的問題,我們也不會繼續再往下研究了。。

不過一般來說,玄學太多的代碼,真該重新寫一遍了。


外部變數也是個問題,程序配置,文件許可權,網路環境,系統API,資料庫裡面一條記錄改了……都有可能導致Bug啊


現在有time travel debugging. 這都不是事兒啦


這是feature(大霧


玄學,不存在的。說下樓主的親身經歷,

之前項目里需要加個新功能,主要是檢驗訂單號與項目是否能關聯。OK,小需求,花了一小時搞定,本地測試,測試系統測試全部OK,心中竊喜,哈,又能歇兩天了ps:經理給了三天時間。

結果,情況如你們所料,正式系統用不了。卧槽當時心裡就吐血了,一樣的環境,jdk,tomcat你竟然給我說用不了,遠程過去心想如果是因為你操作不當的話我要斃了你。(暴怒)。遠程主機進行操作,卧槽這不可以嗎,當時心裡就想老子下次去你那裡出差一定要帶把刀。然後截圖給他發過去他還一臉不相信的樣子,emmmmp。

這不是重點,重點是第二天他又來告訴我,又不能用了。卧槽老子當時就想掀桌買票去砍他丫的,但是被我們組裡人給勸住了,忍著怒氣上遠程給他調試一下,結果還是正常沒問題。截圖給他再次叮囑要『好好』操作。

第三天,你們想的沒錯,那孫賊又來了。可能是之前聽我們組裡的人說了我昨天的事件,上來就給我開遠程,表情特別獻媚地說:大人您來試下,小弟這裡還是不行啊。當時我就沉默了,我無聲的打開瀏覽器,開始操作,心想要是老子這次操作還是沒問題今天你丫必須血濺五步。當進行到最後一步時我已經把刀放到包里準備買票了。 豈料,最後一步確實出問題了,當場心裡就不淡定了。什麼鬼情況,本地正常,測試正常,正式系統正常,就你丫電腦不正常。打開控制台一步步看下來都沒問題,又打開瀏覽器控制台再操作,最後一步後一看。我去你個仙人板板哦,瀏覽器不支持。打開軟體一看尼瑪神馬年代了還在用IE8的,你升級下或換個火狐,谷歌不行啊。至此,問題解決,好了不多說了,我馬上就要上飛機了,期待我的好消息哦。(括弧笑)


推薦閱讀:

國內的軟開從業者的主流水平已經和美國大部分水平一樣了?
有哪些用代碼寫的冷笑話?
初學c語言,做題是總是有錯,是什麼問題?
如何看待PowerShell Core 6.0?
如何用C#得到「相對根目錄」?

TAG:軟體開發 | 編程語言 | 編程 | 軟體調試 | DebugPodcast |