弱爆程式設計師的特徵值

發表於2011-08-23

來源:陳皓

首先說明:

1、以下特徵是真實遇到過的,同事犯過的,乃至我自己也犯過的;

2、為了劇情需要,某些例子進行了一些誇張修飾等演繹創作,如無雷同,請勿生氣;

3、如果你出現過以下症狀之一,並不代表你就是弱爆了,但是如果你一直出現,乃至一說到這個大家就能聯想到你,那麼你就得小心了;

4、如果你是集這幾個的大成者,恭喜你,你已經找到了離開這個行業的充足理由了。

好了,搞定!

“那個Bug解決了嗎?”

“好了,搞定!”

“這麼快?”

正當你非常欣喜的時候,就傳來了噩耗:剛才還能編譯成功的,就失敗了。(好吧,我們的整合編譯尚未成功配置上,理論上這種事情應該會被退回。)又或者能編譯成功,但是呢,原來明明能起作用的一個下拉框,突然發神經的不起作用了。最隱蔽的莫過於,一切正常,但是當你看到程式碼的時候,你就暈厥過去了。比如我們曾經發現了一個Bug,簡單說就是每次使用者點選某個東西,就會執行下面的這段C#程式碼:

這個Bug很明顯會導致速度越來越慢,因為同一個更新操作會被更新N次,並且這個N會越來越大。其實這個Bug已經夠弱了,但是後來居然被修改為:

這段程式碼能編譯,能執行,但是就是弱爆了。因為這不僅僅沒有從根本上去掉造成問題的邏輯,還會帶來更多的困惑:為什麼要先減後加呢? 這類特徵,請大家看看有趣的《各種流行的程式設計風格》,我這個例子算是一種撞大運。我覺這吧,這類問題都是因為只想解決一些表面的東西為目的,完全不管底下的其它任何問題而造成的。

那估計是他的Bug

“這個問題為啥還沒解決呢?”

“我覺得應該是他那裡邊的Bug,我調不了。”

“哦……”

這個“他”可以是某一位同事,或者前同事,或者微軟,或者別的什麼公司,再或者某個開原始碼的作者。這些個我都遇到過,比如說是另一位現在在職的同事吧。當你告訴這位同事這個Bug似乎在他那兒,並且問問什麼時候解決,他也許會很愧疚的立刻除錯,可最後結果卻仍然是開頭對話主人翁的所寫程式碼的問題。

再比如說是微軟吧,那麼對話可能就會包括:“啊,SilverLight真是爛,老是記憶體洩漏、崩潰等……”“是啊是啊!爛死了!早知道用Flash了。”又或者會說:“微軟就是爛,Java就是好。”其實,我不想比較什麼SilverLight還是Flash,.NET還是Java。因為在討論這些問題之前,先最好想想,這真的是別人的錯麼?相信是其他人的錯是一件很簡單的事情,因為這樣推脫之後你就可以啥都不做了,反正不是我的錯。 如果真的發現了這是別人的Bug並證明了,那倒好說。但這種特徵是一種純粹的懷疑,並沒有絲毫的證明。在仔細找了自己所有可能犯的錯之後,如果你懷疑是別人的問題,那請求證一下。

無圖無真相!

“樓主,無圖無真相啊!”

“樓主,無程式碼無真相啊!”

“樓主,給翻譯一下啊!”

據說Linus在別人詢問Linux記憶體管理的一個什麼問題時,回答道“Read the fxxxing source code”,很多時候我也有類似的衝動。我發現在資訊發達的時代,不少人的閱讀能力、動手能力都嚴重退化了。這些人最好就是你親自來幫他把問題解決了,他才不想了解裡面到底 發生了什麼。這種問題體現在部落格裡面,就是寄希望於你寫得圖文並茂,圖嘛最好花裡胡哨同時言簡而意概,文字嘛最好大段大段的程式碼。其實圖不是重要的,只是為了好看,重點是程式碼,這樣他一Copy就可以直接解決他們的問題了。

比方說,Silverlight裡面沒有各種影象格式的編碼器,於是當你希望儲存Jpg的時候怎麼辦呢?Google一下,發現原來有人寫過一個FluxJpeg的編碼器。下載下來一跑,唉還真能用哎。之後就直接簽入,也不捎帶看一下有沒有什麼問題,或者設計不合理的地方。(其實真的有,會很慢,因為有大量毫無必要的陣列拷貝。)

