原文:The Software Engineer’s Essential Time Estimation Guide
作者:Kat Busch
翻译:雁惊寒

译者注:本文介绍了软件工程师在开发过程中进行时间估算的原因和方法,从而可以更加合理地安排项目进度。以下是译文。

我的一个产品经理朋友最近跟我提起她遇到的问题:“软件工程师永远不会估算他们的项目需要多长时间。我能做什么呢?“ 两位CEO最近也告诉了我同样的事情。

我们的工程师也都证实了这一点。我曾经看到过原本预估只要两天就能完成的项目最终却花了4个月的时间。在这种情况下,即使是采用“只需把时间翻倍”的经验也比实际情况差了一个数量级。这可能会对业务产生真正的影响。我曾经见到过一家公司为了一场发布会而竭尽全力,但是最终还是推迟了几个月。

站在较高的层次来看,问题出在工程师估算的时间与PM、经理、公关人员以及其他所有人估算的时间不一致上。大多数地工程师从本能上想的是,如果一切按照计划进行,写出一个可以运行的原型所需的最短时间。但是,那些受阻的下游部门想要知道的是项目什么时候能够为发布准备就绪,这完全就是另外一回事了。

对于工程师来说,掌握估算技能是一段终身的旅程。如果忽视它,这会让你以及与你直接或间接接触的每个人造成麻烦。掌握估算技能能让你在同事中脱颖而出,你的同事会把你跟专业、稳定和高质量的工作联系在一起。

为什么需要估算

让我先回答一下从工程师那里听到最多的问题:“为什么要这么麻烦估算时间?”许多工程师抱怨这是一个额外的开销。 “如果我加把劲全力去做的话,很快就能完成了!”

进行估算主要有两个原因:存在外部依赖,以及需要确定优先级顺序。

外部依赖

任何有效的事情都不会在真空中发生。项目通常都具有外部依赖性,例如跟非工程团队(通讯、金融、公关、客户支持)、其他工程团队甚至最终用户之间的协调。与外部依赖协调通常是经理、PM或CEO的工作。这意味着最有资格做出时间估算的人(工程师)并不是最需要估算结果的人。这种不对称性导致了最主要的紧张关系。

优先级顺序

时间估算也是确定工作优先级顺序的关键。 “物有所值”是工程中的一项重要指标,没有经过真正的估算就不值“钱”。即使你正在开发的功能是世界上最棒的东西,如果你花时间做一个全面估算的话,你可能也会意识到需要花太多时间来完成。

假设你正在开发一个项目,它能使网站的速度提升50%,但在相同的时间内,你可以完成两个项目,这些项目能使网站快40%。如果你不花点时间做一个初步估算的话,你永远都不会知道自己本来可以做出一个更快的网站!

时间估算基础

现在大家都同意时间估算在绝大多数情况下都是必须的,下面我们就讨论一下估算技巧吧。

我们低估时间是因为我们想的是“写出一个基本版本需要花多长的时间?”

但是交付出去的东西要比基本版本庞大得多。你需要考虑编码、测试、调试以及优化程序所花费的时间。别忘了还有开会、访谈、代码评审、发送邮件等事情。

我们低估的另一个原因是我们在编码的过程中总是会遇到“未知的未知数”。而这些是不可能完全预料到的。也许你的IDE要进行更新而中断了你的项目,然后你不得不花一整天的时间去弄好环境。你的估算是无法将这个也考虑进去的。

但是我们的估算依然能够做得比最初的直觉要准得多。以下是我的做法:

第一步:制定技术计划

在开始一个重要的项目之前,你应该已经有了一份技术计划或者设计文档了。用这个来让其他人知道你在做什么并且获得反馈。技术计划是开始进行时间估算的理想的地方。当你在关注技术细节时,你发现的那些未知的未知数就已经在魔术般地改进你的估算了。也许你会意识到你可能要把某个库更新到最新版本,这个可能要花你一天的时间。你甚至还可能会意识到自己本来打算要用的一个库根本就不存在,得自己写。

颗粒度在这里很重要。如果任何一个步骤给人感觉不清楚的话,要么忽略细节(应该了解更多),要么得把它分解为更细一点的步骤。同时,如果某个步骤的颗粒度太细的话,那么在实践中可能会使整个计划无效。

