阿里云飞天发布时刻,领先大模型限免,超7000万 tokens免费体验 了解详情
写点什么

来自谷歌的开发心得:所有 SQL 和代码,都没必要藏着掖着

  • 2022-02-18
  • 本文字数:2973 字

    阅读完需:约 10 分钟

来自谷歌的开发心得:所有SQL和代码,都没必要藏着掖着

至少从工程技术的角度看,你的项目绝没有想象中那么“见不得光”。


谷歌在代码管理上很有特色,他们基于“主干”进行开发,并且将 90% 以上的代码放在名叫 Piper 的单一代码仓库中,由来自世界各国数十个办事处的数万名软件开发人员共享。对于那些开源的、需要外部协作的项目,代码才放在版本管理软件 Git 里,主要是 Android 项目和 Chrome 项目。


整个仓库采用树状结构,每个团队有自己的目录,目录路径就是代码的命名空间。每个目录都有负责人(owner),负责批准该目录的文件变动。


这种方法已经在谷歌运行了 20 年以上。2015 年,谷歌的这个代码库就包含了大约十亿个文件,并且具有约 3500 万次提交的历史。代码一般提交到主干的头部,保证所有用户看到的都是同一份代码的最新版本,支持文件级别的权限控制,99% 的代码对所有用户可见。只有少部分重要的配置文件和机密的关键业务,设有访问限制。所有的读写都有日志,管理员能够查到谁读过这个文件。


与给代码制定各种访问权限的管理方式相比,谷歌的方法带来的好处是很明显的:任何人都可以浏览和使用全公司的代码,大大促进了代码的共享和复用;具有统一的版本和路径,不存在找不到文件的最新版本这样的问题;每次代码变动,很容易撤销或者用预提交测试它所造成的影响…


就连 SQL 的管理,谷歌也在一定程度上遵循了这些原则。本文作者是一名数据工程师,给谷歌当了两年的供应商,在期间发现谷歌的数据工程师对待 SQL 的态度,跟软件工程师们对待代码的态度非常相似。他认为这种态度非常重要,无论大小企业都值得在数据战略中采取这样的心态。我们将作者的文章翻译了出来,通过他的文章,我们将一同了解谷歌这种把 SQL 当成代码的态度有哪些助益,又能给体量较小的组织机构带来哪些启示。


SQL 只是种查询语言,谷歌为什么要把它看作代码?


跟面向对象代码一样,SQL 编写起来也相当耗时、调试难度不低、内容难以理解(不利于版本控制),而且高度强调可维护性。单从谷歌数据工程部门自身的情况来讲,SQL 完全可以用来创建数据管道,而数据管道又特别强调易调试、易修复。考虑到这些因素,代码集中度越高、数据战略的落地实践才能越顺畅。


所以把 SQL 看作代码,意味着我们可以把代码管理工具引入流程,轻松了解由谁负责特定变更或者维护 SQL 脚本、并持续跟踪同一作者在其他相关查询中的调整。如此一来,我们就能快速找到失败提交,恢复变更内容或者应用必要修复。在提交 SQL 代码之后,这部分代码可以被立即部署到开发环境当中。接下来就是运行开发管道,即时识别并修复故障。


另外,我们还会定期发布测试环境,通过升级保证代码能在生产版本上跑通。在测试成功之后,新旧两个生产版本之间提交的 SQL 代码才能正式启用,把出问题的几率控制在最低水平。


小公司该学习什么?


审视自己的软件工程文化,把谷歌这种更为成熟的文化理念设为标杆,体会并试用他们选择的工具,包括 Git、IDE 等。我们应该把所有代码都明确列入索引位置,花点时间将专用脚本转化成全局脚本,消除视图、物化视图、存储过程等一切不必要的元素。


谷歌是怎么管理 SQL 代码的?


谷歌把几乎所有代码都放在统一的集中代码存储库里。所以在需要对 SQL 做出变更时,或者需要创建新的脚本时,谷歌的工程师就建立一份相应的变更清单——在本质上类似于 PR。之后,变更流程需要接受测试并由其他工程师负责核准。核准顺利通过,作者才可以把代码变更提交至代码存储库。


