程序员,你调试过的最难的 Bug 是?

伯乐在线导读:调试 Bug?每个程序员工作中必须品。在 Quora 上有一个和 Bug 相关的热门问答帖:《What’s the hardest bug you’ve debugged? | 你调试过的最难 Bug 是?》。在众多回复中,Dave Baggett 的经历最让人惊叹,得到了 2400 多个顶。感谢@cugbabyebar 的热心翻译。

回想起这个bug,仍然让我有些痛苦。作为一个程序员,在发现bug时,你学会了首先在自己代码中找问题,或许在测试一万次之后,你会把问题归咎于编译器。只有在这所有的都不起作用之后,你才会把问题归咎于硬件。

这是我遭遇一个硬件bug的故事。

抛开别的不说,我曾为《Crash Bandicoot》写存储卡(读写)代码。对于一个自大的游戏程序员,这就像是在公园里散步一样轻松愉快,我认为只要几天就写完了。我中止调试六个礼拜。在此期间我做一些其他的事情,但我一直回来处理这个bug——几天内每天几个小时。这个bug实在烦人。

这个bug的症状是,当你需要保存你的进度时,代码会访问存储卡,而大部分情况下没有什么问题…但是偶尔读写会超时…没有任何明显的原因。一个短小的写入经常毁掉存储卡。玩家要保存进度,我们不仅不保存,还擦除他们存储卡上的全部东西。天哪。

过了一段时间,我们在Sony的制作人Connie Booth慌了。我们显然不能带着这个bug发布游戏,而六个星期之后我对于问题出在哪一点线索都没有。通过Connie我们向其他 PS1 开发者求助:有没有人出现过像我们这样的情况?没有。绝对没有任何人在存储卡系统上出现任何问题。

在你绞尽脑汁之后,你能做的唯一一个调试方法就是分而治之:一点点去除程序中的代码,直到留下的代码很少但你仍然出问题。像木雕一样去除没有问题的代码,留下的就是你的bug所在。

在这样的背景下挑战在于,视频游戏是很难去除某一部分的。在你删除模拟重力或者显示字符的代码后,如何运行游戏?

你必须做的是用一个假装做真正的事情,但实际上只是做很简单的不会出现bug事情的东西来替换掉整个模块。你必须写新的支撑代码来让这些玩意正常工作。这是一个缓慢而痛苦的过程。

长话短说:我做完了。我移除了大片大片的代码,相当多,只留下了初始化代码——就是准备游戏运行系统,初始化底层硬件等等。当然,我不能显示加载/保存菜单,因为我截除了所有的图像代码。但是我能够假装用户使用(不可见的)加载/保存屏幕并且请求保存,然后写入卡中。

我最终以一个带有这个bug的很少量的代码结束——但问题仍然随机出现!在大多数情况下没啥问题,但是偶尔会失效。基本上所有的Crash的实际代码都被移除了,但还是这样。这实在是莫名其妙:留下来的代码基本上都没做什么事。

在那时——估计是凌晨3点——一个想法蹦了出来。读写(I/O)涉及精确定时。无论是硬盘、存储卡、蓝牙发送器——随便啥——做读写的底层代码都是根据时钟来的。

时钟让不直接连接到CPU的硬件设备和cpu运行的代码同步。时钟决定了波特率——数据从一头传到另一头的速率。如果计时有什么问题,硬件或者软件或者两者都会乱七八糟的。这真的,真的很糟糕,并且通常导致数据损坏。

如果我们的初始化代码以某种方式弄乱了计时会怎么样?我又看了一遍测试程序中和计时有关的代码,并注意到我们将PS1上的可编程计时器设置到了1kHz(1000跳每秒)。这是比较快了,当PS1启动的时候,默认状态大概是100Hz。因此,大多数游戏将他们的计时器设置为100Hz。

这个游戏的带头(和除我外的唯一)开发者Andy,将计时器设置为1kHz,使得Crash的动作计算更加准确。Andy喜欢矫枉过正,如果我们要模拟重力,我们应该尽可能的提高精度!

然而如果提高计时器频率莫名其妙的干扰了整个程序的计时,故而将这个计时器设置到存储卡的波特率上会怎样呢?

我将计时器代码注释掉。然后我就无法复原这个bug了。但是这并不表示bug被修复了,这个问题是随机发生的。万一我只是运气好呢?

几天过去了,我还是在玩我的测试程序。Bug没有再出现。我回到全部的Crash代码中,修改了加载/保存代码,在访问存储卡之前将可编程计时器重置为默认设置(100Hz),之后设置回1kHz。从此之后没有发现问题再次出现。

但是…为什么?

我重新回到测试程序上,试着检测当计时器设置为1kHz时出现的那些错误的模式。终于,我注意到这些错误出现在使用PS1手柄的人身上。因为我自己很少这样做,所以我没有注意到(为啥我要在测试加载/保存代码的时候用手柄)。但是有一天我们的美工等我去完成测试(我确定那时候我在爆粗口),而他紧张的摆弄着手柄。卡损坏了。“等下,怎么回事?喂,再来一次!”

一旦我发现了这两件事是联系着的,就很容易重现bug:开始写入存储卡,动一下手柄,存储卡损坏。在我看来完全是硬件bug。

我去找Connie告诉他我的发现。她转述给设计过PS1的硬件工程师。她被告知:“不可能,这不可能是硬件问题。”我跟她说问一下我能不能直接和他说。

那个工程师给我打电话了,他用着他的烂英语,我用着我更烂的日语,我们争论一会。我最后说:“我给你一个30行的测试程序,让你在动手柄的时候能够出现这问题。”他答应了。他向我保证,这是浪费时间,而他正在一个新项目上很忙,但因为我们是Sony很重要的开发者,他会试的。

第二天晚上(我们在洛杉矶,而他在东京,所以对于我来说是晚上而他是到了第二天),他给我打电话,不好意思的向我道歉。这是个硬件问题。

我还是没有完全搞清楚问题到底在哪,但是我的印象中,从Sony总部的反馈听到的是,如果将可编程计时器设置到足够高的时钟频率,会影响到主板上时钟晶振附近的一些东西。这些东西之一就是存储卡的波特率控制器,同时也设置手柄的波特率。我不是搞硬件的,所以对于细节我相当模糊。

但是主旨是主板上两个独立部分的串扰,以及手柄接口和存储卡接口数据发送的结合在1kHz的时钟频率下会导致丢位,从而数据丢失,以致卡损坏。

这是我全部编程生涯中,唯一一次因为量子力学debug的问题。

