當前位置: 華文星空 > 知識

為什麽招聘微控制器工程師的時候要求精通C/C++?

2019-07-19知識

所謂的大部份微控制器專案不用C++是因為整個嵌入式開發行業從業者的平均軟件素養已經差到了一個令人發指的地步。

大部份嵌入式工程師出身於電子、通訊、自動化等專業,由於專業教育的缺失和自己學習能力的問題,根本不具有物件導向設計、設計模式、軟件工程等基本常識,所以在他們看來C和C++差不多,沒必要上C++。

一個基層工程師,整天滿嘴都是穩定、可靠、市場、成本、性價比這些屁話,卻根本沒聽說過設計模式、程式碼復用、可延伸性、單元測試、持續整合這些現代軟件技術的精華。知道的知道你是一個強行挽尊的嵌入式工程師,不知道的還以為你是什麽統領千軍的大老板。

(我預判了他們的預判,這段真的戳到了一些傳統的嵌入式工程師。居然有人跟我杠說設計模式、單元測試、持續整合這些不重要?我通篇就是打的這樣人的臉,你被打完了還跟我說:你打臉而已,沒打到要害,你根本就不會打人!我笑得滿地打滾!)

所有沒用到C++的微控制器 套用專案 (底層驅動庫不在此列),都是因為其規模過小,套用過於簡單,一兩個人,最多不超過5人就可以完成全部開發,這種專案不但用不到C++,甚至用不到C,甚至用組譯完成,更用不到任何現代軟件工程技術。作為一個嵌入式開發的候選人,如果你想加入大廠,參與任何有規模的嵌入式專案,你的C++水平就是你的天花板。這裏的大廠不止是華為、大疆這種,甚至很多愛好者熟悉的「周立功微控制器」老板周立功就多次在公開場合表示,他們已經全面轉向C++,只會C的工程師不會得到工作機會。

Arduino也許是世界上最著名的AVR(8位元微控制器)專案,沒有之一。Arduino的封裝全面使用了C++和物件導向的設計。廣泛使用基於虛擬函式實作的執行時多型,很多設計遵從了開閉原則、介面隔離、依賴倒置等重要設計原則。我曾經詳細分析過一個依賴倒置的使用案例,請見:

Arduino 的 Serial.write() 和 Serial.print() 的區別在哪裏? - Qi K的回答 - 知乎 https://www. zhihu.com/question/2130 7404/answer/76307986

在ARM專案中, 用到C++的更多。ARM官方推動的mbed專案大概是ARM微控制器領域最知名的專案之一。如果你要擡杠說Arduino是玩具,不具有工業強度的話,那mbed專案絕對是為工業級套用設計的,從底層RTOS到上層的硬件抽象層HAL都有實作。mbed是用C++實作的,廣泛使用開閉原則和依賴倒置,要求使用者透過繼承虛基礎類別來完成平台相關的實作,從而實作擴充套件。

如果你是一個一線嵌入式工程師,卻根本不了解我提到的一些專業術語是什麽意思,我覺得應該反思一下為什麽自己的薪金上不去。因為這些都是最基礎的物件導向和設計模式常識。

最後回答問題,為什麽微控制器工程師要求會C++?那還不簡單?因為企業不傻啊!

P.S. 有朋友提到C++的程式占用空間大,我只能說你姿勢不對,C++的demangling、RTTI、Exception等機制確實會占用一些額外的Flash空間,但這不是不用C++的理由,在空間要求嚴格的專案中這些feature都可以透過編譯器選項關掉,實際空間占用與純C相比並無明顯差別。

特別喜歡跟網友擡杠,所以歡迎留言~但如果你想批評我的某些觀點,而你卻沒有開發過單個固件超過10萬行程式碼、單個程式碼庫活躍的協同開發人數大於5人的微控制器專案,那你很可能因認知水平與我差距過大而無法理解我說的什麽。你可以安全地假設你的觀點是錯誤的,並嘗試接受新的觀點。

有些評論有點跑偏了哈~其實我也是C的鐵粉,C在嵌入式領域毫無疑問占有舉足輕重的地位。這篇文章的主題並 不是 證明C語言垃圾,應該用C++替代,試圖證明一種語言應該替代另外一種語言的嘗試都是愚蠢而無意義的。我堅定認為在現代嵌入式系統中,C和C++共存的現象會廣泛存在,且具有上升的趨勢。在硬件抽象層使用C,在套用層和介面層使用C++是非常典型的實踐。這也是正面回答這個問題,為什麽嵌入式要會C++?因為嵌入式套用中C和C++都有用。

說了這麽多,如果你的觀點還是「C++無用,C++滾出嵌入式」的話,祝你好運!