用一年時間如何能掌握 C++ ?修改
有一定 C 語言基礎,日后想從事游戲開發等工作,給自己一年時間,能在此期間精通 C++ 嗎?
本人大約從20多年前開始學習及使用C++,但仍未達到我認為「精通」的階段,甚至對於C++11的各種新特性也未掌握。然而因為我是在讀書時自學C++的,也是游戲程序員(原問題中提到題主想從事游戲開發),覺得也許能提供一點意見供網友參考。
首先引一下2010年8月號《程序員》刊登的拙文《 C++強大背后》最后一段:
如果題主認為的「精通」是指上述所指的第二層次,那么我估計一年全職時間也未足夠「精通」。首先,閱讀這些書籍本身也需要不少時間,而且對於一般人來說(指除了一些學習記憶能力超強的人),很可能需要閱讀幾遍才能記住一些細節。另外,閱讀后必須要練習。除了入門的習題外,還需要做一些工程向的項目,才能了解各種語法、編程范式的使用方法及時機,理想地建議參與一些開源項目。然而,學習是需要不斷思考並把結果沉淀,方法包括與朋友討論、寫博客、寫知乎答案等,這些都需要時間。
如引文末段所指出,我建議不要把「精通C++」作為一個一年目標,應該要把學習語言作為一個持續的過程,同時要把語言運用在具體的應用場合中。
---------------------------------------------------
再討論C++與游戲開發。
看到有不少答案討論到有關C++是否游戲開發者所必須的技術。我認為,這並不是完全必須的,但許多游戲開發項目需要到C++。以下列舉一些過往曾流行的游戲平台/類型:
很大程度上,游戲──或說游戲引擎,都是C++非常適合的應用時機。
一些人認為,游戲開發者使用現成的引擎,就不需要使用C++了。過往,業界有一個普遍常識,就是用C++開發游戲引擎,而游戲引擎提供腳本引擎供編寫游戲邏輯代碼。但這個觀點被Unreal Engine 4的決策改變,UE4放棄了維護多年且被大量使用的UnrealScript腳本語言,而改用原生C++作為游戲邏輯編程的語言。此決策背后有多個原因,但這里只想舉出這例子展示C++在游戲開發中的用途及潮流,具體原因分析就不詳細展開了。
除了自行研發游戲引擎需要使用C++,我們可以看到,大部分游戲引擎都提供了其C++原代碼(Unity算是例外),這讓我們可以
最后,「還需學習什么」是一個很難簡單回答的問題,因為游戲開發涉及的知識面很廣。建議可參考本人譯作。
首先引一下2010年8月號《程序員》刊登的拙文《 C++強大背后》最后一段:
C++學習建議C++缺點之一,是相對許多語言復雜,而且難學難精。許多人說學習C語言只需一本K&R《C程序設計語言》即可,但C++書籍卻是多不勝數。我是從C進入C++,皆是靠閱讀自學。在此分享一點學習心得。個人認為,學習C++可分為4個層次:
- 第一層次,C++基礎:挑選一本入門書籍,如《C++ Primer》、《C++大學教程》、或Stroustrup撰寫的經典《C++程序設計語言》或他一年半前的新作《C++程序設計原理與實踐》,而一般C++課程也止於此,另外《C++ 標准程序庫》及《The C++ Standard Library Extensions》可供參考;
- 第二層次,正確高效地使用C++:此層次開始必須自修,閱讀過《(More)Effective C++》、《(More)Exceptional C++》、《Effective STL》及《C++編程規范》等,才適宜踏入專業C++開發之路;
- 第三層次,深入了解C++:關於全局問題可讀《深入探索C++對象模型》、《Imperfect C++》、《C++沉思錄》、《STL源碼剖析》,要挑戰智商,可看關於模版及模版元編程的書籍如《C++ Templates》、《C++設計新思維》、《C++模版元編程》;
- 第四層次,研究C++:閱讀《C++語言的設計和演化》、《編程的本質》(含STL設計背后的數學根基)、C++標准文件《ISO/IEC 14882:2003》、C++標准委員會的提案書和報告書、關於C++的學術文獻。
由於我主要是應用C++,大約只停留於第二、三個層次。然而,C++只是軟件開發的一環而已,單憑語言並不能應付業務和工程上的問題。建議讀者不要強求幾年內“徹底學會C++的知識”,到達第二層左右便從工作實戰中汲取經驗,有興趣才慢慢繼續學習更高層次的知識。雖然學習C++有難度,但也是相當有趣且有滿足感的。
如果題主認為的「精通」是指上述所指的第二層次,那么我估計一年全職時間也未足夠「精通」。首先,閱讀這些書籍本身也需要不少時間,而且對於一般人來說(指除了一些學習記憶能力超強的人),很可能需要閱讀幾遍才能記住一些細節。另外,閱讀后必須要練習。除了入門的習題外,還需要做一些工程向的項目,才能了解各種語法、編程范式的使用方法及時機,理想地建議參與一些開源項目。然而,學習是需要不斷思考並把結果沉淀,方法包括與朋友討論、寫博客、寫知乎答案等,這些都需要時間。
如引文末段所指出,我建議不要把「精通C++」作為一個一年目標,應該要把學習語言作為一個持續的過程,同時要把語言運用在具體的應用場合中。
---------------------------------------------------
再討論C++與游戲開發。
看到有不少答案討論到有關C++是否游戲開發者所必須的技術。我認為,這並不是完全必須的,但許多游戲開發項目需要到C++。以下列舉一些過往曾流行的游戲平台/類型:
- PC單機游戲(Windows)
- PC網絡游戲(Windows、Linux)
- 移動平台游戲(J2ME、Symbian、Palm……)
- 家用游戲機游戲(PS1/2/3/4、XBox、Wii……)
- 掌上游戲機游戲(GB、GBA、NDS、PSP……)
- 網頁游戲(HTML、Flash)
- 智能移動設備游戲(iOS、Android)
應否選擇C++
哪些程序適宜使用C++?
C++並非萬能丹,我按經驗舉出一些C++的適用時機。
- C++適合構造程序中需求較穩定的部分,需求變化較大的部分可使用腳本語言;
- 程序須盡量發揮硬件的最高性能,且性能瓶頸在於CPU和內存;
- 程序須頻繁地與操作系統或硬件溝通;
- 程序必須使用C++框架/庫,如大部分游戲引擎(如Unreal/Source)及中間件(如Havok/FMOD),雖然有些C++庫提供其他語言的綁定,但通常原生的API性能最好、最新;
- 項目中某個目標平台只提供C++編譯器的支持。
按應用領域來說,C++適用於開發服務器軟件、桌面應用、游戲、實時系統、高性能計算、嵌入式系統等。
很大程度上,游戲──或說游戲引擎,都是C++非常適合的應用時機。
一些人認為,游戲開發者使用現成的引擎,就不需要使用C++了。過往,業界有一個普遍常識,就是用C++開發游戲引擎,而游戲引擎提供腳本引擎供編寫游戲邏輯代碼。但這個觀點被Unreal Engine 4的決策改變,UE4放棄了維護多年且被大量使用的UnrealScript腳本語言,而改用原生C++作為游戲邏輯編程的語言。此決策背后有多個原因,但這里只想舉出這例子展示C++在游戲開發中的用途及潮流,具體原因分析就不詳細展開了。
除了自行研發游戲引擎需要使用C++,我們可以看到,大部分游戲引擎都提供了其C++原代碼(Unity算是例外),這讓我們可以
- 方便調試游戲
- 深度剖析、優化游戲的性能
- 為引擎擴展新功能
- 修改現有引擎以適應項目所需
最后,「還需學習什么」是一個很難簡單回答的問題,因為游戲開發涉及的知識面很廣。建議可參考本人譯作。