聊到集成测试、单元测试等测试分类,我想大多数人都有类似困惑或讨论,集成测试和 E2E 测试到底有啥区别。甚至还有一些系统测试、配置项测试等概念,不但让我们这种非 QA 专业的人弄不清楚,在和我们的 QA 同学讨论时也很难得到清晰地结论。
家里有一台古董级别的笔记本,掌托和键盘几乎已经被磨花了,一天突然想检查下有没有特别的资料然后好处理掉它。一份测试相关的国标文档(GB/T 15532-2008)吸引了我的注意,这份文档来自于刚毕业时在四川省软件测试中心实习期间,而我几乎已经忘记了那段经历。
翻看这份文档让我打开了一个新世界的大门,我们在讨论研究的很多问题包括测试分类的定义,已经被业界讨论过很多次,甚至被制定成清晰的文档和规范。
不仅是 GB/T 制定了相关标准和大量方法,IEEE 和 IOS 也定义了大量标准供业界参考。在软件工程中,了解相关标准给我们带来非常多的好处,能帮助我们更好地做技术选型、企业应用集成、持续演进以及借力技术生态。
在计算机科学领域,技术标准最成熟,也是和学术界最接近的是密码学。在软件行业中,最有意思的是很多人对造轮子非常感兴趣(包括我),不过有一些轮子我不建议自己造。这就是加密算法,不止一个人在聊天中谈起对信息安全的看法时说,要是我开发一个自己的加密算法只有我自己的知道(甚至很多真的这么干了),肯定是天底下最安全的。这是一种非常朴素的信息安全认识,自己的创造的“加密算法”也只是根据特定规则对信息的混淆和变换,这甚至落后于凯撒密码。
现代密码学已经有大量的对称加密、非对称加密、HASH公开算法,甚至建立了一套完整的通信信息安全基础设施(PKI),保证信息安全的是密匙而不是加密算法。与其闭门造车,不如选择 RSA 等大师们的成果。
上面的例子是想说标准的技术大多经过学术界、工业界的验证,相比自己捣腾一个,相对来说更为靠谱。
选择标准技术另外一个好处是保持开放,能构建出一个技术生态。
稍具规模的公司或者组织都有一个中心化的账户管理体系,在软件公司我们有一大套内部系统和软件需要和账户系统进行对接,账户系统还被要求以很细致的粒度对权限进行管理。比如办公室的 WIFI、JIRA、邮件、wiki 等平台需要对接账户系统,一些采购的软件可能并不需要我们进行修改就能实现接入,这其中需要一个约定。
其中一个规范叫做 LDAP,JIRA、邮件、开源WIKI平台支持 LDAP 服务器的接入,甚至国内的软件产品例如禅道也支持 LDAP 接入。
LDAP 只是众多开放标准的一部分,互联网天生具有开放性,因此网络通信和互联网涉及的协议多如牛毛。例如我们的以太网协议 IEEE 802.x、HTTP 协议 RFC 723X 。仅仅网络协议就有数千条,甚至有一点不忍心放上下面这张图。
采用标准技术还有其他优势,具体的实现很容易被替换。例如实现 HTTP 协议的客户端很容易的被替换,前几天在和一个同事聊到他们在项目上把 Apache 的 HTTP client 替换成了 OK HTTP;如果在项目中使用了符合 JCP 定义的 Java bean validator 也可以容易的在某些场景下被替换。
不过值得注意的是业界事实标准有时候可能和一些标准化组织制定的标准并不一致,OSI 7 层协议被称为经典的网络协议,但是目前广泛形成的协议族是 TCP/IP 协议族。
在使用开源项目做技术选型时,如果对技术标准有一些了解,可以帮我们更容易的了解一些技术的生态和工具链。比如上面的 LDAP,我们可以在采购软件时优先考虑支持 LDAP 的产品,从而降低自行接入的成本;对于自己项目上更为具体的实现如设计 API,我们可以选择一套参考标准入如 jsonapi,让沟通成本大大降低;在前后端协作上,如果采用 Swagger 的 openapi 可以容易的找到一套开源工具帮我们完成文档、SDK生成等工作。
下面让我们一起了解一些互联网常见的技术标准和组织。
IETF 应该是互联网标准组织中名气最大的,它的全称是国际互联网工程任务组(The Internet Engineering Task Force)。IETF下属有很多工作组(WG),专门负责一个领域标准的制定,例如 OAuth。IETF 工作的产出主要是 RFC 文档(Request For Comments)。IETF 最知名的规范是 TCP/IP 协议族,但是我们日常相关更多关注应用层标准,就不介绍通信相关的协议了,下面是一些常见应用层的标准。
JCP(Java Community Process) 是一个开放的国际组织,主要由 Java 开发者以及被授权者组成。Java 之所以能发展成目前这个规模,离不开标准化进程,JCP 中的一些规范不仅影响了 Java 世界,对其他语言,例如 PHP、Nodejs 也造成了巨大的影响。在日常服务器开发工作中,用到 JCP 标准非常多,例如数据验证、数据库访问和服务器容器:
W3C 中文名称是万维网联盟,是Web技术领域最具权威和影响力的国际中立性技术标准机构,主要负责制定浏览器上一些技术细节,降低浏览器上 HTML、CSS 渲染之间的差异,以及 DOM、XML 和 SVG 等技术。但是需要注意 JavaScript 不是 W3C 的范围,但需要负责浏览器中 JavaScript API 也就是 DOM 规范的制定:
W3C 的标准更多的是指导浏览器开发,对于前端开发来说,技术选型取决于浏览器支持情况。
ECMA 中文名称是欧洲计算机制造联合会,主要负责计算机制造和编程相关的标准制定。ECMA 制定了许多编程语言的规范,例如 C#、C++ 等,有趣的是 Sun 公司曾经提交了 Java 相关标准给 ECMA 但是随后又撤销了。ECMA 下面有几个我们可能特别关注的规范:ECMAScript、JSON 和办公文档规范。
一些组织或者厂商想推广一些通用的技术方案,但是并没有注册到标准组织。其中有很多技术方案对日常工作很有价值,这里也罗列出来:
为技术标准化做出贡献的组织还很多,特别是在软件行业之外,建筑、医疗、金融等行业也产出了大量的标准文档。在知识的层层传递中有很多信息丢失了,标准文档给我们提供了第一手、清晰的信息和方案。
遗憾的是我们在做的一些创新型的工作目前还没有被标准化,CI/CD、敏捷实践、微服务等。在 ThoughtWorks 办公室每个人都耳熟能详的技术或者术语还没有出现在标准文档中,也可能是我还没了解到,不过各大组织的规范文档不失为一座金矿,值得持续探索。
另外,中国是第一制造业大国,也是发达的互联网国家。除了国家标准之外,参与国际标准制定还比较有限。互联网协议几乎是构建在 IEEE 贡献的协议族之上,难以看到中国的影子,不过在 5G 时代有所发展。这两年国内的开源项目发展迅速,也有一些大厂在向国际标准组织做出贡献,很期待 ThoughtWorks 也能参与其中。