如何了解一个软件的设计?

news2024/10/6 6:40:17

刚入职,接手新项目,面对一个全新项目,怎么快速研究它?

很多人直接看源码,一头扎入代码,很快就迷失其中,最初那股子探索精神,也会逐渐被迷茫所替。有多少次你满怀激情打开一个开源项目,结果多半坚持不了就放弃。问题出在哪?迷茫是因为缺少对软件整体了解,如同不带地图指南针就闯入热带雨林,迷路只是早晚。阅读源码是必经一步,却不是第一步。应先从了解软件设计开始。

1 模型、接口和实现

好比你看代码:

  • 模型
    先看有哪些类及之间关系
  • 接口
    然后打开一个具体类,看提供哪些方法
  • 实现
    最后,再打开一个具体方法,看怎么写的

1.1 模型

一个软件的核心部分,也称之为抽象。设计最关键的就是构建出模型。而理解一个设计中的模型,可助我们建立对这个软件整体的认知。

如:

  • 编写分布式计算代码,需考虑怎样在不同节点上调度计算
  • 使用MapReduce,只要考虑如何把计算分开(Map),最后汇总(Reduce)
  • 到了Spark,注意力就集中在要做怎样的计算

它们在解决同样问题,只是抽象层次逐步提高,越来越接近要解决的问题,越来越少考虑计算在不同的机器如何执行,大大降低理解门槛。知道模型的重要性,目光甚至可不局限在某一软件。若把同一个领域不同阶段的多个模型联系起来,还能看到软件发展趋势。

1.2 接口

决定软件通过怎样方式,暴露模型提供的能力。
是我们与这个软件交互的入口。

  • 一个程序库的接口就是它的API,但对同样模型,每个人会设计出不同API,而不同API有不同表达能力。比如:Guava对JDK的一些API重新封装,就为简化开发,而很多优秀的做法后来又被JDK学了回去
  • 一个工具软件一般会提供命令行接口,比如Unix命令行工具就是典型的命令行接口
  • 一个业务系统的接口,就是对外暴露的各种接口,比如,它提供的各种REST API,也可能是提供了RPC给其它系统的调用。
    ……

想深入源码,了解一个软件,可从一个接口进入到软件,看它怎样完成各种基本功能。

1.3 实现

软件提供的模型和接口在内部如何实现,这是软件能力得以发挥的根基。

  • 一个业务系统收到一个请求之后,是把信息写到DB,还是转发给其它系统
  • 一个算法实现,是选择调用已有程序库,还是自己实现
  • 一个系统中的功能,哪些应该做成分布式,哪些应该由一个中央节点统一处理
  • 一段业务处理,是应该做成单线程,还是多线程
  • 当资源有竞争,是每个节点自己处理,还是交由一个中间件统一处理
  • 不同系统之间的连接,该采用哪种协议,是自己实现,还是找个中间件
    ……

所以,做每一个技术决策都应该结合自己所开发应用的特点,并不存在一个通用的解决方案。实际工作中,许多人以为的设计其实是这里的实现。“实现”很重要,须建立在模型和接口的基础上。一个系统的设计,模型最核心。若模型变了,这个软件便不再是这个软件,而接口通常反映的就是模型。所以,模型和接口的稳定度都要比实现高,实现则随软件发展而不断调整。

  • 模型:需求
  • 接口:可以提供哪些功能
  • 实现:实现模型和接口的办法,语言,框架等技术

在使用类似springboot+mybatis开发的时候,mybatis-generator生产的mapper,service,service imp,在配合controller,就可以对数据库的数据进行增删改查,然后就可以实现一些CMS啊电商之类的业务需求,似乎都不需要自己定义新的接口和抽象,请问这是因为业务过于简单的原因吗?
不,这是因为你把业务逻辑混在增删改查里。

2 案例

2.1 Redis

随使用Redis增多,对Redis有进一步的需求。所以,从6.0开始,它开始支持多线程版本,以便于更好地满足需求。但即便Redis改成多线程,它还是那个Redis,它的模型和接口还是稳定不变,只是实现变了。

2.2 CRM

模型,通常包含两类要素:

  • 基本元素
    CRM的基本元素就包括项目、客户、合同和回款
  • 这些元素之间的关系
    相互之间的主要关系通常是客户报备,进入立项环节(评估投入产出),再签约,最后进入回款

这是基本模型。这个模型(系统)的接口,就是要为BD提供从客户报备到签约、回款的整个流程管理。

实现就是要考虑如何用消息在这些模块之间传递数据,状态控制、数据查重锁定等。

3 设计三步走

严格区分模型、接口和实现,是因为这三者关注点不同,而很多人讨论所谓“设计”,经常把它们混为一谈。

