架构思维其实就那么回事

一提到架构,对于工作经验不多的小伙伴来说会心生敬畏之心。觉得是一个很高端、很难、很有挑战的事情。

没错,架构不像我们平时的coding工作,这是一个宏观层面的事情。而对我们内心来说,越宏观、越大的东西,我们总会觉得更不容易控制,所以会心生敬畏。但实际上,架构的“世界”在复杂度上可能还不如coding上的细枝末节那么大。

我有幸从2015年开始接触架构相关的工作,作为过来人,我建议所有程序员们尽可能早地培养自己的架构思维,这对你未来在技术路线上走的更远很有帮助。

因为这是一个视野问题。同一个功能,代码的实现方式可以有千千万,每一次coding就是一次决策。你在视野10米内做决策,自然没有在1000米范围内做出的决策来得更优。

架构思维的培养并不需要你非得是架构师,每个程序员都可以。下面我来分享一个大家都能尝试的方法。

首先,心里一定要清楚「架构的意义」是什么?并且一直带着这个意义做接下去的事情。否则很容易本末倒置甚至是跑偏。

Z哥对架构意义的理解是:架构表达的是一种关系,是多个现实元素之间的关系

这里面的两个关键词是「关系」和「现实」。「关系」很好理解,就是不同事物之间以什么样的形式共存。而「现实」容易被人轻视,因为它显得很平常,但是往往我们在做架构的时候,对于某些现实的定义是不精准的。现实定义错了,后面的工作大概率也是错的。

所以,要做的第一件事就出来了:明确你当前要解决的问题,或者要达成的目标。并且弄清楚其中涉及到的相关概念所表达的业务含义

你可以将这一步中所得到的相关概念用工具或者纸笔画出来,平铺开来就可以。比如像下面这样。

做完了这一步,接下来就是传统意义上做架构的过程。对于这个过程,也用一句话来概括就是:架构的过程其实就是建模的过程

没错,「建模」就是进一步细化当前的事物,并且基于所得的信息做相关的延展和规划,循序渐进,得到一个完整的、可执行的方案的过程。

说起来很简单,做起来却不那么简单。在这个过程中会涉及到以下一些思维方向:

  • 分解。一个复杂的概念如何通过分解变得更容易理解和控制。

  • 集成。多个模型之间以什么样的技术方案“沟通”。

  • 复用。哪些模型之间有较高重合度,可以将重合部分单独建模重复利用。

  • 分层。这就是「高内聚低耦合」思想的体现,为了让项目更加的井然有序,将职责类似的模型归纳到同一个“层”里。

  • 抽象。将模糊不清的概念进行提炼,让其表现得更加通用,降低复杂度。

  • 结构化。这是一种系统化的决策思维。比如你可以将信息通过二维表或者树型来陈列,然后就能发现其中隐含的一些关系,帮助你决策。

  • 迭代。抛弃完美主义,寻求“合适”。因为那些现在看起来优秀的架构,都是慢慢迭代出来的。

那么具体怎么做呢?

Z哥建议你可以先按照以下的步骤来进行。

  1. 搞清楚要解决的现实问题。

  2. 确定边界。

  3. 用分解、抽象、结构化的思维来拆分问题并梳理好每个流程。

  4. 借助集成、复用、分层思维给出你认为最合理的技术实现方案。形成最终一份完整的架构。

  5. 根据对未来的预判对架构方案进行局部修正,直到合理。

在你熟练后,可以根据实际情况自行删减一些步骤。下面我来展开说一下。

01

拿到一个稍具规模(小于一周的功能发挥空间就很小了)的功能后,首先先弄清楚“这个功能要解决的问题是什么?”。不要上来就写代码或者找现成的解决方案。首先不说质量如何,如果总是走一步算一步或者依样画葫芦如何能锻炼架构思维呢?

02

考虑问题所在的场景中有哪些输入数据,最终输出的又是什么。这样就把问题的边界给定下来了。

03

把问题进行拆解,看看解决了哪些小问题之后,这个问题就能被解决。这个过程中再做前面提到的,把其中的相关概念在纸上画出来。

然后,再思考每一个小问题你是否有解决方案。如果有,那么把中间的逻辑用流程图画出来。如果逻辑太复杂,说明问题的颗粒度还是太大,继续拆。如果某个小问题没有解决方案同样继续拆,直到有解决方案为止。

最终形成的一个个针对每个小问题的流程图,就是你初步的架构设计。

这个环节主要发挥你的分解、抽象、结构化的思维。

04

