“分布式” 开发规范治理 - Phodal | Phodal - A Growth Engineer

标签: | 发表时间:2022-03-08 13:50 | 作者:
出处:https://www.phodal.com
Posted by: Phodal HuangMarch 7, 2022, 8:10 p.m.

PS:本文只是先开个头,思考如何应对这种挑战。

如果只是从系统来考虑,标题里虽然说的是 “分布式” 规范治理,但是更多的时候是指多仓库的规范治理。而多仓库本身也充斥着一些不合理性,诸如于一个代码仓库内,可能包含着多个模块,如 monorepo。从这个角度来看,只是讨论分布式系统,可能有一些单薄。但是呢,我们在写规范,针对的是系统吗?难道不是团队中的开发人员?所以,我们所想的治理的是分布式协作的规范性问题。

回顾开发规范及其工具化

对于软件研发来说,效能的提升是一个非常宏大的史诗级话题,在这个话题里,规范的建立是一个非常有效的方案 —— 当且仅当,我们建立了配套的相关执行机制和工具。在确保了拥有统一规范的情况下,A 团队的开发人员,可以快速地到 B 团队开发,而不需要一些额外的讨论。简单来说,规范就是一种用于规模化提升效能的 模式

多年前,对于软件开发的规范,我们主要依赖于口头约定 + code review,这依赖于团队拥有比较好的技术能力。应对于规模化时,这样的模式是无法实施的。特别是 开发团队质量不齐的情况下,依附于个人的自觉,已经难于控制团队的质量。特别是,我们会因为越来越多的 quick fix,导致一次又一次性破坏系统的规范。

人们开发了一系列的 Lint、Checkstyle、守护工具,以确保我们设计的规范能被实施下去。诸如于:

  • 针对于前端,我们有 ESLint、Prettier
  • 针对于后端,我们也有一系列的工具,如:PMD/CheckStyle。还有国内流行的阿里、华为 Java 规范。
  • 针对于 Java 架构,我们有:ArchUnit
  • 针对于 API,我们有:API Linter、Spectral
  • 针对于数据库,我们有:SQLFluff

于是,在单体系统里,上述的一系列情况得到了有效的改善,但是我们来到了微服务时代、微前端时代等,整体又发现了一系列的变化。为了应对于这种变化,我们还需要一些额外的工具,以确保这些规范化的工具能被安装和使用。

在那之前,让我们先总结一下规范工具化的时机,以明确我们应该在哪个时机来应对分布式下的挑战。

规范工具化的时机

从模式上来说,我们通常会在如下的一些时机里,来检查软件是否符合规范。(按顺序排序)

  • 创建态。即将规范内嵌到每个应用的创建模板中。典型的形式是应用脚手架 等。
  • 开发态。即结合开发过程中的工具(如 IDE、Git、CLI),将规范内置到开发流程中。典型的有 Git Hooks、IDE 插件等。
  • 测试态。即结合自动化测试、契约测试等,在运行测试的时机,检查已有的系统是否遵循相关的规范。
  • 集成态。即对于规范的检查配置在持续集成中,有时会作为一种强制的软件质量门禁。典型的有 SonarQube 等。
  • 运行态。即结合软件运行的信息(如 APM、日志、分布式链路系统等),对系统进行系统进行分析。典型的有 NewRelic、Skywalking 等。

从执行顺序来时机来说,越往前便意料着越能及早的发现错误,成本也越低。当然了,每种不同的时期,都应该有各自的重点。

时机 关注点 工具示例
创建态 代码规范内建、规范执行机制、分层规范等 应用脚手架
开发态 代码规范 CheckStyle 的 Intellij IDEA插件
测试态 代码规范、分层架构、API 规范等 ArchUnit
集成态 质量门禁 Sonarqube
运行态 服务依赖 Skywalking

当然了,还有一些是跨越了多个不同的时机,诸如于契约测试,它是在开发时期定义的,但是可能会在测试态、集成态才验证的。然而,在过程中,很大一部分的内容都是在代码中,由开发人员控制的。作为一个开发者,也是一个 hacker,我们会习惯性的:

  1. 跳过不需要的自动化检查。
  2. 路过不需要的测试。它可能跑起来很慢
  3. 删除或者禁用一些不需要的规范代码或者配置。

这样一来,哪怕我们做了再好的规范设计,代码不,没有 code review 的保障,那么系统就会被进一步地腐化。

分布式场景下的规范

现在,让我们回到先前我们定义的分布式场景,思考一下如何在这种场景下,构建规范工具化?

分布式的规范工具化

对于这些规范来说,它们的工具化思路类似于,我们在《 代码分析与自动化重构》所说的:源码分析 → 构建模型 → 识别模式 → 得到结果。为了支撑到分布式场景,一些潜在的方案便是:

  • 工具化代码块。使用额外的代码模块(如 Git Submodule、软件包等)来执行规范的自动化,诸如于 npm 包、jar 包的形式。
  • 工具检查器。检查是否安装了对应的工具,是否执行了对应的步骤。(并不推荐)
  • 构建新的工具。如 Guarding 这种模式。
  • 设计成熟度指标。用于指导和改善系统的架构设计。

去年,在设计 Guarding 这个多语言的架构守护工具时,其与 ArchUnit 相比的场景是:多语言、多代码库。与 ArchUnit 相比,Guarding 推荐的这种守护方式是:

  • 以 CLI 的方式运行。无需额外的编码工作,不担心系统被破坏。
  • 配置在持续集成中。
  • 多系统多语言守护。

