当前位置: 首页 > news >正文

一个失败架构升级案例

架构师的核心能力-抽象能力 在做架构升级的时候,

升级开始:

升级过程:

结束:

虽然升级完了能很好的满足未来的需求,但是在升级的过程中一个需求可能要同时在新老链路里同时实现,风险和工作量加倍。


架构的核心是管理复杂度,架构师的核心能力是抽象能力,什么是抽象能力?抽象能力就是一种化繁为简的能力。何为化繁为简?就是把一种复杂的事情变得简单的能力,比如通过打比喻让别人很容易听明白你说的意思就是一种抽象能力。如何锻炼抽象能力?我觉得有三种方法,第一种是用归纳法找共性,从多个问题中找到共同的问题提炼通用解决方案,去其糟粕取其精华。第二种通过演绎法找关系,从多个问题中找关系,把多个问题串成一个问题,系统化解决问题!第三种是通过归纳法找特性。化繁为简需要不断的思考,不断的看清一件事的本质,这个事的解决方案越容易。

一、通过归纳法找共性

通过归纳法找共性有两种方法,分别是找需求的共性和找信息的共性

1.1 找需求的共性分期作为一个单一产品服务于海量亿级用户和全行业,但是各行业有很多的个性化需求,有限的技术资源不可能解决无限的行业个性化需求,所以必须对问题进行收敛,从一类需求中找到共性问题,找到最大交集然后求解。找需求的共性就是你收到一堆需求,你能分析出共同的需求是什么?比如用户说想吃香蕉、梨子、桔子和苹果等,那么共性的需求就是用户想吃水果。分期有商家贴息、部分贴息、第三方贴息和混合贴息等需求,共性需求就是灵活的贴息模式,然后基于这个共性的需求,推导出我们可以提供的技术服务或技术能力是什么,从而推导出系统架构,再比如各行业都想接入分期,但是都有些个性化的需求,那么我们是不是可以对个性化需求进行分类,提供几种标准的分期组件让各行业快速接入,比如小程序分期组件、H5版分期组件和JS版分期组件等。如果把这个问题再扩展下,作为技术要解决的问题也非常多且复杂,如果找共性需求,对所有技术问题进行收敛的话,可以收敛成三个基本需求,第一个是技术如何给业务带来护城河?第二个是技术如何给业务带来增量?第三个是技术如何保障业务安全运行?再延伸到经济活动,经济活动的本质或者核心需求是人类需求与服务供给的匹配,能交往和交流的人越多,匹配越容易匹配效率越高,人均GDP也越高,也就越富裕。

1.2 找信息的共性领域建模就是一种找信息共性的方法,领域建模首先就是要区分需求里哪些是变化的哪些是不变,把这个领域不变的信息沉淀成领域模型,基于领域模型做架构。分期在各个场景下可能衍生出不同的分期产品,如租房分期、汽车分期、家装分期和电商分期等,但其实共性都是通过组合额度、利率和还款方式等几要素产生不同的分期产品,比如电商分期额度较低、还款期限最长24个月,汽车分期则额度较高、还款期限可达3年。我们学习技术也是一样,所以技术的共性是什么,我觉得是TCP\IP等协议、语言基础、数据结构等基础技术,这些基础技术点你会发现几十年都不会变化。

二、通过演绎法找关系

通过演绎法找关系能让架构师更体系化的看一个问题。通过演绎法找关系可以分为找内部关系和找外部关系两种

2.1 找内部关系内部关系就是找到业务的生命周期和系统内部的主链路,分期业务虽然支持各种场景的个性化需求,但是系统内主链路和生命周期就一个,也很少发生变化,比如分期业务的生命周期是分期创建-分期失败-分期成功-分期支付关闭,他们的关系是从分期支付单创建到支付成功或支付失败,从支付成功到退款,最后到支付关闭。系统内部主流程包括前置鉴权、支付咨询、支付和退款等。找关系的的另外一个作用就是你看到一堆需求,你能看出这些需求彼此的关系是什么,通过这些关系去分析未来需求的趋势,是偏分期线下的需求更多,还是偏分期线上的需求更多,为啥是分期线下的需求会逐渐多起来,那么未来是不是要围绕着分期线下进行架构升级,通过对分期未来的趋势的判断做架构升级,把未来很多不确定性的事情变得逐渐有确定性。

