還在為垃圾代碼發(fā)愁嗎?學(xué)習(xí)設(shè)計模式吧
嵌入式工程師現(xiàn)狀
在我頭兩三年的工作時間里,接觸過不少嵌入式工程師,對這個行業(yè)的現(xiàn)狀有一定的深入了解。從傳統(tǒng)嵌入式工程師的學(xué)習(xí)路徑來看,大部分是從熟悉硬件手冊、配置寄存器開始學(xué)習(xí),接著在邊做項目邊加深學(xué)習(xí)C語言,根據(jù)項目不同,會接觸一些基礎(chǔ)算法,比如控制上的pid、多軸插補,圖像處理上的濾波、分割等等。在這個階段中,會逐漸熟悉一些硬件之間的特性差異、掌握c語言編程來實現(xiàn)不同功能,學(xué)有余力的可能還接觸了一些RTOS,更深入地掌握了多線程編程技巧、GUI開發(fā)界面、網(wǎng)絡(luò)編程等。
但是在走完這一階段之后,其實大部分工程師,代碼能力還是很弱。這是由于在實際工作過程,過于依賴面向過程開發(fā),只管功能實現(xiàn),忽視了代碼質(zhì)量和提高。這樣的代碼維護起來非常費勁,添加或者修改一個功能,常常會牽一發(fā)而動全身,讓你無從下手,恨不得將全部的代碼刪掉重寫!回首看一下過去幾年間自己的代碼,時常有抽自己幾巴掌的沖動。
意識覺醒
我們有幸在最好的開源時代,在嵌入式領(lǐng)域目前已經(jīng)有大量優(yōu)秀的開源代碼可以供所有程序員參考對比,比如熊大的RT-thread、周立功的AWTK;我們不幸在最壞的開源時代,當(dāng)知識的門檻越來越低,每個人面臨的競爭壓力是前所未有的。這種壓力應(yīng)該促使程序員去思考,如何去提高自己的代碼水平,如何去設(shè)計出如熊大、周立功他們一樣優(yōu)秀的項目。
在開源商業(yè)軟件高速發(fā)展的今天,希望我的一點經(jīng)驗和分享可以慢慢地讓一部分工程師意識覺醒,認識到斑駁繁雜的業(yè)務(wù)開發(fā),需要大量的基礎(chǔ)知識的支撐。只有花狠功夫去夯實基礎(chǔ),才能看得更長遠,走得更持久。
但是,必須要明白的一點是,基礎(chǔ)學(xué)科和理論大都不是與技術(shù)能力直接掛鉤的,無法通過短期的突破來取得立竿見影的效果。它更多的是慢慢在潛意思中生根發(fā)芽,默默地在解決問題的過程中影響你思考的角度和深度。這是緩慢受錘的過程,這一錘一錘的折磨,大部分人挺不過來。
如何破局
那么怎么吸收理解乏味沉悶的基礎(chǔ)知識?如何把它內(nèi)化成自己的工程開發(fā)能力依然是很多程序的困惑。在被操作系統(tǒng)、編譯原理、微機原理等大部頭幾乎殺死了對編程的熱衷的同時,更是遲遲看不到投入產(chǎn)出比。甚至幾年工作下來,悲哀地發(fā)現(xiàn),代碼水平跟還在大學(xué)里的毛頭小子差不多。因此,選一個合適的切入點,在職業(yè)進階發(fā)展時建立起強大的學(xué)習(xí)自信心就尤為關(guān)鍵。設(shè)計模式就是這樣一個最佳的切入點,它既是非常重要的基礎(chǔ)知識,又直接反映技術(shù)能力水平。設(shè)計模式、數(shù)據(jù)結(jié)構(gòu)、算法是程序員的三座大山,但是設(shè)計模式與數(shù)據(jù)結(jié)構(gòu)和算法不一樣的地方在于,數(shù)據(jù)結(jié)構(gòu)和算法是業(yè)務(wù)場景的總結(jié),它的關(guān)注點在于如何寫出高效代碼來改善產(chǎn)品的性能,這在不同產(chǎn)品、不同業(yè)務(wù)上是差異很大的。而設(shè)計模式,更多的是一種工程經(jīng)驗,它客觀地歸納了高質(zhì)量代碼開發(fā)的技巧,指導(dǎo)著工程師把代碼寫得可維護性強、可擴展性強、健壯性強。所以,不必擔(dān)心設(shè)計模式是"屠龍刀",只要你有心想用好它,那么在你的業(yè)務(wù)代碼中,一定有用得上的地方。除非你是想開發(fā)一個只管功能實現(xiàn),不管后人維護擴展的爛項目。我在這些年的工作經(jīng)歷中,實在是見過不少的爛代碼,比如命名不規(guī)范、類設(shè)計不合理、分層不清晰、沒有模塊化概念、代碼結(jié)構(gòu)混亂、高度耦合等等。 應(yīng)對面試中的設(shè)計模式
學(xué)習(xí)設(shè)計模式,最功利、最直接的目的,和算法一樣,可能就是應(yīng)對面試了。不管你是前端工程師、后端工程師,還是嵌入式工程師,在高階崗位的求職面試中,設(shè)計模式問題是被問得頻率比較高的一類問題。特別是一些像 華為、大疆 這樣的大公司,比較重視候選人的基本功,經(jīng)常會拿算法、設(shè)計模式之類的問題來考察候選人。所以,求職面試的時候,應(yīng)該提前準(zhǔn)備、溫習(xí)一遍設(shè)計模式。盡管不一定每次面試都會被問到,但一旦被問到,如果回答得不好,就是一個敗筆,這場面試基本上也就涼涼了。所以,為了保證萬無一失,擺脫一旦被問到答不出來的窘境,對于設(shè)計模式這種大概率被問到的問題,需要未雨綢繆,認真提前準(zhǔn)備一下。
關(guān)于嵌入式的設(shè)計模式
目前市面上關(guān)于設(shè)計模式的書籍和視頻,主要都是用面向?qū)ο蟮恼Z言來進行講解,比如java\c 。而嵌入式程序員主要用c語言開發(fā),那么學(xué)習(xí)設(shè)計模式時不可避免會有一些語言上面的障礙,因此本系列文章,希望是以c語言來闡述清楚每種設(shè)計模式的用途。讀者在有了對它有一定的概念和理解后,再去看相關(guān)書籍時,會減少很多障礙。