重新认识架构—不只是软件设计

前言

什么是架构?

通常情况下,人们对架构的认知仅限于在软件工程中的定义:架构主要指软件系统的结构设计,比如常见的SOLID准则、DDD架构。一个良好的软件架构可以帮助团队更有效地进行软件开发,降低维护成本,提高系统的可扩展性和可维护性。这里的架构定义有更多元化的理解:架构不仅是对软件开发设计和流程规范的定义,也包含了参与架构设计的人员、以及项目过程中和架构有关的活动,都可以称为架构。

广义角度来理解架构,意味着更全面的思考和新的融合。

68d18a2e1949b43a5a750ca1376d0743.png

按这张图理解,架构是指架构师以商业价值为导向、以用户为核心,在所处的商业、文化、技术环境中,利用有限的资源和成本,设计架构方案、组织或参与研发活动,从而达到既定目标的一项复杂且持续的活动

架构师面对实际问题,在复杂的环境中如何做出正确的选择,如何确保架构活动顺利进行,保障项目落地,可以从目标、资源、行为、趋势这四个层面来梳理。

架构

目标

明确目标:在开始新事物时,可能需要面对各种各样的选择和挑战。在这种情况下,明确具体的目标并非易事。

  • 可实现:目标需要具有可实现性,过高或过低的目标都可能导致挫败感和疲惫。要在充分评估自己能力、资源和环境的基础上,设定合理的目标。

  • 具体、明确:目标应该具体、明确,易于衡量,以便对自己的进展进行有效跟踪和调整。将目标细化为若干小目标,有助于更好地管理和实现目标。

  • 有弹性:目标制定过程需要有一定弹性,能够应对不确定性和变化。当遇到挫折或不可预测的因素时,可以适时调整目标,以保持积极的心态和动力。

  • 持续关注和调整:目标制定并非一劳永逸,需要根据实际情况进行持续关注和调整。通过定期评估进展、学习经验教训,可以保持目标与现实的一致性,并提高实现目标的可能性。

上面4条是指导原则,实际情况更为复杂,比如技术人员通常以技术驱动去探索目标,但是它不一定适合商业活动。拿MQ的对比Kafka和Pulsar,后者相较更新、更快,技术极客们通常会毫不犹豫的选择探索后者并将它应用到实际工作中。从普适性很强的成熟方案切换到新颖高性能的方案,除了考虑切换的成本外,还要考虑切换后带来的收益,以及团队成员掌握Pulsar的成本。从发展的角度上看,除非Kafka有致命的缺陷且不被修复,那么随着时间推移Kafka可以一直演进迭代也会变得更出色。所以单纯从短期的技术先进性上看并不可取,也要关注技术的生态,这也就是常说的对技术的生态有一定的前瞻性。

结合自身的情况,在线业务为什么要切GBF,是要基于领域建设提高复用度,达到降本增效。架构活动的所有目标都是为了降本增效。切框架短期内会使业务迭代成本变高,中期途中就会陷入一个悖论:当上下游环境协调成本高时,如果从自身妥协方案,会使得US短中期成本增高,且如果没有改进的情况下无论是从US自身还是纵观全局看长期收益降低,但是又不能影响进度,或者说可不可以等时机成熟再进行,我感受到过不小的压力。

这些原则说起来比较简单:确保长期目标不动摇,临时方案做取舍。做下来就会有犯难的时候:如果临时方案做得多了容易形成包袱,影响长期收益,最终会使定制的目标打折扣。阶段目标保障和长期收益并不是完全对立的,实际工作中也会存在需要做取舍的情况,当阶段目标和长期收益出现矛盾时,需要架构人员争取资源或做好取舍。纵使做完决定选择阶段目标临时放弃长期收益时,这也只是一个短期的决定,并不能代表将来,也就是说在时机成熟的时候(例如上下游在自身的演进中做了理想态的改造),那么作为部门自身也需要时刻关注并及时跟进。

谈到取舍,深有感触:作为决策者或有决策权限的角色,在决策范围内需要做好取舍。如果当事人不做取舍,那么就只能让别人来替他做取舍。执行者大都选择丢掉休息选择加班、或者跳过总结归纳改进的环节,长此以往这种决策低效且不科学。决策人员需要做好清晰的取舍,避免无限度的索求(全都要),因为很有可能无法被完全满足,导致取舍权分散给执行者。取舍权分散给执行者有什么不妥?个人认为取舍的决策权下放分散给执行者存在问题是:执行者接触到的信息有限、经验不足易导致决策过于片面,不容易有全局观,容易做出错误的决策,项目风险加大。

