Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >时间都去哪了

时间都去哪了

原创
作者头像
Teobler
发布于 2022-05-31 14:33:37
发布于 2022-05-31 14:33:37
4160
举报

太长不读:在很长一段时间我并不知道怎么去平衡速率和质量之间的关系,我虽然看过不少书和文章告诉我只有保证质量才能保证速率,但我还没有见过反例,我没办法很好地说服别人,我只能看着他们义无反顾的冲向进度,然后抱怨时间不够。我想用我经历和见证的不同项目、不同情况来和你聊聊为什么质量等于速率。

“ 我们这个迭代的卡完成不了了,你们先不要管重构测试之类的东西了,先把功能写完。 我们上个迭代的速率还不错,不过这个迭代的压力也很大,我们还是加加速吧,code review先放放。 ”

这可能是在很多进度紧张的 fix bid 项目能听到的一些话。质量和进度的取舍好像是软件工程一直都绕不开的话题。对于这两个维度我们到底应该怎么做呢,放弃质量追求进度的做法可不可行呢?或者我们能不能都要?

在很长一段时间内我并没有答案,毕竟没有过经历就没有发言权,不过如今在我经历了不同项目、不同情况后好像找到了一些答案。

不过在开始前我想先简单聊聊质量和速率这俩东西。

产品质量

what-is-quality

人们最普遍的认知是,质量越好的产品成本越高,价格也越高。当然我们需要控制变量,不考虑品牌溢价等因素。

举个例子,假如一个产品用两个月就坏了,为了让它用的更久,我们可能需要改进工艺,可能需要使用更好的材料制作。这些改进会让制造商付出更多的成本,为了赚回这些成本,这个产品就会卖更高的价格。

软件质量

但是软件质量和一般的产品质量又有些许不同。它主要分为两个方面 -- 外部质量和内部质量。

外部质量

外部质量简单来说是用来描述软件用户能够触碰到的部分的质量。比如是不是有 bug 会导致软件崩溃;软件的可用性/易用性如何;用户是不是能用软件快速解决自己的问题等。

内部质量

内部质量则对用户不可见,用户也不关心软件的内部质量。它主要涉及的是代码的可维护性。比如代码架构是不是合理;是不是可扩展的;模块间的依赖是否杂乱无章;是不是有无法控制的技术债;是不是有自动化测试保证代码的正确性等。

质量与速率

如果把这两部分拆开来看,用户压根不关心内部质量,因为用户只管你的软件好不好用,至于代码好不好维护这件事他们根本就不在意。但是用户在意的是他提出的意见和建议开发者能不能快速反馈,他想要的新功能你能不能赶紧给安排上。

而这个时候就体现出了内部质量的重要性。我们每个人都知道的是,在一份内部质量优秀,技术债不多的代码库中增加新功能,要比在一个内部质量相对差一些的代码库中增加新功能容易得多。

cruft-impact

当然你也有可能会想,我们为了使代码保持高质量,去解决技术债、重构、组织代码结构的时候是实实在在花了时间的,我把这些时间用来增加新的功能速率就是会更快。

在保持其他条件不变的情况下,我们无法否认这样做是会加快你的速率,但这其实是一个短期收益和长期收益的取舍,而这个短期可能比你想象中要短的多。

velocity

从这个图里可以看到,如果代码一直保持高质量,开发速率将在几周后超过内部质量不太好的代码,这个结果来自于 Martin Fowler 和他认为资深同事的经历的总结。

和大多数人一样,我在最开始对这份数据持怀疑态度,直到我如今我参与或间接见证了几个有意思的项目。

六边形战士

perfect-team

这是一个从起项目就聚集了一众大佬的明星团队,哪怕在客户的各种胡搅蛮缠下大家对于工程实践和软件质量的要求都很高。我所学习到的停留在书本上的敏捷实践在这个组都能看到。我在这里体验了极限编程、clean code,大家会抽时间 pair,实践 TDD,用重构来使代码符合 simple design,有自发的不定期的分享,以定期 tech huddle 的形式来管理和讨论技术债......

我是在项目更替许久已经进入某个平稳期的时候加入项目的,这时候项目闲的发慌,大家都在想各种办法提升自己的能力,我在这里切身体会到了 P2 文化。

事情的转折来自于项目 N 期准备上线前的几个迭代,客户给我们玩了个大的,我们自己也没兜住需求,项目进入了赶进度阶段。

但是在这种紧张的情况下我们并没有丢弃各种实践,大部分实践依旧是我们的底线,不过我们也确实停止了 pair,暂停了 tech huddle。TDD、重构、simple design,各种工程实践已经成了这个项目的 baseline。

