嗯,這也是由感而發的一篇博文,和前一篇一樣,都是因為網友ZhaoLS的一篇博文引發的。
原文在這裡:《生成不重復的隨機數序列》http://student.csdn.net/space.php?uid=127131&do=blog&id=32861
我在回復ZhaoLS網友的時候,始終有種感覺,就是他這麼做,“不好”,究竟哪不好,我也是想了一下,才想清楚。ZhaoLS網友別見怪啊,我也是有一說一,對事不對人,僅僅是借用你這篇博文舉例子而已,·見諒。
還是那句話,一家之言,歡迎拍磚啊。
我是這麼看的。
大家看了他的程序,有什麼問題沒有?作為一個C#程序員,我不是啊,但是,我也了解過一點,寫試驗性代碼,沒必要這麼復雜的。ZhaoLS網友做這個試驗,專門寫了一個很漂亮的界面,嗯,是很漂亮。並且,裡面精心拼接字符串,為的是整齊地顯示到EditBox裡面。最後出來的效果確實很好。
只有一個小問題,有沒有必要?
一般我的習慣,做一些算法試驗,或者一個kernel級的模塊的試驗,都是使用控制台,直接用C的printf打印就好了。為了這個事情,我還專門請教了做C#的同學,C#到底有沒有控制台輸出,我同事說有,並且幫我找了一個網址,專門論述C#是可以控制台輸出的。有興趣的C#朋友可以參考這裡:http://www.mybuffet.cn/html/0/324.htm
其實,大家看這個問題可能是個小問題,覺得我有點吹毛求疵了,沒有必要,更有甚者,還可以說人家網友ZhaoLS做事情嚴謹有什麼不好,試驗代碼也應該寫認真一點,不能因為是試驗代碼就放松要求。我寫這篇博文,純屬扯淡,呵呵。
嗯,這個論點其實我也一直在堅持,就是說,試驗代碼的品質,一定要比正式代碼相同,或者高才行,精品的測試代碼才能測出精品的程序,這是對的。
但是,我這裡,想說另外一件事,就是試驗的時候,大家最好不要帶太多UI相關的東東,我的習慣,試驗代碼品質是必要的,但是,我一般做到PI層,就是Programmer Interface,程序界面層就好了,最好不要帶太多UI的東東,User Interface,原因很簡單,處理圖形化UI,一來使程序員分心,關注不到自己想要研究的算法本身,二來,引入了太多的不可控參量,導致測試不准確。
我以前就有過經驗,剛開始,嗯,2000年左右,第一次寫WinMain的程序,就是給Windows開發代碼,上來先“糾結”了一周左右,為啥,沒有一個好的輸出環境,我熟悉的printf沒法用,為了打印一行輸出,我得先畫個窗口,再准備一個EditBox或者ListBox什麼的,再輸出過去,好麻煩哦。
最後怎麼著,我想啊想啊,突然想通了,Windows下寫代碼,代碼還是C代碼嘛,C++也一樣,語言本身就是與平台無關的,我的目標運行平台是Windows的窗口程序,但是,並不是說我的每段代碼都要在窗口下調試和測試。模塊化的原則,只要該模塊計算邏輯正確,接口好用,別人能調用,你管它在哪個平台上編寫和調試呢?
所以,後來我就慢慢養成了習慣,程序開發分為兩部分,功能實現,業務UI,我一般專注於功能實現,即保證核心邏輯算法正確,效率能滿足要求,至於UI,初期設計的時候可以先放一放,甚至,現在發展到,UI丟給C#、PHP、Java這些同事去做,他們其實現在也不是自己做,做出標准UI的api,然後,請個界面設計師,直接用css、html畫界面,很漂亮,然後,裡面的熱鏈接Call內核的api實現功能好了。
我後來又打聽了一下,客戶端相關的應用,現在越來越多這種模型,除了游戲開發啊,程序員一般已經很少去做界面相關的事情了,為啥,我們做不好,不專業,UI相關要美術功底,程序員的數學腦袋瓜,畫出來怎麼都像列方隊,不好看,遠不如人家專業做美工和界面的,畫出來的好看。這也慢慢變成了目前大多數公司的一個工作模型,殊不見,一個企業數據庫應用,都采用B/S模型,以IE訪問網頁來實現客戶端功能,這中間,我理解,分布式運行是一個考慮,還有個主要考量,使用IE的html畫界面,UI要美觀得多,用戶友好度更好。大家覺得呢?
當然,說了這麼多,也僅僅是我想說的一個方向,還有個很重要的方向,測試的結果准確度。
很多時候,我們評估一個kernel級的內核模塊,不僅僅要評估其正確性,0bug是最低指標啦,出來都要掛,先打回去重做,ok?我覺得更多問題是,我們要評估其效率。
但是,如果測試代碼中帶有太多UI相關的內容,這個圖形界面GUI,畫點、畫線,輸出文字,要不要占時間?大家去想。
這樣測試出來的結果,還准嗎?
正如ZhaoLS網友文中所說,他發現String的拼接很占用時間,其實已經影響到測試的結果,他沒辦法,只有分別測時間才行,這無形中又增加了程序的復雜度,請大家記住:“我們增加的任何一行代碼,都是以機時為代價的!”
所以,從“客觀”、“嚴謹”的工作態度上講,我建議,大家以後做任何測試,最好盡量減少對測試結果的干擾因子,用最簡單,最直接的辦法,直接求出結果,不要刻意為了美觀、好看,去增加無謂的運行時開銷,影響測試結果。
在我們的實驗報告中,最好看的,其實是表格裡面的數據,而不是這份報告排版漂不漂亮,圖好不好看,“真實的數據是最美的!”。大家能理解嗎?
也正是因為這個原因,大家可以發現我的《0bug-C/C++商用工程之道》中,我雖然給了一個跨平台工程庫,但是,大家在裡面看不到一行UI相關的代碼,為啥,這是kernel級的多任務執行機,最核心的內存管理模塊和鎖,這些功能,任何平台都是相同的,永遠工作在底層,不見天日的。
它的實現和測試,要UI做什麼?我所有的測試都是控制台打印,debug和syslog也是這麼來的。
至於以後大家要應用到Windows平台,或者Linux的XWindow平台,外面自己加UI好了,我底層的功能,就這麼多,並且基本正確,效率很高,業務層自然可以依托平台,把界面做得很漂亮。
我再說句話,看大家同意不?“內核高效了,UI層才有時間畫漂亮界面!”
以前我做游戲測試,要求1024*768下,每秒鐘至少刷屏70次以上,就是重繪70次,為啥這麼定,我們要構建動畫,根據電影上面視覺殘留的理論,每秒要25~30幀,人才會感到畫面自然動起來。
我內核能力做到70幀,實際使用時,用30幀,這是不是意味著,每秒鐘有半秒我在做屏幕重繪,我為業務邏輯,什麼碰撞判斷,什麼敵人的控制,什麼精靈特效,什麼游戲邏輯的,每秒鐘我留出了半秒的工作時間。
這才是游戲嘛。如果為了一個精美的效果,我每秒鐘只能達到30幀,那完蛋了,這樣出來,不叫游戲了,叫做Demo,或者電影,為啥,用戶的輸入,游戲邏輯,沒有時間處理了,那還玩什麼玩啊?直接看電影好了。
所以,追求內核高效,要盡量去掉很多不必要的測試開銷,以及很多不必要的干擾因子,這樣測出來的數據才准確,才有意義。
我說這麼多,主要是希望廣大程序員朋友,或者有志於成為程序員的朋友,在做每件事情的時候,“專注”於自己要做的事情,不要被其他東東干擾,還有就是,盡量客觀和准確,科學是來不得半點虛假的。
就好比我前面寫的一篇博文《實際中常用的一個隨機數產生器分類別概率隨機)》http://tonyxiaohome.blog.51cto.com/925273/296530),我在文中的代碼裡,明明實現了O1)的復雜度,但是就有人,為了攻擊我本人和我的書《0bug-C/C++商用工程之道》,專門撰文,說用其他辦法,O7)的復雜度也可以實現,我這個辦法不值得提倡。
我暈,我們做算法優化,有時候,On)這個值,能減少1都是巨大的成功,因為程序是有循環的,循環次數是被乘數哦,這是乘法關系,這個核心算法復雜度減少1,放出去就是幾千萬甚至幾億的時鐘開銷,效率提升就是巨大的。很多時候,我做優化,都在為了減少這個1在努力。
不過,這畢竟是少數人,准確的講,說這話的人不能算技術人員,因為針對到科學的,算法的,優化的問題上,一是一,二是二,不能帶著個人感情討論。這是技術人員,特別是程序員基本的職業道德。
這裡,我希望廣大程序員朋友一定要養成一個習慣,“客觀”和“嚴謹”是程序員的基本職業修養,也是我們能在這個行業裡面立足的根本,千萬不要丟掉了。
嗯,最後呢,還是要稱贊ZhaoLS網友一句,做事情很嚴謹,雖然做實驗的方法不是很准確,這個呢,算經驗,以後慢慢補好了,但是,給出來的代碼命名規范,格式清晰,一目了然,很認真的,尤其是測試報告,給出了詳細的測試平台論述,這為大家做數據參考打下了很好的基礎。我也學習了。
謝謝ZhaoLS網友,你寫了一段很好的程序,寫了一篇很好的博文,引發了一次很愉快的討論,我也歡迎你針對這個問題,繼續探討,大家互相促進哈。
=======================================================
在線底價購買《0bug-C/C++商用工程之道》
直接點擊下面鏈接或拷貝到浏覽器地址欄)
http://s.click.taobao.com/t_3?&p=mm_13866629_0_0&n=23&l=http%3A%2F%2Fsearch8.taobao.com%2Fbrowse%2F0%2Fn-g%2Corvv64tborsvwmjvgawdkmbqgboq---g%2Cgaqge5lhebbs6qzlfmqmttgtyo42jm6m22xllqa-------------1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20---40--coefp-0-all-0.htm%3Fpid%3Dmm_13866629_0_0
肖舸
本文出自 “肖舸的blog” 博客,請務必保留此出處http://tonyxiaohome.blog.51cto.com/925273/313399