1. 程式人生 > >2017年,我們為什麼要學習C++?

2017年,我們為什麼要學習C++?

學習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++一直持續不斷地發展,昨天正確的程式碼,到了今天可能就成了糟糕的程式設計風格。

這裡寫圖片描述

該語言正在經歷大浪淘沙的過程,套用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)職位是所有程式設計師中最有可能獲得高額獎勵的。