1. 程式人生 > >CG行業如何學程式設計:獻給想要學程式設計的CG孩

CG行業如何學程式設計:獻給想要學程式設計的CG孩

很多同行打算學程式設計,以為程式設計是技術的最深奧義,但是一個是這個想法有沒有跑偏,另一個是學了很久還是不得其門而入,越學越困惑,這很正常,程式設計不像建模一樣直接(當然直接不等於簡單),看到的就擺在那裡了,所以學起來不能那麼直接的看到效果就知道底層的實現,另一個就是即便是拿到原始碼,演算法不理解照樣是看不懂的。所以學習的方法非常重要,如果越學越困惑,那肯定是方法出了問題。在這裡把我的一些思考寫在這裡,希望能對想學程式設計的孩子有所幫助。一家之言,姑妄聽之喲~~

據說程式設計寫錯一個標點都不行,程式設計這麼難嗎?

這句大實話是很常見的,的確寫錯一個標點都不行,不但寫錯不行,就連少寫多寫大小寫沒搞好都往往會導致失敗。 還有另一個大實話,就是說Vim難學的時候說Vim連上下左右都是HJKL,太詭異了! 首先這兩個事情的確是存在的,而且如果想說這兩者很難的話能找出100個這個規模的事情,但是還有兩個事實:
  1. 程式設計:說這種話的人往往是根本不會的,或者學了一頓沒學會的。我從來沒有聽說過會程式設計的還在跟別人提到過標點問題,除非他還是不會程式設計。本質上講,標點錯了這屬於語法錯誤,還沒執行呢,編譯階段編譯器就會告訴你哪裡錯了,錯誤原因是什麼。當然這個位置不一定準,但是凡是程式設計超過500行的絕對不會被這個問題困擾。語法錯誤在後面的過程中那就是最基本的錯誤,排除不了的那就是初學者。就跟寫一句話一樣,如果把一句不妥當的話改個表達方式更加妥當還是需要動動腦子的話,那把一個字給寫錯了就屬於這個問題的級別。我想大家也該明白了,電腦是很呆板的,尤其是C和C++這種不善解人意的語言,你照著她的套路來一點問題都沒有,但你姿勢錯了那不能怪她不容納你,多寫幾行程式碼練好基本功才是入門之道。
  2. Vim:Vim中HJKL的確是方向鍵,但上下左右方向鍵照用。
結論:如果要去諮詢某件事情,最好的做法是去問這個領域裡有權威的人,如同打仗,如果去問敗軍,那得到的答案可能會是哎呀趕緊跑吧,敵兵各個都有三頭六臂甚至連眼睛都加了glow效果。不這樣說能顯得他們雖敗猶榮嗎。所以問了對的人,你能得到他們的方法和建議,但問的不對只能得到不這麼做的原因。

我適合學程式設計嗎?

一般這種文章寫到這裡都會鼓勵鼓勵儘管學吧,但是我覺得這麼說的時候還是要想想自己的責任,如果讓一個人去騰出了很多精力去學程式設計,但有可能他不擅長這種思維,又肯能他高估了程式設計之後的生活,那當時慫恿他學程式設計的人也算不上正面角色。 所以可能和你所想不一樣,但我還是說的實在點吧。 羅永浩說過一句話,“不是每棵小草都會成為大樹”,他又解釋了一下小草絕不意味著卑微,大樹也不意味著高人一等,只是職務分工各有不同。在這裡也同樣試用,為了不至於讓人誤會,可以反過來說,如果建模、動畫、Rigging、VFX是大樹,幹嘛非要去做一顆小草呢? 程式設計人人都可以學,但人人都能學好是扯淡的,就和建模人人都能學好一樣扯淡,學不好就意味著做不好,做不好就意味著對自己的生活改變不大,改變不大為什麼還執意要學,這不是說惦量了一下有可能做不好就不做了,而是開始之前一定不能太盲目: switch(學程式設計原因){
  • 如果想學程式設計是因為自己手邊的活做不好,又心比天高曰“大丈夫處世當編寫程式碼安做模型乎
    ”,那我覺得還是別學的好。break;
  • 數學不好不願意學,英語不好也不大願意學,那就先別學程式設計了,即便是再“喜歡”,因為學了也編不出足以超過現有工具的東西。break;
  • 做什麼都是三分鐘熱度,對CG興趣不高,那不可能把CG的程式設計堅持學習下去的break;
  • 如果自己的領域做的很好,對實際流程已經很瞭解,學程式設計是為了拓寬思路,增加對技術的控制力;
  • 如果自己有精力有時間(在校生或者空餘時間多的CGer);
  • 如果自己是一名Geek;
  • default: 拿出精力和激情來學吧,堅持。
} 結論:在我看來適合學程式設計的人很多,但還是奉勸不要盲目。我認識的一個朋友把自己的方向定位在了vfx,我覺得這是很明智的,因為哪個模組都必須要有尖端的人,而並不是尖端的人都跑去程式設計了,從來不是這樣。