原文链接: Dave Baggett 翻译: 伯乐在线 – CuGBabyBeaR
译文链接: http://blog.jobbole.com/50995/
[ 转载必须在正文中标注并保留原文链接、译文链接和译者等信息。]

程序员幽默

1、程序猿最烦两件事,第一件事是别人要他给自己的代码写文档,第二件呢?是别人的程序没有留下文档。

2、程序猿的读书历程:x 语言入门 —> x 语言应用实践 —> x 语言高阶编程 —> x 语言的科学与艺术 —> 编程之美 —> 编程之道 —> 编程之禅—> 颈椎病康复指南。

3、还没上大学的时候,高三暑假,跑到家那边的图书城想买传说中的C++的书,然后看到一本C#,我一看,嘿,这个++还写得挺艺术的,重叠起来了,于是把C#买了回来……

4、问:程序猿最讨厌康熙的哪个儿子。答:胤禩。因为他是八阿哥(bug)

5、有一天,程序猿们突然发现他们要涨的工资掉到井里啦!大家都很害怕,连忙一个吊着一个,从树上伸到井里去捞工资。正好他们摸到工资的时候,一个老程序员忽然兴奋的大叫:别蠢了,要涨的工资还好好的挂在天上呢!

6、诸葛亮是一个优秀的程序猿,每一个锦囊都是应对不同的case而编写的!但是优秀的程序猿也敌不过更优秀的bug!六出祈山,七进中原,鞠躬尽瘁,死而后已的诸葛亮只因为有一个错误的case-马谡,整个结构就被break了!

7、生活中程序猿的真实写照、一款游戏一包烟,一台电脑一下午。一盒泡面一壶水,一顿能管一整天。

8、程序猿要了3个孩子,分别取名叫Ctrl、Alt 和Delete,如果他们不听话,程序猿就只要同时敲他们一下就会好的…

9、宪法顶个球!中国的法律都是.txt文件,不是.exe文件。

10、同事说,他在写i++的时候总觉的自己写的是 我艹………有木有同感????

11、程序员,年二十有二,始从文,连考而不中。 遂习武,练武场上发一矢,中鼓吏,逐之出。 改学IT,自撰一函数,用之,堆栈溢出。

12、《桃花庵–程序员版》写字楼里写字间,写字间中程序员; 程序人员写程序,又将程序换酒钱; 酒醒只在屏前坐,酒醉还来屏下眠; 酒醉酒醒日复日,屏前屏下年复年; 但愿老死电脑间,不愿鞠躬老板前; 奔驰宝马贵者趣,公交自行程序员; 别人笑我太疯癫,我笑自己命太贱; 但见满街漂亮妹,哪个归得程序员;

13、有一天某程序员去买肉,要了一公斤, 拿到公平电子秤上一称:”额。。怎么少了24克。。”

14、检验代码质量的唯一标准 = 代码review时骂的次数 / 代码review时间 。

15、杀一个程序员不需要用枪,改三次需求就可以了。

16、C++程序员看不起C 程序员, C 程序员看不起java程序员, java程序员看不起C#程序员,C#程序员看不起美工。周末了,美工带着妹子出去约会了,一群SX程序员还在加班。。。

17、问:如何生成一个随机的字符串?答:让新手退出VIM 。

18、“我给你出个脑筋急转弯,你说达芬奇密码的上面是什么?” “这。。太难了吧。。不知道。。。” “笨!达芬奇密码的上面就是达芬奇帐号啊,那达芬奇密码的下面是什么?”“我。。。这。。。还是不知道。。。”“是达芬奇验证码”。

19、随机函数可以帮你实现家庭和谐: Talk(){:top word(1)=”恩!”; word(2)=”好的!”;word(3)=”然后呢?”;word(4)=”有道理”;i=random(4); say word(i) goto top;}

20、程序员爱情观:爱情就是死循环,一旦执行就陷进去了;爱上一个人,就是内存泄漏–你永远释放不了;真正爱上一个人的时候,那就是常量限定,永远不会改变;女朋友就是私有变量,只有我这个类才能调用;情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。

21、女同学们纷纷表示,这年头不找个程序员老公,还真是连节日低价购物权都没了。

22、Delphi象吉普车,什么路上都能开,却在啥路上也开不好;PB就象卡丁车,只能在固定线路上开,到室外就有些不稳;VC象跑车,你开得起却买不起,而且一旦发生故障,想修都找不到毛病在哪;Java象敞棚车,不管刮风下雨还是艳阳高照,都能照开不误;VB就是摩托车,骑的时间越长,你越痛恨它!

23、上联MYSQL明月三千里 下联: XHTML.信号他妈烂!

24、程序员的四大理想:南极有套房,澳大利亚有群羊,全世界电脑死光光,孩儿有个娘。

25、有一种崩溃叫密码输入有误;有一种惊慌叫做账号异地登陆;有一种感情叫隐身对其可见;有一种误会叫人机离线;有一种失落叫没有访问权限;有一种感情叫站点访问失败;有一种无奈叫bug无法复现。。。

26、黑体的锯齿,宋体的沧桑,崩溃的避头尾集。美工永远纠结于网站程序员的粗犷,就像MAC永远不懂PC的忧伤。。。。

27、程序猿追求MM不成,含泪追问:我在你眼里算什么?!MM答曰:真人版的windows优化大师……极客哥们莫伤心,小戴安慰递纸巾。

28、 据说有一位软件工程师,一位硬件工程师和一位项目经理同坐车参加研讨会。不幸在从盘山公路下山时坏在半路上了。于是两位工程师和一位经理就如何修车的问题展开了讨论。硬件工程师说:“我可以用随身携带的瑞士军刀把车坏的部分拆下来,找出原因,排除故障。” 项目经理说:“根据经营管理学,应该召开会议,根据问题现状写出需求报告,制订计划,编写日程安排,逐步逼近,alpha测试,beta1测试和beta2测试解决问题。” 软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”

29、【高效的程序员】当世界末日还有5分钟就要到来的时候。程序员: 让我们在这最后的时刻作些什么吧!女友: 那好,让我们在做最后一次吧!程序员: 那剩下的4分50秒做什么啊?

30、【开发时间】项目经理: 如果我再给你一个人,那可以什么时候可以完工?程序员: 3个月吧!项目经理: 那给两个呢?程序员: 1个月吧!项目经理: 那100呢?程序员: 1年吧!项目经理: 那10000呢?程序员: 那我将永远无法完成任务。

31、一个程序员对自己的未来很迷茫,于是去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”上帝说:“我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的”。于是他去问Lippman。Lippman说:“程序员的未来就是驾驭程序员”。这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”。上帝说:“我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的”。于是他去问Gates。Gates说:“程序员的未来就是榨取程序员”。这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”。上帝说:“我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的”。于是他去问侯捷。侯捷说:“程序员的未来就是诱惑程序员”。这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”。上帝摇摇头:“唉,我的孩子,你还是别当程序员了”。

