关于系统设计的一些思考

0.前言

当我们站在系统设计的起点,面对一个新的需求,我们该如何开始呢?这是许多处于系统分析与设计领域的新手常常思考的问题。有些人可能会误以为,只要掌握了诸如面向对象统一建模语言设计模式微服务ServerlessServiceMeshDDD 这样的标准方法论或新潮或深奥的理论,就能顺利地进行设计了。然而,经过实践我们会发现很多系统设计都是要对具体情况进行详细的权衡分析。我要说,虽然这些工具、方法、技能很重要,但它们绝不是成为优秀设计师的充分或是必要条件。无数的实践告诉我,没有捷径可走,唯有在实践中不断地学习、总结、反思,我们才能真正地成长。

在这个过程中,我们会发现,系统设计更多的是一种选择和妥协。其实小到一件事情,大到人生抉择,无外乎都是在选择和妥协中寻找一种平衡点。做系统设计也一样。所以了解架构评估的同学肯定会想到架构评估中的一种j经典评估方法,ATAM(架构权衡评估方法).。此处不做赘述。
在这里插入图片描述

有的观点可能是基于作者的经历整理,可能存在局限性,大家可以求同存异。不喜可以略过后面的了

1. 妥协:寻找平衡点

那么我们如何做到妥协,寻找到合适的平衡点呢

系统设计的目标众多,包括但不仅限于功能、性能、健壮性、开发周期、交付日期等。这些目标往往很多时候是矛盾的。不要一上来就说你的服务如何划分,你的健壮性如何稳定,你打算做的技术选型多么先进,不要认为自身已经学了很多主流的架构设计和各种技术架构,就能搞成很优秀的系统,永远不要追求所谓的什么优秀,除非单纯的是为了KPI。因为优秀只是可以讲出来的炫耀。而真正合适才是系统设计最终要表达的。

例如,你可能会发现,提高软件性能往往会导致开发周期的延长、交付日期的推迟;盲目地增加功能可能会导致性能降低、维护成本增加。这时,我们需要在这些众多的目标中找到一个平衡点,明确知道如何设计能实现这个平衡。这个平衡点应该是公司或客户都能接受的。在可行性分析阶段,我们通常会论述这样一个平衡点。但是,如果我们发现没有这样一个平衡点,那么我们可能需要重新思考需求,提出放弃某个方面的过度要求,否则系统将很可能失败。

甚至我们如果做项目,我们评估的工时为300人天,根据目前的资源评估,需要2个月交付。但是客户要求1个月内交付。这种情况下,我们如何做系统设计。通常一般供应商标准的如下

  1. 减少功能复杂度
  2. 风险评估
  3. 寻求外包或合作
  4. 调整开发计划项目组加班工作

.通常还有一种策略叫做客户教育。其实就是向客户解释为什么项目需要300人天的工作量,并且你需要列举出很多权衡点。让他们理解项目复杂性和所需工作量之间的关系,以及为什么压缩进度可能会影响交付结果,把权衡点的妥协达成变成和客户一起完成的,这样客户的期待和项目本身的预期在前期就有了共识。

2. 学习

了解和选择解决方案

系统设计是一个复杂的过程,需要深厚的专业知识和丰富的实践经验。需要了解各种可以解决问题的方案,并清楚知道各个方案的效果、成本、缺点,以及这些方案的区别,然后从中作出最佳选择。这不是一个人能在一两天内完成的,需要长时间的学习和实践。

3. 借鉴

站在巨人的肩膀上

我们常常需要参考其他与目标系统相类似的系统,对其中的内容进行筛选、取舍和补充,以此作为新系统的设计。这并不是因为我们缺乏创新,而是因为我们需要站在巨人的肩膀上,借鉴前人的经验和智慧,避免重复犯错误。

4. 规律

系统设计的几个要点

尽管系统设计的过程中充满了困扰和挑战,但是也并非没有规律可循。我发现,优秀的系统设计通常在以下几个方面表现出色:

  • 组件的独立性。审视自己设计的系统,是否做到了高内聚、低耦合?
  • 例外的识别和处理。我们不能期待用户会完全按照说明书操作,系统应该能够正确处理各种例外情况。
  • 防错和容错。当网络中断、数据库崩溃这样的灾难性事件发生时,我们的系统也能稳定运行吗?

此外,我也发现了一些技术和方法能够有效改进系统设计,包括降低复杂性、通过合约进行设计、原型化设计、错误树分析等。

总的来说,系统设计是一项挑战和机遇并存的工作。我希望,通过分享我的一些想法和经验,能够帮助到正在走在这条路上的你。让我们一起在实践中学习,一起在挑战中成长,成为优秀的系统设计师。

从需求到表示的艺术

