为什么我们天生的预测复杂性的能力在遇到编程问题时会失灵?
为了回答这个问题,让我们来认识一下我们的大脑如何估计事情的。有些事情对于一些没有经验的人也很容易预估正确,但有些事情则不然。
我们来想想观看一个人弹吉他。即使你从来没有弹过吉他,在观看了一场弹奏《玛丽有只小羊羔(Mary had a Little Lamb)》的吉他表演后,你也能大概推测出这很简单,一个人不需要太高的技术就能演奏出来。同样,当观看了有人演奏D大调的《卡农(Pachabel’s Canon)》后,你也很容易推测出,这很复杂,需要很长时间的练习才能演奏的出来。
为什么我们能够很迅速准确的预估这两首曲子的复杂性呢?这是跟我们用来判断一个事情简单和还是复杂的方法有关的。我们的大脑有一些现成的模式来完成这些事情,首先一个就是根据速度。这种情况下,大脑会辨别每秒钟演奏的东西。根据每秒钟演奏了多少东西,我们很容易有一个直观的判断曲子的复杂度。因为用吉他演奏一首歌是一种物理过程,一种感官上的活动,我们的大脑很容易依此来推测速度,继而转换成复杂度。
我们还有另外一个天生的推测依据:体积。想想把一个帐篷和一栋公寓放在一起对比。即使一个人从来没有学过建筑学,他也能告诉你通常设计和建造一个帐篷会比设计和建造一栋公寓要简单。为什么?因为我们天生的会使用物理体积作为事物复杂性的一个指标。
当然。上面说的这两种逻辑分析并不是总是100%的有效。但大多数情况下,人们就是这样干,而且很成功。大多数情况中,我们在对物理过程评估时,我们的大脑会对物理事物进行有效的关联,不需要依赖之前的经验。
现在让我们来谈谈软件。当一个不懂技术的人试图对软件开发时间进行评估时,有两个很基本的直观指标在辅助他们:以体积为指标的复杂度和以速度为指标的复杂度。但他们没有意识到,软件跟他们想象的不一样。软件本质上不是有形物质。没有体积和速度。它的极小的组成部分可能会时不时的在电脑屏幕上闪现。正因为如此,当面对开发一个web应用时(或任何类型的软件),我们的基本直观感觉失效了。
这第一点,速度,很显然根本不可能被外行人拿来对软件进行评估。于是很自然的,他们倾向于使用体积指标进行评估。要么是根据描述文档的页数,要么是根据软件的功能用例数或特征数。
有时候,这种评估手段确实有效!当面对一个静态网站,没有特别的设计要求,外行人很容易用这种方法估计出开发时间。但是,通常情况下,对于软件开发,体积并不能真实有效的反映复杂度。
不幸的是,对于软件的复杂度,唯一有效的推测方法是依据经验。而且还不是时时都好用。作为一个程序员,我知道,根据我之前开发过的相似的功能特征,我可以估计出现在的这些功能特征各自要多少开发时间。然后,我把总时间加起来,这就得到了完成整个项目需要的大致时间。然而,事实情况中,每个项目在开发过程中都遇到二、三个瓶颈。这些瓶颈会肆意的消耗程序员的大量时间,你在遇到它们之前根本不会有所预见。它们会拖住整个项目,致使工期延后数周甚至数月。
这些是没有经验的人在评估复杂度时不会理解的。他们不明白在其他事情上都很灵的方法,为什么放到软件开发上就不灵了。所以,下一次当你听到有人说“我想你几天时间就能把它开发出来”时,不管是谁说的,都不要懊恼。深呼吸一下,告诉他这篇文章的地址,自己该干什么还干什么。
相关推荐
Solus-Linux-on-Dell-Chromebook-13:对于新手和高级用户:如何在Dell Chromebook 13上安装和设置Solus Linux(提示:这非常非常容易!)
容易! 或入门$ yarn add react-native-motionSharedElement的用法我们需要为共享元素指定源和目标。 然后,该库会将共享元素从源位置移动到目标位置。 class Main extends Component { render ( ) { return ( ...
Git钩子变得容易 赫斯基可以改善您的承诺 :dog_face: 纬! 2021年1月23日- :waving_hand: 阅读赫斯基5公告,看看有什么新功能: 您正在查看husky v5的文档,该文档可在开源项目中免费使用 :red_heart_selector: ...
但你必须在线、软件非常实用小巧很容易上手! 1:右键添加你要给你朋友下载的文件、最好文件更改为数字名称或者英文、当然用中文也可以只是不太好识别! 2:然后启动开关、全部复制上面那串地址或者点浏览、发给你...
rails-push-notifications, Rails iOS,安卓和 Windows Phone 推送通知容易实现 ! Rails 推送通知 专业 iOS,Android和 Windows Phone 推送通知,用于 Rails的rubyRailsPushNotifications是一个直观易用的gem,它...
顾名思义,它是开放的,并且很容易扩展。 整个程序包都是以这种方式构建的。 它具有很多功能,只需看一下! 使用范例 这是一个示例(如何通过主键)从现有的sqlite3文件中获取单个post 。 const Store = require ...
Slacker教会了我很多关于编写chatops自动化的知识,以及我想要完成这项工作的框架类型。 TLDR:聊天机器人是很棒的前端 UI,但在后端,我想要更像事件代理的东西。 以下是 Slacker 做对的一些事情: Slacker 非常...
GitHub 页面这是我的GitHub 使创建个人网站变得容易。 按照此链接 - 了解如何操作,或按照以下步骤操作: 我假设您已经拥有 GitHub 帐户! 分叉或克隆这个 repo 进行某些更改,例如名称和链接转到 Repo 设置并向下...
灰度照片 该项目用于将照片转换为灰度。 它使用以下公式进行转换。 Grayscale(red, blue, green) = (red + blue + green) / 3 当然,有不只一个公式可以做,我选择这个公式是因为它很容易实现。
为了使这一点变得更容易和更具激励性,我们决定将健康饮食变成一种游戏,以尝试给人们一些额外的推动力,以遵循健康饮食习惯。它能做什么该项目从每位球员开始,先种植一棵有四片叶子的植物。 然后,玩家可以添加...
详细实现了加法器要的键盘监听及文本实现,帮助你更简单的理解java,尤其对于初学者,绝对是简单易懂!
不和谐通知变得容易。 :sushi: 零配置! 开箱即用,效果完美。 :sushi: 普遍的! 支持Linux(Ubuntu),macOS和Windows。 :sushi: 更快的启动! 比Docker容器操作中编写的速度更快。 :warning: 如果您正在...
设置起来真的很容易。这将是非常好的,但是如果您不想这样做,则不必这样做。 披露安全漏洞 请以响应方式披露安全漏洞。向我portasynthinca3@gmail.com电子邮件( portasynthinca3@gmail.com )有关任何安全漏洞的...
非常容易扩展和理解。 所有必需的文件都在dist/文件夹中,并以angry_为前缀。 最重要的扩展文件是angry_caption_texts.js ,它提供了基础的“游戏”数据: const ANGRY_CAPTION_TEXTS = { /* JSON for Anger ...
容易地! Pypi- //pypi.org/project/LiteVkApi/ 简要文件 嘿! 创建该库是为了用VK快速编写机器人(主要是毒品)。 我希望机器人能够快速,轻松地编写代码,因此我使用了最流行的函数vk_api创建了一个方便的库。 ...
浮躁的人容易问:我到底该学什么;----别问,学就对了; 浮躁的人容易问:JS有钱途吗;----建议你去抢银行; 浮躁的人容易说:我要中文版!我英文不行!----不行?学呀! 浮躁的人分两种:只观望而不学的人...
这是一个,C#初学者很容易读懂和实现的socket通信的傻瓜型例子!!多多交流,相互帮助!!!
特征添加添加自拍照很容易! 只需单击“通过网络摄像头添加照片”或“从计算机添加照片”即可将照片添加到存储库中。搜索需要帮助来识别某人吗? 没问题! 单击按其他照片搜索或通过将网络摄像头照片拍到照片中的ID...
浮躁的人容易问:我到底该学什么??? 别问,学就对了; 浮躁的人容易问:JSP有钱途吗??? 建议你去抢银行; 浮躁的人容易说:我要中文版!我英文不行!?? 不行?学呀! 浮躁的人分两种:只观望而不学的人;只学而不...
废品::camera_with_flash:屏幕捕获变得容易!