根据你的技术储备,针对每一个问题给出具体的技术实现方案,选择你认为最简单、高效的一个即可。

然后把所有问题的解决方案放在一起看,提炼可复用的部分出来,并考虑用什么形式进行封装。可以是一个简单的库,也可以是一个完整的框架,或是API等等。

这个环节主要发挥你的集成、复用、分层思维。

还没完。

05

根据你对业务理解和与产品经理、业务方的沟通,预判一下后续可能的扩展点,看当前的设计是否能满足。如果不能满足,逐级逆向倒推父问题,直到找到与这个新的扩展点相关的根问题,停下来把这个根问题下面的子问题全部重新设计一下。

再重复第4步,直到得到一个当下看起来完全满足预期的方案。至此,你就完成了一次架构设计工作。

切记,变更尽量从根问题开始调整,而不是从最近的问题开始。因为选择后者容易积累技术债务

最后,还是那句话。架构是迭代出来的,一次性拆分刚好能恰到好处几乎是不可能的。

如果你想成为一位优秀的架构师,那么画架构图的技能也需要专门学习一下。架构图的种类有很多,常见的类型我之前做过整理,你可以参考一下:《软件开发中会用到的图》。

好了,总结一下。

这篇呢Z哥和你分享了什么是架构思维,以及如何来培养架构思维。

主要分为以下5步。

  1. 搞清楚要解决的现实问题。

  2. 确定边界。

  3. 用分解、抽象、结构化的思维来拆分问题并梳理好每个流程。

  4. 借助集成、复用、分层思维给出你认为最合理的技术实现方案。形成最终一份完整的架构。

  5. 根据对未来的预判对架构方案进行局部修正,直到合理。

希望对你有所启发。既然都看到这了,你肯定很想成为架构师,祝愿你早日成功。

推荐阅读:

  • 职业规划的关键在于「如何选择」

  • 怎么开会才不浪费时间?

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

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

可以试试点击「阅读原文

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

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

相关文章

python原理及代码_原理+代码|详解层次聚类及Python实现

前言聚类分析是研究分类问题的分析方法,是洞察用户偏好和做用户画像的利器之一。聚类分析的方法非常多,能够理解经典又最基础的聚类方法 —— 层次聚类法(系统聚类) 的基本原理并将代码用于实际的业务案例是本文的目标,同时这也会为理解后续与…

Java但中获取时间将时间转换成字符串格式(年月日格式)

一:直接上马拿走: package cn.wyj.one;import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date;/*** 测试时间对象和字符串之间的相互转化* DateFormat抽象类和SimpleDateFormat实现类的使用* author 86155**/public class Demo2…

一行代码就可以替换n个仓储文件

( 且放白鹿青崖间,须行即骑访名山 )终于还是要面对这个问题了,一直想着可以逃避它,自从18年就开始纠结这个问题,后来看了DDD,然后也收集了很多的设计思想,发现一个框架除了稳定性&am…

JAVA当中Calendar类打印日历表单

一:引言 代码当中注释很详尽,直接上码; 二:上码 package cn.wyj.one;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date…

基于.NetCore3.1系列 —— 日志记录之日志配置揭秘

前言在项目的开发维护阶段,有时候我们关注的问题不仅仅在于功能的实现,甚至需要关注系统发布上线后遇到的问题能否及时的查找并解决。所以我们需要有一个好的解决方案来及时的定位错误的根源并做出正确及时的修复,这样才能不影响系统正常的运…

7-21 求前缀表达式的值 (25 分)(思路详解)

一:题目 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如23*(7-4)8/4的前缀表达式是: 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。 输入格式: 输入在一行内给出不超过…

java当中递归打印目录树

一&#xff1a;上码 package cn.wyj.one;import java.io.File;public class Demo8_递归打印目录树 {public static void main(String[] args) {File f new File("C:/亚洲");printfile(f,0);}static void printfile(File f,int level){for( int i 0; i < level;…

今天你内卷了吗?

点击蓝字关注&#xff0c;回复“职场进阶”获取职场进阶精品资料一份最近「内卷」这个词大火&#xff0c;朋友圈、知乎、腾讯新闻、B站视频&#xff0c;铺天盖地。大家的议论充满了愤懑、不安、失望和愤怒。那么&#xff0c;什么是内卷&#xff1f;内卷并不是一个新词&#xff…

python中的正则表达式re模块_python中的正则表达式(re模块)

特殊字符"."  &#xff1a; Matches any character except a newline.匹配任何字符 除了换行符"^"  :匹配字符的开头1 importre2 sre.findall(^c234,ac2324)3 s1re.findall(^ac,ac2324)4 print(s)5 print(s1)6 #输出&#xff1a;[]7 # [ac]"$&quo…

