標籤:

用一年時間如何能掌握 C++ ?

有一定 C 語言基礎,日後想從事遊戲開發等工作,給自己一年時間,能在此期間精通 C++ 嗎?


本人大約從20多年前開始學習及使用C++,但仍未達到我認為「精通」的階段,甚至對於C++11的各種新特性也未掌握。然而因為我是在讀書時自學C++的,也是遊戲程序員(原問題中提到題主想從事遊戲開發),覺得也許能提供一點意見供網友參考。

首先引一下2010年8月號《程序員》刊登的拙文《C++強大背後》最後一段:

C++學習建議

C++缺點之一,是相對許多語言複雜,而且難學難精。許多人說學習C語言只需一本KR《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++。以下列舉一些過往曾流行的遊戲平台/類型:

  1. PC單機遊戲(Windows)
  2. PC網路遊戲(Windows、Linux)
  3. 移動平台遊戲(J2ME、Symbian、Palm……)
  4. 家用遊戲機遊戲(PS1/2/3/4、XBox、Wii……)
  5. 掌上遊戲機遊戲(GB、GBA、NDS、PSP……)
  6. 網頁遊戲(HTML、Flash)
  7. 智能移動設備遊戲(iOS、Android)

我們會發現,除了J2ME和網頁遊戲外,大多數的平台都支持(或只支持)原生編程。而原生編程最常用的就是C/C++和彙編。這種現象並不難解譯,再次引用拙文:

應否選擇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算是例外),這讓我們可以

  1. 方便調試遊戲
  2. 深度剖析、優化遊戲的性能
  3. 為引擎擴展新功能
  4. 修改現有引擎以適應項目所需

在專業的遊戲開發中,這些都是很常見的工作任務。所以,即使並非自研引擎,並使用腳本語言開發遊戲邏輯,也有很多機會需要使用C++。

最後,「還需學習什麼」是一個很難簡單回答的問題,因為遊戲開發涉及的知識面很廣。建議可參考本人譯作。


  我覺得可以過來再更新一次了。

/*****************************************以下內容可以跳過*****************************************/

  我說一下我做遊戲的歷程吧,二年級的時候(我出生於1991.11)我開始接觸電腦,當時對電腦的畫圖工具很痴迷,為什麼畫圖工具能夠做出這麼好看的東西。所以我對這些所見即所得的東西非常著迷,因為我覺得很容易就開發出來一個東西炫耀。

  後來四年級時候,我的父母有接觸一個遊戲叫《傳奇》,我在他們沒在家的時候偷偷創建了一個帳號,體驗了十五分鐘(沒錯小學生就是我),覺得遊戲真的很吸引人,我是父母在我從小禁止玩遊戲的,所以我沒有接觸過任何遊戲,包括紅白機,這應該也是很多人的童年。在那時候,我的夢想就是未來能夠做遊戲設計師,做一個全世界的人都喜歡的遊戲。

  慢慢CCTV某一個頻道有一個欄目是一個教授開始了解有一樣東西叫做powerpoint 2000.我開始拉一些圖片進來,做了一個小遊戲,你沒看錯,是ppt做了一個小遊戲,是類似大逃殺的遊戲。點一下進一個地點,有了最原始的交互。

  從初一的時候,我知道了有一個東西叫做VB,我也嘗試用VB寫程序。同時開始學習一個編程語言叫C,那時候我果斷拋棄了C,因為VB真的很容易做出一個窗口,然後寫一個helloworld拿出去炫耀。

  興趣是最好的老師,我爸媽說學好這些東西就可以做遊戲了。我就開始認認真真學C語言,當時效率也很高,我現在一直覺得我在吃老本。。學C的基本概念,用控制台做一個打飛機遊戲,做一個RPG遊戲,類似於colossal_cave_adventure。

  再到了高中,開始用VC++6來開發一些win32小遊戲,我覺得把遊戲做好是一種使命,那時候也知道了國內著名的工作室:西山居1995 完美時空 2004 琳琅天上2004.

  我的心愿就是加入他們,成為真正的遊戲開發者。

  後來到大學,我學計算機圖形學,數據結構,自學編譯原理,彙編語言。才發現原本單純的夢想發現是不可實現的,我不可能做出每個人都喜歡的遊戲,就開始學習遊戲引擎製作。如果你希望能夠從事引擎開發,我推薦葉勁峰 @Milo Yip 大神翻譯的《遊戲引擎架構》一書。

  直到現在,我如願以償,成為了居士,開發遊戲引擎。這不是一年兩年能決定的,如果你要做程序,真的要多積累了。

/*****************************************跳到這裡就好*****************************************/

  從始至終,我是抱著一種使命來學習,來努力,來做遊戲的。當時面試的時候,面試官問我,你為什麼要做遊戲,我說:「我一生就為了做遊戲,生活能夠過得去就行。」我現在也覺得,我如果不做遊戲,我還能做什麼(我現在很局限了,眼界很窄)。


我最近學校的課程是要用Objective-C開發遊戲,我從來沒有學過oc語言,但是我並不覺得他特別的難,相反,我覺得他很容易上手開發iOS應用,因為有C++的積累,我可能不知道具體的語法或者用法還有API,但是我可以通過C++來融會貫通。


  C++是一種潛移默化的東西,當你了解他之後,你學什麼都會容易,覺得簡單。


所以,C++是重中之重!!!


  吐槽完畢。。只有20個贊,第一次這麼認真回答的說。 T_T


/*****************************************這是之前的回答*****************************************/


我不請自來了,因為我發現在這裡面回答的人都在回答:「我想做遊戲開發,難嗎?」,而不是回答「我想從事遊戲開發,一年內能精通C++嗎?」。無視題主的提問,實在忍不住。
對於題主的提問,我比較贊同 @王選易 的答案 ,也許大家都是技術人員並且也在大學中學習遊戲開發。

首先我回答題主的問題,作為大二即將升大三的學生,由於你大一大二忙於社團活動。以致於你可能錯過了大學中打基礎的黃金時期,大三的一個學年裡面,除去你的課程時間,能夠繼續深入學習C++的時間也許並不多。所以,一年內你說可以精通C++,我覺得不可能。


我現在大三,從初一開始學習C++,對這些有一定的了解,也有一定的發言權。但是我從來不敢說我精通了C++。因為我的朋友,他是15歲開始學習C語言,現在學習C++已經超過20年。但是他對於技術非常的謙遜,抱著學習的心態去學習技術,也沒在我們面前提過他精通C++。即使他已經是國內行業的領軍人物。

說一下精通C++這個吧,其實精通這個詞真的很大爭議,至少在許多的社區都有人對這兩個字吵的不亦樂乎,那麼我來和你說一下熟悉的概念吧:

我覺得熟悉C++,至少要能夠做到這些:
1、你完整閱讀過C++ Primer 第五版之後的書,這本書可謂是C++程序員入門必讀的書。(為什麼我推薦第五版之後,因為第五版之後包涵的內容是C++11標準的內容,你現在重拾編程語言,那麼推薦你看新的書)
2、你能夠對面向對象編程有明確的概念。因為現在許多程序員用著面向對象語言,卻做著面向過程的事情。
3、能夠利用C++配合DirectX或者OpenGL來製作Windows小遊戲。
4、對數據結構有一定的認識,能夠準確針對問題選擇你的數據結構。
5、其他內容一下子沒想到這麼多,等以後更新。

