为什么开发一个小功能需要这么长的时间

我只需要给接口增加一个字段而已。
-- By 某销售同事

为什么我写这个

我在一家规模很小的征信公司工作。我们的开发团队包括 QA、UI 在内只有6个人。在过去的一年半里面,我们的团队从2人发展到6人,开发了一个含 Web UI 和 RESTful API 的案件管理系统、一个反欺诈规则引擎、一个用来统一访问和管理各种数据源的 API Service、一个用于计数和计费的 accounting system、基于 Pentaho 的一套 BI 报表、以及一个完整的 log centralize system 来对日志做收集和可视化(用 ELK Stack)。对了,还有公司的官网。考虑到我们连一个产品经理都没有,而且经常要兼职做客服的事实,我觉得开发团队的效率已经挺高的了。

但是,我确信如果没有说出本文开头那句话的人的影响,我们的效率还可以更高。其实很多时候我能理解他们的疑问:为什么听起来简单的一个功能需要这么长的时间?对于这个问题,其实我想用另一个问题来回答:为什么作为销售/市场人员的你,觉得你能合理估算开发一个功能需要的时间?

为什么你会低估开发时间

人们往往低估了细微改动的影响。大多数人不会认为从头开发一个产品是很简单的,但很多时候,销售/市场/产品的同事,会提出一个基于现有产品“很容易实现”的功能需求,他们往往认为只是“给接口增加一个字段而已”。这样的请求我在最近的一年里遇到过不止一次,那么我就来好好罗列一下一个这样的功能可能带来的影响。

当“增加一个字段”的需求产生,下面的改动几乎是任何公司的业务平台都无法避免的。

  • 修改数据库中对应的表结构 =>可能需要增加/修改索引(Dev/DBA)
  • 由于增加字段,ORM 层对应的类在序列化时的结果会改变,可能会影响所有其他使用到这个类的服务。这些地方的代码也需要调整 (Dev)
  • 修改 API 使新增字段得以体现(Dev)
  • 根据新增的字段更新 GUI 上对应的表单 and/or 表格的排版设计,实现前端功能(UI、Dev)
  • 修改产品手册以及 API 文档(Dev、QA)
  • 编写单元测试(Dev/QA)
  • 回归测试所有依赖该类的功能(QA)
  • 部署新的代码,对生产环境的数据库做 migration(Dev/DBA)

上述的某些改动可能会非常麻烦。比如增加的字段如果存在默认值,需要在数据库 migration 后更新该表中全部的已有数据。视数据一致性的需求,该工作可能需要中断服务来跑单独的数据库任务。一旦需要中断服务,我们还得告知在生产系统中调用我们 API 的一两百家客户,避免影响他们的业务。

还有更麻烦的。在前一段我仅仅罗列了和具体业务无关的内容,仅仅是增加一个字段的输入、输出变化引起的各项改动,而实际上改动可能远不止这么一点点。当然,如果你要增加一个字段,一定是想用这个字段的内容做点什么,因此不可避免的还会有很多业务逻辑在上面。比如对该字段做 validation、业务流程根据该字段的值做不同的处理,等等。以我们的产品为例,新增字段还要在规则引擎中做规则,要单独设计属性的图标,要在关联分析图包含这一属性上的关联信息,等等。这一切都需要大量的时间,需要对现有功能做非常仔细的考量,才能保证功能上线后不出问题。

以上就是一个改动的代价。如果你是一位销售经理,在告诉开发团队你的某个大客户需要“增加一个字段的时候”,希望你三思而行,你的一句话消耗掉的开发资源可能远远超过你的想象。当开发经理把预估的 man hour 发给你的时候,千万不要惊讶。你对你的无知一无所知。

“开发团队的时间都用在哪儿了?”

一个开发团队需要大量的时间来进行看似并不产生 output 的工作,包括而不限于:

  1. 编写测试用例
  2. code refactor
  3. 交流,如内部技术分享,code review 等等

上述2,3两点都是为了写出“可维护”的代码,但是代码可维护并不代表前面的那些步骤可以省略。它只能让你更容易做一些改变,而不至于带来什么不可预知的问题。

为什么软件开发时间难以估算

我并不奇怪市场或销售人员不能估算项目需要的时间。事实上,我见过的很多人,包括非常资深的项目经理,都做不到这一点。当项目经理估算失败,就意味着加班加点,意味着996。他们没有仔细阅读过《人月神话》,这是一本关于软件工程的,至今仍不过时的陈年好书。下面我要说的很多是从《人月神话》里看来的,并且在我的经验中得到了证实。

软件开发是一种脑力劳动。这里面主要的时间会花在试图理解以及研究需求、架构、实现细节上。只有很少的时间是用来敲键盘的。在软件真正开发完之前,没有人能准确的理解全部的细节。一旦理解的全部的细节,代码也随之编写完毕。人们很难对于自己没有完全理解的事物的复杂度进行准确的估计。

In theory, there is no difference between theory and practice. But, in practice, there is.
-- From "Use Case Driven Object Modeling with UML"

另一个问题在于,实际开发过程中可能会出现各式各样的问题。库版本不兼容了,GFW 又发威了,开源代码出 bug 了,甚至你发现你用了很长时间的 IDE 升级后突然崩溃了。。现实中真是有无数的意外,而 deadline 不能看到这一点。我曾经看到某 PM 说他是这么估计开发时间的:

  • 先按正常标准预估时间
  • 乘以2
  • 再加上3天
  • 再乘以3

虽然是玩笑,但是能考虑到意外因素带来的时间损耗,确实是经验丰富的 PM 的表现(当然,现实中我并不敢这样报告预估时间)。

总结

虽然说了上述的一堆道理,但是我真正的目的只是想吐槽而已:为什么我们公司找不来一个产品经理,导致我们需要从销售、市场那里接这些开发需求呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,510评论 25 707
  • List接口 List接口继承自Collection接口,是对有序而且允许重复元素集合的一种抽象接口 方法列表(除...
    zhanglbjames阅读 453评论 0 0
  • 邯郸是历史上唯一一座没有变更过名字的城市,有着上千年的文明 如果你来邯郸,我带你去看胡服骑射,感受赵王雄姿 如果你...
    corot2a阅读 389评论 5 5
  • 记忆牢笼里 发黄发涩的回忆和贬值的幻想 无法呼喊的大嘴 拼凑成一个奴隶跪拜的姿势 遥远的山脉有人种地 城市在糟蹋粮...
    勒普兰斯阅读 301评论 0 0
  • 没有想到是这个: 低买高卖## 尽管我们都知道,这样一定会赚钱。而在此前“思考:有钱了不起啊”这篇文章的留言回复中...
    念念1999阅读 241评论 0 0