资源

资源,是有限的。


作为一个架构师,要在有限的资源下最大化商业价值。如何让技术人员站在商业的角度来理解这句话?


这里描述是一项架构师参与的商业活动,既然是商业活动那么必定要有商业价值。大部分技术人员并不关注商业的价值逻辑,通常只关注技术方案是否优越,容易忽略技术方案落地过程中客观存在的资源、环境以及协作等因素。如何让技术人员理解商业价值,可以从代码和设计的三个作用来阐述:

5d39d9e089fa19ba8d6aaa4b9be95582.png技术人员主要通过上面这三个途径为公司赚钱。员工的工资和各种收入,来自于公司的商业收入和融资。

结合自身的理解,从公司到组织到个人,都有属于自身层面的商业逻辑,科学合理可持续发展的商业逻辑也是支撑公司、组织和个人发展的基础,脱离了合理商业逻辑的事物,短期内看并不一定会有明显的结果,长期看会衍生出各种各样的问题,问题的原因不仅仅归咎于问题本身及产生的过程,更深层次上看是整个的商业逻辑是否合理、可持续。

那么作为个人来讲,如何做到利用手中的资源最大化商业价值,对公司、组织、个人都能受益?

a.理解你所在的企业或团队的商业模式

b.理解你在自己所处环境中创造的商业价值

c.保障架构活动的长期商业价值

d.在架构规划中寻找扩大收入的机会

e.在架构规划中寻找减少成本的机会

前两点商业模式和商业价值,每个人的认知不一样,通俗讲就是这个公司、这项业务是不是核心、有没有前景。对于公司业务前景经常会有不同的声音,常见于新兴业务,属于仁者见仁智者见智,不过也从侧面了印证了最近比较流行的一句话:人们通常赚不到认知以外的财富。行业、企业的发展作为自然人很难影响和撼动,历史和趋势中个人只有选择的空间。

那么第三条对我们来讲说是一个长期面对的事情:当做出选择后,如何在工作中确保自己和团队都能够有持续的、足量的、正向的价值和收益。和经济学一样,技术的边际效益也是递减的,因为技术一直在发展,个人的价值和优势主要体现在增量价值上,也就是说个人通过工作创造的价值,是在平均价值之上,才能说这个人具有一定的优势。然而这些优势并不是一成不变的,因为开源的解决方案也在源源不断的提升,越来越多的人掌握,那么个人的增量价值响应的就会减少,甚至不存在。这也就需要个人不断的学习、提升自己来持续提高竞争力。

文中提到的资源和经济学中的生产资料、生产成本类似,商业价值依赖资源,商业公司和组织对员工的期望是最小成本生产最大商业价值,这些无论是从短期还是长期来看都要关注,目标过于抽象时为了避免不同的人理解不一致,可以根据每个人的环境、岗位具象专属的目标,最好是根据时间粒度分散成阶段性的目标,也就是说于员工个人而言,更多的是对阶段性精确目标的最大化投入来取得收益。目标的定制依据这里已经介绍完了。

当目标确认完后,就要奔着目标,发挥自身的最大价值。也就是两个方面:发掘机会和减少成本

机会需要发现,无论是来自于科学的数理统计、分析挖掘还是日常中的一些小Tips,都是在发掘机会。这一点我在业务侧会接触到比较多的机会,版本迭代中通常会和产品聊本次更新的动机是什么,收益在哪,作为C端的产品逻辑,除了这些收益,我们还要从用户体验出发,这些变化会给用户带来什么样的方便,以及我们会不会有额外的代价和成本。最常见的例子就是如何在有限的屏效中将活动信息、分享裂变、推荐合理的展示给用户、引导用户,以及每个模块能否让大部分用户心领神会设计的初衷,交互能否适应人群的习惯等等。但目前我还没有精力投入到指标的研究和跟踪中去分析验证,只是有兴趣,后面有机会需留意这块。

除了业务的机会,也有技术的机会。比如发现并抓住开发中遇到的痛点。很多同学在开发或推进过程中会遇到各种各样的痛点,非常多的情况就是考虑到时间、精力有限等因素后为了保障任务按期完成,选择性忽略这个痛点,当任务完成后又投入到其他事项中。这些痛点虽然造成了体感上的影响或者影响了一点点效率,但并没有被抓住解决掉,因为单论这一个问题不会被放大,也不影响KPI或OKR,痛点存在还会继续影响其他将要遇到的“幸运同学”,当忽略的次数变得多起来,量变易引发质变:框架不够好用。如何应对这种现象,个人觉得可以设计一种机制,强化痛点发现、上报、跟进、解决、反馈提升,也会从侧面提醒项目Owner除了关注任务的进度,也要关注任务完成的质量。

