架构师:不想当架构师的程序员不是好程序员

news2024/9/29 21:28:58

引言 

不想当将军的士兵不是好士兵。

很多程序员的梦想,就是将来能成为一名架构师。

包括我刚学编程那时候,也是以当架构师为目标,觉得不想当架构师的程序员不是好程序员,希望将来能成为一个优秀的架构师。就像拿破仑那句名言:“不想当将军的士兵不是好士兵。”

随着工作经历的增多,我也开始参与到架构设计中。对架构设计了解的越多,我越发觉得,其实做架构设计,并不代表一定要有一个架构师的头衔。

拿破仑那句名言,原句是“Every French soldier carries a marshal’s baton in his knapsack”,意思是“每个士兵背包里都应该装有元帅的权杖”。

元帅的权杖,意味着大局观,元帅的思维方式。当士兵背包里装有元帅的权杖,就意味着士兵也能胸中有大局观,能有元帅的思维,理解元帅在特定战场上想什么,这样能更好的执行命令,提升整体的战斗力。

其实拿破仑的本意是激励每一名上战场的士兵都要有大局观,有元帅的思维,并不需要每一个人都一定去当将军、当元帅。

这也适用于技术领域,对于程序员来说,并不代表一定要有一个架构师的头衔,而是心中有大局观,有架构师的思维,从而能理解架构设计,能写出好的程序。

什么是架构师思维?

架构设计,就是要控制技术的复杂性。对于架构师来说,要控制技术复杂性,有几种有效的方式:抽象、分治、复用和迭代。

架构师思维,其实就是这几种思维的集合。

抽象思维

抽象思维可以说是整个架构设计的基础。因为对于架构设计来说,是要为了满足业务需求的,而业务需求都是一些文字性的描述、原型、UI 设计图,这些需求要最终变成代码让机器执行,就必须先进行抽象,抽象成计算机能识别的模型。

其实抽象思维我们不陌生,因为我们从小学习的数学,就有很多抽象思维的训练。举例来说,我们小时候做的鸡兔同笼问题,看起来很复杂,但是如果我们会二元一次方程,把鸡抽象成 x,兔子抽象成 y,就可以用二元一次方程列出相应的方程式,从而求出解。

在软件项目中,遇到类似的场景,就会考虑抽象出来,总结一个规则和方法。有时候即使场景不同,也可以把其中有共性的内容抽象出来,可以更方便的使用。

在架构设计中,对需求进行抽象建模后,可以帮助我们隐藏很多无关紧要的细节,我们在高层次的架构设计时,可以关注在几个主要的模型上,而不必关心模型内的细节实现。

分治思维

架构设计的一个重点,就是要对复杂系统分而治之,分解成小的、简单的部分。但光分解还是不够的,同时还需要保证分解后的部分能够通过约定好的协议集成在一起。

分治思维在架构设计中有很多经典的应用。比如说分层架构,把 UI 部分与其业务逻辑部分隔离,这样这两部分就既可以各自进行变更,又互不影响。比如说 UI 交互修改,不需要修改业务逻辑代码,业务逻辑部分对性能进行优化,不需要修改 UI 界面。而每层之间,可以通过约定好的方法或者 API 进行交互。

还有像我们平时说的大数据,高并发这些复杂问题,也是通过分治来解决的。要知道单台机器,无论你性能如何优化,都是有其极限的。而像“双十一”这种高峰时刻,瞬间的流量可能是几百、几千万,就需要通过设计合理的策略,分化到不同的服务器,让每个服务器的流量不至于太大。

这种分治的思维其实不仅适用于架构上,也适用于平时程序员写代码。

比如说有些程序员写代码,喜欢把大量的逻辑放在一个方法或者一个类里面,最后极其难以理解和维护,如果能分拆成几个小的方法或者小的类,不仅结构更清晰,也更容易理解和维护。

复用思维

复用是一种非常简单有效的提升开发效率的方法,通过对相同内容的抽象,让其能复用于不同的场景。

以前我在做项目时,积累了一些框架上、组件上的实战经验,所以想抽离成公共代码,以便自己未来直接复用。后面我觉得这些项目肯定有很多人也需要,如果能复用的话会很实用。于是我把它开放到 我的GitHub 上,解决了很多人有类似的需求,到现在已经有超过 1000 个 Star。

复用思维在日常写程序的时候也很常用,比如有的程序员喜欢复制粘贴代码,所以经常看到很多重复的代码,如果要修改,得修改好几个地方。如果能把这些重复的代码提取成公共的类或者方法,就可以减少很多重复,让代码更简洁和易于维护。

迭代思维

