《那些年啊,那些事——一個程式設計師的奮鬥史》——20
阿新 • • 發佈:2018-12-18
因為產品已經要接近批量產,基本上軟體方面也不會有很大的變動,只要之前的程式不出現致命的BUG,那麼就可以宣告完成。只不過這種沒有經過嚴格測試的程式,僅僅是程式設計師自己覺得沒問題的流程,完全沒有BUG的可能性又是幾何呢?只不過作為程式設計師,除非是專業測試的,估計沒有幾個人會整天對著自己寫好的程式在進行測試吧?段伏櫪自然也是如此。段伏櫪曾經問過黃華中接下來還要做什麼,可得到的答覆是,暫時沒什麼了,你先看看一些資料吧。只不過這麼一來,上班時間就完全空閒了。 很多職場新人遇到這種情況,都是樂得屁顛屁顛的,上班就會在瀏覽網頁,聊聊QQ,昏昏碌碌過一天。所幸的是,段伏櫪並沒有這樣做,因為之前很久找不到工作的經歷實在給他留下了難以磨滅的傷痛。他無時無刻不在擔心,萬一這家公司炒了他,那麼自己再找工作的時候,是不是也是這麼艱難?或是說,經過這幾個月,自己有了多少長進,能不能作為找工作的資本?回頭一想,發現自己還是很多東西不懂,也就不敢太放縱自己。既然工作上暫時已經沒有安排,那麼為何不自己給自己充電? 這時候,有一本書深深影響了段伏櫪往後的程式碼風格。這本書就是北京大學出版社出版的《Windows CE程式設計》。在此之前,段伏櫪所看的關於Windows CE的書籍,全部都是出自於國人之後,無一例外都是採用MFC架構。眾所周知,MFC封裝了Windows API很多東西,感覺上似乎是方便了很多,但實際上對於初學者弄明白程式的架構卻是大大不利。就如同段伏櫪寫的計算器一樣,雖然有很多按鈕,但他也僅僅知道雙擊按鈕的時候會轉到原始檔的某個函式,在這個函式裡寫的程式碼是響應點選事件的,僅此而已。至於這個雙擊函式是如何被呼叫的,則是一無所知。於是便給段伏櫪造成了這麼一個假象:編寫Windows視窗程式和在學校裡學的C++不同,它可以不按執行流程執行並且能夠很神奇地跳躍執行某些函式。總而言之,學校學的東西似乎和工作上所運用的完全搭不上邊。 可看了《Windows CE程式設計》一書之後,段伏櫪的認識完全被顛覆了。原來Windows桌面程式也和學校裡所學的C++一樣也有入口函式的啊?所不同的是,C++入口函式是main,而Windows程式是WinMain!原來程式沒有像學校所學的C++那樣馬上退出,是因為主執行緒有個訊息提取的迴圈函式啊!原來按下按鈕時系統會發送一個WM_LBUTTONDOWN訊息,放起來時又有一個WM_LBUTTONUP,而相應的處理函式就是在這時候被呼叫的,而不是之前所想象的那樣神奇的跳躍執行啊!原來Windows程式也可以寫得那麼幹淨,可以沒有那麼多莫名其妙又不知所云的巨集定義啊! 可為什麼那麼多人會用MFC呢?這個疑惑不久之後段伏櫪也明白了。MFC封裝了很多東西,在某些方面確實會比較簡單。比如說,建立一個最簡單的視窗程式,MFC只要在新建工程的時候選擇相應的選項,最後點選完成即可;可如果直接使用Win32 API呢,那麼就必須自己先手動註冊視窗類,然後建立一個視窗,接著自己去處理訊息迴圈,最後根據訊息來做相應的動作。如果是從無到有,那麼這一套流程下來,至少也要花上一兩個小時,相對於MFC的隨手點選,效率確實差了不少。但這樣的好處是,自己能夠明白程式究竟做了什麼,而不像用MFC那樣糊里糊塗。至少可以讓程式設計師感覺到,這一切都是可控的。 其實對於剛入門的初學者來說,不應該一上手就去用MFC,或是C#之類的語言。雖然說這些高階的東西能夠大大減輕工作壓力,加快工作效率,但對於程式設計師個體來說,又得到了什麼,又學到了什麼?這些高階玩意,不是給初學者用的,而是為高手準備的。因為對於高手而言,他們已經知道了很多東西,已經沒有任何必要從一個框架一門語言中去學到什麼,而只需要拿著這個工具去解決問題即可。而反觀菜鳥,如果要提升技術,那麼背後的那些東西肯定是需要知道的,可偏偏類似於C#的這種高階語言把這些都完美封裝了,所以很多一開始就上手C#的程式設計師,很多年過去了,也做了不少東西,也解決了不少難題,但對於背後的為什麼可以這麼做,卻還是不知其所以然。因此經常可以看到一個用C++做了五六年,然後轉到C#做個一兩年,在某些新技術方面會比一開始就用C#,並且用了八九年的工程師的領悟性還強。 只可惜現實是殘酷的。雖然對於程式設計師來說最好的途徑確實是從最基礎的東西開始,但往往不具備這樣的條件,因為對於公司來說,個人能學到什麼東西並不是那麼重要,最重要的是什麼時候能夠完成這個任務。如果公司需要做一個C/S的玩意,負責人肯定不會對程式設計師說:你先將作業系統的原理搞熟悉,然後再把這網路協議給弄明白,當然這虛擬機器的原理也搞清楚,最後再給我把這任務完成。估計要真把這些東西給弄明白,少說也要幾年時間,公司可以等嗎?客戶可以等嗎?所以這樣的情形之下,負責人肯定會這麼說:我們做的這個C/S玩意,你們看看需求,看看是用JAVA還是C#快,我這周就要出個樣本程式! 要不要先將這基礎學好,再去找工作?這個更不現實了。人所要解決的,首要是溫飽問題,如果還餓著肚子,談何來的理想?那麼是不是初學者註定就這麼昏昏碌碌下去?其實並不盡然。因為在工作之前,其實有一段時間,剛好可以將這基礎打好,那就是——大學四年!大學的英文是University,諧音為“由你玩四年”,想必這是中國大學最真實的寫照。除了那為數不多的幾所名校以外,大部分的大學都是放羊式,不管你平時幹什麼,不管你是不是真的學到了東西,只要考試及格就給你發畢業證。更為糟糕的是,大學老師水平也是良莠不一,比如第一節課,老師會大言不慚地說:這門課其實我也沒學過,這學期我們就來一起學習!然後上課時,就把課本照著念一遍,匆匆了事。類似的事件,其實不在少數。但這些,並不能作為自己懶惰的理由。其實從另一個角度來說,老師的放任不管未必不是件壞事,至少學業上不會有太多的壓力,自己能夠憑著喜好去學習其它的知識。 只不過段伏櫪明白這道理的時候,已經晚了。自從找了第一份工作之後,每天都要強迫自己去看技術書籍。每每這時侯,段伏櫪總會想:這些東西大學就應該知道的,為什麼大學虛度瞭如此多的光陰?不過自古沒有後悔藥,與其懊悔過去,不如抓緊現在。所以即使在沒有什麼任務的這段時間裡,段伏櫪也不敢像別的同事那樣每天上上網聊聊QQ,而是抓緊時間,一本一本技術書籍進行專研。 不過這些技術書籍段伏櫪能看懂嗎?其實段伏櫪大部分沒有看懂,但他知道,看了還有希望,不看就只剩下絕望。很多初學者開始看技術書籍的態度是不正確的,拿起一本書,翻幾下,發現不懂,便放下了,心理想著等以後能看懂了再看。其實這是一個偽命題,如果都懂了,那還看這書幹什麼?其實陶潛所說的“好讀書,不求甚解”,其實是非常有道理的。對於一個初學者來說,當讓開始一個從來沒接觸過的東西,他絕對是一片茫然,無從下手,甚至於藉助搜尋引擎也不知道用什麼關鍵字;而如果以前有看過相關的書籍資料,雖然自己根本就沒記住任何內容,但至少知道在哪裡看過,這時候只要按照印象去搜尋,絕對比盲目搜尋更為有效率。 這段時間裡,段伏櫪居然做到了,凡是市面上帶有“Windows CE”字樣的書籍,只要能搞到的,都無一例外地全部看了一遍。只不過這期間,段伏櫪也發現了一些問題。如果作者是外國的,那麼書中基本上都是直接用Win32 API;但如果是國內的作者,毫無例外使用MFC,更為讓人驚異的是,某些書甚至還是大篇幅大篇幅抄襲另外一本的。這難道不算抄襲?結果將兩本書的作者一比較,發現其中其中一本書的編者之一就是另一本書的作者。這也行?坑人吧?至此之後,只要是購買國內作者的書籍,段伏櫪就不會那麼隨意了,都會在網上先看看相關評價,然後才謹慎入手。