唐刘:关于产品质量的思考 - 我的基本认知

我在文章《 TiDB in 2023 - 一次简单的回顾 》 中提到了一个我一直以来面临的问题:每次 TiDB 发布新版本后,我如何能够非常自信地告诉客户,这个版本的质量很好,大家可以放心使用呢?

坦白地说, 这个问题并不容易回答 。 我计划通过一系列文章来分享我对产品质量的思考,这是其中的第一篇,主要讲讲我对质量的基本理解。

需要说明的是,这些都是我个人的理解,并不绝对正确。我会不断吸收和更新迭代自己对质量的认知。另外,我提到的产品主要是 TiDB 等基础架构软件产品,不一定适用于其他产品。

高质量的产品是用出来的

『高质量的产品是用出来的』,其实这句话还有后半句,完整来说就是『高质量的产品是用出来的,而不仅仅只是测出来的』。 这是我近年来的一个深刻认识。一开始就提出这样的观点,可能会让人觉得我在为无法直接发布高质量产品找借口,甚至会让用户产生不必要的焦虑,觉得自己会被当成小白鼠来测试产品。

为什么我会有这样的认知,可以看下面这幅因果回路图:

关于因果回路图,我后面会写文章专门介绍,大家也可以先看看 Wiki - Causal loop diagram

以上是一个增强回路,我们从 Quality Product 这个点开始,整体的回路逻辑如下:

 当我们有一个高质量的产品时,我们就 会获得更多客户。 具体的 客户获取 可以通过销售努力、客户自我推荐、 品 牌传播等方式 ,这里我们不做 详细 讨论。

 当我们有更多的客户之后,产品就会面临更多的业务场景,承接更多的负载。

 更多的业务场景、负载,更容易突破产品的边界能力,从而让我们发现更多的 Bug 和缺陷。

 我们就会投入更多的努力去修复这些质量问题, 从而提高产品质量。 而产品质量的提高将进一步吸引更多客户。

我在上面的回路图中是 从 "Quality Product" 这个点开始讨论,这也意味着我们需要有一个质量还不错的产品。 如果我们的产品质量不行,由于这是一个增强回路,我们将会失去更多客户,同时也无法 继 续 打磨产品

那么,如何发布一个质量还不错的产品呢?其中一个重要工作是测试,因此测试非常关键。但我们需要清醒地认识到,测试只是我们对客户业务系统的一种抽象,是我们自己对于我们自己产品系统能力的理解。而我们自己的认知是不可能覆盖到真实世界所有情况的,所以我们也需要在各种各样的现实场景中打磨我们的产品,让产品质量变得越来越好。

这里在回应一下上面『小白鼠』的观点,我认为,不仅 TiDB,市场上大多数软件产品都是如此。我们通常会先找一部分样板客户去打磨产品,打磨好之后才会推广到更多的客户。而更多客户的使用也将帮助我们发现更多问题,从而继续完善产品。这其实也符合前面的因果回路图 。

更多的功能,更多的 bug

继续上面的因果回路,我们可以扩展另一个增强回路。当我们承接了客户更多的场景和负载之后,客户对我们提出了更多的要求,也就是会给我们提更多的功能需求。在这种情况下,我们就需要投入到新功能的开发当中。 新 功能做的越多 ,我们的产品在更多的维度上就更有竞争力,自然就会吸引更多的客户去使用。

这个外面的增强回路,看起来非常美好,不过这里有两个点需要特别注意:

 新功能的开发, 从最初的设计到最终发布,再到客户真正开始使用这些新功能 ,是需要很长时间的,这个时间通常以季度来计算。 因此,产品竞争力的提升会存在一定的延迟。 这也是我在新功能到产品竞争力之间加了一个延迟标记的原因。 尽管在其他方面也存在延迟,但我在这里想要重点强调这一点。

 更重要的是,研发的带宽是一个物理约束,公司不可能无限制的增加研发资源。当我们投入更多的研发带宽去研发新的功能时候,自然会挤占质量改进的带宽,所以无论是新的功能引入的 bug,还是累积的未修复的 bug,都会降低产品的质量。

注意:上面我在 Feature Development Efforts 到 Quality Improvement Efforts 之间,画了一条负反馈连接。虽然形成了一个调节回路,不过因为调节回路都需要收敛到一个目标,这个图其实画的并不完善,这里先就这样将就吧……

这里就有我的第二个认知,『更多的功能,更多的 bug』。

