成长轨迹:写给编程初学者

来源:互联网 发布:时时彩源码出售teafly 编辑:程序博客网 时间:2024/05/17 04:48

本文面向的读者:刚接触计算机编程的朋友、学了一段时间的编程但是感觉仍然在门外排徊的朋友,通常这些朋友都没有足够编程的经验。

本文假设读者是正真对计算机科学感兴趣而想要知其所以然的学,如果你学编程只是为了就业或者通过各种乱七八糟的考试,我仍然欢迎你,但是不保证我的观点一点适合你。
PS:老师在集体面前讲的观点一般是针对后一种情况的朋友,与你面对面交流的观点一般才是你更应该考虑的。当然这个因学校而异、因老师而异。

但是有一点凌驾与所有之上,那就是,本文假设读者不迷信老师,敢于跳出教育的束缚。其他朋友我也仍然欢迎你继续阅读本文,但是不保证我的观点一点适合你。

对于高手,我则恳请你能指出我的认知错误或给出其他建议。谢谢!
PS:本文只从纯技术角度讨论。

言归正传

       很多人认为“编程”就是“软件开发”,广义上的理解确实没错,但是“编程”其实是所有跟计算机有关行业的基础或必修课,“软件开发”跟它的相关程度最高,但是“编程”绝非单纯为“软件开发”而生,系统/网络管理员需要编程(windows 批处理脚本、Unix shell脚本等,随心所欲指挥操作系统),媒体工作者需要编程(动画特效,绚吧?),甚至办公工作者也可能需要编程(word宏,可以用自己的方式保护 word文档),玩游戏的需不需要?wow似乎也有宏功能的吧!可见编程并非什么神秘的事,在计算机行业太普遍了!

PS:在很多时候,“编程语言”和“计算机命令”的界限很模糊,因此在事实允许的前提下本文将它们都归为“编程”。

相关话题

1.什么是编程语言
       说白了就是计算机能理解的语言,通常都有很严格很详细的语法规则和语义说明。将你的思维翻译成计算机能理解的语言的过程就是“编程”,当然这个过程也可能超越“编程”,比如“软件开发”所做的一系列看似跟“编码”无关的事。本文所指“编程”仅仅是指“编码”。

2.关于编程语言之间的论战
       网络上见得比较多的是关于“编程语言谁好谁坏”的争论。这肯定是没有结果的,所以这个工作抛给那些语言的发明者去吧,至少他比任何人都有发言权。初学者尤其不要涉入,与之相关的就是尽量远离这些争论的地方,比如论坛的辩论帖、争论性邮件列表。初学者请教相关话题是正常的,但不巧的是碰到一个自命不凡的高手,他会向你滔滔不绝“这个不好那个不好,你要怎么样怎么样”,请勿迷信,你应该再去请教一些其他人,但是无论是谁,请确保你了解你所请教之人,这个了解至少来自两个方面,他在他所说话题的领域确实有所感悟,他敢于对他所说的话负责。收集了一部分过来人的建议,你就可以开始选择了。

3.如何选择编程语言
       其实这个问题很难给出定论,因为我不知道各位朋友的兴趣是什么,因此这里仅说明一些需要注意的地方。具体的选择渗透到其他相关话题中。
       呵呵,我本人接触过的语言还是比较多的,如Shell、Basic(不仅仅是VB)、C/C++、ActionScript、php、python、 prolog等。广泛接触之后的感触就是:没有完全相同的两门语言──没有思维方式完全相同的两门语言,任何语言它既然还存在,就必有它擅长的地方,当然也有不擅长的地方。网络上也有所谓“编程语言排行榜”的东西,个人认为那个无关痛痒,毕竟很多历史和社会原因导致一部分人只能选用一部分语言。其针对的应用领域也影响了其在排行榜上的位置。

4.如何学习编程
       这又是一个比较宽泛的话题。因此本话题的讨论将一直贯穿在其他相关话题中。