虽然这种变更控制形式在企业中相当常见,但谷歌的一大特色在于高度强调代码格式的重要性。我本人以往对代码格式不太重视,但切身经历让我意识到高质量的代码格式确实能大大降低理解和调试难度、也有助于缩短其他作者在代码修改上耗费的时间。谷歌特别重视代码格式,甚至设立了一套自动化机制、直接拒收不符合编码标准的代码。


小公司该学习什么?


选择一套代码存储库,然后坚持以它为中心开展后续工作。在理想情况下,这套存储库应该在各工程团队间共享,至少也得保证把所有 SQL 代码集中进来。其中应该涵盖全部数据功能,包括数据工程、分析、商务智能等等。


另外,一定要推行代码格式标准化。目前市面上有不少开源代码格式标准化工具,它们使用难度不高,而且能极大提升代码的可读性与可维护性。花点时间,使用现有格式化工具或者内部的原研工具把原有代码梳理一遍,同时保证后续提交的一切代码都必须符合格式标准。几天、最多几个礼拜,数据工程师们就能适应这套新的标准,并让公司内的 SQL 代码在可读性、编写质量和可理解性方面都上一个台阶。


版本控制 + 多种测试环境 = 节约时间


代码变更无处不在,如果没有版本控制加以约束,我们将很难用回滚来补救意外错误。万一提交的代码破坏了管道、产生了预期之外的值或者跑不通,那我们就得利用版本控制恢复至上一个正常状态。


谷歌的代码集成原则也遵循这样的思路。哪怕变更内容再离谱(真的,有时候提交的代码就是这么离谱),拥有良好结构的测试环境也能从容消化,不致对正常业务造成干扰。如此一来,SQL 变更对于开发环境的影响就能直接体现,帮助工程师们快速发现故障。


当然,也有极少数代码在开发环境中不会立即造成故障,但在生产环境里却问题频发。造成这种状况的因素多种多样,所以我们需要在测试体系中引入单独的预生产环境。


谷歌使用环境变量来管理多种测试环境,这些变量可以通过解释层被轻松注入至表名当中。


小公司该学习什么?


至少要建立一套开发环境,同时尽可能扩大代码测试所涉及的数据基础设施范围,这样才能把出现故障的几率降至最低。DBT 等免费开源工具就通过抽象层显著降低了测试难度,其中所有表都有两个版本,一个是开发版、一个是生产版。这样在每日、每周乃至每月的发布计划中,我们就能安心把上次发布计划之后提交的所有代码都直接提升至生产环境。


广泛的代码访问能力


正所谓“成也萧何、败也萧何”,谷歌把几乎所有代码塞进单一代码存储库的作法,导致我们很难分清某一产品究竟归谁所有、又有哪些人在使用。例如,如果不能广泛访问这套集中代码库,软件工程师在更新生产级应用程序时就很难理解变更会引发哪些下游影响。而在获得广泛访问能力后,他们可以轻松搜索到对当前应用程序构成依赖的脚本、查询操作及其他应用程序,并通知相应工程师开展变更协同。


我知道,很多企业总想用代码保密的方式把不同开发环节隔离开来。没错,某些高度敏感的项目代码库确实不该随意开放,但这类项目不多、而且跟其他项目间的联系也不会太紧密。既然谷歌这样规模庞大的企业巨头,在建立代码架构时都愿意充分发挥信任的力量,那其他小公司真的没必要总是藏着掖着。


小公司该学习什么?


在代码库和存储库的结构设计中多多引入信任与沟通机制。至少从工程技术的角度看,你的项目绝没有想象中那么“见不得光”。毕竟如果你连团队中的工程师都不能信任,那这家企业还能正常运营吗?总之,请主动在业务流程中的软件工程与数据工程之间打通边界、鼓励协作。也只有这样,我们才能在代码在生产环境中落地之前,抢先一步解决由变更引发的负面下游影响。


原文链接:


https://blog.devgenius.io/why-google-treats-sql-like-code-and-you-should-too-53f97925037e


