做架构也得讲武德

这里是Z哥的个人公众号

每周五11:45 按时送达

当然了,也会时不时加个餐~

我的第「169」篇原创敬上

大家好,我是Z哥。今天分享一篇对「架构」这件事的随想。

我想,做「架构」是每个热爱技术的技术人在不断追求想进入的领域。但是很多人可能工作了很多年也没能真正参与到做架构这件事上。

所以,很多人对做架构这件事的感知停留在网上很多大牛分享的文章里。

但是,如果你只是看网上的文章其实对架构的理解会非常容易跑偏的,主要原因有两点。

第一点,世界是在不断发展和迭代的。技术也是人类文明的一部分,所以自然也会随着时间的推移不断进化。

而很多讲架构的文章喜欢和新技术挂上钩,一个没用到新技术的“架构”,会让很多人觉得有点out,缺乏吸引力。

但是新技术的推出,要么是用来解决过去无法解决的问题,要么是可以提高当前解决问题的效率。正如当前的你在20年前做程序员,基于当时的编程环境,开发效率肯定不如现在,这是毋庸置疑的。

也正因为如此,每一项新技术的出现,背后必然对应着一个典型的问题场景。能最大化发挥这项新技术价值的地方也应该是这个场景。

如果我们仅仅停留在这项新技术本身去考虑它有什么用,那么就很容易就会陷入到“拿着锤子找钉子”的情况里。特别是出于对「架构」的崇拜,“我怎么才能用上这个技术”会成为脑海中第一重要的目标。

第二点,不管是创造新技术的人还是分享新技术使用经验的人,对他们来说肯定得对外展示新技术好的一面。如果写不好的一面,这不是拆自己台么,或者担心表现出自己不会用、丢脸么。

如果你有心的话,当你在网上搜某个技术的相关资料的时候其实很容易观察到这个现象,讲优点的文章比讲缺点、讲遇到什么坑的文章多得多。

这会造成的影响就是过度拉高“旁观者”对新技术的预期,认为它是很牛逼的,能解决很多问题。

那么正确对待「架构」的态度应该是什么呢?

我根据我自己做架构5年踩坑的经验总结了以下3点。希望能帮助你少踩甚至是避开我踩过的坑。

/01  回到现实的问题中/

任何技术应该都只是解决问题的可选项之一,并没有所谓的唯一选择。只有你回到的现实中,从实际的问题出发去考虑,你才能规避掉你对某项技术所带的偏见。(当然,提前是你还得对每项技术有基本的了解)

比如,之前我团队里有个小伙伴觉得Saga模式非常酷,他认为用它来实现数据的写操作又快又准,还能大大降低资源竞争问题,是所有项目应该考虑的第一选择。于是,他在一个新项目中用上了。

但是,最终系统上线后,页面操作的响应的确挺快,但是由于数据的滞后产生了一系列问题,让系统使用者苦不堪言。

/02  大多数时候,「减」都比「加」好/

我问你两个词语,你知道「简单」和「容易」的区别吗?

在我看来它们有很大的区别,我的理解是,「简单」是形容事物的,「容易」是描述做一件事的过程。所以,我们做架构这件事,要追求的是「简单」而不是「容易」。虽然很多时候「容易」会让你用的时候觉得很「简单」,但那不是真的简单,最多算得上是局部的“简单”。(这段话有点绕,细品一下应该还是很容易理解的)

所以,想要架构变得「简单」,自然是做减法比做加法好。但是现实中,往往相反,更多人乐忠于增加什么新技术,引入什么新技术。毕竟做加法有可能不用考虑“历史问题”,而要做减法不得不考虑“历史问题”,很明显前者更「容易」。

/03  时刻保持风险意识/

大多数情况下,后续暴露出风险的地方大多数是一些非功能性的点。比如,数据经常出错,访问量一大数据同步就延迟的厉害,甚至宕机。

这些点说起来简单,但是需要考虑的细节非常多。类似于「木桶原理」,只要你的整体架构中有一块短板拖了后腿,大大小小的问题就会接踵而来。

更加麻烦的是,这些问题还不容易解决,甚至需要做大量的推倒重新设计才能解决。

虽然说,不管怎么样依旧无法100%规避风险,但是时刻带着风险意识问自己:“这里这样设计可能会有什么问题?”必然会大大降低风险系数。

另外,对待已经察觉到的潜在风险绝对不能草率,认为未来不一定会发生,先将就着。规模越大的系统,越符合墨菲定律所提到规律——“凡是可能出错的事有很大几率会出错”,而且时间会大大提前。

暂时就想到这么多,这个话题其实很大,后续有新的思考再分享给大家一起讨论。

好了,总结一下。

这篇呢,Z哥和你分享了我对架构这件事的随想。

首先,对待一个陌生的技术,预期不能过于乐观。因为以下两点会潜移默化地让你产生偏见。

  1. 对自己不了解的技术的崇拜感。

  2. 你能查到的对外分享讲优点的远大于讲缺点和坑的。

对待架构这件事我给出的3个建议是:

  1. 回到现实的问题中。

  2. 大多数时候,「减」都比「加」好。

  3. 时刻保持风险意识。

希望对你有所启发。

架构是“平衡”的艺术,祝你早日找到你的“平衡感”。

推荐阅读:

  • 聊聊单元测试

  • 心想技术驱动业务,却在背道而驰

原创不易,如果你觉得这篇文章还不错,就「在看」或者「分享」一下吧。鼓励我的创作 :)

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

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

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

相关文章

c++随机数函数rand()

c 语言rand()生成随机数 c语言中rand()函数生成随机数的用法&#xff1a; 详细介绍&#xff1a; (1)使用该函数首先应在开头包含头文件stdlib.h #include<stdlib.h>(C建议使用#include&#xff0c;下同) (2)在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数…

杂牌手柄模拟xboxone手柄_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...

最近收到一个很爆炸的消息&#xff0c;国外大神开发出了EGG模拟器(蛋蛋模拟器)&#xff0c;让手机也能玩Switch游戏&#xff0c;一直垂涎Switch游戏体验的我怎么能错过呢&#xff0c;必须一探究竟。据悉&#xff0c;EGG模拟器支持100多款Switch游戏&#xff0c;而且游戏还在持续…

api-hook,更轻量的接口测试工具

前言在网站的开发过程中&#xff0c;接口联调和测试是至关重要的一环&#xff0c;其直接影响产品的核心价值&#xff0c;而目前也有许多技术方案和工具加持&#xff0c;让我们的开发测试工作更加便捷。接口作为数据传输的重要载体&#xff0c;数据格式和内容具有多样性&#xf…

C++11的for循环使用auto的新用法

C11的for循环使用auto的新用法 for(auto a:vec) { cout<<a<<" "; } #include<bits/stdc.h> using namespace std; int main() {vector<int> vec;for(int i0; i<10; i){vec.push_back(i);}for(auto a:vec){cout<<a<<" …

如何使用 C# 中的 HashSet

译文链接&#xff1a;https://www.infoworld.com/article/3586972/how-to-use-hashset-in-csharp.htmlHashSet 是一个优化过的无序集合&#xff0c;提供对元素的高速查找和高性能的set集合操作&#xff0c;而且 HashSet 是在 .NET 3.5 中被引入的&#xff0c;在 System.Collect…

python装饰器源代码_13-Python-装饰器

1、装饰器的定义 装饰器的本质就是函数&#xff0c;用来装饰其它函数&#xff0c;就是为其它函数添加附加功能。 装饰器原则如下&#xff1a; 不能修改被装饰的函数的源代码 不能修改被装饰的函数的调用方式 2、实现装饰器知识储备 函数即变量 1 defbar():2 print("in the…

算法设计与分析——分治与递归策略——hanoi问题

**汉诺塔问题&#xff1a;**古代有一个梵塔&#xff0c;塔内有三个座A、B、C&#xff0c;A座上有64个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上&#xff08;如图&#xff09;。有一个和尚想把这64个盘子从A座移到B座&#xff0c;但每次只能允许移…

post多个参数_关于HTTP GET和POST的区别

Photo by Luca Bravo on UnsplashGET还是POST&#xff1f; 考虑将浏览器作为客户端&#xff0c;可以缓存哪种方法&#xff1f; 哪个是"安全"方法&#xff1f; 哪一个不是幂等的&#xff1f; 如果我将端点URL复制并粘贴到浏览器的地址栏中&#xff0c;然后按Enter&…

