程序员到架构师,架构模型不能脱离实际代码

文章目录

  • 前言
  • 一、现实场景中的架构师
  • 二、设计贴合实际的模型


前言

想象一下,现在的软件开发越来越被当成工厂的流水线,经验丰富的架构师仿佛是那些精心设计模具的老师傅,而技能水平较低的工人则负责在流水线上把原材料倒进模具里,期待着成品出现。但是,现实远非如此简单。

这种思维模式,就好比是让米其林大厨只负责菜单设计,而让实习生去实际烹饪,结果往往是菜肴难以入口,顾客抱怨连连。因为软件开发的本质,就像是烹饪一道精致的法式大餐,每一步都充满了创意与精细的调整,每一环节都需要那份匠心独运。

尽管开发团队中每位成员都扮演着各自的关键角色,但如果我们把软件开发中的分析、建模、设计和编程工作看作是孤立无关的环节,就像是把烹制美食的过程拆分成买食材、洗菜、切菜和炒菜四个完全不相干的任务,最终得到的可能只是一顿杂乱无章的快餐,而非那令人垂涎三尺的佳肴。

因此,过度分离这些环节,不仅会破坏模型驱动设计(MODEL-DRIVEN DESIGN)的和谐,也会让我们的项目像是一艘没有舵手的船,失去了前进的方向,最终搁浅在困境的沙滩上。


一、现实场景中的架构师

在我任职的一家企业中,架构师与开发人员分属不同部门,各司其职。架构师们认为自身的主要任务在于架构设计与模型构建,对于编写业务代码、钻研业务细节则视为无谓的消耗,于是他们的日常便是沉浸在设计架构与模型构建中,随后召集开发人员举行一场讲解会,便视为任务基本完成。然而,随着项目进入迭代阶段,许多前期精心规划的模型并未发挥预期作用,甚至与原始设计背道而驰。

为找出症结所在,我们拉着开发人员一同讨论,归纳出两大主要原因:

首要问题在于模型的意图在传递过程中出现了断层。一个模型的实效性往往取决于那些藏匿于细微之处的设计意图,它们并不总是能在UML图表或常规讨论中清晰显现。若架构师能放下“设计师”的身段,实实在在地与开发人员并肩协作,亲手写下一些业务代码,或提供面对面的技术支持,或许能帮助开发人员更好地领悟模型中的抽象理念,进而依此进行有效开发。

其次,模型与实现过程以及技术环境间的互动反馈机制缺失。现实中,模型设计与具体技术实现应当是相互影响、密切联动的,但实际情况却好似两者在各自的世界里各行其是。举例来说,开发人员在实际操作中发现模型某部分在当前业务平台上运行效率极低,然而从发现问题到架构师全面了解到这一情况,竟耗去了数月之久。令人惋惜的是,待问题全貌浮出水面时,开发人员已自行完成了软件的开发工作,这套软件完全脱离了原有模型的框架,即便在尚存使用模型的部分,也只是将其简化为单纯的数据结构。面对这样的境况,开发人员虽对模型有所诟病,却也是无奈之举,毕竟他们不愿再冒险接受“象牙塔”中架构师的远程指挥,而选择脚踏实地解决问题。

二、设计贴合实际的模型

在软件的世界里,一个优秀的领域模型就像是一位经验丰富的向导,带领开发人员在复杂系统的密林中找到前进的道路。但是,如果这位向导只是纸上谈兵,对实际地形一无所知,那他的地图也就只能是一张废纸。因此,我们的模型必须与现实世界的代码紧密相连,否则它们就像是那些脱离现实的乌托邦,看似美好却无法触及。

想象一下,如果我们的程序设计和核心部分与领域模型毫无关联,那么这个模型就像是一座空中楼阁,虽然高耸入云,却无法为我们的软件开发提供坚实的基础。这样的模型不仅无法保证软件的正确性,反而会让我们的项目陷入困境。同时,过于复杂的模型和设计功能对应关系就像是一团乱麻,难以理清,当设计发生改变时,这样的关系更是难以维护。

在分析和设计之间,我们不能有鸿沟。分析工作要深入挖掘领域的基础概念,用简洁明了的方式表达出来;而设计工作则需要确定一套能够由项目中的编程工具创建的组件,让项目在目标部署环境中高效运行,并解决实际问题。这样,我们的模型才能够成为连接分析与设计的桥梁,而不是隔阂。

