设计心得——平衡和冗余

一、平衡

在前面分析了一些软件设计的基础和原则后,今天分析一下整体设计上的一些实践问题。首先分析一下设计上的平衡问题。平衡非常好理解,看到过天平或者标称的同学们应该都知道什么平衡。无论在哪个环境里,平衡都是稳定的基础。
既然说到了稳定,大家应该明白了平衡在软件设计中的重要性了吧。再抽象一下,秩序的稳定就是各方势力平衡的结果,也就是常说的“斗而不破”。到此大家应该明白了平衡在软件设计中的意思,就是在当前环境下对各种需求的一种适当的资源的分配。它既考虑了现在的实际需求,也适当展望了一下未来的发展;既兼顾了经济投入,又考虑了实际产出;既追求了一定的软件运行效率,又考虑了资源占有数量;既考虑了用户的实际体验,又适当照顾了开发者的技术实现,如此等等。
平衡不是说某一方一拍脑袋就决定的,它通常是一种“软博弈”的结果。所谓软博弈,就是用户、对接人、市场、架构设计和开发等人的互相妥协的结果。如果开发者有机会做到软件负责人或者首席架构师的角色,就会深深的体会上面的意思。
它的主要体现是什么?对开发人员来说,就是不断改变的需求的细节的变化。也是网上那个漫画,开发者声嘶力竭的喊“不许再更改需求了!”
需要提醒大家的是,平衡不是一成不变的,它是一个动态的过程,是一个不断演进和变化的过程,直到软件生命周期的结束。

二、冗余

如果说平衡是一个综合的整体上的问题,那么冗余就比较偏向于软件设计开发团队这一方了。冗余是什么意思?就是闲事儿管得太多。体现到软件设计和开发上,就是为实现一个功能用了一个以上的方法。或者这么说可能更好理解,一个功能实现了至少两次及以上,其使用的方法有可能相似甚至相同。那么冗余是完全和设计原则中的某些原则是完全相悖的,可它为什么还存在呢?只有一个原因,就是为了安全和稳定,或者说冗余其实就是一种灾备技术。
冗余有很多种:
1、功能冗余:就如上面提到的,一个功能模块被开发了两次以上。
2、任务冗余:实现一个任务使用了多个软件进程处理,然后利用算法来处理结果得到正确的选项,最典型的就是分布式算法中的选举。
3、开发冗余:就是为保证任务的安全性,利用多种技术架构方法甚至多个团队来实现同一个功能,然后通过某种机制来保证结果的安全性。注意和任务冗余的区别,前者是同一个软件实现的多个副本运行;而开发冗余是多个软件实现(同一功能)。
4、时间冗余:这个比较好理解,不断的在不同的时间点采样,验证结果的准确性和安全性。
5、指令冗余:这个属于一种底层的安全处理,保证程序在异常的情况下帮助程序恢复正常运行。

三、设计应用

在软件设计和实际应用中,人们发现,科学研究和工程实践有一个明显的不同在于,科学研究讲究的是严谨的推导。而工程实践讲究的是最终结果。什么意思呢?比如证明一个问题,科学证明它是不能完全成立的,但工程实践发现如果多试几次它就一定能成功。所以这个问题在工程上就是可行的,而在科学研究上是不成立的。
所以在实际的工程实践特别是在互联大规模应用的今天,平衡和冗余早就渗透到了软件应用的各个方面。
平衡的设计有很多种,比如常见的以时间换空间或以空间换时间,开发效率与开发速度,算法选择与程序性能等等。在实际的开发中,最典型的往往是牺牲一定的功能和性能,尽快的把程序开发出来并上线应用。互联网效率是第一位的,先机一旦失去,往往意味着再好的项目也极大可能就砍掉了。这样的例子现在回头看,可比比皆是,最典型的就是常用的微信,大家可以看看其如何研发出来的过程。
而冗余就重要了,在软件开发中,冗余往往无法具象化,往往让人觉得有设计或者开发者“抽抽”的印象。但在运维中却可以非常明显的体现出来,比如实际的网络事故中,某公司使用某云,结果挂了,损失了不少钱。同样,做过数据存储的开发者知道,数据往往不能完全存储到一个硬盘上,简单的使用阵列,复杂的要多点存储。这就是冗余。冗余的问题在于,到底冗余多少才是最安全的以及最具有性价比的。比如刚刚说到的数据存储冗余,是一个机器两块硬盘还是一个机房两个不同的机器硬盘还是不同机房甚至不同的物理地域。
冗余其实就是平衡的一种手段,上面出事故的公司虽然明白云也是有风险的,但他们选择了相信云的风险不会搞到自己头上。或者说即使出现事故是那种不可忍受的事故的可能性极低,怎么个意思呢?低到与自己在公司或者其它云上再备份一份的成本要低不少。这就是平衡,平衡风险与奖金投入的问题。

