C++ 学到什么程度可以找工作?
置頂/星標公眾號????,硬核文章第一時間送達!
鏈接 |?https://www.zhihu.com/question/400543720
至少需要哪些知識?需要掌握到什么程度呢?
https://www.zhihu.com/question/400543720/answer/1275849097
簡單說,如果僅僅學C/C++本身的話,學到什么程度你都找不到工作。
學習掌握某種編程語言的語法只是一個基礎,一個起點。因為語言只是一種工具,學會語法特性僅僅是知道這種工具長什么樣子、能擰能鉆能銑能刨,如此而已。
想要找到工作,你需要能夠使用這件工具創造價值——你不能僅僅知道鋼銼能挫鐵,還要學會看圖紙、會在給你的料子上合理規劃、挫出符合圖紙要求的合格元件來。
簡單說,如果分若干級別的話,可能如下:
1、了解C++的常規語法,知道函數調用、類、虛函數、多態等的功能/原理;可以獨立完成課后習題。
達到這個水平已經可以勝任很多職位了;但需要在工作中繼續成長。幸好愿意招應屆生的公司對新人的要求都不高,你有時間慢慢成長。
但要注意,這里的要求是“獨立完成課后習題”,靠老師教、抄別人答案是不管用的。甚至抄完了死記硬背下來也是白搭。必須自己通過獨立思考解決問題。面試者有的是辦法試探出你有沒有自己解決問題的能力。
如果課后題被“劇透”的太厲害的話,網上刷題也是條路子。還是那句話,別一味抄別人的代碼,你起碼要能獨立解決其中一小半的問題,這才能證明你的確知道這件工具的用法。
2、能夠活用自己掌握的C++知識,獨立實現一些小型項目
比如,寫個沙雕小游戲逗女朋友開心,寫個排課程序幫老師解憂,甚至寫個簡單的課程提醒程序提示你每天帶哪些書,等等。真正把“實踐任務”和“C++編程連起來”——現在很多公司其實干的就這活,沒什么技術含量。
3、借助別人封裝好的API/庫,實現看起來更強更厲害的功能
比如,借助算法庫里的MD5算法和OS提供的目錄遍歷API,把系統所有要害文件(應用程序、DLL、注冊表等)的大小、修改時間、數字摘要都算出來、儲存到一個文件里。以后每隔幾天遍歷一次,檢查它們的大小、修改時間,如果有變化就計算數字摘要——也可以強制計算所有的數字摘要——從而找出哪些要害文件被修改了、這些修改是系統自己打的補丁呢,還是不法程序(病毒木馬流氓軟件等)的非法修改。
這就是一個極為簡陋、但效果還行的反病毒工具。它的缺點是,這是個白名單工具,只能檢查到通過修改要害文件獲得執行權的病毒/木馬,同時會對系統更新產生誤報。但仍然不失為一個效果不錯的系統問題排查工具——因為OS要害文件經常是好些年不變的(現在你知道為何有時候有的殺毒軟件會殺系統文件甚至殺自己了吧?)。
再比如,利用現成的深度學習庫/語音識別庫搞一些貌似高大上實則沒什么技術含量的人臉識別/語音識別/聲線識別程序——別緊張,你能行。
能折騰這些,你到公司基本上就可以算是個“能人”,可以跟風做一些聽起來很帥但其實仍然沒什么技術含量的工作了。
4、真正理解算法與數據結構,理解操作系統原理、計算機原理、數字電路原理以及編譯原理、數據庫原理、網絡原理等等基礎原理
到了這個程度,你才算沒辜負“科班出身”這個頭銜,脫離了“碼農”“調庫專家”“新技術層出不窮怎么都跟不上學不完”的半外行狀態,可以從事一些較為硬核的、探索性的工作,幫公司開拓新應用領域了。
5、你仍然可以繼續深入。比如圖形圖像壓縮,比如加解密算法,比如網絡協議棧等,每一個子領域都夠很多專家投入一輩子的。不過這些領域經常返璞歸真,C反倒會成為更常用的語言;而且往往需要高等數學作為發動機。
比如著名的卡馬克牛頓迭代法求平方根的倒數算法,其中用的魔幻數字就引出了好幾篇論文。專家們用卷積找出了一個魔幻數字,但是效果不如卡馬克數字。再后來有人暴力窮舉,這才找出一個優于卡馬克魔幻數的新數字來。
再比如,現在的CNN神經網絡,有次我提到要理解它你得懂卷積;于是跳出來幾個自以為很懂的出來杠我“我敢打賭,你是聽到這個東西的名字里有個卷積于是胡亂腦補。其實這東西和卷積沒半毛錢關系”……
他們不知道,CNN里面的確沒有卷積符號、也沒有使用卷積計算公式;但它的實現思路就是卷積運算。只不過它的設計者把卷積算法化用進簡單的連續矩陣計算中,在深度神經網絡中實現了“特征抽象和特征空間變換”——這是矩陣和卷積全都學到出神入化、用出來讓普通人看不懂、但內行一看就知道還是新瓶裝舊酒的結果。
其實前面提到的數據結構與算法等基礎知識,會玩的同樣能玩到返璞歸真。比如有人隨隨便便三兩行代碼就把一個數組變成了環形緩沖區,或者簡簡單單兩行聲明就搞定了一個遞歸算法。如果你積累不夠深厚、頭腦不夠靈活,這個東西就很難看懂。
總之,這個領域是屬于創造者的。能踏入這個領域,那就不是你找工作,而是工作找你了。
綜上,如果僅僅是學C++這門語言的話,學到什么程度你都不好找工作。
你需要學的,是用C++這門語言去解決問題。能解決課后練習題是一個水平,能刷網上的算法題又是一個水平;能自己搞定簡單的實用項目是一個水平,能充分利用操作系統以及第三方軟件/庫給你提供的抽象(意味著你能理解他們的設計思路)實現幾乎所有東西又是一個水平;理解各種東西背后的原理是一個水平,把這些原理玩的出神入化又是一個水平;學會用數字認識這個世界是一個水平,能夠化用高深的數學知識、信手解決沒人說得清的難題又是一個水平……
一般來說,只要你能達到“用C++解決簡單問題”的水平,找工作就不成問題了;只是受限較多,只能從事一些較為初級的工作,極易陷入沒日沒夜機械的寫代碼的窘境,然后看著層出不窮的新技術欲哭無淚。
你往前趕的越多,你代碼里的智慧和靈氣就越多;此時你才可以嘗試那些必須用巧力的工作,或者用巧力把繁重的工作變得簡單、甚至促進你所在公司乃至全人類的開發效率。玩到這個程度,你才算真正踏入程序員的行列。
https://www.zhihu.com/question/400543720/answer/1723466994
應屆畢業加入騰訊做游戲開發,用的就是windows C++!
先說下我應屆加入騰訊的經歷,供大家參考:
大三就制定了加入騰訊游戲的目標,同時鎖定在圖形圖像開發,這意味著要好好學習C++。
因為大學前兩年全荒廢了,所以大三是沖擊的一年。
要學好C++,先了解C語言,當年這是師兄告訴我的,今天回頭看非常對!
譚浩強的《C語言程序設計》反復看,然后一行行在電腦上敲出來。
當時對計算機缺乏系統認識,最難理解的就是指針,書上說它是個變量地址,那么問題來了,什么是地址?一不小心,指針就讓程序Crash了。直到讀研的時候,看了大學教材:《計算機組成原理》這本書,我才明白指針背后的含義。
攻克完C語言之后,聽師兄師姐說數據結構也是自學編程需要攻克的重難點。從數組到鏈表再到堆棧、二叉樹、平衡二叉樹、紅黑樹、B+/B-樹,簡直就像看天書。還記得二叉樹的先序,中序,后序遍歷就把我弄暈乎了。更別提后面的AVL樹的刪除以及B-樹。
我應付看不懂的方式也很粗暴:做筆記,勾選出沒看懂的部分,反復看。一遍不行看兩遍三遍四遍,直到所有內容看懂為止,看懂后就上機,上到天昏地暗上到頭暈腦脹。數據結構這本書,記得來來回回看了10多遍,上機100小時以上。
這之后開始系統的學習網絡、C++、VC,還記得有一本非常厚的書:《C++ Primer》,可以說上面的每一個例子,都上機造過輪子。
隨后開始啃《Effective C++》、《More Effective C++》、《C++程序設計原理》、《深度探索C++對象模型》、《STL源碼剖析》、《計算機網絡系統方法》、《TCP/IP詳解》。
除了瘋狂自學,畢業的壓力也很重,但掌握的東西越多,你對未來就越篤定。
瘋狂學習的過程是枯燥且伴隨痛苦的,編譯報各種不通過的時候讓人無比抓狂,知識點學不會的時候會讓你懷疑自己的智商。
曾經看過的一部分書籍:
成長的過程,潤物細無聲,極難察覺。但那段枯燥痛苦的學習和刷題歲月讓我未來的道路受益匪淺。畢業后,我也如愿拿到騰訊游戲年薪近15萬(多年前)的Offer,開啟了職場生涯。
畢業后,擔任過360技術委員會成員,在C++這條路上走得更遠了,再給大家一些系統的建議:
一、C/C++入門階段
這個階段全力以赴的話,5個月時間差不多可以掌握。
剛入門的時候我們主要是學習培養編程思維和動手能力,深刻理解面向過程和面向對象的思想方法,這對以后的程序員之路非常重要!
所以學習語言更為重要:
面向對象編程思想;類的封裝,構造和析構、靜態成員、對象管理;類的構造(有參構造函數、無參構造、拷貝構造、默認構造函數)和析構;對象動態管理、友元函數、友元類、操作符重載;C++編譯器對象管理模型分析;類對象的動態管理(new/delete);友元函數和友元類;運算符重載(一元運算符、二元運算符、運算符重載難點、項目開發中的運算符重載);類的繼承、多繼承及其二義性、虛繼承;多態(概念、意義、原理剖析、多態案例);虛函數、純虛函數、抽象類(面向抽象類編程思想案例);函數模板、類模板,模板的繼承。
C++類型轉換;C++輸入輸出流(標準I/O 文件I/O 字符流I/O);C++異常處理(異常機制、異常類型、異常變量、異常層次結構、標準異常庫);利用一些IDE開發工具:諸如Windows平臺VC系列:VC++6.0(比較古老) ;Visual Studio2013, Visual Studio2015,Visual Studio2017,Visual Studio2019;Mac平臺的XCode系列,還有CodeBlock,另附一些高級編輯器Notepad++, EditPlus,UE等一些開發工具的常用設置和一些常見快捷鍵的使用。
這個階段推薦以下兩本書:
《Essential C++》 這是一本內容不多但很實用的C++入門書籍,強調快速上手與理解C++編程。本書主要圍繞一系列逐漸復雜的程序問題,以及用以解決這些問題的語言特性展開講解。你不只學到C++的函數和結構,也會學習到它們的設計目的和基本原理。
《C++ Primer》 本書對C++基本概念、技術、以及現代C++編程風格進行了全面而且權威的闡述,是C++初學者的最佳指南;本書可以幫助你編寫實用的程序,而無需首先精通每個語言細節。對于中高級程序員,本書也是不可或缺的參考書。
二、C/C++開發進階
這個階段非常刻苦的話,需要半年以上時間。
在第二階段學習的時候,就是比較重要的了,C++開發的進階之路,更是一個讓自己找份薪水比較體面的工作的籌碼。
C++進階之STL:
STL = Standard Template Library,即標準模板庫。這是提高開發效率的極品工具。通過學習此階段,應掌握泛型編程技巧,理解容器類在C++語言中的應用模式,以及熟練掌握全部STL類的使用方法。
C++進階之設計模式:
決定一個項目成敗最重要的因素是項目總體的設計,通過本階段的學習,可掌握面向對象編程中重要的一環,是編碼前建模的技巧所在。單例模式;工廠模式;代理模式;迭代模式等,這些都是你要掌握的哦。
C++進階之數據結構基礎:
這是所有編程語言中最應該學習的部分,程序組成的基礎之一。順序存儲、鏈式存儲、循環鏈表;
雙向鏈表、棧(順序和鏈式)、隊列(順序和鏈式);
棧的應用、樹基本概念及遍歷、二叉樹;
排序算法、并歸算法、選擇、插入、快速、希爾。
這個階段推薦以下幾本書:
《Effective C++》和《More effective C++》 作者是Scott Meyers。你應該熟讀它們,并清楚地理解每個項目。該書圍繞55條準則,每一條都介紹了一個可讓你寫出更好的C++程序代碼的方法,并以特別設計過的例子詳加討論。
《Exceptional C++(C++編程剖析)》和《More exceptional C++》 這兩本書中都包含了40個C++編程問題,這些問題會讓你磨練自己的技能,最終成為優秀的C++程序員。這些問題是Herb Sutter精心挑選,與ISO/ANSI C++官方標準相一致,幫助程序員在設計、架構和編碼過程中保持良好的風格,從而使編寫的C++軟件更健壯、更高效。
《Inside the C++ object model(深度探索C++對象模型)》 本書專注于C++面向對象程序設計的底層機制,包括結構式語意、臨時性對象的生成、封裝、繼承,以及虛擬——虛擬函數和虛擬繼承,幫助你理解程序的底層實現,以便寫出更高效的代碼。
《The design and evolution of C++(C++語言的設計與演化)》 本書作者也是C++語言的設計者Bjarne Stroustrup,作者在書中綜合性地介紹了C++的發展歷史,C++中各種重要機制的本質意義和設計背景,這些機制的基本用途和使用方法,討論了C++所適合的應用領域及其未來的發展前景,既沒有忽略關鍵性的詳情,又沒有過多地陷入技術細節。
三、C++開發高級
這個階段幾乎伴隨了職場后續的整個生涯,只有更精沒有最精,C++高手之路,任重道遠!
C++進階之QT開發:
掌握QT類庫構架,圖形界面開發模型;掌握QT開發技巧,消息機制,圖形處理;掌握QT網絡編程,UDP,TCP使用方式;掌握QT文件處理方式,序列化;掌握QT在windows,linux,ios,android不同平臺下的移植技術
C++進階之Windows/Linux網絡服務器:
掌握Unix/Linux平臺開發方式;熟練使用系統調用;熟練Unix/Linux內存管理,進程,線程調度;掌握MFC界面開發,網絡編程;熟悉網絡服務器開發方式,熟練編寫TCP,UCP網絡服務程序;掌握同步/異步IO模型在網絡編程中的使用方式。
C++進階之數據庫開發:
掌握SQL語言的實用技巧。Oracle,MySQL數據庫的使用方式。
如果你能熟練掌握以上列出的技能,具備解決復雜問題和技術難點的能力,而且你能獨立開發一些比較復雜的功能模塊,這個時候月薪過萬都是小意思了!
這就是所謂的程序員大牛了,當下炙手可熱的全棧開發工程師,既曉前端,又通后臺。快速定位問題,解決問題對他們來說已是小菜一碟,就是人們常說的神秘大牛,只在公司技術攻關的時候才會才看到他們的身影。
這個階段,在C++領域,你已經飛躍愚昧之巔跨越絕望之谷,進入開悟之破了。推薦以下書籍:
《The C++ standard library(C++標準程序庫)》 這是標準模板庫字典,你可以在本書中找到STL相關的一切知識。本書焦點放在標準模板庫、檢查容器、迭代器、函數對象和STL算法上。每一個元素都有深刻的呈現,包括其介紹、設計、運用實例、細節解說、陷阱、意想不到的危險,以及相關類別和函數等。
《Effective STL》 這是Scott Meyers的第三本C++專著,也是學習STL最權威的書籍。作者對書中的50個指導方針都作了詳盡的分析,并配以示例。通過這些規則,C++開發者可以最大限度地使用STL。
《Generic programming and the STL(泛型編程與STL)》 本書闡述了泛型程序設計的核心理念:concepts(概念)、modeling(模型)和refinement(改善),并為你展示這些觀念如何導出STL的基礎概念:iterators(迭代器)、containers(容器)和function objects(函數對象)。按照本書所述,你可以把STL想象成一個由concepts組成的library,你將學習到STL正式結構并理解其強大的優勢。
《Exceptional C++ style》 作者為Herb Sutter。本書同樣提出了40個C++風格相關的問題,對一些至關重要的C++細節和相互關系提出了新的見解,為當今的關鍵C++編程技術(如泛型編程、STL、異常安全等)提供了新的策略,幫助開發者在開銷與功能之間、優雅與可維護性之間、靈活性與過分靈活之間尋找完美的平衡點。
《C++ template》 這是一本關于C++模板的完整的參考手冊和教程,它強調模板的使用實踐,包含了現實世界中的例子。每個C++程序員都應該好好讀一讀這本書。
《Modern C++ design(現代C++設計)》 作者Andrei Alexandrescu為C++程序員打開了一個新的局面。本書提供了一些針對軟件設計的前沿方法,如聯合設計模式、泛型編程,使程序員可以編寫有表現力的、靈活的、高度可重用的代碼。
《Thinking in C++(C++編程思想)》 C++ 領域權威著作,介紹了C++實用的編程技術和最佳的實踐方法。
以上是用一年時間應對面試學習C++的建議。
還有一個我最近發現的一個非常贊的視頻,是一個國外 C++ 游戲引擎開發工程師錄制的一套偏向 talk 類型的教程,比較通俗易懂和深入淺出。
推薦一下:
[中英字幕] C++_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili:https://www.bilibili.com/video/BV1Ay4y1i7Z6
另外翁凱老師無論是 C、C++、Java 的視頻都講得非常深入淺出,值得學習。
這是網易云課堂地址:
面向對象程序設計-C++ - 網易云課堂:https://study.163.com/course/introduction/271005.htm
作者:江東某人
https://www.zhihu.com/question/400543720/answer/1275079446
這個答案具體取決于方向,面試級別等等,但一個不爭的事實是
C++是不可能精通的
想起了自己學習C++的血淚史/(ㄒoㄒ)/~~
學習了基本輸入輸出,條件語句,循環,函數,內心:這玩意也就比C多了函數重載、引用,還有個頂層const與底層const,分分鐘搞定
學習了基本的OO部分,內心:emmm~~~,C++還是有兩把刷子的,不過還行還行,開闊了思維
學習了閉包,泛型,STL,內心:好多要記的東西,好煩呀,感覺不行了
了解了模板元編程,多重繼承,虛繼承,多線程,Boost庫,內心:
以后見人只敢說用過C++。。。。(C++還有Qt,opencv,opengl,甚至微軟的.net等一堆東西
所以Life is short, you need Python
作者:匿名用戶
https://www.zhihu.com/question/400543720/answer/1282930274
“C++學到什么程度可以面試工作?”是一個毫無意義的問題。
這個問題等價于“我錘子用到什么程度就能找到工作?”
錘子可以修汽車,可以蓋樓房,可以做裝修,但“錘子用到什么程度”這個語句毫無指向性。
錘子只是一個手段,而不是目的。
所以一個人的C++實力得結合具體的工作內容來談。
目前市場上使用C++崗位不多,且要求都比其它崗位更高,所以題主如果有志于在C++相關的方向上發展,得做好在這個方向上長年累月去投入的準備。
C++有下面這些方向,下面我們一一介紹一下:
1. Web Backend
Web業務后臺目前國內使用C++的公司不多,并且使用范圍在逐漸縮小,業務后臺開發需要的是快速的產品迭代和極高的開發效率,因此C++在web后臺開發所使用的份額已經被JAVA和Go所吞噬的差不多了,強烈建議題主不要使用C++走這個Track,如果一定要走,那么要把OS, Networks等科班課程學精,熟讀《Linux系統編程手冊》《TCP/IP詳解123》。這個方向對于C++本身的語法要求并不高,把C++ OOP和STL部分掌握熟練就行,Lambda以及Template了解即可。
2. HPC(High Performance Computing)/AI Infrastructure/ML System
HPC這個方向比較學術性,只會在BATTMD等大公司存在,小公司沒有,因此就業比較窄,就業人數也很少,競爭不那么激烈。目前HPC開發更多的是作為AI Infrastructure的一環存在,著重解決的是DL的算力問題。若從事相關工作,需要學習的東西非常非常多,個人認為這個Track是整個CS工作中最累也最難的,需要學習的東西橫跨軟件,硬件,算法三個維度。首先得學習Computer Architecture等硬件課程,然后得閱讀Tensorflow/Pytorch等某個深度學習框架的C++源碼,詳細了解主流神經網絡的結構,最后還得熟悉CUDA編程,TVM/XLA以及編譯原理等相關內容。這個方向對于C++語法的要求也比較高,需要深入理解C++11/20, C++函數式編程以及C++ Template,而不只局限于C with Class以及STL。本人認為這個方向很難走,若不是科班畢業并且有幾年的積累,不建議走這個方向。
3. Database開發
Database開發,Database的學術性比較高,并且就業崗位比上面兩個更多,屬于C++中就業壓力相對較小的,BAT等大公司才有能力根據自己的業務定制Database,因此相關崗位集中在大公司。Database所需要的技能棧和1比較相似,但對于OS以及Computer Architecture知識的能力要求高于1,需要深入理解Disk架構,對于C++的語法能力要求也高于1。記住,只要和業務性能瓶頸處相關的開發崗,對于C++的語法要求都很高。
4. Networks
Networks這個方向我不是很了解,在此不做過多的描述,此方向的就業崗位主要集中于思科,華為,中興,諾基亞等公司,崗位較多,和3差不多。Computer Networks的相關的知識是核心,需要精讀《TCP/IP詳解》。
5. OS/驅動/Compiler
這三個方向的就業崗位相當少,國內也只在微軟,華為等少數幾個公司存在,嚴格來說這些方向上對C的能力要求要更多一些,所以把C++中C的部分以及C++以外C的部分學好就行,對于CS的Compiler,OS,Architecture三大件要熟練掌握。
6. Multimedia(圖形/視頻/語音處理)
嚴格來說, Multimedia其實屬于算法方向,C++只是實現算法的一種手段而不是目的,走這個方向需要對相關音視頻圖像的處理算法有很透徹的理解,圖像的話熟讀《Digital Image Processing》,熟練使用FFmpeg/OpenCV等相關工具。這個方向對于C++的語法能力要求不高,把C with class搞明白就OK了。
7. 游戲引擎開發/游戲前后臺開發
其實游戲引擎開發嚴格來說也是一個算法方向,從事這個方向數學要好,尤其是線性代數,熟讀《Computer Graphics》,C++主要用來實現相關的圖形學算法。游戲前后臺開發答主沒有經歷過,不便做過多的描述,但我可以告知的是此方向就業崗位較多,并且很長一段時間內會非常穩定,題主若有興趣,可自行搜索相關資料。
以上7個相關的崗位就是目前市場上使用C++最多的7個崗位,當然還有嵌入式,Windows軟件開發等稍冷門的方向。題主若想從事C++相關的工作,絕非把C++的語法搞明白這么簡單,而需要從技術上深刻理解C++上下游的環境依賴,也要結合具體業務在技術上有所思考。
往期推薦
??專輯 | 趣味設計模式
??專輯 | 音視頻開發
??專輯 | C++?進階
??專輯 | 超硬核 Qt
??專輯 | 玩轉 Linux
??專輯 | GitHub 開源推薦
??專輯 | 程序人生
關注公眾號「高效程序員」????,一起優秀!
回復“1024”,送你一份程序員大禮包。
總結
以上是生活随笔為你收集整理的C++ 学到什么程度可以找工作?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [function.require]:
- 下一篇: 现在mfc的现状如何_天玑云客:微信代运