天天看點

2023 年還建議學 C++ 嗎?

作者:程式員檸檬橙

我是檸檬哥,專注程式設計知識分享。

歡迎關注@程式員檸檬橙程式設計路上不迷路,私信發送以下關鍵字擷取程式設計資源:

發送 1024 打包下載下傳10個G程式設計資源學習資料

發送 888 擷取鐵杆粉絲紅包見面禮

發送 001 擷取阿裡大神LeetCode 刷題筆記

發送 002 擷取擷取谷歌公司程式設計代碼規範

發送 003 擷取10個精美履歷模闆PDF和Word版

發送 004 擷取100道精選 C++ 面試題和答案word版

發送 005 擷取擷取谷歌LeetCode算法筆記

大家好,我是 檸檬哥。

在知乎看到這個話題的讨論,有一些精彩觀點分享給大家。

我敢說現在無論哪家大公司都會用到C++,而且會一直用到C++的。

百度自動駕駛系統、華為伺服器、騰訊網易的遊戲…我敢肯定都用到C++了。

任何一家公司,但凡追求效率的軟體和系統,都會采用C++開發,C++的一些優越性是其他語言無法比拟的。

隻要作業系統還是用C來寫,C就永遠不會被淘汰,這個問題想都不要想。國内的C崗位主要是做核心相關的開發,以及一些嵌入式的需求,當然嵌入式的也有用C++的。

C++不會被淘汰的原因之一是C不會被淘汰,因為C++抱緊了C的大腿,C++最基礎的定位就是better C。也有一些領域是C++專屬的,比如說遊戲引擎、高頻交易。

業界很多聲音 : C++ 過于複雜?

“過于複雜”指的是加入了備援的部分,使得本該簡單事情變複雜了。

然而啊。。。C++的複雜并不是如你所想。

C++的核心設計哲學是Zero Overhead。啥意思?說人話就是:你沒有用到的特性,不應該給你帶來任何負擔。這個哲學的好處在哪裡?當你沒有學到/用到一個知識點的時候,你不需要為它付出代價。

當你不明白左值右值的時候,單純地傳值就可以玩的很Happy,而當你想要榨取性能,避免拷貝複制的時候,你才需要和複雜的左右值,std::move, 标準swap&和對象内建swap等聽起來就有點暈的概念搏鬥一下。

當你不需要自己設計記憶體配置設定機制,就完全不需要理會allocator 這個聽起來就不是很簡單的東西,放心地使用STL内置的default部分。但是你在嵌入式環境下或者近實時作業系統裡想要確定記憶體配置設定的速度和效率,就可以看看怎麼重載- -下 operator new之類的方法。

當你不需要使用模闆工作時,大可以把C++當成一個帶 類的C玩得飛起。不需要為各種偏特化,類型萃取,integral, std::tuple等 高階咒語頭疼不已。但是你需要建構一套 需要非常靈活拓展的framework,又不想受限于複雜的繼承體制時,variadic template和concept就是你最好的朋友。

在你不熟悉FP的時候,完全可以不去考慮 lambda 表達式,不去考慮std::function,不去寫那些高階函數。但是當你覺得想把Lisp和Haskel中有些概念比如閉包、monad等搬到C++時,你會覺得其實這些東西蠻順手的。

這多麼人性化! C++為不同的能力階段的人提供了不同層次的工具,而且它們幾乎完全正交!但是就是有些人要跳出來“太複雜啦!我們需要簡單的語言!”

愛因斯坦說過一-句話“科學要簡單,但不是過于簡單。”簡單的是概念和概念的層次,卻不是概念的數量和概念本身的複雜程度。狹義相對論可以把麥克斯維方程組用一個簡單的張量公式表示,卻不能避免張量概念本身的複雜性。

經典力學是不是太複雜啦?我們需要簡單的!有啊,牛頓力學。隻要你不涉及到速度、品質足夠大的場景,就不需要相對論;

流體力學是不是太複雜啦? 我們需要簡單的!有啊,簡單流體力學。隻要你不涉及湍流,就不要考慮數值求解内維爾-斯托克斯方程。

