本帖最后由 刘劲松 于 2013-8-14 15:59 编辑
首先说明,我并不是准备在这里攻克什么技术难题,钻研什么技术理论,实践什么真知灼见,只是描述一种看待编程的心态。 写标题的时候,想写成“学习编程,换一种心态--献给初学者”,然后发现自己也是初学者,也谈不上“献给”,那么就算是大家一起来讨论一下吧,如果你还在徘徊,这或许是一种帮助。
上个学期临近期末的一个晚上,卢亮说他最近状态不太好,我就把他叫到我这来聊天。一张餐桌,两个人对面而坐,他买了点小吃,我们俩一直聊到大概夜里近三点钟。卢亮觉得我的一些思路非常特殊,有值得借鉴的地方。后来我想整理一下写出来,但是发现压力太大了,生怕写得贻笑大方。后来再三思考,今天算是整理完毕,决定试着写一写。
大三的上半学期刚刚过去,学编程也是有两年多了。从大一的时候的C语言、VB,大二的C++,到现在的JAVA、XML。期间也参加过学校里的一些小型的比赛,对算法也略懂皮毛。可能算是略有小成了吧。虽然技术上还不是什么成熟的程序员,但是对于如何学习编程,看待编程,有了一个整体上的把握,生成了一些算是较为独特的思想,今天在这分享一下。
对于大多数人来说,编程这个东西是种很明显的理工科学,理工学科,具有很强的逻辑性,要求学习者有较强的思维能力和抽象能力,可以说是50%都是“数学方面”的东西,这让一大部分人对于编程“敬而远之”,也同样是这种根深蒂固的思想让一部分学习编程的人感到难以入手或是半途而废。
其实越发理性的事物越需要感性地去理解,去认识,这样可以实现一个从特殊到一般的过程。编程也一样。学习编程语言原本的思维方式固然重要,但是通过从感性的角度去认识它,能够发掘出更多的乐趣和理解,旨在让大家放松对于编程的“戒备心”。
我实在找不到更加合适的语句来让自己显得更加谦虚,只好这么说了。看到现在的程序员,感觉他们无不陷入到一种“混乱的代码竞赛”中,时常觉得乏力,乏味。毕竟这是一个竞争的年代,人们不把自己变成一个机器就无法生活。也许这是一种必然的结果。可也正是这种结果导致了学习编程的人渐渐缺失了对于“编程语言”的整体把握,淡忘了当年用printf打印出“Hello world!”时的那一声惊叹。看过《网球王子》的人应该都会记得,“越前”在最后一场比赛中,克敌制胜的关键就是他的心态回到了最初接触网球的时候,打网球是为了什么?是乐趣。
然而“乐趣”并不是这里的主题。我的主题是“换一种心态看待编程,编程语言它是一种语言,是一种交流方式”。希望能让那些还在编程“门口”徘徊和那些力不从心的人能在这里找到动力或是......能够发现一些乐趣。
在大家想到编程就想到无边无际的代码和各种复杂的数学公式的同时也能够说出一句“编程语言它是一种语言”,然而很少有人去思考它,觉得这只是一句冠冕堂皇的适合当作前言部分第一句的话。下面我把这句话翻译成英文,如果有语法错误,请不要纠结。
“Programming Language is a kind of language”
然后呢,我们提炼出这样两个关键词:“is a”和“language”。注意这个“language”是原话中的第二个“language”。
稍微学习过面向对象编程的人应该都会了解,在一开始提出OOP思想的时候,有三个概括性的词,分别是“is-a”、“has-a”和“uses-a”,意在表示“继承”、“内聚”和“依赖”这三种类与类之间的关系。很明显,我们的重点是“is-a”。也就是说“Programming Language”继承自“language”。我们不妨简单的画个图。
可能我这么说,这么画,有人会觉得这并不是在像我说的“去感性的认识编程”,并没有实现从特殊到一般。可是从图中可以看出,现在我们的讨论已经是从“Programming Language”上升到“language”了,实现了从特殊到一般,其实就是追寻到了一个基类或是父类。
这时我们应当已经认识到“编程语言”它是一种语言,而“语言”是什么呢?它是用来交流的工具,是鸟和鸟,鱼和鱼,狗和狗,猫和猫,人和人用来交流的途径。这便是“感性的认识”。 顺着继承关系向下看。我想这样解释。大自然创造了人类,创造了花鸟鱼虫,赋予了人类智慧,人类利用智慧创造了计算机,人跟人可以交流,狗跟狗可以交流,鱼和鱼可以交流,同样,大自然赋予了人类和计算机交流的方式,便是通过“Programming Language”。 可能光靠这些还不足以让人们放轻对“编程语言”的戒备心,那么我来完善一下上面这个图。
相信大家从图中已然看出些端倪。现在我们是在实现一个从一般到特殊的过程。 不错,自然语言当然是一种语言。那么我们可以这样表述一下这个图的意思:C语言、C++语言、JAVA语言以及其他的编程语言,和我们人类所使用的像汉语、英语、日语这样的语言有着共同的基类或者叫父类,就是“语言”这个类。 可能光靠这个图说明一切还并不是强有力,那么我们来进一步分析一下。 学习过面向对象编程的人们都应该知道,子类是可以从父类继承属性和方法的。先来看一下“Programming Language”这边都有些什么。 编程语言的本身包括的内容,我是这样概括的:关键字,语法和各种函数(数据类型、变量神马的都在语法之内)。这三个基本要素都有着怎样的意义呢?关键字,不用多说了,是编程语言中固有的,一成不变的东西。语法呢?依然拿C语言来说,我们要完成一个最简单的控制台程序肯定要有这样的代码:void main()是一种表述语言的格式。函数呢?虽然不在语言本身之内,但已然和编程语言混为一体,它是运用各种算法来实现某种功能,解决某种问题的。算法这种东西,对于编程语言来说,都是实现到函数中的。既然函数的内部是算法,那么算法是什么?学编程头几节课老师们都会讲到,算法是“解决问题的步骤”,而实现到函数中,一般都会有着更高的要求,比如说性能,复杂度等等,是要将一句一句编程语言的语句以高效的形式组合起来。 那么再来看看我们的自然语言这边有什么。 如果我一上来就说和编程语言的三个基本要素一摸一样的话肯定会有人摸不着头脑。那么以汉语为例解释一下。 “关键字”,这个可能比较简单,我们汉语里面一成不变的是什么呢?不用说,最先想到“你,我,他”(想到别的也可以)。这也就是我们的一个一个的汉字,当然放到英语里就不用说了,更生动,都是单词呗。 “语法”,这个... ...我想应该不用解释了。 “函数”,这个算是最难解释以及最难发现的了,然而它却是正确的。想想刚才说过的函数是什么,是将一句一句的编程语句以高效的形式组合起来。那么在汉语中,把语句高效的组合起来是什么?直说了吧,看看我们的诗词歌赋,如果你是个相声迷,一定会想到相声中一个一个的包袱笑料,看看我们的成语,看看我们的流行语“神马都是浮云”,如同函数虽非编程语言本身但已然与编程语言混为一体一样,这些东西虽非汉语本身,但在生活中的大量使用使它们已然和汉语混为一体。 这一点说明并不够强力。想想我们的诗词歌赋的作用,成语的作用是什么,相声里面一个一个的包袱笑料的目的何在?无非是利用简短的语句表达深层次的意思,让听到的人能够理解到深刻的含义,说出来之后能够让人更好的理解,越是好词好句好诗好歌,越是发人深省,这是“高效”的体现。 那么我们在学习编程语言的时候,运用函数,在函数中设计算法的目的,不就是希望通过简单的语句让计算机完成复杂的功能,设计更加高效的算法让计算机实现么,不就是希望“发计算机深省”么。 放到其他语言中来看亦是如此。 |