成本包括人力成本、时间成本、机会成本,也包括技术迁移的成本,作为架构师,需要从各类复杂成本中去衡量,按时间轴推演,保障中长期的收益。

行为

技术同学每天沉浸在逻辑中,容易陷入一个思维区域:世界由逻辑和数字主宰。合理的结构中商业活动需要和技术解耦,因为技术自身不会给企业和组织带来价值,而是大多数企业和组织作为一个平台,使用技术盈利。技术落地的过程鲜有单兵作战,大都是团队协作、组织协同。上面这句话推导的逻辑是:商业价值 --> 组织活动 --> 人在组织 --> 活动主体是人 --> 遵循人性。


提到人性,就会提马斯洛需求层次模型。尽管每个人所处的环境、接触的信息、个人的观念各有不同,需求层次模型也会有千差万别,但是从公司、组织和员工的角度来看,这一模型相对稳定清晰。动机的抢占模型也可以理解为需求的压制模型如下图:

5bd3bb9d603cfa027f1dc539d54cd03d.png

有时候任务推进会感觉到超乎寻常的艰难,合适的沟通方式表面上可以避免一些矛盾,本质上是作为被推进方,或者当事人的资源不足(例如需求排不开),通常推进方并不了解合作方的需求优先级或依赖层次,和他要配合做这件事的成本,有些事只是在推进放看来比较简单,就会有一个求证的过程,这个过程有没有必要我自己也不太清楚。当这些需求得不到满足的情况下,合作方会自动诱发动机,主导的意识和行为通常让人难以理解,遇到这种事情的解决方式是分析他的需求优先级,是否存在动机压制,以及能否协调调整优先级,改变动机压制的重要性和次序。

在最近的工作中经常遇到的一个现象是:方案可行,但是协同方没资源。因为组织的资源不单单为我所在的一个项目提供,而是要支撑当下阶段的各个目标。如何在多样目标和复杂的组织资源协调中找到最优解,是非常困难的一件事情。作为参与方,尽量去解,临时做兜底。一次次兜底就是一个个小包袱,还要不忘提醒自己包袱不要太多。

动机优先级中每个人的认知和安排是不一样的,有一个可以参照的依据:设计思维的精髓在于深度理解和尊重用户,对技术人员来讲到底是被动地迭代方案,执着于填补设计的漏洞;还是从共情用户的角度出发,脱离现有技术方案的束缚。同时忘记现有的技术方案的优势, 把关注点放在深度理解用户、解决用户的痛点上,进而拓展技术设计空间,找到更完美的技术路径。答案不言自明。

上面提到的这些只是理论,也就是我们常说的理想态,能否很好的落地就变得复杂起来,因为单纯从理论上来看这些对每个人的要求非常高,无论是职业素养还是主观能动性上,做到的都是少数。同时伴随着边际效益递减、35岁危机、996等热门社会现象,底层逻辑是人们没有安全感导致行为偏重自保,这些能不能带来商业价值是值得分析和审视的。这里提到的安全感是指能够影响人做出科学决策的环境压力,并不和居安思危中的危机感对立。

结合自己在技改项目的过程中,有同学反馈担心会失去手里的业务和之前负责的一些方向,也有同学有需求压制导致参与度不高,有的会在交谈中表达,有些虽然不明说,但种种迹象表明团队协作或工作内容没有安全感。我给出的反馈和建议是:当前目标是降本增效,业务的前景很宽广,当下还在高速发展,完全没理由缩编,但是这并不意味着可以无限度的扩张。我们需要在思考如何在不扩编的情况下更高效的做更多的事情,花更短的时间,支撑更多的行业。消除危机感的同时,还需引导良好的设计思维,刚才提到的深度理解和尊重用户,很多同学是需要这种自我满足感的,但是当节奏变得紧张、感受到环境不宽松时,这些也就随之被抛诸脑后转而去满足更原始和低层次的动机,也就是面对源源不断的需求和迭代,将任务填满日程表,从而持续不断的投入到紧张的迭代中。

顺势—天时、地利、人和

如何看清行业的周期、把握新技术。

6637b2d18d605fc9e5607f4c214f324c.png

