编程到底难在哪里?

图片:Pixabay / CC0 《编程到底难在哪里?》

随手改的一个段子骗了这么多赞,很不好意思,所以决定更新一点稍微正经的内容。

正确答案在下面 @丁树凯 这里。弗雷德里克·布鲁克斯博士在 33 年前(1986 年)写下《没有银弹》这篇论文,尽管编程的技术更了好几代,但文中的论断用来描述三十年后的今天,仍然分毫不差。

软件的根本问题在于软件本身,也就是计算机本身。更一般地说,在于计算理论本身。

想像一下,物理学家们致力于找到大统一模型,这个模型用一个数学公式就描述了整个宇宙的运行规律。在此规律下,从普朗克的空间和时间开始,到整个宇宙的宏观物事,全部都按这个规律各自行事,从而形成了丰富多彩的现实世界。换成软件会怎样?

《编程到底难在哪里?》

可以说,在目前的计算理论下,会非常^100 的苦逼。软件的本质是计算,而目前的计算理论决定了,这个软件的世界中,每一个基本粒子的运行状态都必须经计算才能得到状态--如何产生、如何碰撞、如何变换、如何运行,等等这些。我们已知这个宇宙共有 10^80 个原子。假如这个宇宙是运行在计算机当中的话,这 10^80 个原子的状态和运行轨迹都必须经过计算才能确定,而屏幕前面的你————一个被上帝安排来干这活的苦逼程序员,不得不拼着把头发掉光,也要把 10^80 个原子的运行算法安排得清清楚楚,明明白白。如果有其中一个原子没考虑周全,那么你的宇宙--对不起,应该是上帝的宇宙--就会在你手里爆掉。

上帝说要有光,于是便有了光。而作为苦逼的程序员,为了让世界有光,你还不得不去折腾 RGB、CMYK、LAB,导入一个 OpenGL 库,把每一个光源、每一条光线都计算清楚,然后用少得可怜的显存渲染出你想要的光。

这个就是布鲁克斯博士论文中的”根本困难“(essence)。而用什么语言、什么样的数据结构去描述这个世界,那仅仅是次要困难(accident)。

换句话说,怎么理解布鲁克斯博士论文中的复杂性。不是软件太复杂,而是”软件“这个工具(包括现有的计算机体系结构、计算理论和模型)太过简单和原始,天生无法胜任”构建现实“这样宏大的任务。

从 How to do 的角度来看,大部份软件的问题都是需求问题,而需求问题本质上是一个沟通问题。人与人之间的沟通天生就是不精确的。让人们对一个复杂易变的实体(即软件)保持一致的理解,不谛于建一个巴别塔。

《编程到底难在哪里?》

所以总的来说,“编程”这件事根本不难,难的是要弄明白编些什么。

——————– 原答案 ——————–

某日,老师在课堂上想考考学生们的智商,就问一个男孩: “树上有十只鸟,开枪打死一只,还剩几只?”

男孩反问:“是无声手枪,还是其他没有声音的枪么?”

“不是。”

“枪声有多大?”

“80~100 分贝。”

“那就是说会震的耳朵疼?”

“是。”

“在这个城市里打鸟犯不犯法?”

‘不犯。”

“您确定那只鸟真的被打死啦?”

“确定。”老师已经不耐烦了,”拜托,你告诉我还剩几只就行了,OK?”

“OK。鸟里有没有聋子?”

“没有。”

“有没有鸟智力有问题,呆傻到听到枪响不知道飞的?”

“没有,智商都在 200 以上!”

“有没有关在笼子里的?”

“没有。”

“边上还有没有其他的树,树上还有没有其他鸟?”

“没有。” “方圆十里呢?” “就这么一棵树!”

“有没有残疾或饿的飞不动的鸟?”

“没有,都身体倍棒。”

“算不算怀孕肚子里的小鸟?”

“都是公的。”

“都不可能怀孕?”

“………,决不可能。”

“打鸟的人眼里有没有花?保证是十只?”

“没有花,就十只。” 老师脑门上的汗已经流下来了,

下课铃响起,但男孩仍继续问:“有没有傻的不怕死的?”

“都怕死。”

“有没有因为情侣被打中,自己留下来的?”

“笨蛋,之前不是说都是公的嘛!”

“同性恋可不可以啊?”

“…………。,性取向都很正常!”

“会不会一枪打死两只?”

“不会。”

“一枪打死三只呢?”

“不会。”

“四只呢?”

“更不会!”

“五只呢?”

“绝对不会!”

“那六只总有可能吧?”

“除非你他妈的是猪生的才有可能!一枪只能打死一只!”

“…好吧,那么所有的鸟都可以自由活动么?”

“完全可以。”

“它们受到惊吓起飞时会不会惊慌失措而互相撞上?”

“不会,每只鸟都装有卫星导航系统,而且可以自动飞行。”

“恩,如果您的回答没有骗人,”学生满怀信心的回答,“打死的鸟要是挂在树上没掉下来,那么就剩一只,如果掉下来,就一只不剩。”

老师推推眼镜,强忍着要昏倒的感觉,颤抖地说道:“你可以去当程序员了……”

发表评论