随笔-341  评论-2670  文章-0  trackbacks-0

    终于还是要写这种文章了。期末考试将至,写大程序没时间,写小程序没动力,只要演变成写文章了。之前的两篇字符串处理写完了仍然不过瘾,打算继续写关于递归下降法和LALR的事。后来想想还是暂时写写关于如何学习编程的好,毕竟这个问题对大家来说更加有益。

    本篇将是一个系列,重点讲述在外力很少的情况下如何自学编程,以及需要注意的一些地方。

    一般来说,一些所谓的『高手』或者老师会告诉人们算法是非常非常重要以至于会不会算法就是你会不会编程的唯一标准。不过事实上并非如此。掌握算法固然是好,只是大部分程序并不需要高深的算法,而且招人的时候仅仅要求会算法的公司也是很少的(而且很难进)。我并不是学院派的人,所以虽然我本人也推崇学习算法,但并不推崇一开始就学习算法。

    刚开始学编程的人总是不知道自己应该从哪里入手。实际上这是一个相当重要的问题。在我看来,学好变成有若干条件:
    ·兴趣
    ·数学/英语
    ·财力

    首先谈一谈兴趣。那些为了生计而寻找捷径学习编程的人并不在本篇的考虑范围之内,这些人我通常是不管的。兴趣是非常重要的一个条件,但是兴趣也是可以培养的。对编程的浓厚兴趣可以让自己自发地寻找各种各样的书籍、发现自己知识结构上的弱点、跟同行有效地进行交流等等。那些没有兴趣的人遇到了一个问题只会上论坛或者QQ群上要代码(而且多数脾气暴躁)。

    数学和英语在一开始并没有什么影响,但是在你学有所成之后,开始接触复杂的内容的时候,数学能力就开始起作用了。很多计算机论文都是使用数学语言写的,对数学没有热情或者不够敏感的人将会很难跨过这个门槛学习一些书本上没有的东西。英语同样也是重要的,因为并不是所有的文章或书籍都会翻译成中文,或者及时翻译成中文。

    财力并不是重点,不过至少在养活自己的同时要有闲散资金来不停地支付网络费用、书籍、电脑、外围设备等必须物品。


    至于知识结构方面我个人的见解可能跟流行的观点有所出入。目前人们总是把知识结构比喻为一个金字塔,最下面是基础,上面一层一层更加深入而且更加专业的知识,最上是领域知识。老师们会说要学好基础,首先学好语言和算法,然后慢慢往上走。我自己并不这么认为。个人认为『从左到右』的学习方法是更加有效而且不会错过什么东西的,只是不能速成。

    从左到右是什么意思呢?想象一个金字塔,最左边仍然是最底层的【基础】,再往左就涉及到更多的【基础】以及更多的上层内容了。这样一步一步下去就会有【基础】--【上层】--【基础】--【上层】这样的不断循环。这么做的好处是成果快,能够培养起兴趣和成就感,而且基础随着应用的需要慢慢积累,等到学有所成的时候,基础也覆盖完了,上层的东西也看得差不多了,就可以超越金字塔自己翱翔了。

    好了,那么如何培养兴趣呢?

    人总是对有趣的东西比较感兴趣的,而且这种东西如果不难入门的话,那么接受起来更加容易,跟容易培养成就感,也就更有兴趣了。根据实际情况,个人推荐刚开始接触的时候应该学习C#,理由如下:

    ·C#的书籍非常多,语言内核简单易懂,类库丰富
    ·C#制作界面简单
    ·C#屏蔽了有关操作系统和底层的大部分事情,可以让学习的人专注于自己感兴趣的内容

    如果不是特别着急的话,一开始就对着C/C++的数组啊指针啊什么乱七八糟的东西我觉得没什么必要,反正将来自然就知道了。我在这里推荐C#的另一个重要原因是Microsoft Visual Studio .NET的C#编辑器有一个无敌美好的提示列表(按了一个“.”之后弹出来的),这对于初学者来说是相当好的一个工具。

    一开始学习C#的时候应该首先掌握基本的少量语法,也就是说掌握条件语句、分支语句、函数声明以及数组,外加少量库的运用以及计算上的知识。然后开始学习制作界面,最后学GDI+。

    学习GDI+是有很多好处的。不过在学习之前应该找本相关的书来看。GDI+有一些比较高级的功能如半透明效果和画刷等等,容易组合出一些非常漂亮的图形来。学会GDI+的基本操作之后,就可以慢慢接触一些图形滤镜、分形、三维的内容了。使用平面工具绘制简单的三维图形是一件非常有意思的事情,而且非常锻炼数学能力,所得到的效果也是『令人震撼』的。

    随后应该学习字符串处理。典型的字符串处理有分析INI文件、对一个四则运算式子进行操作等等的内容。虽然C#处理器字符串出来比C++稍微蹩脚一点,不过在这个时候忽略这个问题是相当有用的,至少不用陷入无穷的指针漩涡里面去。

    等图形和字符串都少有涉猎之后,就可以开始开发有趣的程序了。譬如用C#些动画、开发画函数图的工具、自己设计一种高度简化的HTML然后进行渲染制作自己的帮助程序、或者开发简单的图像处理软件之类。稍微聪明一点的人,如果每天都有机会写很多代码的话,大概半年到一年就可以走到这里了。

    为什么我会选择图形和字符串两种东西呢?为了培养兴趣,首先要有成就感。图形跟字符串都是跟操作系统本身没关系的东西,而且操作起来也没什么注意事项,因此入门比较简单。如果渐渐深入的话会激发起学习数据结构、算法、甚至是数学英语的热情。如果可以使用这条主线贯穿整个编程的初级阶段的话,得到的将会是扎实的基础以及灵活的头脑。

    好了,今天就先说到这里。下次再写续篇。在此解答一下大家有可能提出来的疑问。

    ·数据库和网络都很热门,要不要学呢?
    --这两门技术掌握了也是很好的一件事情,而且作为入门的话也未尝不可。只是如果一开始就往数据库和网络的路走的话,将来可能会错过一些学习操作系统底层以及复杂的算法的机会,因为这两种东西不会让你有学习大部分有深度的知识的动力。

    ·算法为什么不一开始学习呢?
    --学会了算法,但是没有有趣问题给你解决的话,那学来干什么?而且学习算法的最终目的是让自己拥有设计算法的能力,很多人都忽略了这一点。

    ·学会了GDI+和字符串之后能不能找工作呢?
    --不能。做人切勿急躁,学编程没有个三五年还是不要把自己看得太厉害的好。

    ·接下来应该学习什么样的东西呢?
    --请等待下一篇文章。