软件设计是一门结合技术与艺术的学问,它要求我们将抽象的软件需求转化为具体的软件表示形式。这个过程像是在绘制一幅蓝图,我们最初描绘出软件的总体框架,然后逐步细化,直至在这个框架中填满每一个细节。通过这样的艺术创作,我们才能实现功能强大、性能优异、用户友好的软件产品。让我们来共同探讨软件设计的两个阶段以及一些主要的设计方法。

软件设计的两个阶段

从工程管理的角度来说,我观察到软件设计过程中可以明显区分出两个阶段:

  1. 概要设计:也被称为高层设计。在这一阶段,设计师的任务是将软件需求转化为数据结构和软件的系统结构。如果我们采用的是结构化设计方法,那么我们会从一个宏观的角度将软件划分成各个组成模块,并且确定这些模块的职责以及模块之间的调用关系。这一步骤的完成标志着软件设计的框架已经搭建完成。

  2. 详细设计:亦称为低层设计。这一阶段,我们对概要设计中的结构表示进行更进一步的细化,这包括定义详细的数据结构以及算法的实现方式。在此基础上,如果还是采用结构化设计,那么详细设计的任务就是为每一个模块具体化设计,确保整个系统的每个部分都有明确和可执行的设计方案。

主要的设计方法比较

在结构化设计方法盛行的年代,设计师们有多种设计技术可以选择。其中包括Jackson方法和Parnas方法。结构化设计方法强调模块的独立性和功能的单一性,致力于使模块间的联系尽量弱化而模块内部的联系紧密。而Jackson方法的独到之处在于,它从数据结构出发,导出相应的模块结构。Parnas方法则把重点放在抽象的概念上,其核心思想是封装变化,将容易变化的因素隐藏在模块内部,这样当这些因素发生变化时,对系统的影响可以被局限在最小范围。Parnas方法给出了一些重要的设计准则,虽然它没有提供具体的工作步骤,但它的影响仍然深远。

而在近年来,随着对象技术的崛起,这一方法凭借其对数据的高效封装能力和良好的消息机制,实现了高内聚、低耦合的系统设计,逐渐成为现代软件设计的主流方法学。对象技术不仅促进了软件模块化,而且还提高了代码的重用性,使得软件开发更加高效、系统更加稳定。

在软件设计的世界里,无论是传统的结构化方法还是现代的对象技术,都有其独特的价值和适用场景。作为设计师,我们需要根据项目的具体需求、团队的技术背景以及项目的预算情况来选择最合适的设计方法,以确保软件设计的成功。最终,无论我们采取哪种方法,软件设计的本质始终是将用户的需求转化为一个可以工作的软件系统,这是一个既需要科学性也需要创造性的挑战过程。

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

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

相关文章

《操作系统导论》笔记

操作系统三个关键:虚拟化( virtualization) 并发(concurrency) 持久性(persistence) 1 CPU虚拟化 1.1 进程 虚拟化CPU:许多任务共享物理CPU,让它们看起来像是同时运行。 时分共享:运行一个进程一段时间…

JavaScript获取当前设备类型

可以通过 JavaScript 来实现判断当前的设备类型:navigator 是 JavaScript 中的一个独立的对象,用于提供用户所使用的浏览器以及操作系统等信息,以 navigator 对象属性的形式来提供。所有浏览器都支持该对象。而 navigator 对象有一个 userAge…

前端常用的几种算法的特征、复杂度、分类及用法示例演示

算法(Algorithm)可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤,或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。算法代表着用系统的方法描述解决问题的策略机制&#xff0c…

C++精进之路(十六)string类和标准模板库

C提供了一组功能强大的库,这些库提供了很多常⻅编程问题的解决方案以及简化其他问题的工具。 string 类为将字符串作为对象来处理提供了一种方便的方法。string 类提供了自动内存管理功能以及众多处 理字符串的方法和函数。例如,这些方法和函数让您能够合…

vue中高德地图使用