32、面试官:“熟悉哪种语言”。应聘者:“JAVA”。面试官:“知道什么叫类么”。应聘者:“我这人实在,工作努力,不知道什么叫累”。面试官:“知道什么是包?”。应聘者:“我这人实在 平常不带包 也不用公司准备了”。面试官:“知道什么是接口吗?”。应聘者:“我这个人工作认真。从来不找借口偷懒”。面试官:“知道什么是继承么”。应聘者:“我是孤儿没什么可以继承的”。面试官:“知道什么叫对象么?”。应聘者:“知道,不过我工作努力,上进心强,暂时还没有打算找对象。”。面试官:“知道多态么?”。应聘者:“知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系?”。

33、IT工程师=加班狂+程序员+测试工程师+实施工程师+网络工程师+电工+装卸工+搬运工+超人,有同感的转走。

34、 用一句话总结了HTML,CSS,JS的关系。HTML是名词,JS是动词,CSS是形容词和副词。

35、我是个程序猿,一天我坐在路边一边喝水一边苦苦检查bug。这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱,然后接着调试程序。他可能生意不好,就无聊的看看我在干什么,然后过了一会,他幽幽的说,这里少了个分号。。。分号。。。分号。。。

36、女友对程序员说:“紫禁城占得地方好大呀!”程序员:“杀死那个子进程……”

37、从前有个全国管理系统,是孙中山做的设计,老蒋做的实现,结果老毛写了个病毒,趁着日本黑客对系统做攻击的当口,拿到了管理员权限,把原来那批程序员给隔离了。老邓接手以后,重构代码,出了个2.0版,为了开发速度,遗留了一堆BUG没处理。人们纷纷质疑:是不是核心构架太单一,双核会不会好点?

38、一程序员家的水管坏了,他打电话叫来一个水管工修理。 水管工鼓捣了一个小时,终于把管子修好了,他递给程序员一张600元的帐单。 “600元!”程序员愤怒地说:“我当程序员一天都赚不了这么多钱!” “是啊。”水管工平静地说,“我当程序员的时候也是。”

39、十年前,女:“对不起,我不会喜欢你的,你不要再坚持了,就好比让 Linux 和 Windows 同时运行在一台PC机上,可能吗?”男生听后默默走开,十年后,在一次虚拟技术大会上,我听到一名虚拟技术开发程序员给我讲述了这个故事。

40、程序猿问程序媛:”为什么要离开我,我做得还不够好吗?” 媛说:”别傻了,我们根本就是两个世界里的人,就像在JS里永远都无法调用JAVA类一样,我们之间也是不可能的。” 猿沉默了很久,转身离开了。一个月之后,他在开源社区公布了dwr的完整代码。

41、【程序员被提bug之后的反应】1.怎么可能; 2.在我这是好的,不信你来看看; 3.真是奇怪,刚刚还好好的; 4.肯定是数据问题; 5.你清下缓存试试; 6.重启下电脑试试; 7.你装的什么版本的类库(jdk) 8.这谁写的代码; 9.尼玛怎么还在用360安全 浏览器 ; 10.用户不会像你这么操作的。

42、敲一夜代码,流两行老泪;用三种语言,唯四肢受罪 ; 待五更鸡鸣,遇骤雨初歇;遂登门而去,伫十里长亭;欲望穿泪眼,无如意郎君;借微薄助力,愿寻得佳偶;成比翼双鸟,乃畅想云端;卷情网之内,做爬虫抓取;为连理桂枝,容数据分析;思千里子规,助框广天地; 念茫茫人海,该如何寻觅?

43、早晨一女生抱着一堆书进了阅览室,结果警报响了,大妈让女生看看是哪本书把警报弄响了,那女生把书倒出来,准备一本一本的测。大妈见状急了,把书分成两份,第一份过了一下,响了。又把这一份分成两份接着测,三回就找到了,大妈用鄙视的眼神看着女生,仿佛在说O(n)和O(log2n)都分不清。

44、发现程序员经常熬夜有三个弊端:第一,记忆力越来越差;第二,数数经常会数错;第四,记忆力越来越差。

45、医院回来的程序猿一脸的苦逼样。程序媛:怎么了?程序猿:得了类风湿性关节炎了,我怕会遗传给下一代啊。程序媛:谁说类风湿性关节炎能遗传的?程序猿一脸诧异:类不是继承的吗?

46、知道JAVA程序员和C程序员的差别吗?食堂里,吃完饭就走的是JAVA程序员,吃完饭还要自己 收拾的那就是是C程序员。至于为什么会这样、大家都明白(因为JAVA自带垃圾回收机制、、、C需要手动释放内存)←这就是原因

47、计算机系的男同学追班里一女同学,结果此女总是躲躲闪闪。 男的看没戏,就另找了一个去追,结果这女的不满意了,质问这男的为啥抛弃她。 男的问:“请教一个电脑问题,如果你点击一个程序,总是提示‘没有响应’,怎么办?” 女的说:“马上结束任务。” 男的:“对,我也是这样想的。”

48、一个程序员的吐槽:即要被当做修电脑的,也要被当作做网站的;即要被当作杀毒的,也要被当作盗号的。我要告诉大家,其实我们只是写代码的。

49、如果一个足球界的人“猝死”了,会被怀疑和赌球有关;如果一个官员“猝死”了,会被怀疑和贪腐有关;如果一个农民”猝死”了,会被怀疑和拆迁有关;而如果一个程序员猝死了,那他真的猝死了。

50、老婆是操作系统,一但安装卸载十分麻烦;小秘是桌面,只要你有兴趣可以天天更换;情人是互联网,风光无限花钱不断;小姐是盗版软件,用时记着先杀毒。

51、前台美女三宝:你好,找谁,倒饮料。产品经理三宝:山寨,改版,再推倒。项目经理三宝:进度,流程,做报表。团队经理三宝:团建,开会,评绩效。程序员三宝:闷骚,加班,修电脑。

52、对于程序员来说、没老婆不悲催。悲催的是、没老婆、控制台还不停的提示你Error:could not find the object

53、假如生活欺骗了你,不要悲伤不要心急。《代码大全》会一直陪伴着你……

54、有时候真觉得有些事情如同char*一般,从开始就注定,无法改变。

55、洛阳亲友如相问,就说我在敲代码。

