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