關於嵌入式的技術競爭力需要花點時間整理一下給大家

2022-05-20   大方老師單片機

原標題:關於嵌入式的技術競爭力需要花點時間整理一下給大家

關於嵌入式的技術競爭力需要花點時間整理一下給大家

///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比///

相信很多剛入1-2年,甚510年的嵌入式工程師都會有這些疑惑。我做的事情好像沒有多少技術含量,我做的事情好像沒有多少創新,做嵌入式的技術競爭力到底在哪?嵌入式到底是做驅動好還是做應用好?

很多人說,嵌入式要學習很多很多的技能才能找到工作,既要懂硬體,還要懂編程,精C/C++,懂操作系Linux內核,懂通(4G 5G),懂自動控制,懂數位訊號處理,懂網絡協議棧,FPGA,懂電磁兼容,Android,是這樣嗎(這肯定是有人在吹牛裝)。火哥今天和大家聊聊這個話題。

一、嵌入式的技術競爭力必須因地制宜,根據你所在的具體環境具體分析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,來引導小夥伴們進行深度思考。

二、能保證飯碗的基礎技術競爭力

一般嵌入式工程師都是指在嵌入式平台做軟體開發的工程師,沒有專門的嵌入式硬體工程師說(硬體工程師自有專門的硬體工程師,這裡以軟體為)。雖然沒有萬能的技術競爭力,找工作也不是什麼都要(公司招人的基本要求是能夠馬上幹活幫老闆解決問題,而不是啥都懂吹技術牛)

但是嵌入式還是有些通用的技術技能需要掌握才能成為一個合格的嵌入式工程師,隨時保證有一個嵌入式的飯碗,能在一線城市找到月10K以上的工(二三線城市根據實際情況遞),火哥還是建議你要掌握以下幾點通用嵌入式基礎技術。

1.編程能力

編程能力不用多解釋,嵌入式開發主要還是軟體編程嘛C語言儘量精益求精,各種指針、結構體,聯合體的高級用法滾瓜爛熟不需要問(可以上豆瓣3-5本高分C語言編程書籍細)C語言編程能力就是嵌入式開發的命根子。

另外,數據結構對於現代的大規模嵌入式軟體開(不管是單片mcuLinux)也是必學科目,我知道很多電子通信,自動化專業出身的嵌入式工程師沒有學過數據結構的課程,所以在這裡囉嗦一下,去學吧,不然很難看懂別人寫的複雜的程序結(儘管學了也不保證看得)

另外,基本的計算機算(堆和棧搜索,鍊表反轉,哈希表,二叉樹,紅黑樹,深度優先廣度優先,時間複雜),有時間儘量學一學,補齊短板,雖然並不是說工作中要自己從頭實現或者工作中絕對能用(知道你們大部分人都是寫業務邏輯代),但是很多公司筆試面試要考,不學可能過不了面試,學了可以開拓思路。

C++語言應該也是要懂的,但C++範式太多,學習時間會比較長,而且每過幾年還會更新,可以先工作,然後工作有時間慢慢學。不要求精C++(根本就不可能精通所C++特性和範式),但是至少能夠看得懂基本的語法代碼,能改動別人C++程序,能調用別人實現好class實現你的功能。

另外最好懂一門腳本語言,比Python, Python在做測試用例代碼和自動化工具的時候還是用得挺多的,也不難學,C/C++簡單(我覺得可以先Python,C++,這C++反而不會那麼難)。

2.作業系統與計算機體系結構知(包括一些編譯,連結的知)

嵌入式程式設計師和非嵌入式程序(APPweb)最大的能力差別就在解決作業系統底層,計算機體系結構相關問題的能力。作業系統知識對於Linux/Android RTOS開發的嵌入式程式設計師,不用我囉嗦,學吧,最好還要能看Linux內核原始碼,理解其中的各種子系統的設計機制和設備模型。

對於單片MCU裸機開發的程式設計師,雖然可能暫時用不上,但建議你們有時間還是應該學一下,這樣對以後換環境跳槽選擇的路子會更(相比於完全不懂作業系統的老單片機工程師有優),而Linux FreeRTOS等作業系統內核都是開源的,裡面有豐富的代碼可能可以給你單片機編程提供參考(抄),擴展思路。