四、例子

平衡的例子太多了,这里举一个简单的。实际开发中遇到客户要求两个月交付上线使用,并且提出了各种要求。老板因为成本的问题,只给开发团队两个人。两个开发者即使考虑了加班,发现时间也非常不足。此时,就会和客户讨论需求的细节(忽略一些参与方),对某些不太重要的或者不急切的需求,不开发或者推到二期。在这个过程中,客户方提出了某某功能必须上线,可以加钱。这不就到达了平衡的第一步么。多给钱,开发者加班,砍掉非必要功能,这就基本达到了初步的平衡。
到于冗余更好理解,举一个比较极端的例子,银行的数据保存在哪儿?比如都保存在一个大家看起来非常安全的地方,但某一天,万年洪水或超级地震袭击,数据全丢失了,客户会怎么想?所以,对于大银行的数据一定是异地多处保存备份,比如大西北一份,东北一份,南方和北方再各来一份,这数据不就近似于百分百安全了。不可能这天南海北的几个地方同时有超级大的灾难或不可控的风险出现。

五、总结

软件设计不光是技术的问题,纯技术流往往会产生一种唯技术论的现象。软件的设计是一种现实与计算机交互融合的过程,往往涉及到技术之外的经济性、效率性、公平性等等具体的社会问题。软件设计是把软件的实现与实现世界结合起来,服务于现实世界,而不是一种独立存在。
要始终明白,实际的需求才是软件技术发展的根本动力!

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

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

相关文章

Java - 引用类型:强引用、软引用、弱引用和虚引用详解

文章目录 概述1. 强引用(Strong Reference)1.1 什么是强引用?1.2 强引用的特点1.3 强引用的使用场景1.4 强引用的注意事项 2. 软引用(Soft Reference)2.1 什么是软引用?2.2 软引用的特点2.3 软引用的使用场…

S4 HANA给科目分配允许记账的税码

本文主要介绍在S4 HANA OP中给科目分配允许记账的税码相关设置。具体请参照如下内容: 1. 给科目分配允许记账的税码 以上配置定义了总账科目可以使用什么税码进行记账。通常在科目主数据中会明确总账科目的“Tax Category”来请明确总账科目可以使用什么类型的税码…

xss-labs靶场

xss-labs靶场 xss攻击类型 反射型xss 即攻击者将恶意脚本嵌入到url或者表单中,当用户访问特定的url或者提交表单时(用户端请求时),恶意脚本会执行 攻击需要用户点击恶意链接或访问包含恶意参数的url触发 存储型xss 即攻击者将恶意脚本提交…

CVE-2024-23897-Jenkins任意文件读取漏洞复现

content Jenkins是什么CVE-2024-23897总结修复建议 Jenkins是什么 Jenkins是一人基于Java开发的、可扩展的持续集成引擎,用于持续、自动地构建/测试软件项目,可以监控一些定时执行的任务。 官网文档: Jenkins是一款开源 CI&CD 软件&…

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作

目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中,同义词(Synonym)是对数…

30.Word:设计并制作新年贺卡以及标签【30】

目录 NO1.2 NO3邮件合并-信函 NO4邮件合并-标签​ NO1.2 另存为/F12:考生文件夹:Word.docx布局→页面设置对话框→页边距:上下左右→纸张:宽度/高度(先调页边距🆗)设计→页面颜色→填充效果→…

Unity实现按键设置功能代码

一、前言 最近在学习unity2D,想做一个横版过关游戏,需要按键设置功能,让用户可以自定义方向键与攻击键等。 自己写了一个,总结如下。 二、界面效果图 这个是一个csv文件,准备第一列是中文按键说明,第二列…

一个简单的自适应html5导航模板