56、”如果你ctrl+alt+del,蹦出任务管理器,你从上到下扫一眼,所有的进程你都认识,知道他们是干什么的,并且知道关掉有什么后果,而且你还能从CPU和内存占用的数字跳动上清楚的知道电脑现在什么状态,那么你应该没有女朋友”………..你妹啊

57、用IE6的吃方便面都没有调料包,你知道不知道……

58、普通青年用IDE(Visual Studio, Eclipse, XCode);文艺青年用VIM, Emacs;二逼青年将IDE设置成VIM模式。

59、程序员换IDE相当于搬家,换主力语言相当于改嫁,换操作系统相当于参加FBI证人保护计划…

60、有两个程序员钓鱼,其中一个钓到一条美人鱼,这个美人鱼上半身是美女,下半身是鱼,于是这个程序员 就吧她放了,另一个问他:Why,他回答说:没有API

61、阿里小米皆自主,百度排名最公平;京东全网最低价,当当爱国很理性;用户体验看新浪,网易从来少愤青;豆瓣从来不约炮,人人分享高水平;从不抄袭数腾讯, 开放安全三六零。

62、编程夜当午,手握小滑鼠。谁知编程辛,行行皆“心”苦;头昏不觉晓,使劲揉眼角。夜夜太辛苦,睡眠知多少;

63、热火朝天的办公室,一精壮青年一边啃着馒头,一边看着眼前产品,愁眉紧锁的他陷入了沉思:产品下一步应该怎么走?如何保证代码质量?如何缩短项目时间?如何控制项目成本?一个个难题需要他思索,抉择。此时,传来项目经理的吆喝:“程旭元,先别敲代码了!给我修下电脑……”

64、原来《人月神话》不是本奇幻小说! 原来《代码大全》不是一堆开源代码! 原来《鸟哥的Linux私房菜》不是教你做菜! 原来《边城》不是教你写代码的! 原来《深入浅出HTML》不是教你How to Make Love

65、文艺程序员写代码追求让别人看懂,普通程序员追求让自己看懂,2B程序员则追求让编译器能看懂;半年后看自己当初写的代码,文艺程序员不知道是自己写的但很容易看懂,普通程序员知道是自己写的但是不太容易看懂,2B程序员埋头看了半天后拍着桌子吼到:“这是哪个SB写的程序!”

66、我真的想让这个世界变得更好,但是他们不给我源代码……

如果像招聘程序员那样招聘木匠

面试官: 您是木匠了,对吧?
木匠: 是的,我就是干这个的。

面试官: 您做木匠有多长时间了?
木匠: 10 年。

面试官:嗯,很好。那现在我有一些技术问题想问问您,看看您是否适合我们团队。可以吧?
木匠: 没问题,问吧。

面试官: 首先,我们目前正在做很多棕色房子的构件。不知您之前建过很多棕色的房子么?
木匠: 我是个木匠,我当然会建房子。不过人们更愿意刷自己喜欢的颜色。

面试官: 嗯,我理解,不过您是否告知,您有多少建棕色房子的经验呢?
木匠: 囧,我真不知道啊。房子建好了,我又不关心刷什么颜色的漆。或许有六个月的经验吧

面试官:六个月?噢,我们在找有更多棕色房子经验的人了,但是否允许我再问问其他问题呢?
木匠:嗯,没问题。但粉刷是粉刷,你应该懂的。

面试官: 好。能聊聊胡桃木么?
木匠:您想了解什么呢?

面试官: 您做木匠时,经常用胡桃木的木材么?
木匠: 当然了,胡桃木、松树、橡树、桃花心木都用过。

面试官: 那您用胡桃木的时间,又多少年呢?
木匠:天哪,我真的不知道。难道我应该要统计胡桃木的数量么?

面试官:嗯,您估算一下吧。
木匠:好不,那我就说有一年半时间在用胡桃木。

面试官:那您认为您是处于一个什么级别?普通胡桃木木匠,还是胡桃木大师么?
木匠: 胡桃木大师?什么是胡桃木大师啊?当然了,我以前是用过胡桃木的。

面试官:那您不是胡桃木大师了?
木匠: 这个,我就是个木匠,所以我用过很多类型的木材了,你知道的,木材都是有区别的,如果您是一位出色的木匠……

面试官:嗯嗯,我懂。但我们目前在用胡桃木了,这没问题吧?
木匠: 胡桃木很好的!不管您要什么。我是一个木匠。

面试官:咱能聊聊黑色的胡桃木么?
木匠:怎么了?

面试官:虽然我们现在已经有了几位用过胡桃木的木匠,但他们都没有用过黑色的胡桃木。您有黑色胡桃木的经验吧?
木匠:当然了,有一些。如果我有更多的经验,是会更好吧。

面试官: 好的。请稍等,我查一下收件箱……
木匠:嗯,您查吧。

面试官:好了,今天还有件事要问您。我们在用 Rock 5.1 敲钉子。您用过 Rock 5.1 么?
木匠: [囧] 自从 Craftsman 买了一个石场,我知道很多木匠开始用石头敲钉子,但是你知道,说实话,我用射钉枪用的更多。铁锤也用过。我发现我用石头,经常伤到我手指,我手上其他地方也受过伤,因为石头太大了。

面试官:但是其他木匠都在用石头了。您是说石头不起作用么?
木匠:没有啊,我没说石头没用,确切地说,我认为我的射钉枪更好。

面试官:嗯。我们的建筑师全部都在用石头,并且他们都喜欢用石头。
木匠: 额,他们当然喜欢,但我整天都要敲钉子,这个…… 我需要工作,如果您想用我的花,我肯定愿意用石头。我尽量别禁锢我的思维吧。

面试官: 好的,我们还有其他一些应聘者,我还要……到时候会通知您。
木匠:嗯,感谢您。很荣幸与您会面。

第二天:

电话响了……

面试官:您好?
木匠:您好。还记得我么?您之前在找有黑色胡桃木经验的木匠,我是您之前面试过的那个木匠。我打电话是想看看你们是否已确认人选了。

面试官:嗯,实际上我们已有人选了。总体来说,我们喜欢您的经验,不过我们决定,还是雇用有很多棕色房子经验的木匠。
木匠:这样啊?那我就丢掉这份工作了,就因为我没有足够多的棕色(房子)经验?

面试官:嗯,这是部分原因,另外部分原因是,我们找到了薪资要求更低的候选人。
木匠:真的吗,那那位有多少经验呢?

面试官:其实他根本就不是木匠,他是一位汽车销售,不过他卖过很多棕色的汽车,并且他常和胡桃木内饰打交道。
木匠: [卡] (木匠同学挂了)

见李开复初印象