编程语言种类繁多,语法和语义都千差万别,但是归根到底你都是在“编程”。因此可以有两种方式学习:
a、广泛接触多种语言,然后在这些语言中领悟“编程”,也即由具体到抽象。这样的一个好处是你可以根据你的兴趣来选择语言继续深入下去。我选择的就是这种方式,因为我最初接触编程是在初二,直到高中毕业都是一个人孤军奋战,没人交流,没法上网,当然也就没人告诉我“如何选择编程语言”以及“如何学习”了。呵呵,这也是我写此文的信心来源。当然这个代价就是在目标路线上走了太多的弯路,浪费了太多的时间。因此,如果你看到此文时已经是在校大学生的话,我认为你是没有那么多时间采用这种方式学习了。如果你还未到达上大学的年龄,我建议你可以考虑考虑这个方式,但是真的不希望大家这样做,我放弃了高考,你家长愿意吗?
b、从与语言无关的角度开始学,这样你就不用急着选择语言了,同时由于没有语法等语言本身元素的干扰,更可以让你的精力集中在领悟“编程” 上,这样一来,你可以很快速的使用任何语言。因为对你而言它们只是语法上的区别。但是这个过程相当的枯燥乏味,没有成就感。呵呵,其实在没有计算机的岁月了,与我相伴的就是文曲星,其他语言我只能在纸上写。看似写了几本硬面抄,其实都没什么,但是我庆幸我确实领悟到了“编程”,以至于我现在可以快速上手任何语言。因此如果你不是真的对编程感兴趣,就不要用此方法来浪费时间了。不过你可以尝试一段时间,大一的新生不都不允许带电脑吗?
综上所述,似乎还是得解决“如何选择编程语言”的问题。

5.计算机等级考试或编程等级考试的意义何在
       我个人认为证书不是目的,因为这样的考试试卷是在很没水准,哦,说明一下,我现在大三,但是单从考试上已经是网络工程师、软件设计师和Java工程师了,至少达到了这个水平(本人任何考试都不专程准备,更不会去做模拟题浪费时间的)。那为什么学校还是鼓励学生去参加呢?这个理由,个人认为只有一个,那就是你为它准备的过程,这个过程中你会广泛的接触到跟计算机有关的方方面面,这样一来你就可以更好的判断你真正感兴趣的地方了,你的主攻方向将从这里确立。方向定好了,也就解决了“如何选择编程语言”的问题。继而可以在“如何学习编程语言”中提到的两种方法中做折衷选择。
编程语言发展到现在,应用领域的界限已经很模糊了。第一次学习编程就选择一门,不要图多。

6.学编程到底学什么
       相信大多数读者都是喜欢看武侠小说的,也都知道高手比得都是内功而不是招式。学编程同样的也是学内功,不同的语言则是不同的招式。编程语言的内功即是编程思想,也就是上面提到的”对编程的领悟“。然而这个对编程的领悟却又是与语言无关的。看上去很矛盾,其实一点也不矛盾。因为我们谈的一直都是”编程“而非 ”编程语言“,换句话说,拘泥于语言角度的学习是没有”领悟“意义的,但是却又确实存在着很多的语言。事实上,”编程思想“已经在不同程度上融入到”编程语言“中去了,而这一体现,便是语言本身的”优点“和”缺点“,要不然何以区分一门语言?看似有怂恿大家参与语言论战的嫌疑,其实不是,这是一种批判性的思维方式(详见这里)。而且对于一个研究编程语言的人,我觉得缺点比优点更重要。另外值得一提的是,在编程思想的指导下,每一门语言又都有自己独特的思维方式,说白了就是这门语言是如何呈现其所具备的思想的,而这主要是由“语言特性”所表达,区别于优点和缺点的另一维度