咱這行業程式設計之後能做什麼?

有兩個極端的觀點不正確:
  1. 程式設計無所不能。
    請有這個想法的同學現實一些,我的經驗是:
    for each in [PS, Maya, MayaAPI, Renderman, Houdini, HDK]:
        我在沒學each的時候感覺each太過神祕,學會了一定可以像那些牛逼的大師一樣無所不能。
    每個階段都是驚人的相似,以為為知的each裡面一定有很神奇的東西,因為想學的時候潛意識會把那些大師的作品當成自己以後能做出來的作品,大家可以想想學軟體之前是不是這樣的?尤其是我當時選Maya和Max學哪個的時候,其實兩個對我都很神祕,但我翻了下Maya的作品,蜘蛛俠,牛叉,星球大戰,牛叉,哎喲臥槽還有指環王,為什麼沒早學5年呢。然後翻Max的作品,當時國內Max的書很多,於是我翻到了各種國產specular亮瞎雙目的blinn材質和box+球體建模,心想這軟體前途不大啊,於是就學的Maya。
    這個其實就是我每次學習之前的縮影,相信對其他很多同學來說也是這樣的。在學之前這個軟體是未知的,於是就看看那些閃耀的這個each參與過的專案吧,而看那些閃耀的作品會讓自己認為這些作品全都是這個each的功勞,於是就學吧,但事實上事實上學了之後發現好像不是這樣的,關鍵還是看自己腦子裡有料沒料。
  2. 行啊,挺好啊,瞅著你解決了一個技術問題,你丫解決之後工資提高了麼?
    這是當時在群裡有個人冷不丁問一個勤奮上進的孩子,在那一瞬間替他感覺,的確每提高啊,好悲哀,這麼苦逼的解決問題是圖個什麼。但是是這樣嗎?
    但是幾秒鐘後突然想,自己從開始的800實習工資,到現在已經一個讓自己比較滿意的待遇,我從來都是一個我,人從來沒換,但為什麼社會對我的酬勞多了呢?答案就是那時候和現在的我,能解決的問題的數量和範圍是不一樣的。這種差異的根源就是不停的苦逼的解決問題提高自己。所以當有人在玩著遊戲不覺的光陰流逝反而笑話那些苦逼的提高自己的孩子說你這一分鐘搞定了問題但下一分鐘你工資提高了嗎答案是下一分鐘沒有提高,但如果他堅持,會解決越來越多自己之前解決不了的問題,demo上也會出現以前做不出來的效果,那在以“年”為尺度下看這倆人的待遇曲線我想會很明顯。
而程式設計會極大的提高你解決問題的能力。 言歸正傳,程式設計能做什麼呢?這取決於你已經學了哪些東西。
  • 當學會語法後,如果對流程熟悉,就可以寫一些小工具提高流程了,MEL,Python都可以完成這個工作。畢竟替代手工的操作是不出力都能討好的。只要學會for和while就能省很多的工作量。
  • 深入語法,開始了API級別。這時候就可以做一些script做不了的事情了,因為通過API用到的往往是C和C++,和軟體本身是無關的,這就突破了軟體的限制。
  • 開始數學層面的東西。其實學了程式設計之後就會知道,難的不是語法,而是演算法。只要程式碼量到了一定程度,會發現只要有想法都是可以實現的,但這個“只要”的難度和你想寫出的東西的偉大程度正相關。如果想寫個helloworld那是很容易的,但如果想把FLIP整合進Maya那就有的學有的寫了。但學會了之後就是可實現的。