至於精通,精通C++不僅僅是C++的語法,還有編譯的原理,那麼又涉及到編譯原理,還有計算機的組成原理。調試的時候,當你用release的調試,你又需要彙編語言的知識,又涉及到彙編語言。再後來你需要設計比較大型的程序,你要對數據結構,和設計模式有一定的認識。

再回答下一個問題:你希望從事遊戲開發工作,做遊戲其實不僅僅是看著最近火熱,而是你要從一開始就對有遊戲有接近瘋狂的熱愛,把做好一款遊戲當做你的使命,你才有動力繼續學習。因為程序學習起來非常枯燥。

至於你最後的問題:
你需要學習其他什麼,我覺得其實你需要做遊戲,不一定是C++,你可以選擇另一個語言比如Objective-C開發iOS的遊戲,或者學習C#,可以開發wp8或者xBox的遊戲。
如果你單純是做遊戲,語言並不是問題,問題是你對其他知識的了解程度和對遊戲行業的熱愛,為了工作而工作可能並不會讓你充滿滿足感與激情。

其他的知識:
計算機圖形學
數據結構
編譯原理
彙編語言
英語
數學

至於苦逼軟體的作者的回答,我反對,並且我認為這不是合適的答案。

不是所有的人會為你「工作十幾年遊戲項目超過十年而買單。」

---------------------以下逐個寫下來得罪人---------------------
「想做遊戲開發根本不需要精通C++,根本就是南轅北轍。」
》遊戲開發不需要精通C++,甚至說不需要會C++,但是你至少要熟悉任何一門開發語言,並且充分了解數據結構。這根本不是南轅北轍,而是取向問題。

「挑一個引擎熟悉起來」
》這是我看到最不負責任的回答,這位同學問的是未來的路,現在讓一個學生直接選一個引擎,沒有錯,這樣可以讓他更容易找到小公司,但是會使用,不懂一個引擎的原理,在日新月異的今天,公司換了一個引擎,要重新去學習,如果掌握最基礎的東西,那麼無論任何引擎,都可以迅速上手。

「遊戲開發就是耍劍,耍得好看才有飯吃」
》遊戲開發實質就是程序員不僅要練劍,也要練氣。

ps:以上純屬個人觀點。


強烈反對 @kubisoft 功利性太強的高票答案!

這是在把一個能成為業界top 1%的頂級遊戲開發技術大師的黑馬,往能傻乎乎地受你們壓榨的IT民工的火坑裡推,你造嗎?

這讓我想起了喬幫主關於「賣糖水」的那句經典話語,而我們的版本是:


你是願意就這樣學點皮毛混口飯吃隨波逐流,還是成為真正的遊戲開發業界頂尖技術大牛,推動業界的發展,去改變世界?


關於上面這句話的兩個抉擇,我們來做個選擇題。


A. 如果你是想從事遊戲行業當個二流的民工打打雜一輩子就這樣過去,請去看@kubisoft兄有些對現實妥協之前排名第一的答案。(不帶人身攻擊的,只是對事不對人而已呢) 這種太依賴IDE和遊戲引擎所謂速成方式,到最後只能是二流的民工,打雜的,混飯吃的。知道其然,不知道其所以然。遇到真正的專業性問題就卡殼了,比如如何優化渲染質量之類的問題。或者開發的項目就是那種2D的小兒科,或者山寨跟風趕進度趕上市的快餐遊戲,而不是畫質精美,設計精良,堪稱經典,為國產遊戲長臉,推動全球遊戲業界發展的革命性大作。


B. 如果你是志向高遠,想製作出改變世界的革命性遊戲,或者推動遊戲產業的發展,成為遊戲開發業界top 1%的技術領軍人物。請熟練C++,請修鍊好內功。@王選易 兄 @徐奕成 兄的答案是極好的。且正如萌萌的V大 @vczh 所言,就算你的志向是開發crysis這樣的遊戲,其實也只需要用到C++的一小部分就夠了。C++各種範式是發明來解決所有問題的,遊戲只是其中的冰山一角,你沒必要精通,沒必要學會C++的所有部分。我們這裡所說的,是了解原理,學C++只是其中的一小部分,與其說去不斷的學C++的更多高級特性,更好的學習方向是熟練利用C++配合DirectX或者OpenGL來製作Windows小遊戲,對數據結構設計模式有一定的認識,且能夠準確針對問題選擇你的數據結構,研習計算機圖形學blablabla的。

(PS:不要輕易用「精通C++「這個狂妄的詞眼,後文有一些關於這個梗的解釋)


正如我之前在自己博客裡面所轉載的文章《編程巨星的唯一秘訣》中說的:


「對所做的事情的理解越深,你就會做的越好。」


既然題主都提到要走熟練C++,以後開發遊戲這最正統的技術道路了,他內心渴望的應該是志向高遠,做個強者,而不是去當IT民工打雜做技術含量不高的事情。


即我是不能同意更多 @Aaron Luo 兄的觀點。

」題主還是學生,別用壓榨it民工的想法來教導!題主可以從cocos2dx和unity3d開始學遊戲開發,但是,如果想一直做編程,請別忘了必須同時修鍊c++, 因為它可以給你認識到真正的編程,讓你懂得更多計算機編程思想,以後就算不寫c++也可以迅速了解別的語言,別的工具的~而不會變成僅僅依靠IDE工具,隨便抄抄別人代碼,完成山寨程序的It民工。「


也不能同意更多 @徐奕成@Floristt兄的觀點。

@Floristt 兄在評論區說:那些不懂原理只是挑一個工具熟練掌握使用或許在當前遊戲市場火熱的背景下也能混得不錯,但是感覺很快會遇到職業瓶頸。這對自身而言就是一種風險。如果一項技能你學三個月就能耍通常意味著可以輕易找到一個人代替你。

@徐奕成 兄說: 你學會這些可以讓你比較容易找到一個工作,但是幾年之後會碰到你的職業瓶頸,要麼繼續學底層,要麼轉行。否則公司會毫不猶豫地找人來替代你。其實有一句話我很贊同:「程序員如果不學好底層,將毫無作為。C++讓你走向程序員這條路,編譯原理和彙編語言等讓你走得更好,數學英語讓你走得更遠。」


大方向的話,就如@王選易 兄所言,如果你是圖形程序員,那麼最好的項目就是,自己做一個遊戲引擎如果你是Gameplay Programmer,那麼最好的項目就是,自己做一個遊戲項目。