模型驱动设计(Model-Driven Design)的理念就是将分析模型和程序设计紧密结合,寻求一种能够满足双方需求的单一模型。在这个模型中,每个程序设计对象都应反映模型中描述的概念,这就要求我们在选择模型时要有更高的标准,因为它必须满足两种完全不同的目标。

抽象领域的方法有很多,解决问题的设计也千变万化。但我们不能因为技术考虑而牺牲分析的功能,也不能接受那些只反映了领域概念却舍弃了软件设计原则的拙劣设计。我们需要的是一种在分析和程序设计阶段都能发挥良好作用的模型。如果模型在实现层面显得不实用,我们必须重新设计它;如果模型无法忠实地描述领域的关键概念,我们同样需要重新设计它。这样,建模和程序设计就结合为一个统一的迭代开发过程。

在这个过程中,我们不仅要确保软件系统的各个部分设计能够忠实地反映领域模型,还要反复检查和修改模型,以便软件能够更自然地实现模型。即使我们想要模型反映出更深层次的领域概念,也应如此。我们需要的模型不仅要满足这两种需求,还要能够支持健壮的团队通用语言(Ubiquitous Language),让我们从模型中获取用于程序设计和基本职责分配的术语。

让程序代码成为模型的表达,代码的改变可能意味着模型的改变,这种影响必将波及接下来相应的项目活动。依赖模型的实现通常需要支持建模范式的软件开发工具和语言,比如面向对象的编程。这样,我们的模型才能真正成为指导我们前进的灯塔,照亮软件开发的道路。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python基础知识—运算符和if语句(二)

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》 《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 1.输入和输出函数1.1输出函数1.2输入函数 2.常见运算符2.1赋值运算符2.2比较运算符2.3逻辑运算符2.4and逻辑与2.5or逻辑或2.6not逻…

Java后台开发的前置说明

1.知识点逻辑 一个部分 都是先挑重点知识点讲解 然后根据这些重点知识点去完成一个项目的开发 然后在到返回来解决这个部分其他细枝末节的知识点 2.软件开发的分工 我们大致可以将软件开发分成四块: 1.前端开发(比如开发电脑中的京东 htmlcssjavascript) 2.移动开…

Springboot3集成Web、RedisTemplate、Test和knife4j

本例将展示&#xff0c;如何在Springboot3中完成&#xff1a; Redis功能的Web接口实现构建Redis功能的单元测试knife4j自动化生成文档 Redis功能 Pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

【EdgeBox-8120AI-TX2】Ubuntu18.04 + ROS_ Melodic + 星秒PAVO2单线激光 雷达评测

大家好&#xff0c;我是虎哥&#xff0c;好久不见&#xff0c;最近这断时间出现了一点变故&#xff0c;开始自己创业&#xff0c;很多事需要忙&#xff0c;所以停更了大约大半年&#xff0c;最近一切已经理顺&#xff0c;所以我还是抽空继续我之前的FLAG&#xff0c;CSDN突破十…

Hadoop伪分布式平台搭建

搭建Hadoop伪分布式环境是在单台机器上模拟完整的Hadoop分布式系统&#xff0c;使得所有的Hadoop守护进程&#xff08;如NameNode、DataNode、ResourceManager、NodeManager等&#xff09;都在同一台机器上运行。这样可以在一台机器上体验Hadoop的分布式特性&#xff0c;适合学…

《AI极简经济学》|揭开AI面纱,普通人的机遇与挑战

《AI极简经济学》一书由经济学家阿杰伊阿格拉沃尔、乔舒亚甘斯和阿维戈德法布联袂撰写&#xff0c;他们共同创立了创新颠覆实验室&#xff08;Creative Destruction Lab&#xff0c;简称CDL&#xff09;&#xff0c;实验室的研究领域主要集中在人工智能和决策领域。他们通过《A…

java 词法分析练习

