乐趣区

关于数据库:揭秘10人2-周200-PRBytebase-在提升研发效率上做了什么

在一家全球化初创公司背地的 30+ SaaS 服务和老本这篇文章中有提到 Bytebase 在研发团队只有 10 人的规模下,做到了每两周一次公布,且每个版本有 100 – 150 左右的 PR 数量。这样的「壮举」也在 Hacker News 上引发了探讨。

随着工夫的推移,当初 Bytebase 曾经演变到 10 人,2 周,200+ PR。想要做到极致的研发效率是须要「就地取材」思考所有环节,推敲每一个细节,并且离不开每一位同学的致力。正如软件工程中的「没有银弹」所言,不同的组织、不同的研发背景是须要不同流程和策略能力达到研发效率的山顶。不过,在谋求研发效率的过程中,一些想法和思路是能够参考借鉴的。

接下来本文会通过一个具体的例子来探秘 Bytebase 谋求研发效率的冰山一角。

背景介绍

家喻户晓,Bytebase 作为一款数据库 DevOps 工具,因而代码中少不了与 SQL 打交道。同时,为了保障 Bytebase 可能如预期中为用户提供弱小的性能,咱们在 Bytebase 的 SQL kernel 模块中增加了大量的单元测试。

此外,Bytebase 应用 Golang 作为后端研发的语言。对 Golang 相熟的同学可能晓得,Golang 中有两种形式能够定义字符串常量:应用双引号,或者应用反引号。这两者的次要区别是:

  1. 对于非凡的字符,在双引号的格局中须要应用转义字符,例如换行(\n), 双引号本身等。
  2. 反引号反对原生格局的字符串,不须要应用转义字符,然而无奈应用反引号自身。

上面展现了应用不同格局来定义雷同的字符串常量:

// The Double-quoted Style
s := "SELECT id, name \nFROM t \nWHERE name != \"Bytebase\"\nLIMIT 1"

// The Back-quoted Style
s := `SELECT id, name 
FROM t 
WHERE name != "Bytebase" 
LIMIT 1`

能够看到,在可读性上,不应用转义字符的反引号格局稍逊一筹。而后反引号也有它本人的问题:

  1. 在定义多行的反引号格局字符串常量时,字符串自身所应用的格局影响着最终的内容,因而通常和代码缩进心心相印。
  2. 反引号格局的字符串中不能呈现反引号自身,然而,反引号是 MySQL 方言中用来示意标识符的符号,在 MySQL 方言的 SQL 文本中经常出现。由此导致很多时候不能应用反引号格局。

在 Bytebase 研发同学们的身心和眼睛被 SQL 与 Golang 字符串折磨了数周之后,咱们引入了 YAML 文件来寄存 SQL 相干的测试文件,并且借此机会实现了从手写测试用例和测试后果转变为手写测试输出,生成测试后果的形式。

抉择 YAML

抉择 YAML 背地的起因是 YAML 定义多行字符串能够应用所谓的 Block Scalar Style。简略来讲,咱们能够应用上面的格局来定义之前提到的字符串:

example: |-
  SELECT id, name
  FROM t
  WHERE name != "Bytebase"
  LIMIT 1

如你所见,Block Scalar Style 下,不须要任何类型的引号来示意这是一个字符串,因而,咱们也可能在其中应用任何类型的字符。除此之外,YAML 应用了一些标识符来定义字符串中的空行与换行的格局。在这个例子中,”|-”标识符示意取出最初一行的换行符,然而保留其余行的换行符。

领有了这个利器之后,咱们重构了相干的测试框架,他们大略是这个样子:

func RunTest(..., record bool) {ReadTestData()
  result := CalculateResult()
  If record {WriteResult()
  } else {CompareResult()
  }
}

此时,不仅解决了在 Golang 中定义测试用字符串常量可读性差的问题,还顺便推动了测试半自动化生成。

突发惨案

现实中的故事应该就此画上句号,然而事实总是残暴的。对于软件工程而言,引入任何新内容都是一把双刃剑,须要谨慎衡量。

对于 YAML 的故事这样的。在下面的例子中能够看到,当咱们想要增加新的测试时,咱们会先设计好测试输出,而后将对应测试的 record 值设置为 true,最初通过 RunTest 办法来生成对应的测试后果,最初人工查看是否满足预期。在之前,最初生成的后果都是之前介绍的 Block Scalar Style,可读性极佳。然而在一个风和日丽的下午,生成的后果并不是 Block Scalar Style,而是 YAML 中的 Double-quoted Scalar Style。看起来大略是这样:

example: "SELECT id, name\nFROM t\nWHERE name != \"Bytebase\"\nLIMIT 1"

没错,这个看起来与 Golang 中的双引号格局差不多,可读性也被各种转义字符完完全全毁坏掉了。在我不停尝试下,仍然没有方法失去我想要的 Block Scalar Style。不论是 Golang 中 YAML 格局的序列化 (Marshal) 办法,还是 Google 中都没有找到我想要的信息。无奈之下,只能查看并调试 Golang YAML 库来看看问题出在哪里。

// 此处省略若干调试、读代码过程。🥵

最终,在管制序列化 YAML 格局的过程中发现了一个细节,当存在行末空格时,即呈现一个空格符号连着一个换行符时,字符串格局会被强制应用 Double-quoted Scalar Style!

发现这个逻辑之后,再反过来去看字符串中的确有一个行末空格。把行末空格去掉之后的确可能失去 Block Scalar Style 的字符串了。这里能够应用 VSCode 的 Render Whitespace trailing 性能。

后记

极致的研发效率是简直所有的研发团队都在谋求的,除了最容易被关注的流程框架之外,须要去留神、可能带来效率晋升的细节还有十分多。在一直调整、优化的过程中,最初才可能逐步达到极致的效率,这可能也就是大家常说的「团队磨合」的一部分吧。
ヾ (✿゚▽゚) ノ


💡 你能够拜访官网:https://www.bytebase.com/,收费注册云账号,立刻体验 Bytebase。

退出移动版