分类: LINUX
2007-05-04 23:06:45
学会开放性的思维 xpiloveyou(原作)
在CSDN上看到这文章,引起一定程度的共鸣,共勉之。以下为转贴:
经常在论坛中看到一些问题:“我应该学习哪门语言?”“XX语言能做什么吗?”我对想对这类想法给一个我的见解。本文多少涉及到一些语言的评论,仅代表个人意见。
学会开放性的思维
我发现初学者最喜欢问的一个问题就是“我应该学什么语言?”。想不浪费时间学好一门语言然后就用这个语言解决所有问题。在提出我的见解前我先引用一段Eric Raymond的话:
“如果你还不会任何计算机语言,我建议你从Python开始。它设计清晰,文档齐全,对初学者很合适。尽管是一门很好的初级语言,它不仅仅只是个玩具。它非常强大,灵活,也适合做大型项目。
但是记住,如果你只会一门语言,你将不会达到黑客所要求的技术水平,甚至也不能达到一个普通程序员的水平---你需要学会如何以一个通用的方法思考编程问题,独立于任何语言。要做一名真正的黑客,你需要学会如何在几天内通过一些手册,结合你现在所知,迅速掌握一门新语言。这意味着你应该学会几种不同的语言。如果要做一些重要的编程,你将不得不学习C语言,Unix的核心语言。其他对黑客而言比较重要的语言包括Perl和LISP。 Perl很实用,值得一学;它被广泛用于活动网页和系统管理,因此即便你从不用Perl写程序,至少也应该能读懂它。 LISP 值得学习是因为当你最终掌握了它你会得到丰富的经验;这些经验使你在以后的日子里成为一个更好的程序员,即使你实际上可能很少使用LISP本身。当然,实际上你最好四种都会。 (Python, C, Perl, and LISP). 除了是最重要的四种基本语言,它们还代表了四种非常不同的编程方法,每种都会让你受益非浅。”
大家看了这段话是否立刻就想按Eric Raymond的话从Pyton开始学习?或者学习他提出的四种中的C语言?且慢,我们注意这样几句话:“你需要学会如何以一个通用的方法思考编程问题,独立于任何语言。”“(Python, C, Perl, and LISP). 除了是最重要的四种基本语言,它们还代表了四种非常不同的编程方法,每种都会让你受益非浅。” 可以看出Eric Raymond提出四种语言实际是提出四种不同的编程思想。他想告诉大家的就是:开放的思维,不要局限在一个语言当中,即“通用的方法思考编程问题”。
也许有人反对说精通一门比懂很多而不精要好。确实我们必须精通一门,这个是可以根据自己需要来选择的。但不代表我们只需要学习一门语言,因为只懂一门语言很容易被它的局限性限制。C语言很灵活但是对数据的抽象处理不够。C++够强大也灵活了吧?它学习了C的灵活和高效以及Simula的抽象数据能力。可是C++的面向对象机制比不上Java。而当你学了Lisp以后你会发现原来程序还可以这样编,虽然C++也号称可扩展性,但Lisp的扩展性是C++所不能及的。而且Lisp是一种函数型语言,与面向机器的语言有着不同的思维方式,Java也从这里借用了不少思想。我觉得每一个语言都有最擅长的领域和不够的地方。没有一种语言真正通用,即使是C++,有些问题用C++来做实在有点吃力。这里一定有人有对C++痛苦的回忆。Java确实很优秀,适合分布式计算,但Java太安全了,可能不少有黑客气质的不喜欢它,因为它为了安全牺牲了很多灵活性。
我们应该学会开放性思维,看问题要看到最核心的问题,最根本的根本,而不会被其他的枝叶或表象所迷惑,做到这一步后才算比较成功。这样就会有一种分析问题的方法,学会怎么样把问题的表象剖开,看到它的本质。这时你碰到任何具体的问题,只要给点时间,都能轻而易举地解决。选择程序设计语言在这里只是选择不同工具。
并不是说工具不重要,但是如果没有一个很好的思想,那么这个工具你能用的好吗?而且解决一个问题并不是只有一种可能,或者这个问题的解决可能分几个部分而不同部分要不同的方法。这个时候没有开放性的思维,能解决好这个问题吗?就以Emacs为例。Emacs的底层代码是C写的而上层代码却是Lisp。也因此Emacs足够强大快速而且又有很强的可扩展性。如果仅采用单一的C编写,那么就是vi了。它很快也很灵活,但它扩展性怎么样?
看到一些关于该选择什么语言的问题我觉得真可笑,不知道他们想的是学语言还是学着解决问题。我们学习编程只是为了学习写程序本身还是为了学会用编程解决问题呢?如果是前者,真好你是个历史学家,尤其是只用C和汇编的可以称为考古学家了。如果是后者,那么不必再问选择什么语言了,学会编程的思想最重要,选择一门语言然后学习它的思维方式。这时先选哪门就和应该上午吃苹果还是下午吃橘子一样了,你应该熟悉更多的工具。
补充一些就是独立于程序语言以外的编程思想,那就是算法,数据结构,和编码规范。不论你精通多少门语言,当遇到一个问题能否用最快最好的方法解决,那就是考验你的算法设计能力和数据结构的操作能力了。而用程序清晰的表述一个问题就是看你编码是否规范了。当你需要改进程序时你会发现一个编写清晰易读的程序维护起来要方便的多,这也有助于快速的解决问题。