刚才提到我"并不完全建造西斯廷教堂".这是事实,但我正在构建货运管理应用程序,这不像在表单上绘制控件那么简单(即使供应商会让您相信它).
我并不反对那个说出来的人,但我确实觉得我所做的事情的复杂性有点被误解,或者说这个陈述是不会的.
是否有任何好的比喻可以说明项目对非程序员的复杂性?
演讲者几乎肯定是" 画西斯廷教堂[天花板]".有什么有意义的相似之处吗?
米开朗基罗对原始建筑师提出的脚手架有一些问题.他最终构建了自己的框架.
米开朗基罗是一位雕塑家,他必须学习壁画以完成委托.
教皇朱利叶斯二世最初想要使用12个数字的使徒.米开朗基罗在选择主题方面进行了自由交涉,并提供了描述超过300个数字的旧约圣经场景.他自己做了所有的绘画.
该项目不断耗尽资金(因为教皇不断与周围的国家发生战争).
所以让我们看看.严重依赖技术主流,现金流问题,无法满足客户的规格......你是对的,听起来好像没有我听说过的软件项目.
我会记得我曾经听过的一则古老的轶事:
一位汽车修理工问外科医生:"为什么你赚的那么多?你可能做的那么复杂吗?我的引擎工作对我来说看起来非常复杂和具有挑战性,我真的很擅长它!我可以解决任何问题发动机出了问题!"
然后外科医生过去,转动点火装置并启动汽车.然后他看着机械师:"好吧,现在解决它."
这不是火箭手术.
一些比喻......
复杂性,有点像自己从头开始建造汽车或船.需要工程师团队的软件项目就像建造航天飞机一样.唯一的区别是,如果你搞砸了,人们通常不会死.如果人们的生命受到威胁,它就更像是航天飞机.(不过,软件几乎从未像火箭飞机一样酷.)
这是真的,你的软件项目是不是西斯廷教堂(是什么?),但它是一种像建设货运管理系统,这本身就是极其复杂.您可以在白板上绘制一些图表,或者碰巧带有系统设计和数据流图.帮助他们看.
问,"你有没有建一台电脑?" 选择和订购所有组件,构建计算机,选择和安装操作软件,设备驱动程序,配置最终结果都将花费更少的时间,并且远不如此货运管理项目复杂.
关于将它与他们所做的事情联系起来的建议是好的,但要确保你对他们做的事情有足够的了解,以便进行充分的类比.如果他们是一名训练有素的机械师并且你说它与重建化油器(而不是自动变速器)相当,他们可能会认为"没问题,所以它并不复杂."
Neil Ernst谈论软件隐喻,家庭承包隐喻的适用性,并且还指出软件工程本身很难解释,因为它是抽象的工作.
尼尔链接到吉姆沃尔多,软件工程和设计艺术的一篇文章,他指出
通过这种方式,我们所谓的软件工程实际上更像是建筑(生产建筑的真实建筑)而不是其他类型的工程.有一个科学元素(建筑必须遵守物理定律),但也有很大的艺术元素.根据您生产的软件类型,两者的组合可能会有所不同,但始终存在混合.
所以,也许宏伟的建筑和建筑专长是一个恰当的比喻.(并不是说我们所做的事情接近西斯廷教堂,但我们应该接近我们的想法.)
不幸的是,将您的项目视为微不足道的人不太可能理解这一点.他们可能无法抽象地思考它.你可以期待的最好的是他们能够把握汽车或船只或房子的类比,或者帮助他们用图表来看待它.
编辑:您对项目与"在表单上绘制控件"之间的相对复杂性提出了一个观点.也许你可以回应西斯廷教堂的评论,说"那是真的.但是,如果一个三个月的网络项目是你家后面的小棚子,这个货运管理系统是罗杰斯 中心.
如果它不像建立西斯廷教堂,也许更像是建造一座房子.建造房屋有很多不同的东西,许多不同的人参与不同的专业.没有什么是过于复杂的,但涉及到很多工作!
问题是,它真的不喜欢盖房子; 它更像是建造一个一直在变化的房子.但是,出于复杂性的目的,这可能会更有效地说明您的观点.
如果一个人不理解它,那么这个比喻对你没有任何好处.您应该尝试用他们能理解的术语来解释个体的复杂性.如果可能,尝试将其与他们可能遇到的复杂工作情况联系起来.
对于一个会计师,你可以这样说:"这就像你拿一个计算器并自己审核美联储"
编程就像教孩子一样.请耐心等待:想象一下,你想向宝宝解释如何购买胡萝卜.你将做与教授机器人相同的事情.
首先,他必须学会走路.步行子程序.我不会详细介绍,但他必须将脚放在另一个前面并平衡他的体重.你必须管理他跌倒或遇到障碍的例外情况.
然后他需要有关超市位置的地理规范.
必须告诉他使用步行子程序,直到他找到市场.如果他没有在合理的时间内找到市场(必须定义),他必须启动返回家庭例行程序.
如果他找到超市,他必须使用胡萝卜侦察算法找到胡萝卜.他必须将每个对象与他的数据库中的胡萝卜3D模型进行比较.合理的时间(或超时).
然后,他必须评估一个地方用钱交易胡萝卜,以获得永久获取胡萝卜的权利.这部分可能真的很棘手.
然后,他必须根据当前胡萝卜国际定价与在另一个地方获得价格较低的胡萝卜所需的资源来评估价格.
我只是完成整个过程的一半,你抓住了我的漂移.我跳过很多检查和例外,评估,识别等等.整个开发团队需要几个月甚至几年才能对此进行编程.它只会购买胡萝卜.
我想说的是,当你开发一个应用程序时,你必须"告诉"它的一切,几乎所有东西.对于未明确指定的每个细节,您都会有惊喜:"随机"行为,错误或简单关闭.您必须告诉程序在一般情况下该做什么以及在情况发生变化时如何适应.编程就像教宝宝一项非常复杂的任务.
然后是最糟糕的部分.在整个过程中你无法握住宝宝的手.你确保他拥有一切并让他离开.2个可能的结果:从开始到结束一切正常(从未发生过)或婴儿在任务中间的某个地方坐着,哭了,你不能问他出了什么问题.他只是在哭,不会停止.然后调试开始.
现在您可以更好地想象需要多少努力来构建管理股票交易所的软件,或者自动割草机或飞机!你需要多长时间教宝宝如何驾驶飞机?
没有.
老实说,没有.
您可以做的最好的事情就是让最终用户扮演计算机角色,这样他们就必须仔细考虑每个用例,直到他们意识到这个过程本身是多么复杂.
为他们快速滚动数千行代码.说"如果一个字符错了,整件事就行不通了".
另一个:
就像写小说一样,除非有一个错字或语法错误,整个事情都没有意义.
我经常与外行人一起使用的一个比喻是,构建软件并不像建立一座桥梁:
如果您正在建造一座桥梁,您可以购买工字梁和铆钉,您可以倒入标准混凝土.如果你正在构建软件,你必须制作自己的工字梁和铆钉,你可能不得不发明非标准混凝土.
当桥梁完成一半时,没有人告诉你它应该在晚上作为免下车电影院运作.但在软件方面,最新的变更请求很常见.
您可以知道桥梁何时完成一半.你不知道什么时候软件完成了一半.
通过使用X射线,超声波和其他工具,您可以确保桥梁在使用过桥之前没有结构故障.但即使采用最佳测试方法,在使用软件之前也无法发现软件中的许多故障.并且很难知道纠正特定故障或发现最后一个重要故障需要多长时间.
所有这些因素都有助于解释为什么很难预测软件项目需要多长时间,以及软件项目为何经常迟到.
我无法自拔,但我必须发布来自That Mitchell&Webb Look的视频:
脑外科医生 - 米切尔和韦伯看,系列3 - BBC二
除此之外,它可能有助于证明规划软件项目涉及许多与计划构建相同的问题 - 哦,比方说,一个小教堂.你有很多非常不同的方面需要管理,如果有人在基础上犯了错误,那么整个想法就会崩溃.