前几天去了趟北京,王尼玛让我跟手机app的开发人员深入交流一下,并要和创新工场的一些其他团队进行一些合作。

不巧的是我去的那天,李开复老师有事外出,当时说是我今天回来也见不着了。

昨天下午王尼玛神秘兮兮地让我和王尼美过去找人,一开始没注意,等到了办公室才知是大名鼎鼎的李开复老师来了,要跟我们暴走漫画的核心团队成员聊聊。

见到李开复老师第一眼的印象感觉文质彬彬,但比照片上感觉更瘦更高,上身着粉红色衬衫——刚巧我也是——下身黑色西装裤。

办公室不大,大约有十个平米多,中间是一张很大的L形办公桌,我们和开服老师隔着办公桌面对面坐着。左手边就是飘窗。办公桌上收拾地非常干净一丝不苟,靠窗有台iMac还有台Dell,边上的线都卷地很好。桌上还摞着一些书,有关于产品设计战略的等等,中间还有很多盒名片,名片整齐地排列着。还有个泡茶的壶,感觉是茶室这种地方用的。但老师本人用的是一个巨大的运动型水杯,好像有1L的容量。

右手边有一个简单的书柜,书柜上放了与家人的合影以及女儿的照片。书柜脚边是几扎牌子叫火山岩的纯净水。

左边飘窗后面还有三四盆盆植物,只认识一个虎尾兰。后面还有个一直在轰鸣的大约一米高半米长宽白色外壳的不知道是什么机器。

李开复老师对暴走漫画的情况提出了很多的意见和建议,也根据当前的互联网的形势给出了自己的见解和看法,并且也介绍了很多创新工场内可以交流合作的团队和个人。谈吐温文尔雅,确实非常配得上“老师”的称号。

程序员幽默:他们是如何过河的?

C程序员
每当有大问题,上帝都会跟C程序员进行磋商。
C程序员可以直接在水上行走。

VB 程序员
VB 程序员每天都会跟上帝吃午饭。
他是游泳奥运冠军。

Turbo Pascal 程序员
Turbo Pascal 程序员偶尔跟上帝交谈过几句。
他游泳很不错。

Fortran 程序员
Fortran 程序员曾和上帝碰过几次面。
他可以努力让自己漂浮在浅水中。

QBASIC 程序员
QBASIC 程序员认识哪个是上帝。
不过他连在自己的浴缸里不溺水都有困难。

LOGO 程序员
Logo 程序员唯一了解上帝的地方在于,“上帝”这个单词对他来说足够简短能念出来,但他拼写这个单词还有问题。
他需要其他人把他抬过河。

汇编语言程序员
其实汇编语言程序员就是上帝。
当他想过河的时候,他会分开水面。

Forth 程序员
Forth 程序员从来不会看他遇到的河流一眼因为这违背了他虔诚的信仰,于是他过河都是走桥的。

各种奇怪的中文编程语言(转)

1、易语言

这语言是本文中最不奇怪的语言了……所以不做介绍,只放上一段Hello World。

.版本 2
.程序集 程序集1
.子程序 _启动子程序, 整数型
标准输出 (, “你好,世界!”)
返回 (0)

2、丙正正

丙正正是啥?答曰C++。。。C排第三个,所以是丙,代码实例如下:

空 象棋檔::設定註解(字元 *s,整數 n)
{
若(n >= 最大註解數)
對於(;最大註解數 <= n;最大註解數++)
註解[最大註解數]=NONE;
若(s==NULL 或 字串長度(s)==0)
傳回;
若(註解[n]!=NONE)
刪除 註解[n];
註解[n]=新 字元[字串長度(s)+1];
字串複製(註解[n],s);
}

这不就是翻译么。。。

3、习语言

另一个类C语言……全中文关键字:

包含 “习语言系统.接口”

整数类型 主函数()
{
文件类型 *fp;
整数类型 ch; 【注意这里要定义为整数,以便接受文件结束符号】
如果((fp=文件打开(“练习13-2.文本”,”写+”))==空指针)
{
格式输出(“无法打开文件:练习13-2.文本! “);
暂停();
退出(1);
}
格式输出(“输入一串字符:n”);
ch=输入字符();
若符合条件 (ch != 宏_换行键 ) 重复
{
文件写字符(ch,fp);
ch=输入字符();
}
文件复位(fp);
ch=文件读字符(fp);
若符合条件(ch!= 宏_文件结束 ) 重复
{
输出字符(ch);
ch=文件读字符(fp);
}
格式输出(“n”);
文件关闭(fp);
暂停();
返回 0;
}

不由的想说这些字打起来肯定很费劲……

4、PerlYuYan

这个汉语编程是基于Perl语言的,不过它的语法号称是文言文!看如下一段代码

!/usr/local/bin/perl

use Lingua::Sinica::PerlYuYan;
用警兮用嚴。
印道
1..1
哉兮

印編曰雜申雜申矣
又曰ok矣
又曰1矣

亂曰
國無人莫我知兮 又何懷乎故都
既莫足與為美政兮 吾將從彭咸之所居

它其实是什么呢……如下翻译

用警兮用嚴。 use warnings; use strict;
印道 print ”
1..1 1..1
哉兮 “;
印編曰雜申雜申矣 print sprintf ‘%s %s’
又曰ok矣 ,’ok’
又曰1矣 ,’1′
亂曰 END

本文末,贴一段最恶心的PerlYuYan代码。。征求翻译达人:

!/usr/local/bin/perl

The Sieve of Eratosthenes – 埃拉托斯芬篩法

use Lingua::Sinica::PerlYuYan;

用籌兮用嚴 井涸兮無礙。
印曰最高矣 又道數然哉。
截起吾純風 賦小入大合。
習予吾陣地 並二至純風。
當起段賦取 加陣地合始。
陣地賦篩始 繫繫此雜段。
終陣地兮印 正道次標哉。
輸空接段點 列終註泰來。

/Autrijus/

SuperCache的lock选项性能测试

上次说到了SuperCache的lock选项可以解决DogPileEffect。那么效果究竟如何,我做了个简单的测试:

我使用了Ruby 1.9.3-p392,Rails 3.2.12,只建了my_controller.rb,其中模拟了一个10秒慢速请求,为了测试方便,缓存时间只设置为5s:

服务器端使用了unicorn,启动5个worker,测试端开100个并发,50000次请求。

不使用lock:

使用lock

结果很明显,启用了lock之后,SuperCache的长达10s的请求数明显更少,使得平均响应速度有明显的提升。

在实际的生产环境中,一般长达10s的请求很少,只缓存5s的请求也很少,但是通常长时间的请求伴随着都是较高的数据库负载,一旦大量出现,容易拖垮整个服务。通过这种机制,就可以明显地让缓存失效时负载曲线平滑。

暴走漫画的服务器使用了这个机制之后,使得平均响应速度从300ms左右降低至了200ms左右。

nginx+NFS vs nginx+memcached

前面我写了SuperCache的介绍之后,两位朋友都表示他们在生产环境中使用了NFS,我直觉是NFS性能并不如memcached好,因为NFS牵扯了一个文件系统,但是NFS可以很好利用nginx的gzip_static。于是我做了这个评测。

我准备了三台服务器,一台服务器A用于提供memcached和NFS服务,B服务器上有nginx,挂载了A服务器上的NFS,最后通过C服务器对B服务器进行压力测试。三台服务器都是某云服务上的三台VPS,4核8G内存。

为了模拟真实环境,我首先给NFS和memcached准备了200,000条4000字节的html文件,路径格式为/articles/.html,内容是一些随机字符。

首先单纯就写入的速度来看:

写入速度明显是memcached占优,这是很容易理解的。因为NFS走了文件系统,而memcached减少了文件系统所需的诸如磁盘操作以及索引等等额外的东西。

然后我使用了siege对其进行测试

NFS

NFS服务器端/etc/exports配置

使用NFS的nginx配置:

NFS后端的结果如下:

我还额外对所有文件进行了gzip压缩(过程非常缓慢),然后启用了gzip_static:

结果效率并没有提升,原因不明。

memcached

使用memcached的nginx配置:

memcached后结果如下:

访问速度上基本没有太大差异,memcached略胜一筹

结论

NFS基于文件系统,Memcached完全存与内存。

所以,在需要频繁更新缓存的场景中,NFS受限于IO和网络条件,更新的效率较低。
由于NFS不具备memcached这种自动过期的功能,必须额外写脚本进行Sweep,可能不够方便
同时局限于文件系统的结构,清理过程中需要遍历文件也是十分消耗时间和磁盘IO的。

但如果不需频繁更新,NFS基于文件系统的特性更能节省内存。

另外我对NFS配置不够了解,对于NFS如何做高可用性不太清楚,但如果是memcached的话,则相对比较方便,可以在upstream中添加多个节点,并配置memcached_next_upstream等选项。

还有本文没有测试的:

  • 如果AB机器是同一台服务器,那么结果如何
  • NFS有一些配置选项,比如async选项,我在这里配置的是sync选项,是否对性能有所影响

[转]关于“抛球悖论”的一点思考

原文地址 http://techneresearcher.wordpress.com/2011/03/19/%E5%85%B3%E4%BA%8E%E2%80%9C%E6%8A%9B%E7%90%83%E6%82%96%E8%AE%BA%E2%80%9D%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%9D%E8%80%83/

[注]此文是当年在吴国盛老师手下读书时写的,N年前的事情了。记得当初我写完后还直接发给吴老师看,不过倒没见他对此有什么反应。吴老师还是我的硕士论文指导老师,不知不觉很多年过去了……贴出这篇旧文,回忆下当初充满书香门第情调的那种初生牛犊般的求学感觉。

关于“抛球悖论”的一点思考

王 键

一、什么是抛球问题

在《自然本体化之误》(湖南科学技术出版社,1993年)一书关于芝诺悖论的一章中,该书的作者吴国盛教授谈到了一个与芝诺悖论相关的问题:即关于“无 限机器”(infinite machine)所产生的悖论,也被称为“超级任务”(super task)。 实际上也就是所谓的抛球悖论(问题)。

原书中的相关论述如下:“最有名的无限机器是抛球机器,它是这样设计的:一个小球从a处开始向b处抛动,令小球从a处抛到b处时花 1/2分钟,从b抛回a处花1/4分钟,依此类推,来回抛球的时间依次是:

1/2,1/4,1/8……,1/2n……

到第n次时所花全部时间是:

T=1/2+1/4……+1/2n=1-1/2n

现在要求机器在时间到达一分钟时停下来。可是问题出现了,人们发现无法确定小球最终落在何处。从上式看,当n取奇数时,落在b处,取偶数时落在a处, 可是小球越抛越快,只有在经过无限次之后才回到达一分钟,但一个无限数是没有奇偶之分的,因此,搞不清楚一分钟的时候小球处在什麽位置,也就是说,小球没 有终点,超级任务无法完成。”(参见该书第94页)

应该说,从逻辑上看这段分析是没有任何问题的。而对于这一类的问题,吴教授也表明了自己的态度:“许多人已经证明了,超级任务是不可能完成的,无限机器不存在。”(同上,第94页)

二、它的另一种表述形式

但上面这个“抛球机器”的例子有点别扭,因为它不够直观。我们很难想象一个有质量的小球可以无限加速,无穷摆动。那么很简单地,我们完全可以换个方式重新表达刚才的问题,把它转化一下:不妨暂且称其为“开关灯问题”:

假设有两盏灯,分别是a和b,现在让灯a先亮,过1/2分钟后让灯b亮,同时灯a熄灭,再过1/4分钟让灯a亮,同时灯b熄灭,依此类推,每次交换亮灯所间隔的时间依次是:

1/2,1/4,1/8……,1/2n,……

到第n次时所花全部时间的总和是:

T=1/2+1/4……+1/2n=1-1/2n

现在要考察的是:在时间刚好到达一分钟时,究竟是哪个灯在亮?是灯a还是灯b?实际上这个问题完全等价于刚才的抛球机器问题,重要的一点是:换一种不同 的表达方式可以从另一个角度使问题的实质显露的更加清楚一些。对于这个亮灯的问题,答案产生的矛盾显然是和抛球问题完全类似——在时间到达一分钟时,两个 灯不能都在亮,那么也无法最终确定到底是哪个灯在亮。

三、解释这一问题的尝试

但是,对 于那个“抛球机器”问题,悖论究竟是如何产生的呢?刚才已经说了,这段论述对问题的分析中的分析并没有逻辑上的错误。然而,它的出发点却可能是错误的—— 要产生悖论,所隐含的一个前提条件是:当时间到达一分钟时,小球只能具有一个固定的位置,要麽a,要麽b。这也就是说,如果“小球同时在a和b两个位 置”,则被认为是一种“不可能”出现的状态。而这就是所谓抛球机器悖论产生的一个基本前提。把小球换成灯泡的例子,道理也是一样的:它假定了在到1分钟 时,两个灯泡不能同时亮。由此引出悖论。问题在于,这个假定同问题的预设存在矛盾:按照题目的设计,既然到了一分钟,也就意味着次数n变成了超穷树,即 “无穷大”。那么在这个时刻,两次亮灯之间的时间差已经变成了趋零的“无穷小”。在这种情况下,两个等不能同时亮的假定已经开始失去意义。既然如此,悖论 不是自然被消解了么?