另外, @IMAGICE 兄在評論區說到,「還是那個問題,是選擇偏向遊戲(文藝方向,獨立開發),還是想做好技術(引擎開發,技術研究,打工,這個可能是大部分人的歸路)。」
是時候引出遊戲開發領域的兩大流派了,即 @伍一峰 兄在回答中提出的氣宗與劍宗。
獨立開發者和小團隊因為時間和精力的限制,大多是以實現為目的,這也是情有可言,這就不難解釋 @kubisoft 兄所推崇的以快速實現為目的,依賴工具、引擎和不求甚解的劍宗流派有不少人的追捧。(文藝方向另談)
每個人切入這個行業的方法不盡相同,能選擇最適合自己的入門方式就是最好。但是入門後如果想有更好和更長遠的發展,必須開始崇尚氣宗一派,了解內部技術細節,修鍊好內功。不要流於形式,浮於表面,依賴工具,而是要深鑽進去,了解得越深越透徹越好。最好是能自己了解遊戲引擎的底層原理,甚至是寫出自己的遊戲引擎來,這樣才是更高的境界(當然這只是極少部分的頂尖高手能達到的境界)。
總之,劍宗一派適合入門,這樣有趣,有成就感,能快速得到成果,但容易遇到職業瓶頸,後勁不足。氣宗一派注重內功,了解原理,作為稀缺的高水平人才資源,能有更多選擇的權力,有更長遠的發展。而且不難理解遊戲開發領域是先有了氣宗才有了劍宗,且了解原理,內功深厚的氣宗境界更高一籌。
能找到自己的合適的方式就是最好。並不是否定從引擎出發入門這條便捷之路,其實我的建議,若決定走修鍊技術為主的氣宗一派,先學點C++,然後配合著C++學一些底層API(DirectX或OpenGL),能寫一些比較炫酷的三維遊戲場景,或者說自己實現一個小型的軟引擎,再去真正地接觸引擎,利用引擎做一點有趣的demo或者完整的遊戲,閱讀一些優秀開源引擎的源碼(比如Ogre,irrilicht,Unreal Engine4 ,cryEngine),甚至自己實現引擎或者做遊戲項目,這是重視技術的氣宗流派比較科學的內功修習方式。

我們都知道,氣宗和劍宗的爭執永遠不會停歇,就像這個回答下的評論區,永遠不是一邊倒,而是氣宗劍宗的支持者平分秋色,各有千秋。
我很欣慰的是,這個答案寫出來之後,一天之內就已經超過了當時排名第一的、已經在答案中被我@了無數次的kubisoft兄有些對現實妥協,倚老賣老(不帶人身攻擊呢,只是對事不對人)的答案。這證明大家的眼睛是雪亮的,內心還是不甘心的,還是希望做個明白人,做個強者,知其然並知其所以然,並且希望自己有能力站在更高的山峰,去完成更大的事業。
(PS:這段貌似才算是比較理性的分析,回答一開始寫的有些小憤青了,但的確是肺腑之言。)

----------------------------------------------------------------------------------------------------------------------------------------

既然提到了小憤青,就另外附一點我在2013-03-25寫的一篇年代久遠帶些小憤青的拙作中的一些觀點:

「【

事實如此,現在市面上所有畫質精美的單機遊戲作品(鬼泣5,上古捲軸5,刺客信條3,仙劍奇俠傳5前傳,古劍奇譚等等……),所有的大型網路遊戲(Dota2,英雄聯盟,魔獸世界,龍之谷,劍靈等等等……),所有高性能的三維遊戲引擎(虛幻3,Unity3D,Cry Engine3等等……),以及一些高性能的2D遊戲引擎(Cocos2d-x等等),都是用C++來開發的。

其實遊戲引擎並沒有那麼神秘,說白了也就是那麼回事,用類封裝好功能的C++代碼而已。C++寫出來的遊戲引擎自然能跨平台。Unreal Engine3、Unity3D、Cocos2d-x等遊戲引擎就是絕好的例子。


學好C++,你可以親手寫出Unity3D,親手寫出 Cocos2d-X,讓大家都叫你大神,大家都用你寫的遊戲引擎做遊戲,等著你什麼時候心情好了更新一下給引擎加更多功能;而不是只會盲目跟風,今天大家說Unity3D火,就都去學Unity3D,明天大家說Cocos2d-x熱門,就來學學Cocos2d-x。你學遊戲引擎,學的只是人家某引擎作者某C++大神按心情來定的函數調用方式,學的只是如何調用一些別人寫好的一些類,一些API函數。這樣在別人規定給你的一些rule中固步自封,大家覺得有技術含量么?

我們是時候該該想一想了,為什麼現在全球範圍內優秀的三維引擎,就是沒有我們國產引擎的影子。

所以,無論是哪個平台,Windows也好,iOS也好,Android也罷,如果你真正想在遊戲開發領域有所作為,混出個名堂,請學C++,請學計算機圖形學,請了解計算機圖形API(OpenGL或者DirectX),而不是在跟風某種「熱門」的遊戲引擎的大潮中隨波逐流,在某種移動平台的遊戲開發中迷信某某引擎,樂不思蜀,固步自封。

咳,扯遠了,而且有些小憤青了,我並沒有歧視其他編程語言的意思。淺墨只是想表達,無論是哪個平台(Windows,Play Station,Xbox,Android,iOS, WindowsPhone, WUII),在三維或者高性能遊戲開發領域,確實就是C++的天下。

】「原文在這裡:【Visual C++】遊戲開發四十九 淺墨DirectX教程十七 三維天空的實現

----------------------------------------------------------------------------------------------------------------------------------------
2014-6-2更新部分。
答評論區 @李柯 兄的一段話。關於站在巨人肩膀上的一些思考。
首先對於這部分, 在這篇回答的評論區,@invalid s兄的文字是相當的深刻與一針見血,推薦大家讀一讀。

1.我們並不是說支持完全去從頭造輪子,而是你理解的越深,就可以收放自如,做個有選擇權的強者。當沒有合適你的輪子的時候,當遇到技術瓶頸的時候,你自己完全可以製造個更好的,前所未有的輪子,而不是懵在那邊,等待你所謂的巨人們心情好後的施捨,造一個合適的輪子給你用,或者因為長久以來的太依賴工具而喪失了本來的能力。
我大家所希望的,是能做一個真正的明白人,心中有墨水,心中有底氣,然後無所畏懼,遇到什麼瓶頸都不虛。
我們站在巨人的肩膀上的同時,不僅僅是靠業界巨人們寫出來的庫去實現自己的東西,而是可以理解與吸收巨人們的思維、技術和實現方法。當達到一定境界後,我們可以當下一個巨人,推動業界革命。這大概就是大牛與民工,強者與弱雞,最外在的區別與表現形式。
太依賴所謂的巨人們的肩膀,太依賴工具,如同井底之蛙,日復一日地調用讓你崇拜的大神們寫出來的類庫,以為只要能做到這樣就天下無敵了,以為就是軟體行業的全部了——這大概就是目前,我們國內軟體行業的誤區所在吧——依賴工具,浮於表面。