想要知道技术计划里应该要考虑哪些东西,可以看看Alicia Chen的这篇文章。关键点之一是消除跟PM或者其他利益相关者之间的分歧,这样最后才不会把东西做错而不得不重新开始。

第二步:为每个步骤添加时间估算

估算技术计划里每一个步骤完成所需的时间。这通常涉及到对细节的研究(“是不是已经有现成的库来实现这个了?”)。根据项目的性质,抛出一个简单的原型可能有助于暴露很多潜在的痛点。

第三步:增加大量的额外时间

现在你已经有一个初步的时间估算了,不过我们还要考虑上文提到过的很多东西。

  • 随时调试:Bug总是存在的。调试很大程度上取决于你对特定代码库的熟悉程度以及该代码库的成熟度。

  • 会议、访谈、假期等:在这期间你是不会在办公桌前编程的。你真正用于写代码的时间究竟有多少呢?在估算的时候,你至少应该看看自己的日程表。

  • 最终测试与bug大扫除:你通常应该一边写代码一边写测试用例,但很多团队还需要进行额外的优化工作或者在发布前进行集成测试。要在估算中充分考虑到这些。如果你是分阶段推出的话,前面最初的1%可能会暴露出那些需要修正的bug。你要把这个也考虑进去。

  • 代码评审:在这个代码库中你一般要评审几轮?通常要花多长的时间?确保要给评审人足够的时间(可能要留意一下他们的日程表)。如果只有一位评审人,你应该事先问一下他的备岗,以防关键时刻那个人出去度假或者因为太忙而耽搁了。

一旦你把所有这些交付所需的时间开销都考虑进去了,你就会看到自己的时间估算跟项目的实际发布时间会更加匹配。是的,实际情况会比估算的更长。是的,你可能会在缩短工期上受到压力。但是,当大家都知道可以依赖你时,他们会欣赏你的估算。

第四步:在发布之后对估算进行回顾

是的,在项目完成之后再回过头来看看你的时间估算感觉是一种痛苦。但是这种回顾就是你可以学到东西的时候,并且下次能做得更好。

如果实际花费的时间跟预期不一样会怎么样?如果集成测试花费的时间是你原先估算的两倍,那么请记下来,下一次留出更多的时间。或者尝试着改进你的集成测试系统。

你肯定会看到你估算的能力随着时间的推移而得到提升。你甚至可以在这个时候找到一些有助于整个团队的伟大见解。

最终,一切都是跟沟通有关

尽早地、经常地跟别人沟通你的时间表和变化。如果你在发布前一个月让你的经理知道你正在使用的一个库被发现了一个新的安全漏洞,你将不得不重头开始的话,他们将有时间通知公关、财务或者用户说版本需要推迟。

跟相关参与者进行沟通也会让他们为你提供可影响你估算的重要信息。某位设计师可能会说:“哦,如果那个花絮动画需要整整一周才能做出来的话,我们干脆砍掉好了。”PM可能会补充说:“这只是一个在用户研究中进行实验的原型。这次迭代我们不需要做太多的bug大扫除。”经理可能会说:“你有一半的时间都用在开会上了?让我来帮你解决这件事!”

对于工程师来说,不要屈服于压力,为了取悦上级而报告比实际情况要短的时间。诚实地说明你的估算和变化的方法,这显得你更加的专业。

对于涉及到的其他任何人来说,尊重估算出来的时间是很难的,这需要一个过程。你只有坐下来砍掉发布时不需要的功能才能减少时间。唠叨是不可能把时间减下来的。

我们永远都无法完美地估算出项目的时间。唯一的办法就是开放沟通、有恻隐之心以及坚定地确定优先次序。