好的架构设计,通常不是一步到位,而是先满足好当前业务需求,然后随着业务的变化而逐步演进。

就像淘宝这样的业务,它背后的架构设计也不是一步到位成现在这样,拆分成好多微服务。最开始,它也只是个普通的分层架构,后来随着业务不断扩展,逐步迭代成今天这样复杂的架构。

这种迭代的思维,在写程序时也很重要。因为很多程序员喜欢追求完美,期望能一步到位,然而这样带来的问题是开发成本会大量增加,导致进度延误。另一方面,如果对需求的变化预测不正确,就会有很多冗余的代码,后面难以维护。

其实,开发人员对以上提到的这些思维模式都不陌生,只是在实践的时候,总是有意无意地忽略了。

好的架构师是什么样子的?

对于程序员来说,培养架构师思维,并不是很难的事情。然而要成为好的架构师,光有架构师思维还不够。

一个好的架构师,不仅技术要好,还要懂业务;能从整体设计架构,也能在局部实现功能。

比如说一个做互联网软件架构设计有丰富经验的架构师,要去做建筑行业软件的架构设计,短时间内一定是很难设计出好的架构,因为他需要先熟悉建筑行业软件的业务,才能设计出符合业务特点的架构。

有一种架构师叫“PPT 架构师”,也就是说擅长写 PPT,画架构图。对各种热门的名词如数家珍。但是脱离一线开发,对业务和底层基础知识知之甚少。这样的架构师设计出来的架构,通常是不接地气的,实现起来会非常困难,成本也高。

因为作为架构师,如果不写代码,是不能体会出设计不好带来的问题,无法及时地对架构中的问题做出调整。

所以好的架构师,一定要是程序员出身,并且能坚持做一线程序员。也许他不需要写大量的业务代码,但至少要参与一部分编码工作,以及代码审查工作,以保证架构的正确执行。

好的架构师,不仅要有技术深度,还要有一定的技术广度。因为技术的选型,通常不能局限于一种技术,需要根据业务特点和团队特点灵活地选择。

好的架构师还有一个能力就是沟通能力。作为程序员,可能把自己的模块开发好就不错了,相对不需要太多的沟通工作。但是架构师就不一样,除了架构设计,还有大量沟通工作。

首先架构师要经常和产品经理打交道,反复确认需求,了解需求细节,只有这样才能分析清楚需求,了解各种用户场景。

然后架构师设计出来的架构,要通过文档、会议来讲给其他人听,能让其他人理解架构,用好架构。

所以,要想成为好的架构师,需要具备几个条件:

- 有架构师思维:具备良好的抽象思维、分治思维、复用思维和迭代思维;
- 懂业务需求:能很好地理解业务需求,能针对业务特点设计好的架构;
- 有丰富的编码经验:像抽象、分治、复用这些能力,都需要大量的编码练习才能掌握;另外保持一定量的编码经验也有助于验证架构设计;
- 良好的沟通能力:架构师需要沟通确认需求,需要让团队理解架构设计。

具备了这些条件,就可以成为很好的架构师,设计出好的架构,组织好人员和技术,低成本的满足好需求和需求变化,以及系统的运行。

如何才能成为好的架构师?

想要成为好的架构师,没有什么捷径,需要比普通程序员更多的努力才行。

如果你有志向成为架构师的话,我的建议是:

1、要成为一个优秀的程序员

技术好是成为架构师的基础条件。需要让你的代码容易读,容易扩展,能重用。这样通过大量的编码实践,才能逐步地培养出好的架构师思维。

2、多模仿多学习

在刚开始的时候,不用想着闭门造车,想出一个特别牛的架构。反倒不如先把业界成熟的流行的架构吃透,用好。

现在网络上也有很多好的开源项目,这些开源项目都有良好的架构设计,可以找几个跟你研究方向相关的项目,本地搭建一下,然后自己试一下,最好能弄一个自己的项目二次开发或者模仿一遍,做中学,是最简单有效的

3、选择好行业和平台

软件其实下面细分了很多行业领域,大类有像互联网应用、企业应用、游戏应用,大类下面又有细分的小类。比如说企业应用又和各行各业的业务结合在一起的,像建筑行业软件,就需要有建筑行业的专业知识。

前面我说过,架构师要同时懂业务和技术,而这些行业知识,也不是短时间内能积累起来的。所以如果想当架构师,最好能选择一个合适的行业,能在一个行业里面早点积累足够的行业知识,后面做架构设计的时候,就能更好地设计出符合业务特点的架构。

同时,这些行业领域的业务经验,和技术结合的架构经验,也会成为你个人独特的优势,不容易被替代。