2.2 找外部关系外部关系梳理清楚架构的边界,什么做什么不做,什么是本领域的核心服务,这些服务提供给谁使用,我们需要依赖其他领域的核心服务有哪些。为什么理清楚架构边界能够化繁为简?因为架构边界类似一个架构标准,大家遵循统一的标准沟通效率和沟通复杂度就会降低,否则每个需求都要讨论这个功能做在哪个系统?为啥要放在这个系统?我觉得不应该放在这个系统?

三、通过归纳法找特性

找特性首先是通过归纳法先找两个业务的共性,花呗支付和花呗分期都是互联网金融产品,都具备互联网产品属性和金融属性,花呗支付和花呗分期不一样的点就是分期的特性,主要体现在付费模式更多(有用户付息和用户免息),还款方式更多(3期、6期和12期),营销方式更多(全贴息和部分贴息)、以及服务角色更多(服务ISV)。再举一个例子,如果要精通JAVA要学习的内容会非常多,可能花很多时间学习也不一定能精通JAVA语言,投入产出比不高,但是如果想化繁为简就必须先找到JAVA的特性,针对特性进行深入学习,我觉得JAVA的两项特性技术是垃圾回收机制多线程框架,剩下的就和其他语言的特性差不多。大家会发现找特性和找共性是不是存在矛盾,所以在这个过程中需要做取舍,比如是否只满足共性需求不满足个性化需求,我觉得在某些场景下,取的是共性需求舍的是差异化需求,但是也可能在另外一些场景下取的是差异化的需求舍的是共性需求。关键是面对当下的业务,你判断什么当下或者未来最重要的事是什么,可能满足场景个性化需求虽然增加研发成本,但是能给业务带来技术壁垒,或者有没有一种方式能既满足共性需求又能满足部分个性化需求。

四、最后

相关文章:

一个失败架构升级案例

架构师的核心能力-抽象能力 在做架构升级的时候, 升级开始: 升级过程: 结束: 虽然升级完了能很好的满足未来的需求,但是在升级的过程中一个需求可能要同时在新老链路里同时实现,风险和工作量加倍。 架构…...

VM虚拟机运行的Ubuntu连入同一局域网,并实现双机方法

环境: Windows 10 VMware Workstation Pro 16 Ubuntu 20.4 在虚拟机设置桥接模式 确保虚拟机处于关闭状态,在Vm中设置: 编辑->虚拟网络编辑器 如果你以前设置过,可以重置之。 重置之后,添加桥接模式: …...

MySQL启动错误总结

