2016年,我們爲什麼要學習C++?

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新手去解決問題,還指望他們得出有效、可維護的解決方案是不可能的。這裏面需要很多行業內部的知識門道,只有跟這方面的前輩共過事後才能瞭解到,也就是說,這些人的可替換性很低。公司必須付給他們更高的薪水,並讓他們解決自己感興趣的問題,才能把人留住。當然,到處都有簡單而枯燥的工作,但如果從事的是自己真心喜愛的工作,我們一般也會更有耐性。

本文翻譯自:Why would you learn C++ in 2016?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章