这些后来被称为“负担”的东西不仅没有拖慢我们的脚步,反而帮我们兜住了客户反复横跳的需求,大大减少了 debug 和破坏已有功能的可能性。

停不下来的雪崩

avalanche

这是一个已知的短期项目,我并没有亲身经历。项目组制定的策略是,放弃一些实践,短时间内快速堆出客户想要的东西完成 MVP。

在开始的一段时间项目按照预期稳步进行,但随着时间的推移和来自于交付的压力,团队放弃的实践越来越多。从开始的放弃 pair、放弃 TDD,到后来的放弃写测试、放弃 code review。再到后来为了达到预期的 velocity 开始加人。

但是情况已经如同雪崩一般无法阻止。从外部观察和私下与项目中 core team 的小伙伴 retro 来看,项目刚开始确实要轻松一些,但是随着大家不管不顾项目质量,一味追求进度,项目开始向雪崩的方向发展。

项目逐渐陷入泥潭的时间接近两个迭代,也就是四周接近一个月,与 Martin Fowler 的结论非常接近。在这个 retro 中我开始意识到老马好像没有骗人,他那个图没有瞎画。

当然我们并不能将这样的情况简单归咎于项目质量,但这的确是一个不可忽略的关键因素。

高达的内部协调

gundam

这是我经历过人数最多的项目,超过 200 人被分成 7 个团队,大家分布在 3 个国家的 6 座城市。而这个分布式团队要通过各种合作造出一个高达。

我们接手的是一份质量说不上好的代码库。刚上手我的体验极差:

  • 项目代码结构混乱,很难找到自己想找的代码
  • 被称为内部渲染引擎的的一份框架代码逻辑混乱,几乎没有测试,但被大半个代码库依赖
  • 按照 README 甚至没办法启动本地环境
  • 为数不多的测试代码极其不稳定,但又找不到不稳定在哪,然后之前的开发团队用了各种骚操作尝试修复这种不稳定
  • ......

刚开始的一个月我们举步维艰,甚至还没开始就已经陷入泥潭,更不必说接下来的速率目标,之后我们制定了一些每个人都应该遵守的原则:

  • 就算花费时间久,起项目的前几个迭代中国区三个团队的 web devs 要在一起 code review,这有助于我们在 code review 的过程中发现和解决大家共同的问题
  • clean code 是我们的底线,每个人都可以参与制定团队代码实践并严格遵守,任何人都能给其他人留符合实践规范的 comments,不改完不 merge
  • 管理团队技术债并定期解决
  • 重新规划整个代码结构
  • 可以不 TDD 但必须写测试,制定可行的测试策略
  • ......

大家顶着被各种催进度的压力在做各种取舍,这中间花的时间是实实在在的,但改变也是实实在在的。

“ “我改了 xxx,yyy 的测试挂了,我得去看看。然后就能提 PR 了。” “aaa 文件在 bbb 里面,bbb 里面是整个 flow。” “这张卡我搞定了,现在在做重构,搞完后下张卡会很快。” ccc 的功能 pattern 已经定成上次讨论的了,你后面的功能搞成一样,一看就懂了。 ”

我们花在质量上的时间,都在未来的时间中赚回来了:由于定好了开发规范,我们在 code review 过程中不会再争论无意义的规范问题;大部分 bug 在出现的那一刻都能被我们的测试捕获到并快速修复;我们能快速找到我们想找的东西。

