07
淺談嵌入式學(xué)習(xí)和就業(yè)
北京大學(xué)軟件與微電子學(xué)院07級碩士畢業(yè)生張博
不少人或許還并不是很清晰地知道什么是嵌入式,IEEE對它定義的原文是:Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants。從一個嵌入式軟件工程師的角度來看,簡單地說,就是對一些硬件進(jìn)行編程,使其完成既定功能的操作。
接下來我就結(jié)合自己的親身經(jīng)歷,談一談對嵌入式學(xué)習(xí)、擇業(yè)以及發(fā)展前景的一些感想。
嵌入式應(yīng)該屬于門檻比較高的技術(shù)方向,因為你所要打交道的不只是軟件,很多的時候還需要了解硬件的知識,只有了解它的工作原理,才能正確地對其進(jìn)行編程。一些錯誤的理解可能會導(dǎo)致運行結(jié)果與預(yù)期相去甚遠(yuǎn),所以說嵌入式是一項軟硬件緊密結(jié)合的技術(shù)方向。
作為一名嵌入式工程師,需要了解的知識包括如下方面:硬件部分,電路結(jié)構(gòu)、芯片邏輯設(shè)計、時序等;軟件部分,操作系統(tǒng)、編譯原理、匯編語言、高級語言等等。要學(xué)習(xí)的知識可謂多之又多,想在短時間內(nèi)掌握這些知識并不容易。在過往的經(jīng)歷中,確實見過不少同學(xué)缺乏足夠的耐心,或者早早失去興趣,從而放棄了嵌入式行業(yè),轉(zhuǎn)投其他領(lǐng)域。
但是,從某種角度來說,嵌入式又是相對簡單的,因為所見即所得。只要對硬件進(jìn)行一些簡單的編程,就可以看到一些特定的行為,及時的反饋結(jié)果也是非常的直接。從嵌入式軟件來講,一些簡單的嵌入式系統(tǒng)并沒有大型軟件那么高的復(fù)雜度,幾個特定行為的實現(xiàn)不過是對一些寄存器進(jìn)行編程而已,所以從簡單系統(tǒng)入手,有助于建立起對嵌入式學(xué)習(xí)的信心,我也曾經(jīng)是從0到1,對此有著深刻的體會。
從容易到困難,是學(xué)習(xí)的一般規(guī)律。這個過程沒有問題,但是必須強(qiáng)調(diào)的是,從一個初級嵌入式工程師到高級嵌入式工程師,甚至是資深嵌入式工程師,并不是一件容易的事情,這中間會遇到一些瓶頸,需要克服很多困難,只有不斷地提升自己的能力,才能面對后面復(fù)雜的嵌入式系統(tǒng)。
舉個例子,作為一個嵌入式軟件工程師,也許剛開始的時候只要能夠配置硬件的寄存器,然后完成其正常的行為,就可以讓一個足夠簡單的嵌入式系統(tǒng)正常工作。但隨著工作的進(jìn)行你會發(fā)現(xiàn),你面對的并不全是簡單的所見即所得的硬件,比如多核非對稱系統(tǒng),包含一個MCU(可能是ARM,通用處理器),再加一個DSP(專門做信號處理的處理器),它們之間的通信就比較復(fù)雜,你需要學(xué)習(xí)共享內(nèi)存、學(xué)習(xí)信號量、學(xué)習(xí)生產(chǎn)者消費者模型,而實際上兩邊各有不同的操作系統(tǒng),情況會比描述得更為復(fù)雜。
也就是說,嵌入式工程師在跨入一個新的階段的時候需要學(xué)習(xí)大量的知識,之前遺漏的或者當(dāng)時認(rèn)為有難度暫時忽略的知識,都將在此時補(bǔ)課回來。不過,這些內(nèi)容雖然看似量大,但并不難理解,因為它并不具備大型互聯(lián)網(wǎng)軟件的復(fù)雜度,由于設(shè)計模式的原因,嵌入式領(lǐng)域用到的無外乎那么幾種,當(dāng)然做上層嵌入式應(yīng)用的除外。學(xué)習(xí)起來,完全可以按部就班,有條理地對知識進(jìn)行組織,因為調(diào)用關(guān)系十分明確。
就目前的情況而言,步入嵌入式領(lǐng)域的人才確實有所減少,很多人或許抱有這樣的觀點:嵌入式不如做上層軟件變化多,方向有些狹窄,就業(yè)不容易,收入在計算機(jī)行業(yè)內(nèi)也不算理想……
事實上,我們不得不承認(rèn),當(dāng)前國內(nèi)情況確實如此。主要有以下幾個原因:首先,嵌入式不是當(dāng)前最流行的技術(shù),目前最火熱的技術(shù)當(dāng)屬機(jī)器學(xué)習(xí)和大數(shù)據(jù)。其次,嵌入式公司在國內(nèi)創(chuàng)業(yè)的并不占多數(shù),嵌入式行業(yè)的就業(yè)基本限制在芯片公司和移動設(shè)備公司。最后,嵌入式的投入產(chǎn)出比不夠理想,影響到了嵌入式從業(yè)人員的薪資待遇水平。
針對這幾個問題,我來談?wù)勛约旱目捶ā?/p>
1.嵌入式從業(yè)者需要與時俱進(jìn)
首先,流行的技術(shù)是應(yīng)該學(xué)習(xí)的,這個觀點我十分贊成,不過,這與從事嵌入式行業(yè)并不矛盾,因為我完全可以結(jié)合當(dāng)前的主線附加一些支線學(xué)習(xí)任務(wù),比如學(xué)習(xí)機(jī)器學(xué)習(xí)的相關(guān)知識,而嵌入式目前也在這個領(lǐng)域大有可為。舉個例子,做inference芯片,幫助諸如TensorFlow、Caffe這樣的工具訓(xùn)練出的網(wǎng)絡(luò),能夠加速跑在移動設(shè)備上。另一個例子是Google的TPU,從訓(xùn)練的角度幫助提升速度和效率。顯然,如果你選擇做嵌入式,不但沒有和這個時代脫節(jié),而且不斷在跟最流行的技術(shù)進(jìn)行交流。
最流行的技術(shù)總是在更新?lián)Q代,學(xué)習(xí)的速度需要更快,而嵌入式用到的大部分基礎(chǔ)知識實際在最近一些年并沒有本質(zhì)的變化,而所謂的學(xué)習(xí)新內(nèi)容不過是學(xué)習(xí)一些新的應(yīng)用場景,但是萬變不離其宗。
最流行的技術(shù),也意味著從業(yè)的人員數(shù)量很大,在如此多的競爭者中脫穎而出并不容易,如果想出類拔萃,除了努力或許還需要一些天賦。
2.嵌入式就業(yè)隨“心”所欲
嵌入式公司中創(chuàng)業(yè)數(shù)量少這個問題,實際上是相對于互聯(lián)網(wǎng)創(chuàng)業(yè)公司而言的。近年來,我們能看到很多做智能家居的公司層出不窮,這對嵌入式從業(yè)人員來說是利好的消息。這意味著,需要大量的嵌入式工程師來做一些基礎(chǔ)工作,而且很多工作是基于一些相對成熟的解決方案來實現(xiàn)的,所以門檻相對沒有那么高。
另外,智能手機(jī)的幾個巨頭,也可以作為嵌入式人員從業(yè)的目標(biāo)。要維持一定的出貨量,這樣的公司勢必要擁有大量的工程師以支撐多條產(chǎn)品線,所以人員缺口自然也比較大。
而那些想要做得更加底層,更想去造輪子而不是做汽車的嵌入式工程師,個人建議你找一家芯片公司,從Bootloader開始到上層應(yīng)用,無所不及,相信一定可以滿足一個技術(shù)極客的需求。當(dāng)然,日后還可以把你的代碼貢獻(xiàn)給開源社區(qū),幫助提升開源軟件的質(zhì)量,成就感可以得到更大的滿足。
3.把握好現(xiàn)在,定會有美好未來
與互聯(lián)網(wǎng)公司相比,嵌入式從業(yè)人員的薪資度的確并不討喜,但是這也要看你的水平級別。一個優(yōu)秀的嵌入式工程師,完全能夠做到衣食無憂。況且,試想,是在一個人員緊缺的行業(yè)里更容易出類拔萃,還是在一個競爭激烈的領(lǐng)域更加容易?
在嵌入式行業(yè),如果熱愛,就全身心投入,否則就放棄。很多時候方向固然重要,但絕非全部。打個比方,每個工程師都有自己的船,你就是船長,但目的地并不是只有一個。雖然大海茫茫,你沒有一張航線圖,但是只要一直向前走,由于目的地足夠多,最后你總能到達(dá)其中一個,即便這個目的地并非最優(yōu),但也足夠受用。倘若一味地追求最優(yōu),不斷地切換航線,而對于這片大海,如果沒有十分精準(zhǔn)的GPS,那么最后很可能你還在原地打轉(zhuǎn)。
因此,我認(rèn)為,是否選擇嵌入式,當(dāng)下是最重要的,未來可以思考,但并不見得是關(guān)鍵。正如《新世界 靈性的覺醒》一書的作者所說:覺醒不發(fā)生在未來,只發(fā)生在當(dāng)下。所以,我們把握好現(xiàn)在,才是一切!
關(guān)于如何進(jìn)行嵌入式的學(xué)習(xí),分享一些個人的經(jīng)驗。筆者身為一名軟件工程師,對于硬件并沒有非常深入的了解,所以只談?wù)勅绾螌W(xué)習(xí)嵌入式軟件。說到這里可能有很多人會提出一個問題:是應(yīng)該更重視理論基礎(chǔ),還是多做項目多動手?對于這個問題我的回答是:兩者都很重要!聽起來好像是沒什么指導(dǎo)意義,但這確實是我這些年進(jìn)行嵌入式開發(fā)的切實體會。
首先說說理論基礎(chǔ)學(xué)習(xí)。嵌入式的軟件開發(fā)不同于一般的軟件開發(fā),如果你做過3~5年的純軟件編程再轉(zhuǎn)向嵌入式,就會發(fā)現(xiàn),很多時候軟件出的問題其實是硬件的不可靠造成的。如何對這些問題進(jìn)行定位并解決呢?我認(rèn)為,這需要相當(dāng)扎實的理論基礎(chǔ),當(dāng)然,有經(jīng)驗會事半功倍。為什么這么講?因為在嵌入式開發(fā)中,你遇到一個問題之后,可能沒有辦法像開發(fā)其他軟件那樣,換一個方法照樣可以實現(xiàn)同樣的功能,而是卡在那里,止步不前,直到找到問題的根本原因,業(yè)內(nèi)稱之為root cause。
這時,就需要一步一步進(jìn)行排查,如果理論基礎(chǔ)不扎實,對于一些知識點模棱兩可,那么在看問題的時候可能沒有辦法搞清楚導(dǎo)致問題發(fā)生的原因所在,比較含糊、似懂非懂的記憶會讓人在一個問題上大費周章。我也曾經(jīng)有在某些不感興趣的知識點上看個大概、淺嘗輒止的經(jīng)歷,其結(jié)果就是卡在某個問題上,不得不回去補(bǔ)課,知識夯實之后再回過頭來解決問題。
做一段時間研發(fā)就會發(fā)現(xiàn),莫非定律在嵌入式領(lǐng)域發(fā)生得非常頻繁,即懷疑可能會出問題的點,一定會出問題。也就是說,在不了解原理的情況下進(jìn)行程序編寫,似是而非的代碼導(dǎo)致的問題終有一天會爆發(fā),到那個時候,勢必需要花更多的時間了解其根本原理。
理論基礎(chǔ)主要是指編譯原理、操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)與算法。如果不懂編譯原理,那么有可能在遇到棧溢出、符號或調(diào)用無法找到等問題時無所適從。操作系統(tǒng)理解得不透徹,可能就會在中斷、進(jìn)程線程調(diào)度、內(nèi)存使用等方面碰壁。數(shù)據(jù)結(jié)構(gòu)與算法的薄弱,則會讓你在想要實現(xiàn)一些功能時把數(shù)據(jù)組織得比較差,性能上會出現(xiàn)問題。
如果立志做一名嵌入式工程師,我認(rèn)為基礎(chǔ)再多鞏固也不為過。而對于多做項目這個問題,應(yīng)該是說做得越多越好,畢竟紙上談兵不是嵌入式工程師的角色。這些項目可以來自于實驗室、公司,乃至于開源社區(qū)。
最開始的時候不必瞄準(zhǔn)非常專注的方向,因為你并不知道什么更適合你。說到適合我是這樣認(rèn)為的,每位工程師可能在不同的領(lǐng)域有天賦,如果選擇的方向適合,那么將展現(xiàn)出你非凡的能力(當(dāng)然,我說的是普通工程師,不排除某些天才可以在每個領(lǐng)域都出類拔萃)。當(dāng)做了很多模塊之后,再選擇一個方向深入研究,努力成為這個領(lǐng)域的專家,此時既有方向和目的性,又不會因為過于狹窄的知識面而導(dǎo)致管中窺豹、盲人摸象。
多做項目的另一個好處是,可以有更多的機(jī)會與他人合作、溝通交流,很多時候一個人鉆牛角尖、不得要領(lǐng),卻可能在他人的一句提示下茅塞頓開。Open source就是一個很好的例證,眾人拾柴火焰高。
關(guān)于嵌入式未來的發(fā)展方向,這個話題比較大,因為未來的事情難以預(yù)測,尤其是在這樣一個日新月異、瞬息萬變的時代。從短期來看,我認(rèn)為,嵌入式開發(fā)的方向主要有:
(1)移動終端
手機(jī)仍然在不斷發(fā)展,更加智能化應(yīng)該是一個共同的方向。目前,越來越多的解決方案都加入了當(dāng)前最火熱的人工智能、機(jī)器學(xué)習(xí)模型的inference加速芯片在手機(jī)里面,使得訓(xùn)練完備的模型能夠運行在移動終端。無論你是學(xué)機(jī)器學(xué)習(xí)算法,還是學(xué)嵌入式編程,這里都是一片新天地。
(2)智能家居
目前涌現(xiàn)出越來越多的智能家居設(shè)施,比如空調(diào)、凈化器、掃地機(jī)器人等等,這些無疑方便了人們的生活,而如何添加一些更易用的功能就成了一個新的挑戰(zhàn)。作為嵌入式從業(yè)者,完全可以從這個方向切入,不斷創(chuàng)新。
(3) VR和AR
這個可能并不是大眾市場,它們代表的是娛樂方向。我們可以參考游戲機(jī)的發(fā)展,從掌機(jī)到紅白機(jī),再到SEGA、土星、PS、 XBOX,其實都是在完成一件事情,讓游戲更加真實。AR和VR更是如此,讓人身臨其境,得到沉浸式的體驗,有朝一日,或許《黑客帝國》中的故事真的會發(fā)生。嵌入式工程師在這里或許會成為游戲規(guī)則的制定者,你準(zhǔn)備好了嗎?
(責(zé)任編輯:蘆瀟靜)