您的位置:首页 > 编程语言

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

2009-07-06 13:30 387 查看
2. 兴趣是最好的老师,实践是进步的捷径,需求是灵感的源泉

编程是一件很有意思的事情,很多人都这么认为。但是就如同你问一个没吃过鱼的人,鱼肉的问道怎么样,其实对方根本没办法回答你。所以如果你不会编程,那即使我将编程形容得如何天花乱坠也无济于事。如果将编程看成一种任务,甚至是负担,那此中的快乐就可能在你的每个厌倦的眼神中悄悄溜掉。人的生命是有限的,而人的创造力是无限。汉字是有限的,但用汉字写成的文学作品是无限的。之所以有这无限的文学作品存在,最重要的是人类的无限的创造力赋予了汉字活力。这个逻辑关系可以用来解释我们所要讨论的问题。编程语言的语法规则是有限的,但你可以用它来描绘出“风光无限”的计算机程序。这个从无到有的过程中,你的创造力起了决定性的作用。只要你足够出色,你就有可以利用计算机编程语言来构建任何旖旎多姿的程序。这怎能不说得上是一件乐事。如果你用一颗好奇的心去学习,去探索,那么每一份发现都会带来一种获得新知的乐趣。在大科学家牛顿功成名就之时,他却谦虚地说:“我只是一个在海边捡拾贝壳的小孩儿,偶尔为一片捡到的精美贝壳欣喜若狂,却对呈现在我眼前的浩瀚无垠的知识海洋视而不见”。笛卡尔也曾经有类似的表述:“我不断地探索和学习,却只是越发地发现自己的无知”。这就是求知的乐趣,这就是探索的魅力。世间每件精美绝伦的艺术品无不是注入了艺术家鲜活的艺术灵感而焕发出诱人光辉的。这一针一线、一雕一刻、一笔一墨都是作者思想的凝聚。一个程序设计高手的乐趣就汇聚在那一行一行的代码里。
程序设计可能是你谋生的手段,也可能是你拿到一个计算机等级证书的武器,当然你也可以只把它当作是一种乐趣,一种爱好。如果你问一个计算机程序设计高手他爱不爱编程,你猜他会怎么回答,我想他一定会说他很喜欢编程。你觉得他是一生下来就爱上编程的吗?
记得下时候,学校课本上讲过达芬奇画蛋的故事。据说达芬奇刚开始跟随老师学习画画时,老师就整天让他画鸡蛋。后来达芬奇实在无可耐烦了就问老师为什么老是让自己画鸡蛋,所有鸡蛋看上去不是都一样吗。老师却说鸡蛋看上去好像都一样,但世界上其实根本不存在两个一模一样的鸡蛋,这种细微差别的洞察力正是成为一名出色画家所必须具备的能力。达芬奇明白了老师的深刻用心,就静下心来继续画蛋。最后达芬奇成了一位伟大的艺术家。你觉得达芬奇生下来就热爱画画吗?肯定不是。他之所成功,是因为他爱画画,但他之所以爱画画,那是因为他对画画倾注了太多的汗水。试问有几人能够整天面对一堆鸡蛋反反复复地画呢?
管理学大师、资深经理人余世维博士曾经讲过这样一个故事。他有一次在日本应朋友的邀请去参加一个陶艺大师的作品展。期间,朋友介绍那位陶艺大师给余世维认识。陶艺大师和余世维亲切的握手,身边的朋友就问余世维是否发现大师有什么不一样的地方。经朋友这么突然一问,余世维一时不知该如何回答。朋友指着陶艺大师的手说,大师是没有指纹的。余世维睁大眼睛一看,果然如此,不禁叹服:“原来做陶艺,做到指纹都被磨掉,就成了‘陶艺大师’了”。
如果让你做一件你非常讨厌的事情,恐怕你是很难做好的。除非你喜欢这件事,否则你一定不会出类拔萃。但是要想喜欢一件事,除非你用心,除非你付出,否则又很难建立起一种依恋的情感。这个逻辑关系尽管好像有点绕,但实际情况却就是如此,如果你不为一件事付出汗水和心血,你就不可能真正地喜欢它,你也永远无法体会到过程中的无穷乐趣。
兴趣是最好的老师,它会让你安心地坐下来,而不是浮躁抓狂地问自己为什么学不好;它也会帮助你不受外界的影响和诱惑,一心一意地为此付出,而不会三天打鱼,两天晒网、虎头蛇尾,半途而废;它也会让你面对困难变得坚强,而不是就此一蹶不振,消极逃避。因此,你必须学会去热爱你所从事的事业,热爱你的工作。如果你想学好编程,也请热爱编程。
编程不能纸上谈兵,必须真刀真枪地干。你所需要的并不是一堆堆的教科书,而是你指尖下噼噼啪啪敲出来的一行行代码。世界上本来就没有从来不练琴的钢琴家,当然也不会有从来不写代码的编程高手。核心技术必须掌握在自己手里才能确保立于不败之地。自己到底掌握的牢不牢靠,自己应该心知肚明。如果你想学好,千万不要高举“拿来主义”的大旗,干着“复制粘帖”的勾当。
现代软件开发讲求高效率的复用,因此“他山之石,可以攻玉”的思想已被广为接受。加之网上资料丰富,很多经典的程序片段都能够在网上找得到。在学习阶段,阅读他人的代码的确能够让自己功力大增。这就有点像武侠小说《天龙八部》里,丁春秋修炼的吸星大法。但是这跟只知道一味抄袭他人代码是有本质不同的。关键的区别在于是否有内化的过程。
你有一个苹果,别人有一个梨,你们俩交换一下之后,没人还是只有一个水果。但是如果你一个方法,别人也有一个方法,你俩再交换一下之后,你们就都有了两个方法。要尝试学习别人的好处,弥补自己的短处。这个过程就要求杜绝好逸恶劳,坐享其成的念头。如果只是在需要的时候,上网随便剽窃一下别人的代码,那么到头只是自欺欺人,一事无成。记得我上大学的时候,讲授C语言的老师曾经留过的题目,包括写一个“汉诺塔”程序,写一个成绩管理程序,写一个进制转换程序或者写一个求水仙花数的程序等等,那时完全没想过要到网上去搜一个来用。后来上网多了,发现原来这些程序网上都有,甚至很多教科书习题的配套答案网上也能找得到。如果将网络资源好好的利用,那么的确可以帮助我们加深所学,事半功倍。但是如果利用得不好就会养成我们懒惰和虚伪和恶习。
很多人都一再告诫初学者应不断强化自己的动手能力,多多实践。但很多基础薄弱,学艺不精的人往往遇到一丁半点的问题就懒得自己去想,只是想到网上搜一个,或者找被人代写一个,若此一来久而久之,自己基本就残废了。中国高校里的计算机教授基本上都是很长时间没写过什么代码的,就算要做什么实验或出什么专著,那些编码工作也是分给了下面的学生去做的。所以中国高校的计算机学院产不出什么划时代的成果。国外高校的著名教授都是亲自动手做工作的,别说是科研成果,就是他们对自己编著的书籍也非常负责。Knuth写作《计算机程序设计艺术》时,感觉当时的排版系统不好,甚至亲自动手编写排版软件,这就是后来著名的TeX和METAFONT,目前这两个软件已经被世界范围内的大多数出版社所使用。外版计算机著作在国内如此受到推崇可见是不无道理的。所以外国的高校中能够诞生像SUN、HP和Cisco这样的著名公司。
很多编程书籍上都包含有大量的示例程序代码。懒惰的人把程序看一遍就不了了之,或者为了安慰自己就把随书附带的光盘中的源代码拷贝到电脑上,在开发环境下编译运行再看看结果。好像觉得自己已经知道是怎么回事了。其实,You still have lots more to work on!
动手编码的过程是强化记忆的过程,是发现问题的过程,更是锻炼能力的过程。编程的实践在于你能不能利用编程语言解决实际问题,而不是你是不是记住了书上的几个概念。动手编码的时候,你可能遇到的问题还有很多,比如编译不过,运行结果出乎意料,学习调试程序,发现问题,也是这个过程中需要训练和强化的。
当你把一门计算机语言的基本语法掌握了之后,你所能完成的程序的代码量也可能仅限于百行以内。通常一本入门级的书,里面的程序可能最长不超过一百行(例如谭浩强所著的《C程序设计》)。不是说这种书不好,这种书的作用就是让你入门,并且把基本语法学扎实。但仅仅掌握基本的语法是不行的,必须要结合一定的编程实践来提高自己的实际开发能力。这个能力提高的过程也会逐渐让你找准自己的定位,发现自己的长处,决定自己的方向。这里我可以跟读者谈谈我学习编程的经历。撇开最初的启蒙不谈。大学里最初的程序设计课程是C语言程序设计。我们所使用的教材是谭浩强所著的《C程序设计》。学完这本书,只能来应付一下考试,实际能编些什么具有应用价值的程序根本谈不上。因为我们毕竟是计算机专业的,所以这本书并不能满足我们的胃口。后来,学院组织程序设计比赛。我拉上了另外三个人就满腔热血的投入的设计编码过程中。这对初出茅庐的我们来说的确是一个挑战。一个差不多能参加比赛的程序最起码也得有个图形操作界面呀。光是用C来绘制这些界面就已经耗费了我们许多精力了。但此中过程无论怎样,我们最后还是交了作品。我们小组最后的程序一共有五千多行。当然因为是初学者,所以很难说这五千行代码有多大实际意义。但是这个实践的过程让我们学到了太多。后来我总结了一下,收获大约应该有以下四点:掌握了TC下的图形编程;深化了C的编码经验,提高了实战能力;成功后的喜悦令我们增强了自信,更让我们体会到了编程的乐趣。最重要的是,这个过程真正开启了我们的编程之路。
从此以后,我们利用业余时间编写过许多非常有意思的小软件。不但熟悉了多种开发环境的使用,从实践中自学了数据库编程技术,还偶尔在一些编程竞赛中获了一些小奖。但始终有一个问题一直困扰着我。作为一个计算机专业的学生,总要有个发展方向和专攻的技术特长啊。不能整天只会编一些管理系统之类的东西。这是很多学习编程的人到了一定阶段都会面对的问题。大部分人都希望自己将来能做一些研发工作,而不是到软件工厂去做“零件组装”工作。
后来一个偶然的机会,我的一个技术很强悍的学弟用Java编写了一个Photoshop中的色彩编辑器,还得意洋洋地拿给我看,说他在编写这个程序的过程中解决了三个主要的关键技术问题。我便不屑一顾地说这不算什么,我要编一个星期内也能做出来一个。对方不信,于是我们便打赌。为了争这口气我也得把这个东西给做出来呀。可是本科的时候学校根本就没开图像处理之类的课程,别说我对图像编程一窍不通,就是对计算机中的色彩表示也是知之甚少啊。所以一切都要从头学起。紧接着,我也遇到了学弟曾经提到过的三个主要技术问题。首先是对色彩空间模型的理解,以及RGB、HSV等色彩空间的转换问题;其次,是色板频繁刷新过程中界面闪烁的解决方法问题。第三,则是屏幕上任意点的动态取色问题。现在看来,这些问题当然不算什么。但对于那时的我来说确确实实是有难度的。不过,问题总是等待人去解决的。那一个星期里,我从零学起,查阅了大量资料,反反复复做过许多尝试。功夫不负有心人,后来我成功地完成了这个软件。令学弟叹为观止,自己心里也是小开心了一回。更重要的是,这样偶然的一个机会让我对数字图像处理萌生了兴趣。在此后的半年时间里,我独立完成了一个数字图像处理软件的雏形。本科毕业时我的论文方向也定为《基于混沌的数字图像加密研究》,这篇论文还获得了当年的全校“优秀毕业论文”。在当年完成的数字图像处理软件基础之上,我编写了我的第一本书《Visual C++数字图像处理开发入门与编程实践》(电子工业出版社出版)。
实践是进步的捷径。在校时,我们先后组成了多个程序开发小组和兴趣研究小组。当年的实践最终奠定了我们后来的夯实基础。在本科毕业时,曾经跟我一同参与编程小组的诸位成员们,都成了抢手的香饽饽,分别去了中国银联、中国移动、群硕、腾讯、***和NEC等知名公司。当初的编程实践成就了后来的许多编程高手。
需求是灵感的源泉。从事一些编码实践,不能仅限于完成教科书后面的习题。应该问问自己有没有在实际中遇到困难,有没有什么软件用得不爽。只要我们有需求,我们就可以按照自己的想法去编写一些适合自己的软件。这个过程充满挑战,更充满乐趣。例如在上个世纪90年代初,芬兰赫尔辛基大学学生Linus Torvalds就是因为不满意Minix这个教学用的操作系统,出于爱好,才设计了系统核心Linux 0.01,也就是后来的Linux操作系统的最初版本。再比如,1989年圣诞节期间,身在阿姆斯特丹的Guido van Rossum为了打发圣诞节的无趣,索性就发明了当今最流行的计算机语言之一的Python。很多计算机奇迹的诞生最初都只是发明人的一时兴起,更准确地说是他们个人的需求。我也建议那些希望在计算机程序设计方面学有所成的读者,在掌握一定的基础之后,不妨根据自己的设想来尝试着编写一些实用软件。只要你能坚持不懈地把它写完,必定会收获不小。“熊猫烧香”不就是这么诞生的吗?呵呵,当然这是个反面的例子,不建议大家去编写病毒。还是编一些能够造福人类,服务社会的东西吧。编程的无穷乐趣就在其中,正等待着你去发掘!
未完,待续...(To be continued...)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: