架构设计读后有感——原则

news2024/11/16 1:44:36

成为架构时是程序员的梦想,并不意味着把编程做好就能够自然的成为一个架构师,他们之间有一个鸿沟->“不确定性”

不确定性:编程本质上说是不存在不确定性的,因为一个输入可以通过逻辑的运算得到确定的值,即使是机器学习,也许会出现上一次同一个内容识别出现不同的结果,但是机器学习的本质目的就是在提高机器的“确定性”

  • 对于架构来说,本质上是不确定的。
    • 同样的系统可能A和B公司的架构不同,都能运转
      • 选择的组件,选择的数据库都有可能不同,但是实现的功能可能都是一样的。
    • 究其原因就好像人人都说的有道理,所以人人都不一样
  • 架构设计不会有很多约束,开发的时候,我们很多时候都要按照语法要求去编程
    • 但是架构设计不同,可能会面临选择,让人陷入两难的境地。
      • 每次对某个业务需求场景设计业务也会出现很多种解决方案,每个方案对应的痛点又不同,确实两难
      • Angular更强大,React很灵活,选哪个呢?
      • 团队熟悉MySQL,MongoDB更适合业务,选哪个呢?
  • 还有很多的类似的问题,关键在于架构设计没有一套准确而有通用的规范来指导架构师进行设计。
    业务千变万化,技术层出不穷,设计理念也是百花齐放,但是有其共性的原则:合适原则简单原则演化原则

🍞1 合适原则

合适优于业界领先

  • 优秀的技术人员总想不断挑战自己,想达到甚至优于业界领先水平“设计了xxx方案,达到和Google相同的技术水平”
    • 梦想很美好,现实很骨感
    • 如果你所对标的团队不是一个量级,那么项目的开发过程和迭代将会是一个巨大的灾难
  • 梦想是好的,但是要脚踏实地,一步一个大脚丫,体现如下

1.1将军难打无兵之仗

没那么多人,却想干那么多活,是失败的主要原因

大公司分工细,一个小小的系统模块就可能由一个团队负责,但是小公司,很有可能就是一个团队负责整个模块,一个人负责一个小系统

1.2罗马不是一天建成的

没有那么多积累却想一步登天,是失败的第二个主要原因

  • 业界的很多解决方案,不是一堆天才某个时期灵机一动然后加班加点就搞出来的,而是经过几年的积累,逐步成型
  • 别人踩了什么坑只有他们知道,这些磨难都是架构设计的关键促成原因

1.3冰山下面才是关键

没有那么卓越的业务场景,却幻想灵光一闪成为天才,是失败的第三个原因

  • 很多业界领先方案可能都是“逼”出来的,因为业务达到瓶颈,不得不去面对这个问题从而去设计新的方案
  • 如果你连那个场景都没有面对过,就想直接使用对应的架构,那么你是不知道其所具体解决的痛点的

🔓2 简单原则

简单优于复杂

  • 软件架构设计很考验技术,而同样考验技术的还有钟表,蒸汽机,飞机,手机等等,都做的越来越精细,越来越复杂

    • 同样的,这些复杂度也给对应的物品带来了更精确,更稳定,更安全的特性,不能说这些复杂度一无是处,也许在他们的领域这种复杂度刚刚好
  • 然而架构设计并不一定越复杂越好,越简单的情况下,做出同样功能的系统,这样的架构师的能力肯定是很强的

    • 因为简单并且功能相同,那么以后的代码维护,架构升级也能更好做
    • 简单意味着更容易理解,团队的压力也会减少,并且降低新人的认识难度
  • 软件领域的复杂特性体现如下

2.1结构复杂性

结构复杂的系统特点:组成其的组件数量多,组件之间的关系更复杂

  • 组件越多,越有可能因为其中一个组件导致整个系统出现故障而宕机
  • 某个组件变动,会影响其关联的所有组件,并且还会出现递归影响
  • 定位问题更加困难,组件出错层层递进
    在这里插入图片描述在这里插入图片描述

2.2逻辑复杂性

但是如果组件集中了,降低了组件数量,就会将所有的复杂度集中在一个系统中,那样的逻辑复杂性不亚于结构复杂性

  • 系统庞大,代码规模吓人,clone一次项目就要半个小时以上
  • 几十上百人同时维护一个系统,某个人错改了一个代码,就会导致排查问题很久
  • 各种分支覆盖合并
  • 版本过多
  • 线上故障出现,一堆儿去定位问题