同样这也是一种选择编程语言的指导方针,即当你已经很熟悉一门语言而想再接触一门其他语言的时候,尽量选择不同思维方式的语言。这样使得在同样的时间里,你解决问题的思路会比其他人更为宽广。
       值得一提的是,很多的语言都有一系列乱七八糟的框架,这个典型代表就是java,这里我不多说什么,就一句”对于高手,框架是神兵利器;对于新手,框架绝对是绊脚石“。别忘了,框架本身只是一系列思想和语言特性的集合,它之所以存在就是为了提高后人的开发效率,因此后人在使用时更多的是在配置环境和调用API,而不是在学编程思想和语言特性,你会使用、并能领悟框架的思想最好,但这决不是首要的,更不是绝对必须的。

7.如何快速入门具体的编程语言
       好了,上面废话一堆,终于可以自己写程序了。呵呵,到了这里,相信大家都已经选好了自己的入门语言,接下来怎么办。看书呗,市场上关于计算机编程方面的书太多了。这里我的观点是,既然是初学者,理应任何一本书都是可以的,至少它能让你对你所学的语言有个全局的把握。这一点很重要,如果你还没有关注过某个语言,上来就问别人我该怎么去学,试问你如何判断他所讲内容的正确性?这点请参考上面的“关于编程语言之间的论战”一节。每个人都是带着有色眼镜来看世界的,不同的只是对这个眼镜的认知不同,于是造成了众人对事实的偏差也是不同的。这也是我在本文尽量回避具体语言的原因所在。其实,我看的第一本书就是很垃圾的,居然后来还又沿着这个系列买下去,包括VB、C/C++、Java和Word。但是即便是这样的垃圾书,它陪伴了我的高一和高二,但是我那时悟出了面向过程和面向对象的编程思想,这样最直接的好处是我在高三就能够看懂《Java编程思想》和《Java与模式》这样被广泛认为初学者不宜直接看的书。事实上,很多大学生都会报怨为什么作者要把简单的东西讲复杂了。网上有很多免费电子书可以下载,当你看完一本书后自然就知道接下来该怎么选择进阶读物了。
       说到看书,这里我觉得,你必须认认真真仔仔细细地看完至少一本书(这里指经典的书),甚至包括正文以外的内容。我这样讲是因为我上课没有及时预习和复习的习惯,所以老师讲什么我都不知道,后来我看书了才发现原来很多疑问书上就有解释(也许不是直接的)。这又涉及到一个思维的转变,你是“等着别人来告诉你”还是“自己去寻找答案 ”,这也是关于“他教”和“自学”的抉择。人都是被逼的,有老师教的话,学生便会在潜意识里依赖老师,只样的典型表现就是完成老师布置的作业后就不知道要干什么了,当然预习和复习会越来越不及时。反过来,如果你是自学,并且认真的看书的话,你会发现越学越有趣,越看越想往下看,等到你想要自己动手做点什么的时候恭喜你,你已经比其他人离成功更近了。领悟一本书比阅读十本书更有效,只要时间允许,请尽量继续阅读
PS:建议在选书时尽量少选那些教科书类的,通常有价值的东西不多。另外提一下,学C语言,老师会推荐你潭浩强的,但是我却不以为然,因为非计算机专业也大多用那本书做教材,太过教学性质,对你基本没什么用。我推荐你《C语言的科学和艺术》,它使你更像一位程序员,除了基础知识外还引导你关于软件开发的基本规范和思路。
PS:知识的来源不仅仅是书,有事没事多翻翻软件的帮助手册很多书的由来就是这些手册,因为作者知道很多初学者不喜欢甚至不知道看联机帮助
PS:与人交流也是一方面,只不过,你是兴趣驱动型的,你周围这样的同学或同事在国内可能并不多,也许交流上很有隔阂。网络是个好东西,但是互联网就像浪潮,它将淹没那些还不会游泳的人