软件工程师如何估算项目时间相关推荐

  1. 作为软件工程师的 6 大时间浪费

    通过避免这 6 种时间浪费来提高您的生产力并在您的职业生涯中取得进步. 有效的时间管理是大多数成功的软件工程师都具备的技能.它将帮助您在职业生涯中快速进步,而不必在冲刺结束时长时间工作. 花椒壳-愿您 ...

  2. 与老大的交谈——估算项目时间

    介绍 上一次我们聊到 估算项目的时间进度! ,感谢很多博友的建议.我也向我们老大咨询了一下,他给了我很多宝贵的意见. 以下是我跟老大的一些交谈,希望对大家有所帮助. 把握三个点 以下是老大给我的建议, ...

  3. java软件工程师简历项目经验pdf_java软件工程师简历中项目经验怎么写?

    java软件工程师简历-项目经验怎么写(优秀范文)Java开发工程师-简历模板-项目经验怎么写 [网盘]100+清新大气简历模板下载: Java开发工程师-项目经验范文1 项目名称:电子商务后台管理系 ...

  4. 软件工程师如何测试项目,【软件测试工程师(华为项目)软件工程师面试题目|面试经验】-看准网...

    2011.3.30:一面 早上鸡还没叫我就醒来了,在家里简单地打扮打扮,重塑个人形象,胡子长的剃,头发乱的修,然后边穿衣服边拉裤链左手拎包右手锁门地就从家里出来了. 其实,上周三的时候我就收到了面试通 ...

  5. 字节跳动Java面试:java软件工程师简历描述项目

    一.网络原理 OSI 与 TCP/IP 各层的结构与功能,都有哪些协议 TCP 建立连接的过程,为什么要三次握手? TCP.UDP 协议的区别,各自的应用场景 打开浏览器,输入 URL 地址,访问主页 ...

  6. python项目经验怎么写 范例_java软件工程师简历中项目经验怎么写?

    作者:暗灭 链接:https://www.zhihu.com/question/20695310/answer/180691302

  7. 估算项目的时间进度!

    介绍 最近忙着赶项目,无暇去写博客.今天我想知道大家是怎么估算项目时间进度的? 我把我这次项目经历,唠叨唠叨. 情况 要做新的项目,产品经理A来找我,问我,这个项目你需要多长时间完成? 前提条件:我没 ...

  8. 如何评估研发人员效能?软件工程师报告帮你看见每个人的贡献

    本文正文内容共计957字,建议阅读时间:2分钟. 阅读本文你将收获: 1.软件工程师质效综合评价由哪些维度构成: 2.软件工程师效率与质量分析指标作用是什么: 3.软件工程师活跃度分析指标能帮助管理者 ...

  9. 如何成为一名成功的软件工程师

    For the young, bright-eyed software engineers who are starting out in their careers, here are some o ...

最新文章

  1. 辣眼睛:程序员这样过儿童节
  2. 64位/32位 C++/C# 数学计算性能对比测试
  3. 解决Navicat 出错:1130-host . is not allowed to connect to this MySql server,MySQL
  4. build怎么调试 react_React源码下载-本地环境搭建
  5. 【Python】Pandas高效加载JSON文件
  6. Web前端工作笔记005---浏览器内核介绍
  7. dumpbin命令问题的解决办法【原】
  8. 【TSP】基于matlab粒子群算法Hopfield求解旅行商问题【含Matlab源码 224期】
  9. java io知识点汇总FIle类
  10. 学习 altera官网 之 timequest
  11. 计算机怎么打出$符号,细说电脑上怎么打出特殊符号
  12. 新浪微博认证——应用程序支持新浪微博登陆
  13. 我的世界手游服务器修改密码,阿瓦隆之王怎么修改密码 | 手游网游页游攻略大全...
  14. csv是什么意思中文_CSV是什么-名词解释
  15. python读取枚举_一文读懂Python 枚举
  16. 写了一个jquery.imagesview插件,支持图片拖动、缩放类似ACDSEE效果
  17. [转]Java 实现 POS 打印机无驱打印
  18. win7中iis7.5中没有http绑定类型的解决方法
  19. python sql语句异常捕获_python异常处理
  20. 警灯,警铃四合一【Arduino玩具】

热门文章

  1. Aidlux边缘设备简介
  2. ZZULIOJ1025
  3. web 流程设计器探究
  4. Win7(Win10)+Ubuntu18.04(16.04)双系统安装心得
  5. 痞子衡嵌入式:利用GPIO模块来测量i.MXRT1xxx的系统中断延迟时间
  6. Python爬取链家北京租房信息
  7. 中国互联网还不到躺平的时候!
  8. 步进电机中的力矩(g.cm),转矩(n.m),扭矩(kg.m)有什么区别?
  9. iso镜像文件怎么装系统图文操作
  10. python pyz_Python pyzfp包_程序模块 - PyPI - Python中文网