centos7中出现mysql启动失败排查方法:首先找到/var/log/mysqd.log 第一种启动失败: 查看包含最后几行包含error的行; [ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock.[ERROR] Unable to setup unix socket lock file.[ERROR] …...

Linux软件包名称含AMD,ARM,x64的详解

下载clickhouse-backup时看到不同软件包,有的是x86,有的是amd64,有的是arm64,这些有啥区别呢? clickhouse-backup-2.4.2-1.x86_64.rpm clickhouse-backup_2.4.2_amd64.deb clickhouse-backup_2.4.2_arm64.deb x86 和 …...

光伏生产机器视觉系统应用场景全解析

​ 光伏产品的核心追求即为光电转化率,降本增效是光伏企业发展的永久动力。而光电转化率的提升、生产的降本增效,则来自于光伏硅片、电池片、组件、辅料等多个环节生产技术的提升和创新。光伏产品作为高产能、高精度的制造业产品,各段产业链上…...

ChatGPT DALL-E 3的系统提示词大全

每当给出图像的描述时,使用dalle来创建图像,然后用纯文本总结用于生成图像的提示。如果用户没有要求创建特定数量的图像,默认创建四个标题,这些标题应尽可能多样化。发送给Dalle的所有标题都必须遵循以下策略:1.如果描…...

Linux性能优化--补充

14.1. 性能工具的位置 本书描述的性能工具来源于Internet上许多不同的位置。幸运的是,大多数主要发行版都把它们放在一起,包含在了其发行版的当前版本中。表A-1描述了全部工具,提供了指向其原始源位置的地址,并注明它们是否包含在…...

用PHP爬取视频代码示例详细教程

以下是一个使用Symfony Panther和PHP进行爬虫的示例程序&#xff0c;用于爬虫企鹅上的视频。请注意&#xff0c;这个示例需要使用https://www.duoip.cn/get_proxy这段代码获取爬虫IP。 <?php // 引入所需的库 require vendor/autoload.php;use Symfony\Component\Panther\P…...

【笔记】centos7 python2.7.5安装paramiko

更直接的方式&#xff0c;参考: 离线安装_离线安装paramiko 这个更简单。 准备 资源链接: https://download.csdn.net/download/qq_26834611/88445708https://download.csdn.net/download/qq_26834611/88445708 或者选择自己下载 1. 下载python-devel 在一台能联网的cent…...

Neo4j入门教程2(看不懂评论区随便骂)

1. ORDER BY create (s4:student{age:21,num:98}),(s5:student{age:22,num:86}),(s6:student{age:23,num:99})承接上文&#xff0c;创建三个学生节点&#xff0c;标签为student1、student2、student3&#xff0c;分别拥有age属性和num属性 match(s:student) return s查看我们…...

Vue3.0的设计目标是什么?做了哪些优化

一、设计目标 不以解决实际业务痛点的更新都是耍流氓&#xff0c;下面我们来列举一下Vue3之前我们或许会面临的问题 随着功能的增长&#xff0c;复杂组件的代码变得越来越难以维护缺少一种比较「干净」的在多个组件之间提取和复用逻辑的机制类型推断不够友好bundle的时间太久…...

Linux介绍 (什么是Linux)

Linux介绍 &#xff08;什么是Linux&#xff09; 目录 &#x1f34e;一.Linux历史&#x1f34e; 1.UNIX发展的历史 2.Linux发展历史 &#x1f34f;二.开源&#x1f34f; &#x1f351;三.官网&#x1f351; &#x1f34a;四.企业应用现状&#x1f34a; 1.Linux在服务器…...

Android中使用Java操作List集合的方法合集,包括判读是否有重复元素等

1、判断是否有重复元素 List<String> mList new ArrayList<>();//将List转为Set&#xff0c;通过比较大小是否一样&#xff0c;判断是否有重复元素 Set<String> stringSet new HashSet<>(mList); boolean isHasRepeat false; if (mTipBeanList.siz…...

Rabbitmq 的管理配置

1、Rabbitmq管理 1.1、多租户与权限 每一个RabbitMQ 服务器都能创建虚拟的消息服务器&#xff0c;我们称之为虚拟主机(virtual host) ,简称为vhost 。每一个vhost 本质上是一个独立的小型RabbitMQ 服务器&#xff0c;拥有自己独立的队列、交换器及绑定关系等&#xff0c;井且它…...

Linux性能优化--性能追踪2:延迟敏感的应用程序

11.0 概述 本章包含了一个例子&#xff1a;如何用Linux性能工具在延迟敏感的应用程序中寻找并修复性能问题。 阅读本章后&#xff0c;你将能够&#xff1a; 在延迟敏感的应用程序中用ltrace和oprofile弄清楚哪里产生了延迟。对“热点”函数的每个调用&#xff0c;用gdb生成栈…...

分类网络-类别不均衡问题之FocalLoss

有训练和测代码如下&#xff1a;(完整代码来自CNN从搭建到部署实战) train.py import torch import torchvision import time import argparse import importlib from loss import FocalLossdef parse_args():parser argparse.ArgumentParser(training)parser.add_argument(-…...

记录一下ComboBox在listview中的问题,后面再解决。

在listview的ComboBox&#xff0c;ViewModel类得不到ComboBox的 SelectedModeIndex 和 SelectionChanged事件。 问题描述&#xff1a; 1. 在listview中有ComboBox 2. 数据源类 InspectionInfo &#xff0c;其中有ComboBox的绑定数据源 ModelList&#xff0c;代码如下&#…...

手写一个PrattParser基本运算解析器1: 编译原理概述

点击查看 基于Swift的PrattParser项目 编译原理概述 编译原理是我们每一个程序猿必须要了解的技能, 编译原理实际上并没有啥高深的技术, 我们如果在做业务开发, 也很少会用到编译开发的知识, 但是编译原理又是我们必备的基础知识之一. 所以我们需要对编译原理的内容有一个大概的…...

ZKP3.2 Programming ZKPs (Arkworks Zokrates)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 3: Programming ZKPs (Guest Lecturers: Pratyush Mishra and Alex Ozdemir) 3.3 Using a library ( tutorial) R1CS Libraries A library in a host language (Eg: Rust, OCaml, C, Go, …)Key type: constraint system Mai…...

mysqld: File ‘./binlog.index‘ not found (OS errno 13 - Permission denied) 问题解决

问题背景 Centos7 安装Mysql 8后启动时遇到的问题&#xff0c;看了好几个博客方案无效&#xff0c;搞了半小时才找到正解&#xff0c;在此次进行记录。 在此假设你已经修改了对应目录的权限&#xff0c;比如配置的mysql data目录初始化后已经执行了chown -R mysql:mysql /XXX/…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...