posted on 2008-06-06 18:29 陈梓瀚(vczh) 阅读(14394) 评论(33)  编辑 收藏 引用 所属分类: 启示

评论:
# re: 如何学习编程(一) 2008-06-06 18:58 | haskell
我以为学编程最好的方法是一切用程序实现。
比如学数学做个计算器。
学物理做个碰撞检测。
日常操作太麻烦,写个批处理。
文件排版太难看,写个程序格式化一下。
凡是理论上能写的都自己写,绝不用其他工具。
  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 19:07 | ll
全文就一句有用处的话:“学编程没有个三五年还是不要把自己看得太厉害的好”。我改一下,没有实际的写个3,5年系统还是不要把自己看得太厉害的好,当然写个3,5年,会更惶恐,不敢说自己厉害。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 19:55 | sfsd
尽是瞎扯的  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 20:05 | 陈梓瀚(vczh)
不同意见者麻烦给出理由,不要像楼上那样扔下一句话就走。  回复  更多评论
  
# re: 如何学习编程(一)[未登录] 2008-06-06 20:30 | ngaut
谢谢你写的文章,一定会给大家带来一些帮助,我对关于递归下降法和LALR的事比较感兴趣,关于c#作为初学语言,个人觉得不是很合适,还是c比较好,自己无意中就学会了一些数据结构,呵呵  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 20:33 | Don
我感觉,兴趣真是没有那么大作用.
关键在兴趣要持久.大多数人都是振颤几下就不行了.
初学CG的时候,那里面用到的数学能把人的兴趣一下撸到底.  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 20:43 | fengmin
呵呵,不错哈  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 21:04 | Tyeah
编了近十年,感觉没必要编程,发散自己的思维,拓宽自己的眼界,分析身边的事物,然后提取数学模型,至于怎么编,OEM好了~  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 21:11 | Tyeah
数据结构还是要了解的,一个好的数据结构是一个好算法的基础,要知道微软的这些操作系统的核心是win32 api,.net framework只不过是他的封装而已,为的是降低企业级开发的成本,效率自然大打折扣,试想为了屏蔽平台差异性,要做多少与程序无关的工作,效率自然会受到影响。
LINQ的效率要比SQL的效率低3%-5%,就这么一个简单的字符串分析转换都会有那么大的影响,所以,建议在学习编程之前考虑一下自己要做研发还是开发~
是否有魄力尝试颠覆经典~  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 21:11 | 陈梓瀚(vczh)
去年教过一个学生,就是从C++开始的,真是不堪回首啊……虽然后来想尽办法把那个人教上了正道,不过双方花的精力都非常多。还是先用C#练好了思维,然后转过去,这样轻松一点,而且也不会少了什么,还能开阔一下眼界。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 21:14 | 陈梓瀚(vczh)
研发的人少,路子当然不同。不过什么都不会的情况下,这种决定也是很难做出来的。所以还是权当自己开发算了。