俗话讲,你永远叫不醒一个装睡的人。是这个人不愿意醒吗?我看未必。而是人性的一些弱点导致这个人不愿意接受现实、害怕变化、对过往的路径严重依赖、或者思维僵化,导致他不想醒。自我麻痹源自处于风险或者压力下的自我保护机制:当个体面临压力、困境或威胁时,为了保护自己的心理健康和自尊,会出现一些消极的应对策略。这些策略通常表现为对现实的否认、回避或者对问题的轻视,从而使个体在心理上暂时免受困境带来的痛苦。然而,长期的自我麻痹可能导致问题恶化,无法解决现实生活中的问题,不能全力探寻新的出路,甚至用勤奋弥补内心的不安,容易陷入于目标无用的布朗运动——目标不清晰、动作不连续。

畏惧变化:当人感受到压力时,对变化感知异常慎重。在繁忙的事务中如何保持专注,历史的包袱能不能放下,如何卸载,短时间内卸载不掉那如何长线对待,如何同时支撑好业务,当同时面临这些问题时,每种取舍都有它自身的底层逻辑,当我们面向未来去思考这些问题时,就知道当下该如何选择。

对于路径依赖可以很好的用一句话解释:成功可以借鉴,但不会复刻。技术的生命周期,可以从技术社区中获取,技术的周期源于大多数人对该技术的定位。如果工程师们对这项技术不再有需求,那么这项技术的命运将会毫不犹豫的被抛弃。

对技术周期的了解作为架构师的基本功,这里不再作分析。当一个架构师的技术掌握优秀时,又要避免一个误区:拿着锤子看什么都是钉子。技术是实现商业价值的一个手段,并不是唯一路径。在这个前提下技术不能拖累商业价值的最大化。所以说架构师面对公司、组织、以及工作开展的实际情况,要选择合适的技术方案。

如何定义合适的技术方案?先看三个不同的研发活动的层次:

a5e03a0843f3d5de3c3626158e20aa8e.png

架构师在这三个层次的研发活动中侧重点是不一样的,技术驱动需要保证技术的先进性、产品驱动保障客户的体验、业务驱动保障业务指标的全盘增长。

影响技术体系建设的外部因素还有行业发展、企业内部指标的压力、组织结构的影响等等,需要架构师获取全面的信息,通盘抓重点,找到保障商业价值最大化的关键因素和节点。

总结

最近在学习郭东白的架构课,本篇文章主要是结合自身实际的经历阐述架构师定位、架构活动如何保障企业、组织实现商业价值,以及从员工层面的执行、管理角度分析各层次的定位、方向,通过这些思考总结沉淀,帮助我们在工作中更好地做技术落地和业务支撑。


推荐阅读

关注「高德技术」,了解更多

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

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

相关文章

OpenCV之怀旧色、冰冻滤镜、熔铸滤镜

怀旧色 源码&#xff1a; void huaijiu(Mat& src,Mat& dst) {for (int h 0;h < src.rows;h ){uchar *d1 src.ptr<uchar>(h);uchar *d2 dst.ptr<uchar>(h);for (int w 0;w < src.cols;w ){int w3 3*w;int r d1[w3 2];int g d1[w3 1];int …

微信小程序——生命周期详解(代码解读)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

网络请求【小程序】

