Reload Original PagePrint PageEmail Page

一个神奇的故事——为什么程序能够工作 | shell's home

今天被一个妹子问到一个专业问题。每天看你们在写程序,为什么你们写一些东西,就会出现很多神奇的功能。

好吧,这是很多“外行”很难理解的问题。大多数职业非职业程序员,只要写过一点程序,就不会对这种事情表示惊奇。然而问题是,很多人并没有深刻的认识到,这个问题其实非常难解答,可以算是计算机本质性问题之一。

我当时的解答有点奇怪和玄幻色彩。我打了个比方,例如你有个萝卜头,你扇它一下,它会往前蹦一下。你又有个电灯,按一下开关就亮,按一下开关就灭。那么你把两者组装起来,在旁边立个牌子,扇一下萝卜头灯就亮,再扇一下就灭。事情看起来就很神奇了。至于萝卜头为什么会这么做,这个事情我并不了解。

实际上,这个回答很让人莫名其妙。什么萝卜头和奇怪的世界观阿,这不是在讲程序吧。好吧,我把整个故事讲的稍微完整一点。作为对所有有这个问题的人的解答。

在讲整个故事前,让我们稍微的放开一点想象力。例如我们有一个老鼠,一盒一碰就会掉下奶酪的奶酪盒,一个转笼(就是老鼠经常在里面跑的那种),一个小的皮带环,一个风扇,一个导轨,就是扔个铁球,就能沿着导轨滚动的那种。

我们把转笼和风扇用皮带环连接起来,然后里面放上白老鼠,上面放上奶酪盒,旁边放一个导轨,然后用黑盒子罩住,旁边放一张纸。这是一个神奇的设备,当你向里面投入一块钱,就会有风吹出来。因为钱沿着导轨滚下来,会碰到奶酪盒。老鼠就会开始跑,带动风扇吹出风来。

好像很神奇的样子哎,投币式风扇。

哎哎等等,你弄了那么复杂的一堆东西,就是为了吹风扇?那为什么不用电风扇呢?

其实我们的老鼠盒子和电风扇具有一样的结构。老鼠是动力源,奶酪盒是开关,皮带环是传动系统,风扇负责执行。我们只要正确的将每个具备功能的部件组合起来,就可以产生奇妙的效果。至于每个部件为什么能达到他自己的功能,这个我们并不关心。设计部件的人会为我们做出合适的实现。

同样的组合,如果是电扇,我想大部分人都不会表示不理解。然而如果换成老鼠盒子,大家就会觉得很神奇,如果换成程序,就会觉得更神奇了。

其实程序和老鼠盒子非常类似。程序的每个部件都有自己独特的功能,我们只要负责将这些部件以合适的逻辑连接起来,就可以完成新的功能。当然,如何连接部件是一个非常有技术含量的问题,需要专门的培训。

然而,程序比老鼠盒子更加复杂,更加让人觉得神秘莫测的地方是。程序经常出现一些我们听不懂的东西。同样用老鼠盒子做比方,请想象一下以下事件:

这个系统还没上线,就被产品经理吐槽了一把。这个系统的第一个问题,就是能开不能关。一旦老鼠开始跑,直到没有力气之前系统是不会停的,无论人在不在。为了修正这点,我们再弄了一个传送带,用皮带环和转笼连接。当老鼠跑上一分钟后,传送带就会把奶酪传送到老鼠面前,老鼠就会吃掉奶酪,从而停止奔跑。

系统终于上线了,不过有奇怪的问题。系统不知道为什么,有的时候工作有的时候不工作。

经过工程师的检测,这主要是老鼠会吃饱。一旦老鼠吃饱了,奶酪就失去了吸引力。因此每隔三四块奶酪就会停止工作。不过老鼠饿的很快。所以十分钟后又恢复了工作。所以表现就是不稳定。

工程师为了紧急修复这个问题,让每次掉出来的奶酪减小到了很小的尺度,大约是原来的三分之一。这样就算十分钟连续工作,也不会吃饱。

没多久,这个盒子碰到了黑客。有个人掀开盒子看了一眼,发现导轨只辨识撞击,不辨识是否是货币。因此出现了大量铁球替代硬币的事情,扔个铁球就开始吹风。市场部表示工程师需要紧急解决这个问题。

工程师巧妙的将轨道绕了几个弯,并减小了弯上的轨道宽度。如果投入物是硬币,那么他的重量和形状就会使得他正确的通过弯。而铁球或轻或重会从导轨上掉下去。从而解决了这个问题。

很快,系统又遇到了一个问题。有人一次性的投入了两个硬币,因此击中了奶酪盒两次。老鼠只跑了一分钟就吃了两块奶酪。因此这个人又重复的连续投了多次货币。这导致老鼠吃饱了,因此盒子不工作了。客户大发雷霆,打电话到售后骂人,老板很生气。

工程师发现这是因为奶酪被连续放置的缘故。于是他们设计了一个连杆。当老鼠开始工作的时候,就会启动连杆,关闭投币口。这样就不会引起老鼠连续吃东西了。而老鼠停下的时候,连杆就会打开。就可以继续投币。

经过了一个圣诞节,大家都不去玩老鼠盒子,老鼠饿死了,老板把运营骂了一顿。

运营乖乖去换了一只老鼠,并让工程师在盒子里装了一个摄像系统,可以让他们看到老鼠是否存在。

现在我们有一个神奇的盒子,投币就可以吹风。这个盒子是由一个带着摄像系统的黑色外壳,一个盘旋的及其复杂的导轨,一个奶酪盒子,一个传送带,一个连杆,两组皮带环,一个转笼,一只老鼠,一个风扇组成。为什么会这样?一个妹子问。。。