2.能理解內部實現細節肯定是推崇的,這個看個人,或遲或早,但是越早越好。
我寫這個答案只是希望題主以及看到這個回答的朋友們能有更長遠的眼界,立意更高遠,能有更寬的視野,能知道更大的世界,而不是一輩子就這樣炒炒現飯調用調用別人寫的函數窩囊地就過去了。
人的一生精力有限,作為一個聰明人,作為一個明白人,入門的時候什麼方式越快越好,但是入門之後呢,如果希望自己有更好更大的發展,大方向千萬不要錯,不要過分依賴拘泥於工具,浮於表面,一定要跳出那個圈子,從井裡爬出來。
即,如果希望自己變得更強,不人云亦云隨波逐流,最好的方式或許就是自己去理解細節,也並不是咬文嚼字地要自己真正花大工夫花精力去做一款引擎,這個量力而行。

人的一生精力有限,沒有哪條路哪種方法適用於所有人,但一個人只要能專註於自己認為值得事情,能自得其樂,那也是值得尊敬的。

回答 IMAGICE兄的評論:
3.直接用輪子,並真正做出非常贊的作品出來,那也是值得尊敬的。當今遊戲引擎的發展,為我們提供了前所未有的便利,我們可以合理的利用他,但千萬不能太迷信太依賴他。
但如果已經在某個領域花了10年甚至更長的時間,還沒能有所突破,那就得反省自己,是不是方法問題了,是不是方向問題了,是不是之前研習的時候,或進度太慢,還是走了很多彎路。我們都清楚,並不是每個人都能有很好的技術天賦與底子,當然也不是每個做遊戲的人都要去理解和實現底層,要量力而行,要有所側重,要找到自己最合適的角度。我們只是從長遠來看提倡將知識挖深,讓自己打開眼界,不做井底之蛙,不隨波逐流,讓自己因為站得高看得遠,而有更多更廣選擇的權利。
技術與創意,並不矛盾。人生在世,有所為,有所不為,遊戲開發亦如此。

----------------------------------------------------------------------------------------------------------------------------------------


以下算是一些關於C++的附加思考。

【關於「精通C++」這個字眼,請不要濫用】

引用@徐奕成 兄的一段話。

徐兄現在大三,從初一開始學習C++,對這些有一定的了解,也有一定的發言權。但是他從來不敢說他精通了C++。因為徐兄的主管, 15歲開始學習C語言,現在學習C++已經超過20年。但是他對於技術非常的謙遜,抱著學習的心態去學習技術,也沒在我們面前提過他精通C++。即使他已經是國內行業的領軍人物。


引用 @漸修竹 兄的一段話。

「我也做了兩年c++了,也不敢說精通,我們老大做了至少8年,也沒敢說精通,我認識的很多大神,也都沒敢說精通。事實上我認識的很多大神都很謙虛,我跟他們學到了很多,大家的簡歷上也都寫著熟悉c++之類的字眼。」


即對於博大精深的C++,業界的大牛們窮其一生去研習都不敢言能精通它。就算是天天去鑽研C++,一年也只能學個皮毛而已。

C++的精通細節與思考,可參看萌萌的V大 @vczh 的這篇回答:怎麼樣才算是精通 C++?

至於快速入門,強烈推薦 Essential C++,其為C++業界入門必讀《C++ Primer》的作者剝去繁雜,只講C++核心的一本書。

而後續的一些,可以參考這個豆列中的書單:學習C++語言

----------------------------------------------------------------------------------------------------------------------------------------


在結束回答之前,感謝 @洪逸群兄在回答中的at,間接地邀請,讓我知道有這個討論存在:)


總之,最後的最後,還是那個抉擇:


你是願意就這樣學點皮毛混口飯吃隨波逐流,還是成為真正的遊戲開發業界頂尖技術大牛,推動業界的發展,去改變世界?


在二十幾歲這段人生可塑性最強的時光里,我們應該是滿懷信心,志向高遠,想讓自己與這個急功近利、日漸扭曲世界有所不同的吧。

(呃,這個問題已經被改得面目全非,為了注重真實性,此回答就這樣保持原貌吧。2014.6.8日更新)


反對目前第一@Kubisoft的說法,題主還是學生,別用壓榨it民工的想法來教導!題主可以從cocos2dx和unity3d開始學遊戲開發,但是,如果想一直做編程,請別忘了必須同時修鍊c++, 因為它可以給你認識到真正的編程,讓你懂得更多計算機編程思想,以後就算不寫c++也可以迅速了解別的語言,別的工具的~而不會變成僅僅依靠IDE工具,隨便抄抄別人代碼,完成山寨程序的It民工


本來都不想更新了,但是其他人回答的都太不靠譜了,其他人都是在說怎麼當以個遊戲邏輯開發人員,但是你作為一個遊戲引擎開發人員,你不會C++能行嗎?

遊戲開發不止有一個開發遊戲這一領域的。

為什麼不認真讀題!!
-----------------Update-----------------
先回答你的第一個問題,一年是不能精通C++的,但是能熟悉C++的,並且用C++做出一些Demo甚至一些遊戲。但其實題主不是想問多長時間能學會遊戲開發中的C++吧?樓主想問的是如何進入遊戲開發這個圈子,所以我要反對一下 @王迅 的短答案了。

不管怎麼說,還是要歡迎你來到遊戲編程的世界,遊戲編程是編程中最小眾的領域。你身邊的同學可能有許多的人都會各種前台開發,後台開發或者ACM演算法,但是做過遊戲的人可以說用一個手掌就能數過來了。

但是很巧合的是,我是個大三的學生,而且我現在做遊戲開發,那麼我的經驗對你來說有些價值。

然後我再嘗試著回答第二個問題。遊戲開發還需要學些什麼?

首先,題主要做的是學好C++,為什麼這麼說呢?因為不管是現在的圖形引擎(如OpenGL)還是遊戲製作引擎(如Cocos2d-x)都是把C++作為主力語言的。

那麼,我就先推薦幾本C++的入門書籍吧:
C++ Primer 中文版(第 5 版) (豆瓣)
C++程序設計教程 (豆瓣)
數據結構與演算法分析 (豆瓣)
Effective C++ (豆瓣)
樓主可以按照順序依次看下來,由於都是我看過的書,我可以完全保證這些書的質量!

接下來,樓主可以去 Problems | LeetCode OJ,Programming problems and Competitions :: HackerRank 這些網站刷一些演算法題,畢竟光說不練肯定是不行的 =_=。

接著,擺在題主面前的是兩條不同的發展路線

  • Gameplay Programmer(遊戲型程序員)
  • Graphics Programmer(圖形程序員)

Gameplay程序員適合遊戲策劃緊密合作的一種程序員,他們會編寫遊戲中的主要邏輯,為策劃提供關卡編輯工具,第一時間測試並玩到最新的遊戲。

由於Gameplay主要集中於遊戲邏輯的編寫,在這一塊,我的經驗是最好從使用一個遊戲引擎開始,考慮到你的C++和程序員背景,推薦你使用Cocos2d-x這個遊戲引擎,下面是這個引擎的網址。

Cocos2d-x: World』s #1 Open Source Game Development Platform

遊戲邏輯部分,你需要理解遊戲中的場景管理,資源管理,狀態機,AI和網路這些模塊的編寫。具體的操作可以查看我的這個答案:

