當前位置: 華文問答 > 科學

c++該怎麽學?

2021-11-08科學

我覺得任何一門程式語言的都可以遵循以下的步驟

學習基礎語法

就像學習任何一門人類語言一樣,不知道語言的單詞和語法就無法把這門語言作為工具和別人進行交流。程式語言,尤其是高級程式語言,就是人類和電腦交流的語言。不管你說得像不像母語者,至少基礎的交流規則還是要掌握的。

同時,語法的學習也是一個螺旋上升的過程。我在大一C++課上就學了C++的基礎語法,現在還是要時不時會去翻【C++ Primer Plus】。畢竟還沒有編譯器能實作C++最新標準的全部特性,你怎麽能說自己掌握了全部的語法呢。

對於完全的初學者來說,我建議從部落格或者一些快速入門網站掌握型別、輸入輸出、分支、迴圈,OOP的類的聲明、繼承、多載、樣版以及STL等內容。

以下推薦一個快速入門的網站——菜鳥教程:

誠然這個網站的快速教程不是完美的,但對於中文母語者快速掌握一門程式語言的基礎語法是絕對夠用的了。

至於學到哪種程度比較好,我認為是能夠用這個語言完成一項大學軟體課設級別的計畫就可以了,譬如說:圖書管理系統、貪吃蛇、停車場預約系統等。

當然這只是滿足基礎使用的最小要求,接下來就是語法的大部頭【C++ Primer Plus】了。在大多數情況下我都是把這本書當字典用的,哪裏不會查哪裏。但我非常建議剛入門的時候跟著目錄粗讀一遍全文,說是粗讀,我估計也會花掉大幾十個小時的時間。若是手敲程式碼,耗時會更長。我估計你大機率只能看懂30%或更少,但今後debug的時候,這些依稀殘留在腦海中的記憶會幫你大忙。

另外在寫程式碼參照C/C++標準庫的時候,人手必備:

網站有中文版,但是沒有英文的全。

最後我認為在深入學習一門語法的時候,最重要的是和其他語言進行比較(如果C++是你的第一門程式語言,當我沒說)以及知道這門語言的局限性。C++至今仍有不少生命力,肯定不光是歷史包袱,別的語言的所做不到的事情也是他至今依然會以「如何學習xxx」的形式出現的原因之一。

理解了邊界所在,才能掌握一門技術。因為只有知道了某個技術不能做到什麽,你才能更好地做到所能做到的。

——【Thinking in Java】第十五章

學習最佳實踐

我認為一門語言的最佳實踐有兩層含義:

一種是是無數程式設計師在編程中踩了無數坑之後總結出的經驗教訓;另一種是對於了解自己的編程過程中「對話的物件」,進而寫出高效且優雅的程式碼。

何為「對話的物件」,即為承載你程式的主體,對於C++就是電腦或者Linux系統、對於Java就是JVM。

最佳實踐的書,對於Java有【Effective Java】【深入理解Java虛擬機器】等;對於C/C++有【Effective C++】、【C Trap and Pitfalls】、【深入C++物件模型等】等和Linux的各種書。

根據我的觀察,讀最佳實踐相關的書可能會出現字不進腦袋的癥狀。並且最佳實踐的知識在國內粗暴地退化為面試環節中的八股文,死記硬背讓不少同學深惡痛絕。因人而異,我個人是很喜歡看相關書籍的。

另外,我認為Coding style也可以作為語言最佳實踐的一部份。Coding style包括:

  • 變量、函式、檔、工程的命名
  • 工程目錄的結構
  • 各種空格,大括弧
  • 註釋
  • etc
  • 在會社或者團隊中編程,你的程式碼需要被同事、上司Code Review,這時候程式碼就增加了一部份社會內容。就像你在公司和別人交流要學著如何禮貌和高效一樣,程式碼的最佳實踐幫助你更好地透過程式碼和同事一起工作。

    Coding style的參考書推薦【Google C++ style Guide】。

    寫到這裏我突然想到一個小故事。我今年在面試某家美資互聯網的時候,OA階段我答得一團糟,兩道題都沒有全部AC,和我一起投遞的小夥伴們都是完美AC。最後發面試的時候,我竟然拿到了。後來問了問前輩,說是因為我程式碼寫得很工整,每個空格、大括弧都出現在它該出現的地方。

    工程實踐

    這一步學習這門語言在工程中是如何運用的。如果是Java,大家大概會說去學Spring全家桶。而C++用法各異,對於不同的套用有著完全不同的工具棧。最後共通的工具可能就只有GDB和Makefile/CMake了。

    在這一步,自己寫幾個小計畫也是很好的提升編碼能力的做法,以下我拋磚引玉幾個:

    (1)JSON解析器

    參考:

    其中只有cJSON.c和cJSON.h是主要的程式

    (2)HTTP Server

    用C用socket實作一個HTTP server算是最經典的

    參考:

    這個計畫只有500行左右的C程式碼

    (3)自己實作STL

    自己實作一個類STL的輪子有助於對各種語法細節和樣版的理解,強力推薦

    參考:

    (4)Web Framework

    參考:

    閱讀開源計畫程式碼

    如何成為一個更好的開發者?很多人對這個問題的答案都會是閱讀知名開源計畫的程式碼。

    閱讀開原始碼會提升編碼品味、

    但就我個人的經驗來說,閱讀大規模的源碼是極其痛苦的過程(盡管他們一般都有著詳細的註釋)。看到幾萬幾十萬行的程式碼甚至連從哪裏開始看都不知道,心裏只剩絕望。

    這裏,我把我並不那麽豐富的源碼閱讀經驗總結分享給大家:

    (1)找最初始的版本開始讀

    比如你聽說Nginx是一個優秀的開源計畫,你在GitHub上搜到它,clone到本地,用vscode開啟看了一眼目錄結構,然後就沒有然後了......

    這些成熟的開源計畫經過了很長時間的叠代,已經是一個很復雜的軟體產品了。當它們剛出來的時候,沒那麽有名氣,沒那麽穩定,沒那麽復雜,能實作基本的功能就行。早期版本,就是你很好的一個切入點了。我記得之前看SQLite最早期的版本也只有大幾千行而已。

    (2)輪子庫是一個很好的開始

    工具類開源庫庫的一大特點就是各個元件之間非常地獨立,整體的規模可能非常大,但單看一個模組的話,是一個可以接受的大小。

    absl@Google:

    folly@Facebook: