业务开发过程中的思考和实践系列一:自描述软件 DSL

我们知道 80% 的工程师在 80% 的时间都在维护或迭代遗留项目。而绝大部分遗留项目的业务、产品和技术文档都是匮乏的。我遇到的第一个问题就是在文档匮乏的情况下从”Shit Mountain“代码中理清业务逻辑。

在客户端同学协助下,我大概定位到新需求涉及的几个 API 接口,然后顺藤摸瓜从 API 接口声明到业务服务实现捋了一遍,勉强熟悉了这部分业务逻辑,然后如履薄冰地写代码,期间和产品经理多轮沟通,再和客户端同学联调,最后通过测试同学测试,总算顺利完成需求交付。

但经过这一轮折腾后,我想:有没有更好的方式让新接手的工程师可以更快熟悉并上手项目。最直观的想法是看文档,但众所周知文档有以下问题:

  • 很少有项目会维护文档,或者维护完整的文档(绝大部分情况)
  • 随着时间推移,项目文档很可能会过期,很少项目会持续迭代更新文档
  • 项目的业务文档、产品文档和技术文档可能出现不一致甚至自相矛盾的情况(非结构化的文档很容易有这类问题)
  • 项目文档如果没有很好地分门别类,检索、阅读费时费力

文档这条路不通,我想到 DDD(领域驱动设计)通过定义领域、子域、聚合根、实体、值对象、领域事件等概念为业务逻辑提供了一套清晰通用的描述语言。那是否可以借鉴 DDD 的思想,为整个软件制定一套描述性强的 DSL,最终为软件生成一份自描述的规格说明?答案是肯定的。调研发现有一个名叫 SysML 的 MBSE 建模语言,详细可以参考这篇文章 SysML 建模在系统开发生命周期的应用。SysML 包括九种图(包图、需求图、活动图、序列图、状态机图等),它是软件统一建模语言 UML 的一种扩展,用于表示系统开发中的所有活动。SysML 建模语言固然很好,但太重(早期 SOA 的理念也很好,但协议规范过于冗长、复杂最终鲜为人知)不便于在实际项目中照搬。至此,思路就很清晰了,设计一套 ** 简化版的 SysML DSL**,这套 DSL 的特点如下:

  • 以自然语言编写,可读性强
  • 只描述软件的关键功能、功能对应的用例、功能对应的页面、页面用到的接口、页面交互和接口流转。业务领域模型、内部系统 / 模块关系、数据模型、状态机等属于各端自己需要关注的,不需要在这套 DSL 中描述
  • DSL 天然结构化,便于和开发框架集成

基于以上特点,在 ChatGPT 的帮助下,我编写了宠物商店 Petstore 的 DSL Demo,如下:

# 整体功能描述
系统 Petstore {描述 "Petstore是一个在线宠物商店系统,提供宠物管理和订单管理功能。用户可以查看所有宠物,添加新宠物,更新宠物信息。同时,用户可以查看订单历史,创建新订单,以及更新订单状态。"功能 宠物管理 {用例 查看所有宠物用例 添加新宠物用例 更新宠物信息}功能 订单管理 {用例 查看订单历史用例 创建新订单用例 更新订单状态}# 页面和接口描述页面 宠物列表 {使用用例 查看所有宠物使用接口 /api/pets 获取宠物列表}页面 新增宠物 {使用用例 添加新宠物使用接口 /api/pets/add 添加宠物}页面 订单历史 {使用用例 查看订单历史使用接口 /api/orders 获取订单历史}页面 创建订单 {使用用例 创建新订单使用接口 /api/orders/create 创建订单}# 页面交互和接口流转交互流转 {页面宠物列表 到 页面新增宠物 通过事件 选择宠物 -> 跳转 {接口流转 接口 /api/pets 获取宠物列表 到 接口 /api/pets/add 添加宠物 通过事件 完成添加 -> 更新宠物列表}页面新增宠物 到 页面宠物列表 通过事件 完成添加 -> 刷新列表 {接口流转 接口 /api/pets 获取宠物列表 -> 刷新列表}页面订单历史 到 页面创建订单 通过事件 创建新订单 -> 跳转 {接口流转 接口 /api/orders 获取订单历史 到 接口 /api/orders/create 创建订单 通过事件 完成创建 -> 更新订单历史}页面创建订单 到 页面订单历史 通过事件 完成创建 -> 刷新历史 {接口流转 接口 /api/orders 获取订单历史 -> 刷新历史}}
}

建议:

  • 上面 DSL Demo 中的描述和功能和用例需要测试或开发同学手动维护,而页面和接口描述、页面交互和接口流转可以借助 SDK 自动生成
  • 最好为这个 DSL 提供一个简单的管理后台,提供可视化及增删改等维护功能
  • 公司如果有自研开发框架,可以基于这个 DSL 生成脚手架代码

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+MybatisPlus+dynamic-datasources实现连接Postgresql和mysql多数据源

场景 dynamic-datasource-spring-boot-starter实现动态数据源Mysql和Sqlserver: dynamic-datasource-spring-boot-starter实现动态数据源Mysql和Sqlserver_dynamic-datasource-spring-boot-starter mysql sqlse-CSDN博客 SpringBoot中整合MybatisPlus快速实现Mys…

利用docker的LNMP

目录 服务器环境 任务需求 服务搭建 Nginx Mysql Php 启动 wordpress 服务 服务器环境 容器 操作系统 IP地址 主要软件 nginx CentOS 7 172.20.0.10 Docker-Nginx mysql CentOS 7 172.20.0.20 Docker-Mysql php CentOS 7 172.2…

Docker ubuntu apt-get更换国内源解决Dockerfile构建速度过慢

1. 问题 dockerfile中 使用ubuntu 镜像 执行 RUN apt-get -q update && apt-get -q install -y 更新巨慢 2. 解决 使用国内的镜像源即可解决问题,注意如果使用的 包比较冷门 或者国内镜像网站没同步过来 可能就下载不到镜像 在dockerfile中 执行安装包命…

YoloV8改进策略:Agent Attention|Softmax与线性注意力的融合研究|有效涨点|代码注释与改进|全网首发(唯一)

摘要 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.991,mAP50-95由0.737涨到0.753,涨点明显! 本文提出了一种新型的注意力机制——Agent Attention,旨在平衡计算效率和表示能力。该机制在传统的注意力模块中引入了额外的agent tokens A,这些agent tokens首先为q…

详解ISIS动态路由协议

华子目录 前言应用场景历史起源ISIS路由计算过程ISIS的地址结构ISIS路由器分类ISIS邻居关系的建立P2PMA ISIS中的DIS与OSPF中DR的对比链路状态信息的交互ISIS的最短路径优先算法(SPF)ISIS区域划分ISIS区域间路由访问原理ISIS与OSPF的不同ISIS与OSPF的术语…

[HarmonyOS]第一课:从简单的页面开始

判断题 1. 在Column容器中的子组件默认是按照从上到下的垂直方向布局的,其主轴的方向是垂直方向,在Row容器中的组件默认是按照从左到右的水平方向布局的,其主轴的方向是水平方向。 答:正确(True) 2. List容器可以沿水平方向排列…

iOS和安卓端个人踩坑史

本公司不提供测试机,借手机是开发测试中最麻烦的事 iOS可行组 1、iOS可以播放视频无声音,Andorid有声音 当时做了个远程视频连接项目,使用了jitsi第三方视频服务,iOS没有加dom.play()导致无法接收声音 2、iOS可以长按保存图片…

Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现

什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的微…

如何安装下载激活MathType?2024最新免费MathType许可证

第一步:请先从这里下载安装MathType: 第二步:下载完成后,双击下载的MathType Desktop安装程序文件。 在Mac上,这将在单独的窗口中打开它,因此在该窗口中双击“ MathType Desktop Installer…”以运行安装…

