浅谈编程能力的培养与提高——卓越的程序设计之道

 
数据结构和算法知识是高手和菜鸟之间的一道难以逾越的鸿沟,这也是为什么有人在软件工厂里搞零件组装,而有人却在微软谷歌里搞创新研发的一个重要原因
 
接下来,我希望为那些非初学者提一些建议和意见。我将这些意见和建议归结为“卓越程序之道”。请注意,我们这里说的是“程序”,而非工程或者项目。程序的概念要小很多,因此我们并一定非得从软件工程的角度去考虑它。一个能够被称之为“卓越”的程序可能需要具备许多条件,比如高效、稳定、易读等等。而这众多的特点又有可能彼此矛盾,因此所谓“卓越”往往只是在求得一种平衡,或者说是“整体最优”。但无论怎样,一个程序首先必须能够正确的执行,否则它是没有任何意义的。如果我们的程序已经能够正确地执行了,接下来我们希望让它执行得更叫高效。从狭义的角度来说,一个能够正确执行的程序,其执行效率也很高,那么这个程序就可以被称之为一个“卓越”的程序了。为了让程序变得卓越,我们必须让一个能够正确执行的程序执行得更快才行。
让程序变得更快,必须从两个方面来进行考虑。第一个方面就是设计出高效的数据结构和算法。这是提高程序运行效率的“内在”方法。那些不具备深厚的数据结构与算法知识的人固然也能够写出“正确”的程序,但他们却永远无法让程序从质的角度有所飞跃。这也正是高手和菜鸟之间的一道难以逾越的鸿沟。很多职业程序员并非是计算机专业科班出身,这些人当中条件好些的可能是高等院校中其他专业(例如自动化、机械等)的毕业生,差一些的可能是借由职校或者其他培训学校等手段“自学成才”的程序员,但他们依然能够在所在行业或单位中担当着重要的角色。日复一日、年复一年的编码实践让他们能够在特定的开发环境中游刃有余,应对自如。社会上也有很多像××电脑专修学院的培训机构专门开设一些例如“Java软件工程师”、“.Net软件工程师”等等的课程,其目的就是为了让受训者能够掌握在某些环境下进行软件开发的技能。软件开发或者程序编码的确是一项技术,而程序设计则是一门艺术。技术和艺术的区别不言而喻!其结果是这类从业者,即使他们是具有一定编程经验的人,大多都只是在“软件工厂”中做些类似“零件组装”的工作。这就是中国和世界的差距!中国没有微软,没有谷歌,也没有甲骨文。当然,或许你也能罗列出几个你心中的民族科技龙头企业,但相比于这些巨头而言,中国的企业仍然不能与之相提并论。这些公司之所以能够在世界范围内呼风唤雨,最重要的是它们有着自己的核心技术和无穷的创新能力!
千万不要把软件产业和IT产业混为一谈。正确地说,软件产业应当是IT产业的一部分,而且是处在技术“下游”的那部分!中国的IT产业大多数正是这些处在技术“下游”的软件产业。中国的“软件工厂”也只能用着别人的Visual Studio或者是Eclipse进行着大量重复而简单的生产,即使是C、C++、C#或者Java这些耳熟能详的编程语言也没有一个是中国人发明的。C和Java的发明人都美国人,前者诞生在贝尔实验室,后者诞生在SUN公司;C++和C#的发明人都是丹麦人;Python的发明人是荷兰人;Ruby的发明人是日本人(以上均按原籍算)。有点中专文化水平再稍加培训就足以胜任软件工厂的实际编码工作了,但事实是中国的软件工厂也吞噬了大量科班出身的高等院校毕业生。即使,其中的佼佼者有可能去了微软中国,或者谷歌中国。但必须要承认的是这就是我们的差距。
中国的本土IT企业中,科技含量高的不多,至少就其比例和核心技术价值而言是不多的。就中国当前的国情而言,发展处于技术“下游”的软件产业也没什么不好的。但即使是软件产业,中国目前还比不上印度。这是我们不得不接受的一个现实。中国目前的程序员已经是一个非常庞大的群体了,但为什么中国出不了李纳斯那样的程序员?一个原因无疑是我们的教育出了问题。这说起来可能太远了,尽管笔者对这个问题做过一定细致的研究和思考,但我仍不便把这个话题在此打开,所以我们还是回到主题——如何写“卓越”的程序——上来。我们刚才说到数据结构和算法知识是高手和菜鸟之间的一道难以逾越的鸿沟,这也是为什么有人在软件工厂里搞零件组装,而有人却在微软谷歌里搞创新研发的一个重要原因。真正的程序设计高手绝不是掌握多少门语言或者能够熟练使用何种开发环境的程序员,一个真正的程序设计高手对于数据结构和算法知识一窍不通是不可想象的!一个对数据结构和算法知识一无所知的但颇富编程经验的程序员不是一只“菜鸟”,但也绝对不是“高手”,充其量也只能算是一个熟练的“技工”。要想实现从“技术”到“艺术”的飞跃,看来数据结构和算法知识不得不成为必修课了。
我一再强调了数据结构和算法知识的重要性,那是因为它们是成为一个程序设计高手所必须的条件。但读者依然会问如何学习这些知识呢?一本好书再结合一些实践定会助你一臂之力。算法和数据结构方面的书很多,当然其中最牛的当属Knuth的《计算机程序设计艺术》丛书,但我并不推荐这本书,因为它的内容对于初学者来说实在是太复杂了。其实国内很多高等学校计算机专业数据结构和算法方面的教材还是值得推荐的,对于初学者来说尤为适合,至于哪一本我就不替它们做广告了。再说其实哪一本都一样,国内很多教材都是东抄西抄拼凑的,天下文章是一家,你抄我来我抄他,何况高校学生物美价廉,当然要好好利用资源了。数据结构与算法的书我自己也写了一本,不过那种王婆卖瓜自卖自夸的事我就不干了,还是留给读者自己去挑选吧。国外书籍像《算法导论》这种的已经很有名了,随便网上一搜,再看看读者评论就知道那本可以了。不过我还是建议在看外版书之前,先读读国内的教材,这样会更容易上手些。
除了看书以外,自己的实践还是不能少的!俗话说:纸上得来终觉浅,绝知此事要躬行。数据结构和算法方面的实践,可以选择做一些ACM试题,ACM试题的程序短小而且资源又十分丰富。当然,可能有些初学者做ACM试题,脑筋容易打结,可能并不容易进行下去。如果你自认为是天资聪颖,那么选择通过解ACM试题来提高算法及数据结构知识当然是上选。如果你资质平平,也无需气馁,教材上的习题就很适合你。总之,数据结构与算法知识绝不应该是被束之高阁的天方夜谭,其实它并没有那么神秘,相反,这个世界充满奇思妙想的乐趣,是智者们相互博弈、讲经论道的乐土。
让程序变得更快的第二个方面就是运用良好的编码,让程序更适合编译器优化,更适合计算机执行,这是提高程序运行效率的“外在”方法,这也是本书所一再强调的问题。计算机系统机制非常庞大而且复杂,要想深入认识它理解它并不容易。计算机专业的学生在学校里可以接受系统的教育,知识体系上是较为完整的,但这还不够。现今中国高校计算机教育的课程设置固然囊括了计算机学科全部主干核心科目,但是每门课又是独立教学的,连贯性不足,因此难以形成系统化的体系。学生看待问题时往往只会分门别类地割裂看待,而很难将所有课程有机地联系在一起,不利于群体优势的发挥。如果你悟性足够高,或许能无师自通地将所学内容串联起来,但这种人其实是很少的。在这一点上,国外一些高校已经在课程体系的研究和设置上进行了改革,并取得了非常好效果。我个人比较推崇由美国卡耐基梅隆大学的两位教授所编写的《深入理解计算机系统》一书。此书是这两位教授为该校一门课程所编写的教材,这门课程是他们在教学实践中探索出来的一种新的思路的集中体现。《深入理解计算机系统》一书从开发人员的角度出发,从程序设计来讲述计算机系统原理,将计算机组成原理、计算机操作系统和汇编语言与接口技术等多门课程有机地串在了一起,是对原有课程的一个非常好的补充和丰满。笔者也正是受到这本书的启发,希望将这种思想引入,将“卓越”程序的第二个要素教授给广大的国内读者。
我们再拿李纳斯来说事,李纳斯无疑是一个非常优秀的程序员,想象一下,如果他对计算机系统原理或者操作系统原理没有一个深刻的认识,他又如何能够写出Linux呢?从这个角度来说,他的确是一个程序设计高手。这种对于系统的深刻认识正是中国程序员所缺乏的。很多信息学竞赛的获奖者在算法和数据结构方面都是很牛的,但在成绩“卓越”程序的第二个要素上,他们可能就相形见绌、捉襟见肘了。所以就算中国的ACM搞得火热,就算有很多学生能够在国际ACM竞赛获奖,想培养出一个李纳斯至少在目前来看还是不切实际的。再说说上个世纪90年代曾经危害一方的CIH病毒,CIH病毒是世界上第一个可以破坏硬件的病毒,当年CIH可以说是“显赫一时”啊。如果编写CIH病毒的那个台湾人对计算机系统知识毫不了解,仅凭些高超的算法和数据结构知识根本就不可能编出CIH病毒。当然我们研究计算机系统原理的目的不在于编写个操作系统或者病毒,关键是在于只有理解系统的运行机制,我们才能够写出更高效的代码。研究算法和数据结构理论的人多半都是些数学天才,所以这活是有一定技术难度的,而搞明白计算机系统是怎么个来龙去脉则要相对简单多了。只要方法得当,必然是水到渠成。在这方面,全书已经用了太多的笔墨,所以这里我就不多说了,请读者从本书正文部分的内容中好好体味着其中的无穷乐趣吧。
最后,真心的祝愿每位读者学有所成!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值