总之,这一“抛球悖论”初看起来的确有些自相矛盾,但其实却不是这个问题本身,而是这个悖论的产生:问题中出现 的小球速度无限大、违反惯性定律、加速过程如何可能等等本该颇受质疑的超经验现象都被不加怀疑地予以接受,然而当结果产生了一个超经验的现象时,它却被当 作是一个“悖论”而出现了。同样,换作灯泡的例子,两个灯泡同时亮的不可能性,却已经成为了题目预设的必然结果。而如果问题的前提本身就存在某些反常,那 麽由这些前提而产生的反常绝对不应该被当成一个“悖论”或者“反常”。

四、同芝诺悖论的区别

关于这两个悖论,我们认真思考一下就会发现它和芝诺悖论存在着一个很大的区别。当然,如果追根溯源,这几个悖论实际上在一定程度上都可以归结为数学问题。

这就仿佛同这样一个函数相类似:

f(x)=sin(1/x)

现在问此函数在0点取值是什麽?

从数学分析的观点来看,在0点, 函数值f(x)发散,且有界但并不收敛。因此从数学的观点看:问函数f(x)在0点取什么值 就是一个没有意义的问题(当然哲学家们也许并不这麽看)。

对于芝诺的悖论,关键在于一点:如果把芝诺问题化为数学函数,那麽当这个函数f(x)的变元x 趋向于某一定值时,函数值f(x)也是趋向于某一定值的(换句话说,它的数学模型是一个连续函数)。而对于无限抛球问题,将其化为数学函数后,我们会发现 此函数与芝诺悖论对应的函数完全不同:对于这个函数f(x),当变元x 趋于某一定值时,函数值f(x)将是有界的但不是收敛的(与我举的第一个函数的例子相类似)。

五、是否能得出一个结论?

我以为,出现以上悖论的实质在于赋予某些“看似矛盾”的数学结构以经验的内容。这些数学结构,也一度曾让数学家们感到困惑。但是随着数学分析基础理论的建立和奠定,它们逐渐不再被看成悖论。然而,在被赋予了某些具体经验内容之后,它们仍然是难以被理解和接受的。

如此说来,我更倾向于认为:至少可以说,从局限在数学内部的观点来看,无限抛球问题并不存在悖论。但是跳出数学的圈子、从其他的观点来看,是否也可以这麽说倒还可以存疑。

不过,我感觉提出的这个问题似乎还不够清晰——对这个问题的回答,我暂时只能保持沉默。

芝诺悖论

(来自网络)

芝诺的运动论辨全部得自亚里士多德在《物理学》中的转述,有四个:

1、二分法。物体在到达目的地之前必须先到达全程的一半,这个要求可以无限的进行下去,所以,如果它起动了,它永远到不了终点,或者,它根本起动不了。

2、阿喀琉斯(一译阿基里斯)。若慢跑者在快跑者前一段,则快跑者永远赶不上慢跑者,因为追赶者必须首先跑到被追者的出发点,而当他到达被追者的出发点,慢跑者又向前了一段,又有新的出发点在等着它,有无限个这样的出发点。(这个悖论有一个著名的故事,就是阿喀琉斯与乌龟赛跑,等乌龟先跑出一段后阿喀琉斯再起跑追赶,结果则是飞毛腿阿喀琉斯怎么也追不上乌龟。)

3、飞矢不动。任何东西占据一个与自身相等的处所时是静止的,飞着的箭在任何一个瞬间总是占据与自身相等的处所,所以也是静止的。

4、运动场。两列物体B、C相对于一列静止物体A相向运动,B越过A的数目是越过C的一半,所以一半时间等于一倍时间。

这是芝诺为了捍卫他老师巴门尼德关于“存在”不动、是一的学说,提出了著名的运动悖论和多悖论,以表明运动和多是不可能的。他的结论在常人看来当然很荒谬,但他居然给出了乍看起来颇令人信服的论证,故人们常常称这些论证构成了悖论或佯谬。不过,若细细推敲,其结论未必荒谬,其论证未必令人信服,故中性的称这些论证为芝诺论辨最为合适。

历史上对于芝诺悖论的评价和驳斥:

19、20世纪之交的绝对唯心主义者象布拉德雷全盘接受芝诺的论证和结论。他视运动、时间空间为幻象,芝诺论辩正好符合他的主张,当然全盘接受。在《现象与实在》中他写道:“时间与空间一样,已被最明显不过的证明为不是实在,而是一个矛盾的假象。”除布拉德雷之外,哲学史上大部分哲学家认为芝诺的结论是荒谬的,其论证有问题。不过,在不断检查其论证毛病的过程中,人们反倒发现了芝诺论辨的深刻之处。常常是人们自以为解决了芝诺悖论,不多久就又发现其实并没有解决。

已知最早的批评来自亚里士多德。关于二分法,他说,虽然不可能在有限的时间越过无限的点,但若把时间在结构上看成与空间完全一样,也可以无限分割,那么在无限的时间点中越过无限的空间点是可能的;关于阿喀琉斯,他说,如慢者永远领先当然无法追上,但若允许越过一个距离,那就可以追上了;关于飞矢不动,他说,这个论证的前提是时间的不连续性,若不承认这个前提,其结论也就不再成立了;关于运动场,他说,相对于运动物体与相对于静止物体的速度当然是不一样的,越过同样距离所花的时间当然也不一样。亚氏批评的意义主要在于使芝诺论辨显得更为明了,前面对诸论辨的转述就显然参照了亚里士多德的这些批评。

黑格尔对芝诺悖论的解决是:“运动的意思是说:在这个地点又不在这个地点;这就是空间和时间的连续性,——并且这才是使得运动可能的条件。”这个解决方法要点在于强调时间空间的连续性,而且对连续性赋与新的、特有的解释。不过,它似乎并没有直接针对芝诺论辨本身来提出批评,而且关于连续性的独特解释与数学和逻辑所要求的精确性不相容。受黑格尔的影响,我国哲学界一般认为芝诺不懂得连续性和间断性的辩证关系,把这两者机械的对立起来,所以造成运动悖论。这大意是说,芝诺的论证没使用辩证逻辑,因而是无效的。这种批评同样是笼而统之,不关痛痒。