这其实也是我的教训。在之前的 TiDB 版本里面,我们有时候太放飞自我,做了太多的功能,而功能越多的版本,质量在一开始就是不稳定,所以我们耗费了大量的精力去提升质量。注意,这里其实也有另一个平衡回路。当我们投入更多资源到质量改进时,自然也会影响新功能的开发。新功能减少会影响后续产品的竞争力。这也是为什么我们从 7.5 版本开始,在控制新功能数量的同时,努力寻找竞争力和质量之间的平衡点。

另外一个现实需要面对的,就是任何功能的开发,甚至包括 bug 修复,都会涉及到代码的调整。在一个极度复杂的产品里面,做任何的代码调整,都可能引入新的 bug。我相信研发都不愿意写有 bug 的代码,不过这个不会以研发的意志为转移。

当然我们可以通过非常多的手段来提升我们开发新功能的产品质量,或者修复 bug 的速度,这些我将在后面的文章中详细说明。我想强调的是,上述认知是我对现实的理解。只有接受了这一点,我们才能更好地做出取舍,更好地打造出有竞争力、高质量的产品 。

小结

当我写下上面几点我的认知时,我感到非常吃惊。我承认,如果回到10年前,我绝对不会有这样的认知。当然,我也不指望我的认知是正确的,也可能不久之后,我的认知又会刷新。我也会在文章中做相关的更新。

写到这里,不由得让我想到一个语言的梗,据传来自 C++ 之父 Bjarne Stroustrup - 『世界上只有两种语言,一种饱受诟病,一种没有人用。』产品也是如此。一个好的产品必须要有大量的用户,用的多了,骂的自然也多了,当然最终的结果是越变越好,这可能就是产品成长的必然经历吧 。

