來源:嵌入式資訊精選知乎上有人問
經(jīng)常在網(wǎng)上看到很多牛人有ICPC等各大編程大賽的經(jīng)歷。
我是學習嵌入式開發(fā)的,感覺我天天都是在看芯片資料,代碼難度也不高,甚至很多都有現(xiàn)成的,只要改改就可以自己用。
好像什么高級算法、超強的數(shù)學能力在我的學習中都沒有什么體現(xiàn)啊!?完全用不到啊~~
那做算法研究,ICPC為了什么???都是做研究的牛人嗎??
ICPC這些東西對一般程序員有什么意義??
下面是各位過來人的回答:
陳俊直 你參加ICPC沒有必要,行業(yè)不同,那是計算機軟件工程師參與的。個人感覺嵌入式工程師所涉及的算法和計算機軟件工程師所設計的算法有一小小差別。計算機軟件工程師要實現(xiàn)的是運行在通用計算機平臺上的軟件,算法研究偏向于盡量降低系統(tǒng)的開銷,完全不需要考慮硬件設備。
而嵌入式軟件工程師所設計的工作是面向機器編程或者是面向過程編程,算法多考慮的是如何結(jié)合硬件來處理事件。因為嵌入式系統(tǒng)不像計算機那樣有大量的內(nèi)存資源(RAM基本以KB計算,所以很少敢用鏈表,甚至部分電子、測控、自動化專業(yè)學生都不學數(shù)據(jù)結(jié)構(gòu),雖然他們以后可能也從事嵌入式軟件研發(fā)),但當你用DSP處理圖形圖像、音頻、電機控制的時候,就會用到算法了。最簡單的是《自動控制》課本里提到的PID。還有我聽到過而沒做過的神經(jīng)網(wǎng)絡算法(在實驗室跟做項目時候聽研究生們說的,但我只是個本科生。自控課本里那堆數(shù)學理論都沒看懂呢),打個比方,要設計一個嵌入式系統(tǒng)控制自加熱水壺的水溫精確并快速達到60℃,是直接燒到60℃就停止加熱(但停止后有余熱會繼續(xù)升高溫度,這樣浪費電能);還是加熱到五十多度后停止加熱讓余熱慢慢使水溫到達60攝氏度后再斷續(xù)控制水溫(如何做到既省電又省時間)。
而對電機的控制,記得看過MIT的學生做的四軸飛行器,那個東西在狂風中飛行都可以做到平穩(wěn)自如,拿桿子捅它也只是晃動一下,很快就回復平穩(wěn)狀態(tài)。這也是自控的算法實現(xiàn)的。還有更接近人們生活的嵌入式系統(tǒng)算法就是實現(xiàn)汽車ESP車身穩(wěn)定系統(tǒng)的那些算法。
所以,嵌入式軟件研發(fā)工程師其實跟普通計算機軟件工程師(程序猿)在設計思維上還是有一些區(qū)別的。但共同點是:苦逼加班必不可少……
PS:本人對這些過程控制、自動控制理論實踐較少,如有錯誤敬請指出。
沈沉 因為你對自己的定位是"一般的程序員",所以確實沒什么意義。
李劍波-游友移動 嵌入式與算法沒有直接聯(lián)系。你提到的嵌入式開發(fā)是屬于嵌入式系統(tǒng)的驅(qū)動單元,嵌入式系統(tǒng)中涉及算法的部分應該在“主控單元”。如果你想覺得做算法高級,可以考慮到通信領域試試看。通信領域的無線信道計算里會涉及很多算法,但是也基本成熟。
還有機器人領域,在機械手臂控制上會有識別算法,還有就是涉及圖像處理的嵌入式領域。另外,樓主應該知道每個人都有自己的成長軌跡,這個軌跡與周圍環(huán)境關系巨大,你想想還有人30不到當國家一把手,雖然大家軌跡不同,但是軌跡的終點應該是我們心里所尋找的地方,而不是從眾的結(jié)果。如此,每個人的人生都是獨特的。
邱震鈺 有這閑情干嘛不留著去享受造車輪的樂趣,寫點編譯器、3D圖形引擎、regex引擎、通用Adt庫、網(wǎng)絡庫、3D超級瑪麗之類的或者在嵌入式實現(xiàn)一些你想有別于一般嵌入式從業(yè)者的東西,ICPC這種,不適合你(價值觀上)。
條條大路通羅馬。
tom pareto 建議回頭把嵌入式系統(tǒng)的定義再回顧一下。什么叫嵌入式系統(tǒng)?國內(nèi)一個普遍被接受的定義是:嵌入式系統(tǒng)是以應用為中心,以計算機技術為基礎,并且軟硬件可裁剪,適用于應用系統(tǒng)對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統(tǒng)。這里的定義很值得琢磨,由于嵌入式系統(tǒng)與常規(guī)計算機系統(tǒng)相差較大, 所以對代碼質(zhì)量的要求很高。
從計算機的角度來看,程序的性能要高,所以時間復雜度要低。由于內(nèi)存小,所以空間復雜度要低,要設計很好的數(shù)據(jù)結(jié)構(gòu)。功耗要低,所以將一些硬件功能用軟件完成。從應用的角度來看,嵌入式系統(tǒng)以應用為中心,所以有一大票應用的算法需要開發(fā):語音識別、人臉識別、數(shù)據(jù)融合、路徑檢測、機器視覺、壓縮編碼、信號檢測、...…。
在你的工作中,算法和數(shù)學能不能用上,取決于你自己。類似于機械加工,一般技術工人并不需要太高的理論水平,只需要讀懂工程師給的圖就可以了。但是,對于工程師來說,那就不一樣了,必須合理地選擇材料、結(jié)構(gòu)、工藝,這個時候就需要理論了,所以一切取決于你自己了。
李俊杰 根據(jù)你工作內(nèi)容而定,根據(jù)你個人偏好而定,如果你愛造輪子,這些有用。嵌入式也分硬件和軟件。如果你選擇偏硬件,在電子上多下功夫,軟件競賽對你沒有用。如果選擇偏軟件的,現(xiàn)在比較多的是linux驅(qū)動開發(fā),也沒有涉及多少算法。但是不想做底層的搬運工,想可以往上層轉(zhuǎn)型的時候,像圖像處理,語音識別這些涉及數(shù)學的就比較多了,然后感興趣可以走機器學習之類高薪低競爭的方向??催@些的時候,算法和數(shù)學功底就顯得尤其重要了。簡單的使用單片機、DSP,控制個電機、連個攝像頭,都沒有多少技術含量。像樓上提到的四軸、自平衡的優(yōu)化、機器人、路徑的規(guī)劃、攝像頭、圖像的壓縮等等,同樣的東西看你自己要挖掘多深了。
王鑫 電子專業(yè),大一打了一年ACM,區(qū)域賽打醬油蹭個銅牌,至少寫起程序來虐虐同學還是很容易的(學校很一般般)。參加這類比賽還是會讓你的思路開闊一些,代碼實現(xiàn)能力強一些。
仲睿光 作為一名有多年OI經(jīng)歷,目前研究軟件無線電方向的嵌入式算法工程師來回答一下吧。我現(xiàn)在做的主要是各種通信算法在FPGA、DSP及多核arm上實現(xiàn),如寬帶抽取濾波器,主要難點是算法在并行下的展開,強實時要求下的調(diào)優(yōu),所涉及到的知識結(jié)構(gòu)主要是計算機體系結(jié)構(gòu)的基本知識(如CPU工作原理)、數(shù)字電路,但是在實現(xiàn)時候要對算法本身了解透徹(據(jù)說近幾年acm和oi出過fft相關試題?本人沒有親自考證)。以fft為例,該運算在FPGA上的實現(xiàn)思路與PC及GPU思路完全不同。此外還有各種為了接近硬件io瓶頸的zero copy的代碼研究。從嵌入式工控方向看,也對數(shù)學基礎有一定要求,如無人機飛控涉及到的算法。當然應用面較廣的通用嵌入式,主要側(cè)重于業(yè)務組合,對算法要求不高。
匿名用戶 對于“一般”程序員,有很高的概率沒有意義。嵌入式行業(yè)依托于硬件,測試成本更高。實際的開發(fā)中,大多數(shù)時候會更傾向于穩(wěn)定為主,出于成本效益角度考慮,沒有機會讓你去按照你的想法去做你想做的。一個“一般”的開發(fā)人員,在這個方面基本沒有什么話語權。不管初創(chuàng)公司也好,行業(yè)生存十幾、幾十年的公司也好,代碼往往都是撿著現(xiàn)成的來。說PID算法的,哪家公司會讓你自己從零實現(xiàn)?還不都是以調(diào)參為主,這對開發(fā)人員有很高的要求么?而且還有一種悲哀的情況是,嵌入式行業(yè)公司的競爭力,技術以外的東西更多,技術人員的重要性相對低。你做開發(fā)的費盡心機做的優(yōu)化,很可能比不上銷售的一杯酒,比不上評審時的一個悄悄送上的信封…
歷蘇 一般來說,嵌入式軟件開發(fā)的復雜度不可與計算機的開發(fā)相比,所以對算法的要求不會那么高,但是往往為了壓低成本,大部分嵌入式設備的內(nèi)存和存儲空間會比pc小很多,因此也是需要進行算法優(yōu)化的,所以高級的嵌入式設備對基本的數(shù)據(jù)結(jié)構(gòu)和算法還是要學的。但往往嵌入式更重要的是要求硬件設計的品質(zhì),還有軟硬件結(jié)合、系統(tǒng)移植、驅(qū)動程序開發(fā)(可能需要連接傳感器)的知識。
|?整理文章為傳播相關技術,版權歸原作者所有?|
|?如有侵權,請聯(lián)系刪除????????????????? ?END ?????????????????