1、安装 npm i amap/amap-jsapi-loader --save2、封装地图组件 <template><div id"map" ref"mapcontainer"></div> </template><script> import AMapLoader from "amap/amap-jsapi-loader"; export default {befo…

JS小知识,分享工作中常用的八个封装函数,让你事半功倍

一、回到顶部 当页面很长时&#xff0c;如果用户想回到页面顶部&#xff0c;必须滚动滚动键几次才能回到顶部。如果页面右下角有“返回顶部”按钮&#xff0c;用户可以点击返回顶部。对于用户来说&#xff0c;这是一个很好的用户体验。 // Method 1constbindTop1 () > {w…

嵌入式Linux之MX6ULL裸机开发学习笔记(IMX启动方式-启动设备的选择)

一,硬件启动方式选择 1.启动方式的选择 6ull支持多种启动方式。 比如可以从 SD/EMMC、 NAND Flash、 QSPI Flash等启动。 6ull是怎么支持多种外置flash启动程序的。 1.启动方式选择&#xff1a; BOOT_MODE0 and BOOT_MODE1&#xff0c;这两个是两个IO来控制的&#xff0c;…

C#上位机与欧姆龙PLC的通信09----开发专用的通讯工具软件(Winform版)

1、介绍 上节文章已经完成了通讯库的开发&#xff0c;可以看到库还是蛮厉害的&#xff0c;在项目中就可以直接拿来应用&#xff0c;这节要做的就是做一个工具软件&#xff0c;形成自己专业的通讯工具&#xff0c;也是对通讯库的直接利用&#xff0c;本节要写的工具软件是一个w…

【HBase】——优化

1 RowKey设计 重要&#xff1a;一条数据的唯一标识就是 rowkey&#xff0c;那么这条数据存储于哪个分区&#xff0c;取决于 rowkey 处于 哪个一个预分区的区间内&#xff0c;设计 rowkey的主要目的 &#xff0c;就是让数据均匀的分布于所有的 region 中&#xff0c;在一定程度…

如何查找iPhone中所有的应用程序

​ ​ Apple 的 App Store 共有约 200 万个适用于 iPhone 和 iPad 的应用程序。如果您像我们一样&#xff0c;您的 iOS 或 iPadOS 设备上可能有数十个应用程序&#xff0c;但没有机会将它们全部整理好。您很容易忘记主屏幕上应用程序图标的位置。 幸运的是&#xff0c;iPhone…

2024年软件测试行业如何发展呢?测试人该怎么办?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、表面"衰落…

获取随机字符以及获取随机数

/*** 获取随机字符** param length* return java.lang.String**/ public static String getStringRandom(int length) {String val "";Random random new Random();// 参数length&#xff0c;表示生成几位随机数for (int i 0; i < length; i) {String charOrNu…

亚马逊店铺遇到账号申诉模版分享

1.表达诚意&#xff0c;先认错再说&#xff1a;我知道&#xff0c;最近我们在Amazon.com上作为卖家的表现已经低于亚马逊和我们自己的质量标准。 2.清楚分明的格式&#xff1a;我们库存管理的混乱导致了延迟发货&#xff0c;更糟糕的是&#xff0c;物品无法使用。当延迟发货和…

杰发科技AC7801——IO模拟IIC注意事项

7801的参考手册没有说清楚 7840说明了用开漏 使用办法

【力扣每日一题】1944队列中可以看到的人数

目录 题目来源 题目描述 示例 提示&#xff1a; 思路分析 总结 代码实现 java实现 c实现 得分情况 java c p.s.吐槽一点无足轻重的事情 题目来源 力扣1944队列中可以看到的人数 题目描述 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。给你以…

【React系列】ES6学习笔记(四)module、编程风格

本文参考自电子书《ECMAScript 6 入门》&#xff1a;https://es6.ruanyifeng.com/ Module 的语法 1. 概述 历史上&#xff0c;JavaScript 一直没有模块&#xff08;module&#xff09;体系&#xff0c;无法将一个大程序拆分成互相依赖的小文件&#xff0c;再用简单的方法拼装…

jupyter更改默认路径到其它的目录或者到其它的盘 比如D盘

1.打开终端 输入jupyter notebook --generate-config 如下 2.在C:\Users\mb5958\.jupyter路径下 3.用记事本打开它&#xff0c;搜索directory 4.在你想要的路径下新建一个文件夹&#xff0c;如‘D:\jupyterFile’&#xff0c;然后将路径名放在c.NotebookApp.notebook_dir"…

appium自动化问题总结

1、DeprecationWarning: find_element_by_name is deprecated. Please use find_element(byBy.NAME, valuename) instead self.driver.find_element_by_name appium软件查看不到新建session的工具时候&#xff0c;可以下载2020年版本的appim&#xff0c;然后安装下面地址操作配…

leaflet呼吸闪烁效果

leaflet呼吸闪烁效果 1.功能背景 这个效果一把用于点击选中&#xff0c;报警提升效果。 2.功能开发 2.1 marker 这个效果还是很好实现&#xff0c;主要通过计时器设置透明度的组合实现。 function setTargetSelect(e){var i 1var int setInterval(() > {if(!e._map…

从vue小白到高手,从一个内容管理网站开始实战开发第三天,使用Element UI构建页面-登录(一)

上次我们介绍了如何安装Element UI库,这次我们使用Element UI中的组件开始开发我们的页面。 开发之前要先在项目中建立好几个目录,方便我们下面的开发。 一、在项目中创建页面管理目录 1、pages目录(文件夹) 首先在src文件夹下创建一个名为pages的文件夹,该文件夹用来统…