8.开发环境的选择
       在正式写程序之前,务必请先了解所选语言的规范,然后严格按照语言规范来写。
       “编程"是不可能光靠看来学的。最好书上的例子能合上书本写出来。说到写程序当然就包括如何选择编写环境了。理论上,几乎所有的语言都提供了最基本的开发方式,便是”记事本+编译器或其他工具“的方式。这也是任何一本编程方面的书都会首先讲的。它的优点是将你的错误毫不保留的暴露给你,包括各类细节。缺点是开发效率很低甚至有人说成是浪费时间。弥补其缺点的就是一些高级IDE(集成开发环境),使用它,你就只需要写代码,甚至代码都不需要写就可以达到编程的目的。我承认,从工作或软件开发这样将讲究时间的环境里──通常时间是被换算成工资的──文本方式的开发确实不应当是首选。但是正如本文一开时就强调的,本文面向的是对编程真正感兴趣的人,而不仅仅是将它当成饭碗。呵呵,我自己就一直坚持前一种开发方式,自从我尝试它并且熟悉之后,高级IDE已经被我扔掉了。顺便说一句,高级黑客也都是用这样的方式写程序哦。再举个例子,如果你学C#,老师会让你们用Visual Studio,这个强大的工具是微软的,它是怎么来的?微软的员工用Visual Studio 2003开发Visual Studio 2005吗?当然不是,他们也是用文本方式开发的。只是采用文本方式开发还需要花额外的代价,比如适应它,学习与之相关的工具的命令行使用方式等。不过我还是推荐大家采用文本方式编程。嗯,加油!
PS:其实说起来,用IDE和上文提到的用乱七八糟的框架还是有很多相似的地方的。对于追求境界的人,还是循序渐进的比较好。

9.实践源于何处
        呵呵,我本人的观点是”边用边学“,而不是”先学再用“,当然前提是你得知道你”能做什么“以及”如何去做“。至少在遇到问题时能在第一时间找到解决方法的途径。这种能力比你单纯像默写一样的实现功能有价值的多。
        一方面学校会提供课程设计项目,但是如果你觉得那个没有价值(通常就是如此),那就干脆pass掉。学校的项目一般都是把同样的课题一届一届的传下来,这样也就没什么意思了,上网一搜到处都是,大多也仅仅是恰好满足要求。所以自己给自己提需求,不过注意,这里的“需求”是有前提的,绝非那种“书上有个例子,我做出来”就行的那种。这里的需求本着对自己有实际应用价值为前提,你不是想研究计算机吗?那好,机会来了,你安装的软件都是通用的,何不自己写些小程序来帮助你完成一些事情,比如管理你的电子书。虽说都有现成的,不必重造车轮,但是你现在是在学编程,不是学计算机操作,这是自己给自己找的实践机会,为什么不大胆的尝试呢?我选择的是这种方式。
       另一方面,网络资源非常丰富,你即可以寻求知识,又可以获得实践,有很多网站都有项目竞标的功能,你不一定要竞到标,大可选择自己能做的项目来做做。当然如果有钱的话会更有动力点。只是切记,切不可太多功利性,你现在缺少的更多的是经验不是金钱
       第三方面,自己申请免修或逃课去找相关的工作做做。是的,逃课,不逃课的学生不是好学生(乱逃课的学生也不是好学生)。但是找工作这样的事,我的观点是如果前两种情况你有实践来源了的话尽量不要选第三种。因为学习的时间和机会都有限,公司可不会白白给你自我修新的时间!感受一下它的氛围,但是不要被填鸭!

10.结束语
       上面啰嗦了半天。感觉是思路很乱,也不知道对各位朋友是否有帮助。呵呵,我也不保证我有没有误人子弟,而且计算机行业的一切发展都很快,人类本身就又具备很强的适应能力,也许在各位在看本文时行业早就跟本文所讲大不相同,所以对于所有的读者朋友都请认真思考后再做决定是否参考本文。(相关连接)

Enjoy It!