相信不少剛入行1-2年,甚至5年10年的嵌入式工程師都會有這些疑惑。我作的事情好像沒有多少技術含量,我作的事情好像沒有多少創新,作嵌入式的技術競爭力到底在哪?嵌入式究竟是作驅動好仍是作應用好?程序員
不少人說,嵌入式要學習不少不少的技能才能找到工做,既要懂硬件,還要懂編程,精通C/C++,懂操做系統Linux內核,懂通訊(4G 5G),懂自動控制,懂數字信號處理,懂網絡協議棧,懂FPGA,懂電磁兼容,懂Android,是這樣嗎?(這確定是有人在吹牛裝逼)。火哥今天和你們聊聊這個話題。web
1、嵌入式的技術競爭力必須因地制宜,根據你所在的具體環境具體分析,case by case, 沒有萬能藥方面試
說到作嵌入式的技術競爭力,實際上是和每一個嵌入式工程師所身處的環境有關。所謂的環境包括:你的學歷,你的家庭因素(是否已婚,家裏老人妻兒是否須要時間精力照顧),你所在的城市以及該城市的嵌入式相關產業結構,你目前從事的行業和業務,你如今的工做年限和當前已經有的基礎技能與業務技能積累深度,你所認識的或互相信任的同行業的人脈等等。算法
火哥所擁有的技術競爭力,放在你所處的環境每每不必定有競爭力,這就比如你在一個二三線城市,整個城市沒有一家作AI深度學習相關的公司,火哥若是給你分享嵌入式+AI深度學習的技能,在你的環境裏就毫無參考意義,若是你只是公司的一個小兵,工做權限只能修改一個模塊,火哥給你分享的複雜業務場景下大規模軟件架構技術也意義不大。編程
不少時候我的是難以改變現有環境的,要麼從新選擇環境,要麼適應環境,再參考別人分享的經驗,根據本身當前的環境情況,作出對本身最有利的選擇。安全
另外還有一個老生常談的撕逼問題,嵌入式究竟是作驅動好仍是作應用好,其實也是要根據所在城市和公司的組織架構狀況而定的,沒有絕對優劣。網絡
火哥第一家公司是屬於傳統行業大廠的嵌入式Linux產品開發(火哥在應用部門),內核驅動和應用軟件部門是嚴格劃分的,驅動部門大部分都是5年經驗以上核心老員工(相對薪資也高一些),通常不直接校招,應用部門工做3-5年經驗的也能夠轉到驅動部門,沒有絕對限制和門檻。數據結構
應用軟件部門員工相對年輕,經驗淺,應用軟件部門沒有權限提交驅動代碼的修改,只能定位到驅動問題,讓驅動部門的工程師修改。當時這家公司不少核心的業務邏輯和通訊協議的代碼在驅動層,公司設計的這套組織架構也是爲了保證核心部門員工的穩定性,並非說作應用就沒有技術含量,就很難再轉驅動了。架構
火哥第二家公司是新興行業小廠AI相關嵌入式Linux產品開發,嵌入式開發就一個部門8我的(小廠人少,分工就不細),7我的作應用層開發(火哥仍是作應用),1我的作底層驅動。可是底層驅動的人,只是負責新的硬件和驅動功能集成到系統裏面,作應用開發的同事,若是遇到底層的驅動的bug,也要本身有能力解決,底層驅動的同事並不會幫你處理舊的模塊的bug。框架
火哥第三家公司是新興行業大廠的Android系統平臺開發(火哥終於有作底層驅動的機會了)。公司組織架構上根本就不是按驅動開發部門和應用開發部門這樣劃分的,而是按模塊劃分部門,好比攝像頭組,存儲組,視頻編解碼組,音頻編解碼組,藍牙、wifi組,功耗電源組,bsp組等等。
每一個組,只要你負責的模塊有問題,無論是在內核驅動層仍是在應用層,都屬於你要處理的。好比攝像頭組,你要有獨立解決攝像頭驅動和應用軟件的能力,而不是說我只作攝像頭驅動,應用無論。
另外火哥還了解到,在二三線城市甚至深圳這種一線城市,一些小廠(尤爲是作單片機mcu項目的小廠,可能就二三十人甚至更少),因爲人手不夠,或者硬件部門,軟件部門暫時沒有招到合適的人,因此有些嵌入式軟件工程師不得不暫時甚至長期兼顧PCB硬件原理圖設計的工做。
固然火哥認爲軟硬設計都作的工做實在是不合理,分散精力容易出不少問題,可是不得不認可這種分工的工做在嵌入式(尤爲是單片機mcu開發)工程師中是客觀存在的,老闆安排的硬件相關工做也不得不去承擔。
雖然說每一個人具體的技術競爭力問題要根據實際狀況,case by case分析,可是火哥仍是但願經過本文,拋磚引玉,給出一些case,來引導小夥伴們進行深度思考。
2、能保證飯碗的基礎技術競爭力
通常嵌入式工程師都是指在嵌入式平臺作軟件開發的工程師,沒有專門的嵌入式硬件工程師說法(硬件工程師自有專門的硬件工程師,這裏以軟件爲主)。雖然沒有萬能的技術競爭力,找工做也不是什麼都要懂(公司招人的基本要求是可以立刻幹活幫老闆解決問題,而不是啥都懂吹技術牛逼)。
可是嵌入式仍是有些通用的技術技能須要掌握才能成爲一個合格的嵌入式工程師,隨時保證有一個嵌入式的飯碗,能在一線城市找到月薪10K以上的工做(二三線城市根據實際狀況遞減),火哥仍是建議你要掌握如下幾點通用嵌入式基礎技術。
1. 編程能力
編程能力不用多解釋,嵌入式開發主要仍是軟件編程嘛,C語言儘可能精益求精,各類指針、結構體,聯合體的高級用法倒背如流不須要問人(能夠上豆瓣搜3-5本高分的C語言編程書籍細看),C語言編程能力就是嵌入式開發的命根子。
另外,數據結構對於現代的大規模嵌入式軟件開發(無論是單片機mcu仍是Linux)也是必學科目,我知道不少電子通訊,自動化專業出身的嵌入式工程師沒有學過數據結構的課程,因此在這裏囉嗦一下,去學吧,否則很難看懂別人寫的複雜的程序結構(儘管學了也不保證看得懂)。
另外,基本的計算機算法(堆和棧搜索,鏈表反轉,哈希表,二叉樹,紅黑樹,深度優先廣度優先,時間複雜度……),有時間儘可能學一學,補齊短板,雖然並非說工做中要本身從頭實現或者工做中絕對能用到(知道大家大部分人都是寫業務邏輯代碼),可是不少公司筆試面試要考,不學可能過不了面試,學了能夠開拓思路。
C++語言應該也是要懂的,可是C++範式太多,學習時間會比較長,並且每過幾年還會更新,能夠先工做,而後工做有時間慢慢學。不要求精通C++(根本就不可能精通全部C++特性和範式),可是至少可以看得懂基本的語法代碼,能改動別人的C++程序,能調用別人實現好的class實現你的功能。
另外最好懂一門腳本語言,好比Python, Python在作測試用例代碼和自動化工具的時候仍是用得挺多的,也不難學,比C/C++簡單(我以爲能夠先學Python,再學C++,這樣C++反而不會那麼難)。
2. 操做系統與計算機體系結構知識(包括一些編譯,連接的知識)
嵌入式程序員和非嵌入式程序員(純APP或者web開發)最大的能力差異就在解決操做系統底層,計算機體系結構相關問題的能力。操做系統知識對於作Linux/Android 或者 RTOS開發的嵌入式程序員,不用我囉嗦,學吧,最好還要能看看Linux內核源代碼,理解其中的各類子系統的設計機制和設備模型。
對於單片機MCU裸機開發的程序員,雖然可能暫時用不上,但建議大家有時間仍是應該學一下,這樣對之後換環境跳槽選擇的路子會更寬(相比於徹底不懂操做系統的老單片機工程師有優點),並且Linux FreeRTOS等操做系統內核都是開源的,裏面有豐富的代碼可能能夠給你單片機編程提供參考(抄),擴展思路。
計算機體系結構的知識,能夠說是作嵌入式程序員(無論是作Linux、Android、RTOS仍是單片機MCU裸機)的內功心法。一個CPU是按照什麼樣的流程執行程序,cache是什麼有什麼用,TLB是啥,MMU有什麼用,中斷流程是怎麼執行,中斷服務函數和通常函數有啥不一樣,一個程序運行的地址空間和各類段是怎麼樣的分佈,系統是怎麼啓動最後運行你的應用程序,系統是怎麼管理內存,防止碎片化,動態庫靜態庫原理上有啥區別,你所使用的編譯器工具鏈,硬浮點軟浮點的基本原理和使用條件。
(不懂的能夠從《深刻理解計算機系統》這本書入手)。這一系列體系結構有關的知識,火哥認爲,無論是作操做系統仍是作裸機嵌入式,都必須掌握,才能在面試中,獲得面試官對你技術底子的承認(不少候選人,可能公司相關業務知識不熟,可是技術底子不錯,面試官也會考慮給機會)。
3. 硬件的基本知識
關於嵌入式要學多少硬件的問題,衆說紛紜,有些文章渲染地神乎其神,軟硬通吃。可是火哥在嵌入式軟件工程師的面試中,其實被問的真正的硬件問題(CPU中斷這些體系結構知識不算真正硬件知識,體系結構知識是嵌入式必備的)並很少(50次面試就2-3次問過硬件),並且火哥是自動化專業出身,讀書的時候模電,數電都有認真學,課程設計都有認真作,讀書的時候也有過電力電子的項目經歷,於是面試的硬件問題對火哥來講基本不是問題。
火哥的觀點就是,對於電子通訊、自動化專業出身的嵌入式工程師,之前學校讀書學的模電,數電課本知識基本可以知足平時嵌入式軟件開發中,看懂原理圖,看示波器,和硬件工程師合做溝通,定位軟硬件問題的需求,並不須要再增強多少硬件知識,也不須要真正去設計電路圖,PCB,EMC電磁兼容之類的東西,固然懂一些更好,可是也對找工做加不了太多分。
可是若是是計算機類專業出身,對硬件徹底沒有概念也不行,仍是須要花1-2個月時間,看看模電、數電的課本,學習示波器的使用,3個月足以學習基本的概念知識,示波器的使用也就像使用一個辦公軟件同樣,不須要多精通,會用就行,沒有網上吹的那麼神(動不動示波器分析射頻電路,fft頻譜特性,動態響應特性)。
固然若是是在作單片機MCU開發的小公司,因爲公司缺少人手,須要兼顧硬件開發的話,那隻好硬着頭皮上了,可是這樣花費的時間精力可能比較多,對你跳槽正規大廠的嵌入式也沒有多少好處。
4. 計算機網絡知識
計算機網絡,TCP/IP,套接字編程,若是是電子通訊專業出身的,學吧!現代嵌入式設備鏈接網絡的功能愈來愈多,愈來愈常見,不必定要把TCP/IP協議啃得很深(Linux內核有現成的開源實現代碼,不須要你從0開始作),可是基本的概念和網絡應用編程仍是要懂,才能增長你的就業機會。
5. 各類寄存器,軟硬件調試方法和經驗
調試配置寄存器,軟硬件聯調就是傳統嵌入式代代相傳的手藝活了。這也很能體現大部分人所謂的實際項目中解決問題的能力(定位問題到寄存器配置上,解決問題真有成就感哈!),這項能力仍是要靠實際的項目來鍛鍊,也就是嵌入式中所謂的吃經驗的東西。
但火哥認爲,現代嵌入式開發不要太迷信這種調試寄存器帶來的成就感,仍是應該把大部分精力放在計算機軟件、操做系統,體系結構等基礎知識的學習上。調試寄存器的能力就像NBA比賽的灌籃技能同樣,頗有成就感,帶來全場歡呼,可是畢竟不是常規得分手段,也不是常規技能(大部分得分仍是要靠戰術配合,投籃,上籃,三分遠射),嵌入式開發大部分精力仍是要放在編程,實現業務邏輯上。
3、升職加薪的業務技術競爭力
要想在公司升值加薪,除了基礎技術競爭力以外(這項只能幫你好跳槽,找工做,不保證升職加薪),還須要和公司業務相關的技術競爭力(這項競爭力只在同行業跳槽有效,不保證跨行業跳槽)。
所謂業務技術競爭力,就是在特定行業和公司纔有價值的技術競爭力,是沒法輕易從書本獲取的技術。儘管火哥認可Linux內核,操做系統原理,計算機基礎算法,計算機體系結構這些知識有必定難度,不是那麼容易學的,可是畢竟一個沒有工做經驗的學生都能從書本這種最廉價的途徑獲取,因此沒法構成業務競爭力的壁壘,業務技術競爭力也是學生和有工做經驗的工程師最主要的差距。
通常來講,業務技術須要入行以後,在工做中學習,並且不一樣行業不一樣公司能學習到的業務技術是不同的。好比說,通訊行業的公司,4G LTE協議,標準相關的技術就是業務技術競爭力;網絡產品行業的公司,那些網卡路由標準協議相關的技術就是業務競爭力;機頂盒產品的公司,音視頻流媒體編解碼播放的相關技術標準就是業務競爭力;網絡攝像頭產品的公司,攝像頭數據採集與網絡通訊協議相關的技術和標準就是業務競爭力……
通常進入某個行業某個公司以後,只有多學習積累公司業務相關的知識,才能本身獨立完成業務相關的項目,而後指導新人、同事,帶領團隊作業務相關的更大的項目,進而在公司掌握更大的業務話語權,和高管討論公司業務規劃,乃至戰略規劃。
通常站在公司高管的角度,思考的問題都是業務發展方向和戰略上的問題,一個工程師Linux內核底層驅動理論和技術能力再好,若是不是在Red Hat SUSE 或者華爲的Linux內核部門這種把內核開發做爲業務方向的公司和部門,那麼你牛逼的底層技術能力,也只是一項基礎技術,平時工做解決的再複雜再難的底層內核問題,寫的再風騷的代碼,在高管眼裏都只是解決一個普通問題,實現一個普通功能而已。
這些都是爲公司的業務服務的鋪路石而已,而高管就像在路上開車,眼裏只有終點,儘管鋪路石的好壞可能致使路上的顛簸,可是隻要順利到達終點鋪路石看起來並無那麼重要。
能夠說,在公司,你所掌握的和公司戰略方向相關的業務技能,就像一個放大器,把你實際的技術能力和價值放大多倍,進而帶來更高的收益。但這也帶來了一些問題,若是公司近年的業績不夠好,你牛逼的業務能力可能不會給你帶來等價的回報,那就得考慮你在公司業務方向上花費的時間和精力到底值不值。
火哥第一家公司就有很多業務專家,可是公司業績一年不如一年,致使業務專家也和普通小兵同樣拿死工資,沒有獲得相應的年終獎,最後,火哥跳槽出來的時候,差很少算跨行跳槽,相關的業務知識也在面試中沒有太大的幫助。
同時,火哥也在和不少面試官聊天中,發現不少業務牛人,出來面試,雖然業務技術牛逼,可是基礎技術花費的精力不夠,因此沒有獲得面試官的承認。固然,在同行跳槽的狀況下,業務技術能力的加分仍是很大的,好比手機行業,高通跳槽去OPPO、小米的對口部門,待趕上的提高就不少,可是這種真正業務對口的跳槽機會,火哥認爲佔少數,因此在業務技術競爭力上,行業的選擇必定要有眼光,高薪跳槽機會多的行業,業務技術纔是有競爭力的技術(儘管可能不是最難的技術)。
4、沒法輕易獲取的門檻技術競爭力
所謂沒法輕易獲取的門檻技術競爭力其實也是業務競爭力的一種,只是相對於常規的業務競爭力來講具備更高的獲取門檻。上一節所說的業務競爭力是指通常的業務競爭力,能夠在公司內部,經過參與公司實際項目,業務知識培訓或者老員工指導,口口相傳中獲取。
而這種門檻技術,在公司中通常也是保密的,非偶然機遇,沒法獲取,靠本身找資料自學琢磨基本行不通。嵌入式開發相關領域沒法輕易獲取的門檻技術競爭力通常有這些(若是火哥說的有遺漏,能夠後臺私信補充):
這些門檻業務技能,除非你有偶然的機會,去了某個IC原廠專門的部門,不然基本不可能接觸到這種高門檻的業務技能。若是你在OEM產商從事相關的崗位驅動(好比在小米作手機的camera或者WIFI開發),你也只能從高通或MTK拿到二進制的固件,幾乎不可能看到核心業務邏輯的源代碼。
這些模塊雖然Linux內核驅動部分可能爲了遵照GPL協議開源,可是通常這種開源的驅動都是hardware enable的驅動,也就是說驅動裏面只有使能或者中止設備的基本功能,核心業務邏輯相關的代碼都抽出來作在固件(能夠是內核加載的固件,也能夠是應用層的閉源庫)。
有機會接觸這類高門檻核心業務崗位,也算一種幸運,若是能跳槽到對口的公司,可能拿到很是高的待遇(固然也可能跳槽要籤競業協議,每個月從老東家拿錢)。
這種崗位的員工,在就業市場上是很是難招的,公司也會出於防止核心門檻業務技術機密泄露的目的,花大價錢留住這些核心員工,也不會培養太多懂得這些核心門檻業務技術的員工。
有機會從事相關門檻業務技術的開發,若是跳槽到對口的賺錢的公司,就有突破年薪50W甚至100W的機會,也算是一種幸運吧。這種嵌入式領域的門檻業務技術自己的難度相對於Linux內核,Android系統框架等複雜系統而言,也不是絕對的難(畢竟大規模應用的技術,自己不可能比理論性的東西難,智商良好的大學生應該都能學會),可是輕易沒法獲取,會有一種神祕感。
5、跳槽漲薪的新興技術競爭力
目前嵌入式相關的行業和領域,出現了不少不一樣於傳統嵌入式領域的產品與解決方案,好比嵌入式+物聯網+雲端,嵌入式+大數據,嵌入式+人工智能,嵌入式+無人駕駛……
關於這些新興技術,也有一些爭議,有些老的工程師對這些東西表示不屑,認爲也不是頗有技術難度和深度,就是調用一下別人作的雲端或者AI的API,有不少泡沫,沒法落地等等……他們以爲作嵌入式仍是不能浮躁,應該踏踏實實去鑽研Linux內核,網絡協議棧等很是深很是難的已有技術。
可是,火哥對年輕的嵌入式工程師往新興技術領域發展,持支持的態度,我也相信咱們公司總監說的「right time to do right things」。並且從大的趨勢上看,NVIDIA公司推出的Jetson平臺,AI邊緣計算解決方案以及Xavier平臺無人駕駛解決方案;Intel公司收購以色列無人駕駛芯片公司MobilEye;ARM公司在CPU裏面作的神經網絡並行矢量計算加速庫,最近也大規模招聘物聯網與雲端項目相關的工程師;華爲的海思麒麟970芯片集成AI加速單元NPU;瑞星微RK3399Pro也有NPU支持各類AI應用的部署……
行業領軍公司的佈局,種種跡象代表,AI、物聯網、雲端+嵌入式解決方案的新興技術,已是大勢所趨,並不像某些有經驗的老工程師所說的都是泡沫,沒法落地。
因此,火哥仍是建議剛入行作嵌入式的年輕人,儘可能地往嵌入式+人工智能+物聯網+雲端的應用解決方案領域靠攏,要勇於嘗試新生事物。新興技術可以落地應用,就證實這裏面並非特別難學,也不是必定要鑽研內核驅動,積累很深的東西才能學新興技術。
並且不難學的技術,不表明沒有技術含量,技術上的東西,不少時間是在信息不對稱的狀況下,打一個時間差,搶到一個合適的崗位,雖然以那些老工程師的智商,應該也能學會這些新興技術,可是他們不必定有這個時間和精力(時間成本多是最大的成本),換行成本也比較高,因此這塊更適合年輕人爭取時間差,在懂得這項技術的人還很少的時候,趕快搶到一個好的位置,可以有業務上的話語權。
從另外一方面說,因爲以前2節所描述的嵌入式領域業務技術上的競爭力,在傳統領域,因爲已經發展了一段時間,有不少行業大佬已經掌握這些傳統業務的技術話語權,並且部分業務還有很大的得到門檻,必需要努力+機遇纔有機會進入對應崗位作下去,靠自學很難積累。
一旦一個領域,在你前面積攢了8年,10年甚至15年以上經驗的大佬太多,而且制定了太多的行業標準和專利,你就只能被別人的業務標準和專利牽着鼻子走,很難作到很高的位置。
這就像不少工程師說,在單片機上實現藍牙,WIFI,TCP/IP協議棧也是很難頗有挑戰的,然而,作技術的目的是爲了什麼,花這麼多精力從新實現複雜的協議棧,只是爲了炫耀技術牛逼嗎?在這些成熟技術的領域,已經有不少前人鋪好路,有不少現成的模塊和開源代碼,也有不少的別人制定的認證標準和專利(所謂認證標準就是在某些市場,某些產品哪怕實現了全部功能,可是若是功能不符合一些公司制定的標準,那就拿不到認證,產品不容許在這個市場出售。
好比音頻相關的產品如何沒有經過杜比認證,在不少市場就不被接受,你不得不花時間學習不少別人制定的標準,而有制定標準話語權的大佬,能夠爲所欲爲修改標準)。因此年輕人靠新興的技術,在嵌入式+人工智能,嵌入式+物聯網+雲端等領域,經過同起點,一樣的學習時間,可能能夠作到彎道超車,3年以內,在收入上超過那些工做8年,10年的大佬。
固然,火哥所說的這些新興技術領域和行業,也要根據你自身的狀況因地制宜,制定學習的計劃。
首先,不是全部城市都有這些新興技術領域的相關企業,若是你想入行新領域,可能就得作出跳槽去北上深等一線城市的決策,若是已經在二三線城市安家,要照顧家人,可能就得作一些取捨,不得不放棄這些發展計劃,繼續在舊的領域深耕。
其次,第二節所說的基礎技術競爭力應該放在首位。在夯實基礎(不必定要達到精通,可是仍是要紮實)的狀況下,保證能獲得面試官的對你技術底子的承認,能找到合適的工做的前提下,跳過2、三節所說的傳統業務技術的學習,直接進入新興技術領域,彎道超車。
最後,要保持一雙火眼金睛,要可以識別出你所作的新興業務究竟是真新興,仍是傳統業務包了一層皮。好比有些童鞋在所謂作嵌入式+物聯網業務的公司,實際上天天的工做就是用stm32單片機和NB-IOT模塊,天天作一些調用單片機UART,I2C接口和NB-IOT模組通訊的重複性工做,這就不算是真正的新興業務,也不具有真正的新興技術競爭力。
真正的嵌入式+物聯網領域的技術競爭力應該熟悉整套IOT終端到雲端的解決方案架構,熟悉如何搭建部署這套系統,熟悉IOT設備與終端和雲端的通訊協議的核心業務邏輯。同理,在嵌入式+AI相關的公司,雖然嵌入式工程師不必定要懂得本身實現AI核心算法,可是核心技術競爭力也不是指調用別人的人臉識別閉源庫函數,作簡單人臉識別應用。
火哥認爲嵌入式+AI相關領域的核心業務競爭力,也是在熟悉整套邊緣端到雲的AI計算系統架構和解決方案,懂得一些AI算法的基本原理(不必定要本身獨立能實現),各類神經網絡的優劣,能對嵌入式平臺的AI軟件作系統級別的計算性能的加速優化,部署落地,解決客戶實際應用場景中的問題,提供反饋給作AI算法的工程師,幫助他們修正訓練出來的模型。
最後也灌一句雞湯,Right time to do right things。
---END---
轉載自火哥公衆號 嵌入式老鳥的職場之道
關注公衆號百問科技(ID:baiwenkeji)第一時間閱讀嵌入式乾貨。技術交流加我的威信13266630429,驗證:博客園