设计模式: 关于项目架构,技术选型,技术债务问题与解决方案
正确的选择是良好的开端
1 )指标
- 系统稳健性
- 系统健壮性
2 ) 衡量
- 在概念层次衡量架构质量
- 在实际开发中衡量架构好坏
3 ) 架构分类
- 系统架构
- 从系统维度,负责整体系统的架构设计
- 基础服务和各系统间协调,着眼全局
- 比如关注负载,可靠性,伸缩,扩展,整体项目切分,缓存应用等方面的基础架构设计
- 偏向于对技术的架构设计
- 应用架构
- 从应用程序的维度,负责某个应用的技术架构,主要偏向业务系统
- 关注理解业务,梳理模型,设计模式,接口,数据交互等方面
- 主要思考,如何让业务更好实现,如何让数据更好的交互,什么设计更好的拓展
- 需要了解整体业务系统怎样流转,针对所有业务系统做架构设计
- 业务架构
- 从业务流程维度,关注某一个行业,业务领域分析,获取领域模型,最终获得系统模型
- 也可叫业务领域专家,行业专家,产品咨询师,资深顾问
- 所做事情脱离具体开发任务,比如数据分析和模型建设来推动业务发展
- 如何选择自己
- 特别关注技术,朝着系统架构师方向发展
- 业务与技术并存,了解技术在业务里如何应用,每个应用间的交互,朝着应用架构师方向努力
- 如何希望脱离具体开发任务,只需要关注数据系统模型,得到结论,就要朝着业务架构师方向发展
技术前期准备
-
技术选型
- 社区氛围,发展规模,未来发展趋势,与当前团队的契合度,执行成本,维护和迁移成本,执行效率等内容的调研和报告
- 根据报告内容做一些取舍,选定当前技术类型,通过技术类型进行开发
- 充分调研每一项技术带来的利弊,根据利弊进行取舍,得到最优组合
- 最大程度上预测架构设计中的缺陷,防止问题的发生
- 凡是不打无准备之仗
-
技术优化
- 在架构发展过程中,可能会存在一些有悖于当前架构设计的实现,造成了架构发展阻塞,所以需要进行架构优化,使架构设计的适应性更高
-
架构优化
- 架构不是一蹴而就的,在业务发展过程中,架构也在不断演进
- 对架构设计进行实时调优,使架构优化成为常态化
- 通过不断的调整架构实现,改进初始架构中设计的不足,补足短板
技术债务
- 开发过程中因为时间紧迫导致的实现不合理
- 举例:查找100000以内的质数
- 算法不同,效率不同,好算法和坏算法的时间
- 开发过程中暂时没有想到更好的实现方式而妥协的版本
- 刚开始使用if…else实现
- 使用责任链模式来进行改进:每个函数都可以独立出来,作为一个判断条件使用
- 作为整体使用不好,使用责任链使用会让复用性提高,维护性提高
- 架构设计前期没有考虑到的一些细节
- 交互细节 -> props传递参数 (交互冗余,流程较长)
- 使用全局状态管理实现参数传递
- 不合理的交互设计,导致技术实现复杂
- 交互设计的难度,正确和设计人员沟通
- 减少这类问题出现
- 旧功能文档缺失,无正确拓展,修改和兼容旧功能,导致上线后问题剧增
- 无技术文档,技术功能没有预留出修改和兼容的接口
- 新开发功能要预留兼容旧功能的接口
- 让旧功能逐步符合当前架构设计的内容
- 阶段性重构,将旧功能变为新功能的实现
不修复技术债务的后果
- 修复变成重构:新功能要兼容旧功能的逻辑,有些旧功能无法兼容就不得不修改旧功能,导致重构,导致排期的影响
- 小的技术债务不做偿还,最后会演变为一场大规模的重构工作,导致产出不高
- 影响开发速度
- 导致整体开发需要兼容的点较多,影响开发效率和上线速度,导致整体项目迭代缓慢,失去核心竞争力(项目是企业战略落地的载体)
- 容易陷入,维护旧功能,开发新功能,兼容旧功能,维护旧功能,开发新功能的恶性循环
技术填补的解决方案
- 优秀的架构设计是基础
- 当前架构设计,能够有效处理当前需求可预见的情况,对于未知的,可能出现的特殊情况,很小的改动就能解决问题
- 2.1 我们的架构应该是简练的,精简的,对于一些可预见的问题,不建议做一些功能处理,只需要做一些预留接口即可
- 根据当前的业务,进行合理的项目拆分,尽量的代码解耦合
- 必须有日志模块,操作日志,错误日志,业务日志等等
- 良好的技术培训和传帮带能力
- 让每一位开发者可以从更深一层次理解所需要实现的功能
- 从最开始的代码规范,到熟悉业务,最后再到编写文档
- 充分的技术方案可避免一部分技术债务的产生
- 技术方案是充分理解需求之后所能产出的对需求理想的实现方式,必要性不言而喻
- 不同工程师之间可以相互review代码,避免当局者迷出现,codeReview是非常重要的,同时也是对自身的一个提高
- 提升对修复技术债务重要性的认知
- 工程师如果能预见一个债务可能导致的问题,自然愿意花时间去处理
- 善于发现和定期处理一些技术债务问题
- 勇于发现系统中的技术债务,让自己为系统负责
- 让自己为系统负责
总结
- 等产品和功能上线后,开发就没有那么紧张了,可以找个时间来处理技术债务
- 技术债务不仅仅是研发这个部门的责任, 需要联合测试和业务部门才能实现
- 所以,技术负责人和架构师请谨慎对待技术债务,否则可能会导致成本增加和线上风险
- 如果项目节奏正常,合格的技术负责人,架构师在提测之前就需要处理好这些问题
- 代码review是一个重要的工作, 团队代码review是一种共同学习的方式
相关文章:
设计模式: 关于项目架构,技术选型,技术债务问题与解决方案
正确的选择是良好的开端 1 )指标 系统稳健性系统健壮性 2 ) 衡量 在概念层次衡量架构质量在实际开发中衡量架构好坏 3 ) 架构分类 系统架构 从系统维度,负责整体系统的架构设计基础服务和各系统间协调,着眼全局比如关注负载,…...
el-tabs 默认选中第一个
1. 实际开发中el-tabs 都会设置第一个为默认值 ,这样会好看一点, 而渲染的数据经常是通过后端返回的数据 , v-model 无法写死默认值 解决办法 , 通过计算机属性 ,在data 定义一个 selectedTab watch: {defaultTab(newVal) {this.selectedTab newVal; // 设置第一个标签页…...
R -- match,pmatch,charmatch
文章目录 matchpmatchcharmatch match ?matchDescription match returns a vector of the positions of (first) matches of its first argument in its second. 第一个向量中的元素在第二个向量中的位置,如果第二个向量中有多个仅返回第一个match 元素的位置&…...
数据结构——线性表①(顺序表)
一、线性表定义 线性表是一种数据结构,它是由n个具有相同数据类型的数据元素a1,a2,…,an组成的有限序列。 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个…...
MFC网络编程-Udp客户端
目录 1、UI的设计: 2、代码的实现: (1)、重写CSocket虚函数OnReceive,并且传入对话框的指针 (2)、初始化SOCKET (3)、绑定本地IP和端口 (4)、…...
密码学基础
密码学总览 信息安全面临的危险与应对这些威胁的密码技术: 关于上图中的威胁,这里在简单的说明: 窃听:指的是需要保密的消息被第三方获取。篡改:指的是消息的内容被第三方修改,达到欺骗的效果。伪装&…...
[Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
一.部署nodejs项目,映射端口,挂载数据卷 可以到https://hub.docker.com/去搜索node镜像,然后下载,也可以直接通过docker pull node下载镜像,然后用这个node镜像启动容器node,这样系统就集成了node服务了,在这里挂载www/node目录到容器中,并指定端口映射,运行nodejs程序,安装npm…...
拥抱AI-ChatGPT:人类新纪元
最近大模型通用智能应用持续发酵,各大科技公司都陆续推出了基于通用大模型的智能应用产品,典型的如OpenAI的ChatGPT、微软的BingChat、百度的文心一言、360的智脑、阿里的通义千问等。当然最火的要属于ChatGPT了,从去年年底推出到现在已经有很…...
基于深度学习的人脸表情识别 计算机竞赛
文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸表情识别 该项目较…...
GitHub经常打不开或者访问解决办法
访问慢或无法访问的原因:DNS解析是最为基础的一个环节。由于Github的服务器在全球各地,域名解析所需的时间也会不同,这就导致了在特定地区可能会出现Github无法正常访问的情况。 解决:查询到github对应的IP,然后在host…...
密码学 - SHA-2
实验八 SHA-2 1.实验目的 熟悉SHA – 2算法的运行过程,能够使用C语言编写实现SHA-2算法程序,增加对摘要函数的理解。 2、实验任务 (1)理解SHA-2轮函数的定义和常量的定义。 (2)利用VC语言实现SHA-2算…...
Vins-Fusion、Vins-Mono(之前那个编译通过但是没有这个好用)
ROS的catkin_make不要修改,暂时没有理由,理由就是两次一个改了一个没改,没改的成功了以成功为准。 另外docker也没用成功,原本的逻辑来说,docker肯定不能出问题的,但是由于roscore通信的原因可能没有将结果显示&#x…...
每日自动化提交git
目前这个功能,有个前提: 这个git代码仓库,是一个人负责,所以不存在冲突问题 我这个仓库地址下载后的本地路径是:D:\Projects\Tasks 然后我在另外一个地方新建了一个bat文件: bat文件所在目录为:…...
【Linux进程】再谈软件—操作系统(Operator System)
目录 操作系统(Operator System) 概念 设计OS的目的 如何理解 "管理"——先描述再组织 系统调用和库函数概念 总结 操作系统(Operator System) 概念 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。 笼统的理解,操作系统…...
创建超过1G内存大小的程序
正常情况一个进程最大占用内存为1G一下,如果程序有需求要使用超过1G大小的程序,可进行如下操作 VS修改设置:属性--->链接器--->系统--->启用大地址 【选择是】 测试申请堆内存代码 #include <stdlib.h> #include <stdio…...
如何本地部署Jellyfin影音服务器并实现在公网访问
文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…...
docker fixuid
docker fixuid 一、fixuid是什么二、使用场景三、问题dockerfiledocker run 一、fixuid是什么 fixuid是用go语言编写的,当容器起来后可以修改容器中非root用户的UID/GID和文件权限。 项目地址:https://github.com/boxboat/fixuid 二、使用场景 当容器…...
MySQL笔记--SQL语句
目录 1--SQL的通用语法 2--SQL语句的分类 3--DDL语句 3-1--数据库操作 3-2--表操作 3-3--数据类型 3-4--修改和删除 4--DML语句 4-1--插入数据 4-2--修改数据 4-3--删除数据 5--DQL语句 5-1--基本查询 5-2--条件查询 5-3--聚合函数 5-4--分组查询 5-5--排序查…...
线扫相机DALSA-相机平场矫正详细步骤
在相机视野下铺放白色亚克力板或纯白纸,采集图像。打开曲线图。 选择 Line Profile 模式。调节好相应所需的曝光时间、光源、增益和镜头光圈,让白平衡纸显示出来的灰度值大概在 150-200 左右。 在Calibration Algorithm 中将显示的数值设置好。 先暗场…...
求购供应发布农业副业产品市场行情小程序开发
农业副业产品求购供应发布市场行情小程序H5开源版开发 后台同步:一键获取全国近200家农产品批发市场的商品价格,包括蔬菜、水果、水产、粮油和农副产品等。 实时更新和同步市场价格动态,保障信息的准确性和时效性。 前端VIP权益功能&…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