还有平台也很重要,好的平台,能给你更多的实践机会。

如果你有志成为架构师,不能光埋头写程序,也要早做打算,选择适合你自己的行业和平台,少走弯路。

总结

其实对于程序员来说,并不代表一定要有一个架构师的头衔,而是心中有大局观,有架构师的思维。从而能理解架构设计,能写出好的程序。

架构师思维,指的是要具备良好的抽象思维、分治思维、复用思维和迭代思维。

另外没有架构师的头衔,也一样可以做架构设计,只要你有架构师的能力就可以了。

而好的架构师,需要具备:

- 有架构师思维
- 懂业务需求
- 有丰富的编码经验
- 良好的沟通能力

要想成为好的架构师,没有什么捷径可以走,首先需要要成为一个优秀的程序员,然后多模仿、多学习好的架构设计。

最后,还要早点选择好行业和平台,积累好行业的业务知识,借助平台获得大量的实践机会。


推荐阅读

  • 架构师技能修炼图
  • 技术破局,业绩狂飙十倍:亿级电商平台重构大揭秘
  • 当我们聊高并发时,到底是在聊什么?如何真正地掌握高并发设计能力?
  • 【总结】我的十二个架构设计原则
  • 微服务架构实战 - 我的经验分享总结2019(系统架构师)架构演进过程-从信息流架构到电商中台架构​​​​​​

系列分享

  • 高可用高并发实战专栏
  • DevOps实战专栏
  • SpringBoot系列专栏
  • 微服务架构实战
  • 架构思维成长系列

------------------------------------------------------

------------------------------------------------------

我的CSDN主页

关于我(个人域名,更多我的信息)

我的开源项目集Github

期望和大家 一起学习,一起成长,共勉,O(∩_∩)O谢谢

如果你有任何建议,或想学习的知识,可与我一起讨论交流

欢迎交流问题,可加个人QQ 469580884,

或者,加我的群号 751925591,一起探讨交流问题

不讲虚的,只做实干家

Talk is cheap,show me the code

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

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

相关文章

进程调度算法(操作系统)

1、 前置知识 1.1 非抢占式与抢占式 1.1.1 非抢占式 非抢占式指的是一个线程的在执行期间,另一个线程的到达,尽管各项标准都优于执行线程(例如优先级高于当前执行线程),也不会抢占CPU资源,会耐心的等待该…

【matlab程序】海图坐标轴单位的唯一

