第六十六期:软件架构之道的一次感悟

张泰峰 6月3日

写在前面

2019悄悄溜走一半,无论是离别的忧愁,还是成长路途的艰辛,都在心中滚烫。

距离上一篇文章已经很久了... 懒惰的博主不能将这一切归结于我的时间、我的规划、我的工作,只能怪自己懒......正所谓学如逆水行舟,不进则退,不进到最后就只能退了。

今天突发一些关于架构的感悟,执笔记录下来。

软件架构的出发点

软件架构是一个软件系统开发生命周期中最前端的部分,也是最关键、最核心的部分。它决定了后续代码的走向;能够决定项目的走向;有时候甚至能够决定一家公司的生死。软件架构的成功要素,有很多点,这些点的一两个或更多个,组成了不同级别的业务系统或用户系统:

*1 可靠性

*2  安全性

*3 可伸缩性

*4 可定制化

*5 可扩展性

*6 可维护性

*7 用户体验

*8 可快速迭代性

面向用户的系统,用户体验 、快速迭代、安全、可靠 ,这四点必不可少,这些点围绕着的基础的技术选型、管理模式、规则、流程,也就跟着对应的权重的不同去分配了。

假如公司A需要做一个工具app,xx计算器、或xx记事本。 想要获得市场认可,它的架构就需要大约 : 30% 用户体验 、20%快速迭代、 10%可靠按照这个权重的分配去管理架构的技术选型、管理模式等等。一个工具app的安全性做的无懈可击,是不会得到市场认可的;一个电商网站的安全性可靠性不能保证,会被市场所抛弃。

又假如公司B有一个对内的管理系统,想要正确的结果,首先就得保证 可快速迭代性 ,业务每天都在变化,相反的用户体验、伸缩、安全、可靠,都可以相对不那么迫切。

通过可快速迭代性迅速迭代可定制化需求可扩展性需求提升了用户体验,用户体验的提升带动用户量的增长,则对可靠性、可维护、安全性、可伸缩性提出了更高的要求。

上面是我想要表达的,软件架构的出发点,是项目所处的市场的需求决定的。需求是什么,决定了架构是什么。

架构是难以更改的。是的,架构是非常难以更改的,如果你的项目已经推出市场了,除非重头来过,承受彻底重构带来的阵痛。这里往往要面临更严峻的考验,例如人事处理:有很多c++开发,想要转java,或有很多php开发,想要转python;再例如架构的改弦更张势必要有加班的,埋头苦干一个月,再走一遍来时的路~

举个栗子:TDD ,TDD本质过程就是要贯穿从需求分析、设计、编码、测试、整个研发过程。它其实是需求驱动,逐个满足每个的需求。 TDD的核心就在于把需求分析,设计,质量控制量化的过程,在编写测试用例时就可以规避、重构、设计需求的架构。TDD其实就是一个以需求驱动的架构模式、开发模式。

或许你已经在做相关的架构处理了,或许你已经吃到了一些苦头,这个理论或许可以帮助你认识到,要根据市场需求来制定合适的架构,推导合适的架构细节。要慎重。既不可以过度设计,也不可以设计不足,这把量尺是:市场需求。

架构以人为本

架构设计必须要考虑人在其中的重要因素,合适的人做合适的事情。一个好的架构,首要的就是要考虑所在团队的人的情况,我们往往倾向于抓技术层架构,忽略了怎么将合适的人放到合适的位置,已有的团队人员能不能合理的在架构中发挥应该有的作用。

抽象的处理、框架的引进很重要的一点是,如何解决人员素质、想法、环境的不一致。框架通过封装复杂的东西,简化业务的复杂程度,让对应的人能够专注对应的事情。抽象通过可以被共同理解的概念,简化复杂的内部处理逻辑,将人的目标聚拢在一起。

软件架构应该以人为本,将最高效的人放在最高效的地方能够取得最大化的成果,架构设计也就必须考虑人的因素。

例如我们有一个5人团队做一个项目,团队成员比例大约是: 1个leader  , 2 个核心, 2个实习,在设计这个项目的架构的时候,你必须要考虑的是,如何设计能把2个核心成员的力量放在合适的地方,如何设计能让2个实习成员能够完成既定的任务。 假如将2个核心与2个实习放在一起看待,过不了多久会出现一个情况,核心成员感觉做的东西技术含量太低,实习成员可能感觉东西难、累、赶,长此以往,项目会频繁面临人员变更。

我们倾向于集中精力做技术层架构,而不是人员层架构方面工作的主要原因,不是因为技术更重要,而是因为技术更容易做。人际交往是很复杂的,并且就效果而言从来都不会是很明晰和清楚的,但是它们比工作的任何其他方面都更重要。写代码并非只是写代码而已,而是与人有关——需要理解的东西包括那些人是谁,他们能作出什么贡献和需要什么东西,以及是多数派还是少数派等,诸如此类。“如果你把架构重点放一部分在人员安排的身上,那么就会发生更好的事情。

