為什麼我認識的機械工程師都抱怨工資低?
5千字長文乾貨!本碩7年機械,畢業自學C++轉型工業方面軟體,機械目前的待遇與所學的知識面寬度和難度是完全不匹配的,主幹課程主要是以傳統機械為主,材料力學、理論力學、流體力學和機械原理等等課程難度遠遠大於C語言,即便是有C語言、單片機和自動控制等課程也不會重視,這就導致機械專業的小夥伴兒畢業只能找結構工程師和工藝工程師,還有很多轉型銷售的。機械當年也是學校分數線數一數二的高,畢業被計算機碾壓不悲催嗎?
智能工廠
1、機械行業的現狀和未來,作為機械專業的小夥伴兒要學什麼
現在的工業4.0、智能製造、智能工廠怎麼智能化呢?曲柄滑塊機構這個玩的再花也是第二次工業革命的東西,第三次工業革命已經是計算機集成製造系統了,現在經歷的第四次工業革命是熱門的物聯網、大數據、人工智慧、視覺、機器人等技術與傳統工業交叉融合。現在的智能化,包括自動駕駛汽車也是傳統汽車作為本體,加上雷射雷達、視覺等等傳感器,最核心的就是控制器和控制算法。雷射雷達和視覺為什麼推動自動駕駛汽車發展了呢,也不是偶然,雷射雷達和視覺是在AGV裡面先成熟應用的,比如亞馬遜的智能倉儲系統就是靠AGV。AGV和自動駕駛汽車沒有本質區別,只是AGV要求沒有自動駕駛汽車那麼高,但SLAM算法是通用的。在亞馬遜的AGV智能倉儲系統之前,車間不都是人開的叉車嗎?時代拋棄你是不會打一聲招呼的。
工業設計加工及有限元工業軟件/CAD/CAM/CAE
我現在所做也就是C++工業軟體相關的工作,即便是機械專業的小夥伴兒想繼續為工業發展貢獻力量,換一個方式不行嗎?非要死磕結構工程師嗎?非要死磕工藝工程師嗎?作為機械專業這麼基礎的學科,而且在工業軟體被卡脖子的時代背景下,如果對工業軟體核心技術是什麼,由什麼國家掌握這是非常不應該的。某些高校Matlab被禁用的時候不是就有網友說,為什麼這麼多軟體工程師開發不出來Matlab呢?Matlab可以說是工業軟體,那些simulink仿真很多內部算法都是經過工程經驗積累的,有的模塊都是MIT、史丹福這些的名校開發。工業軟體完全不同於一般的企業管理軟體,難度根本不是一個量級。企業管理軟體很少涉及複雜的算法,基本都是以業務邏輯為主。CAD模型在計算機中怎麼表示?用到的是拓撲學。CAD模型怎麼顯示?需要的是計算機圖形學。CAM又怎麼生稱數控G代碼?需要的是微分幾何。CAE又怎麼求解複雜結構件的受力問題?用到的是有限元分析,有限元是做什麼的呢,是偏微分方程的數值解法,那CAE還需要什麼呢,大規模稀疏剛度矩陣的存儲和求解。工業軟體都是數學的工程應用,來不了虛假。
CAD三維模型在計算機中的拓撲表示方法
工業軟體這麼重要,關係到全球產業鏈分布的問題,網際網路這麼繁榮為什麼不投入資金開發工業軟體呢?網際網路現在主要是做什麼呢,主要是解決資源分配和效率問題,並沒有觸及行業的靈魂,大多也會造成社會問題。比如外賣小哥安全問題、成熟共享單車到處堆積如山、網際網路社區低價賣菜造成農民收益空間極度壓縮危機未來的菜籃子等等。這些快速整合資源賺錢非常快,比如共享單車一年不到輕輕鬆鬆賺幾十上百億,工業軟體投入10年都賺不了錢。真正可以從根本上改變機械行業,真正理解機械行業需要什麼改變的沒有人比機械的小夥伴兒更懂,機械行業想改變靠網際網路是靠不住的,網際網路喜歡賺的是熱錢快錢,而機械行業天生重資產賺不了快錢,真正能革新製造業的力量還是來源於機械專業懂軟體的小夥伴兒,計算機專業是不會知道製造業經驗多麼重要,也就無從說起怎麼把製造業的經驗建模提煉出來知識反作用於製造業。
·下面是7000字長文,結合我的經歷探討機械專業轉型的問題,希望給正在困惑的小夥伴兒一點思路。
如果你真的對目前的工作很不滿意,有兩條路線非常靠譜一是自學C++轉型,二是考研,哪怕是考個985的機械專業研究生,畢業找工作轉型也不難。機械專業也有研究機器人、視覺、深度學習故障診斷等前沿技術的,做這些方向畢業找軟體是比較容易進大廠的。我讀研做的就是智能優化算法,找軟體工程師工作的時候也是有點兒幫助。考研人數每年大幅增加,有讀研想法的小夥伴兒,別猶豫了,再猶豫就沒機會上車了。我14年考研的時候才170萬人,21年已經突破400萬了,非常恐怖。我如果沒有讀研究生,我現在的工作肯定也是在工廠老老實實呆著,對於普通本科的小夥伴兒,或者對於原本專業就業不滿意的小夥伴兒,讀研又是一次重新來過的機會。
·現在什麼專業都在跨考計算機,都在轉碼農,作為萬金油機械如何避開卷的漩渦呢,機械想考研的小夥伴兒可以看一下:
2、了解和機械關係比較密切的自動駕駛汽車、機器人等前沿技術
自動駕駛汽車怎麼自動呢,第一步就是靠雷射雷達、視覺、GPS等傳感器感知環境。
自動駕駛汽車控制框圖
從自動駕駛汽車的控制架構很明顯看出,傳統汽車已經成為一個被控對象,傳統汽車設計和製造技術已經非常成熟,傳感器和控制算法才是核心。有小夥伴兒會說自動駕駛汽車不是已經很多人研究了嗎,還有機會嗎,其實如果你關注自動駕駛汽車技術發展的話,現在自動駕駛汽車還是在起步階段。具體怎麼衡量前沿技術所在的階段呢,國際上有一個技術成熟度曲線,自動駕駛技術目前L4級別還遠遠不能大規模商用,最終的全自動駕駛是L5級別,還需要非常多的技術亟待攻克。
·看圖中Autonomous Driving Level 4,就是目前主流的自動駕駛研究方向。
前沿技術的成熟度曲線
3、C/C++編程和數據結構與算法的學習
軟體和算法對於工業多麼重要,你看工業金字塔的塔尖是什麼技術,是企業管理軟體嗎?顯然不是,ACIS和Parasolid等等是什麼呢,是CAD/CAM/CAE的內核,內核相當於什麼呢,類似作業系統的內核,工業軟體能做什麼功能不是一般的軟體工程師決定的而是內核。晶片設計的EDA也是工業軟體。
這些內核都是由什麼巨頭開發呢?看下面的圖就是主流工業軟體內核的開發公司,製造業的強大僅僅在硬體是遠遠不夠的,軟體和算法才是支撐製造業智能化升級的基石。
如果你想學C++,也不想安裝Visual Studio等開發環境,初學者安裝開發環境也是問題,很多小夥伴兒搞幾天還不知道怎麼寫代碼和調試,學習C++不如直接就用在線開發環境,C++基本熟悉了再去本地做複雜的程序也不遲。推薦一個非常簡單易用的在線IDE,Compiler - Code, Compile, Run, Debug online C, C++,看下圖1分鐘可以學會使用,下面還有一個經典的鍊表數據結構源碼,直接copy到開發環境裡面運行即可。Linux內核開發者Linus Torvalds說過一句話,軟體免費才是最好的,現在Linux應用不是越來越多嗎?機器人控制器基本都是Linux吧。
在線開發環境
·C++鍊表實現demo源碼,調試通過的代碼
#includeusingnamespacestd;
structlistNode{
intvalue;
listNode*next;
listNode():next(nullptr){}//默認構造函數listNode(inttheValue):value(theValue),next(nullptr){}//帶參構造函數};
intmain(){
listNode*head=NULL,*node=NULL,*pListEnd=NULL;
node=newlistNode(1);
head=node;//鍊表頭指針pListEnd=node;//鍊表尾指針
node=newlistNode(2);
pListEnd->next=node;//鍊表的尾節點的next指針指向新的nodepListEnd=pListEnd->next;//鍊表的尾節點指針後移到新的尾節點
node=newlistNode(3);
pListEnd->next=node;//鍊表的尾節點的next指針指向新的nodepListEnd=pListEnd->next;//鍊表的尾節點指針後移到新的尾節點
listNode*pNode=head;
intindexNode=0;
while(pNode!=nullptr){
cout<<"鍊表節點 "<<indexNode<<"的值: "<<pNode->value<<endl;
pNode=pNode->next;
indexNode++;
}
return0;}
與其抱怨不如改變,機械專業好與不好已經不重要,放在人生長河看來所學的四年機械不過是一小段時間而已,當你真正開始學習編程的時候,每天並不痛苦,是為自己的夢想奮鬥的感覺。數據結構方面本科只學過鍊表而已,實際上還有堆、紅黑樹、AVl樹、hash表、map、set等等。我剛開始對這些數據結構完全不了解,就是看一個數據結構的理論刷幾道相關的算法題。找不到C++的工作那我刷題就不停止,找到C++工作的時候我已經刷了500多道題,現在回想起來那段時間我都不知道怎麼走出來的。
·數據結構與算法多重要,看一下常見的C++算法面試題。鍊表、二叉樹等等都是算法面試高頻考點兒。
很多小夥伴兒會糾結學C還是C++,是直接學C++還是先學C,糾結在這樣的起點問題完全沒有必要。我剛剛開始學C++的時候也是非常糾結,到底要學什麼。學習C++首先需要解決的問題是你要進入什麼行業,能具體到職位是最好的。比如Qt C++軟體工程師、Linux C++軟體工程師等等。當你期望的工作是具體職位的時候,目標就非常明確,學什麼就看期望職位要求什麼能力。C++主要是應用在機器人、自動駕駛、工業軟體、遊戲等等對性能要求非常高的場合。高性能軟體的開發就需要紮實的數據結構與算法能力、設計模式能力等等。這些能力都是吸引比較長的時間積累,突擊不會。
人最寶貴的東西是生命。生命對人來說只有一次。因此,人的一生應當這樣度過:當一個人回首往事時,不因虛度年華而悔恨,也不因碌碌無為而羞愧。【鋼鐵是怎樣煉成的】
C++學習的過程中可以收集一下常見的面試題,這些面試題都是可以找到答案的,基本都是需要結合代碼才能理解深刻。
.C++內聯函數是什麼?內聯函數能否是遞歸函數?
.解釋C++的this指針,以及其應用場景。
.函數重載和運算符重載有什麼區別?
.C++運行時多態是如何實現的?編譯時多態是怎麼實現的?虛函數是什麼?純虛函數是什麼?基類的析構函數是否必須為虛函數?
.析構函數是否可以重載?
.struct和class有什麼區別?
.指針和引用的區別?
.深度拷貝和淺拷貝的區別?拷貝構造函數如何定義?拷貝構造函數和賦值構造函數有什麼區別?
.C++繼承中的鑽石問題是什麼?怎麼避免?
.new和malloc,delete和free有什麼區別?
.智能指針有哪些?shared_ptr使用中存在什麼問題?
.i++和++i運算符如何重載?效率有什麼區別?
.C++中的vector、list、set、map、unordered_map和unordered_set底層的數據結構是什麼?常用的查找操作時間複雜度各是多少?這些容器使用時如何選擇?
·自學C++並不需要很多錢,而是經歷,選擇基本兩本經典的書入門是非常快的,選擇一本C++的經典入門資料,再選擇一本數據結構與算法額入門資料,兩本書足矣。