很多同行打算学编程,以为编程是技术的最深奥义,但是一个是这个想法有没有跑偏,另一个是学了很久还是不得其门而入,越学越困惑,这很正常,编程不像建模一样直接(当然直接不等于简单),看到的就摆在那里了,所以学起来不能那么直接的看到效果就知道底层的实现,另一个就是即便是拿到源代码,算法不理解照样是看不懂的。所以学习的方法非常重要,如果越学越困惑,那肯定是方法出了问题。在这里把我的一些思考写在这里,希望能对想学编程的孩子有所帮助。一家之言,姑妄听之哟~~



据说编程写错一个标点都不行,编程这么难吗?

这句大实话是很常见的,的确写错一个标点都不行,不但写错不行,就连少写多写大小写没搞好都往往会导致失败。 还有另一个大实话,就是说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++之后,就如同练就了易筋经,因为语言大同,会了这两门其他的只要不是类似 brainfuck和 whitespace这种bt小众语言,那基本是走两招就会。

动手吧,别停

这篇文章旨在用人话告诉对编程一无所知却盲目或者理性的热爱的CG同学。 如果你铁了心要开始,好好坚持吧,付出的不一定会在1个小时后立马获得回报,但还是那句话,以年为尺度的时候,多学的人总是不会吃亏的哟~~

更多推荐

CG行业如何学编程:献给想要学编程的CG孩