相信很多剛入行1-2年,甚至5年10年的嵌入式工程師都會有這些疑惑。我做的事情好像沒有多少技術含量,我做的事情好像沒有多少創新,做嵌入式的技術競爭力到底在哪?嵌入式到底是做驅動好還是做應用好?
很多人說,嵌入式要學習很多很多的技能才能找到工作,既要懂硬件,還要懂編程,精通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語言編程能力就是嵌入式開發的命根子。
另外,數據結構對于現代的大規模嵌入式軟件開發(不管是單片機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比賽的灌籃技能一樣,很有成就感,帶來全場歡呼,但是畢竟不是常規得分手段,也不是常規技能(大部分得分還是要靠戰術配合,投籃,上籃,三分遠射),嵌入式開發大部分精力還是要放在編程,實現業務邏輯上。
三、升職加薪的業務技術競爭力
要想在公司升值加薪,除了基礎技術競爭力之外(這項只能幫你好跳槽,找工作,不保證升職加薪),還需要和公司業務相關的技術競爭力(這項競爭力只在同行業跳槽有效,不保證跨行業跳槽)。
所謂業務技術競爭力,就是在特定行業和公司才有價值的技術競爭力,是無法輕易從書本獲取的技術。盡管火哥承認Linux內核,操作系統原理,計算機基礎算法,計算機體系結構這些知識有一定難度,不是那么容易學的,但是畢竟一個沒有工作經驗的學生都能從書本這種最廉價的途徑獲取,所以無法構成業務競爭力的壁壘,業務技術競爭力也是學生和有工作經驗的工程師最主要的差距。
一般來說,業務技術需要入行之后,在工作中學習,而且不同行業不同公司能學習到的業務技術是不一樣的。比如說,通信行業的公司,4G LTE協議,標準相關的技術就是業務技術競爭力;網絡產品行業的公司,那些網卡路由標準協議相關的技術就是業務競爭力;機頂盒產品的公司,音視頻流媒體編解碼播放的相關技術標準就是業務競爭力;網絡攝像頭產品的公司,攝像頭數據采集與網絡通信協議相關的技術和標準就是業務競爭力……
一般進入某個行業某個公司之后,只有多學習積累公司業務相關的知識,才能自己獨立完成業務相關的項目,然后指導新人、同事,帶領團隊做業務相關的更大的項目,進而在公司掌握更大的業務話語權,和高管討論公司業務規劃,乃至戰略規劃。
一般站在公司高管的角度,思考的問題都是業務發展方向和戰略上的問題,一個工程師Linux內核底層驅動理論和技術能力再好,如果不是在Red Hat SUSE 或者華為的Linux內核部門這種把內核開發作為業務方向的公司和部門,那么你牛逼的底層技術能力,也只是一項基礎技術,平時工作解決的再復雜再難的底層內核問題,寫的再風騷的代碼,在高管眼里都只是解決一個普通問題,實現一個普通功能而已。
這些都是為公司的業務服務的鋪路石而已,而高管就像在路上開車,眼里只有終點,盡管鋪路石的好壞可能導致路上的顛簸,但是只要順利到達終點鋪路石看起來并沒有那么重要。
可以說,在公司,你所掌握的和公司戰略方向相關的業務技能,就像一個放大器,把你實際的技術能力和價值放大多倍,進而帶來更高的收益。但這也帶來了一些問題,如果公司近年的業績不夠好,你牛逼的業務能力可能不會給你帶來等價的回報,那就得考慮你在公司業務方向上花費的時間和精力到底值不值。
火哥第一家公司就有不少業務專家,但是公司業績一年不如一年,導致業務專家也和普通小兵一樣拿死工資,沒有得到相應的年終獎,最后,火哥跳槽出來的時候,差不多算跨行跳槽,相關的業務知識也在面試中沒有太大的幫助。
同時,火哥也在和很多面試官聊天中,發現很多業務牛人,出來面試,雖然業務技術牛逼,但是基礎技術花費的精力不夠,所以沒有得到面試官的認可。當然,在同行跳槽的情況下,業務技術能力的加分還是很大的,比如手機行業,高通跳槽去OPPO、小米的對口部門,待遇上的提升就很多,但是這種真正業務對口的跳槽機會,火哥認為占少數,所以在業務技術競爭力上,行業的選擇一定要有眼光,高薪跳槽機會多的行業,業務技術才是有競爭力的技術(盡管可能不是最難的技術)。
四、無法輕易獲取的門檻技術競爭力
所謂無法輕易獲取的門檻技術競爭力其實也是業務競爭力的一種,只是相對于常規的業務競爭力來說具有更高的獲取門檻。上一節所說的業務競爭力是指一般的業務競爭力,可以在公司內部,通過參與公司實際項目,業務知識培訓或者老員工指導,口口相傳中獲取。
而這種門檻技術,在公司中一般也是保密的,非偶然機遇,無法獲取,靠自己找資料自學琢磨基本行不通。嵌入式開發相關領域無法輕易獲取的門檻技術競爭力一般有這些(如果火哥說的有遺漏,可以后臺私信補充):
4G/5G 通信基帶算法與核心業務邏輯
WiFi、藍牙驅動加載的固件或IP中核心的算法與業務邏輯
Camera驅動加載的固件或IP中,MIPI-CSI高速數據采集接口相關的核心業務邏輯,ISP(數字圖像處理)相關的核心算法與業務邏輯
GPU驅動加載的固件或IP,以及OpenGL、CUDA、OpenCL等API標準的庫實現中核心的算法與業務邏輯
音視頻編解碼Codec驅動加載的固件或IP,以及OpenMax等API標準的庫實現中的核心算法與業務邏輯
高清LCD/OLED屏幕,或者HDMI屏幕驅動加載的固件或IP中核心的業務邏輯和實現
嵌入式設備電源低功耗相關技術
嵌入式設備信息安全與密碼保護相關技術
這些門檻業務技能,除非你有偶然的機會,去了某個IC原廠專門的部門,否則基本不可能接觸到這種高門檻的業務技能。如果你在OEM產商從事相關的崗位驅動(比如在小米做手機的camera或者WIFI開發),你也只能從高通或MTK拿到二進制的固件,幾乎不可能看到核心業務邏輯的源代碼。
這些模塊雖然Linux內核驅動部分可能為了遵守GPL協議開源,但是一般這種開源的驅動都是hardware enable的驅動,也就是說驅動里面只有使能或者停止設備的基本功能,核心業務邏輯相關的代碼都抽出來做在固件(可以是內核加載的固件,也可以是應用層的閉源庫)。
有機會接觸這類高門檻核心業務崗位,也算一種幸運,如果能跳槽到對口的公司,可能拿到非常高的待遇(當然也可能跳槽要簽競業協議,每月從老東家拿錢)。
這種崗位的員工,在就業市場上是非常難招的,公司也會出于防止核心門檻業務技術機密泄露的目的,花大價錢留住這些核心員工,也不會培養太多懂得這些核心門檻業務技術的員工。
有機會從事相關門檻業務技術的開發,如果跳槽到對口的賺錢的公司,就有突破年薪50W甚至100W的機會,也算是一種幸運吧。這種嵌入式領域的門檻業務技術本身的難度相對于Linux內核,Android系統框架等復雜系統而言,也不是絕對的難(畢竟大規模應用的技術,本身不可能比理論性的東西難,智商良好的大學生應該都能學會),但是輕易無法獲取,會有一種神秘感。
五、跳槽漲薪的新興技術競爭力
目前嵌入式相關的行業和領域,出現了很多不同于傳統嵌入式領域的產品與解決方案,比如嵌入式+物聯網+云端,嵌入式+大數據,嵌入式+人工智能,嵌入式+無人駕駛……
關于這些新興技術,也有一些爭議,有些老的工程師對這些東西表示不屑,認為也不是很有技術難度和深度,就是調用一下別人做的云端或者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年的大佬。
當然,火哥所說的這些新興技術領域和行業,也要根據你自身的情況因地制宜,制定學習的計劃。
首先,不是所有城市都有這些新興技術領域的相關企業,如果你想入行新領域,可能就得做出跳槽去北上深等一線城市的決策,如果已經在二三線城市安家,要照顧家人,可能就得做一些取舍,不得不放棄這些發展計劃,繼續在舊的領域深耕。
其次,第二節所說的基礎技術競爭力應該放在首位。在夯實基礎(不一定要達到精通,但是還是要扎實)的情況下,保證能得到面試官的對你技術底子的認可,能找到合適的工作的前提下,跳過二、三節所說的傳統業務技術的學習,直接進入新興技術領域,彎道超車。
最后,要保持一雙火眼金睛,要能夠識別出你所做的新興業務到底是真新興,還是傳統業務包了一層皮。比如有些童鞋在所謂做嵌入式+物聯網業務的公司,實際上每天的工作就是用stm32單片機和NB-IOT模塊,每天做一些調用單片機UART,I2C接口和NB-IOT模組通信的重復性工作,這就不算是真正的新興業務,也不具備真正的新興技術競爭力。
真正的嵌入式+物聯網領域的技術競爭力應該熟悉整套IOT終端到云端的解決方案架構,熟悉如何搭建部署這套系統,熟悉IOT設備與終端和云端的通信協議的核心業務邏輯。同理,在嵌入式+AI相關的公司,雖然嵌入式工程師不一定要懂得自己實現AI核心算法,但是核心技術競爭力也不是指調用別人的人臉識別閉源庫函數,做簡單人臉識別應用。
火哥認為嵌入式+AI相關領域的核心業務競爭力,也是在熟悉整套邊緣端到云的AI計算系統架構和解決方案,懂得一些AI算法的基本原理(不一定要自己獨立能實現),各種神經網絡的優劣,能對嵌入式平臺的AI軟件做系統級別的計算性能的加速優化,部署落地,解決客戶實際應用場景中的問題,提供反饋給做AI算法的工程師,幫助他們修正訓練出來的模型。
最后也灌一句雞湯,Right time to do right things。
評論
查看更多