进入19世纪以后,人们开始运用数学分析的方法来考证芝诺悖论。就那“阿喀琉斯与乌龟”这个悖论来说吧,现在的小学生遇到类似的追赶问题都会很容易的建立起一个方程组来算出所需要的时间,那么既然我们都算出了追赶所花的时间,我们还有什么理由说阿喀琉斯永远也追不上乌龟呢?然而问题出在这里:我们在这里有一个假定,那就是假定阿喀琉斯最终是追上了乌龟,才求出的那个时间。但是芝诺的悖论的实质在于要求我们证明为何能追上。

高等数学运用极限理论与微积分也可以得出相同的结果,而且其解答思路与悖论的表述相似,就是把一段一段跑的距离加起来,这些数列虽然有无限多项,但其总和并不是一个无穷大的数目。但是问题是,即便综合是一个有限的数,但是它却是由无限多的数(无限多的步)组成的,作为一个活生生的人,阿喀琉斯如何来实践着无限多个的步骤呢?

事实上,隐藏在这几个悖论的背后,是我们对于运动本质的思考,即何谓运动(与参照系的关系)?怎样运动(如何迈出第一步)?

希腊时代犬儒学派的创始人第奥根尼对芝诺论辨有一个回答。据说当他的学生向他请教如何反驳芝诺时,他一言不发,在房间里走来走去,学生还是不理解,他说,芝诺说运动不存在,我这不是正在证明他是错的吗?这个故事很长时间被作为一个笑话,人们大多相信,第奥根尼根本没有弄懂芝诺的意思。芝诺并不是说在现象界没有运动这么一回事,他当然承认有,但他要说的是,虽然满目是物体在飞舞,但运动是不合理的,我们可以通过逻辑证明运动是不可能的。因此,我们所看到的运动是假象,并不真实,因为真实的东西一定是合乎逻辑的。

然而我想,近年来科学家们正在研究的时空可能的量子结构也许会为芝诺悖论带来一个新的思考方向。

具体来说,在人们的传统观念中,时间和空间(也可以结合起来说成是时空)都是连续的。正如100多年前,绝大多数人和科学家认为物质是连续的。尽管自古以来一些哲学家和科学家曾经推测如果把物质分解到足够小的块,就会发现它们是由微小的原子组成,然而当时几乎没有人认为能够证实原子的存在。今天我们已经得到了单个原子的图像,也研究了组成原子的粒子。物质的粒子性已经是过时的新闻了。 在最近几十年中,物理学家和数学家想知道空间是否也由离散块组成的。它是连续的,就像我们在学校里学到的那样,还是更像一块布,由根根纤维编织而成?如果能探测到足够小的尺度,我们是否能看到空间的“原子”,它们的体积不能被分割成更小的形态?对时间来说,情况又怎样呢?自然界是连续变化的,还是世界以一系列微小的步伐来进化。

如果世界真是如此构建的话,那么时空也就变成了“一份一份”的单元,我们就能得到一个最最极限的长度,一个最最极限的面积,一个最最极限的体积(圈量子理论认为,这个长度是普朗克长度10^-33厘米,面积是普朗克长度的平方,体积则是普朗克长度的立方)。而这在原则上就否定了芝诺第一、二悖论关于时空是连续的假设。

于是再回过头看芝诺关于阿喀琉斯追赶乌龟的悖论。随着阿喀琉斯越来越接近乌龟,他们之间的距离差越来越小,但这个距离现在并不是趋于无穷小,而是有一个极限――空间量子的最短距离。因为阿喀琉斯的速度大于乌龟,于是在这一确定距离的路程上他经过的时间要比乌龟短――胜负已分,在这里阿喀琉斯终于超过了乌龟!

类似的道理,对于第一个悖论,全程的中点并不是可以无限分割的,它同样遇到了空间量子距离的限制――因此从根本上否定了这个悖论。

但是,对于第三和第四个悖论却比较难回答。前面说了,第一第二个悖论事实上就是建立在假设时空是连续的基础上来说明无论是绝对运动或是相对运动都是不可能的;而第三和第四个悖论却体现了假如时空不是连续的,运动同样是不可能的。还有,芝诺悖论它不仅涉及到运动场所(背景)本质的特性问题,如第一、三悖论;也有关于运动本身(包括运动的发生和过程)的考量,如第二、四悖论——这是芝诺悖论的另一大难题。但是随着物理学的发展,我们对于运动本性的问题可能也可以回答一部分。

先来看一个实验,乃是关于中子是如何在重力场中下落的。东西往下落,这可谓是最稀松平常的一个运动现象了,它是最最基本的运动方式之一,我们每天都能见到,实践这种运动,并且说白了,芝诺的飞矢实际上做的就是这种运动。那么,在中子下落的过程中,科学家们观察到什么有趣的事情了吗?答案很出乎人们的预料:实验过程中的中子在下落中都只出现在不连续的高度上!这说明,重力场本身是已量子化的,运动其间的物体的运动过程同样是量子化的,它就如电子跃迁只能出现在不连续的能级上的行为一样(这已被量子力学所深入考察印证)。于是,整个世界就如一部异常精细的电影,我们如胶片般一帧一帧地随着时间运动、演化。只不过一帧帧间的时间间隔不是0.04秒,而是一单位普朗克时间。帧与帧间的动作差别也是极其微小的,最小单位乃是一单位普朗克长度、面积或是体积。芝诺对于飞矢不动的现象的论断是正确的,因为一帧画面它就是静止的,但他由此导出的运动不可能的结论却是值得商量的。

也许你要问,为何到现在我还不能说芝诺是错的,仍要用“值得商量”这个词?那是因为无论前面说的时空结构是量子化的,还是运动过程是量子化的也好,这些都只解决了一个“运动过程是可能的”的问题,它只是将经典的芝诺悖论转化为“量子芝诺悖论”而已。芝诺悖论的更深的意义在于它还质疑了“运动的发生”也就是为何会动或称“第一步”的问题。就算把“飞矢”的问题量子化后,如果加进考虑“坍缩”,还会出现一个奇怪现象:假如我们一直观察系统,也就是飞矢的“每一帧”,那么因为我们的观察它的波函数必然总是在坍缩,薛定谔波函数从来就没有机会去发展和演化。这样,它必定一直停留在初始状态,看上去的效果相当于飞矢停滞了。在这个问题上我还没有什么好的思路,有一点想法就是它也许与我们的精神对于量子效应的决定作用有关:意识使得波函数坍缩——使得物质波不再随着薛定谔方程演化,而成为一个客观实在(仅限于量子的哥本哈根解释)。物质由这样诞生,反过来说要是使运动也有可能,人意识的作用大概也必不可少吧。想到这里,我不由得再次敬佩起芝诺来,他所提出的悖论是多么的深刻啊,真是值得我们好好探究再探究。