编者按:很多人表示看不懂程序员的世界,当程序员告诉他们一个需求做不了的时候,很多人会觉得是在故意针对:“这么简单的需求,哪有做不了的道理?”但其实,外行就是外行,看上去简单的需求,实现起来可能非常难。本文编译自问答社区 quora 问题“As a non-programmer, how can I tell whether time estimates and comments like, "we can't do that" are true/accurate?”下的回答,作者 Stan Hanks。
普通人很难理解软件开发的复杂程度。“你只是告诉计算机该做什么,对吧?那能有多难”?
虽然这看起来不是很难,但是……电脑完全缺乏人们所描述的知识框架。拿个简单的事情举例,“给我一个火腿三明治”。你可以很快地联想到,我实际上是指“去厨房,做一个火腿三明治,把它带到我面前”,或者“沿着街道去熟食店,买一个火腿三明治,然后带回来给我”,根据我们所处的现实环境和过往经验,你不难做出如此判断。
场景切换到厨房,你会进一步地思考:打开冰箱,找到火腿,特定的奶酪,特定的酱料,几片面包,接着你整理所有的东西,并把剩余的材料放回原处。再然后,你需要找到盘子,把组合好的三明治放在盘子里。如果你是个细致入微的人,你会发现我跳过了一大堆细节步骤,比如:要放多少酱,放多少片火腿,别忘了取下奶酪片的塑料包装……甚至更深刻的问题,怎样才算做好一个三明治,火腿又该是什么样的才行……
作为人类,我们可以在繁复的背景和细微的生活中做出判断,而在编写计算机程序时,如果你跳过那些微小的步骤,计算机要么是做错事,要么就是根本做不出来。
不了解编程的普罗大众会向程序员发出请求:“您可以让这个窗口变大些吗?”,“您能使备忘录的文件按照字母顺序排列吗”?直观感受使你觉得这些事轻而易举,那么问题究竟是什么呢?
问题是,负责这个任务的程序员有多重复杂性需要面对。当然,他们不会亲自编写所有的代码,他们会使用一个数据库(网罗其他人编写的各种代码,用来解决常见问题,通常是免费的)。通常情况下,这可能涉及多个库的使用问题,因为他们之间存在着各种相关、不相关的依赖关系。
所以当你说发出请求的时候,程序员可能会想到:“嗯,这很容易,应该存在合适的库,而数据库中会有需要的数据”。他们会相当乐观地估计出所需要的时间。
然而,只有当他们真正开始解决问题时,一个或多个错误的假设便浮现出来了。可能是数据库中并没有合适的代码,可能是他们认为可以使用的数据已经被弃用,也可能是好不容易找到的方案无法匹配当前的版本……而如果核心假设都被证实是错误的,那么显然这将会困难更多。正式开始前,这些假设看起来都是有理有据,只有当你真正着手操作,问题才开始接踵而至。
我接触过的最优秀的程序员会在一开始就对问题进行全面的评估,经验告诉他们,看起来再简单的事情,平静的海底下依然可能暗潮涌动。
而缺乏经验的程序员往往对自己的能力充满信心,很容易就做出肯定的答复或承诺,“是的,这个问题一周就可以解决”。可有的时候,他们既没有充足的预算也没有足够的时间。但不用太沮丧,也不用太得意,如果能有无限的时间和金钱,可能真没有什么是软件开发做不出的。
编译组出品。编辑:郝鹏程