計算機體系結構的知識,可以說是做嵌入式程序(不管是LinuxAndroidRTOS還是單片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比賽的灌籃技能一樣,很有成就感,帶來全場歡呼,但是畢竟不是常規得分手段,也不是常規技(大部分得分還是要靠戰術配合,投籃,上籃,三分遠),嵌入式開發大部分精力還是要放在編程,實現業務邏輯上。

三、升職加薪的業務技術競爭力

要想在公司升值加薪,除了基礎技術競爭力之(這項只能幫你好跳槽,找工作,不保證升職加),還需要和公司業務相關的技術競爭(這項競爭力只在同行業跳槽有效,不保證跨行業跳)

所謂業務技術競爭力,就是在特定行業和公司才有價值的技術競爭力,是無法輕易從書本獲取的技術。儘管火哥承Linux內核,作業系統原理,計算機基礎算法,計算機體系結構這些知識有一定難度,不是那麼容易學的,但是畢竟一個沒有工作經驗的學生都能從書本這種最廉價的途徑獲取,所以無法構成業務競爭力的壁壘,業務技術競爭力也是學生和有工作經驗的工程師最主要的差距。

一般來說,業務技術需要入行之後,在工作中學習,而且不同行業不同公司能學習到的業務技術是不一樣的。比如說,通信行業的公司4G LTE協議,標準相關的技術就是業務技術競爭力;網絡產品行業的公司,那些網卡路由標準協議相關的技術就是業務競爭力;機頂盒產品的公司,音視頻流媒體編解碼播放的相關技術標準就是業務競爭力;網絡攝像頭產品的公司,攝像頭數據採集與網絡通信協議相關的技術和標準就是業務競爭……

一般進入某個行業某個公司之後,只有多學習積累公司業務相關的知識,才能自己獨立完成業務相關的項目,然後指導新人、同事,帶領團隊做業務相關的更大的項目,進而在公司掌握更大的業務話語權,和高管討論公司業務規劃,乃至戰略規劃。

一般站在公司高管的角度,思考的問題都是業務發展方向和戰略上的問題,一個工程Linux內核底層驅動理論和技術能力再好,如果不是Red Hat SUSE或者華為Linux內核部門這種把內核開發作為業務方向的公司和部門,那麼你牛逼的底層技術能力,也只是一項基礎技術,平時工作解決的再複雜再難的底層內核問題,寫的再風騷的代碼,在高管眼裡都只是解決一個普通問題,實現一個普通功能而已。

這些都是為公司的業務服務的鋪路石而已,而高管就像在路上開車,眼裡只有終點,儘管鋪路石的好壞可能導致路上的顛簸,但是只要順利到達終點鋪路石看起來並沒有那麼重要。

可以說,在公司,你所掌握的和公司戰略方向相關的業務技能,就像一個放大器,把你實際的技術能力和價值放大多倍,進而帶來更高的收益。但這也帶來了一些問題,如果公司近年的業績不夠好,你牛逼的業務能力可能不會給你帶來等價的回報,那就得考慮你在公司業務方向上花費的時間和精力到底值不值。

火哥第一家公司就有不少業務專家,但是公司業績一年不如一年,導致業務專家也和普通小兵一樣拿死工資,沒有得到相應的年終獎,最後,火哥跳槽出來的時候,差不多算跨行跳槽,相關的業務知識也在面試中沒有太大的幫助。

同時,火哥也在和很多面試官聊天中,發現很多業務牛人,出來面試,雖然業務技術牛逼,但是基礎技術花費的精力不夠,所以沒有得到面試官的認可。當然,在同行跳槽的情況下,業務技術能力的加分還是很大的,比如手機行業,高通跳槽OPPO、小米的對口部門,待遇上的提升就很多,但是這種真正業務對口的跳槽機會,火哥認為占少數,所以在業務技術競爭力上,行業的選擇一定要有眼光,高薪跳槽機會多的行業,業務技術才是有競爭力的技(儘管可能不是最難的技)

四、無法輕易獲取的門檻技術競爭力

所謂無法輕易獲取的門檻技術競爭力其實也是業務競爭力的一種,只是相對於常規的業務競爭力來說具有更高的獲取門檻。上一節所說的業務競爭力是指一般的業務競爭力,可以在公司內部,通過參與公司實際項目,業務知識培訓或者老員工指導,口口相傳中獲取。

而這種門檻技術,在公司中一般也是保密的,非偶然機遇,無法獲取,靠自己找資料自學琢磨基本行不通。嵌入式開發相關領域無法輕易獲取的門檻技術競爭力一般有這(如果火哥說的有遺漏,可以後台私信補):

4G/5G通信基帶算法與核心業務邏輯

WiFi、藍牙驅動加載的固件IP中核心的算法與業務邏輯

Camera驅動加載的固件IPMIPI-CSI高速數據採集接口相關的核心業務邏輯ISP(數字圖像處)相關的核心算法與業務邏輯

GPU驅動加載的固件IP,以OpenGLCUDAOpenCLAPI標準的庫實現中核心的算法與業務邏輯

音視頻編解Codec驅動加載的固件IP,以OpenMaxAPI標準的庫實現中的核心算法與業務邏輯

LCD/OLED螢幕,或HDMI螢幕驅動加載的固件IP中核心的業務邏輯和實現

嵌入式設備電源低功耗相關技術

嵌入式設備信息安全與密碼保護相關技術

這些門檻業務技能,除非你有偶然的機會,去了某IC原廠專門的部門,否則基本不可能接觸到這種高門檻的業務技能。如果你OEM產商從事相關的崗位驅(比如在小米做手機cameraWIFI),你也只能從高通MTK拿到二進位的固件,幾乎不可能看到核心業務邏輯的原始碼。

這些模塊雖Linux內核驅動部分可能為了遵GPL協議開源,但是一般這種開源的驅動都hardware enable的驅動,也就是說驅動裡面只有使能或者停止設備的基本功能,核心業務邏輯相關的代碼都抽出來做在固(可以是內核加載的固件,也可以是應用層的閉源)

有機會接觸這類高門檻核心業務崗位,也算一種幸運,如果能跳槽到對口的公司,可能拿到非常高的待(當然也可能跳槽要簽競業協議,每月從老東家拿)

這種崗位的員工,在就業市場上是非常難招的,公司也會出於防止核心門檻業務技術機密泄露的目的,花大價錢留住這些核心員工,也不會培養太多懂得這些核心門檻業務技術的員工。

有機會從事相關門檻業務技術的開發,如果跳槽到對口的賺錢的公司,就有突破年50W100W的機會,也算是一種幸運吧。這種嵌入式領域的門檻業務技術本身的難度相對Linux內核Android系統框架等複雜系統而言,也不是絕對的(畢竟大規模應用的技術,本身不可能比理論性的東西難,智商良好的大學生應該都能學),但是輕易無法獲取,會有一種神秘感。

五、跳槽漲薪的新興技術競爭力

目前嵌入式相關的行業和領域,出現了很多不同於傳統嵌入式領域的產品與解決方案,比如嵌入+物聯+雲端,嵌入+大數據,嵌入+人工智慧,嵌入+無人駕……

關於這些新興技術,也有一些爭議,有些老的工程師對這些東西表示不屑,認為也不是很有技術難度和深度,就是調用一下別人做的雲端或AIAPI,有很多泡沫,無法落地等他們覺得做嵌入式還是不能浮躁,應該踏踏實實去鑽Linux內核,網絡協議棧等非常深非常難的已有技術。

但是,火哥對年輕的嵌入式工程師往新興技術領域發展,持支持的態度,我也相信我們公司總監說right time to do right things。而且從大的趨勢上看NVIDIA公司推出Jetson平台AI邊緣計算解決方案以Xavier平台無人駕駛解決方案Intel公司收購以色列無人駕駛晶片公MobilEyeARM公司CPU裡面做的神經網絡並行矢量計算加速庫,最近也大規模招聘物聯網與雲端項目相關的工程師;華為的海思麒970晶片集AI加速單NPU;瑞星RK3399ProNPU支持各AI應用的部……

行業領軍公司的布局,種種跡象表明AI、物聯網、雲+嵌入式解決方案的新興技術,已經是大勢所趨,並不像某些有經驗的老工程師所說的都是泡沫,無法落地。

所以,火哥還是建議剛入行做嵌入式的年輕人,儘量地往嵌入+人工智+物聯+雲端的應用解決方案領域靠攏,要敢於嘗試新生事物。新興技術能夠落地應用,就證明這裡面並不是特別難學,也不是一定要鑽研內核驅動,積累很深的東西才能學新興技術。

而且不難學的技術,不代表沒有技術含量,技術上的東西,很多時間是在信息不對稱的情況下,打一個時間差,搶到一個合適的崗位,雖然以那些老工程師的智商,應該也能學會這些新興技術,但是他們不一定有這個時間和精(時間成本可能是最大的成),換行成本也比較高,所以這塊更適合年輕人爭取時間差,在懂得這項技術的人還不多的時候,趕快搶到一個好的位置,能夠有業務上的話語權。

從另一方面說,由於之2節所描述的嵌入式領域業務技術上的競爭力,在傳統領域,由於已經發展了一段時間,有很多行業大佬已經掌握這些傳統業務的技術話語權,而且部分業務還有很大的獲得門檻,必須要努+機遇才有機會進入對應崗位做下去,靠自學很難積累。

一旦一個領域,在你前面積攢810年甚15年以上經驗的大佬太多,並且制定了太多的行業標準和專利,你就只能被別人的業務標準和專利牽著鼻子走,很難做到很高的位置。

這就像很多工程師說,在單片機上實現藍牙WIFI,TCP/IP協議棧也是很難很有挑戰的,然而,做技術的目的是為了什麼,花這麼多精力重新實現複雜的協議棧,只是為了炫耀技術牛逼嗎?在這些成熟技術的領域,已經有很多前人鋪好路,有很多現成的模塊和開原始碼,也有很多的別人制定的認證標準和專(所謂認證標準就是在某些市場,某些產品哪怕實現了所有功能,但是如果功能不符合一些公司制定的標準,那就拿不到認證,產品不允許在這個市場出售。

比如音頻相關的產品如何沒有通過杜比認證,在很多市場就不被接受,你不得不花時間學習很多別人制定的標準,而有制定標準話語權的大佬,可以隨心所欲修改標)。所以年輕人靠新興的技術,在嵌入+人工智慧,嵌入+物聯+雲端等領域,通過同起點,同樣的學習時間,可能可以做到彎道超車3年之內,在收入上超過那些工810年的大佬。

當然,火哥所說的這些新興技術領域和行業,也要根據你自身的情況因地制宜,制定學習的計劃。

首先,不是所有城市都有這些新興技術領域的相關企業,如果你想入行新領域,可能就得做出跳槽去北上深等一線城市的決策,如果已經在二三線城市安家,要照顧家人,可能就得做一些取捨,不得不放棄這些發展計劃,繼續在舊的領域深耕。

其次,第二節所說的基礎技術競爭力應該放在首位。在夯實基(不一定要達到精通,但是還是要扎)的情況下,保證能得到面試官的對你技術底子的認可,能找到合適的工作的前提下,跳過二、三節所說的傳統業務技術的學習,直接進入新興技術領域,彎道超車。

最後,要保持一雙火眼金睛,要能夠識別出你所做的新興業務到底是真新興,還是傳統業務包了一層皮。比如有些童鞋在所謂做嵌入+物聯網業務的公司,實際上每天的工作就是stm32單片機NB-IOT模塊,每天做一些調用單片UART,I2C接口NB-IOT模組通信的重複性工作,這就不算是真正的新興業務,也不具備真正的新興技術競爭力。

真正的嵌入+物聯網領域的技術競爭力應該熟悉整IOT終端到雲端的解決方案架構,熟悉如何搭建部署這套系統,熟IOT設備與終端和雲端的通信協議的核心業務邏輯。同理,在嵌入+AI相關的公司,雖然嵌入式工程師不一定要懂得自己實AI核心算法,但是核心技術競爭力也不是指調用別人的人臉識別閉源庫函數,做簡單人臉識別應用。

火哥認為嵌入+AI相關領域的核心業務競爭力,也是在熟悉整套邊緣端到雲AI計算系統架構和解決方案,懂得一AI算法的基本原(不一定要自己獨立能實),各種神經網絡的優劣,能對嵌入式平台AI軟體做系統級別的計算性能的加速優化,部署落地,解決客戶實際應用場景中的問題,提供反饋給AI算法的工程師,幫助他們修正訓練出來的模型。

最後也灌一句雞湯Right time to do right things