关于系统设计的一些思考
0.前言
当我们站在系统设计的起点,面对一个新的需求,我们该如何开始呢?这是许多处于系统分析与设计领域的新手常常思考的问题。有些人可能会误以为,只要掌握了诸如面向对象
、统一建模语言
、设计模式
、微服务
、Serverless
、ServiceMesh
、DDD
这样的标准方法论或新潮或深奥的理论,就能顺利地进行设计了。然而,经过实践我们会发现很多系统设计都是要对具体情况进行详细的权衡分析。我要说,虽然这些工具、方法、技能很重要,但它们绝不是成为优秀设计师的充分或是必要条件。无数的实践告诉我,没有捷径可走,唯有在实践中不断地学习、总结、反思,我们才能真正地成长。
在这个过程中,我们会发现,系统设计更多的是一种选择和妥协
。其实小到一件事情,大到人生抉择,无外乎都是在选择和妥协中寻找一种平衡点。做系统设计也一样。所以了解架构评估的同学肯定会想到架构评估中的一种j经典评估方法,ATAM(架构权衡评估方法)
.。此处不做赘述。
有的观点可能是基于作者的经历整理,可能存在局限性,大家可以求同存异。不喜可以略过后面的了
1. 妥协:寻找平衡点
那么我们如何做到妥协,寻找到合适的平衡点呢
系统设计的目标众多,包括但不仅限于功能、性能、健壮性、开发周期、交付日期等。这些目标往往很多时候是矛盾的
。不要一上来就说你的服务如何划分,你的健壮性如何稳定,你打算做的技术选型多么先进,不要认为自身已经学了很多主流的架构设计和各种技术架构,就能搞成很优秀的系统,永远不要追求所谓的什么优秀,除非单纯的是为了KPI。因为优秀只是可以讲出来的炫耀。而真正合适才是系统设计最终要表达的。
例如,你可能会发现,提高软件性能往往会导致开发周期的延长、交付日期的推迟;盲目地增加功能可能会导致性能降低、维护成本增加。这时,我们需要在这些众多的目标中找到一个平衡点,明确知道如何设计能实现这个平衡。这个平衡点应该是公司或客户都能接受的。在可行性分析阶段,我们通常会论述这样一个平衡点。但是,如果我们发现没有这样一个平衡点,那么我们可能需要重新思考需求,提出放弃某个方面的过度要求,否则系统将很可能失败。
甚至我们如果做项目,我们评估的工时为300人天,根据目前的资源评估,需要2个月交付。但是客户要求1个月内交付。这种情况下,我们如何做系统设计。通常一般供应商标准的如下
- 减少功能复杂度
- 风险评估
- 寻求外包或合作
- 调整开发计划项目组加班工作
.通常还有一种策略叫做客户教育
。其实就是向客户解释为什么项目需要300人天的工作量,并且你需要列举出很多权衡点。让他们理解项目复杂性和所需工作量之间的关系,以及为什么压缩进度可能会影响交付结果,把权衡点的妥协达成变成和客户一起完成的,这样客户的期待和项目本身的预期在前期就有了共识。
2. 学习
了解和选择解决方案
系统设计是一个复杂的过程,需要深厚的专业知识和丰富的实践经验。需要了解各种可以解决问题的方案,并清楚知道各个方案的效果、成本、缺点,以及这些方案的区别,然后从中作出最佳选择。这不是一个人能在一两天内完成的,需要长时间的学习和实践。
3. 借鉴
站在巨人的肩膀上
我们常常需要参考其他与目标系统相类似的系统,对其中的内容进行筛选、取舍和补充,以此作为新系统的设计。这并不是因为我们缺乏创新,而是因为我们需要站在巨人的肩膀上,借鉴前人的经验和智慧,避免重复犯错误。
4. 规律
系统设计的几个要点
尽管系统设计的过程中充满了困扰和挑战,但是也并非没有规律可循。我发现,优秀的系统设计通常在以下几个方面表现出色:
- 组件的独立性。审视自己设计的系统,是否做到了高内聚、低耦合?
- 例外的识别和处理。我们不能期待用户会完全按照说明书操作,系统应该能够正确处理各种例外情况。
- 防错和容错。当网络中断、数据库崩溃这样的灾难性事件发生时,我们的系统也能稳定运行吗?
此外,我也发现了一些技术和方法能够有效改进系统设计,包括降低复杂性、通过合约进行设计、原型化设计、错误树分析等。
总的来说,系统设计是一项挑战和机遇并存的工作。我希望,通过分享我的一些想法和经验,能够帮助到正在走在这条路上的你。让我们一起在实践中学习,一起在挑战中成长,成为优秀的系统设计师。
从需求到表示的艺术
软件设计是一门结合技术与艺术的学问,它要求我们将抽象的软件需求转化为具体的软件表示形式。这个过程像是在绘制一幅蓝图,我们最初描绘出软件的总体框架,然后逐步细化,直至在这个框架中填满每一个细节。通过这样的艺术创作,我们才能实现功能强大、性能优异、用户友好的软件产品。让我们来共同探讨软件设计的两个阶段以及一些主要的设计方法。
软件设计的两个阶段
从工程管理的角度来说,我观察到软件设计过程中可以明显区分出两个阶段:
-
概要设计:也被称为高层设计。在这一阶段,设计师的任务是将软件需求转化为数据结构和软件的系统结构。如果我们采用的是结构化设计方法,那么我们会从一个宏观的角度将软件划分成各个组成模块,并且确定这些模块的职责以及模块之间的调用关系。这一步骤的完成标志着软件设计的框架已经搭建完成。
-
详细设计:亦称为低层设计。这一阶段,我们对概要设计中的结构表示进行更进一步的细化,这包括定义详细的数据结构以及算法的实现方式。在此基础上,如果还是采用结构化设计,那么详细设计的任务就是为每一个模块具体化设计,确保整个系统的每个部分都有明确和可执行的设计方案。
主要的设计方法比较
在结构化设计方法盛行的年代,设计师们有多种设计技术可以选择。其中包括Jackson方法和Parnas方法。结构化设计方法强调模块的独立性和功能的单一性,致力于使模块间的联系尽量弱化而模块内部的联系紧密。而Jackson方法的独到之处在于,它从数据结构出发,导出相应的模块结构。Parnas方法则把重点放在抽象的概念上,其核心思想是封装变化,将容易变化的因素隐藏在模块内部,这样当这些因素发生变化时,对系统的影响可以被局限在最小范围。Parnas方法给出了一些重要的设计准则,虽然它没有提供具体的工作步骤,但它的影响仍然深远。
而在近年来,随着对象技术的崛起,这一方法凭借其对数据的高效封装能力和良好的消息机制,实现了高内聚、低耦合的系统设计,逐渐成为现代软件设计的主流方法学。对象技术不仅促进了软件模块化,而且还提高了代码的重用性,使得软件开发更加高效、系统更加稳定。
在软件设计的世界里,无论是传统的结构化方法还是现代的对象技术,都有其独特的价值和适用场景。作为设计师,我们需要根据项目的具体需求、团队的技术背景以及项目的预算情况来选择最合适的设计方法,以确保软件设计的成功。最终,无论我们采取哪种方法,软件设计的本质始终是将用户的需求转化为一个可以工作的软件系统,这是一个既需要科学性也需要创造性的挑战过程。
相关文章:
关于系统设计的一些思考
0.前言 当我们站在系统设计的起点,面对一个新的需求,我们该如何开始呢?这是许多处于系统分析与设计领域的新手常常思考的问题。有些人可能会误以为,只要掌握了诸如面向对象、统一建模语言、设计模式、微服务、Serverless、Servic…...
Java 第19章 IO流 课堂练习+本章作业
文章目录 Buffered流拷贝二进制文件创建文件写入文本读取文本文件存读Properties文件 Buffered流拷贝二进制文件 package com.hspedu.chapter19.outputStream;import java.io.*;public class BufferedCopy02 {public static void main(String[] args) {String srcFilePath &q…...
一键制作电子样册,提升企业品牌形象
电子样册作为一种新型的宣传方式,具有许多优势。首先,它打破了传统纸质宣传册的局限性,可以随时随地展示企业的产品和服务。其次,电子样册可以通过多媒体形式展示企业的品牌形象,包括图片、视频、文字等多种形式&…...
Linux 的引导与服务控制
一 开机启动过程 bios加电自检-->mbr-->grub-->加载内核文件-->启动进程 1 bios家电自检 检测硬件是否正常,然后根据bios中的启动项设置,去找内核文件 2 mbr 因为grup太大,第一个扇区存不下所有的grub程序,所以分为2部分指…...
多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测
多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测 目录 多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入…...
高端电流检测方案
随着过去传统的“开环”系统被智能和高效率“闭环”设计所取代,准确的电流检测在多种应用中变得越来越重要。常见的电流检测方法,需要将检流电阻串联进被测电流通路,再用放大电路放大检流电阻上的压降。这个放大电路常被称之为电流检测放大器…...
IP地址、子网掩码与网络地址
一、IP地址 在 TCP/IP 体系中,IP 地址是一个最基本的概念。IP地址的作用:实现和网上的其他设备进行通信 IP地址的表示方法 互联网上的每台主机(或路由器)的每个接口都分配一个全世界唯一的IP地址。该IP地址由ICANN分配。 IP地址…...
python 深度学习 记录遇到的报错问题10
本篇继python 深度学习 解决遇到的报错问题9_module d2l.torch has no attribute train_ch3-CSDN博客 一、CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stackt…...
linux下docker搭建Prometheus +SNMP Exporter +Grafana进行核心路由器交换机监控
一、安装 Docker 和 Docker Compose https://docs.docker.com/get-docker/ # 安装 Docker sudo apt-get update sudo apt-get install -y docker.io# 安装 Docker Compose sudo apt-get install -y docker-compose二、创建配置文件及测试平台是否正常 1、选个文件夹作为自建…...
Github 2023-12-31 开源项目日报 Top10
根据Github Trendings的统计,今日(2023-12-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3Swift项目1Java项目1HTML项目1Astro项目1Python项目1C项目1Dart项目1Jupyter Notebook项目1C项…...
管程-第三十三天
目录 为什么要引入管程 管程的定义和基本特征 用管程解决生产者消费者问题 结论 本节思维导图 为什么要引入管程 原因:在解决进程的同步与互斥问题时,信号量机制存在编写困难和易出错的问题 能不能设计一种机制,让程序员写程序时不再需…...
嵌入式中断理解
一、概念 中断: 在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。 中断优先级&#x…...
React16源码: Hooks源码实现
Hooks 1 )概述 Hooks 在 React16.7版本出现的新功能Hooks 改变了整体应用开发的模式,同时开发体验会和以前会变得不一样Hooks 让函数组件具有类组件的能力 在 function component 里面没有this无法保存 state通过 Hooks可以让 function component 代替…...
华为端口隔离高级用法经典案例
最终效果: pc4不能ping通pc5,pc5能ping通pc4 pc1不能和pc2、pc3通,但pc2和pc3能互通 vlan batch 2 interface Vlanif1 ip address 10.0.0.254 255.255.255.0 interface Vlanif2 ip address 192.168.2.1 255.255.255.0 interface MEth0/0/1 i…...
java项目启动jar包启动参数设置端口号
默认启动 java -jar myapp.jar 指定配置文件 java -jar myapp.jar --spring.profiles.activedev 指定端口号 java -jar myapp.jar --server.port8080 后台启动 nohup java -jar myapp.jar --server.port8080 >outlog.log 2>&1 &...
【数据结构和算法】寻找数组的中心下标
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…...
多粒度在研究中的应用
FontDiffuser: One-Shot Font Generation via Denoising Diffusion with Multi-Scale Content Aggregation and Style Contrastive Learning 存在的问题 现有的字体生成方法虽然取得了令人满意的性能,但在处理复杂字和风格变化较大的字符(尤其是中文字符)时&#x…...
Docker命令---查看容器日志
介绍 使用docker命令查看容器输出的日志 示例 docker logs 容器ID...
Spring Boot 基于Redisson实现注解式分布式锁
依赖版本 JDK 17 Spring Boot 3.2.0 Redisson 3.25.0 源码地址:Gitee 导入依赖 <properties><redisson.version>3.25.0</redisson.version> </properties><dependencies><dependency><groupId>org.projectlombok</…...
Javascript 正则表达式零宽断言
在介绍正则表达式零宽断言这个概念之前,先看一下以下这道有关 javascript 正则表达式的题目: 登录注册流程是前端最常见的业务流程之一,注册流程少不了密码强弱度校验,请实现对密码的校验,要求满足: 包含大…...
Chocolatey
Chocolatey Software | PHP (Hypertext Preprocessor) 8.3.1 msi安装包https://github.com/chocolatey/choco/releases/download/2.2.2/chocolatey-2.2.2.0.msi 设置/安装 巧克力味Chocolatey CLI (choco)设置/安装 要求 受支持的 Windows 版本Windows …...
雍禾植发成毛发行业标杆!雍禾医疗获“年度医疗大健康消费企业”
近期,以“新视野 新链接”为主题的2023 EDGE AWARDS全球创新评选榜单正式发布。该评选由钛媒体发起,聚焦大健康产业,由权威行业专家、王牌分析师、专业投资机构、用户代表共同评审,兼顾综合专业性、影响力、创新性三大维度评选而出…...
Linux内核--进程管理(十二)共享内存和信号量
目录 一、引言 二、基础知识 三、统一封装的接口 ------>3.1、kern_ipc_perm 四、共享内存的创建和映射 ------>4.1、创建共享内存 ------>4.2、共享内存的映射 五、信号量的创建和使用 ------>5.1、信号量的创建 ------>5.2、信号量的初始化 ------…...
java 构造方法
构造方法 1、什么是构造方法,有什么用? 构造方法是一个比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化。 换句话说:构造方法是用来创建对象,并且同时给对象的属性赋值。 注意&#x…...
CISSP 第2章: 人员安全和风险管理概念
第二章 人员安全和风险管理概念 2.1 促进人员安全策略 构建工作描述方面的重要因素包括: 职责分离: 把关键的、重要的和敏感工作任务分配给若干不同的管理员或高级执行者,防止共谋 工作职责:最小特权原则 岗位轮换:提供知识冗余,减少伪造、数据更改、偷…...
前端八股文(CSS篇)一
目录 1.px和em的区别 2.介绍下BFC及其应用 3.介绍下粘性布局(sticky) 4.清除浮动的方法 5.如何用css或js实现多行文本溢出省略效果,考虑兼容 6.如何触发重排和重绘? 7.重绘与重排的区别? 8.说说两种盒模型以及区…...
游戏加速器LSP/DLL导致WSL.EXE无法打开问题修复!
解决办法: https://github.com/microsoft/WSL/issues/4177#issuecomment-597736482 方法一:(管理员身份) netsh winsock reset 方法二: WSCSetApplicationCategory 函数设置LSP加载权限 bool NoLsp(const wchar_t* …...
宏电股份5G RedCap终端产品助力深圳极速先锋城市建设
12月26日,“全城全网,先锋物联”深圳移动5G-A RedCap助力深圳极速先锋城市创新发布会举行,宏电股份携一系列5G RedCap终端产品应邀参与创新发布会,来自全国5G生态圈的各界嘉宾、专家学者济济一堂,共探信息化数字化创新…...
linux top命令中 cpu 利用率/mem 使用率与load average平均负载计算方式
文章目录 1 简介2 CPU% 字段3 MEM% 字段4 load average 平均负载 1 简介 top 命令是 Linux 上一个常用的系统监控工具,它经常用来监控 Linux 的系统状态,是常用的性能分析工具,能够显示较全的系统资源信息,包括系统负载ÿ…...
win11出现安全中心空白和IT管理员已限制对某些区域的访问(不一样的解决方式),真实的个人经历,并且解决经过
1、个人的产生问题的经历 2023年12月22日,由于我买了一块电脑的固态硬盘1T,想要扩容,原来电脑自带512G(由于个人是一个程序员,导致512G实在太古鸡肋)装好以后,想要重装一下系统,来个大清理。结果不出意料&…...
wordpress文章meta/自己怎么做引流推广
一个朋友是前阿里人,37岁,离职后就职美团。以前投一个面一个,今年想跳槽,但没想到投十个能有两个面试机会就不错了,最后索性又回了阿里做架构。 他在面试的时候,碰见比自己大的面试官,态度和善&…...
随州网站设计开发服务/电商怎么做营销推广
*.settings bin gen .classpath .project *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store...
网络推广教育机构/seo网页优化工具
1: 查询错误日志地址show variables like log_error;2:查询慢查询是否开启show variables like log_slow_queries;3:查询慢查询时间show variables like long_query_time;4:设置慢查询[mysqld]slow_query_logonlog_slow_queriesonslow_launch…...
企业品牌logo设计/关键词优化公司前十排名
React中为什么要使用bind? 函数传参 比如在一个组件中,有一个点击事件,当点击时触发一个方法,onClick{ this.fun },能达到我们的目的,触发了方法,执行了函数里的代码,但是有一个问…...
深一网站建设/十大免费无代码开发软件
早晨起床时间:12:30 晚上休息时间:0:28 今日总结:休息中。...
wordpress页面显示返回json/福州seo公司排名
因为是刚开始使用框架,连接数据库报了一堆错,所以上网搜了很多的相关教程,还是没解决问题,后来才发现是两个很简单的问题:一个是连接数据库的url的端口是3306,和tomcat的8080弄混了,一直写的808…...