學Cocos2d-x,需要掌握多少C++知識?大概學多久可以做出一個遊戲?

另一種是Graphics Programmer,或者說是Engine Programmer,他們是給程序員寫程序的程序員(有點繞口啊=O=)。這部分你需要學習的是OpenGL和ORGE等等

首先,你要學習的是OpenGL,首先我們要看的當然是這個紅寶書了!OpenGL編程指南(原書第7版) (豆瓣)

然後,就是讀一些OGRE的源碼了,國內的許多「自研引擎」就是通過ORGE做出來的,所以,作為一個Graphics Programmer讀這個引擎的源碼是非常必要的

最後呢?我們不管是當那種程序員,我們最終都是要做出項目的。

如果你是圖形程序員,那麼最好的項目就是,自己做一個遊戲引擎

如果你是Gameplay Programmer,那麼最好的項目j就是,自己做一個遊戲項目

比如說我最近做個一個Demo類型的遊戲項目:MrNerverDie/Four · GitHub

那麼,題主你準備好加入遊戲程序員的行列了嗎?=w=


@kubisoft 說得對,想做遊戲開發根本就不需要精通c++,根本就是南轅北轍。不過理由我跟他不一樣。就算你的志向是開發crysis這樣的遊戲,其實也只需要用到C++的一小部分就夠了。C++各種範式是發明來解決所有問題的,遊戲只是其中的冰山一角,你沒必要精通,沒必要學會C++的所有部分。


怎麼樣才算是精通 C++?

可以參考我的這個回答


如果你不想成為一個拿技術裝b的geek而僅僅是想用一部分技術解決一部分問題,那麼請你不要試圖精通任何東西。因為任何技術在你精通之前,足夠解決大部分問題了。
特別是c++。


你想做遊戲還是精通C++,你是想學會製作遊戲的工具的工具,還是去做遊戲?
贊成目標驅動,比如說,我的目的就是做出有意思的遊戲,而不需要為了做遊戲去研究CPU的架構,研究彙編,研究C++,我只要能用就行,我管他是U3D還是COCOD2DX,什麼API調用方法,我管他是不是大神們的一時惡趣味,和我無關,這套不好我換一套,我的目的只是一個,把心中的想法實現出來,你們只是我的工具.
你是要精通C++,還是要做遊戲,這是兩條線,對於絕大多數的普羅大眾非天才而言,不可混為一談.

----
在設計製作遊戲的這個過程中,你也許會學到很多東西,甚至也許能開始接近問題的本質,這兩個方向會開始模糊化,也許最後會天下大同,但這兩者是有區別的,出發點完全不同,對於太過遙遠的事,還是更多的著眼於出發點會更合理一些.


樓主提出了兩個問題,1如何在有限時間(1年)掌握c++;2是否有可能精通。
這個題目從表面看,有些功利主義。就精通一詞來說,很顯然不太現實。
而且當我們這樣談論c++的時候,它非常的籠統和抽象!所以掌握和精通c++這個命題就抽象了。因為我們不知道你的目標是什麼,是掌握語言本身,還是能把這門語言應用於應用開發之中。這裡面的差別還是蠻大的。前者,比如說,你去做一個c++語言的教師,傳授別人。後者,比如你要用c++開發各種應用,在各種現實的工程中使用。那涉及的就不僅僅是語言而已了。

就單純的說c++語言,這門語言也是要複雜太多。雖然,你可以理解為c++只不過相對於c引入了類的概念,但是隨著oo的引入,實際上額外引入的很多細節和複雜性是成倍翻升。這可不是簡單的線性關係。由於c++的宗旨為運行時高效,而不是開發時和編譯時高效,所以這導致這門語言的複雜性和學習難度無任何目標上限。。。從而導致c++感覺要比其他語言難學,因為他不對靈活性和複雜性有任何限制,所有的目的都是為了強而強,為了高效而高效,為此可以不惜一切代價。學習和開發成本?不在考慮之列。

顯然的是c更簡單更容易掌握,和c++在效率上可以認為是一致的(c++不會考慮犧牲性能來換取開發的便利性)。但是語言要不要引入oo,當然要了,因為這是編程思維和分工的一種轉換。換句話說,引入oo可以提高程序員的在思維和模型上的控制力。當然也引入了程序結構的複雜性。c++難學的很大一點,在於內存管理由程序員負責和干預,這造成太多你必須顧慮的地方,給程序員帶來太大的學習成本和開發時的負擔,比如在c語言里,可能對內存的管理是非常讓人感到困擾的,在c++里引入了 stl 容器可以適當降低這種困擾,但實際上還是有大量的需要你考慮的東西,導致c++的共享和使用,往往你不僅需要學習和知道介面的定義,還需要你對對方內部的實現本質有一定了解。換句話說,你買了一台電視機,除了用戶使用說明書要讀,有時候還需要你把它拆開看看內部的電路原理圖,你才能使用的準確,正確。這些麻煩事都是擁有gc和屏蔽內存管理的語言完全無法相提並論的,當然也是c++為什麼高效的重要原因。

隨著硬體發展和技術發展,在虛擬內存技術的幫助下,可以分配出上G的內存,所以困擾主要是對內存管理和使用的嚴謹和準確。

當然這也是你學習階段和工業階段的很大的區別,後者比前者要求的嚴格和高。在寫24x7的服務性質的代碼就更加如此。

但是能學到什麼程度呢,掌握,精通?這個概念本身就夠主觀。想必也不容易定義。是你自己的感覺。知乎有個問題就是為什麼對c++不能用精通這個詞呢?誰知道呢,事實上就是使用c++的人,大家都不會再提自己對c++到底是個什麼程度,因為反正沒有人能精通全貌,大家都在各自偏好的領域內研究,也就沒必要提了,為什麼呢,因為領域涵蓋的土地太大了,你很難說你把每一平方英寸的土地都挖地三尺了,也就沒必要說了。大家奮鬥一生,發現也只不過在自家的小片土地勞作而已。

樓主提出了一個想法,想開發遊戲。想法很好,但這也具有一定功利性。因為,誠然,遊戲是所有領域中比較炫目的,比較酷炫的,他好像明珠一樣耀眼。但是我也想提醒大家要稍微冷靜客觀的想一想,遊戲,並不是開發領域的全部,甚至,它只是一小部分,甚至,它的前景並不能稱之為樂觀和光明。換句話說,要做到一個被用戶接受的遊戲,那是非常困難達到的境界。這遠比做出一個遊戲還要更難。這就好像競技體育一樣殘酷,成功的遊戲總是屈指可數,而且也大部分是來自集體智慧的結晶。我以前有個網友,他因為做過一段時間的 GIS,所以他給我的感覺就是這輩子只搞 GIS,我對他這種給自己主動設限的做法並不是很贊同,我主張作為一個開發人員,你要有自己的興趣和領域,但也不要給自己設定這樣的局限,我就是會這個,別的不考慮。實際上大家還是要開闊自己的視野,要知道你的技能越是底層,你的技能就越成為體現多面性的應用領域的基礎和根基,你越不應該將自己局限在某一個具體領域,讓自己的路變得狹窄,而是讓你的技能發揮作用,更加通用的為更多領域服務。