当然了,它更多的是在测试态、开发态来解决问题。理想情况下,应该包含 IDE 插件,在开发时能提醒开发人员,系统架构有哪些问题。

指标模型:架构适应度函数

虽然,我们可以构建一个基于“分布式”场景的规范,但是从某种意义上来说,这些规范是一种约束。对于开发人员来说,我们需要一种更好的指导指标,而不是我们破坏了哪些规则。所以,我们应该考虑架构适应度函数的方式,从多个不同的维度,来帮助开发人员:

  1. 理解系统的当前状态
  2. 理解指标对于系统的意义
  3. 指导系统更好的演进
  4. 知悉什么是好的模式和设计

也因此,从这个层面来考虑,单体系统里的 Sonarqube 就是一个非常好的工具。

其它

最后,回到我们所推崇的敏捷实践, 个体和互动高于 流程和工具。让架构和系统知识能在团队中流动起来,远远比工具更加重要。

相关 [分布 开发 规范] 推荐:

“分布式” 开发规范治理 - Phodal | Phodal - A Growth Engineer

- -
PS:本文只是先开个头,思考如何应对这种挑战. 如果只是从系统来考虑,标题里虽然说的是 “分布式” 规范治理,但是更多的时候是指多仓库的规范治理. 而多仓库本身也充斥着一些不合理性,诸如于一个代码仓库内,可能包含着多个模块,如 monorepo. 从这个角度来看,只是讨论分布式系统,可能有一些单薄.

java代码开发规范

- - BlogJava_首页
格式规范:                                                                      .       1、TAB空格的数量. 编辑器上的TAB空格数量统一取值为4.       2、换行, 每行120字符.       3、if语句的嵌套层数3层以内   .

JavaScript开发规范要求

- - 博客 - 伯乐在线
来源: webflash 的博客. 作为一名开发人员(WEB前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安全以及执行效率上的问题. 本人在开发工作中就曾与不按规范来开发的同事合作过,与他合作就不能用“愉快”来形容了. 现在本人撰写此文的目的除了与大家分享一点点经验外,更多的是希望对未来的合作伙伴能够起到一定的借鉴作用.

MySQL数据库规范 (设计规范+开发规范+操作规范) - 东山絮柳仔 - 博客园

- -
      为了在软件生命周期内规范数据库相关的需求分析、设计、开发、测试、运维工作,便于不同团队之间的沟通协调,以及在相关规范上达成共识,提升相关环节的工作效率和系统的可维护性. 同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的保证.        本文档适用于开发、测试、QA及运维团队成员.

(转)豆瓣css开发规范

- Hu DongHai - 小豪~麦穗的部落格
今天无意间看到了豆瓣的一些前端开发规范,攻城师作战指南. 里面的Javascript代码风格规范 差不多就是基本的javascript规范,主要还是分享一下 css部分的规范. 因为规范是在google docs上,需要穿过篱笆,所以我就直接帖过来了,一起学习一下哈. ——————————————–华丽的分割线————————————————.

Drupal/PHP/XHTML开发规范1.2

- 建江 - willietse's blog
*文中涉及XHTML/CSS部分,背景为黄底. 常言道,“没有规矩,不成方圆”. 良好的编程风格与规范对开发者以及项目管理人员都是非常重要的. 当一个软件项目尝试着遵守公共一致的标准时,可以使参与项目的开发人员更容易了解项目中的代码、弄清程序的状况. 使新的参与者可以很快的适应环境,防止部分参与者出于节省时间的需要,自创一套风格并养成终生的习惯,导致其它人在阅读时浪费过多的时间和精力.

js/jQuery插件开发及规范

- - JavaScript - Web前端 - ITeye博客
当我们画出了UI之后就可以正式编写jQuery插件代码了,不过在着之前我们还需要对jQuery插件开发的一些规范性有一些了解.  这是来自jQuery官方的插件开发规范要求,使用这种编写方式有什么好处呢. c) 兼容jQuery操作符'$'和'jQuery'. 我们知道这段代码在被解析时会形同如下代码:.

移动开发规范概述

- - Jing
iOS 4.0+ 使用英文字体 Helvetica Neue,之前的iOS版本降级使用 Helvetica. 中文字体设置为华文黑体STHeiTi. 需补充说明,华文黑体并不存在iOS的字体库中( http://support.apple.com/kb/HT5484?viewlocale=en_US), 但系统会自动将华文黑体STHeiTi兼容命中系统默认中文字体黑体-简或黑体-繁.

互联网 MySQL 开发规范

- - leejun_2005的个人页面
对于刚加入互联网的朋友们,肯定会接触到MySQL,MySQL作为互联网最流行的关系型数据库产品,它有它擅长的地方,也有它不足的短板,针对它的特性,结合互联网大多应用的特点,笔者根据自己多年互联网公司的MySQL DBA经验,现总结出互联网MySQL的一些开发规范,仅供参考. 作者是微信订阅号yunweibang特约技术专家刘秋岐,多年数据库经验,如有问题可以订阅yunweibang并留言.

阿里官方Redis开发规范

- - 互联网 - ITeye博客
本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 通过本文的介绍可以减少使用Redis过程带来的问题. 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id. 保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:. user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}.