Ruby的哲学

Ruby的哲学
与Yukihiro Matsumoto的对话,第一部分
Bill Venners著
2003年9月29日
摘要


    Ruby程序设计语言的发明人Yukihiro Matsumoto与Bill Venners进行了一次谈话。谈话内容集中讨论了Ruby的设计哲学,包括设计的不完整性,正态危险性,以及人类在计算机科学发展商的重要作用。

    在网络上以昵称"Matz,"著称的Yukihiro Matsumoto是Ruby程序设计语言的发明人。Ruby是一种适于开发日常脚本以及完整的应用程序的面向对象程序设计语言。Matz自从1993年就开始进行了Ruby语言的研发工作。因为他想发明一种语言使得你既能非常高效的进行开发又感觉到乐趣无穷。最开始Ruby只是在日本非常流行,随后便踏上了进入了全世界程序设计者心扉的道路上。

    2003年9月24日Bill Venners与Yukihiro Matsumoto在丹麦Aarhus 举行的JAOO会议上会面。在这次会面上,Yukihiro Matsumoto讨论了Ruby的设计哲学,Ruby程序设计语言的特性,以及如何才能成为一个更好的程序员。在这部分当中,Matz特别介绍了设计的不完整性设计,正交的危险,运用向导提供程序设计的便捷,最小非预期理论,以及人在计算机发展上起到的重要作用。

没有完美的语言
Bill Venners:作为《Ruby程序设计语言:实践者的向导》的合著者,Dave Thomas告诉我你并不认为设计一种语言应当达到完美的境地,这是为什么呢?

Yukihiro Matsumoto:程序设计语言的设计者当然想要设计出完美的程序设计语言。他们想有这个能力说,“我设计的语言是完美的,它可以做任何的事情。” 但是设计一个完美的语言显然是不可能的,因为我们可以通过两种途径审视一门程序设计语言。第一种是审视这种语言都能够进行哪些工作。另外一种途径是审视当我们使用这种程序设计语言的时候我们的感觉是什么—也就是说在我们进行程序设计的时候有什么感觉。

Yukihiro Matsumoto:
    根据图灵先生的完整性理论,每一个图灵完整性语言所能够完成的工作都可以本另外一种图灵完整性语言所完成,仅仅是各种资源使用情况不一样。你可以在一个编译器当中做任何的事情。但现在没有人愿意在编译器当中进行程序设计了。从“你能做什么”的视角来看,语言的的确确是不同的—但是不同点是极其有限的。比如,Python和Ruby就为程序员提供几乎相同的程序开发功能。
    我不想强调这些“什么”,而我强调明这个“怎样”的部分:我们在进行程序设计的时候感觉怎样。这才是Ruby程序设计语言在设计上与其他语言的最大不同。我想特别强调一下感觉,我使用Ruby的感觉。我并不为了使Ruby被设计成每一个人都能感觉到非常舒适而潜心研究,因为大家的感觉和我一定是不一样的。没有一种语言能够完全适合每一个人。对于Guido van Rossum来说,Python可能是最适合他的了。

正交与和谐

Bill Venners: Dave Thomas还告诉我如果我向你建议增加一个特性将是一定会被反对的,你不会那样做的。你所想要的是和谐的设计,这是指什么?

Yukihiro Matsumoto:我相信一致性和正态性是设计的工具,但不是设计最主要的目的。

Bill Venners:在这里的“正态性”是指什么呢?

Yukihiro Matsumoto:正交性的一个例子就是允许任何的小特性和语法的组合。比如C++支持函数的默认参数值,并且可以对基于参数的函数进行重载。这两个特性在一个程序设计语言当中都是非常好的,但由于他们是正交的,你可以在同时应用它们。如果使用不明确,便一起就会标为错误。但是如果我观察代码,我首先也许要使我的大脑接受这样的规则。我要去猜测编译器是如何去工作的。如果我的想法是正确的,并且我足够聪明,这将是没问题的。但是如果我不是那么聪明,而且我真的不是,这就会造成混乱。结果将是一个普通人不能预期的。这就是正交性的缺点。

Bill Venners:换句话来说,正交特性只有在编译器的编写者明白他们并且能够让他们工作起来才会有效。但是对于程序员来说在面对正交特性的时候他们是很难理解的,因为这是极其复杂的,因为我必须辨明这两个特性是如何和谐的应用的。

Yukihiro Matsumoto:如果正交特性被组合,将会导致复杂性的发生。

Bill Venners:那么怎样选择呢?怎样做才能更和谐?

Yukihiro Matsumoto:仅仅选择两者之一集成在语言当中就可以了,你不必将你能够考虑到的所有事情都做一遍。你只需要选择一个,即使它们两个都很好。

自由与舒适
Bill Venners: Phython社区的设计哲学史提供并且仅仅提供一种方法去处理事情。如果你提供50种不同的方法去做同样的事情,那么你就提供给了代码编写者很舒适的方法。人们可以使用他们喜好的方式来进行程序设计。这个折中是在程序设计者中。当我阅读你的代码时你可能是用一种方法编写的。当我阅读另外一个惹得代码时,他们可能是利用其他的方法编写的。所以作为一个程序的阅读者,我为了完成这项任务就必须熟悉所有的方法,俄不仅仅是我自己进行程序编写的方法。这个是设计的折中。Phython社区看来是喜欢提供仅仅一种设计方法,但Ruby其实还是为处理同样的事物提供了多种方法。

Yukihiro Matsumoto: Ruby继承了Rerl的设计哲学,提供处理同样事物的多种方法。我从我心中的英雄Larry Wall那里继承了这个设计哲学。我想让Ruby的使用者感到随意。我想赋予他们选择的自由。人都是各不相同的。每个人都选择不同的标准。但是如果在多种选择当中有一个更好的方法,我将把它做的更为舒适,来支持这种方法。这就使我在努力进行的工作。或许Python的代码可读性更强。每一个人都可以书写同样风格的Python代码,以利于阅读,或许是这样。但是人与人之间的差别实在是太大了。即使你在使用Python,仅仅提供一种方式帮助微乎其微,我是这么认为的。在可能的情况下,我宁愿提供给用户多一些的方法,但是如果可能,我会鼓励他们或者指导他们选择一个个更好的方法。

Ruby的乐趣
Bill Venners:在Ruby的也介绍性文章中,你写道,“对于我来说,生活的意义有一部分是为了获得乐趣。程序员在集中精力于程序设计的创造性一方面的时候常会感到乐趣的存在。”那么Ruby是如何使程序员体会到乐趣的呢。

Yukihiro Matsumoto:你向往享受生活,不是么?如果你能很快地完成你的工作并且你的工作是充满乐趣的,那将是非常美好的,不是么?那就是生活的乐趣,当然是一部分,你的生活将变得更美好。

我会尝试用计算机解决我在日常生活中遇到的问题,所以我需要写程序。通过使用Ruby,我希望能够集中精力于我要做的事情,而不是语言那些不可思意的规则。就像以public void *** *** ***开始,来完成输出“打印 hello world”。我只想说,“打印这个!”我不想接触周围所有的魔术般的关键字。我只想集中精力于任务。这就使最基本的想法。所以我也已经试图使Ruby的代码简明清晰。

Bill Venners:允许程序员编写清晰简洁的代码是令他们愉快的一个方法。

Yukihiro Matsumoto:是的,所以他们可以集中精力于问题本身。有时候人们会将伪代码记在纸上。如果他们的伪代码能够在他们的机器上运行,这就是最棒的,不是么?Ruby就试图这样,就像运行的伪代码。Python社区的人们也这么说。

Bill Venners:是的,Python社区的人们的确是说Phython是可执行的伪代码。那么Ruby还有什么其他的地方使程序员感到高兴呢?

Yukihiro Matsumoto:在程序员的日常生活当中,我们会处理大量的文本串。所以我尝试了努力改善文本的处理,也就是string类和正则表达式。正则表达式被集成到这个语言当中,而且能够被和谐的应用。我们也许要深入操作系统进行调用。Ruby可以调用Unix和大部分的Windows API的每一个系统调用。这为解释语言环境带来了操作系统的强大功能。这样你就可以进行日常的系统管理和文本处理程序设计。这是我今生的主要工作领域,所以我尽最大的努力把它做的非常优秀。

Bill Venners:所以主要来说,Ruby帮助我快速地完成我的工作并令我感到很有趣,使得我尽情的享用我的生活。

Yukihiro Matsumoto:它至少是给了我这样的帮助,我不知道Ruby是否能为你带来这样的帮助,但我希望它能。

人的因素
Bill Venners: 在一个会面当中,你说,“不要低估人的因素。仅仅想到我们是在计算机之前,他们是媒介。我们正在与人在交流,为人类而工作。”你这样说又是为什么呢?

