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