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