从人的角度衍生出的信息的交互

信息的交互其实是软件开发过程中需要重点关注的事情。信息的完整性、真实性,影响着开发过程中风险的暴露。风险则决定了项目的成功与否,所以我认为它是架构其中的一部分,它常常被人忽略,因为它既不属于技术,也不属于人员,更像管理工作,但其实它也跟架构有明显的关系。

软件项目的风险无非体现在以下四个方面:需求、技术、成本和进度。任何信息的不对等都有可能导致需求完成有误、技术设计偏离、成本过大、进度延迟。怎么样规划合理的信息交互、制定合理的反馈机制是架构需要考虑的问题之一。

总结和感悟

架构的目的是贴合市场需求指定合理的技术规划、人员规划、信息交互规划,架构是不仅仅局限于技术层面的。一个软件架构师,你需要统筹全局,深入了解需求,了解业务的走向,了解技术的价值所在。也需要制定或迎合人员的搭配,制定信息交互的流程。

核心观点

就是不可以忽略市场需求在架构设计中的力量,

更不可以忽略人在架构处理中所占的比例大小。

过度关注技术本身是一个本末倒置的行为。

阅读目录(置顶)(长期更新计算机领域知识)https://blog.csdn.net/weixin_43392489/article/details/102380691

阅读目录(置顶)(长期更新计算机领域知识)https://blog.csdn.net/weixin_43392489/article/details/102380882

阅读目录(置顶)(长期科技领域知识)https://blog.csdn.net/weixin_43392489/article/details/102600114

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

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

相关文章

[Leetcode][第332题][JAVA][重新安排行程][欧拉回路 / 欧拉通路][优先队列][DFS]