結論:程式設計幾乎是萬能的,不會限制你的想法,但對個人來說最終的結果往往受限於自身。

最重要的,該如何學呢?

希望讀者看這一行的時候不是跳過來看的,前面所寫字字手打不易無廢話空話,還望細讀。 那既然看到這一行,我假設是這樣的讀者:
  • 自己已經明白自己能搞定程式設計。
  • 自己明白自己為什麼要程式設計。
  • 自己明白程式設計的限制在哪裡。
然後我針對兩部分人以我的看法提供兩種學習路子:

速成流

往往而言急於求成是不妥當的,但是對工作的人來講,如果自己不打算以後靠寫程式碼吃飯,而且平時工作較忙,去深入程式設計其實必要性不大。這時候有一套專門適合他們的路線——Script。 Script,即指令碼,Maya中有Mel,Houdini以前用hscript,現在幾乎所有的CG軟體都有了一個統一的script平臺叫Python。這是一門一度讓我爽到不行的語言。因為有C的基礎,學習只需要4小時左右,而用的時候發現這4個小時是我學習過程中價效比最高的4個小時。所以我極力推薦想速成的同學學Python。 學習也很簡單,兩斤沉的Python寶典大可扔一邊,直接看《Python簡明教程》即可。 學會之後就爽了,比如Maya中有python模組可以呼叫Maya.cmds,而且有pymel深度整合,接著搞下去用openMaya寫Node都不成問題,可以說在這個方面python模糊了外掛和指令碼的定義。過去專門有人戴著把指令碼說成外掛的人調戲,現在不同了,用python寫的node和cmd該叫外掛還是指令碼?我不知道,這問題討論意義也不大,但Python的強大是無可爭議的。 當然,Python是一門語言,僅此而已,想要做點事情就要去啃對應的文件,比如和Maya配合著用,當指令碼用需要了解mel的命令,所以學了mel的同學在這裡可以暗爽一下,因為學了的不會白學的。和Houdini配合著用需要了解hou模組,想寫流行的UI需要PyQt諸如此類。

深入流

這條路對於學生而言比較合適,對於鐵了心要把寫程式碼當成以後道路的執著孩子也是必須的,因為你不可能把速成來的東西當飯碗,想要牛還是要穩紮穩打。 對於這部分有時間有經歷有想法有信念的孩子我推薦:先從C開始。 C處在人類語言和機器語言之間最和諧的位置,既不像彙編一樣低階底層,又比Java等能讓編寫的人有更多瞭解底層的機會。 會了C,再學Mel或者Python那就是幾個小時的事兒。 會了C,CG搞不好咱們去搞微控制器程式設計照樣行。 會了C,就滿足了C++的基礎,而會了C++,其他面向物件程式語言就是幾個小時的事兒。 會了C其樂無窮啊! 我最開始接觸的語言是basic,最開始學c的時候感覺c好難,basic一個print可以解決的事情c要用printf,多打一個字母不說後面有複雜的格式表,於是對C產生了恐懼。後來學C的過程發現,C真的是一門非常優秀的語言,效率奇高,語法嚴謹,這也解釋了為什麼C可以從誕生之初開始屹立40年經久不衰。因為它毫無累贅,在這個量級上幾乎是完美的。 事實上光C一個語言就足以寫成包括你現在的電腦執行著的OS和看到的瀏覽器在內的所有的東西。C是不限制的,限制的還是用的人有料沒料。 大多書CG軟體都用的C++作為開發工具,而從語言上講C是C++的真子集,換人話講就是可以看成C++是C的昇華版(為防挑刺說一句:當然只是可以這麼看而已,C++和C本質上是兩門語言)。 學了C/C++之後,就如同練就了易筋經,因為語言大同,會了這兩門其他的只要不是類似brainfuckwhitespace這種bt小眾語言,那基本是走兩招就會。

動手吧,別停

這篇文章旨在用人話告訴對程式設計一無所知卻盲目或者理性的熱愛的CG同學。 如果你鐵了心要開始,好好堅持吧,付出的不一定會在1個小時後立馬獲得回報,但還是那句話,以年為尺度的時候,多學的人總是不會吃虧的喲~~大笑