不过我自己的确是从CG开始的,刚开始的时候用不了多少数学的,2D无非就是写个矩阵转转罢了。可以当技术看待。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 21:15 | 陈梓瀚(vczh)
至于评论一楼的haskell先生说的话,大部分还是赞同的。写程序需要锻炼,而且在锻炼的同时可以解决问题的话那相当的好。所以造造车轮也无妨,只要不陷进去就行了。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 21:38 | Tyeah
@陈梓瀚(vczh)
程序是人,但人不是程序,他只不过是将我们所生活的这个无限维的非线性的空间线性表示了,但谁都知道,只能近似~  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 21:39 | 陈梓瀚(vczh)
这似乎跟主题无关……  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-06 21:55 | Gohan
完全赞同你的观点,不过学习编程可能还需要不断的想和练,这方面我特懒。
以后会一直向你学习了~  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-07 02:57 | 空明流转
刚刚无聊,用C#做了一个2D的骨骼动画的例子。。。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-08 08:17 | abc
实用,好文章!  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-08 18:09 | kaja
呵呵,向你学习。。。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-09 00:56 | 星雨茫茫
顶一下哦 呵呵 我是从C++开始的 搞了好长时间只知道源程序 也不知道怎么搞界面之类的 弄的自己迷迷糊糊的 还以为学编程就是源程序的呢   回复  更多评论
  
# re: 如何学习编程(一) 2008-06-09 03:40 | 陈梓瀚(vczh)
所以这样会很郁闷滴  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-09 05:18 | Kven
我同意你的说法,因为我也不是学院派的人。
我真的没有认真学过C#,起初我就因为贪玩买下了一本C++的书,
就开始我的编程生涯了。我有一些经历,我现在开始有野心想学多点语言,
可是目前我虽然明白完C++的东西,可是我还没编程到一个我满意的程式。
我想知就是为什么我到现在还对编程那么有兴趣的原因吧!
对了,外加一题:不要因为会一点点而骄傲。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-09 09:29 | 陈梓瀚(vczh)
骄傲没关系,自满就不行了。事实上是这样。

光C++还是能做出很多漂亮的东西的。只是开发应用程序的时候会很烦。一直做库也不是办法,做久也会烦的。如何不烦呢,只好交替做了。

对着字符串对久了,还是想再做做图形。毕竟是老本行啊,看完了图形学的几本书之后由于某个契机就跑去做编译器和虚拟机了,心里还是有点不爽。找个机会把那些东西都实践一次。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-09 20:31 | jx
不错啊,差不多跟你想的一样。不过用java入门也一样,嘿嘿。

还有,学东西贪心真的很麻烦啊,什么都想做,时间又不够。都是兴趣惹的祸。

btw,我说你干吗把博客迁到这来,这样的地方只会时常无缘无故惹来一堆唾沫,原来的地方多清静。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-09 22:41 | 爱好编程
我觉得整个系列文章的每一部分加一个小主题比较好
比如 本文 如何学习编程(一):自学编程  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-10 03:38 | 陈梓瀚(vczh)
根据计划这个系列都是说的自学,因为下一篇要从这个基础上继续往下讲。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-10 04:42 | Kven
我期待着!  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-10 22:55 | 陈梓瀚(vczh)
@jx
我不畏惧泡沫,我也不畏惧反对的声音。
反对的声音是欢迎的,泡沫则是渣,无视之。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-12 01:10 | 求.
楼主全是在扯淡,别人听了你的话会上当不浅,还是等楼主毕业后再说这些事吧  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-12 02:19 | 陈梓瀚(vczh)
还是一样,我希望听到有反对的声音,但是这个声音是要有理由的。举个例子吧,你可以说“不好”,但我想听到“为什么不好”,我不想只看到“不好”。  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-16 18:04 | RichardHe
你去了网龙吗???  回复  更多评论
  
# re: 如何学习编程(一) 2008-06-16 18:31 | 陈梓瀚(vczh)
没有  回复  更多评论
  
# re: 如何学习编程(一) 2008-08-01 23:17 | sinodragon21
为人不识陈梓瀚,不识程序员也枉然。
呵呵。不错,后生可畏。
大多数大学生都中规中距的接受完大学教育,这是一种变相的偷懒。被动的课堂教育之外缺乏积极主动的探索。像Mr.陈这么独辟蹊径、大学期间便能有所作为的大学生真是如数家珍。

推荐一个博客:http://blog.csdn.net/fudan_abc/
你们写的文章读起来都挺舒服。fudan_abc的行文多了几分诙谐幽默。  回复  更多评论
  
# re: 如何学习编程(一) 2009-04-04 05:13 | Sworddance
又一次来师兄这里拜读这篇文章。现在正困扰在学习GDI+当中~~~  回复  更多评论