10年嵌入式工程师经验之谈:对于研发工作的感悟
話說嵌入式這個行業到底需要什么樣的技術人才?
仔細觀察各種招聘的崗位要求吧,無非是
1、通用要求:比如什么學歷,多少年工作經驗,有創新精神,抗壓能力強,吃苦耐勞,善于溝通,態度認真等等等等……
2、專業要求:這個可真的多了去了,但無非就是各種精通。什么精通控制理論,精通電路設計,精通各種硬件驅動開發,精通linux內核以及裁剪,精通C/C++/Java語言,精通DSP,精通ARM,
精通什么linux/ecos/ucos/wince/VxWorks,精通嵌入式數據庫,精通多線程編程,精通各種網絡協議,精通各種總線協議,精通塞班/安卓/IOS平臺應用開發,精通匯編,編譯器,二進制工具;精通各種媒體封裝格式,編解碼;精通通信技術;精通硬件原理圖;精通PCB設計;精通計算機結構;精通bootloader,精通……感覺只要是行業內的就要精通(我了個去!我感覺精通一門就得好久。。。)
看完這些,尤其是專業要求,頭大了吧?
那么我們就分析一下上面的要求吧。各個公司就的通用要求像是互相復制粘貼的一樣,比如學歷(個人認為學力明顯更重要),比如經驗(是有n年的經驗,還有n年前的經驗用了n年?),還有個人秉性,我都不知道各個公司怎么在員工入職前考察。專業要求呢(其實精通其中幾樣就挺了不起了),一看就讓人頭暈,了解了嵌入式開發的結構可能就好理解些了。
從技術實現上講,嵌入式的產品分為兩大類:一類簡單的,沒有操作系統支持的;一類復雜的,有操作系統的。就目前發展方向看,后一種是趨勢。前一種從程序實現上可分為3層:硬件層,驅動層,應用層;后一種分為4層:硬件層,驅動層,系統層,應用層。
所以嵌入式的開發大致需要這么從下到上4類工程師:嵌入式硬件開發、嵌入式驅動開發、嵌入式系統開發、嵌入式軟件開發。
一
應該會哪些技能呢?
1、嵌入式硬件開發:這是硬件工程師來做,一般出身為自動化,電子,通信等專業,他們要求熟悉電路等知識,非常熟悉各種常用元器件,掌握模擬電路和數字電路設計的開發能力,熟悉硬件開發模式和設計模式,熟悉各種芯片及外圍設備,熟悉8位16位32位處理器嵌入式硬件平臺開發。
有的要求有FPGA的開發經驗,精通常用的硬件設計工具:Protel/PADS(PowerPCB)/Cadence/OrCad。一般要有4~8層高速PCB設計經驗。由于本人不是做硬件的,對這一塊的不熟悉,所以不敢妄言。
2、嵌入式驅動開發:這個可以硬件工程師來做,也可以軟件工程師來做,主要還是取決于設備。目前驅動開發,除非是簡單的設備驅動,實際上很多時候都是移植,所以更多的是需要掌握目標平臺的硬件和系統特性。
所以至少得掌握一些操作系統、系統結構、計算機組成原理、數據結構相關知識。熟悉嵌入式ARM/MIPS/PowerPC架構。具有單片機、某種或多種32位嵌入式處理器的移植開發能力,熟悉bootloader過程,具有扎實的硬件知識,理解硬件原理圖,能獨立完成相關硬件驅動調試,能夠根據芯片手冊編寫軟件驅動程序。
如果涉及到網絡設備,或許還要掌握很多高層的網絡協議的原理。個人感覺這一塊雖然大部分不是很難,但卻是極為重要的。當然如果要在這一層次提供對上層的多線程支持,某些驅動也是很難寫的。
3、嵌入式系統開發:這個沒聽說硬件工程師來做的。做這塊,熟悉操作系統的原理是必不可少的,比如內存管理,比如線程調度,比如文件系統等等;還要精通處理器體系結構、指令集、尋址方式、調試、匯編和混合編程等方面的內容;熟悉操作系統啟動流程。
對于linux,要熟悉Linux配置文件的修改,掌握內核裁減、內核移植、交叉編譯、內核調試、啟動程序Bootloader編寫、根文件系統制作和集成部署Linux系統等整個流程。這一塊要是真寫起來,困難程度那是相當恐怖的,好在大多都是移植,很少聽說有公司要去開發個操作系統的,沒Google的實力啊。
4、嵌入式軟件開發:這個嘛,沒有操作系統的話,程序一般不會特別復雜,如果有操作系統的支持,又和一般的軟件開發很接近,所以盡可以看作是搞桌面開發。這個要求就是熟悉系統的API,精通C語言的高級編程知識,包括函數與程序結構、指針、數組、常用算法、庫函數的使用等知識、數據結構的基礎內容;掌握面向對象編程的基本思想,以及C++語言的基礎內容;
精通嵌入式Linux下的程序設計,精通嵌入式Linux開發環境,包括系統編程、文件I/O、多進程和多線程、網絡編程、GUI圖形界面編程、數據庫;熟悉常用的圖形庫的編程,如QT、GTK、miniGUI、fltk、nano-x等,掌握各種應用層的網絡協議使用,以及各種音視頻技術等。
另外還有些以上四類都用得著的技能:
1、基礎技能:搞嵌入式開發,還有一些必不可少的基礎技能。
a) 開發平臺的熟悉,目前的嵌入式開發大多數是在linux或者類linux下的環境下進行的,那么linux的使用應該熟悉吧,shell腳本得會寫吧,配置文件得會改吧,GCC GDB 得會用吧,Make工具得會吧?
b) 比如項目管理工具的使用,都什么年代了,不會用CVS,也不會用SVN?請問,你還活在軟件時代的原始社會么?
c) 數據結構和算法,搞軟件開發,不懂數據結構,不會算法優化,不會衡量復雜度,太不靠譜了吧?當然,這個不是要求啥算法都會,啥數據結構都記得住,最起碼得知道有那么種東西,有什么作用,這樣用到的時候好歹也能查啊
d) 編程語言,關于JAVA,我知道現在JAVA的異軍突起,很是震動了編程語言界,但是在嵌入式開發下,不會C或者C++語言,實在說不過去。當然現在很多手機應用完全用java寫的,如果你只想搞嵌入式的上層軟件開發又不想深入下去,只用JAVA也未嘗不可。關于匯編,嗯,這個可能挺難,畢竟跟具體的硬件架構(主要是CPU)有關,但是真的很有意思,而且在某些時候,它是不可替代的。
2、特殊技能:對于嵌入式開發的某些部分必不可少,但對于有些(比如應用開發)可能沒有多大用處。
a) 數字電路,這個……主要是了解一些基本的電路知識,如門電路、邏輯電路、存儲器、寄存器,為了更好的理解嵌入式芯片,存儲器,外圍設備等硬件的設計,但往往在軟件開發中未必能用的到。因為大部分硬件都提供了很完整的軟件接口。
b) 操作系統,這個說的是平臺上選用的操作系統。嵌入式產品操作系統是在太多了。但操作系統的內部設計原理都是殊途同歸。首先要去學習的是操作系統原理,去了解進程通信、內存管理、文件系統等幾個重要的部分,因為這些在軟件開發尤其是內核驅動開發時會用到。接下來可以去熟悉至少一種主流的操作系統,Linux是一個很好的選擇,去了解它的內核架構,設備驅動架構,如何去編譯,裁剪,編寫應用程序,以及如何使用在具體的嵌入式產品上
c) 計算機的組成/微機原理,主要是為了了解微型計算機的硬件工作原理,明白CPU、總線、I/O、存儲器等一些關鍵結構是怎么工作的,雖然是很枯燥的知識,但是對熟悉外圍設備硬件工作方式,及操作系統,軟件架構的設計及優化相當關鍵。
3、擴展的能力:這些可能是要用到的。
a) 通信協議,對于非應用層的通信協議,我實在不知道是不是該把它放入操作系統的范疇,因為很多操作系統是沒有網絡部分的,但是在很多方面它又是由操作系統提供。當然這些下層通信協議,貌似不太用關心,因為太多的開源協議棧了。應用層的網絡協議可能就要關心了,比如http,ftp,rtsp,rtmp,mms等等。
b) 音視頻處理,比如文件封裝啊,音視頻的編解碼啊,各種音視頻的標準啊,還有流媒體什么的。Ffmpeg是一個很好的東西,建議學習一下。
c) 信息安全,恩,這一塊貌似現在越來越受到重視了。
d) 數據庫,唉,嵌入式設備能力越來越強啊!再搞搞我看也不用交叉編譯了。。
有時和同事討論起現在的行業需求,說到各個公司總是招不到人,程序員又總說找不到工作,自己就有很多感想,是公司要求高,還是程序員要求高?有時候看到一些招聘的職位要求,總是打擊到自己的信心,一條一條數下來,好像自己能做到的還真沒多少,只好讓自己再努力些再努力些;當然有時也會覺得某些招聘不靠譜,看那一條條的要求,個人感覺要是全做到,普通人怎么也得努力個十年八年的,這樣的大牛們,估計看不上給出的那薪資吧。
對于程序員來講,做技術真的是很累很難的一件事情。網上搜一下,遍地的抱怨貼,情感貼,都充分反映了這個職業對身體和情感的考驗。如果你不畏艱難,想把技術做下去,那么努力吧,也許某天你會隨便拿起一份招聘啟事,鄙視一眼:“靠!就這點要求,老子去都掉價!”,那么你就是真正的大牛了!
二
現有狀況分析
不覺新人來到我們研發已近十幾年,這十幾年里,同一批人員,有的已經很快適應了環境,經過自己的努力和付出,能為研發工作獨擋一面,成為某一方面的小專家;有的盡管前期不太適應,但是通過指導和修正,業已慢慢進入了工作狀態,相信經過一段時間,會逐步但當起某一方面的研發工作。
同一時期進來工作,為什么他們現在的能力和狀態會產生如此大的差異呢?通過的相處和分析,我發現凡是進步快的同志有如下特點:
1.勤奮,為了解決一個技術問題經常會主動留下來加班;
2.鉆研,為了解決一個技術問題會主動學習各方面的資料,勤做實驗,用事實去驗證;
3.和領導和同事及時主動溝通,集思廣益,爭取各方面的資源,充分利用已有的經驗,避免走彎路,加快研發進程;
4.有強烈的事業心和犧牲精神,不達目標絕不停息。
反之,那些成長慢或者還沒有融入研發工作的同志則具有以下特點:
1.工作沒有目標,精力分散,很多的時間花在網絡上,偷偷的看視頻;
2.工作推卸責任,把工作沒有進展的原因推卸到工作難度太大,或者資源不夠,而自己卻又不主動的去爭取資源;
沒有長期為研發乃至個人的職業生涯有充分的打算,或者說來研發的目標比較低下只是為了混口飯吃;人無遠慮,必有近憂,沒有遠大的理想,外界任何一個小的干擾都會讓你三心二意,因而知識的學習沒有系統性。工作時用到的知識永遠是你現有知識的綜合,不注重基礎知識的學習,又不去勤奮實踐,很多的時間花在網絡上,視頻上,能力怎么可能突飛猛進呢?
3.和同事和領導的溝通不主動,甚至避讓,怕領導檢查工作;
4.更關注生活而不是工作;
5.比較在意自己的付出;
兩種一對照,問題顯而易見,研發工作是一項很具挑戰性的工作,需要付出艱辛的勞動,需要有扎實的理論基礎和動手能力,在開發任務面前頭腦清醒,思維敏捷,頭緒清晰,有條不紊,遇到困難不會退,遇到挫折不氣餒,需要有團隊精神,需要有化解矛盾和困難的勇氣,智慧和決心,要有相當強的心理素質,因此人員的素質和心理狀態是決定性的。上進的同志,稍微帶一帶,成長速度很快,不主動的同志,工作起來舉步維艱,帶起來很吃勁,心情也受影響。
為了提高研發效率,我們開發了管理軟件,制定了各種規章制度,但是,軟件和制度只能治標,不能治本,問題的根還是出在人上。
應該講,目前研發部門的軟硬件條件和和技術水平,可以讓一批想在電子技術嵌入式領域有所作為的年輕人干出驕人成果的。但是現實情況我們也不能過于樂觀,研發部門還是存在一些問題的,尤其是人員素質問題。為此我們在上海參加研發管理培訓的時候也咨詢過專業人士,他說了一句話:小草永遠也長不成蒼天大樹。
所以請各位想想,你現在是小樹苗呢,還是草種子?是樹是草取決于你是否有強烈的向上成長的愿望,取決于你是否有千方百計吸取土壤養料的勤奮,取決于你對的人生價值的判別,認為現有的土壤值得你扎扎實實定下根來,做一棵這片土壤上的大樹。想成為大樹的,我們一定創造條件讓他(她)成長為大樹,如果注定是草種子,我們也無能為力,只有優勝劣汰。
三
對研發人員的期望
1.必須是職業的,勤奮的,忠誠于研發事業的,愿意為研發無條件付出,具有志愿者一樣的強烈的奉獻精神和責任心;
2.必須是主動的,有狼一樣的進攻意識(華為的企業文化),為了達到研發目標會從各個方面入手,提高個人的技能,整合各種資源;
3.必須有團隊意識,經常主動和各方溝通,能幫助他人,也經常獲得他人幫助;
4.最好有一定的藝術、文學修養,研發是一門創造性的工作,藝術是創新的源泉,好的藝術修養會為你帶來源源不斷的靈感。同時研發也是枯燥的,好的文學修養會在任何時候激勵你的斗志,讓你知道離成功的頂峰的距離,怎樣度過最難的時候;
5.必須有好的道德修養,達到成功的路很多,永遠走充滿陽光的那條;
6.良好的個人修養,衛生健康,懂禮貌和諒解,大度和睿智,用智慧和微笑同你的同事相處,用尊重和服從和你的領導相處,領導手里總有你想不到的資源,你和領導的關系決定了你是否有可能被分配到這些資源,信任信任,只有領導相信你的人(包括能力和忠誠),才會任命你新的職務。
7.主動付出,不要計較個人得失,收獲和付出永遠是平等的,只是收獲會遲一些到來,很多人往往沒等到。。。。。沒有通過考驗,前功盡棄。
8.做事要一步一個腳印,多做記錄,多做筆記。凡是只要可能,就盡量做好做透,做到極致,人家沒想到的,你也做到了,做得讓你的同事佩服,讓你的領導贊嘆,讓你的對手折服,讓你的顧客感動。。。。。。這樣的人,走到哪都會無往而不勝。
9.工作和生活兼顧,才上班,工作是重點,一定要有所建樹,因為人的精力是有限的,先栽樹,以后有的是時間乘涼,這個同收獲和付出時一個道理。工作的前三年是你建業的黃金三年......這三年會積淀你以后的很多成功因數......
魯迅有段話:不要因為過多的花前月下,把我們的人生目標都忘了。
10.多讀書,尤其是名人傳記和歷史書,會讓你明白很多人生的道理,這些道理可以讓你超前體驗人生,卻避免了他人的失誤。。。
11.少發牢騷,多做實事,領導希望你在改變現實,而不是在評價現實;
12.企業里會有許多考驗,任何時候都是在考驗你的耐心,忠誠,敬業精神,所以很多行為裝是沒有用的,領導一眼就看穿了,除非你一直裝下去......最后變成了真的,不裝都不習慣了。
其實,這些道理也是其他任何一種職業所必須的要求,同時也是人在社會上立足所必須的。
四
對研發工作的一些建議
1.直接進入研發的應屆畢業生的比例應適當降低,提高進入門檻,延長考察期,首先進入生產一線工作3各月,充分考察是否敬業,犧牲精神,和同事和領導的溝通能力,個人的學習適應能力,個人是否有遠大的志向。
同時也讓他們了解企業狀況,底層工人的辛苦,把個人價值觀調整到合理的適應現實的水平上來。
2.適當增加已有工作經驗人員的入職比例,讓一批有社會工作經驗,懂得工作艱辛,有工作能力,肯為研發付出但又找不到合適位置的人員加入到研發來。
3.保持一定的淘汰率;
4.用管理系統管理研發工作,并制定出量化的考核指標,作為收入分配和晉升、淘汰的依據。
五
再論能力和勤奮以及其他
1.笨鳥先飛早入林,對事物的認知是和事物對大腦的刺激頻率和時間成正比的,一個事情經常去做,時候經常去琢磨,就能悟出其中的道理,對事物認識深度是通過在實踐中不斷發現錯誤,不斷修正才達到的。
如果人不勤奮,把過多的時間和注意力放在工作之外的地方,那就自己切斷了實踐這個重要環節,水平和經驗永遠得不到提升,能力的提升跟談不上了,接著就是職務,收入上的提升,說到底就是個人在社會上競爭力的提升。不去提升你的核心競爭力,成天沉迷于網絡還有其他事物,是否有點舍本逐末呢?
2. 個人定位決定工作的態度,思維決定習慣,習慣決定行為,行為影響你的核心競爭力。
3. 改變自己,而不是改變他人和環境。
-END-
﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
免責聲明:本文轉自網絡,版權歸原作者所有,如涉及作品版權問題,請及時與我們聯系,謝謝!
往期好文合集
堅持寫代碼,這是晉級大師的唯一方法。<<戳這里
985碩士出來嵌入式驅動開發工資能到多少?<<戳這里
單片機與愛情。?<<戳這里
?最 后??
?若覺得文章不錯,轉發分享,也是我們繼續更新的動力。
5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!
在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~
長按識別圖中二維碼關注
總結
以上是生活随笔為你收集整理的10年嵌入式工程师经验之谈:对于研发工作的感悟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洗衣机不清洗的5大危害
- 下一篇: 均值、方差、协方差等定义与基本运算