這個世界上並不是所有人都熱衷於打遊戲,所以遊戲是開發領域的一顆明珠,但他不是全部。在遊戲以外,同樣也是有很大領域的價值土地的。我本身並不是對遊戲開發有任何看低的看法,實際上,我並不打算要去開發遊戲,但我長期以來都在打算去學習directx,opengl領域的學習,我必須承認,我們本身應當不斷的攀登高峰。

最後,我們客觀的評價c++,就是這是一門性價比(學習成本和回報之間)非常低的語言。只有真正對他有興趣的人,值得去學習和研究它。否則,因為它的超低性價比,你基本一定會半途而廢。


寫了多年C++,說一點自己的感悟。雖然自己近期沒有接觸C++了,但是畢竟學習的第一門語言就是C++,使用時間最長的也是它。回顧起來,它就像老朋友一樣,始終帶給我一份親切感。儘管自己距離精通C++還有太漫長的距離,但也從使用C++的過程中有了不少的收穫和感悟,在這裡分享一下。手機打字,想到哪裡就寫到哪裡,如有謬誤之處,還望不吝賜教。

C++的入門學習曲線相對高一點,但是如果循序漸進,不刻意追求那些奇技淫巧的話,其實還好的。就我自己而言,我把C++看作是幫我組織和簡化代碼的好助手,而不是一個有著複雜語法和號稱「最難掌握語言」的工具。

其實仔細想想,C++的語法並不是隨意制定的,而是有著嚴謹的體系,所以不能生硬地記憶。如果能夠很好地理解和遵循這套編程思想體系(哪怕最開始的時候只是嘗試去依葫蘆畫瓢),就可以比較容易地寫出有著良好組織的代碼。所以,語法不是給你帶去痛苦的,而是用來幫助你寫出更優秀代碼的。

說到簡化代碼,可以利用C++編譯器和標準庫來幫自己做很多事情,而不要什麼都自己去實現和解決。比如說,C++編譯器可以提供RAII、模板等強大功能,既能省下代碼工作量,還能減少出錯的可能性,標準庫則更無需多言了。所謂減少bug的最佳方式就是不寫代碼,我的理解大抵如此。

C++相對比較麻煩而容易出錯的地方,一個是複雜繼承層次和關係,一個是內存管理,一個是多線程編程,以下簡單闡述一下自己的愚見。

對於複雜繼承關係應該盡量避免(其實良好的設計基本可以避免這種情況出現),可以考慮用組合關係來替代。當然,還是要順應領域模型,最好是有著清晰的映射關係,而不要為了組合而組合,那就過猶不及了。

對於內存管理,現代C++完全可以通過STL容器加上智能指針的方案妥善解決。此時,代碼里不會再出現手動free的情況,很大程度上減輕了程序員內存管理的負擔。當然,STL或智能指針要用好也不容易,特別要注意一些常見的坑(參見《Effective STL》)。

多線程編程則不僅僅是C++程序員要面臨的問題。對於C++而言,通常有兩種方式解決多線程資源訪問衝突的問題:一是利用RAII來加鎖和解鎖(針對跨線程操作的對象),二是讓同一對象或資源只在同一線程中進行操作。

再談C++的學習和應用。C++實戰大多離不開三類技能(不談及演算法): 一是C++本身內容的掌握,包括語法和標準庫等;二是系統API的掌握,包括文件系統、圖形介面、資料庫系統、網路編程等;三是領域知識的理解,權且也把面向對象編程等思想和能力算在內。所以,這其實是一項綜合能力的培養和學習,並不僅僅是學會了語法就OK。

要想用好C++,我自己的一點經驗,首先要對語法有紮實的掌握,特別是一些細節和容易忽略的地方,不然就容易埋坑。當然,這不是說只有把語法全部掌握了才能開始寫程序,而是要在實踐中循序漸進,每實踐一個知識點就儘可能把對應的細節和坑弄清楚,這樣隨著時間和經驗積累,就能紮實地打好基礎。此時,《C++ Primer》第5版可以作為案頭必備的參考書和工具書。

同時,還要儘可能理解和掌握業界的最佳實踐,並運用到自己的代碼中。這些最佳實踐怎麼來呢?一是經典書籍,包括《Effective C++》、《Effective STL》等;二是優秀的開源項目,我個人非常推崇陳碩的muduo庫,自己也從中受益匪淺;三是不斷反思自己原來的代碼,總結經驗教訓。對於第三點,可以採用快速迭代的思路,不要惰於優化和完善原有代碼,因為這是提升自己的很好的機會。

再高一個層次,就是對於自己寫下的每一行代碼,都很清楚這行代碼在背後做了什麼事情,這樣對於自己的代碼就有很好的掌控力。比如,調用虛函數的時候,使用STL容器的時候,儘管我們只是一個函數或方法調用,但其實在我們的代碼背後還默默地做了很多事情。從系統、語言、標準庫三個層面,我分別推薦《深入理解計算機系統》、《深度探索C++對象模型》和《STL源碼剖析》三本書,可以從中找到答案。

C++語言之父提到他設計C++語法的一項基本原則是向程序員提供儘可能的靈活性,但是這種多範式帶來的靈活性和語法的複雜性也提升了團隊合作的難度,並且對團隊每一名成員的編程能力都提出了較高要求。一個簡單的辦法是通過項目約定來控制不同範式的使用,盡量統一大家的編程風格和思路,這樣可以從語言層面控制項目的複雜度。

最後,談一下自己學習C++的一些體驗。剛開始學C++的時候,基本不得要領,寫出來的軟體雖然實現了對應的功能,但是健壯性和可維護性堪憂。被同事推薦後看了《敏捷軟體開發:原則、模式與實踐》,反思了以前編程的痛苦經歷和種種問題,算是第一次提升;後來看過《深度探索C++對象模型》,對所寫代碼背後隱藏的東西有了比較深入的理解,算是第二次提升;再後來仔細研讀了陳碩的muduo庫源碼,在實戰層面有了更好的參考,算是第三次提升。雖然也看過其他很多書籍和源碼,並且有著或多或少的收穫,但是對於自己可以稱作里程碑的節點,大概就是以上三個了。

回顧往昔,很感謝C++,讓自己走上程序員這條不歸路,並且越陷越深。其中必然有著種種痛苦,但是每次產品交付時的那種喜悅感和成就感,一直支撐著自己走到今天。而C++,陪伴了自己這麼多年,帶給了我很多編程的感悟和美好的回憶。看著自己曾經敲下的C++代碼,就像看到了當年自己懵懂而努力的影子。如今,這門相對古老的語言在眾多後起之秀的衝擊下日漸滄桑,但是對於我,它永遠是不可替代的。因為,它已經成為了我生命的一部分。


1年肯定無法「精通」,但是如果認真學能讓你基本了解這玩意是個怎麼回事,而且最關鍵的,能夠幫助你進入遊戲的行業。