【问题描述】[中等] 【解答思路】 递归 复杂度 class Solution {Map<String, PriorityQueue<String>> map new HashMap<String, PriorityQueue<String>>();List<String> itinerary new LinkedList<String>();public List<String&g…

不会配置HTTPS?给我5分钟,手把手教你

本文针对不会配置HTTPS或者小白开发着&#xff0c;请大佬们自动忽略。非广告&#xff0c;心得分享&#xff0c;勿喷&#xff0c;谢谢。 正文开始 01、关于 FreeSSL.cnFreeSSL.cn 是一个免费提供 HTTPS 证书申请、HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站&#xff0c;旨在…

第三十三期:使用wireshark抓包分析-抓包实用技巧

杰哥很忙 7月9日 前言 本文整理一下日常抓包使用的一些方法及抓包分析的一些方法。 本文基于wireshark2.2.6版本进行抓包处理。其他版本使用方式大同小异。 自定义捕获条件 wireshark可以将抓包数据保存到硬盘上。若需要长时间抓包的话&#xff0c;需要防止内存过大&#x…

Floyd判圈算法

leetcode习题287 Find the Duplicate Number 在答案中看到了floyd’s tortoise and hare 算法&#xff0c;知道了如果有限状态机、迭代函数或者链表存在环&#xff0c;那么是需要算法检测环是否存在。检测算法有三种:Floyd龟兔算法、Brent算法、Gosper算法。 Floyd龟兔算法 算…

【数据结构与算法】【算法思想】【联系与区别】回溯 贪心 动态规划 分治

4种算法思想比较与联系 如果将贪心&#xff0c;分治&#xff0c;回溯和动态规划四种算法思想分类&#xff0c;那贪心&#xff0c;回溯&#xff0c;动态规划可归为一类&#xff0c;而分治单独可以作为一类&#xff0c;因为它跟其他是三个都不大一样。 因为前三个算法解决问题的…

Idea debug时报错:Command line is too long

问题&#xff1a;git pull下的项目&#xff0c;debug时&#xff0c;报错如下图 解决方法 在项目/.idea/workspace.xml文件中添加一行代码如下 <component name"PropertiesComponent">...<property name"dynamic.classpath" value"true"…

第三十四期:一次非常有意思的sql优化经历

风过无痕的博客 6月24日 场景 我用的数据库是mysql5.6&#xff0c;下面简单的介绍下场景 课程表&#xff1a; create table Course(c_id int PRIMARY KEY,name varchar(10)) 数据100条 学生表: create table Student(id int PRIMARY KEY,name varchar(10)) 数据70000条…

array专题6

78. Subsets 思路1&#xff1a;深度优先搜索&#xff1a;每个位置都有选&#xff0c;和 不选两种选择。退出条件是下标出界。 public List<List<Integer>> subsetsV3(int[] nums) {List<List<Integer>> result new ArrayList<List<Integer>…

[Leetcode][第657题][JAVA][机器人能否返回原点][数组][HashMap]

【问题描述】[简单] 【解答思路】 遍历方向 看是否回到原点 或者 “上下” “左右”两个方向的数量是否相等 1. 方向 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public boolean judgeCircle(String moves) {int x 0,y 0;int len moves.len…

网站公共部分的复用

一个网站的公共部分因为是一样的&#xff0c;可以通过公共部分的复用来减少代码的重复&#xff0c;同时也利于代码的后期维护。 关于公共部分复用的方法有很多&#xff0c;这里提供一些方法&#xff08;持续更新&#xff09; 利用ajax请求组件&#xff08;单个HTML&#xff09;…

第三十五期:当我们在讨论CQRS时,我们在讨论些神马?

thz 6月18日 当我写下这个标题的时候&#xff0c;我就有些后悔了&#xff0c;题目有点大&#xff0c;不太好控制。但我还是打算尝试一下&#xff0c;通过这篇内容来说清楚CQRS模式&#xff0c;以及和这个模式关联的其它东西。希望我能说得清楚&#xff0c;你能看得明白&#x…

【数据结构与算法】【算法思想】回溯算法

贪心算法 回溯算法 分治算法 动态规划 回溯算法思想应用广泛&#xff0c;除了用来指导深度优先搜索这种经典算法设计之外&#xff0c;还可以用在如正则表达式匹配&#xff0c;编译原理中的语法分析等。 除此之外&#xff0c;很多经典的数学问题都可以用回溯算法解决&#xff…

90 Subsets II

90 Subsets II leetcode第90题&#xff0c;用深度优先搜索的思路写出了三种不同的代码。一道题目&#xff0c;同样是深度优先搜索的问题&#xff0c;因为看问题角度不同&#xff0c;思路不同&#xff0c;代码也不一样 /*** [1,2,2,3] [] [1] [1,2] [1,2](重复) 情况&#xff1a…

2019 DDCTF 部分writeup

网上的wp已经很多了&#xff0c;但wp普遍很简略。我尽量写的详细一点。 一、WEB 滴~ 拿到题目后首先右键查看源代码&#xff0c;发现图片是以base64传送的 而且看url发现里面应该是包含了文件名&#xff0c;并且用了某个编码。测试过后是转16进制ascii码后两层bases64 &#xf…

第三十六期:如果把线程当作一个人来对待,所有问题都瞬间明白了

7月8日 以下文章来源于编程新说 &#xff0c;作者编程新说李新杰 多线程的问题都曾经困扰过每个开发人员&#xff0c;今天将从全新视角来解说&#xff0c;希望读者都能明白。 强烈建议去运行下文章中的示例代码&#xff0c;自己体会下。 问题究竟出在哪里&#xff1f; 一个…

[Leetcode][第322题][JAVA][零钱兑换][回溯][记忆化搜索][动态规划]

【问题描述】[中等] 【解答思路】 1. 递归&#xff08;超时&#xff09; class Solution {int res Integer.MAX_VALUE;public int coinChange(int[] coins, int amount) {if(coins.length 0){return -1;}findWay(coins,amount,0);// 如果没有任何一种硬币组合能组成总金额&…

用BST解决729. My Calendar I 731. My Calendar II 732. My Calendar III

My Calendar的book方法实现指定开始时间、结束时间&#xff0c;在重叠次数要求不同的情况下怎么实现。 729 My Calendar I 要求任意两个事件之间不能重叠。如果要插入的事件和已经插入的事件不重叠&#xff0c;则插入&#xff1b;否则不插入。 731 MyCalendar II 要求任意三个…

[转载]抓大放小,要事为先

最近看到了swing框架&#xff0c;细节颇多。细细看来效率很低&#xff0c;偶然找到了这篇文章&#xff0c;恩确实有道理&#xff1b;以下&#xff1b; 对待人生的任何事情都要&#xff1a;抓大放小&#xff0c;要事为先 对于一个以前从来没有接触过java的人&#xff0c;java无疑…

第三十七期:如果你这样回答“什么是线程安全”,面试官都会对你刮目相看

6月12日 以下文章来源于编程新说 &#xff0c;作者编程新说李新杰 有读者跟我说&#xff0c;喜欢看我的文章&#xff0c;说很容易读&#xff0c;我确实在易读性上花费的心思不亚于在内容上。因为我不喜欢一上来就堆很多东西&#xff0c;而且把简单的东西搞得复杂人人都会&…

第三十八期:如何在Windows 10上使用Windows Update目录驱动程序安装打印机

尽管Win10能够自动设置大多数打印机&#xff0c;但有时Windows Update可能会在安装设备驱动程序时遇到问题-尤其是在添加较旧的打印机时。 作者&#xff1a;佚名来源&#xff1a;Win10系统之家 图片来源&#xff1a;伏天氏(m.futianshuwu.com) 伏天书屋(futianshuwu.com)10月…