Yukihiro Matsumoto:设想你正在写一个email。你在一台计算机前,你在操作一台计算机,点击鼠标,在键盘上打字,但这些消息将要通过网络被传送到另外一个人那里。你虽然是在一台计算机前工作,但在计算机之后却是一个人。我们进行的大部分任务都是为人类而作的。举例来说,计算税就是数数,从而政府能够将我的钱从我的腰包掏走,但政府考虑的是人。

我们的大部分工作毕竟都是与人相关的。所以在程序设计中,我们不是让计算机为人类工作就是我们用十分清晰的方法将我们的想法描述给计算机从而使他能够执行。在第一种情况下,使计算机为人类工作,目标是计算机后的人。在第二种情况下,我们尽量清晰的像计算机表达我们的思想使得它能够明白并且能够执行,我们从我们的大脑中表达我们的意图,结果是计算机去执行。所以两种情况的对象都是人。

Bill Venners:这样思考的重要性是什么呢?你说,“不要忽略人的因素”,这是为什么?

Yukihiro Matsumoto:因为计算机并不介意我必须付出很大的努力与他们进行交流或者是我很容易就能与他们进行交流。他们并不关心我是将文件中无数的指令字节序列输给他们,使他们运行它,还是我使用高级语言转换指令。计算机是不关心这些的。但我们人类非常关心我们所付出的努力。通常人们,尤其是计算机工程师们,关注他们的机器。他们认为,“通过这样做,机器就能运行得更快。通过这样做,机器就会运行得更高效。通过这样做,机器就能怎样怎样。”他们关注的是机器。但是实际上我们需要将焦点聚集于人类身上,聚集于人类如何关注编写程序或者在机器上操作应用程序,我们才是主宰着,它们是奴隶。

Bill Venners:这只是暂时的。

Yukihiro Matsumoto:这只是暂时的,直到终结之时。

最小非预期理论

Bill Venners:在一次会面当中,你说“我设计Ruby来是我的惊讶最小化。我非常高兴全世界的人们告诉我Ruby减少了他们的惊讶,提高了他们对程序设计的乐趣。我现在非常肯定程序员们的思想在全世界都是很相像的。”为什么会有这样的最小非预期理论呢?

Yukihiro Matsumoto:事实上,我并不想声明Ruby遵循最小非预期理论。有些人认为Ruby的设计符合这个哲学,所以他们就开始这样说。事实上我并不这样认为。

我在程序设计中尽量的最小化我的挫折。所以我在程序设计中使我自己尽量不费劲。 这就使我在设计Ruby时的主要目标。我在自己进行程序设计时也喜欢享受乐趣。在发布Ruby并且世界上很多人开始了解Ruby之后,他们说他们感受到了我的感受。他们最终得出了最小非预期理论。但事实上,这经常会造成误导。

Bill Venners:又是造成怎样的误导呢?

Yukihiro Matsumoto:每一个人有不同的技术背景。有些人来自Phython社区,有些人可能来自Perl社区,他们可能为这种语言的不同方面感到惊讶。随后他们就来找到我说,“我对这种语言的这个特性感到非常惊讶,所以Ruby违反了最小非预期理论。”等等。最小非预期理论不是为你一个人设置的。它是在你非常好的掌握了Ruby以后的最小非预期理论。比如,我在开始进行Ruby设计以前是一个C++程序员。我专门进行C++程序设计两三年。在我进行C++程序设计两年以后,他还是经常使我感到惊讶。

参考资源
Ruby in a Nutshell, Yukihiro Matsumoto著,在亚马逊上可以找到:
http://www.amazon.com/exec/obidos/ASIN/020161622X/’>http://www.amazon.com/exec/obidos/ASIN/020161622X/ 
Programming Ruby: A Pragmatic Programmer’s Guide, Dave Thomas和Andy Hunt合著,在亚马逊上可以找到:
http://www.amazon.com/exec/obidos/ASIN/020161622X/’>http://www.amazon.com/exec/obidos/ASIN/020161622X/ 
The Ruby Programming Language, Yukihiro Matsumoto写的一个介绍:
http://www.informit.com/content/index.asp?product_id=%7BA76D1D1E-AD7D-483E-AB8D-38FB188396C5%7D 
与Ruby的发明人的一次会面,Bruce Stewart著:
http://linux.oreillynet.com/pub/a/linux/2001/11/29/ruby.html 
与Ruby发明人的会面Y. Matsumoto, S.Ibaraki著:
http://www.cips.ca/news/national/news.asp?aID=1224 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值