文章出處

學習 C++ 的一大好處在于,它可以幫助我們理解生命周期(Lifetime)和所有權(Ownership)的概念,以及類型的抽象,還可了解到怎樣利用類型保持 API 的使用方式不變。除此之外,為何各種高級語言層出的今天,學習 C++ 仍頗有價值?本文將為你道來。

“C++已死”

大學時代,我就聽過這樣的說法——差不多十年前的事兒了。那時候至少在美國,Java 已經成了各公司的主流語言。程序員也許都很熟悉 Joel Spolsky 在 2005 年 12 月對 JavaSchools 發起的批駁。此外,作為微軟應對 Java 的手段,2000 年左右推出的 C# 也有 C++ 殺手的稱號。這之后,動態語言風靡一時,Ruby 和 Python 開始流行起來。那么,既然有了這些好用的語言,我們為什么還要選擇 C++ 語言呢?它難道不是C語言進階版嗎,就像當初的匯編語言進階版一樣?如果有時間,建議大家聽一下 Herb Sutter 的演講,講得很好;時間有限的話也可以只看這個較短的視頻演講,其中包含有具體案例。從 TIOBE 語言排行榜中我們可以發現,在過去逾 15 年的時間里,C++一直穩居最受歡迎語言列表的第三名。對一個老牌語言來說,這個成績不算差了。這讓我想到了另一個問題……

大家怎么看待指針?

大多立即將 C++ 與指針關聯起來的人都學錯了。“帶類的C語言”已經是老一套了。根據我個人經驗,它糟糕透了。在C語言中,將多維數組作為函數參數傳送、執行指針運算、以手動方式管理內存(就好像沒有容器與智能指針一樣)、實現雙向鏈表等等,所有這些都是我們應當在C語言的課程上學過的。也許通過這種方式來學習 C++ 并沒有什么錯?好吧,再想想。

當然,專業的程序員應當理解指針的工作方式,但它已經不是現代 C++ 的主旨了。C++一直持續不斷地發展,昨天正確的代碼,到了今天可能就成了糟糕的編程風格。

C++持續完善過程

該語言正在經歷大浪淘沙的過程,套用 Bjarne Stroustrup 博士的一句話,“C++就像一種新語言,各部分組合較之前更為順暢。其更高層次的編程風格較之前更為自然,也一如既往的高效。”現在,C++有了 Lambda 表達式、內存模型(Memory Model)、Range-based for loops、移動語義(Move Semantics)、可變參數模板(Variadic Template)以及所有其他類似的高級功能,這些都能協助我們完成手上的工作。你是否也有一些舊代碼需要按新標準來更新呢? 不要擔心,Clang-tidy 就是你的救星!這個工具非常酷,可以通過靜態分析找出老式風格代碼,并給出修改建議。在使用 C++ 時,工具的缺乏一直很令人頭疼,不過這種情況正在改變。你以為只有 Java 才有自動重構功能?谷歌的 Chandler Carruth 在演講中提到了使用 Ninja 編譯 LLVM/clang 的問題,現在它們都能運用自動重構,立即生成 1 億行的 C++ 代碼了。

企業代碼庫的現實場景

很多計算機科學專業的本科生以為自己將會走上像搖滾明星、忍者或者超級英雄那樣的事業之路:“只管等著讓世界看到我的能力!”這種想法源于他們自認為“是優秀人才,并非常人”。本來抱著一腔期待,準備投身于長時間的設計,以及實現復雜的算法(至少我以前是這么想的),然后獲得了第一份工作,結果很快就被 20 年的老代碼給打垮了。有著固定緩存的 strcpy 函數分散在數百個文件、上千行函數、五個版本的手寫 linked lists 中——請感受一下。于是你卷起袖子,動手收拾這個爛攤子。結果你的主管對你說道:“不要著急,年輕人,公司老早就要求實現這個功能了。不,我們不準備使用新的 GCC 編譯器,別的團隊都還沒準備好呢。”現在你開始思考:“我哪里犯錯了呢……”

這個問題可不是 C++ 所特有的,還會出現在調試一些由 Reflection 的愛好者所創建老舊的 Java 代碼時。如果你是一名 Web 開發者,很可能會遇到一些 PHP 的問題。即便使用 Ruby,Python 或者一些較新的語言,那些枯燥的工作也都會榨干你的精力。
“你能把那個按鈕挪到右邊并改成粉色嗎?”這就是大多數公司在工作中的現實場景。我想說的是:除了大量遺留問題,或者無聊的代碼之外,還存在著少量既有挑戰性,又有趣味性的工作,而這些工作有些剛好是 C++ 能發光發熱的領域。

C++稱霸的領域:游戲、HPC、編譯器、金融財務領域等等

如果不想把時間全用在增刪改查之類的實現上,也許你可以考慮學習 C++ 語言,并選擇一個領域。下面我會給出一些建議。

游戲行業:幾乎所有 3A 游戲都是使用 C++ 編寫的。大眾公認電子游戲的開發者是軟件行業里回報最高的工作之一,也是需求量最大的領域之一。因為速度非常重要,所以編寫高效的代碼就是最基本的要求。除了要懂 C++ 之外,精通游戲開發更應注重理論與模式的鉆研,而不限于特定的 API 或者 Library。通常還必須具備高超的圖形與數學技能,這些知識足夠你活到老學到老。

HPC:以極限速度處理數據,要求對底層硬件有深刻的理解,這類知識可以直接應用在語言中。通用圖形處理器(GPGPU)及 CUDA、OpenCL 之類的并行計算框架的出現,引發了對有這類技術的 C++ 程序員的需求。如果深入到科學計算領域,還有很多能做的工作。不知你是否聽說過機器學習?這是當今的熱門話題。

編譯器:這是我最喜歡的領域,LLVM 項目如此成功,以致于很難找到一種既未使用 LLVM 庫編寫前端,也沒有使用 LLVM 生成字節碼的流行語言,而這些全都是C++。盡管編譯器是以各種語言編寫而成,但其背后的實現原理是相同的。我們使用優化器、靜態分析程序、調試程序、標準庫、鏈接器以及所有其他相關的工具來工作。

除此之外,金融領域也有很多工作需要有能力編寫低延遲代碼的程序員。在這個領域,數學背景也是一大加分亮點。該領域的大多工作可能都涉及到開發與維護高頻使用的交易平臺。另外如果不想掛著程序員的名頭,這個領域也是很棒的選擇。可以說負責設計并實現金融數學模型的寬客(Quant)職位是所有程序員中最有可能獲得高額獎勵的。

以上只是我的幾個建議,這些領域的共通點在于:無法通過數量取勝——讓一大堆 Java 新手去解決問題,還指望他們得出有效、可維護的解決方案是不可能的。這里面需要很多行業內部的知識門道,只有跟這方面的前輩共過事后才能了解到,也就是說,這些人的可替換性很低。公司必須付給他們更高的薪水,并讓他們解決自己感興趣的問題,才能把人留住。當然,到處都有簡單而枯燥的工作,但如果從事的是自己真心喜愛的工作,我們一般也會更有耐性。

就愛閱讀www.92to.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/xinwen/20161123/59133.html

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()