你们团队开会是不是经常有种很混乱感觉?问题就在于你们把不同层面内容混在一起,一起吃做大锅饭,最后那是人吃的吗?

正确做法是在讨论设计时,遵循顺序:先模型,再接口,最后实现。了解一个设计亦如此。

模型没弄清楚,就讨论细节,难分清哪些东西核心,须保留,哪些东西可替换。
若清楚模型,就知道哪些内容在系统中广泛适用,哪些内容须隔离。即分清模型会帮助你限制实现的使用范围。

如下是一个简化后架构图,订单服务完成处理后,通过MQ把消息发给支付服务,支付处理后,再通过MQ把消息发给物流:

这张图问题在哪?把模型和实现混淆。图中的订单、支付和物流,说的都是模型层,但RabbitMQ就把实现层拉进来。RabbitMQ只是实现这个功能时的一个技术选型,即若随业务发展,它不能很好扮演角色,就可替换掉,而整个设计不变。
所以,实现这段代码时,须封装MQ相关代码,不能在系统各处随意调用,因为它属于实现,可能随时被替换。

了解设计时,要按层次去了解,因为设计是分层的。每打开一个层次,需要了解它的内部时,还要按模型、接口和实现顺序研究。
如RocketMQ设计模型https://github.com/apache/rocketmq/blob/master/docs/cn/concept.md。

如os,了解它的内部,就知道它有内存管理、进程调度、文件系统等模块。可按照模型、接口和实现去理解每个模块,如进程管理:

  • 进程管理的核心模型就包括进程模型和调度算法
  • 接口包括,进程的创建、销毁以及调度算法的触发等
  • 不同调度算法就是具体实现

os难以学习,很大程度上就在于,很多人没有搞清楚其中各个概念之间的关系。
即便层层展开到最后,到了一个具体类,甚至是一个具体数据结构,依然可以按照模型、接口和实现结构理解,如很多Java面试题常问到的HashMap:

  • 其模型就是哈希表
  • 它定义了一些接口,比如,get、put等
  • 它的实现原来是用标准的HashMap实现,后来则借鉴了红黑树

再如,当使用一个新库或框架,先看接口,看对外提供功能是否满足要求,然后才是具体实现。 对于模型,想学习开源软件的架构时,再关注。

当能一层层理解设计,就像一棵知识树逐渐展开,每个知识节点在展开时,都会有下级的更具体内容。脑中有这样一棵设计树,就掌握了整个系统地图,再有新需求来,就不会盲目改代码。

4 总结

了解一个软件设计,从三个部分入手:

  • 模型,也称为抽象,软件核心部分,该系统与其它系统有所区别的关键
  • 接口,通过怎样方式将模型提供的能力暴露,是我们与这个软件交互的入口
  • 实现,就是软件提供的模型和接口在内部是如何实现的,是软件能力得以发挥的根基

了解设计的顺序:
模型=》接口=》实现。了解设计,需要一层一层地展开,在每个层次都按照模型、接口和实现进行理解,在头脑中形成一棵设计树。

了解设计,先模型,再接口,最后是实现。

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

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

相关文章

极光推送REST API与Java后台对接

极光推送官网的web推送页面 因为是对接它的api,所以我参照这这个样式实现了一个,效果如下: 定时任务推送界面,可定制。实现了推送一次和每日定时推送,如果再扩展的话有每周、每月的功能,只是没有这个业务…

银行数字化转型导师坚鹏:银行数字化转型的五大痛点

首先从汇丰银行业绩持续下滑谈起,汇丰银行作为一家国际知名的全球性银行,最近10年左右的时间里,营业收入持续下降,已经从2008年的1400多亿美元到2021年的804.29亿美元; 净利润徘徊不前,2021年比2020年下降29.2%,仅为52…

kafka心得记录

1.为何引入kafka? 削峰填谷,主要还是为了应对上游瞬时大流量的冲击,避免出现流量毛刺现象,保护下游应用和数据库不被大流量打垮。 2.kafka备份机制,主从机制,Leader-Follower: Kafka 定义了两类副本:领导…

C语言文件操作函数详解——将你的代码永久化 ( •̀ ω •́ )✧

🎄博客主页:🎐大明超听话 🎋欢迎关注:👍点赞🙌关注✍评论 🎍系列专栏:🎑从零开始C语言 🎊从0开始数据结构与算法详解 🎆计算机考研——…

JavaScript中的原型链

本文作者为奇舞团前端开发工程师概述JavaScript 是 Web 的编程语言,简单易学,功能强大,但由于过于灵活设计理念,导致初学者经常一脸懵,本文要谈的是JavaScript中难点之一原型链。原型链的前世JavaScript的诞生要理解Ja…