小试YARP

.net core下&#xff0c;一个轻量组反向代理库&#xff0c;由微软发起。做了一个简单的带验证的反向代理&#xff0c;应用结构如上图&#xff0c;一个验证服务&#xff0c;两个业务服务和一个YARP服务。源码https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/As…

Entity Framework Core 5中实现批量更新、删除

本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新、删除数据的开发包&#xff0c;并且分析了其实现原理&#xff0c;并且与其他实现方案做了比较。一、背景随着微软全面拥抱开源&#xff0c;.Net开源社区百花开放&#xff0c;涌现了非常多…

篮子里拿鸡蛋问题

一个一个拿&#xff0c;正好拿完。两个两个拿&#xff0c;还剩一个。三个三个拿&#xff0c;正好拿完。 四个四个拿&#xff0c;还剩一个。五个五个拿&#xff0c;还差一个。六个六个拿&#xff0c;还剩三个。 七个七个拿&#xff0c;正好拿完。八个八个拿&#xff0c;还剩一个…

一套标准的ASP.NET Core容器化应用日志收集分析方案

点击上方蓝字给一个关注吧讲故事关注我公众号的朋友&#xff0c;应该知道我写了一些云原生应用日志收集和分析相关的文章&#xff0c;其中内容大多聚焦某个具体的组件&#xff1a;超级有用的TraceId&#xff0c;快点用起来吧&#xff01;如何利用NLog输出结构化日志&#xff0c…

算法设计与分析——递归与分治策略——棋盘覆盖

问题描述 棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中&#xff0c;你给定任意一个特殊点&#xff0c;用一种方案实现对除该特殊点的棋盘实现全覆盖。 建立模型如图&#xff1a; 解决方案就是利用分治法&#xff0c;将方形棋盘分成4部分&#xff0c;如果该特殊点在某一部…

函数求值需要运行所有线程_JavaScript函数式编程(二)

纯函数就是&#xff0c;对于相同的输入&#xff0c;永远会得到相同的输出&#xff0c;而且没有任何可观察的副作用&#xff0c;也不依赖外部环境的状态但是实际的编程中&#xff0c;特别是前端的编程范畴里&#xff0c;“不依赖外部环境”这个条件是根本不可能的&#xff0c;我…

算法设计与分析——递归与分治——归并排序

归并排序采用的是一种分治的思想&#xff0c;如下图&#xff0c;先将要排序的元素分为两块&#xff0c;每个块又开始分裂&#xff0c;然后逐个按照特定顺序合并&#xff0c;合成最后我们需要的数组。 归并排序的复杂度&#xff1a; 时间复杂度&#xff1a;O(nlogn) 空间复杂度&…

git 回退上一个版本_Git小白使用教程:详细、显现、真正手把手教!

不少小伙伴私信问我GitHub怎么使用&#xff1f;今天更一下&#xff0c;希望能帮到你&#xff0c;有问题评论区拍砖交流吧。

在传统行业做数字化转型之业务篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第307篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是第三部分—业务篇&#xff0c;主要会介绍一下传统企业通用的三大…

算法设计与分析——递归与分治策略——快速排序

快速排序——递归算法 处理i,j的先后顺序不能改变 快速排序的基本思想&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分的关键字小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序。 函数…

git pull 覆盖本地_SVN与Git比较的优缺点差异

一、 集中式vs分布式1. Subversion属于集中式的版本控制系统集中式的版本控制系统都有一个单一的集中管理的服务器&#xff0c;保存所有文件的修订版本&#xff0c;而协同工作的人们都通过客户端连到这台服务器&#xff0c;取出最新的文件或者提交更新。Subversion的特点概括起…

C#阻塞队列BlockingCollection

BlockingCollection是一个比较冷门的类&#xff0c;我们先看下官方对这个类的定义&#xff1a;简单来说&#xff0c;BlockingCollection就是一个线程安全的阻塞队列&#xff0c;利用阻塞这个特性&#xff0c;我们可以实现进程内的生产者-消费者模式&#xff0c;比如消息转发、日…