TQ7.2WS acid,Tide Quencher 7.2WS 酸,能够降低荧光信号的强度

您好,欢迎来到新研之家 文章关键词:Tide Quencher 7.2WS acid,TQ7.2WS acid,Tide Quencher 7.2WS 酸 ,TQ7.2WS 酸 一、基本信息 产品简介:The fluorescence quenching agent Tide Quencher 7.2WS acid h…

win10 系统维护

电脑崩溃之后,我发现维护系统还是很重要的一件事情。比如软件尽可能装D盘,C盘(系统盘)尽可能不要存储数据等等。接着,就是如何让系统更易用,因此我在这里分享我的使用方式,以后就可以随便重装系…

微信小程序防止截屏录屏

一、使用css添加水印 使用微信小程序原生的view和css给屏幕添加水印这样可以防止用户将小程序内的隐私数据进行截图或者录屏分享导致信息泄露,给小程序添加一个水印浮层。这样即使被截图或者拍照,也能轻松地确定泄露的源头。效果图如下: 代码…

LeetCode刷题---基本计算器

解题思路: 根据题意,字符串中包含的运算符只有和- 使用辅助栈的方法来解决该问题 定义结果集res和符号位sign(用于判断对下一数的加减操作),接着对字符串进行遍历。 如果当前字符为数字字符,判断当前字符的下一个字符是否也是数字字符&#x…

计算机网络-NAT网络地址转换

今天来回顾下之前所学的知识,将它们串联起来进行巩固。一开始了解了IP编址进行IP设置和划分网段;学习了二层以太网交换,了解了二层通信基础;学习了路由基础知识,大致了解到了路由是什么?静态路由和动态路由…

【MIdjourney】几种独特的艺术风格

1.合成器波(Synthwave) Synthwave是一种音乐风格,起源于20世纪80年代电子音乐和电影的复古元素。这种音乐风格通常包括合成器音乐、电子鼓声和强烈的电子声效,以模拟80年代电影和视频游戏的声音。Synthwave的特点包括浓厚的合成器声音、强烈的节奏和对复…

工商业屋顶光伏项目如何操作?

鹧鸪云 随着可再生能源的日益重要,工商业屋顶光伏项目已成为许多企业实现绿色能源转型的重要途径。本文将详细介绍工商业屋顶光伏项目的操作流程,帮助企业更好地实施这一项目。 一、项目前期准备 需求分析:明确企业的能源需求,评…

JNI笔记

JNI笔记 背景Demo代码JNI.javaMainActivity.javaAndroid.mkApplication.mkcom_stone_javacallc_JNI.hjavacallc.cbuild.gradle 背景 Demo代码 代码结构 JNI.java package com.stone.javacallc;/*** Created by stoneWang* Created on 2024/1/16* java调用C*/ public class …

mysql从库重新搭建的流程

背景 生产环境上的主从集群,因为一些异常原因,导致主从同步失败。现记录下通过重做mysql从库的方式来解决,重做过程不影响主库。 步骤 1、在主库上的操作步骤 备份主库所有数据,并将dump.sql文件拷贝到从库/tmp目录 mysqldump …

【车载HMI开发工具--EB GUIDE介绍】

EB GUIDE 是作为当今的汽车内一些最佳行业用户界面的技术。利用 EB GUIDE,您可以创建最佳的信息娱乐系统和仪表板的人机交互界面。EB GUIDE 不仅仅是一个工具,它还能支持汽车软件开发过程,从而创造出世界一流的汽车 HMI。 优点 在开发过程中…

C# 图解教程 第5版 —— 第23章 异常

文章目录 23.1 什么是异常23.2 try 语句23.3 异常类23.4 catch 子句23.5 异常过滤器23.6 catch 子句段23.7 finally 块23.8 为异常寻找处理程序23.9 进一步搜索23.9.1 一般法则23.9.2 搜索调用栈的示例(*) 23.10 抛出异常23.11 不带异常对象的抛出23.12 …