一、get 二、post 1.获取相应数据 Page({/*** 页面的初始数据*/data: { inptValue:, isArr:[]},/*** 生命周期函数--监听页面加载*/onLoad(options) {},onSubmit(){// console.log(this.data.inptValue)//2.后台请求数据wx.request({url: https://tea.qingnian8.com/demoArt/…

c++静态成员变量与静态成员函数

一、静态成员变量 1、说明 1.1、所有对象共享同一份静态变量 1.2、编译阶段分配内存 1.3、类内声明&#xff0c;类外初始化操作 静态成员变量&#xff0c;不属于某个具体的类对象&#xff0c;多有的类对象共享同一份数据 因此静态成员变量有两种方式访问 2、…

java微服务项目整合skywalking链路追踪框架

skywalking官网网址&#xff1a;Apache SkyWalking 目录 1、安装skywalking 2、微服务接入skywalking 3、skywalking数据持久化 1、安装skywalking 下载skywalking&#xff0c;本篇文章使用的skywalking版本是8.5.0 Index of /dist/skywalkinghttps://archive.apache.org/…

RP-母版 流程图 发布和预览 团队项目

母版 创建一个模版&#xff0c;可根据形态不同引用不同母版。若不想母版受页面变化影响&#xff0c;也可以在引用时脱离母版 创建母版&#xff1a; 1) 转换为母版 2&#xff09;在母版页面中添加 母版拖放行为 拖放行为&#xff0c;在母版名称上右键&#xff0c; 、 任意…

MySQL里的查看操作

文章目录 查看当前mysql有谁连接查看数据库或者表 查看当前mysql有谁连接 show processlist;查看数据库或者表 列出所有数据库&#xff1a; show databases;查看正在使用的数据库&#xff08;必须大写&#xff09;&#xff1a; SELECT DATABASE();列出数据库中的表&#xf…

Vulnhub实战-prime1

前言 VulnHub 是一个面向信息安全爱好者和专业人士的虚拟机&#xff08;VM&#xff09;漏洞测试平台。它提供了一系列特制的漏洞测试虚拟机镜像&#xff0c;供用户通过攻击和漏洞利用的练习来提升自己的安全技能。本次&#xff0c;我们本次测试的是prime1。 一、主机发现和端…

写一篇nginx配置指南

nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件&#xff0c;该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织&#xff1a; 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…

Android Fragment

基本概念 Fragment是Android3.0后引入的一个新的API&#xff0c;他出现的初衷是为了适应大屏幕的平板电脑&#xff0c; 普通手机开发也会加入这个Fragment&#xff0c; 可以把他看成一个小型的Activity&#xff0c;又称Activity片段&#xff01; 如果一个很大的界面&#xff…

改进YOLOv5小目标检测:构建多尺度骨干和特征增强模块,提升小目标检测

构建多尺度骨干和特征增强模块,提升小目标检测 背景代码使用配置文件如下🔥🔥🔥 提升小目标检测,创新提升 🔥🔥🔥 测试在小目标数据集进行提点 👉👉👉: 新设计的创新想法,包含详细的代码和说明,具备有效的创新组合 🐤🐤🐤 1. 本文包含两个创新改…

[.NET 6] IHostedService 的呼叫等等我的爱——等待Web应用准备就绪

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不是技术而是人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在这篇文章中,我将介绍如何等…

C语言练习题解析(2)

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言刷题专栏&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

[论文阅读]Coordinate Attention for Efficient Mobile Network Design

摘要 最近关于移动网络设计的研究已经证明了通道注意力(例如&#xff0c; the Squeeze-and-Excitation attention)对于提高模型的性能有显著的效果&#xff0c;但它们通常忽略了位置信息&#xff0c;而位置信息对于生成空间选择性注意图非常重要。在本文中&#xff0c;我们提出…

基于SpringbootShiro实现的CAS单点登录

概述 单点登录&#xff08;Single Sign On,SSO&#xff09;是一种登录管理机制&#xff0c;主要用于多系统集成&#xff0c;即在多个系统中&#xff0c;用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个&#xff0c;无须多次登录。常见的例子就是&#xff0c;…

Redis缓存

1. Redis缓存相关问题 1.1 缓存穿透 缓存穿透是指查询一个数据库一定不存在的数据。 我们以前正常的使用Redis缓存的流程大致是&#xff1a; 1、数据查询首先进行缓存查询 2、如果数据存在则直接返回缓存数据 3、如果数据不存在&#xff0c;就对数据库进行查询&#xff0…

企业级数据仓库-数仓实战

数仓实战 安装包大小 安装清单 环境搭建 一、环境搭建01&#xff08;机器准备&#xff09; 准备好三台虚拟机&#xff0c;并进行修改hostname、在hosts文件增加ip地址和主机名映射 。 1、设置每个虚拟机的hostname vi /etc/sysconfig/network 修改HOSTNAMEnode02修改hostna…

Llama2-Chinese项目:2.2-大语言模型词表扩充

因为原生LLaMA对中文的支持很弱&#xff0c;一个中文汉子往往被切分成多个token&#xff0c;因此需要对其进行中文词表扩展。思路通常是在中文语料库上训练一个中文tokenizer模型&#xff0c;然后将中文tokenizer与LLaMA原生tokenizer进行合并&#xff0c;最终得到一个扩展后的…

Docker网络学习

文章目录 Docker容器网络1.Docker为什么需要网络管理2. Docker网络简介3. 常见的网络类型4. docker 网络管理命令5.两种网络加入差异6.网络讲解docker Bridge 网络docker Host 网络docker Container 网络docker none 网络 Docker容器网络 1.Docker为什么需要网络管理 容器的网…

自动生成bug异常追踪-SRE与开发自动化协同

作者&#xff1a;观测云 数据智能部 产品方案架构师 范莹莹 简介 生产环境 bug 的定义&#xff1a;RUM 应用和 APM 应用的 error_stack 信息被捕捉后成为 bug。 以 APM 新增错误巡检为例&#xff0c;当出现新错误时&#xff0c;在观测云控制台的「事件」模块下生成新的事件报…