今日好文推荐


独家专访阿里云存储负责人吴结生:我经历的三个重大决策


大学辍学的我,如何在质疑中成为微软专业找 bug 的赏金猎人


Android 13来了,它真的平庸又鸡肋吗?


以架构视角解读和落实银行数字化转型的两份重磅指导文件


2022-02-18 18:3410371

评论 1 条评论

发布
用户头像
Google 的代码管理是使用的 Git 没错,但是代码的审查使用的是 Gerrit。
2022-02-21 09:22
回复
没有更多了
发现更多内容

拆分电商系统为微服务

tjudream

微服务 电商 拆分

Pulsar 周报 2021-08-09 ~ 2021-08-15

Apache Pulsar

Apache Pulsar StreamNative

eKuiper 联手 OpenYurt,解决物联网场景下边缘流数据处理难题

EMQ映云科技

云计算 阿里云 物联网 IoT #Kubernetes#

深入虚拟机探索Thread start

4ye

源码 线程 后端 JVM 8月日更

故事篇:数据库架构演变之路

阿Q说代码

主从复制 读写分离 集群部署 8月日更 垂直拆分

Go- map的使用

HelloBug

Go 语言 map的使用

Spark必读!总有一些Spark知识点你需要知道

Qunar技术沙龙

spark hdfs mapreduce Web UI 数据倾斜

0基础架构入门 - 1(架构概述)

felix

架构实战营 0基础架构入门

模块一

Tim

架构实战营

深层剖析鸿蒙轻内核M核的动态内存如何支持多段非连续性内存

华为云开发者联盟

鸿蒙 内存 结构体 OpenHarmony 动态内容

阿里P8大牛终于整理完了564页大话java性能优化神仙文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

模块一作业

Geek_85eb5f

带你读AI论文丨LaneNet基于实体分割的端到端车道线检测

华为云开发者联盟

端到端 网络模型 车道线 实体分割 LanNet

疫情小区离你有多远,百度地图告诉你

百度开发者中心

最佳实践 百度地图

作业

Doctor Blind

架构实战营

Vue进阶(七十二):css 样式中 逗号、空格、冒号、点号、~、>的区别

No Silver Bullet

Vue 8月日更

惊!阿里大佬珍之若宝的最强高并发pdf,竟然被上传GitHub开源

Java 编程 架构 面试 程序人生

阿里内部推出Spring响应式微服务Boot2Cloud文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

膜拜!阿里内部都在强力进阶学习springboot实战派文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

linux笔记:极简方式安装mysql,建议收藏

小鲍侃java

8月日更

TP6+layui2.6.8开发的管理系统(FunAdmin),内置Curd命令模式 在线更新

funadmin

CMS layui 商城 管理系统 funadmin

面试侃集合之SynchronousQueue非公平模式篇

码农参上

非公平锁 SynchronousQueue 8月日更

Go- map的定义

HelloBug

Go 语言 map的定义

金九银十给我疯狂内卷!GitHub再现星标86K面试手册,37K!妥妥的

Java~~~

Java 架构 面试 算法 JVM

新生代农民工的十八般武艺,你都了解吗

华为云开发者联盟

DevOps 云原生 编程语言 编程规范 新生代农民工

【墨天轮专访第二期】巨杉数据库萧少聪:重视企业长期需求,打造中国的世界级产品

墨天轮

数据库 人物访谈 国产数据库 巨杉数据库

微信朋友圈高性能复杂度分析

刘琦Logan

一文为你介绍ServiceComb Service-Center三大高性能优化点

华为云开发者联盟

开源 微服务 注册中心 Service-Center

常见内存泄漏引起原因

金陵老街

apipost使用脚本发送一个接口请求

与风逐梦

后端 开发工具 接口测试

云小课|想实现资源全自动备份?看完这篇秘籍,不再蕉绿~

华为云开发者联盟

云备份 自动备份 备份策略

来自谷歌的开发心得:所有SQL和代码,都没必要藏着掖着_语言 & 开发_Galen B_InfoQ精选文章