关于系统设计的一些思考

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.hqwc.cn/news/318808.html

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

相关文章

Postman版IDEA插件!免费!

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

CMU15-445-Spring-2023-Project #0 - C++ Primer

前置任务。 Task #1 - Copy-On-Write Trie Copy-on-write (COW) Trie 在进行修改时,不会立即复制整个数据结构。相反,它会在需要修改的节点被多个引用的时候才进行复制。当要对某个节点进行写操作(添加子节点或者继续向下insert&#xff09…

花了一小时,拿python手搓了一个考研背单词软件

听说没有好用的电脑端背单词软件?只好麻烦一下,花了一小时,拿python手搓了一个考研背单词软件。 代码已经开源在我的github上,欢迎大家STAR! 其中,数据是存放在sqlite中,形近词跳转是根据jaro …

OpenHarmony源码转换器—多线程特性转换

本文讨论了如何将多线程的 Java 代码转换为 OpenHarmony ArkTS 代码​ 一、简介 Java 内存共享模型 以下示例伪代码和示意图展示了如何使用内存共享模型解决生产者消费者问题。 生产者消费者与共享内存间交互示意图 为了避免不同生产者或消费者同时访问一块共享内存的容器时…

【小程序开发】解决 HBuilder X “本项目类型无法运行到小程序模拟器”

今天遇到一个奇怪的问题,从git导入的微信小程序项目准备运行到小程序模拟器时菜单没有展示出模拟器工具列表,而是展示了这么一个子菜单“本项目类型无法运行到小程序模拟器,点击看详情”。如下图: 点击是跳转到一个web链接。 我通…

【零基础入门TypeScript】判断条件和循环

目录 定环 无限循环 示例:while 与 do..while 中断语句 句法 流程图 例子 继续语句 句法 流程图 例子 输出 无限循环 语法:使用 for 循环的无限循环 示例:使用 for 循环的无限循环 语法:使用 while 循环进行无限循…

使用生成式AI查询大型BI表

在拥有大量表格形式数据的组织中,数据分析师的工作是通过提取、转换和围绕数据构建故事来理解这些数据。 分析师访问数据的主要工具是 SQL。 鉴于大型语言模型 (LLM) 令人印象深刻的功能,我们很自然地想知道人工智能是否可以帮助我们将信息需求转化为格式…

优雅地展示20w单细胞热图|非Doheatmap 超大数据集 细胞数太多

单细胞超大数据集的热图怎么画?昨天刚做完展示20万单细胞的热图要这么画吗? 今天就有人发消息问我为啥他画出来的热图有问题。 问题起源 昨天分享完 20万单细胞的热图要这么画吗?,就有人问为啥他的数据会出错。我们先来看下他的…

sql | sql 语句中的case when

通过case when 进行更细致的分类 ################################################## ####### 参考 ####### 如果没有添加case when 最终的sql 语句 就只是查询表中的name 而且添加 case when [age] > 18 then 1 else 0 end as [AgeType] 记就表示找表中的两个字段 一个是…

智能编程助手!华为云CodeArts Snap免费公测:基于盘古研发大模型

近日,华为云CodeArts Snap正式开启公测。 这是一款基于华为云研发大模型的智能化编程助手,旨在为开发者提供高效且智能的编程体验,提升研发人员的单兵作战能力。 该服务公测期间免费,不向用户收取任何费用,商用后&am…

在 UEFI+GPT 模式下,使用Symantec_Ghost_12.0.0.8006备份统信UOS+Windows10系统,固态硬盘也顺利

在 UEFIGPT 模式下,使用Symantec_Ghost_12.0.0.8006备份统信UOSWindows10系统,安装时双系统不说了。 ipxe系统下载好 某桃系统中pe64.wim下载好(这个要注意,因为某桃系统pe较新适合新一些的电脑),替换掉p…

Java数据结构:1. 数据结构前置知识

文章目录 一、初识数据结构二、初识集合框架1. 什么是集合框架2. 集合框架的重要性3. 背后所涉及的数据结构以及算法 三、时间复杂度空间复杂度1. 算法效率2. 时间复杂度(1)概念(2)大O的渐进表示法(3)推导大…