而那些我们还没有努力过的方向,依然让我们难受,比如前面提到的渲染引擎(苦笑

答案

看完三个故事,现在你应该能发现我们的时间都去哪了。

每个人都知道写垃圾代码可以让开发速度增快,那么我们停止花时间维护代码质量,把所有精力扑到完成功能追赶进度上来,如果可以的话,时间拉满,一个月工作 380 个小时。

静下心来好好想想朋友,”快而脏“是不存在的,垃圾代码只会让你把你所有时间用在 debug 里,垃圾代码只会拖累你。请记住,加快速度的唯一办法就是保证质量

换个角度想想,你加快速度节省的时间,又在 team 里面其他人身上花掉了,QA 会向你抱怨为什么之前好好的功能现在坏掉了,同事会来问你为什么他昨天的代码今天自测就不工作了,BA 会来告诉你今天 showcae 又失败了......

你觉得省下的时间,三五天后又回来找你了。

勇气

最后我想引用 Bob 大叔在《敏捷整洁之道》一书中对敏捷勇气价值观的解释来结束这篇文章。

勇气 —— 换句话说, 就是 在合理范围内敢于冒险。敏捷团队的成员并不太关注公司政治意义上的“安全”,那会导致牺牲质量和机会。他们意识到,长期来看,管理软件项目的最佳方法是具备一定程度的侵略性。 勇气和鲁葬是有区别的。部署最小的功能集需要勇气。维护高质量的代码和高质量的纪律需要勇气。但是,部署你自己都没有信心的代码,或者设计不具可持续性的代码,这就是鲁莽。通过牺牲质量来遵守时间表就是鲁莽。 质量和纪律会提高速度,这是一种信念,强势但幼稚的人们在面对时间压力时会不断挑战这种信念,因此坚持正确的信念需要勇气。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
敏捷开发并非一味的追求交付速度
自2001年《敏捷宣言》发布以来,敏捷开发(Agile Development)逐渐成为软件工程领域的主流方法论。然而,许多人对敏捷开发的认知仍停留在“快速交付”、“压缩时间”的层面,甚至将其等同于“加班赶工”或“牺牲质量的短期冲刺”。
JanYork_简昀
2025/05/20
1380
敏捷开发并非一味的追求交付速度
​CODING DevOps 系列第四课:DevOps 中的质量内建实践
随着时间的推移,我们项目的开发效率会逐渐降低,直到几年之后整个项目可能就无法维护,只能推倒重来。具体的表现首先就是随着时间推移,我们会发现整个需求列表里面能做的需求越来越少,因为每当我们增加一个新特性,需要改动的代码就非常多,所以最后每提出一个新的需求,团队评估出来的改动成本都非常高,导致最后难以增加新的特性。
腾讯云 CODING
2020/06/18
1.3K0
大厂不再招测试?软件测试左移开发合理吗?
最近两年,互联网大厂的招聘中,测试工程师岗位似乎显著减少。在腾讯内部,随着一些 BG 的研效改革逐渐深入,测试工程师这个岗位开始逐渐减少。似乎正在印证一个现象:测试岗位的未来已经不那么乐观? 但软件测试伴随着软件行业的出现经过了几十年的进化,花了很多时间和汗水才走到今天,测试这个领域是不会消失的。不少人都议论过岗位和角色的消失是否合理,一般都分成两派,一派认为测试工程师是独立且专业的岗位应该保留,合理缩减比例;另外一派认为软件测试领域并不复杂,觉得自己对于测试和自动化测试已经非常熟悉,完全可以胜任。 不管你属于哪一派,首先要熟悉软件测试才能更有发言权。熟悉是个模糊的说法,我们可以思考一个简单的问题,测试自动化和自动化测试这两个名词有什么区别?如果区分不出来或者没有概念的话,这篇文章非常适合你,这是专门写给开发的测试漫谈。
腾讯云开发者
2025/04/04
4341
大厂不再招测试?软件测试左移开发合理吗?
代码评审鲜为人知的好处
事实上,代码评审的好处远不止这些。有些项目经理或者开发人员不愿意多提评审,Coding 的过程包含的内容非常丰富,如果只把一个字符一个字符地敲代码叫做 Coding,未免悲哀了一点。优秀的项目,编码阶段实际敲代码的时间不会很长;优秀的程序员,大部分时间都用来思考了。
MavenTalker
2019/07/19
5900
说好的团队为质量负责呢?
在蓝鲸项目,似乎大家对质量的关注意识有些欠缺,于是在项目上的不同角色、不同工作年限的人之间采样做了一次访谈,上面这个问题就是其中访谈的问题之一。有同事曾提醒我说这种题就是送分题,肯定不会有人回答不出。可是,事实并非如此…
测试开发社区
2019/09/30
8580
说好的团队为质量负责呢?
什么是软件质量?
Functional Quality - How well software complies with or conforms to customer specifications.Structural Quality - How software meets non-functional requirements that support the delivery of the functional requirements, such as robustness or maintainability.质量是个很抽象的相对概念,如果打个比喻的话,会觉得质量和安全感有很多相似之处。安全感是什么?看不见摸不着,是不怕走夜路?不怕下水?抑或可以自在独处?每个人对安全感的要求是不一样的,同一个人在不同的年龄段对安全感的要求也不一样。襁褓中的婴儿大部分都很怕和母亲分离,因为他们和母亲从生命开始的那一刻起就有了切不断的联系,他们怕离开母亲独自面对子宫以外的环境。有些人可能因为小时候有溺水的经历,即便成年之后,也无法涉水,对河流,大海有难以言状的恐惧。同样的,在不同行业,有不同的质量标准。广义上讲,我们有食品质量,有工程质量,有软件质量等等。狭义到我们的软件开发,即使同一产品,不同的用户对产品质量的高低感受肯定也是有个体差异的。另外质量像安全一样是个相对的概念,一般情况下我们会认为家里相对马路上来说是更安全的。但这是一般大概率的情况下,但当地震发生的时候,空旷的马路上也许就比家里安全多了。质量也一样,软件质量的优劣,是需要满足特定行业特定用户群体的产品诉求,符合某一年龄段或者特定性别用户的使用习惯,兼容大部分目标用户特定设备需求等等。软件质量是一个抽象的存在软件质量在线的时候我们是比较难察觉它的存在的,我们不知道它就存在于我们的每一次需求讨论中、每一念的设计斟酌里、每一回车的代码提交时。但是一旦有客户抱怨产品不好用,或者发现产品缺陷时,质量这个隐形的存在似乎就变得特别醒目。貌似跟我们的健康一样,我们健健康康的时候,很少觉察到健康的重要性,快乐地熬着夜撸着串。但是一旦我们生病了,这要忌口,那要注意,我们惊觉原来健康和我们的一餐一眠,一时一刻的情绪都息息相关。软件质量是各个质量属性的综合通常情况下,人们习惯说好的软件质量就是实现了客户对软件的所有需求。但是什么是需求呢?在敏捷开发环境下,我们用用户故事来管理,沟通产品需求。而用户故事我们通常会归类为功能需求和非功能需求。举个例子,小区门禁系统通过人脸识别实现自动开门,这是个很明确的功能需求。满足了功能需求我们就能说这个软件的质量很好了吗?某天某位业主画了个浓妆,或者剪了个刘海,该系统无法识别了,功能无法满足了。你会发现,通常功能性需求和非功能性需求是交织在一起的,很多非功能性需求是为了辅助功能性需求的更好实现。软件质量一定是需要去界定质量特性,及满足这些特性应该具备哪些质量属性。再举个例子,我们可以拿生活中送礼物这事儿来类比。比如情人节到了,我们或多或少会期望收到一份来自另一半的礼物。而且还期待对方能无需提示,主动自愿,悄咪咪地准备一个自己心仪的礼物。把‘收到礼物’ 看作‘What’,那‘无需提示,主动自愿,悄咪咪地准备’,就是‘How’。如果跟你说:钱都在你那里,你想买什么自己买就是了。毫无仪式感和主动性,这个礼物会让人开心吗?质量模型作为一个妈妈(被迫营业的非专业的育儿家),我知道孩子的安全感是可以被定义为很多维度的:满足感,可控感,信任感等等。而且这些不同的安全感有其特定的建立阶段,例如一岁之前,如果孩子能得到父母很好的照顾,持续的慈爱,婴儿的满足感就能被适当建立。我相信育儿专家们对孩子的安全感一定有更专业的系统定义、建立及评估方法。质量也一样,即使很抽象,具有行业差异,但是IT从业者从来没放弃过对其进行定义和评估,因此产生了各种不同的质量评估模型。
ThoughtWorks
2021/09/15
1.4K0
谈谈践行 TDD 后的感受
大家好,我是码农小余,今天我们来讨论 TDD。本文纯属个人实践后的感受,若有不确之处,欢迎大佬指导和交流!
码农小余
2022/06/16
5170
谈谈践行 TDD 后的感受
如何在敏捷项目中实现高效测试?
随着软件开发的不断发展,敏捷开发方式脱颖而出,这预示着协作、迭代和高效软件创建的新时代的到来。这一转变的核心是敏捷测试——一种将测试与开发交织在一起的方法,以确保更高的质量、更快的交付和更灵敏的软件产品。
敏捷开发
2023/12/26
2900
如何在敏捷项目中实现高效测试?
解析《2020国内软件质量调查报告》
今天收到某个群友转发的《2020国内软件质量调查报告》,其中的很多报告论点很有意思。今晚抽时间写了篇博客,针对其中的某些论点,谈谈个人的一些看法。
老_张
2021/01/14
1.1K0
老码农看到的技术债务
关于技术债务的讨论时而蔓延时而消退,技术债务仿佛是个筐,什么东西都可以往里装,然而当我们企图倒光筐里东西的时候,却发现每人看到的东西都不一样,甚至有时候都数不清里面都有些什么。 作为一个半吊子全栈工匠,试图从一个老码农的视角审视一下技术债务。
半吊子全栈工匠
2018/08/22
9390
老码农看到的技术债务
技术债是什么、怎么还?你想知道的都在这一篇文章里了!
前两周写了关于技术债务的文章,尽管实践中会堆积技术债,但这个概念并不在我们的工作中频繁出现。这篇文章就系统性讲讲技术债,让大家避免知其然,不知其所以然。
陈哥聊测试
2021/03/12
5.1K0
TW洞见 | TDD随想录
2014年我一直从事在敏捷实践咨询项目,这也是我颇有收获的一年,特别是咨询项目的每一点改变,不管是代码质量的提高,还是自组织团队的建设,都能让我们感到欣慰。涉及人的问题都是复杂问题,改变人,改变一个组织是个更复杂问题,这里可能涉及很多的非技术,非能力问题。 在2014年12月我在某企业内部推行TDD(测试驱动开发)培训,一共分4个课时完成一个特定需求的例子,看着大家一步一步的加深对TDD的理解,直到2014的最后一天下午培训完TDD课程,经过一系列的总结过后,某参与人员说道:“单元测试需要写更多的代码,但
ThoughtWorks
2018/04/20
7930
极限编程技术实践
为了统一语言,我想有必要在开始讲重构前聊聊到底什么是重构。很多人讲到重构时甚至讲的是“将已有代码全删掉,重新写一遍这件事”,很显然这是重写不叫重构。
Teobler
2021/03/01
6320
极限编程技术实践
多些时间能少写些代码
 在现在这个浮躁的时期,再加上敏捷咨询师们念的歪经,他们让人感觉上就像是软件产品是可以在很短的时间内高质量的完成的,这令那些管理者们很兴奋,就像巴甫洛夫的条件反射实验中的狗看到了肉就像流口水那样兴奋。他们使用 TDD,快速迭代,不断重构,持续集成直至持续部署的方法在进行软件开发。   软件开发真是这样的吗?难道不需要花时间去思考吗?对此,有些观点在 Todd 的《“品质在于构建过程”吗?》以及《Bob 大叔和 Jim Coplien 对 TDD 的论战》中谈到过了。我只想想表达下面的观点: 软件的精髓在于设
用户1289394
2018/02/28
6110
Defects的启示 | 洞见
在过去的几个月,我做了一些实践,通过整理、讨论和分析项目上的Defects情况,来探索质量管理中的待改进点。最终发现,Defects实际上给质量管理带来了很多的启示。
ThoughtWorks
2018/10/22
7060
Defects的启示 | 洞见
也谈“精益”|洞见
精益对大家来说都不陌生了,无论是最开始提取的丰田制造原型,还是后面延伸出来的物流供应链管理,再到近两年颇为流行的精益创业(Lean Startup),都在不停刷新着“精益”这个概念。最近也不乏把精益当
ThoughtWorks
2018/04/17
6750
也谈“精益”|洞见
准确识别技术债务才是改造遗留系统的破解之道
本文由极客时间整理自华为云化平台技术专家白嗣健在 QCon+ 案例研习社的演讲《千万级规模遗留系统债务度量改造实践》。
深度学习与Python
2022/06/11
5630
准确识别技术债务才是改造遗留系统的破解之道
敏捷方法面试题-2023面试题库
顾名思义,敏捷方法论是一组方法和实践,其中软件开发和项目管理发生在称为冲刺的短开发周期中交付以客户为中心的产品。这是一种迭代方法,每次迭代都经过专门设计,体积小且易于管理,以便可以在特定的给定时间段内交付。敏捷方法对随时间变化的需求持开放态度,并鼓励最终用户不断反馈。这是最受欢迎的方法,因为在此过程中,客户也参与其中,以便他们可以获得有关其产品的更新,并确保他们是否满足其要求。
jack.yang
2025/04/05
570
[转] Agile Software Development 敏捷软件开发
  敏捷开发是一种软件开发方法,基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作。
Edison Zhou
2018/08/20
7090
[转] Agile Software Development 敏捷软件开发
项目管理中的敏捷实践|洞见
作为项目经理,我们经历了不同的项目,却总是受限于相似的困局。比如以下三个典型难题: 团队目标不一致 团队成员不熟悉 信息发布不流畅 倘若我们任由问题存在,而不在每次项目中进行总结和提炼,就会反复的徘
ThoughtWorks
2018/04/17
1.1K0
项目管理中的敏捷实践|洞见
相关推荐
敏捷开发并非一味的追求交付速度
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档