import parser.Parser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arrays.asList("int","String…

汽车组装3D电子说明书更通俗易懂

激光打印机由于造价高、技术更先进&#xff0c;因此在使用和维护上需要更专业的手法&#xff0c;而对于普通客户来说并不具备专业操作激光打印机的技能&#xff0c;为了通俗易懂地让客户理解激光打印机&#xff0c;我们为企业定制了激光打印机3D产品说明书&#xff0c;将为您带…

Trello与Notion的开源替代项目管理利器Focalboard本地安装与远程访问

本篇文章将介绍如何使用 Docker 本地部署 Focalboard 项目管理工具&#xff0c;并且结合 cpolar 内网穿透进行公网访问&#xff0c;实现团队协作&#xff0c;提高工作效率&#xff01; Focalboard 是一个开源项目管理工具&#xff0c;可以替代 Asana、Trello 和 Notion 等软件…

软件项目交付支撑文档有哪些?文档下载获取

软件文档交付清单是指在软件开发项目完成后&#xff0c;开发团队需要准备的一份详细清单&#xff0c;用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件开发文档&#xff1a;这包括需求文档、设计文档、测试文档等…

SignalR中的重连机制和心跳监测机制详解

一. 重连机制 声明&#xff1a;   本节仅介绍重连机制和心跳监测机制&#xff0c;基于Core 3.1框架&#xff0c;至于SignalR其它的一些基本使用&#xff0c;包括引入、Hub、配置等常规操作&#xff0c;在本节中不介绍&#xff0c;后续写Core下的SignalR 说明   默认是没有重…

Linux抓包工具tcpdump

一、tcpdump抓包工具 1.命令格式解析 命令格式&#xff1a;tcpdump option proto dir type proto&#xff08;协议&#xff09; 1.tcp、udp、icmp 2.ip、ipv6 3.arp dir&#xff08;数据的方向 &#xff09; 1.src 192.168.7.130 只抓取源地址是7.130 2.…

【数学建模】DVD在线租赁

2005高教社杯全国大学生数学建模竞赛题目B 随着信息时代的到来&#xff0c;网络成为人们生活中越来越不可或缺的元素之一。许多网站利用其强大的资源和知名度&#xff0c;面向其会员群提供日益专业化和便捷化的服务。例如&#xff0c;音像制品的在线租赁就是一种可行的服务。这…

A Survey of State of the Art on Rumor Detection in Social Network

Abstract 互联网上充斥着谣言帖子&#xff0c;谣言的传播会给社会和谐稳定带来负面影响&#xff0c;影响网络信息生态的健康发展。谣言的不确定性、时效性、主观性等特点&#xff0c;使其不同于一般的虚假网络信息。社交网络谣言检测是社交网络与信息传播研究领域的热点问题&am…

Linux 调度优先级

Linux中的每个任务都有其优先级。这个优先级的范围从-20到19。优先级越低&#xff08;-20&#xff09;&#xff0c;分配 给任务的CPU时间就越多。默认的优先级是0。 并非所有的任务都需要使用相同的优先级。交互式应用要求快速响应&#xff0c;通过 crontab 运行的后台…

Java本地缓存技术选型(Guava Cache、Caffeine、EhCache)

前言 对一个java开发者而言&#xff0c;提到缓存&#xff0c;第一反应就是Redis。利用这类缓存足以解决大多数的性能问题了&#xff0c;我们也要知道&#xff0c;这种属于remote cache&#xff08;分布式缓存&#xff09;&#xff0c;应用的进程和缓存的进程通常分布在不同的服…

Web3技术解析:区块链在去中心化应用中的角色

引言 在过去几年中&#xff0c;Web3技术已经成为了互联网领域的一个热门话题。作为区块链技术的延伸&#xff0c;Web3不仅仅是数字货币的代名词&#xff0c;更是一个能够为各种应用提供去中心化解决方案的强大工具。本文将深入探讨区块链在Web3去中心化应用中的关键角色&#…

贪心算法在找零问题中的应用

贪心算法在找零问题中的应用 引言a. 贪心算法求解找零问题算法设计算法证明 b. 硬币面额为c的幂时的贪心算法证明算法设计算法证明 c. 设计使贪心算法失效的硬币面额组合d. 通用找零算法设计算法设计算法实现&#xff08;伪代码&#xff09;算法实现&#xff08;C代码&#xff…

【热门话题】PostCSS:现代前端开发中的CSS增强工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 PostCSS&#xff1a;现代前端开发中的CSS增强工具一、引言二、PostCSS简介2.1 核…

【树莓派4B】如何点亮树莓派的LED灯

在之前一系列文章中&#xff0c;使用python、行人入侵检测&#xff0c;确没有使用树莓派的硬件。控制引脚进行输出&#xff1a; 如何写python点亮led灯闪烁&#xff0c;我灯接在gpio13,GPIO19,gpio26。我都想闪烁。 你可以使用Python的GPIO库来控制树莓派上的LED灯。首先&…
最新文章