如何成为一名合格的自动驾驶工程师
今天跟大家分享一篇來自 Felix Friedmann 的技術(shù)博客,Felix 目前在奧迪的全資自動(dòng)駕駛公司 AID感知組從事軟件開發(fā)工作。我自己在錫根讀完書找自動(dòng)駕駛軟件開發(fā)崗位工作的時(shí)候偶然讀到了他在18年分享的文章 - So you want to be a self-driving car engineer?
原文鏈接如下:
So you want to be a self-driving car engineer??
autonomous-driving.org
我征得Felix本人的同意,將他的文章翻譯到知乎,希望更多的朋友能夠了解到如何成為一名合格的自動(dòng)駕駛軟件開發(fā)工程師。正文之前首先介紹一下我寫這個(gè)的基本動(dòng)機(jī)。
我很幸運(yùn)當(dāng)時(shí)看完 Felix 的文章并做了一系列準(zhǔn)備后找到了目前自動(dòng)駕駛軟件開發(fā)的工作。我自己不是計(jì)算機(jī)軟件背景的,也沒有做過類似的崗位實(shí)習(xí),這篇文章給了我很大的啟發(fā),讓我了解到作為一名合格的自動(dòng)駕駛軟件開發(fā)的工程師,應(yīng)該有哪些基礎(chǔ)技能需要掌握,有哪些能力需要持續(xù)精進(jìn),有哪些坑不能省力必須填好。我想,在未來五年或者更長(zhǎng)的時(shí)間里,一定會(huì)有越來越多的像我這樣非計(jì)算機(jī)科班出身,只是在本科或者研究生階段通過畢業(yè)設(shè)計(jì)或者實(shí)習(xí)接觸到了自動(dòng)駕駛領(lǐng)域的相關(guān)開發(fā)工作的同學(xué),會(huì)在畢業(yè)后尋求這個(gè)領(lǐng)域的全職工作。既然他的文章在我看來覆蓋得非常全面,那么就在這里分享給大家吧!
1. Solid software engineering is paramount
建造自動(dòng)駕駛車輛相當(dāng)于我們這個(gè)時(shí)代的登月計(jì)劃。這項(xiàng)任務(wù)難度不亞于設(shè)計(jì)建造一個(gè)機(jī)器人駕駛員,使其在充滿各種不確定性的復(fù)雜環(huán)境中為我們提供超越人類駕駛員的安全性,況且還幾乎沒辦法預(yù)測(cè)在各種極端情況下它的同類會(huì)做出什么反應(yīng)。
這種復(fù)雜度需要高質(zhì)量的軟件工程輔以優(yōu)秀的組織能力,當(dāng)在競(jìng)爭(zhēng)如此激烈的自動(dòng)駕駛領(lǐng)域真正嘗試推進(jìn)這項(xiàng)工作時(shí),會(huì)發(fā)現(xiàn)這兩方面可能都差得很遠(yuǎn)。那些搞研究用的腳本和拼接起來的代碼離可靠的產(chǎn)品可差得遠(yuǎn)了!自動(dòng)駕駛車輛中,像來自傳感器,網(wǎng)絡(luò)通信,并發(fā)等等的潛在故障源真的是不計(jì)其數(shù),甚至?xí)r不時(shí)的系統(tǒng)就直接癱瘓了。為了避免在系統(tǒng)集成中出現(xiàn)這些問題,自動(dòng)駕駛車輛的軟件就必須為可靠性而設(shè)計(jì)。
自動(dòng)駕駛車輛工程師首先得是一位專業(yè)的軟件工程師,其核心職責(zé)之一就是確保高水平的軟件質(zhì)量。高質(zhì)量的軟件意味著:
- 非常 solid 的軟件設(shè)計(jì)
- 良好定義且一致的軟件架構(gòu)要做到位;遵循合適的設(shè)計(jì)模式及最佳編碼實(shí)踐;代碼要做到簡(jiǎn)潔,模塊化,可重用。
- 嵌入式軟件開發(fā)
- 小心謹(jǐn)慎處理內(nèi)存管理,時(shí)序及并發(fā);設(shè)計(jì)算法時(shí)要考慮到其計(jì)算復(fù)雜度與運(yùn)行時(shí)間邊界。
- 測(cè)試覆蓋率
- 所有的產(chǎn)品代碼推到 master 分支之前都要確保達(dá)到一定的測(cè)試覆蓋率。每一次的代碼構(gòu)建都要在 CI(Continuous Integration) 中進(jìn)行單元測(cè)試,冒煙測(cè)試,集成測(cè)試;從而確保代碼的健壯性。
- 軟件開發(fā)實(shí)踐
- 基本的常識(shí),如合適使用版本管理系統(tǒng)(是的,就是這么悲傷,這還要再提一次);分支管理?branching model;文檔(C++ – e.g. doxygen,?Python – e.g. Sphinx),這些都是可持續(xù)軟件開發(fā)的基礎(chǔ)。
那如果你還不熟悉這些該咋辦呢?
- 多多練習(xí),?LeetCode ,?https://leetcode.com/problemset/all/
- 給開源項(xiàng)目做貢獻(xiàn)
- 代碼質(zhì)量方面, <effective C++> and?Robert C. Martin,?Martin Fowler,?Scott Meyers
- 測(cè)試方面,"Writing Testable Code", "A quick introduction to the Google C++ Testing Framework", "Developer Testing"
- 代碼最佳實(shí)踐, "The pragmatic programmer" or "Clean Code" books
- 先去沒這么多限制的相關(guān)領(lǐng)域工作
2. Self-driving car engineers are specialists, not generalists
對(duì)自動(dòng)駕駛汽車所需要的不同技術(shù)有一個(gè)大致了解當(dāng)然很好了,如對(duì)象檢測(cè),同步定位與地圖創(chuàng)建,端到端神經(jīng)網(wǎng)絡(luò)等。然而,雖然各方面都略懂的通才在初創(chuàng)公司會(huì)有用武之地,但是開發(fā)自動(dòng)駕駛汽車技術(shù)的大公司需要的往往是至少在一個(gè)技術(shù)領(lǐng)域表現(xiàn)突出的專才,而不是啥都可以做一點(diǎn)但啥都做不好的通才。同時(shí)也應(yīng)該注意到,構(gòu)建自動(dòng)駕駛軟件并不只是進(jìn)行功能開發(fā),更大程度上是需要去實(shí)施像并行計(jì)算這樣的架構(gòu)基礎(chǔ)。(enabler technologies)
以下是一些對(duì)自動(dòng)駕駛行業(yè)工程師非常重要的能力(并不完全,也不是按優(yōu)先順序排列)
-
- Localization, SLAM
- Computer Vision
- Software architecture
- Statistics, probabilistic and time-series prediction
- Machine Learning and Deep Learning
- Databases: relational and NoSQL
- Sensor technology: camera, lidar, radar, ultrasonic
- Vehicle kinematics
- SD and HD Maps
- Simulation and real-time computer graphics
- Real-time processing, parallel computing, optimization
- Functional safety, ISO26262
- Build systems
- Software testing and test-driven development
- Automotive background
軟件工程是基礎(chǔ)能力,再加上具體領(lǐng)域的背景知識(shí)
如果你具備以上所說的兩方面的領(lǐng)域知識(shí),而且具備 solid 的軟件工程背景,那就趕緊來申請(qǐng)一個(gè)自動(dòng)駕駛軟件工程師的工作吧!
如果并沒有,那就:
Mix of
- (Online) courses, e.g. by?MIT
- Competitions like Kaggle or Kitti
- Web resources:?autonomous-driving.org, “Computer Vision for Autonomous Vehicles”
3. Applying Deep Learning≠?understanding Machine Learning≠ being a great self-driving car engineer
深度學(xué)習(xí)技術(shù)被夸大了,它僅僅構(gòu)成了構(gòu)建自動(dòng)駕駛汽車必要工作的一小部分。事實(shí)上,找一個(gè)深度學(xué)習(xí)背景的工程師可比找一個(gè)靠譜的擁有嵌入式軟件工程背景的工程師要容易得多。重要的是要理解深度學(xué)習(xí)的落地應(yīng)用,然后再?gòu)?qiáng)調(diào)它確實(shí)是一項(xiàng)關(guān)鍵的技術(shù),沒有它也搞不成自動(dòng)駕駛汽車。
?
但還是要注意:在線課程上,實(shí)現(xiàn)一些深度學(xué)習(xí)的應(yīng)用,訓(xùn)練神經(jīng)網(wǎng)絡(luò),通過一些框架進(jìn)行調(diào)參,甚至是幾行代碼就能實(shí)現(xiàn)在嵌入式平臺(tái)上的部署。這些簡(jiǎn)單的應(yīng)用與那些真正深入理解其背后技術(shù)原理之間的差距是非常巨大的!
?
盡管能從網(wǎng)絡(luò)上找到數(shù)千篇深度學(xué)習(xí)方面的論文,但仍然存在公共研究沒有覆蓋的領(lǐng)域。如果論文沒給出代碼,您應(yīng)該能夠親自從頭實(shí)現(xiàn)一遍論文中的想法。如果連論文也沒有,那你就得自己去研究如何解決手頭的問題了。
?
怎樣加深對(duì)機(jī)器學(xué)習(xí)技術(shù)的理解呢?看下面:
- 主動(dòng)花時(shí)間學(xué)習(xí)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)理論,學(xué)習(xí)一遍你聽到過但從未花時(shí)間去真正理解的那些機(jī)器學(xué)習(xí)中的名詞,Batch Normalization, Vanishing Gradient, Backpropagation, LSTM, Gradient Descent..
- 跟進(jìn)當(dāng)前的研究,通過?Papers with Code,?reddit/r/MachineLearning
- 看書,?Pattern Recognition and Machine Learning,?Deep Learning
- 上一些在線課程,講理論的別上太多講機(jī)器學(xué)習(xí)應(yīng)用的
- 拿一個(gè)機(jī)器學(xué)習(xí)的學(xué)位
學(xué)好Python
Python現(xiàn)在已經(jīng)是學(xué)習(xí)機(jī)器學(xué)習(xí)的首選語言。語法簡(jiǎn)單庫(kù)也多,特別適用于科學(xué)計(jì)算與機(jī)器學(xué)習(xí)。
?
遺憾的是,Python大多就是被拿來快速驗(yàn)證想法的工具;大家錯(cuò)誤地認(rèn)為Python沒什么,對(duì) Python語言本身也缺乏興趣,這就導(dǎo)致了對(duì)Python的不當(dāng)使用,以致形成了龐大的無法維護(hù)的代碼庫(kù),這些腳本最終也就被扔掉了,取而代之的又是一堆新的機(jī)器學(xué)習(xí)Python代碼。
?
Python就是那種人們的自我評(píng)估與實(shí)際能力差距巨大的一個(gè)領(lǐng)域,這就導(dǎo)致工作面試中會(huì)出現(xiàn)一些特別尷尬的場(chǎng)面。如果你對(duì)Python不熟,可以這樣:
- 花時(shí)間把Python當(dāng)成一門編程語言來學(xué),掌握它,并寫出優(yōu)雅,Pythonic的代碼。利用面向?qū)ο笏枷雽懸恍┠苤赜玫哪K
- Python's Glossay?可以用來評(píng)估你Python到什么程度了,看看你熟悉多少這些表達(dá)式啊?
- 在線資源,?The Hitchhiker Guide to Python,?Code Style
- 看書,?Effective Python,?The Python 3 Standard Library by Example
4. Automotive software development
雖然一家初創(chuàng)公司可以在相當(dāng)一段時(shí)間內(nèi)使得自己免受汽車軟件工程的限制,但當(dāng)針對(duì)產(chǎn)品級(jí)的自動(dòng)駕駛軟件開發(fā)時(shí),這些AUTOSAR, ASpice, Functional Safety, ISO26262, Bus, 汽車開發(fā)周期等就再也繞不過去了。作為一個(gè)工程師,并不是說這些限制都會(huì)影響到你,但你要說完全避開他們是不可能的。汽車軟件開發(fā)方面的背景會(huì)讓你作為一名自動(dòng)駕駛工程師的日子好過得多。如果你沒有汽車背景,那你也得在工作中熟悉一些基本概念。
?
無論如何,“汽車軟件開發(fā)”并不只是你需要額外了解的理論或者開發(fā)流程,它們對(duì)你的工作確實(shí)會(huì)有一些實(shí)際的影響:
-
軟件開發(fā)創(chuàng)新需要時(shí)間
由于其長(zhǎng)產(chǎn)品開發(fā)周期,汽車工業(yè)并不一定和現(xiàn)代軟件工程實(shí)踐保持同步。運(yùn)維,敏捷開發(fā),持續(xù)集成,測(cè)試驅(qū)動(dòng)開發(fā)等等肯定不像在IT行業(yè)里應(yīng)用得那么普遍。這個(gè)原因并不一定是說汽車公司在創(chuàng)新方面適應(yīng)得慢,而是事實(shí)上就很難把這些軟件工程實(shí)踐都映射到已有的汽車工程開發(fā)流程中,由于其固有的內(nèi)部和外部依賴,較長(zhǎng)的交付時(shí)間,向后兼容,甚至十年前的遺留代碼。
-
汽車軟件外包帶來的分散性
對(duì)于成熟的汽車廠商,工程任務(wù)尤其是軟件的外包早已廣泛建立了。常見的就是OEM所依賴的金字塔式的供應(yīng)商。OEM集成了一級(jí)供應(yīng)商的ECUs,包括里面的基礎(chǔ)軟件。一級(jí)供應(yīng)商又集成了來自二級(jí)供應(yīng)商的軟件和硬件模塊。
舉個(gè)例子,比如實(shí)踐中,一級(jí)供應(yīng)商提供雷達(dá)系統(tǒng),包含雷達(dá)傳感器,用于數(shù)據(jù)處理的ECU(Electronic Control Unit),以及基礎(chǔ)軟件。二級(jí)供應(yīng)商可以提供一個(gè)軟件模塊,用于對(duì)來自傳感器的原始數(shù)據(jù)進(jìn)行對(duì)象檢測(cè)與分類。另外的二級(jí)供應(yīng)商可以提供傳感器的部分硬件模塊,如發(fā)射模塊。
?
這種程度的外包可能使軟件工程師感到不安,但這種方式確實(shí)使汽車制造商能夠構(gòu)建包含大概10,000個(gè)零部件以及80個(gè)ECU的復(fù)雜產(chǎn)品,而他自己并不必成為所有涉及的技術(shù),從機(jī)械到電子到軟件,的全球領(lǐng)導(dǎo)者。只要看看汽車中實(shí)施的各種軟件技術(shù),操作系統(tǒng),安全關(guān)鍵算法,移動(dòng)通信技術(shù)等等,很明顯,汽車廠商自己根本不可能掌握所有這些技術(shù)。那這些技術(shù)就委托給供應(yīng)商去做,供應(yīng)商作為各個(gè)OEM之間的共享資源。將這些開發(fā)轉(zhuǎn)移到供應(yīng)商可以降低風(fēng)險(xiǎn)(通過冗余)以及降低成本(通過競(jìng)爭(zhēng))。除了供應(yīng)商開發(fā)的技術(shù),汽車制造商自己也會(huì)確定自己在內(nèi)部要開發(fā)的核心功能。
?
多年以來,這種外包模式對(duì)汽車公司運(yùn)行良好。就在最近,模式發(fā)生了變化,由美國(guó)的科技巨頭通過地圖,應(yīng)用平臺(tái)(Apple CarPlay, Android Auto)進(jìn)入汽車行業(yè)引起。也有最近自動(dòng)駕駛技術(shù)進(jìn)入汽車行業(yè)的緣故。很明顯,事實(shí)上科技巨頭可以用汽車軟件掙錢啊,尤其是流經(jīng)軟件的數(shù)據(jù)。同時(shí),汽車軟件的復(fù)雜性迎來爆炸性增長(zhǎng),需要更緊密的集成和更多的內(nèi)部軟件能力。因此,我們正在努力提高汽車廠商的內(nèi)部軟件開發(fā)的能力。雖然這種趨勢(shì)目前主要還是集中在關(guān)鍵業(yè)務(wù)領(lǐng)域,如自動(dòng)駕駛。
?
當(dāng)開發(fā)自動(dòng)駕駛軟件時(shí),上面提到的OEM, Tier 1, Tier 2 之間的這種隔離意味著無論你是工作在OEM,一個(gè)供應(yīng)商,或者一個(gè)初創(chuàng)軟件公司,你都很難獲得驅(qū)動(dòng)汽車的整個(gè)軟件棧,特別是源代碼。你很可能會(huì)遇到黑盒二進(jìn)制文件,你可能沒法訪問到傳感器原始數(shù)據(jù),你可能必須得安裝線控系統(tǒng)因?yàn)槟銢]法訪問現(xiàn)有的系統(tǒng)。汽車軟硬件供應(yīng)商是如此的分散,您得和多方進(jìn)行交流。
-
交付延誤
如上所述,汽車工業(yè)中,通常就是由全球的供應(yīng)商網(wǎng)絡(luò),工程服務(wù)團(tuán)隊(duì),以及OEM自己通過嚴(yán)格的時(shí)間規(guī)劃,來構(gòu)建復(fù)雜的軟硬件產(chǎn)品。要定期進(jìn)行產(chǎn)品的更新,必須同步調(diào)整所有的合作伙伴。為了能夠在整個(gè)系統(tǒng)的某些部分仍處于開發(fā)階段時(shí)取得進(jìn)展,汽車工業(yè)依賴于原型級(jí)的硬件樣件,(A 樣件,B樣件,C樣件)以及成熟度不斷增長(zhǎng)的軟件版本直到實(shí)際產(chǎn)品釋放。這就會(huì)導(dǎo)致處于傳感器和ECU還是半成品的一個(gè)中間狀態(tài),挺痛苦的。
?
更重要的是,為這些層層嵌套的全球活動(dòng)制定精確的時(shí)間表幾乎是不可行的;非??赡芤粋€(gè)環(huán)節(jié)就是沒有準(zhǔn)時(shí)交付,你應(yīng)該對(duì)因此導(dǎo)致的無法按質(zhì)量預(yù)期交付有所準(zhǔn)備。要給自己預(yù)留足夠的緩沖時(shí)間以及B計(jì)劃來彌補(bǔ)由此造成的損失。
-
“汽車軟件開發(fā)”如何影響你的工作?
您會(huì)體驗(yàn)到由傳感器失靈,硬件未交付,固件更新弄崩了開發(fā)平臺(tái)而帶來的停工
您得處理半工作狀態(tài)的汽車,費(fèi)力巴拉識(shí)別代碼bug, 也會(huì)遇到隨機(jī)的系統(tǒng)崩潰
您得克服過時(shí)的軟件工程實(shí)踐并解決遺留代碼
您得學(xué)習(xí)汽車軟件工程標(biāo)準(zhǔn)并遵守它們
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的如何成为一名合格的自动驾驶工程师的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 热水器晚上要不要关掉(喝热水真的对身体好
- 下一篇: 为什么腾讯游戏在Win10上无法启动