一个简单的 HTML 导航模板示例&#xff0c;它包含基本的导航栏结构&#xff0c;同时使用了 CSS 进行样式美化&#xff0c;让导航栏看起来更美观。另外&#xff0c;还添加了一些 JavaScript 代码&#xff0c;用于在移动端实现导航菜单的展开和收起功能。 PHP <!DOCTYPE htm…

TensorFlow 示例摄氏度到华氏度的转换(一)

TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换&#xff0c;可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …

2.1.3 相机图像信号处理的基本流程

文章目录 ISP基本流程ISP各基本流程职责 ISP基本流程 图像信号处理将传感器采集到的Bayer阵列数据转换成符合人眼观感的图像数据。ISP(Image Signal Processing)图像信号处理基本流程包括坏点校正&#xff08;DPC, Defect Pixel Correction&#xff09;&#xff0c;黑电平校正&…

51单片机CLD1602显示万年历+闹钟+农历+整点报时

1. 硬件设计 硬件是我自己设计的一个通用的51单片机开发平台&#xff0c;可以根据需要自行焊接模块&#xff0c;这是用立创EDA画的一个双层PCB板&#xff0c;所以模块都是插针式&#xff0c;不是表贴的。电路原理图在文末的链接里&#xff0c;PCB图暂时不选择开源。 B站上传的…

颠覆AI界限!o3-mini与DeepSeek V3的巅峰对决

性能之战&#xff1a;谁才是AI推理的王者&#xff1f; 在AI技术飞速发展的今天&#xff0c;OpenAI最新发布的o3-mini模型如同一颗新星&#xff0c;闪耀在AIGC的天空中。它不仅带来了惊人的性能提升&#xff0c;还具备了多项用户友好的功能。与此同时&#xff0c;DeepSeek V3也…

Spring Boot项目如何使用MyBatis实现分页查询

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

PDCA 循环法

目录 循环周而复始大环套小环阶梯式上升 如何从 0 开始搭建 PDCA应用场景示例一、健身 APP 拉新活动策划第一阶段&#xff1a;制定详细的活动计划与方案第二阶段&#xff1a;活动执行阶段第三阶段&#xff1a;活动效果监控阶段第四阶段&#xff1a;活动复盘阶段 二、员工培训三…

深入理解Spring事务管理

一、事务基础概念 1.1 什么是事务&#xff1f; 事务&#xff08;Transaction&#xff09;是数据库操作的最小工作单元&#xff0c;具有ACID四大特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务中的操作要么全部成功&#xff0c;要么全部失败 一致…

【Linux-网络】初识计算机网络 Socket套接字 TCP/UDP协议(包含Socket编程实战)

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、初识计算机网络 &#x1f4d6; 背景 &#x1f4d6; 网络协议 &#x1f516;OSI七层…

2 MapReduce

2 MapReduce 1. MapReduce 介绍1.1 MapReduce 设计构思 2. MapReduce 编程规范3. Mapper以及Reducer抽象类介绍1.Mapper抽象类的基本介绍2.Reducer抽象类基本介绍 4. WordCount示例编写5. MapReduce程序运行模式6. MapReduce的运行机制详解6.1 MapTask 工作机制6.2 ReduceTask …

【Rust自学】15.5. Rc<T>:引用计数智能指针与共享所有权

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.5.1. 什么是Rc<T> 所有权在大部分情况下都是清晰的。对于一个给定的值&#xff0c;程序员可以准确地推断出哪个变量拥有它。 …

LabVIEW微位移平台位移控制系统

本文介绍了基于LabVIEW的微位移平台位移控制系统的研究。通过设计一个闭环控制系统&#xff0c;针对微位移平台的通信驱动问题进行了解决&#xff0c;并提出了一种LabVIEW的应用方案&#xff0c;用于监控和控制微位移平台的位移&#xff0c;从而提高系统的精度和稳定性。 项目背…

关于matlab中rotm2eul的注释错误问题

在这里&#xff0c;写的是默认的旋转矩阵的顺序为‘ZYX’&#xff0c;对应的旋转轴的顺序为Z、Y、X。 包括网页上写的是 但是实际上&#xff0c;在实际的应用中&#xff0c;旋转的顺序应该是&#xff0c;X、Y、Z轴的顺序 即RRzRyRx 但是在矩阵运算中&#xff0c;由于YRzRyRx*X…