任何科技前进的方向永远都是让更多的人能够更轻松的掌握和使用,因此计算机语言也已经不再是什么高深莫测的天书,很多非计算机专业出身的人都能使用计算机语言来编写程序。无论是一个计算机爱好者,还是一个从事计算机相关行业工作的人,都有可能会使用计算机语言。然而,很多初学者常常为如何培养自己的编程能力以及如何写出优秀的程序而困惑,即使是掌握多门计算机语言,或者某些信息学竞赛的获奖者,再或者是有过一定编程经验的人也都会在达到一定程度后,因为无法再向前走一步而苦恼。计算机程序设计的世界如果缤纷多彩,为什么很多人只能在门外徘徊而苦于无从下手呢?编程的能力和技巧又应当如何培养呢?笔者在此希望从自身的经历谈些看法。
写给编程初学者的话
计算机程序设计的世界瑰丽而多彩,很多人对此都有着浓厚的兴趣。作为一个初学者或许你已经在门外徘徊许久,但仍然不得其法。因此,我希望结合我个人的一些经验,首先为初学者提一些建议和意见。
1. 基础扎实真的很重要,什么语言其实不重要
我所接触的第一门正式的计算机语言是BASIC,时间大约应该在小学五年级左右。还记得那时我对“函数”这个概念都似懂非懂,只能囫囵吞枣地越过这个概念,去追求更直接的“实用主义”,也就是不管三七二十一,反正先能完成那些(现在看来十分容易的)编程练习题就行。当然,现在想想这绝对不应该是学习一门计算机语言应有的方式和态度。
BASIC语言的全称是Beginners All-purpose Symbolic Instruction Code,即初学者通用指令码。很多人认为BASIC是一种适合初学者入门的语言,至少从它的名字上来看应该是这样的。当然,现在我们再谈BASIC,其实应该说是Microsoft的Visual Basic,即可视化的BASIC。现在Visual Basic也是国家计算机二级考试的考察内容。而且使用Visual Basic,即使刚刚入门不久的“freshman”也可以在很短的时间内编写出相当实用而且有模有样的Windows应用程序。但我个人认为,尽管BASIC(或者Visual Basic)相对简单,但也不一定非要推荐读者从此入手。首先,Visual Basic与主流程序设计语言的语法存在较大差异,因而不利于后续向其他语言过度。此外,Visual Basic的实际应用更集中在Web开发或者结合数据开发中,这些也都不适合初学者接触。更重要的是,我认为Visual Basic更适合非计算机(或软件)专业的人员来学习,例如一个数学系或者化学系的人可以使用Visual Basic来开发一些简单的桌面程序,事实确实如此。但Visual Basic在这个‘轻松’的开发过程中,掩盖了太多编程开发人员所需要探究的东西,这个过程更像是在学着使用一个应用软件,而非在学习一门计算机语言。因此,我并不建议初学者一定要从BASIC(或者Visual Basic)开始学习。
我的建议是可以直接从C语言开始。一般人学习C语言最大的困难往往就是指针。因为指针的存在很多人对此望而生畏,所以也有人据此认为C不是一个好的入门语言。然而,如果将C中的指针完全抛开,那么从基础语法功能来说,剩余的C又和BASIC差多少呢。再说,C目前依然拥有非常大的应用领域,用C来做一些底层的开发仍然不失为理想的选择。从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大赛中获过奖的学生也着实显得高人一等。很多知名大公司(例如微软、谷歌等)招聘时总是离不开那些有趣的数据结构与算法题目。大家不妨看看微软员工编写的《编程之美》一书就知道数据结构与算法知识在他们的工作中是多么重要了。有经验的人都应该知道,面试百度、腾讯这些公司时,数据结构与算法也是必不可少的。可见数据结构和算法对于一个优秀程序员是多么的重要!这里,我还要特别提到两个大家可以利用的资源。一个是由我个人编写的《算法之美——隐匿在数据结构背后的原理(C++版)》,这是一本可以帮你系统学习算法和数据结构知识,同时有助于夯实你的C++编程能力,并有针对性地提高就业笔试(面试)竞争力的书籍。该书再版多次,口碑和读者接受度都非常好,其繁体中文版已经在中国台湾地区出版发行。另外一个是著名的LeetCode网站,这是一个面向北美IT公司的,笔试(面试)在线题库和在线评测系统。其中分门别类地整理了主流公司在数据结构和算法方面的各种类型的编程开发题目,并按照难度分为Easy、Media和Hard三种模式。可以用作有需要的读者自测和练习之用。
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。很多计算机奇迹的诞生最初都只是发明人的一时兴起,更准确地说是他们个人的需求。我也建议那些希望在计算机程序设计方面学有所成的读者,在掌握一定的基础之后,不妨根据自己的设想来尝试着编写一些实用软件。只要你能坚持不懈地把它写完,必定会收获不小。“熊猫烧香”不就是这么诞生的吗?呵呵,当然这是个反面的例子,不建议大家去编写病毒。还是编一些能够造福人类,服务社会的东西吧。编程的无穷乐趣就在其中,正等待着你去发掘!
3. 一本好书的作用不可忽视
现如今,走进任何一家像模像样的书店,其科技类图书卖区中,最庞大的一个集群就是计算机程序设计类的图书。管它什么水利、农牧、航天等等任何一个科技图书门类,都无法有计算机类图书的排场,而计算机图书中又以程序设计类图书居冠。这个原因当然是多方面的,一方面至少说明从事该领域的作者为数众多,另一方面也说明这类书有着巨大的市场。因为计算机的普及,程序设计语言已经不再是神坛上的摆设可望而不可及了,无论你是专业的程序员,还是业余的爱好者都有潜力成为一名编程高手。但是面对这样众多的计算机图书,要想挑到一本好书谈何容易。一本讲授计算机程序设计方法的书籍能够称得上好,本身就不容易。首先,这本书应该能够容易让人看懂,让人理解,这就要求作者必须在讲述的方式上下些苦工。其次,在于这本书的内容应当充实、知识点讲述没有谬误,这就要求读者不但要有相当深厚的学识,更要在前期对图书的整体结构有一个相对完善的设计和构想。这样的一本好书,其作用是不可估量的。初学者入门是很关键的时期,一方面他们怀有着对于知识的渴望和崇敬,另一方面,他们的能力和基础又相对薄弱。如果书中的讲述方法尚有欠缺,且文字晦涩难懂,破绽百出,这不但是让初学者感到吃力,更重要的是有可能打击他们学习的积极性。如果书籍的架构不够完善,且知识介绍上存在谬误,不但让人不能系统地学到知识,更有可能灌输一些错误的思想,这种书只会误人子弟、贻毒大众。
然而,初学者由于知识积累有限,往往很难分辨一本书的好坏。再说,倘若一本书真的属于书中经典,但其并非是面向初学者的,这样读者即使很认真地去钻研书中的精妙,往往也只能事倍功半、白费力气。所以,读者首先应该学会如何选择一本好书。
选书首先可以选择一些知名技术作家的作品,或者选择一些长期盘踞畅销榜前列的书,再看看网上的相关评论怎么样。当然,众口难调,网上的评论也不可能一边倒,肯定是有的支持,有的骂。这个时候要理性对待这些评论。不能因少数人的少数言论而断定书的好坏。通常比较好的书引起的反响也比较强烈,一个重要的表现就是其评论数量比较大。有说好,有说坏,争论之下,各不相让,这种书往往可以考虑考虑。而如果是众口一词的说这书太烂,那这本书基本上就应该被枪毙了。
另外一方面,读者也应时刻保留一种心态,即书本没有好与坏,只有是不是适合你。如果你是一个初学者,那一定要结合自己的实际,千万不要好高骛远而买一些很高深的书来看。就像有些名家大作、畅销书籍往往都有可能是不适合初学者的,因此读者基于作者是否知名、书籍是否畅销等问题选出的一部分书就可以被淘汰。通常书籍的内容简介或者前言中,都会介绍这本书的读者对象,以及看懂它所需的一些储备知识。因此,看一本书绝对不能看着封面花哨就急于下手。至少应当把书的内容简介和前言看仔细,然后再看看书的目录编排是否与内容简介所提到的东西相一致。
基本上述的过程已经可以淘到一些不错的书了。但是还有一些小忠告需要告诉读者。
首先,配不配光盘不应该是选择图书的标准,重要的书的内容。很多读者都有买那些带光盘的图书的习惯,多半是为了里面的代码或者视频讲解。请注意,光盘附代码只会耽误你。作为一个初学者,自己动手写代码的机会弥足珍贵,如果只是依靠光盘里的内容,走马观花,那你将永远学不到真本事。另外,学习一门计算机语言是不需要什么视频讲解的。而且带视频讲解的书多半是教读者如何使用开发环境来编程的。注意掌握开发环境跟掌握一门计算机语言是两个概念,会用Visual C++并不代表你就会用C++。
其次,不要买类似实例大全之类的书。看这种书的人往往是希望能够速成,或者直接拉别的程序过来用。这无疑是一种急功近利、揠苗助长的做法。人家的代码始终是人家的,除非你自己会写,否则就还是别人的。除非你自己会写,否则你自己动手解决编程问题的能力都等于零。对于初学者来说,建立完整的知识体系结构非常重要。千万不要做那些邯郸学步的蠢事,也不要妄图一步登天、一蹴而就。
再次,学习编程我不建议读者买那些学校里的教材。一方面,教材是面向学生,面向考试的。你需要的是更多的实践经验和编程技巧。另一方面,国内教材的更新速度较慢,一般都是写一本教材用十几年。就算是更新也只是丰富内容,却不会伤筋动骨地修改图书结构。而计算机技术日新月异,发展迅速;新的教学方法和案例也是随着时代而前进的。因此,买教材不是一个好的选择。
最后,不要买那些一堆作者合著的书。看书的作者不仅要看书的封面,更要看前言中提到的参编者。我曾见过一本书的作者多达四十余位,可想而知书的叙述口吻、语言风格如何能够一致,内容如何能够连贯。这样拼凑的书根本就不算是集体的智慧结晶,充其量只能算是一个补丁摞补丁的破布。
在得到一本好书之后,更重要的是如何用好这本好书。这里需要提醒大家注意三点。首先,对于初学者来说,看书应该循序渐进的看,这样才能准确地把握作者的思路,跟随作者的思路,才能有利于建立自己的知识体系。这样你学到的东西才不是残缺的,才是扎实的。再次,编程的书中代码示例肯定不会少,但是读者不能只看代码,不看或者不仔细看文字描述的部分。很多关键的知识点就在文字描述中。如果没看文字,或者没有仔细看,或者跳跃着看,都可能让你对突然冒出来的一个语句感到费解。最后,不要相信书中的一切,要多问为什么。正所谓“尽信书不如无书”。对于编程的书也要求读者亲自去实践书中的例子。特别对于那些配有光盘的书。读者可能偷懒就不自己输入代码了。这样就算你把正本书都看完,你也学不会编程。就算你知道是怎么回事,你也只是嘴上会说,实际动手能力仍然为零。
计算机程序设计在很多人开来都是一门妙不可言的艺术。微软公司的很多广告宣传片都体现出了这种意思。程序员使用计算机语言来编织五彩缤纷的虚拟世界,这个美丽的世界里尽显了各路高手的聪明才智。除了对于这门学问的热爱以外,更多的人已经是或者即将是这个行业的从业者。尽管这个行业仍然是社会上非常热门的行业(从五花八门的培训招生广告中就可见一斑),而且这个行业的人才竞争也十分激烈,但这也只是说明程序员很多,或者说是学习编程的人比较多。其实真正能够称得上精通的人其实还是很少的。机会到处都是,前提是你必须足够优秀。
以上仅是我个人的一些愚见,如果有那些地方辞令欠妥还望广大朋友海涵。但无论怎样,我都真诚地希望本文的读者能够成为这庞大群体中出类拔萃的优秀程序员,在程序设计的世界里尽情挥洒,在自己的职业道路上大放异彩。
VIEWER DISCRETION IS ADVISED !!!