上面各種大神的回答,居然milo大神都炸出來了,雖然都很有道理但是我覺得答案依然因人而異。
這個東西沒有什麼答案,而更加取決於你想做什麼。

你想成為一個程序員,還是更想成為一個遊戲開發者,遊戲設計師或者,或是只是喜歡遊戲而想呆在遊戲的圈子裡。。。

遊戲是一個很大的產業,每個環節都是可以做到最大最強從而改變世界的,而且每個環節都是密不可分沒有什麼孰優孰劣的。
上面不少回答角度是從資深程序員的角度來說的,但我個人認為開發一個好的遊戲編程技術的重要性其實並不是最最重要的。美工,設定,故事背景,營銷和項目管理方面都是非常重要的環節,相比之下程序的重要性有的時候並沒有想像的那麼重要。 這也是為什麼很多人認為不懂編程也能做遊戲的原因。有的遊戲比如卡牌遊戲,甚至不需要任何程序。

並且另一方面,對於玩家來說,他們只知道這個遊戲是不是好玩,愛不愛玩,對於用的什麼引擎,
你c++寫的多厲害根本都是沒有直接影響的。比如說minecraft這樣的遊戲也沒有用到高大上的引擎,dota這樣風靡世界的遊戲當初也是用的魔獸爭霸編輯器那個自帶的腳本編輯器完成的。

另外涉及到遊戲引擎的方面,也並不是如某些人所說,直接用別人的引擎的人就沒有任何技術含量的。
第一,為自己的遊戲開發專用的遊戲引擎其實也並沒有那麼困難,只是涉及到的知識和需要的編程技術基礎比較高,而且通常沒有絕對的必要性,所以做的人不多,就好像你想蓋房子會自己去造吊車嗎。所以以上說國內遊戲開發不好是因為沒有好的吊車其實是不對的。
第二,往往大家把遊戲引擎和好的遊戲畫面聯繫在一起,但其實好的遊戲畫面並不由引擎決定,就好像photoshop是一個創建圖片的工具,但是有的人能用ps創造出驚人的作品,而有的人只能胡亂的塗鴉,同樣的工具而最後產生的效果也可能是完全不同的。現在無論什麼遊戲引擎大部分都是基於當前已有的dx或者opengl圖形渲染技術,就算某個引擎能夠同時渲染更多的多邊形,也不能代表其畫面效果好,因為這些其實是取決於使用引擎的藝術家和技術美工的。當然如果一個遊戲引擎的編輯工具非常的aritst friendly,對於畫面的提升幫助是很大的。(於是問題便從開發遊戲引擎變成了開發遊戲引擎編輯工具)
第三,如何巧妙的利用遊戲引擎也是一個非常有技術的事情,比如dota用的魔獸地圖編輯器,弱到連讓一個單位眩暈固定的秒數的功能都沒有,所有的眩暈都是要靠創建一個隱藏的單位向敵人丟出一個隱藏的風暴之錘來實現的,即便如此,別人還是做出了一個非常成功的遊戲。這樣巧妙的利用一個引擎的各種功能,從而達到自己的設計目的,也是非常有技術含量的一件事情。在我眼裡他們這些遊戲程序員的工作並沒有這些引擎程序員的工作低級,歧視他們的技術含量是可笑的。

另一方面,技術大部分的時候是因為需求而生的,比如我的遊戲需要一個特殊的效果從而能夠過表現某種藝術效果,但目前的市面上的引擎沒有這樣的功能(比如我想要我的遊戲里任何東西都和果凍一樣,並且有物理的效果), 那麼這個時候熟練C++編程能力就變得非常的重要,因為涉及到修改原引擎功能的二次開發往往是使用c++的,並且對於各種優化的要求相當的高。(當然如果做不到,那麼巧妙的修改設計方案避開這是永遠存在的解決的辦法,當然結果也是這將使得遊戲變得平庸)

但是總的來說,花一年時間儘可能深入的學習c++是十分必要的,即使你今後不使用c++作為自己的編程工具。因為c++是目前大部分編程語言的基礎,了解這些細節對於今後快速掌握另一種語言也是非常有益的,我c++水平不是大神,但我也能做到在從來沒有看過任何java/c#的書籍的情況下看懂大段的java/C#代碼並且自己寫出一些常用的功能。
如果真的想從事遊戲行業,在學習c++之外更重要的是,你需要儘早開始著手做一個你想做的遊戲,無論多差先做出原形來,無論用什麼樣的辦法多落後的技術,在中間你還會學到無數編程之外的東西。編程這個東西,一旦編程技術達到一定的水平,剩下的在編程語言之外的思想才是更重要的,就好像有的人寫作的辭彙特別的美,語法特別的對,但是內容空洞無力的話也是沒有任何價值的。


《21天精通c++》


謝謝邀請:)

樓上如 @kubisoft 和 @大餅 前輩都答得很好。

這個問題有點像劍宗和氣宗。
遊戲開發就是耍劍,耍劍耍得好看了,觀眾就會賞錢。

學習氣宗,雖然能讓你握劍更加有力,耍上一天一夜也不喘氣,還能夾帶一些紫氣,但對於耍劍來說,無關好不好看。精通了C++,然後呢?和遊戲一點關係都沒有。因為耍劍不單講氣,最重要是講藝。

因此,自然是劍宗更加有效更加貼切。遊戲開發裡面有很多field specific的知識和技能,雖相似,但和軟體開發仍然不能一概而論。更別以為學好遊戲開發的知識容易,其實路途同樣艱難,只是難的地方不一樣。

那麼遊戲開發來說,劍宗和氣宗是不是就一定不兼容呢?也不是。有時候,你需要一些特別的機制或者特別的效果,前人可能沒有實現過,又無法從美術方面下手或者修改設計,就需要你有紮實的編程基礎來實現它。像遊戲引擎就是這樣,想要更漂亮的畫面、更好的運行效率、更方便的工作流程,才會推動引擎發展。但遊戲都沒做過,又怎知道現有技術不能支撐你所想所要呢?精通C++又解決了什麼問題呢?

舉個例子,今年IGF學生組的最佳遊戲,The Risk of Rain,我一看,那麼精緻的畫面、出色的手感、完善的機制,絕對是不簡單啊,一看開發者,竟是華盛頓大學機械專業和商學專業的兩位年輕人開發的,用的還是GameMaker。

從此我豁然開朗,遊戲開發就是耍劍,耍得好看才有飯吃,哪怕你華山掌門人。


------------------Update 1------------------

這個問題能引起那麼多不同意見,很有意思。
重新瀏覽了一遍大家的答案,主要有兩種見解。

一方是正好是我說的劍宗,主張一開始就以遊戲開發相關知識為主要學習方向;
另一方是氣宗,主張一開始以計算機底層知識為主要學習方向。
而C++則是這一題目里兩方主張的矛盾的外在表現。

正如我答案的主體部分,我個人比較偏向劍宗。
一個原因是我沒有進過AAA的大公司,以往兩次實習都是在獨立遊戲公司,他們的氛圍都是以快速實現為主要目的。
所以我也耳濡目染,將實現視為遊戲開發當中最重要的東西。

因此我較為主張初學遊戲開發的話,也以實現為目的,比方說,選一款引擎,不斷地製作遊戲。在這一個過程當中,我們會不斷地接觸到新的知識:
一開始,我們在Update裡面寫代碼,我們接觸到了Game Loop,
我們創建角色圖像,接觸到Sprite的概念,
我們想用鍵盤控制角色移動,我們接觸到了Input System,
我們想讓角色跳躍,接觸到了Physics Engine的概念,等等等等...
現在我們對Game Loop有了了解,對Physics Engine有了了解,知道它們在遊戲中的作用,那麼對我們學習這些領域,是有莫大好處的。

正如最近關於很火的「設計模式」問答,現在的觀點主要是「你得遇到問題了,才真正懂得某一個模式的好處」。我覺得關於遊戲開發的學習,也是這樣的。


當然,我不會說哪位在座哪位老師的意見是錯的,因為遊戲開發本身就是一個新生學科,甚至連學科也稱不上,自然沒有對的和錯的路。


我覺得學習c語言會更合適一些。可以避開c++的語法陷阱,又能夠快速地書寫程序了解指針,內存管理,io以及字元串的操作真諦。

通過6個月左右的c語言學習後,可以考慮學習一些面向對象的語言和lisp語系的語言,例如python和lua。這大概需要3個月左右的時間。這期間可以閱讀一些優秀的代碼,我推薦學習的源碼有兩個,一個是lua的源碼,一個是vim的源碼。這兩者都能提高你對計算機底層系統對內存管理,以及字元串處理的理解。並且對函數指針有一個深刻的認識。

最後3個月可以試試採用c和lua結合的方式去實現一個簡單功能的程序。

恭喜你,畢業了!你也許還不懂圖形渲染,不那麼理解gpu,不懂得網路通訊,多線程,操作系統和其他計算機科學知識。只是初略對cpu,內存和文件存儲有所了解,但這已經不妨礙你成為一名合格的程序員甚至遊戲程序員。由於你的選擇,你避開了c++學習過程中的諸多陷阱,直接用一門簡單的系統級語言c快速地理解了計算機程序的真諦。這比你學會使用c++更重要,也為你今後的發展鋪下了堅實的基礎。


如果有足夠的精力,一年的時間掌握基礎的C++還是綽綽有餘的。
推薦先看一看Andrew Koenig的Accelerated C++,基本上就能入門了。
然後就可以買一本C++ Primer當工具書翻著看,這時候就可以自己找個項目做一做了,邊做邊學,從工程應用中找到自己知識的空缺並進行補充。
做那麼一兩個工程之後就可以買Ruminations on C++,Effective C++這些書來補充一些C++的零碎知識。
到此為止,你已經大概掌握了基礎的C++,看一些設計模式之類的書,找兩個項目做做就好了。
重點就是一定要不停的練啊,越大的項目越能夠鍛煉一個程序員的能力。
如果到了這裡,還想多學一些,可以讀C++ Templates學習一下模板元相關知識,可以讀STL相關書籍補充一些庫開發的知識。本人目前就在這個階段,基本上到這裡就會遇到學習壁壘,也沒必要死磕往上繼續學了。本人高中生一枚,初二開始學C++,三四年以來摸爬滾打摸著石頭過河,也算是找到了一條比較好的路子。不過因為我個人也沒上過大學,不了解大學中的環境,也請各位看官依照自己的情況來選擇自己的道路,本人經歷僅供參考。
個人拙見,請各位前輩多多指導。


人人都在危言聳聽,其實大部分情況下,不需要精通C++。參考isocpp/CppCoreGuidelines · GitHub
發明C++的人一再提醒,需要以正確的方式打開C++,而不是等你精通之後才認為你會以正確的方式打開C++。
對於精通,那就是你能寫一點什麼東西提交到類似boost或者想一個靠譜的提議。


居然沒看到那張圖,真不合理。

他們都在打擊你,讓我來告訴樓主真相:根本不需要1年,21天就能精通C++!


如果「精通」的含義是了解C++所有的方方面面,甚至編譯器實現細節。那麼肯定不會有這樣人的。並不是你不能成為這樣的人,而是完全沒有必要。這個意義上講,我從來不推薦閱讀《深入C++對象模型》這樣的書。這並不能使你建立真正的面向對象的概念,反而容易誤導你這樣才是實現面向對象概念的唯一方法(可能是最有效的一種而已)。

如果把「精通」定義為可以熟練地使用C++來構造具有擴展性的框架或者應用,滿足時間和容量上的要求。上面回答問題的有不少人應該可以達到。

在如果把「精通」定義為使用基本的C++構造來克服程序實現中的種種必然或者偶然的複雜性,那麼精通C++所需要理解的知識點並不是很多。最基本的,準確理解RAII概念並且可以有效使用之以及理解基於異常的錯誤管理是成為一個合格C++程序員的必要條件。樓上流出的幾乎所有的書都會涉及這兩個概念,但是深入介紹並且融會貫通的沒有。當Google的的C++規範還沒當作聖經膜拜的時候,可以理解大多數的C++程序員並不合格。

並不是這些程序員不夠努力。C++程序員是最努力的程序員之一,因為C++的書太多了。C++的面也太廣了。這樣導致的一個後果就是大量的時間被浪費了,同時形成了一個無法精通C++的「神話」。

除非你是語言律師,你無需「精通」C++;
除非你的編譯器的實現者,你無需「精通」C++;
除非你是編譯器的測試者,你無需「精通」C++;
除非你是語言規範的修訂這,你無需「精通」C++;

計算機世界最強大的武器就是抽象。你要精通的是使用C++的構造來模擬並且建立抽象。這裡面涉及的更多是介面設計問題。

涉及到介面,不能不提到類型。我們都知道C++是靜態強類型的語言。但是這個強類型是不完全的。你能知道C++標準庫里的很多代碼都是為了修正這個不完全的強類型系統的輔助代碼嗎?C++的面向對象中有一個概念叫做多態。據說是在運行時決定以指針或者引用調用的函數具體是那個,但是你知道所有這些都在編譯時就決定了嗎?理解類型系統,並且熟悉其功用是進一步的要求。有了這個基礎,演算法和容器分離的STL設計是自然而然的結果。

可組合性是組件的更高要求。這個深入了,你得到的是類似Monad的東西。C++的未來就是這個方向,因為這使得C++代碼可以極好地橫向擴展。

能依次掌握,理解,並且運用上述概念,並且能把這些概念映射到C++之中,雖然不能說是精通C++,也可以說是稀缺的C++程序員。

這樣的程序員,有多少,要多少!


不可能。


學遊戲開發不需精通cpp。比如u3d就是csharp的。也支持js。現在也很流行。cocos2dx是cpp的,也無需精通,會用就行了。遊戲需要精通遊戲常用演算法和技巧,語言只是工具,無需花這麼久去學。可以先學習下lua熱身。


推薦閱讀:

如何通過自學找到一份開發的工作?
有哪些看似簡單其實非常精妙的代碼?

TAG:C++ | C / C++ |