几周之前,华姐问我怎么学习编程,因为她如果会写lua脚本的话,那么有很多事情就不需要再找我们这些程序来问了,日常工作会更快更好的完成。当时把我问愣了,我的第一反应是从计算机体系结构开始,但是我立马认识到这不是她想要的,然后我又回想了自己的编程之路,大学才开始系统的学习计算机知识,首先好像是学习计算机的历史啊,然后是C语言啊,然后是数据结构算法,汇编,数字逻辑等等。。。。。。但我觉得这也不是她想要的。那她应该如何学习编程呢?又或者说学习编程是学习什么呢?
我学了4年的程序,看过各种专业书籍,动手写过没有10W也有5W行的代码,也和一些牛人有过接触,喜欢看技术大拿的博客,崇拜国外的先驱,对图灵奖充满向往。那么我认为学习编程是学习哪些东西呢?
回想一下我编程的时候:
1、首先我需要确定使用的编程语言,比如C或者C++或者是lua等等;
2、然后我需要设计这个程序该怎么写,使用什么数据结构,运用那些算法,使用什么框架,又或者套用哪个模式,判断哪里有瓶颈,然后进行优化等等;
3、接着我需要把我的程序写下来,用记事本或者是某个IDE或者是纸上等等;
4、最后当一切完成了,我需要运行我的程序,可能是自己用一个编译器或者是解释程序跑一下,或者是把代码提交到公司的版本库,等下一个版本出来的时候运行一下,又或者是自己编译了,挂到现有的稳定版本包外重载一下,然后运行。
如果没有出问题,就一切OK,如果出了问题,可能要恢复到步骤2,3有时甚至是1来再次开始,这是个迭代的过程。
如果只看具体的编程过程,那么大致可以简单的划分为上面4个步骤。我把上述4个步骤进行了一下归纳,那么编程的过程就清晰起来了:
1、语言
首先编程需要学习一门语言,这点很好理解,因为你要与英国人打交道就需要学习英语一样。但是这里的语言不要简单的理解为计算机语言,也有可能只是怎么操作一台机器,或者是怎么进行输入输出,甚至是怎么使用google。为什么这么说呢?因为就算是和英国人打交道,你也不一样需要学习英语,你有很多其他方法可以达到同样的目的,比如你请一个翻译;或者是让英国人学习汉语;或者是使用google,让他写下来翻译给你,然后你写下来翻译给他;最不济的其实你们使用面部表情和手语再加上一些肢体语言,也可以达到交流的目的,毕竟人是有灵性的动物,既然你和你家的狗都可以交流,为什么你不能和一个英国人交流呢?
那学习什么语言呢?这又是一个纠结的问题,因为世界上有这么多编程语言,就仿佛世界上有这么多说不同语言的国家一样,我认为原则是什么呢?就和你选择学习英语而不是学习希伯来文一样,如果你要用到就去学,不用就不学。这话有点功利,但是对一个策划来说,应该可以。当然,作为一个目标是图灵奖的程序来说,闲暇时间多学习其他语言的特性是有百利而无一害的。就仿佛一个语言学家,平时也会专研各种不同的语言一样。
怎么学呢?这个还真不好回答,因为每种语言都有自己的特点,就好像英语可以通过不停的说或者写来强化,而有些特殊的语言简直就一堆乱码。。。(这里为了不伤害某些语言,我还是不说出来了。。)以前我也问过别人这个问题,得到的答案各不相同,其中有几个还是万金油似得答案,就是多用自然就会了。起先我也觉得是这么个道理,就像学英语一样,多说多练自然就形成了语感,但是等学的多了,我就发现,计算机语言的设计其中有一部分就是为了去学习它的,不然也不会设计的如此巧妙,如果有设计学习的思考在里面,那么一定有一些方法可循。现在我给出的建议是看那些跟你同水平的人是怎么学的,然后总结一下,设计一个自己的学习方法。
2、我把步骤二中间这么多的内容和等等概括成为数据结构和算法(希望被前辈和同行看到不要喷,我也是偷懒用一个大家都喜欢的词)
语言有了,接下来就是用这个语言来实现我们要做的事情了,就好像你学了英语的基本语法和词法,接下去就需要用他们来组织一篇论文,或者是进行一场辩论。如果语言学的好,那么这里就发现特殊句式手到擒来,或者是不费吹灰之力把对方辩友说得云里雾里,摸不这边际。如果语言没有学好,那么这里就会感到艰涩难行,词句生搬硬套,绝对是糟糕透顶的文章,最后被冠以Chinglish,所以第一步一定要学好。第二步,如何设计程序的数据结构和算法呢?我没有能力也没有资格谈论这个问题,还是@各种大牛吧。想知道这个问题的答案,自己去找吧。坛子之前在说的“没有兴趣就别学编程”就是指这方面,当然,如果只是为了看明白代码,不去追究为什么,学习语言已经足够了。
3、上述的步骤3和步骤4,很少有人提及,即使提及也是一笔带过,比如学习编译器啊,学习一款软件等等。但是我觉得这也是学习编程比较大的一块,我把它概括为环境。
我这里说的环境包括了编辑环境,编译环境,运行环境,调试环境等等。总之就是如何让你的程序跑起来。记得在大学的时候,怎么让程序跑起来是一件非常头疼的事情,因为大学里的一些课程设计或者是大作业使用的环境都非常的原始,有的时候为了让一个只有十几行的简单代码跑起来却要花一个下午的时间来搭配环境,而且因为环境是最不被重视的,所以在这方面经常出现问题。我觉得应该正视这个必须学习的部分,对于不同的语言,尽量设计的是跨环境的,但是最后发现环境都会有差别,更何况不同的工作呢。
从一开始你接触编程就和环境挂钩了,你看到的书里,或者是别人指导你,首先都会让你去装一个XXX。这已经是一个比较大的步骤了,因为装完了,你必须要学会怎么去用它,而怎么用好他就仿佛是一个没有答案的问题了,因为好多情况下,你发现最终你还是卸载了XXX,因为它并不适合你,你需要找到自己喜欢的环境,或者是与工作对应的环境。记得刚进公司的时候,我问过严总,用什么环境来开发,严总给我发了3个软件,一个编辑器,一个资源管理器,还有一个连接linux的小工具。到现在,这3个软件全部被我卸载了。编译环境就更加复杂了,记得大学里写了一个linux下的程序,用到了某些系统库,结果发现当前版本的linux居然不包括这些库,又或者是库有所修改,程序就跑不起来。几周前,我听到李大师说他现在已经不用gcc来编译了,说gcc已经编不过他写的程序了,我顿生感叹,尼玛要是没有这么多环境多好。但现实是残酷的,或者是稳步前进的,虽然全世界的程序员一直在逐步改进这些问题,但是现状是还得学习。之前我推荐的Bret Victor的一个视频http://v.youku.com/v_show/id_XMzUyOTIyNzg0.html和后来他写的一篇文章http://worrydream.com/LearnableProgramming/(中文翻译:http://chengyichao.info/learnable-programming/)其实一直在谈的就是这个环境的问题,非常酷,还是建议看一眼。可以不求甚解,但是要好。
还要认识到的是学习环境有可能比学习语言或者是算法还要漫长,因为他的内容更加繁杂,不像语言设计出来就设计了,之后的更新却没有多少新内容,如果有大多数情况下就出了另一门新的语言,又或者是数据结构和算法,你会发现数据结构和算法的书,十年前和现在基本没有区别,还是那些结构,那些算法,顶多是换了个名字,换了规模,换了实现方式而已。但是环境却是真正的与时俱进。当你还在啃UNIX环境高级编程的时候,就发现Windows环境高级编程也很厚;当你终于弄清这个类库的使用方法的时候,新的类库已经取代了它;当你还在使用vs2005的时候,vs2012已经开始流行;当你用着android开发的时候,你会去想ios下的开发是不是更好呢?当你笃定手机平台将一统江湖的时候,在世界的某个角落,已经有一帮人开始思考创造出一个新的东西代替这劳什子的砖头了。我只能说,编程就是一个与时俱进的过程,拥抱变化是最佳的对策。
至此我该说的都说了, 本来没打算写这么多的,看来估计你是看不到这句话了。