浅谈编程能力的培养与提高1

         任何科技前进的方向永远都是让更多的人能够更轻松的掌握和使用,因此计算机语言也已经不再是什么高深莫测的天书,很多非计算机专业出身的人都能使用计算机语言来编写程序。无论是一个计算机爱好者,还是一个从事计算机相关行业工作的人,都有可能会使用计算机语言。然而,很多初学者常常为如何培养自己的编程能力以及如何写出优秀的程序而困惑,即使是掌握多门计算机语言,或者某些信息学竞赛的获奖者,再或者是有过一定编程经验的人也都会在达到一定程度后,因为无法再向前走一步而苦恼。计算机程序设计的世界如果缤纷多彩,为什么很多人只能在门外徘徊而苦于无从下手呢?编程的能力和技巧又应当如何培养呢?笔者在此希望从自身的经历谈些看法。
1. 写给编程初学者的话
计算机程序设计的世界瑰丽而多彩,很多人对此都有着浓厚的兴趣。作为一个初学者或许你已经在门外徘徊许久,但仍然不得其法。因此,我希望结合我个人的一些经验,首先为初学者提一些建议和意见。
 
1. 基础扎实真的很重要,什么语言其实不重要
我和我的同龄人应该都算是比较幸运的一代了,活在春风里,长在红旗下,优越的条件和幸福的时光允许我们有些闲暇的时间,更重要是有更多的机会去接触我们父母一代接触不到的事物,探索我们父母一代未曾触及的世界。记得我最初接触电脑是在上小学的时候,哈哈,那真是遥远的日子啊。那是我们用的电脑还都是486,但在当时已经属于比较先进的机器啦。现在的孩子只能从教科书上去了解486的历史了,也只能从教科书上才能看到软盘,软驱之类的东西了。
 
那时是父母基于很偶然的原因把我送去了一个电脑班,而为我们授课的老师是一个计算机专业的大学本科毕业生。在那个遥远的年代,这种计算机专业的大学毕业生可是非常“稀有”的啊。出于老师的专业性,所谓的电脑班其实成了编程班。多年以后,等我上了高中,计算机在中国的普及率大大提高,大街小巷星罗棋布着各种各样的电脑学习班,偶然接到过一些招生宣传单,上面赫然写着高级班授课内容包括:上网冲浪、QQ聊天……真是不禁让我无语――当然那已经是多年前的往事了。
 
我最初接触的计算机语言是LOGO语言,可能很多读者都未曾听说过这种早期的计算机语言。LOGO语言是由美国麻省理工学院专门为儿童研制的一种高级的、交互式的、用于计算机辅助教学的语言,运用这种语言可以完成一些图形和音乐方面的编程,因为这些东西更容易被儿童所接受。还记得LOGO语言里将光标称之为“小乌龟”,至于其他更多的内容我已经记不太清楚了,但重要的是这种计算机语言对我进行了启蒙教育,并把我引上了编程之道。现在想想不得不叹服国外计算机教育的领先性。在完成对LOGO语言的学习之后,我对编程还是懵懵懂懂。这时老师就向我们传授了另外一种更专业性的计算机语言BASIC,还记得那时我对“函数”这个概念怎么都无法理解,就是弄不明白什么是函数,只能囫囵吞枣地越过这个概念,去完成那些现在看来十分EASY的编程练习题。BASIC语言的全称是Beginners All-purpose Symbolic Instruction Code,即初学者通用指令码。
 
很多人认为BASIC是一种适合初学者入门的语言,至少从它的名字上来看应该是这样的。但我个人认为,尽管BASIC相对简单,但也不一定非要推荐读者从此入手。首先,BASIC与主流程序设计语言的语法存在较大差异,因而不利于后续向其他语言过度。另一方面,BASIC目前的应用很少,学了之后也没用武之地。注意BASIC和Visual Basic是两回事,Visual Basic的应用还是非常广的,尤其在新版的Visual Studio中,Visual Basic扮演着非常重要的角色。但Visual Basic的应用更集中在Web开发或者结合数据开发中,这些也都不适合初学者接触。如何只是使用Visual Basic来开发一些简单的桌面程序,那根本就不算是在学编程,更不算是在学一门语言。因此,我并不建议初学者一定要从BASIC开始学习。
 
我的建议是可以直接从C语言开始。一般人学习C语言最大的困难往往就是指针。因为指针的存在很多人对此望而生畏,所以也有人据此认为C不是一个好的入门语言。然而,如果将C中的指针完全抛开,那么从基础语法功能来说,剩余的C又和BASIC差多少呢。再说,C目前依然拥有非常大的应用领域,用C来做一些底层的开发仍然不失为理想的选择。从C再向C++过渡,也相对更容易些,从C++那里我们可以学到基本的面向对象思想,这是C++与C的最大不同。C++是我们值得去学的,而且是应当学好的一门语言。如果C++掌握得很熟练,那就已经可以算得上是具有一定技术实力的开发人员了。
 