量子力學是不是太複雜啦? 我們需要簡單的!有啊,普通量子力學。隻要你不涉及複雜多體交換關聯勢,你就不需要學習高量和重正化群。

C++是不是太複雜啦?得啦,當你面對的問題還都不涉及到你暫時用不到的内容時,C++夠簡單啦。。。

這裡引用一位 985 CS 專業的老學長談學習C++的一些感受。

作者:彭雙全 連結:https://www.zhihu.com/question/27331184/answer/49986515

學習C++的大抵都聽過這句話:

一年精通,三年熟悉,五年了解,十年用過

說說我的體驗吧

大學開始就開始學C++,當然隻是皮毛,研究所學生開始看大量C++書籍,什麼c++primer effective系列 modern系列,深度探索C++對象模型等,C++書籍看了不下50本,自以為對C++算很了解了。

于是,開始找工作,第一次參加了某歌在學校的筆試+面試,看了我的履歷,精通C++?然後問了我一些C++相關知識,發現自己連聽都沒聽過,随便說一個,std::string能否被繼承,為什麼?

這個問題看起來很簡單,但是裡面涉及大量的知識,比如對STL中string的實作是否了解,以及是否了解記憶體洩漏等等。

然後去了第一家公司做網絡開發,涉及大量的TCP底層知識以及重構Linux下API

第二家公司開始做推薦系統

第三家公司負責廣告引擎

也就是在這家公司,負責的項目,動不動就OOM,造成了千萬損失,能體會到當時什麼感覺嗎?使用簡單的排除法之後,發現問題跟glibc有關,是以在臨時解決問題之後,用了一個月的時間,分析glibc記憶體管理源碼.

說實話,C++ 我現在已經學不動了,新知識越來越多了,hold不住了,哈哈哈

最近網上看到很多人都自诩精通C++,鬥膽一說,真不敢說精通,懷着一腔熱血研究C++,掉進去搞了七年。C++ Primer,C++ 程式設計語言,翻來覆去看了n遍,其他的諸如Thinking in C++,Effective C++,C++ 程式設計與演進…市面上能買的到的基本都通讀過。最大的一點感受,C++太博大精深了,有多少精力都能耗進去。實際項目開發中20%都用不到,模闆乃至模版元程式設計,即使你敢寫,也要掂量下你的同僚能不能跟上節奏。

一度懷疑花了那麼多精力學習C++是否值得,直到後面有機會專攻Webkit核心代碼,裡面有些對性能有變态要求的子產品,諸如JavaScript解析引擎,記憶體池管理,C++的進階玩法都玩到了,C++的優勢得得到了充分的展現。在Webkit裡面浸淫了兩年,在實際層面了解了C++的價值,她在複雜性管理和效率之間的有着完美平衡,但是前提是你能駕馭它。

再往後就不寫代碼了,回顧下C++的學習過程與我而言是一門修行,作為一個合格的程式員,深入了解一門語言是必須的,一通百通,後面Java,C#,OC基本上都是一周上手,輕輕松松。但是回顧學習本身,還是值得商阙。

總結起來說:

1.語言光看是沒用的,看了不實踐,分分忘光,很多Effective C++提到的問題,隻有實際犯錯後才會真正記住,多看,多練。

2.語言隻是知識體系裡面很小的一部分,其他諸如算法,設計模式,計算機體系結構,編譯系統的了解,同樣重要,缺了就是短闆,把讀C++設計新思維,More Efftive C++的時間拿去讀APUE,靈活軟體開發與實踐,收獲會更大。

3.書先讀厚,再讀薄,看Webkit最大的感受是,裡面的C++用得很克制,隻是在必須使用時才會用到高階技術,而這種場合無非是一些基礎資料結構,一些對記憶體和性能有極緻要求的地方,否則不光維護難,哪天出問題了,debug多層模版時想死的心都有…。建議看一篇Google寫的C++編碼規範,如果隻是達到這個要求,精讀三四本書就夠了。

4.既然學深了就多去了解他背後的設計邏輯和哲學體系,為什麼引入一些特性,抛棄一些特性,原因是什麼。看看STL的一些源碼,那是精髓中的精髓,最後試着自己寫一套自己的基礎資料結構和算法出來,比光看書有效多了。