{
    "componentChunkName": "component---src-templates-blog-blog-detail-tsx",
    "path": "/blog/tidb-engineering-practice-and-talent-view",
    "result": {"pageContext":{"blog":{"id":"Blogs_502","title":"唐刘：TiDB 研发工程实践及 TiDB 人才观丨CCF 中国数据库暑期学校","tags":["TiDB","工程实践"],"category":{"name":"观点洞察"},"summary":"在刚刚结束的 CCF 中国数据库暑期学校上， PingCAP 的研发副总裁唐刘分享了在 TiDB 研发过程中的工程实践经验和人才培养方法。","body":"## 导读\n\n在刚刚结束的 CCF 中国数据库暑期学校上， PingCAP 的研发副总裁唐刘分享了在 TiDB 研发过程中的工程实践经验和人才培养方法。目前，TiDB 已广泛应用于各行各业，有着庞大的用户基数，面临多样化的数据处理需求。PingCAP 通过开源、敏态+稳态的研发方式、自动化、持续测试以及持续倾听客户之声（Voice of Customer）等工程实践，成功应对了这些挑战。TiDB 的开源模式、人才培养、持续创造社会价值等也是 PingCAP 关注的焦点。以下为分享实录。阅读需约 8 分钟。\n\n![唐刘-CCF.png](https://img1.www.pingcap.com/prod/CCF_dbbc220137.png)\n\n我是 PingCAP 的研发负责人唐刘，也是 PingCAP 的第一个员工。从 8 年前，TiDB 的第一行代码开始，我就深入地参与到了这个项目中。非常荣幸我能有今天的机会，代表 PingCAP 与大家分享 TiDB 研发过程中的一些工程实践经验，以及我们人才培养的方法，供大家学习参考。\n\n![数字生活背后的 TiDB.png](https://img1.www.pingcap.com/prod/Ti_DB_998d76dba3.png)\n\n经过了 8 年的发展，TiDB 已经被应用在了各行各业，可以说无论是衣食住行、金融保险，生活中每个环节都有了 TiDB 的参与。如此广阔的应用场景也给 TiDB 数据库提出了更高的要求。  \n\n作为一款通用数据库，各行业、各场景对数据处理的需求截然不同，如何满足多种需求？面对庞大的用户基数，以及当下爆火的 AI 技术，整个社会的数据量持续膨胀，数据库又该如何应对？很多同学可能会觉得，开发一款数据库，单机能跑起来、能存数据就好了，然而当数据规模扩大 10 倍、100 倍，甚至达到 PB 级别，即使是 OLTP 数据库，这个压力和挑战也是完全不同的。极度复杂的业务场景下，大规模海量数据的处理与分析成为了我们必须面对的挑战。幸运的是，PingCAP 通过 8 年的努力，成功地解决了客户的实际问题，接下来我将和大家分享，PingCAP 是如何通过工程实践和人才培养来应对这些挑战的。\n\n## TiDB 工程实践\n\n### 1  开源  \n\n在 PingCAP 的工程实践中，最重要的是开源，从开发 TiDB 的第一天起，我们就选择了完全开源的方式来开发我们的数据库，我们完全基于 GitHub 平台来开发，任何人都可以直接在 GitHub 上下载 TiDB 的源代码，编译、部署、运行，也可以直接发布到线上环境，甚至可以在遵循开源协议的前提下将 TiDB 的服务售卖给客户。我们将一切能开源的都开源，能透明的都透明。开源协作这个观念放在今天大家可能已经习以为常，但是在 8、9 年前的国内，尤其是基础架构领域公司，有很多人会投来非常怀疑的目光。但是我们始终坚定地去走开源这条路，因为我们相信开源是我们能跟我们的用户取得信任的最高效的途径。只有开源才能让用户清晰地了解 TiDB 的系统架构、设计思路，用户脱离 PingCAP 也能够运维、使用甚至迭代这个产品，这种信任对一家基础软件公司来说是至关重要的。  \n\n然而开源协作也并不是一件很简单的事，培养使用 GitHub 的习惯也是有一定上手门槛的。比如我们遇到问题之后，首先要在 GitHub 上开 issue，详细地把这个问题描述出来，甚至还需要复现问题；处理问题时要写详细的设计文档，邀请其他人来 review，通过后才能提交 Pull Request 进行代码研发，再次通过 review 才能合并代码，真正投入使用。这一系列流程走下来会有人觉得会不会太繁琐了？其实这也是开源的魅力所在，通过这样的方式，才能打造一款合格的工业体系的产品。  \n\n### 2  敏态 + 稳态  \n\n除了开源，PingCAP 另一个重要的工程实践就是敏态 + 稳态的研发方式。作为一款数据库产品，TiDB 的每个客户对数据库产品的要求是不同的，比如对于互联网客户，要求就是短而快，而在金融核心的银行大客户，稳定才是最重要的。所以，如何让所有用户都「又快又稳」地感知到 TiDB 的价值？我们选择了敏态 + 稳态的迭代方式。首先我们以敏态的方式来应对业务的不确定性。具体来说，我们会以非常高的频次 - 月度发布 DMR 版本，就是 Development Milestone Release 的这样的版本，同时每周我们会将最新代码部署到云上面去，进入 TiDB Cloud 给到用户进行试用，通过用户体验快速地迭代打磨，借助于整个社区的力量，帮助我们的产品，尤其是新的 feature 快速地推向市场，让客户去感知、去使用。同时，我们也在以稳态的方式提升整个产品的核心能力。我们每半年会发布一个 LTS（Long Term Support）的版本，让企业客户能够安心使用。因为很多行业，比如我们银行业的客户，不会去使用非常激进的版本，而是主要出于稳定性的考量。在这个的大的 LTS 版本里面，我们就会专注于稳定性、高可用性和性能的不断提升。  \n\n接下来我分享这些“工程实践”是来自 TiDB 的，同时业界优秀的互联网公司、软件开发人员也都有这样的“最佳实践”。  \n\n### 3 自动化  \n\n想让程序跑得又快又稳，非常关键的就是自动化一切能自动化的服务，让机器和 AI 最大程度地放大开发人员的生产力。大家能在 GitHub 上看到的 PingCAP 的项目代码，如果用冰山来打比方，可能只是冰山海平面上非常小的一角，它的海平面以下有非常大的基座，就是我们的自动化测试体系—— CI/CD、自动化的 pipeline、AI 增强的问答系统，以及其它相关的系统，都是藏在 TiDB 源码后面的。因而 TiDB 能够实现完全自动化的部署、运维。PingCAP 除了数据库内核团队，也成立了专门的团队来实现这些自动化，这也是 PingCAP 能跑得快的一个重要因素。  \n\n### 4 测试，测试，测试  \n\n重要事情说三遍，测试、测试、测试。活动现场有了很多和同学交流的机会，很多同学会有一个共同的疑问：在工业界和学术界做数据库到底有什么不一样？  \n\n以 PingCAP 为例，在工业界，我们很多的工作都是聚焦于“测试”的。这是个看起来非常枯燥的工作，但也非常基础，只有做好测试工作，数据库才能更加健壮。我是一个有 20 多年研发经验的程序员，甚至可以非常笃定地说，只要是从事软件开发这个行业，数据库或是其他，只要涉及到基础架构，能不能写好测试会是区分一个工程师是否优秀的一个分水岭。基础软件是非常复杂的系统，复杂系统的稳定性和鲁棒性是非常关键的，只有深入理解系统的工作原理，才能有效地测试系统，才能不断修正、优化。所以在设计系统的时候，我们要保证系统的「可测性」。  \n\n### 5  Eat your own dog food  \n\n吃自己的狗粮，这也是软件开发中常提到的一件事。像我们自己做的 OSS Insight，一个开源的 GitHub 数据分析工具，就是基于我们自己的 TiDB Cloud 来构建的。同时 PingCAP 内部的很多系统也都是基于 TiDB、TiDB Cloud 的。一个系统如果你自己都不愿意尝试体验，那就很难是一个好的系统。  \n\n### 6  部署、研发、预研，时刻保持技术领先  \n\n为了时刻保持技术的领先性，现在 PingCAP 采用的是一个“三代”的研发模块——部署一代、研发一代、预研一代。比如我们底层的存储 TiKV，现在用户部署的基本都是我们的“部署一代”，也就是单个 RocksDB 的存储引擎，今年年底我们会发布现在正投入大量资源研发的下一代存储引擎，也就是基于多 RocksDB 的 Partitioned Raft KV 的新一代存储引擎。除此之外，我们还在研发另一套云原生的 Cloud Storage Engine。我们会同时保持三代的迭代速度，确保我们在每一个时间点上，TiDB 的技术架构都是领先的，都能给用户带来更大的价值。  \n\n### 7  持续倾听客户之声  \n\n另外一个学术界与工业界的差距就是，在工业界你需要了解你的产品目标用户是谁，你的产品谁来买单？做产品一定要根据用户的需求来做，而非自己主观的评估。无论你的技术多么 fancy，看起来有多酷，如果没人用，它都不是一款好的产品。PingCAP 一直非常重视用户的反馈，无论是通过 GitHub 的开源协作，还是 AskTUG 论坛、我们线下的客户之声活动，我们都在不断地根据用户的反馈来进行产品的设计和迭代。\n\n## TiDB 产品家族协同演进\n\n![TiDB 产品演进.png](https://img1.www.pingcap.com/prod/Ti_DB_fc1d4d5155.png)\n\n经过 8 年的打磨，TiDB 形成了一个完备的产品家族体系。最上面是 TiDB Open Core，也就是我们的源代码是完全开源的。基于这个 Open Core，我们推出了 TiDB 企业版、全托管的 TiDB Cloud，和 TiDB Serverless 版本。前两者对应着我之前提到的“敏态 + 稳态”，而 TiDB Serverless 则正在把 PingCAP 人一个非常有野心的愿望变成现实：我们希望给全世界的开发者提供一款免费的、永远在线的数据服务。我们希望 TiDB Serverless 能做到表级别的创建和唤醒，在满足一定 resource quota 的情况下，做到可预期的性能。\n\n![客户成功.png](https://img1.www.pingcap.com/prod/_414b62b721.png)\n\n## TiDB 人才生态\n\nTiDB 自主开源的模式，打造了敏态 + 稳态的工程体系和开放式的架构哲学，而这一切的基础、最核心的部分就是 TiDB 的人才生态。TiDB 一直坚持开源，而 PingCAP 作为一家公司，是以营利为目的的，为什么还能一直坚持开源信仰？我们坚持做企业一定要回报社会，一个好的商业模式是什么样的？我们觉得应该是先创造社会价值，再从社会价值上萃取一部分商业价值，这也是我们对于自己未来长期的期望。  \n\n![TiDB 人才画像.png](https://img1.www.pingcap.com/prod/Ti_DB_61de96cbdc.png)\n\nTiDB 在培养怎样的人才？从我们过去招聘的 JD 就可以看出来。归纳到这几点，第一就是技术专精，热爱开源，数据库作为基础软件，对计算机系统的理解、过硬的编程实力都是必须的，我们也希望大家能够深刻理解开源软件的协作模式；同时我们希望你有国际化的视野和拥抱创新的精神，TiDB 诞生于中国，服务于全球用户，在中国、北美、APAC、欧洲都有业务，只有具有开放的心态，才能更好地拥抱国际化；除此之外，客户导向也很重要，如我前面提到的“持续倾听客户之声”，贝索斯也在亚马逊的 leadership principle 中提出了一条 customer obsession，也就是痴迷客户，客户导向，唯有如此才能打造一款成功的产品。  \n\n![TiDB 人才生态.png](https://img1.www.pingcap.com/prod/Ti_DB_a13a3a841d.png)\n\n8 年以来，公司、产品不断壮大，TiDB 的人才生态也在逐步完善，现在也有了一些成果。我们通过 TiDB 成功地连接了全世界的数据库人才，TiDB 在全球有近 2000 名贡献者，遍布 45 个国家和地区，包括现场的同学也有很多 TiDB 的贡献者，TiDB 也成功进入了全球范围内超过 250 家高校。  \n\n## 技术人如何实现社会价值  \n\n作为一名工程师，如何创造社会价值？  \n\n又回到了最开始我们聊的：开源。只有开源，我们才能在全世界的代码宝库里，留下一些有长远价值的东西，我们的探索，也才能成为国内技术通行者的共同探索。  \n\n![共同探索.png](https://img1.www.pingcap.com/prod/_b40ce33262.png)\n\n在开源的基础上，为了让 TiDB 触手可及，我们做了许多努力。  \n\n首先，我们将 TiDB 的底层存储 TiKV、混沌工程测试平台 Chaos Mesh 都捐赠给了 CNCF 基金会，它们现在已经成为了非常技术公司构建自己云原生服务的底座；从 2021 到今天，PingCAP 连续三年与 CCF 数据库专委会合作，共同组织中国数据库暑期学校，促进工业界与学术界的联动，让更多学生接触到了数据库的专业知识；我们还打造了 Talent Plan 项目，一门非常适合技术爱好者入门数据库内核研发的数据库课程，现在已经与 250 多所高校合作，学员遍布全球……  \n\n今天，为了更好的支持中国数据库人才培养，持续赋能中国数据库行业，践行 PingCAP 对数据库人才的长期主义，和中国数据库一同成长，PingCAP 向中国计算机学会数据库专委会捐赠三年暑期学校工程实践的全部实验，2021 年的主题是分布式，2022 年是优化器，今年的主题是云数据库，[欢迎大家体验](https://tidbcloud.com/free-trial)。\n","date":"2023-08-02","author":"唐刘","fillInMethod":"writeDirectly","customUrl":"tidb-engineering-practice-and-talent-view","file":null,"relatedBlogs":[]}}},
    "staticQueryHashes": ["1327623483","1820662718","3081853212","3430003955","3649515864","4265596160","63159454"]}