C++ 學(xué)到什么程度可以找工作?

置頂/星標(biāo)公眾號??,硬核文章第一時(shí)間送達(dá)!
鏈接 | https://www.zhihu.com/question/400543720
至少需要哪些知識?需要掌握到什么程度呢?
學(xué)習(xí)掌握某種編程語言的語法只是一個(gè)基礎(chǔ),一個(gè)起點(diǎn)。因?yàn)檎Z言只是一種工具,學(xué)會語法特性僅僅是知道這種工具長什么樣子、能擰能鉆能銑能刨,如此而已。
想要找到工作,你需要能夠使用這件工具創(chuàng)造價(jià)值——你不能僅僅知道鋼銼能挫鐵,還要學(xué)會看圖紙、會在給你的料子上合理規(guī)劃、挫出符合圖紙要求的合格元件來。
簡單說,如果分若干級別的話,可能如下:
1、了解C++的常規(guī)語法,知道函數(shù)調(diào)用、類、虛函數(shù)、多態(tài)等的功能/原理;可以獨(dú)立完成課后習(xí)題。
2、能夠活用自己掌握的C++知識,獨(dú)立實(shí)現(xiàn)一些小型項(xiàng)目
3、借助別人封裝好的API/庫,實(shí)現(xiàn)看起來更強(qiáng)更厲害的功能
這就是一個(gè)極為簡陋、但效果還行的反病毒工具。它的缺點(diǎn)是,這是個(gè)白名單工具,只能檢查到通過修改要害文件獲得執(zhí)行權(quán)的病毒/木馬,同時(shí)會對系統(tǒng)更新產(chǎn)生誤報(bào)。但仍然不失為一個(gè)效果不錯(cuò)的系統(tǒng)問題排查工具——因?yàn)镺S要害文件經(jīng)常是好些年不變的(現(xiàn)在你知道為何有時(shí)候有的殺毒軟件會殺系統(tǒng)文件甚至殺自己了吧?)。
再比如,利用現(xiàn)成的深度學(xué)習(xí)庫/語音識別庫搞一些貌似高大上實(shí)則沒什么技術(shù)含量的人臉識別/語音識別/聲線識別程序——?jiǎng)e緊張,你能行。
能折騰這些,你到公司基本上就可以算是個(gè)“能人”,可以跟風(fēng)做一些聽起來很帥但其實(shí)仍然沒什么技術(shù)含量的工作了。
4、真正理解算法與數(shù)據(jù)結(jié)構(gòu),理解操作系統(tǒng)原理、計(jì)算機(jī)原理、數(shù)字電路原理以及編譯原理、數(shù)據(jù)庫原理、網(wǎng)絡(luò)原理等等基礎(chǔ)原理
5、你仍然可以繼續(xù)深入。比如圖形圖像壓縮,比如加解密算法,比如網(wǎng)絡(luò)協(xié)議棧等,每一個(gè)子領(lǐng)域都夠很多專家投入一輩子的。不過這些領(lǐng)域經(jīng)常返璞歸真,C反倒會成為更常用的語言;而且往往需要高等數(shù)學(xué)作為發(fā)動(dòng)機(jī)。
再比如,現(xiàn)在的CNN神經(jīng)網(wǎng)絡(luò),有次我提到要理解它你得懂卷積;于是跳出來幾個(gè)自以為很懂的出來杠我“我敢打賭,你是聽到這個(gè)東西的名字里有個(gè)卷積于是胡亂腦補(bǔ)。其實(shí)這東西和卷積沒半毛錢關(guān)系”……
他們不知道,CNN里面的確沒有卷積符號、也沒有使用卷積計(jì)算公式;但它的實(shí)現(xiàn)思路就是卷積運(yùn)算。只不過它的設(shè)計(jì)者把卷積算法化用進(jìn)簡單的連續(xù)矩陣計(jì)算中,在深度神經(jīng)網(wǎng)絡(luò)中實(shí)現(xiàn)了“特征抽象和特征空間變換”——這是矩陣和卷積全都學(xué)到出神入化、用出來讓普通人看不懂、但內(nèi)行一看就知道還是新瓶裝舊酒的結(jié)果。
其實(shí)前面提到的數(shù)據(jù)結(jié)構(gòu)與算法等基礎(chǔ)知識,會玩的同樣能玩到返璞歸真。比如有人隨隨便便三兩行代碼就把一個(gè)數(shù)組變成了環(huán)形緩沖區(qū),或者簡簡單單兩行聲明就搞定了一個(gè)遞歸算法。如果你積累不夠深厚、頭腦不夠靈活,這個(gè)東西就很難看懂。
總之,這個(gè)領(lǐng)域是屬于創(chuàng)造者的。能踏入這個(gè)領(lǐng)域,那就不是你找工作,而是工作找你了。
你需要學(xué)的,是用C++這門語言去解決問題。能解決課后練習(xí)題是一個(gè)水平,能刷網(wǎng)上的算法題又是一個(gè)水平;能自己搞定簡單的實(shí)用項(xiàng)目是一個(gè)水平,能充分利用操作系統(tǒng)以及第三方軟件/庫給你提供的抽象(意味著你能理解他們的設(shè)計(jì)思路)實(shí)現(xiàn)幾乎所有東西又是一個(gè)水平;理解各種東西背后的原理是一個(gè)水平,把這些原理玩的出神入化又是一個(gè)水平;學(xué)會用數(shù)字認(rèn)識這個(gè)世界是一個(gè)水平,能夠化用高深的數(shù)學(xué)知識、信手解決沒人說得清的難題又是一個(gè)水平……
一般來說,只要你能達(dá)到“用C++解決簡單問題”的水平,找工作就不成問題了;只是受限較多,只能從事一些較為初級的工作,極易陷入沒日沒夜機(jī)械的寫代碼的窘境,然后看著層出不窮的新技術(shù)欲哭無淚。
你往前趕的越多,你代碼里的智慧和靈氣就越多;此時(shí)你才可以嘗試那些必須用巧力的工作,或者用巧力把繁重的工作變得簡單、甚至促進(jìn)你所在公司乃至全人類的開發(fā)效率。玩到這個(gè)程度,你才算真正踏入程序員的行列。
譚浩強(qiáng)的《C語言程序設(shè)計(jì)》反復(fù)看,然后一行行在電腦上敲出來。
攻克完C語言之后,聽師兄師姐說數(shù)據(jù)結(jié)構(gòu)也是自學(xué)編程需要攻克的重難點(diǎn)。從數(shù)組到鏈表再到堆棧、二叉樹、平衡二叉樹、紅黑樹、B+/B-樹,簡直就像看天書。還記得二叉樹的先序,中序,后序遍歷就把我弄暈乎了。更別提后面的AVL樹的刪除以及B-樹。
我應(yīng)付看不懂的方式也很粗暴:做筆記,勾選出沒看懂的部分,反復(fù)看。一遍不行看兩遍三遍四遍,直到所有內(nèi)容看懂為止,看懂后就上機(jī),上到天昏地暗上到頭暈?zāi)X脹。數(shù)據(jù)結(jié)構(gòu)這本書,記得來來回回看了10多遍,上機(jī)100小時(shí)以上。
這之后開始系統(tǒng)的學(xué)習(xí)網(wǎng)絡(luò)、C++、VC,還記得有一本非常厚的書:《C++ Primer》,可以說上面的每一個(gè)例子,都上機(jī)造過輪子。
隨后開始啃《Effective C++》、《More Effective C++》、《C++程序設(shè)計(jì)原理》、《深度探索C++對象模型》、《STL源碼剖析》、《計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)方法》、《TCP/IP詳解》。
除了瘋狂自學(xué),畢業(yè)的壓力也很重,但掌握的東西越多,你對未來就越篤定。
瘋狂學(xué)習(xí)的過程是枯燥且伴隨痛苦的,編譯報(bào)各種不通過的時(shí)候讓人無比抓狂,知識點(diǎn)學(xué)不會的時(shí)候會讓你懷疑自己的智商。
曾經(jīng)看過的一部分書籍:

畢業(yè)后,擔(dān)任過360技術(shù)委員會成員,在C++這條路上走得更遠(yuǎn)了,再給大家一些系統(tǒng)的建議:
一、C/C++入門階段
面向?qū)ο缶幊趟枷耄活惖姆庋b,構(gòu)造和析構(gòu)、靜態(tài)成員、對象管理;類的構(gòu)造(有參構(gòu)造函數(shù)、無參構(gòu)造、拷貝構(gòu)造、默認(rèn)構(gòu)造函數(shù))和析構(gòu);對象動(dòng)態(tài)管理、友元函數(shù)、友元類、操作符重載;C++編譯器對象管理模型分析;類對象的動(dòng)態(tài)管理(new/delete);友元函數(shù)和友元類;運(yùn)算符重載(一元運(yùn)算符、二元運(yùn)算符、運(yùn)算符重載難點(diǎn)、項(xiàng)目開發(fā)中的運(yùn)算符重載);類的繼承、多繼承及其二義性、虛繼承;多態(tài)(概念、意義、原理剖析、多態(tài)案例);虛函數(shù)、純虛函數(shù)、抽象類(面向抽象類編程思想案例);函數(shù)模板、類模板,模板的繼承。
C++類型轉(zhuǎn)換;C++輸入輸出流(標(biāo)準(zhǔn)I/O 文件I/O 字符流I/O);C++異常處理(異常機(jī)制、異常類型、異常變量、異常層次結(jié)構(gòu)、標(biāo)準(zhǔn)異常庫);利用一些IDE開發(fā)工具:諸如Windows平臺VC系列:VC++6.0(比較古老) ;Visual Studio2013, Visual Studio2015,Visual Studio2017,Visual Studio2019;Mac平臺的XCode系列,還有CodeBlock,另附一些高級編輯器Notepad++, EditPlus,UE等一些開發(fā)工具的常用設(shè)置和一些常見快捷鍵的使用。
這個(gè)階段推薦以下兩本書:
《C++ Primer》 本書對C++基本概念、技術(shù)、以及現(xiàn)代C++編程風(fēng)格進(jìn)行了全面而且權(quán)威的闡述,是C++初學(xué)者的最佳指南;本書可以幫助你編寫實(shí)用的程序,而無需首先精通每個(gè)語言細(xì)節(jié)。對于中高級程序員,本書也是不可或缺的參考書。
二、C/C++開發(fā)進(jìn)階
C++進(jìn)階之STL:
C++進(jìn)階之設(shè)計(jì)模式:
C++進(jìn)階之?dāng)?shù)據(jù)結(jié)構(gòu)基礎(chǔ):
這個(gè)階段推薦以下幾本書:
《Exceptional C++(C++編程剖析)》和《More exceptional C++》 這兩本書中都包含了40個(gè)C++編程問題,這些問題會讓你磨練自己的技能,最終成為優(yōu)秀的C++程序員。這些問題是Herb Sutter精心挑選,與ISO/ANSI C++官方標(biāo)準(zhǔn)相一致,幫助程序員在設(shè)計(jì)、架構(gòu)和編碼過程中保持良好的風(fēng)格,從而使編寫的C++軟件更健壯、更高效。
《Inside the C++ object model(深度探索C++對象模型)》 本書專注于C++面向?qū)ο蟪绦蛟O(shè)計(jì)的底層機(jī)制,包括結(jié)構(gòu)式語意、臨時(shí)性對象的生成、封裝、繼承,以及虛擬——虛擬函數(shù)和虛擬繼承,幫助你理解程序的底層實(shí)現(xiàn),以便寫出更高效的代碼。
《The design and evolution of C++(C++語言的設(shè)計(jì)與演化)》 本書作者也是C++語言的設(shè)計(jì)者Bjarne Stroustrup,作者在書中綜合性地介紹了C++的發(fā)展歷史,C++中各種重要機(jī)制的本質(zhì)意義和設(shè)計(jì)背景,這些機(jī)制的基本用途和使用方法,討論了C++所適合的應(yīng)用領(lǐng)域及其未來的發(fā)展前景,既沒有忽略關(guān)鍵性的詳情,又沒有過多地陷入技術(shù)細(xì)節(jié)。
三、C++開發(fā)高級
C++進(jìn)階之QT開發(fā):
C++進(jìn)階之Windows/Linux網(wǎng)絡(luò)服務(wù)器:
C++進(jìn)階之?dāng)?shù)據(jù)庫開發(fā):
這個(gè)階段,在C++領(lǐng)域,你已經(jīng)飛躍愚昧之巔跨越絕望之谷,進(jìn)入開悟之破了。推薦以下書籍:
《Effective STL》 這是Scott Meyers的第三本C++專著,也是學(xué)習(xí)STL最權(quán)威的書籍。作者對書中的50個(gè)指導(dǎo)方針都作了詳盡的分析,并配以示例。通過這些規(guī)則,C++開發(fā)者可以最大限度地使用STL。
《Generic programming and the STL(泛型編程與STL)》 本書闡述了泛型程序設(shè)計(jì)的核心理念:concepts(概念)、modeling(模型)和refinement(改善),并為你展示這些觀念如何導(dǎo)出STL的基礎(chǔ)概念:iterators(迭代器)、containers(容器)和function objects(函數(shù)對象)。按照本書所述,你可以把STL想象成一個(gè)由concepts組成的library,你將學(xué)習(xí)到STL正式結(jié)構(gòu)并理解其強(qiáng)大的優(yōu)勢。
《Exceptional C++ style》 作者為Herb Sutter。本書同樣提出了40個(gè)C++風(fēng)格相關(guān)的問題,對一些至關(guān)重要的C++細(xì)節(jié)和相互關(guān)系提出了新的見解,為當(dāng)今的關(guān)鍵C++編程技術(shù)(如泛型編程、STL、異常安全等)提供了新的策略,幫助開發(fā)者在開銷與功能之間、優(yōu)雅與可維護(hù)性之間、靈活性與過分靈活之間尋找完美的平衡點(diǎn)。
《C++ template》 這是一本關(guān)于C++模板的完整的參考手冊和教程,它強(qiáng)調(diào)模板的使用實(shí)踐,包含了現(xiàn)實(shí)世界中的例子。每個(gè)C++程序員都應(yīng)該好好讀一讀這本書。
《Modern C++ design(現(xiàn)代C++設(shè)計(jì))》 作者Andrei Alexandrescu為C++程序員打開了一個(gè)新的局面。本書提供了一些針對軟件設(shè)計(jì)的前沿方法,如聯(lián)合設(shè)計(jì)模式、泛型編程,使程序員可以編寫有表現(xiàn)力的、靈活的、高度可重用的代碼。
《Thinking in C++(C++編程思想)》 C++ 領(lǐng)域權(quán)威著作,介紹了C++實(shí)用的編程技術(shù)和最佳的實(shí)踐方法。
以上是用一年時(shí)間應(yīng)對面試學(xué)習(xí)C++的建議。
還有一個(gè)我最近發(fā)現(xiàn)的一個(gè)非常贊的視頻,是一個(gè)國外 C++ 游戲引擎開發(fā)工程師錄制的一套偏向 talk 類型的教程,比較通俗易懂和深入淺出。
這是網(wǎng)易云課堂地址:
https://www.zhihu.com/question/400543720/answer/1275079446
C++是不可能精通的
想起了自己學(xué)習(xí)C++的血淚史/(ㄒoㄒ)/~~
學(xué)習(xí)了基本輸入輸出,條件語句,循環(huán),函數(shù),內(nèi)心:這玩意也就比C多了函數(shù)重載、引用,還有個(gè)頂層const與底層const,分分鐘搞定 學(xué)習(xí)了基本的OO部分,內(nèi)心:emmm~~~,C++還是有兩把刷子的,不過還行還行,開闊了思維 學(xué)習(xí)了閉包,泛型,STL,內(nèi)心:好多要記的東西,好煩呀,感覺不行了 了解了模板元編程,多重繼承,虛繼承,多線程,Boost庫,內(nèi)心:
以后見人只敢說用過C++。。。。(C++還有Qt,opencv,opengl,甚至微軟的.net等一堆東西
https://www.zhihu.com/question/400543720/answer/1282930274
C++有下面這些方向,下面我們一一介紹一下:
2. HPC(High Performance Computing)/AI Infrastructure/ML System
3. Database開發(fā)
4. Networks
5. OS/驅(qū)動(dòng)/Compiler
6. Multimedia(圖形/視頻/語音處理)
7. 游戲引擎開發(fā)/游戲前后臺開發(fā)
以上7個(gè)相關(guān)的崗位就是目前市場上使用C++最多的7個(gè)崗位,當(dāng)然還有嵌入式,Windows軟件開發(fā)等稍冷門的方向。題主若想從事C++相關(guān)的工作,絕非把C++的語法搞明白這么簡單,而需要從技術(shù)上深刻理解C++上下游的環(huán)境依賴,也要結(jié)合具體業(yè)務(wù)在技術(shù)上有所思考。




關(guān)注公眾號「高效程序員」??,一起優(yōu)秀!