为什么电路或者手机复杂度那么高却没有软件架构这些问题?

因为软件架构设计出来的系统会做迭代升级,而手机或者电路,只会在开始设计时有复杂度,而生产或者上线发布后就不会在变动

📈3 演化原则

演化优于一步到位

软件架构wiki:从目的、主题、材料、和结构的联系上来说,软件架构可以和建筑物的架构相比拟

  • 但是建筑物一旦完成,就不可再变,而软件去需要根据业务变化
    • 明长城:自600多年前建成,还是当年的机构
    • windows:1.0->3.1->95->XP->Vista->7->8->10->11
  • win1和win11的架构对比可以发现,这俩不是同一个东西了,可以发现建筑物和架构的本质不同,架构是可以进行升级改变的

对于建筑来说,永恒是主题;对于软件来说,变化是主题

如果没有把握“软件架构需要根据业务发展不断变化”的本质,就容易在做架构设计的时候陷入误区:试图一碗饭吃到寄

软件架构设计其实更加类似于大自然“设计”一个生物

  1. 首先,生物要适应当前环境
  2. 其次,生物还不断迭代繁殖将有利的基因传递下去,剔除糟粕
  3. 最后,当环境发生变化时,生物要能够快速改变以适应环境变化,否则就会被自然淘汰
    软件架构设计同理
  4. 首先设计出的架构要满足当前业务需要
  5. 其次,要不断迭代,保留优秀的设计,修改缺陷,改造错误的设计,去掉无用的设计,使的架构变得完善
  6. 最后,当业务发生变化时,架构要扩展、重构、甚至重写

📖4 本章小结

  • 架构设计原则1:合适原则,合适的架构优于业界领先的架构
    • 真正优秀的架构都是在企业当前人力、条件、业务等各种约束下设计出来的,能够合理的将资源整合在一起发挥出最大功效
  • 架构设计原则2:简单原则,简单的架构优于复杂的架构
    • 软件领域的复杂性体现在:结构的复杂性、逻辑的复杂性
  • 架构设计原则3:演化原则,架构需要随着业务变化而不断演化
    • 对于建筑来说,永恒是主题;对于软件来说,变化才是主题
    • 架构设计类似于生物演化

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

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

相关文章

电脑ip变了后导致原来的虚拟机静态ip失效问题

电脑ip变了后导致原来的虚拟机静态失效问题处理 静态IP设置的几个要点 查看本地网络的配置 VMware虚拟机网络设置 子网IP必须和本地ip在同一个网段下,本地的ip是192.168.1.10,那我子网ip就应该是192.168.1.xxx, 网关ip需要保持一致。 DHCP…

剧本杀分类管理

1用户界面 用户注册/登录模块与剧本杀填写模块:用户注册/登录成功后,将用户信息传递给剧本杀填写模块,以便用户进行剧本杀的填写。 图6-1登录注册 剧本杀填写模块与剧本杀分类管理模块:剧本杀填写完成后,将剧本杀信息…

Adaptive Object Detection with Dual Multi-Label Prediction

gradient reversal layer (GRL) 辅助信息 作者未提供代码

小孩真的需要手机上学吗?怎样远程了解他在学校用iPhone干什么?

互联网在教育、娱乐、社交等多个领域发挥着重要作用,成为孩子们获取知识、放松娱乐的重要渠道。孩子们首次接触互联网的年龄越来越小,有的甚至在幼儿园阶段就开始使用智能设备。 一些学校推行电子书包、网络作业等,虽然提高了效率&#xff0c…

【Golang】Go语言中如何面向对象?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Vue3:toRaw与markRaw

目录 一.toRaw 1.性质 2.作用 二.markRaw 1.性质 2.作用 三.toRaw的使用 四.markRaw的使用 五.代码示例 在Vue 3中,toRaw和markRaw是两个用于处理响应式对象的全局函数。 一.toRaw 1.性质 toRaw是一个全局函数,它接受一个由reactive或ref生成…

JS面试真题 part6

JS面试真题 part6 26、如何判断一个元素是否在可视区域中27、什么是单点登录?如何实现28、 如何实现上拉加载,下拉刷新29、说说你对正则表达式的理解?应用场景?30、说说你对函数式编程的理解?优缺点 26、如何判断一个元…

Vue74 路由的props配置

