懒惰——程序员的美德之一

Perl 语言的发明者 Larry Wall 曾经曰过:

“你们当中很多人都知道程序员的美德。当然啦,有三种:那就是懒惰、急躁以及傲慢。”

“Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris.”

当然了,Larry 可能有点嘲讽的意味,不过就懒惰而言,仔细想想还真能算是美德呢!

有种说法是“懒人改变了这个世界”,比如有人说,洗衣机就是懒人们发明的,因为他们懒得去洗衣服。

类似还有比如交通工具,因为懒人们懒得走路,就发明了形形色色的代步工具。

所以呢,从某种角度上说,懒人促进了这个世界的进步!在编程方面呢,道理也是类似的。

因为厌倦了日复一日的测试,打包,上传,部署,懒人们想,能不能简单动动手指敲一个命令就能完成这些呢?于是他们捣鼓出了各种构建工具,写出各种脚本,将这些过程通通自动化。等要做这些的时候,轻敲键盘,计算机就默默地在后台为我们完成了这一切!

因为厌倦了为浏览器间的差异而去写不同的代码,懒人们说,嘿,能不能统一一下呢?这样大家都轻松。于是他们坐下来讨论各种规范,制定出统一的标准。自然,种种规范,标准的出台极大的促进了软件行业的发展。

所以你看,有时懒惰还真是一个美德呢!

用 javascript 来回答宇宙外面是什么

宇宙外面是什么呢?估计这个问题要困扰很多人,让我们用一段javascript代码来回答一下。

一、从一段代码说起

[js]var 地球 = { 名字 : "地球", 女友 : "月亮", 外面 : { 名字 : "太阳系", 老大 : "太阳", 老二 : { 名字 : "木星", 二奶 : "木卫二(Europa)", // eclipse 3.3版本代号(欧罗巴) 小三 : "木卫三(Ganymede)"// eclipse 3.4版本代号(盖尼米德) }, 外面 : { 名字 : "银河系", 外面 : { 名字 : "宇宙", 年龄 : 13700000000 } } } }; var 宇宙 = 地球.外面.外面.外面; alert("宇宙的年龄是:" + 宇宙.年龄 + "," + "宇宙的外面是:" + 宇宙.外面); // alert("宇宙的外面在哪:" + 宇宙.外面.位置);[/js] 怎么运行呢?很简单,拷贝出来,以谷歌浏览器Chrome为例,按F12,出来开发人员工具,选择最右端的“Console”,粘贴,回车!答案即可揭晓:

看到了吗?华丽丽的一个undefined(未定义)

image

二、自然语言由于过于灵活而失去严谨与精确


其实看了代码我们就已经明白是这样的结果了,在这里我想说什么呢?我们的日常语言其实是很不严谨,很不精确的,当层次很多时甚至引发了矛盾我们却还浑然不知,以下图为例

image

我想这就是很多人的宇宙观,里面的一层层都有着明确的边界,但到了宇宙这一层面,则是一种开放式的定义,是没有边界的。但当这种层次很多时,我们常常忘记了我们前面预设的一些前提。

比方说,你不会去问一个女生说:“你的JJ有多长之类的”

请原谅一时没有想到更好的例子~

因为这很明显是一个有问题问题,如果问题本身就有问题,又怎么能去正确地回答呢?

古语云:皮之不存,毛将附焉!

当皮都没有的时候,你问皮上的毛是什么颜色,显然无法回答,所以这位女生最好的回答大概只能是纠正你说:“木有小JJ!”当然了,我们肯定不会去问这类问题,因为矛盾太明显了。

但有时候矛盾很隐藏得比较深,比如这个宇宙外面是什么的问题,我们常常先认定了宇宙是开放的,是没有边界的,而我们说里面,外面则又暗示了它有个明确的边界。毕竟只有有明确的边界我们才能去说“里面”和“外面”,所以这里面是有矛盾的,除非我们先把宇宙是否有边界的这一前提讨论清楚,不然讨论后一个问题就没有意义。

三、编程语言则相对严谨精确得多


在javascript,你要是没有定义,就相当于前提都没达成,undefined既不是,也不是

当然了,在编程中这个常常可以当成false,但如果使用严格等于去判断,即三个等号===,那么它跟false是不等的。

既没有说它是什么,也没有说它不是什么。undefined就是undefined,就是未定义。连外面都还没定义,你却试图问宇宙外面是什么,自然就是undefined了。如果你试图跳过它去进一步追问“宇宙.外面.位置”:

image

那么运行时javascript就会给你报错了。当然你写的时候是很自由的,javascript没有编译的概念,你写错了不运行它也不知道,不过现在的IDE也很强大了,以我使用的eclipse为例,当你敲入“宇宙.”之时,提示就已经出来了

image

我们可以看到,除了核心javascript中的几个属性和方法之外,就是我们定义的“名字”与“年龄”两个属性了。根本就没有所谓的“外面”,当然也更谈不上“外面.位置”了!