这个时候再学其他语言将会非常得心应手了,事实上,选择学习哪种语言并不重要,因为任何一种语言学好了都是很不错的。而学习多少种语言也不一定是我们的目的,其实只要上了道,语言基本上是一通百通。这个时候,你可以学习C#或者Java,这对于一个C++掌握得非常牢靠的人来说,学习C#或者Java并不是什么难事。学习C#或者Java首先要深化的面向对象的思想,它们都是非常纯粹的面向对象语言,而C++的面向对象程度并不高。但是具体选择C++还是Java则可是泾渭分明的大抉择啊。选择Java语言,意味着你将来打算在Java方向上发展,这可能包括J2EE或者J2ME,将来还将接触到的可能是Hibernate、Struct和Tomcat等。另一方面,如果选择C#,则意味着在.Net平台下发展。当然,仅仅学到C++就打住,然后坚持从事C++开发,也是大有可为的。而且其实这个层次和要求会更高些。C和C++能够完成一些更加专而深的开发工作,那时你可能就要冲着一个方向不断地向深发展了。当然,这些都是后话,对于初学者来说可能还无需考虑那么长远。何况,IT技术发展迅速,风云莫测,做长期规划和构想意义不大。
 
前面的我讲了自己过去的一些跟程序语言有关的经历,不过请读者千万不要误会,我并不想给大家造成一种假象,那就是“如果接触早就更有前途,如果接触晚就矮人一等”。我郑重地提醒读者,什么时候起步并不是问题,关键在于你自己,在于你肯不肯用心,肯不肯花时间。当我还是学生的时候,曾经在学校里当过专业课的助教。很多从农村来的学生别说编程了,就是电脑键盘也有没摸过的。但是有的学生很要强,不但学得很认真,而且凡事都动手实践,最终这些“从来没摸过键盘”的学生反而成了尖子。当然,也有些学生抵不住花花世界的诱惑,有的被网络游戏所麻痹,有的被花前月下所催眠,最后纷纷掉了队。对于学习编程,应当记住这样三句话――“经得起诱惑,耐得住寂寞,受得了挫折”。不仅仅是编程,人要想干成点什么事,无不是要做到这三点的。
 
通过前面的论述,我想阐明的一个观点是:从哪种语言入手其实并不重要,只要上了道,语言基本上是一通百通。唯一的需要跨越的地方可能是在从传统面向过程语言向面向对象语言过渡时如何建立面向对象编程的认识。当然这里的一通百通是指在掌握了一种语言之后,再上手其他语言会显得非常容易,但任何一种语言要想精通当然还是需要下一些功夫的。语言与语言之间总是有着这样或那样的联系,这种联系就决定了学习哪种语言并不是一个应该费力思考的问题。但是越往后发展,基础是否扎实就变成了你能否成为一名优秀程序开发人员的至关重要的限制条件。
 
基础中的基础应该是数学。数学是自然科学的基础,计算机科学本来就是从数学发展而来的,最初的计算机科学家同时也都是优秀的数学家,譬如冯诺依曼、图灵等。要成为一名优秀的程序员,数学是十分重要的。很多学习编程的朋友对数学觉得不屑一顾,觉得数学和编程没有什么关系。然而,优秀程序员和一般程序员之间的任何不同最根本上来说就是数学基础的好坏。不幸的现状是数学普遍是广大程序员的薄弱环节。当然,我这里所说的数学好坏并不是指考微积分能考多少分,或者知不知道拉格朗日中值定理。数学最主要的功效是帮助我们建立一种分析问题和解均问题的思想及方法,然后再考虑通过编程去实现它。很多从事医学影像相关研发的人,都具有计算机和数学的双重背景。一方面,计算机中的许多原理都牵涉到复杂的数学知识,比如进行运动物体估计时所使用的卡尔曼滤波,以及进行图像编解码时所使用的傅立叶变换等。另一方面,一些大型项目有时需要很复杂的数学建模和利用数学进行统计分析等,而一般程序员对于这些项目可能是一筹莫展的。而当一般程序员无能为力时,优秀程序员的价值也就表现出来了。真正优秀的程序员就得具有这种能力,他们应当能够通过自己的知识来解决一般程序员所无法完成的问题,而其中一个很重要的环节就是数学能力的强弱。
 
除了笼统地谈数学以外,数据结构和算法知识的掌握与运用能力也是衡量一名程序员编程能力的一个很重要的指标,更是普通程序员和优秀程序员之间一道难以跨越的鸿沟。数据结构原名离散数据结构,是由离散数学发展而来的,而离散数学则是数学的一个分支。数据结构和算法知识正是计算机专业的学生与非计算机专业的最根本的差别。很多人或许对链表,栈,二叉树,图这些东西略知一二,又或者一窍不通,这种人很难成为一名优秀的程序员。所选数据结构和算法和优劣从本质上决定了一个程序的性能高低。就是大学毕业找工作的时候,那些参加过信息学竞赛或者在ACM大赛中获过奖的学生也着实显得高人一等。很多知名大公司(例如微软、谷歌等)招聘时总是离不开那些有趣的数据结构与算法题目。你看看微软员工编写的《编程之美》一书就知道数据结构与算法知识在他们的工作中是多么重要了。有经验的人都应该知道,面试百度、腾讯这些公司时,数据结构与算法也是必不可少的。可见数据结构和算法对于一个优秀程序员是多么的重要啊!
 
 
  
 
未完,待续... (To be continued...)

你可能感兴趣的:(编程,提高,建议,培养,编程能力)