笔记 ​ 作用:让路由组件更方便的收到参数 {name:xiangqing,path:detail/:id,component:Detail,//第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件// props:{a:900}//第二种写法:props…

《动手学深度学习》笔记1.11——实战Kaggle比赛:预测房价+详细代码讲解

目录 0. 前言 原书正文 1. 下载和缓存数据集 1.1 download() 下载数据集 1.2 download_extract() 解压缩 2. Kaggle 简介 3. 访问和读取数据集 4. 数据预处理 5. 训练(核心难点) 5.1 get_net() 定义模型-线性回归 5.2 log_rmse() 对数均方根…

见合八方亮相重庆光纤传感大会(OFS China-2024)

2024年9月20日至22日,第十二届中国光纤传感大会(OFS China-2024)在重庆成功举办,该大会旨在展示光纤传感技术在多个领域的最新研究成果,推动该技术的产业化进程。 在本次大会上,天津见合八方光电科技有限公…

JDK1.8与JDK17相互切换

📖 前言:在电脑已经安装jdk17后,发现有些项目不兼容,需要用到以前的jdk1.8,本文介绍简单切换的方法。 🔎 甲骨文jdk1.8官网下载 下载完jdk1.8后,可以将其与jdk17放在同一目录层级下。 搜索栏直…

我眼中的Token2049 是一场加密大秀

今年Token2049,其实我也收到很多来自币圈朋友、项目方或交易所的邀请,都一一婉拒了。因为每年9月,都是我一年来最忙碌的日子。一方面进入金九银十的销售旺季,另外副业也需要谈一些团购业务。 我喜欢Web3,也曾是 #Bitg…

《操作系统 - 清华大学》1 -1:操作系统概述 —— 内容概述

文章目录 1. 内容摘要2. 实验内容 1. 内容摘要 在这里对学习内容做一个整体上的介绍,那在这里包括我们要学习的内容,实验的内容。操作系统课涉及到计算机系统当中的资源管理,所以我们围绕着操作系统的实现来介绍相关内容,那主要分…

Java之路--瓦解逻辑控制与方法使用已是瓮中捉鳖

嗨嗨大家!今天我们来学习逻辑运算和方法的使用~ 目录 一 逻辑控制 1 分支结构 1.1 if语句 1.2 switch 语句 2 循环结构 2.1 while 循环 2.2 for 循环 2.3 do while 循环 2.4 break 2.5 continue 3. 输出输入 二、方法的使用 1 方法定义语法 2 实参和…

NCU-机器学习-作业3:RANK: 0.0代码(No)

想体验一把No.1的快乐吗?话不多说直接上代码。 代码: import osimport pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC import numpy as npdef get_dataset(path):dataset, labels [], []filenames os…

SDK使用指南

本文档主要讲解音视频终端 SDK 产品家族下各子产品的能力支持及购买方式,并提供了相关 Demo 和 SDK 集成资源,具体体验步骤如下: 步骤一:了解产品 1.1 音视频终端 SDK 产品家族介绍 音视频终端 SDK(腾讯云视立方&…

python基础之绘图turtle与分词

python基础 1.学习目的2.实验2.1实验一2.2实验二 3.实验代码及结果 1.学习目的 python库很多,所以我们要在空闲之余学习我们没有遇到的库,就比如turtle和分词库 2.实验 2.1实验一 2.2实验二 3.实验代码及结果 # File: turtle库.py # Author: chen_so…

第L2周:机器学习|线性回归模型 LinearRegression:1. 简单线性回归模型

本文为🔗365天深度学习训练营 中的学习记录博客原作者:K同学啊 任务: ●1. 通过本文学习LinearRegression简单线形回归模型。 ●2. 模仿本文代码,通过鸢尾花花瓣长度预测花瓣宽度。 一、概念 什么是回归 回归的目的是为了预测&…

Vue3入门 - ElementPlus中左侧菜单和Tabs菜单组合联动效果

在Vue3中,ElementPlus是使用比较广泛的UI组件库,提供了丰富的界面元素支持项目开发需求。在后台管理系统中,左侧或顶部的菜单栏通常包含多个子菜单项,通过菜单的展开和收缩功能,用户可以方便地查看或隐藏不需要的菜单项…

Centos7.9安装.Net 8.0框架

1.背景 在Centos7.9编译运行Net8.0项目时,会用到.Net8.0框架。所以我实操了如何在Centos7.9去安装.Net8.0框架。本文记录了相关操作过程,是一个比较好的参考。 2.操作 2.1 安装框架 sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/pa…