更新

 一个很有意思的事情,在我当天 2024-02-24 发布这篇文章的时候,Hacker News 上也有一篇讨论软件质量的帖子上了首页, How to think about software quality (2022) | Hacker News ,看来不只是我,大概率全球的开发者也在头疼这个问题吧。

 另外也找到了一篇非常早的关于 MySQL 质量的帖子,里面的一些观点跟我不谋而合, 7 Reasons why MySQL Quality will never be the same ( https://www.percona.com/blog/7-reasons-mysql-quality-will-never-be-the-same/ )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/518818.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[HackMyVM]靶场Deeper

难度:Easy kali:192.168.56.104 靶机:192.168.56.148 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.148 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-05 19:55 CST Nmap scan report for 192.168.56.148 Host is up (0.00013s latency). N…

数据结构:详解【树和二叉树】

1. 树的概念及结构(了解) 1.1 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝…

智慧公厕升级为多功能城市智慧驿站,助力智慧城市发展

在现代城市的建设中,公共厕所作为基础必备的民生设施,一直是城市管理的重要组成部分。随着科技的不断发展,智慧公厕应运而生,成为了公共厕所信息化、数字化、智慧化的应用解决方案。而近年来,智慧公厕也进行了升级发展…

20240309web前端_第三周作业_教务系统页面

作业&#xff1a;教务系统页面 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

拥塞控制算法系列之:Swift-谷歌2020年SIGCOM-包级别端到端TIMELY拥塞控制算法

核心要点&#xff1a; 谷歌 2020 SIGCOM基于delay的AIMD拥塞拆分EC和FC&#xff0c;时延敏感场景优势分别计算EC和FC的wnd&#xff08;最核心&#xff09;保障吞吐和低延迟。Swift 因利用延迟的简单性和有效性而闻名包级别的论文&#xff1a;https://dl.acm.org/doi/pdf/10.11…

【保姆级讲解如何计算机视觉入门】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

江协STM32:对射式红外传感器计次和旋转编码器计次

对射式红外传感器计次 还是复制粘贴之前的文件 创建外部中断文件 然后写初始化函数 外部中断函数创建 这里写外部中断函数 看着这个图来配置 具体步骤就是&#xff1a; 第一步&#xff0c;配置RCC&#xff0c;把我们这里涉及的外设的时钟都打开&#xff0c;不打开时钟&#…

深入浅出 -- 系统架构之微服务中OpenFeign最佳实践

前面我们讲了一下 Ribbon 和 RestTemplate 实现服务端通信的方法&#xff0c;Ribbon 提供了客户端负载均衡&#xff0c;而 RestTemplate 则对 http 进行封装&#xff0c;简化了发送请求的流程&#xff0c;两者互相配合&#xff0c;构建了服务间的高可用通信。 但在使用后也会发…

c++的学习之路:12、vector(1)

这章主要是根据cplusplus中的文档进行使用Vector&#xff0c;文章末附上测试代码。 目录 一、什么是vector 二、vector的简单使用 三、代码 一、什么是vector 下图是cplusplus的简介&#xff0c;上面一共有六点&#xff0c;如下&#xff1a; 1、vector是表示可变大小数组…

Leetcode 216.组合总和III

题目 思路 题目说只使用数字1-9&#xff0c;是k个数的和 树的宽度是1-9&#xff0c;树的深度是k 1.确定递归函数的返回值及参数&#xff1a; 返回值是void,参数这里还是先设定两个全局变量。一个是path存放符合条件单一结果。如&#xff1a;&#xff08;1&#xff0c;2&…

VSCODE EIDE使用debug记录

用上vscode之后就感觉之前的keil不太爽了&#xff0c;找什么东西搜索都很麻烦&#xff0c;之前有写过eide的文章&#xff0c;想着能不能在eide里面就把debug也做了&#xff0c;发现真的可以&#xff0c;下面记录一下&#xff0c;主要是参考这个大佬的文章&#xff0c;非常感谢。…

微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元&#xff0c;用户现场的分布式发电可以支持用电需求。为此&#xff0c;您的微电网将接入、监控、预测和控制您本地的分布式能源系统&#xff0c;同时强化供电系统的弹性&#xff0c;保障您的用电更经济。您可以在连接…

离线数仓(十)【ADS 层开发】

前言 剩下的 ADS 层主要就是写 SQL 了&#xff0c;就像我们之前练习的 HQL 题一样&#xff0c;不同的是这里的数据从哪张表读取&#xff08;DWD 还是 ADS 甚至个别表需要从 DIM 层读取&#xff09;需要我们自己来分析。 ADS 的建表语句和 MySQL 是对应的&#xff0c;我们到时候…

网络协议——HTTP协议

目录 ​编辑 一&#xff0c;HTTP协议基本认识 二&#xff0c;认识URL 三&#xff0c;http协议的格式 1&#xff0c;发送格式 2&#xff0c;回应格式 四&#xff0c;服务端代码 五&#xff0c;http报文细节 1&#xff0c;Post与Get方法 2&#xff0c;Content_lenth 3&…

OpenCV-python安装教程

先安装opencv-contrib-python pip install opencv-contrib-python 再换源安装opencv-python pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 如果出现 使用这个&#xff0c;3.6环境下不能安装opencv的最新版本 pip install opencv-python4.5.5.62…

ST表(Segment Tree)

目录 1.概述 2.引入 3.ST表对引入的优化 1.概述 ST表是一种基于树形结构的数据结构&#xff0c;用于处理区间查询和更新操作。它通过预处理的方式将原始数据存储在树状结构中&#xff0c;以支持高效的区间查询。ST表的构建时间复杂度为O(nlogn)&#xff0c;其中n为原始数据…

算法——分治(快速排序)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享分治算法关于快速排序的专题 对于快速排序在我个人主页专栏 <排序> 有详细的介绍,此专题对快排进行了优化操作,并介绍了优化后的快排的几种运用 如果有不足的或者错误的请…

数组方法汇总

数组和链表类似&#xff0c;都是用双指针&#xff0c;但数组不需要额外的指针&#xff0c;可以使用索引来当作指针。&#xff08;链表的时候要注意&#xff0c;什么时候是移动的指针&#xff0c;什么时候是改变的节点&#xff09;删除有序数组中的重复项 注意&#xff0c;本题中…

【数据结构】--- 探索栈和队列的奥秘

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა &#x1f4a1;个人主页&#xff1a;9ilk &#x1f4a1;专栏&#xff1a;数据结构之旅 上回我们学习了顺序表和链表&#xff0c;今天博主来讲解两个新的数据结构 — 栈和队列 &#xff0c; 请放心食用 文章目录 &#x1f3e0; 栈&#x1…

红黑树内部结点数量分析

红黑树内部结点数量分析 一、红黑树的性质二、黑高与内部结点数量2.1最大内部结点数量2.2最小内部结点数量 三、伪代码实现四、C语言代码实现五、结论 红黑树是一种自平衡的二叉搜索树&#xff0c;它通过一系列复杂的性质和操作来维持平衡&#xff0c;从而确保各种动态集合操作…