如何学习编程(一):入门
本篇将是一个系列,重点讲述在外力很少的情况下如何自学编程,以及需要注意的一些地方。
一般来说,一些所谓的『高手』或者老师会告诉人们算法是非常非常重要以至于会不会算法就是你会不会编程的唯一标准。不过事实上并非如此。掌握算法固然是好,只是大部分程序并不需要高深的算法,而且招人的时候仅仅要求会算法的公司也是很少的(而且很难进)。我并不是学院派的人,所以虽然我本人也推崇学习算法,但并不推崇一开始就学习算法。
刚开始学编程的人总是不知道自己应该从哪里入手。实际上这是一个相当重要的问题。在我看来,学好变成有若干条件:
·兴趣
·数学/英语
·财力
首先谈一谈兴趣。那些为了生计而寻找捷径学习编程的人并不在本篇的考虑范围之内,这些人我通常是不管的。兴趣是非常重要的一个条件,但是兴趣也是可以培养的。对编程的浓厚兴趣可以让自己自发地寻找各种各样的书籍、发现自己知识结构上的弱点、跟同行有效地进行交流等等。那些没有兴趣的人遇到了一个问题只会上论坛或者QQ群上要代码(而且多数脾气暴躁)。
数学和英语在一开始并没有什么影响,但是在你学有所成之后,开始接触复杂的内容的时候,数学能力就开始起作用了。很多计算机论文都是使用数学语言写的,对数学没有热情或者不够敏感的人将会很难跨过这个门槛学习一些书本上没有的东西。英语同样也是重要的,因为并不是所有的文章或书籍都会翻译成中文,或者及时翻译成中文。
财力并不是重点,不过至少在养活自己的同时要有闲散资金来不停地支付网络费用、书籍、电脑、外围设备等必须物品。
至于知识结构方面我个人的见解可能跟流行的观点有所出入。目前人们总是把知识结构比喻为一个金字塔,最下面是基础,上面一层一层更加深入而且更加专业的知识,最上是领域知识。老师们会说要学好基础,首先学好语言和算法,然后慢慢往上走。我自己并不这么认为。个人认为『从左到右』的学习方法是更加有效而且不会错过什么东西的,只是不能速成。
从左到右是什么意思呢?想象一个金字塔,最左边仍然是最底层的【基础】,再往左就涉及到更多的【基础】以及更多的上层内容了。这样一步一步下去就会有【基础】--【上层】--【基础】--【上层】这样的不断循环。这么做的好处是成果快,能够培养起兴趣和成就感,而且基础随着应用的需要慢慢积累,等到学有所成的时候,基础也覆盖完了,上层的东西也看得差不多了,就可以超越金字塔自己翱翔了。
好了,那么如何培养兴趣呢?
人总是对有趣的东西比较感兴趣的,而且这种东西如果不难入门的话,那么接受起来更加容易,跟容易培养成就感,也就更有兴趣了。根据实际情况,个人推荐刚开始接触的时候应该学习C#,理由如下:
·C#的书籍非常多,语言内核简单易懂,类库丰富
·C#制作界面简单
·C#屏蔽了有关操作系统和底层的大部分事情,可以让学习的人专注于自己感兴趣的内容
如果不是特别着急的话,一开始就对着C/C++的数组啊指针啊什么乱七八糟的东西我觉得没什么必要,反正将来自然就知道了。我在这里推荐C#的另一个重要原因是Microsoft Visual Studio .NET的C#编辑器有一个无敌美好的提示列表(按了一个“.”之后弹出来的),这对于初学者来说是相当好的一个工具。
一开始学习C#的时候应该首先掌握基本的少量语法,也就是说掌握条件语句、分支语句、函数声明以及数组,外加少量库的运用以及计算上的知识。然后开始学习制作界面,最后学GDI+。
学习GDI+是有很多好处的。不过在学习之前应该找本相关的书来看。GDI+有一些比较高级的功能如半透明效果和画刷等等,容易组合出一些非常漂亮的图形来。学会GDI+的基本操作之后,就可以慢慢接触一些图形滤镜、分形、三维的内容了。使用平面工具绘制简单的三维图形是一件非常有意思的事情,而且非常锻炼数学能力,所得到的效果也是『令人震撼』的。
随后应该学习字符串处理。典型的字符串处理有分析INI文件、对一个四则运算式子进行操作等等的内容。虽然C#处理器字符串出来比C++稍微蹩脚一点,不过在这个时候忽略这个问题是相当有用的,至少不用陷入无穷的指针漩涡里面去。
等图形和字符串都少有涉猎之后,就可以开始开发有趣的程序了。譬如用C#些动画、开发画函数图的工具、自己设计一种高度简化的HTML然后进行渲染制作自己的帮助程序、或者开发简单的图像处理软件之类。稍微聪明一点的人,如果每天都有机会写很多代码的话,大概半年到一年就可以走到这里了。
为什么我会选择图形和字符串两种东西呢?为了培养兴趣,首先要有成就感。图形跟字符串都是跟操作系统本身没关系的东西,而且操作起来也没什么注意事项,因此入门比较简单。如果渐渐深入的话会激发起学习数据结构、算法、甚至是数学英语的热情。如果可以使用这条主线贯穿整个编程的初级阶段的话,得到的将会是扎实的基础以及灵活的头脑。
好了,今天就先说到这里。下次再写续篇。在此解答一下大家有可能提出来的疑问。
·数据库和网络都很热门,要不要学呢?
--这两门技术掌握了也是很好的一件事情,而且作为入门的话也未尝不可。只是如果一开始就往数据库和网络的路走的话,将来可能会错过一些学习操作系统底层以及复杂的算法的机会,因为这两种东西不会让你有学习大部分有深度的知识的动力。
·算法为什么不一开始学习呢?
--学会了算法,但是没有有趣问题给你解决的话,那学来干什么?而且学习算法的最终目的是让自己拥有设计算法的能力,很多人都忽略了这一点。
·学会了GDI+和字符串之后能不能找工作呢?
--不能。做人切勿急躁,学编程没有个三五年还是不要把自己看得太厉害的好。
·接下来应该学习什么样的东西呢?