.NET Core + Spring Cloud:服务注册与发现

毫无疑问&#xff0c;微服务架构是目前的主流&#xff0c;在微服务架构下&#xff0c;服务治理、负载均衡、服务熔断、配置中心、API网关 等都是需要关注的问题&#xff0c;当然不是非要全部完善后才能进行微服务开发&#xff0c;在很多项目团队中&#xff0c;初期可能会将某个…

python语言中不用来定义函数的关键字_Python 语言中用来定义函数的关键字是

Python 语言中用来定义函数的关键字是答&#xff1a;def调查问卷采集是数据采集人员通过设计具有针对性的问卷,采用方式进行信息采集答&#xff1a;以上都是中国大学MOOC: 突出重点&#xff0c;必须以解决问题为目标。也就是说&#xff0c;重点内容的训练&#xff0c;必须实现预…

C++中getline()和cin()同时使用时的注意事项

一&#xff1a;问题 当用cin输入完后 然后再用getline()的话就会直接结束没办法在输入了 问题分析&#xff1a; cin只是在缓存区中&#xff0c;把字符读走&#xff0c;会剩余/n在缓存区中&#xff0c;但是getline对/n极度敏感&#xff0c;导致getline刚开始读入便遇到/n于是…

api接口返回动态的json格式?我太难了,尝试一下 linq to json

一&#xff1a;背景1. 讲故事前段时间和一家公司联调api接口的时候&#xff0c;发现一个奇葩的问题&#xff0c;它的api返回的json会动态改变&#xff0c;简化如下&#xff1a;{"Code":101,"Items":[{"OrderTitle":"订单1"}]}{"C…

mysql id 字段类型转换_mysql 数据类型转换

一、问题有一张如下图所示的表&#xff0c;需要我们查出 result 值大于 reference_high值的数据然后我们写了下面的SQL查询语句SELECT i.result,i.reference_high FROM report_item iLEFT JOIN report r ON r.idi.report_idWHERE r.org_id54 AND r.report_status1AND r.add_dat…

7-22 堆栈模拟队列 (25 分)(详解夹思路)

一&#xff1a;题目 设已知有两个堆栈S1和S2&#xff0c;请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列&#xff0c;实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S)&#xff1a;判断堆栈S是否已满&#xff0c;返回1或0&#xff1b; int IsEmpty (Stack …

What is 测试金字塔?

【答疑解惑】| 作者 / Edison Zhou这是恰童鞋骚年的第271篇原创内容我的女朋友是一名测试工程师&#xff0c;但她之前却不知道测试金字塔的概念&#xff0c;为此我曾经在家里的白板上画了一个图一层一层给她讲解过。我和同事在给团队面试测试和开发岗位时&#xff0c;也会必问到…

Mysql编码教程_mysql编码设置教程 mysql编码要怎么设置呢

mysql的默认编码是拉丁&#xff0c;每次JSP制作网页用insert语句插入数据库时汉字都会显示成问号&#xff0c;安装mysql后&#xff0c;启动服务并登陆&#xff0c;使用show variables命令可查看mysql数据库的默认编码:由上图可见database和server的字符集使用了latin1编码方式&…

技术脱钩后软硬件磨合优化不失为一条出路

从宏观上看&#xff0c;这一论的制裁只是一连串组合拳的一次攻击&#xff0c;将来&#xff0c;东亚大国和西方技术脱钩是大趋势。在这种背景下&#xff0c;宜建立红色产业链。指导方针是不过度追求局部指标的先进性&#xff0c;而是追求技术自主性&#xff0c;并把握整体性能达…

7-23 还原二叉树 (25 分)(分析加详解)

一&#xff1a;题目&#xff1a; 给定一棵二叉树的先序遍历序列和中序遍历序列&#xff0c;要求计算该二叉树的高度。 输入格式: 输入首先给出正整数N&#xff08;≤50&#xff09;&#xff0c;为树中结点总数。下面两行先后给出先序和中序遍历序列&#xff0c;均是长度为N的…

dotNET:怎样处理程序中的异常(实战篇)?

在上篇 《dotNET&#xff1a;怎样处理程序中的异常&#xff08;理论篇&#xff09;》 中讲了一些程序中出现异常怎样处理的理论知识&#xff0c;本文将以代码的方式来进行实践。环境dotNET Core&#xff1a;3.1工具&#xff1a;Rider 2019.3.2系统&#xff1a;macOS 10.15.4创建…