Nessus介绍与安装

Nessus介绍与安装 1.Nessus简介 Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上遥控&…

测试开发 | Dubbo 接口测试原理及多种方法实践总结

image1080478 86.9 KB 1、什么是 Dubbo? Dubbo 最开始是应用于淘宝网,由阿里巴巴开源的一款优秀的高性能服务框架,由 Java 开发,后来贡献给了 Apache 开源基金会组织。 下面以官网的一个说明来了解一下架构的演变过程&#xff0…

初学Java中的方法,看这篇就够了

本篇介绍了Java中方法的概念以及方法的使用(方法的定义和调用,实参和形参的关系).方法重载的介绍和使用,编译器如何实现方法重载- -方法签名,介绍和使用方法调用自身解决问题的技巧–递归 对比递归和循环的优缺点 掌握Java中的方法一.方法的概念及使用1.什么是方法2.方法的使用…

【C++】AVL树

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉AVL树&am…

【Linux】CentOS、CentOS Stream、RedHat 和Fedora 之间的关系

目录 简单说明 详细说明 红帽(Red Hat)系和德班(Debian)系 简单说明 在centos8之前: Fedora 》RedHat 》CentOS Fedora 是RedHat的“试验场”,很多新功能和特性先加入Fedora 稳定后再加入RedHat&…

YOLOv5 引入 最新 BiFusion Neck | 附详细结构图

YOLO 社区自前两次发布以来一直情绪高涨!随着中国农历新年2023兔年的到来,美团对YOLOv6进行了许多新的网络架构和训练方案改进。此版本标识为 YOLOv6 v3.0。对于性能,YOLOv6-N在COCO数据集上的AP为37.5%,通过NVIDIA Tesla T4 GPU测…

99.恢复二叉搜索树

99.恢复二叉搜索树 1、题目描述 题目的额外要求是: 使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用 O(1) 空间的解决方案吗? 2、解题思路 二叉搜索树中某两个节点被交换了数值,那么对中序序列的影响如下: 假设没有交换之前二叉…

活动星投票千人共读一本书网络评选微信的投票方式线上免费投票

“千人共读一本书”网络评选投票_视频投票评选_投票统计小程序_微信不记名投票用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投票服务&am…

正则表达式和re模块

目录 一.基础匹配 1.什么是正则表达式 re模块三个基础方法 re.match(匹配规则,被匹配字符串) search(匹配规则,被匹配字符串) findall(匹配规则,被匹配字符串) 小结 二.元字符匹配 单字符匹配: 示例: 数量匹配 边界匹配 分组匹配…

【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanFactory体系】

BeanFactory体系BeanFactory整体结构体系图顶层接口-BeanFactory1.1、描述1.2、方法解析(15个)1.2.1、属性1.2.2、获取bean实例1.2.3、获取bean的提供者(对象工厂)1.2.4、判断是否包含bean1.2.5、单例,原型,bean类型的判断1.2.6、…

SAP ABAP——SAP包(二)【CTS | 传输请求】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计专业大二本科在读,阿里云社区专家博主,华为云社区云享专家,CSDN SAP应用技术领域新兴创作者。   在学习工…

CentOS7.9配置Nginx反向代理+NodeJS部署上线

Nginx配置 Nginx是一个高性能的HTTP和反向代理服务,许多的大型网站都会采用Nginx来进行HTTP服务器托管 安装编译环境gcc g 进入到root目录: yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel 安装PCRE PCRE功能时让Ngi…

ue4c++日记3(碰撞报告碰撞位置|力和扭矩)

目录 代码速查 根据世界方向/局部方向移动 根据世界方向/局部方向旋转 加力加扭矩 1碰撞并报告碰撞位置 两个设为阻挡才会阻挡,其中一个是重叠就会重叠 2例子:旋转前进!/原地踏步? 3增加力和扭矩 1.头文件 2.cpp文件 …

(14)go-micro微服务服务层Handle开发

文章目录一 Handle层开发功能说明需要完成的服务开发功能:从哪找需要开发的功能二 代码编写三 最后一 Handle层开发功能说明 需要完成的服务开发功能: 登录注册查询用户信息修改信息发送注册邮件发送重置密码邮件重置密码获取权限修改权限退出账号删除…

【计算机视觉】梯度消失和爆炸以及解决方法

问题 梯度消失无论是笔试还是面试都是常客了,其实对应于梯度消失,还有一个梯度爆炸的概念,这又是什么导致的呢?下面我们将根据公式推导来解释何为梯度消失与梯度爆炸。 梯度消失和梯度爆炸的表现 网络层数越多,模型训练的时候便越容易出现 梯度消失(gradient vanish) 和…