【matlab程序】海图坐标轴单位的唯一 【matlab程序】海图坐标轴单位的唯一 本文写作来源,从实际出发,用于实际: 热带海洋学报,投稿须知: 其中一条关于海图制作规范中: 经度标识(E, W&#…

真题详解(0/1背包)-软件设计(四十九)

真题详解(线性表)-软件设计(四十八)https://blog.csdn.net/ke1ying/article/details/130119249 多态有四种类型: 参数多态:应用比较广泛的多态,称为最纯多态。 包含多态:最常见的就是子类型化。 过载多态&#xff1…

Nfinity: YouTube创作者如何通过SocialFi变现

Nfinity推出了一个具有革命性的SocialFi平台:该平台通过生成NFT来帮助YouTube创作者实现内容变现。 YouTube做为全球第一大视频内容平台,尽管通过付费会员和广告收入的分成,为创作者们提供了大量的盈利机会,但它也存在很多的局限性…

【MybatisPlus快速入门】—— 基础入门

入门篇 我们先简单回顾一下 Mybatis 的用法,再引出MybatisPlus 1.1 Mybatis 框架回顾 🌔 1、什么是Mybatis框架呢? 一个持久层框架,目的是简化持久层的开发我们就使用springboot整合Mybatis,实现Mybatis框架的搭建…

NBT - 生成式蛋白设计,AI带来的蛋白质工程飞跃

科学家们创建了一个能够从头合成人工酶的人工智能系统。实验测试发现,一些酶与自然界中发现的酶具有相同的功效,即使人工生成的氨基酸序列与任何已知的天然蛋白质明显不同。实验表明,尽管自然语言处理是为了阅读和编写语言文本而开发的&#…

蓝牙技术|安卓将支持超宽带语音,蓝牙通话更清晰

Android 的蓝牙通话即将迎来质的飞跃,超宽带语音技术将让你的声音更清晰、更真实。 Android 专家 Mishaal Rahman 发现,Android 开源项目仓库中最近添加了一个补丁,实现了与蓝牙免提配置文件 v1.9 相关的功能。据IT之家了解,这个…

【初识C++】(关键字,命名空间)

文章目录一、C中的关键字二、命名空间1.命名空间规则展开命名空间域 和 #include 的区别2.正确使用命名空间三、C中的输入和输出一、C中的关键字 二、命名空间 命名空间是对于全局变量来说,我们在定义变量或函数时,函数名可能会和库中的函数名产生冲突。…

window 和 linux 安装 Tesseract-OCR

一、 Window 安装 Tesseract-OCR 1.安装 tesseract-ocr-w64-setup-5.3.1.20230401.exe 下载地址:https://digi.bib.uni-mannheim.de/tesseract/ 2. 配置 PATH 环境变量 3. 配置TESSDATA_PREFIX 环境变量 4. 在 cmd 中查询是否安装成功 5. 在安装的目录 tessda…

算法刷题总结 (七) 双指针

算法总结7 双指针一、双指针的概念1.1、什么是双指针?1.2、常见类型1.2.1、快慢指针1.2.2、左右端点指针1.2.3、区间指针 - 滑动窗口汇总二、经典例题2.1、快慢指针(1)、链表判环141. 环形链表142. 环形链表 II287. 寻找重复数876. 链表的中间…

人工智能学习07--pytorch15(前接pytorch10)--目标检测:FPN结构详解

FPN:用于目标检测的特征金字塔网络 backbone:骨干网络,例如cnn的一系列。(特征提取) (a)特征图像金字塔 检测不同尺寸目标。 首先将图片缩放到不同尺度,针对每个尺度图片都一次通过算法进行预测。 但是这样一来&#…

第二章:HTML CSS 网页开发基础(一)

一、HTML HTML&#xff1a;是一种网页制作标注性语言。HTML通过浏览器的翻译将页面呈现给用户。 1、1 HTML文档结构 HTML文档由4个主要标记组成&#xff0c;<html>、<head>、<title>、<body> <html>标记 该标记是所有html文件的开头&a…

[STM32F103C8T6]DMA

DMA(Direct Memory Access&#xff0c;直接存储器访问) 提供在外设与内存、存储器和存储器、外设 与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于 CPU&#xff0c;在这个时间中&#xff0c;CPU对于内存的工作来说就无法使用。 我自己…

实验设备管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87682549 更多系统资源库…

构建新摩尔定律下的算力分发网络

摩尔定律最早由英特尔创始人之一戈登摩尔在1965年提出&#xff0c;他认为集成电路上可以容纳的晶体管数目在大约每经过18到24个月便会增加一倍。20年后的今天&#xff0c;面对日新月异的社会和突飞猛进的数字化需求&#xff0c;摩尔定律也随着社会的进步而被赋予了新的定义。Li…

第八章 法律关系

目录 第一节 法律关系的概念 一、法律关系的定义与特征 二、法律关系的种类 &#xff08;一&#xff09;纵向&#xff08;隶属&#xff09;的法律关系和横向&#xff08;平权&#xff09;的法律关系 &#xff08;二&#xff09;单向&#xff08;单务&#xff09;法律关系、双…

基于ITIL搭建公司IT治理服务框架

ITIL帮助组织标准化其IT服务和流程。ITIL文档包括各种政策、程序和指南&#xff0c;帮助IT团队向客户提供优质的服务。 根据ITIL框架的五个阶段&#xff0c;ITIL文档被广泛分类为不同的类别。 这些阶段包括服务战略、服务设计、服务过渡、服务操作和持续服务改进。每个类别都有…

android内存泄漏检测,Android内存泄露检测之LeakCanary的使用

为了能够简单迅速的发现内存泄漏&#xff0c;Square公司基于MAT开源了LeakCanary。使用LeakCanary&#xff0c;在内存泄漏后&#xff0c;通过分析引用链可以分析内存泄漏的原因&#xff0c;LeakCanary用于检测Activity、Fragment的内存泄漏。 下面通过一些实际案例来进行分析。…

如何替换spring boot中spring框架的版本

背景 我开源的一个项目中&#xff0c;有朋友提到存在Spring Framework 身份认证绕过漏洞(CVE-2023-20860)。 解决方案是升级spring 框架版本&#xff1a; Spring Framework 5.3.X 系列用户建议升级Spring Framework到5.3.26及以上安全版本修复该漏洞Spring Framework 6.0.X 系…

HashMap 学习笔记

HashMap&#xff1a; 为什么经常深入考察&#xff1f; 基于java写的代码会访问很多东西&#xff0c;比如数据库&#xff0c;缓存&#xff0c;消息中间件。 HashMap数据结构 底层是数组 原本已经有很多个位置了 原本是取模但是优化成了性能更高的hash&(n-1) 让哈希值…