又或者說,遇到了某個Bug,搜尋一下發現,哎,還真有人遇到過,而且還有程式碼哎!把程式碼扒下來一跑,發現好像解決了,至於為什麼就不管了。甚至還遇到過根本就不管解決不解決問題,反正程式碼扒下來了就簽入了的。

再比如,寫一篇部落格講解如何縮減.NET編譯出來的文體大小,其中提到許多概念需要先閱讀微軟官方的一個文件。結果,還是會有人回覆說,你那個文章裡面提到那麼多的Blob,也不說說Blob裡面都有什麼,大概是很不滿意吧。可是這個文件裡面都有啊,難道就不能自己閱讀一下?其實即便我連這個文件都沒有給出,自己也應該有這個能力去進行思考,去動手尋找。

千萬不要退化成一個啥都要別人給你嚼爛了才能夠吞下去,吞下去也不會消化吸收的人。這樣的人大概別人給的是大便,只要有程式碼無真相,也會照樣吃下去的。若真如此,那你打算如何提高呢?

那是個物件!

“這個ExpressionVisitor,它是用來幹什麼的?”

“……”

“好吧,或者這麼說,他是一個什麼東西?”

“他是一個物件!”

“啊?”

“哦,是一個物件的例項。”

大概這樣的回答,和那個微軟工程師說“你在直升飛機上”差不多——反正你也不能說是錯的,但是就是沒什麼意義。其實不知道沒啥問題,人又不是神,怎麼可能都知道呢?不去仔細瞭解和學習問題也不嚴重,因為你可以改。但是當你習慣性的隨便找一個絕對沒錯但又不說明任何問題的答案,甚至似是而非的東西來對付的時候,你就離弱爆的邊緣很近了。

當然,上面的對話也許是比較極端的。一個稍弱一點的對話版本是:

“這個記憶體洩漏是怎麼造成的呢?”

“嗯,會不會是圖片放的位置不對呢?”

哈,還是很誇張對吧?沒辦法,寫部落格有時候需要誇張的文字,否則你無法理解我的意思是:有時候,大家會傾向於從自己的記憶中尋找一些相似的物品,然後選擇相似度自認為比較高的東西出來當作答案,而全然不管兩者之間的邏輯是否有哪怕那麼一絲的關聯。也許很多時候,我們確實需要從相似的東西開始,但請別把他當作終點。程式是需要嚴謹的邏輯的,所以你也必須非常嚴謹的去推演。

關於這類的問題真的太多太多了,比如我指著下面這段程式碼當中的紅字:

var dictionary = new Dictionary<string, string>();
dictionary[“someKey”] = “someValue”;

“這句話說明了什麼?”

“說明dictionary是一個陣列。”

集大成者

最後我舉一個集大成者的例子,說,有個任務是要在SilverLight應用上面新增一個“收藏本站點”。好,怎麼解決呢?網上一搜,發現有很多這樣的程式碼:

 

“這是什麼原因呢?”

“不知道,反正瀏覽器報告沒有許可權,可能是瀏覽器的安全設定原因吧,或者作業系統的Bug,也可能是瀏覽器的某種Bug?”

“不可能啊?這些程式碼存在很多年了,要有問題早就能在網上搜尋到了。”

“那也許是SilverLight呼叫的時候有什麼安全問題。哎!SilverLight好煩啊!”

“那怎麼還沒有解決呢?”

“好,我馬上解決它!”

很快,那段Javascript就變成了:

看到這樣的程式碼,我徹底震驚了。親自除錯了一下,發現確實報告了一個“沒有許可權”的異常。但是,我還發現,那個Url引數的值是“www.adomainname.comtestpage.html”。那這不廢話麼!瀏覽器認為你要收藏的是一個本地硬碟上的路徑,怎麼可能在一個Internet Zone上允許收藏這種路徑呢?我於是指著程式碼問:

“這個Url是什麼?”

“是一個變數”

“啊?”

“哦,不對,是一個引數。”

你是否也有類似的經歷呢?

相關文章