编程到底难在哪里?
图片: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 以上!”
“有没有关在笼子里的?”
“没有。”
“边上还有没有其他的树,树上还有没有其他鸟?”
“没有。” “方圆十里呢?” “就这么一棵树!”
“有没有残疾或饿的飞不动的鸟?”
“没有,都身体倍棒。”
“算不算怀孕肚子里的小鸟?”
“都是公的。”
“都不可能怀孕?”
“………,决不可能。”
“打鸟的人眼里有没有花?保证是十只?”
“没有花,就十只。” 老师脑门上的汗已经流下来了,
下课铃响起,但男孩仍继续问:“有没有傻的不怕死的?”
“都怕死。”
“有没有因为情侣被打中,自己留下来的?”
“笨蛋,之前不是说都是公的嘛!”
“同性恋可不可以啊?”
“…………。,性取向都很正常!”
“会不会一枪打死两只?”
“不会。”
“一枪打死三只呢?”
“不会。”
“四只呢?”
“更不会!”
“五只呢?”
“绝对不会!”
“那六只总有可能吧?”
“除非你他妈的是猪生的才有可能!一枪只能打死一只!”
“…好吧,那么所有的鸟都可以自由活动么?”
“完全可以。”
“它们受到惊吓起飞时会不会惊慌失措而互相撞上?”
“不会,每只鸟都装有卫星导航系统,而且可以自动飞行。”
“恩,如果您的回答没有骗人,”学生满怀信心的回答,“打死的鸟要是挂在树上没掉下来,那么就剩一只,如果掉下来,就一只不剩。”
老师推推眼镜,强忍着要昏倒的感觉,颤抖地说道:“你可以去当程序员了……”
评论
发表评论