A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘劲松 中级黑马   /  2013-8-14 15:56  /  1526 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘劲松 于 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()是一种表述语言的格式。函数呢?虽然不在语言本身之内,但已然和编程语言混为一体,它是运用各种算法来实现某种功能,解决某种问题的。算法这种东西,对于编程语言来说,都是实现到函数中的。既然函数的内部是算法,那么算法是什么?学编程头几节课老师们都会讲到,算法是“解决问题的步骤”,而实现到函数中,一般都会有着更高的要求,比如说性能,复杂度等等,是要将一句一句编程语言的语句以高效的形式组合起来。
  那么再来看看我们的自然语言这边有什么。
  如果我一上来就说和编程语言的三个基本要素一摸一样的话肯定会有人摸不着头脑。那么以汉语为例解释一下。
  “关键字”,这个可能比较简单,我们汉语里面一成不变的是什么呢?不用说,最先想到“你,我,他”(想到别的也可以)。这也就是我们的一个一个的汉字,当然放到英语里就不用说了,更生动,都是单词呗。
  “语法”,这个... ...我想应该不用解释了。
  “函数”,这个算是最难解释以及最难发现的了,然而它却是正确的。想想刚才说过的函数是什么,是将一句一句的编程语句以高效的形式组合起来。那么在汉语中,把语句高效的组合起来是什么?直说了吧,看看我们的诗词歌赋,如果你是个相声迷,一定会想到相声中一个一个的包袱笑料,看看我们的成语,看看我们的流行语“神马都是浮云”,如同函数虽非编程语言本身但已然与编程语言混为一体一样,这些东西虽非汉语本身,但在生活中的大量使用使它们已然和汉语混为一体。
  这一点说明并不够强力。想想我们的诗词歌赋的作用,成语的作用是什么,相声里面一个一个的包袱笑料的目的何在?无非是利用简短的语句表达深层次的意思,让听到的人能够理解到深刻的含义,说出来之后能够让人更好的理解,越是好词好句好诗好歌,越是发人深省,这是“高效”的体现。
  那么我们在学习编程语言的时候,运用函数,在函数中设计算法的目的,不就是希望通过简单的语句让计算机完成复杂的功能,设计更加高效的算法让计算机实现么,不就是希望“发计算机深省”么。
  放到其他语言中来看亦是如此。
  
  

评分

参与人数 1黑马币 +9 收起 理由
以防万一 + 9 赞一个!

查看全部评分

2 个回复

倒序浏览
在现实生活中,外交官的一两句话有时候就能扭转乾坤,这便是一种使用语言的技巧,是“很会说话”,是他们在利用语言组织出有用的算法,高效的算法,这便是他们的“自定义函数”,郭德纲的一两句话,有时候会引得台下哈哈大笑,这便是他的“自定义函数”。

  所以,我想要表明的就是,大家在学习编程语言的时候,只是在接触一种和英语、日语、法语没有什么太大区别的东西,应该放下“戒备心”,轻松的去看待这门学科。
  可是有人会问,要想把编程学出门道太难了。
  难道你把汉语说得像朱总理的话一样铿锵有力就很简单吗?想考过雅思托福就很简单吗?应当以一个轻松的心态去看待它,然后踏踏实实去学习,你只是在学习一种和计算机交流的语言,这跟你当初学怎么跟美国人交流的语言是一样的。跟美国人说话我们用英语,跟法国人说话我们用法语,跟日本人说话我们用日语(当然也可以用脏话,这也算是“日”语),跟计算机“说话”,我们自然要用“编程语”。所以在这里可以说一句,如果你能学好英语,面对编程就不要退缩。学不好英语可又想学编程的呢,如果你很会说话,经常能逗得人哈哈大笑,能写出很好的文章,那么面对编程就不要退缩。置于那些非常不会说话的人,只能说,此文是你前进在编程道路上的一块绊脚石。
  呃... ...重申一下,小弟写这个不是想攻破什么技术难题,不是在讨论学术,就是想告诉大家可以用这种比较轻松的心态去看待编程。也许在实际的工作中这种心态并不能利用上,有人会说实际工作中用到的就是那实实在在的代码,这么一说反而把编程看的复杂了。但无疑可以帮助你对于编程语言在最宏观的角度上有一个把握,能够让你认识到这玩意儿其实没有那么复杂,以轻松的心态投入工作,避免陷入不必要的“混乱的代码竞赛”。
后来我又仔细想了想这种思路。
  在未来,是一个人工智能,人机交互的时代,如何让编程语言更加接近自然语言是一个重要的课题。我们应当可以想到,既然编程语言和自然语言有着共同的基类,那么自然语言中的一些东西,在编程语言中一定能够实现,因为这些东西肯定都存在于基类“语言”中。我们应当去试着寻找这种东西,看看还有哪些在自然语言中存在,在编程语言中还未发掘,这样应当会对人工智能起到推进作用,按照上面的图画的,就是所谓“横向思考”。
  XML语言的兴起更加见证了这一点的重要性。咱还是个学生,也不知道开发XML语言的人是不是意识到了这一点。为什么很多人认为XML会代替HTML,是一种趋势呢。按照这种“横向思考”,XML语言正是将自然语言中的一个性质放大之后的产物,那就是它的“元语言”特性,即“用语言本身去定义语言”,用DTD文档定义XML文档,用XSLT样式表文档将XML文档转换成其它类型的文档,而DTD、XML、XSLT样式表这三种文档都是运用XML语言来编写。在我们的自然语言中,这种“元语言”体现为用“动词”定义动词,用“副词”定义副词,然后将动词和副词以及其他各种词组合起来造成句子,同样都只是使用汉语来描述。当然,放到其他自然语言中也一样。

  小弟学识微薄,一点皮毛,皮毛而已。
我这图又挂了,原帖URL:http://blog.csdn.net/xlb0479/article/details/6521844
回复 使用道具 举报
看帖顶帖!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马