『互联网架构』软件架构-软件系统设计(一)

按照正常的互联网玩法,产品经理原型画好进行需求评审,评审完后,需要把需求丢给技术经理,或者技术负责人,进行一整套的概要设计,然后针对概要设计评审,概要评审后进行开发。这次咱们一起说说概要设计的体系结构。了解下套路。

软件系统设计

软件系统设计在很多人眼里就是写文档,写文档是一种负担,其实系统设计头脑风暴,是一种非常开心的事情。所以必须掌握什么是系统的设计。它里面有哪些方法论,如何去做一些系统设计。

我们平常做开发设计吗?

才毕业回郑州那几年,都是一句话就是需求,开发完了河南本地连个测试人员都没有,开发人员说开发完了就开发完了,直接拿给用户进行测试。有的用户直接骂娘,有的用户用的感觉很不爽哭的(工作没做完),有的用户直接摔东西的。聪明的一点的用户都直接联系开发人员帮他来操作。直接测试都没有,用户就是测试人员,说实话7,8年前的告诉用户怎么用,他怎么用。他感觉很神秘,这几年随着互联网产品越来越多,智能手机的普及,大家对软件的要求越来越严格了。很多之前的习惯的同事,现在都没转变过来,真是土,土的掉渣。后来其实也没太关注设计,可能就是之画个图。直到后来跟第三方系统进行交互数据,刚开始草草的设计下,导致之后的2个月都没好过。所以说系统设计是一项非常重要的工作。而不是老铁们经常说的就是写个文档就行了。

  1. 拿这键盘直接干。
  2. 深思熟虑,考虑到多方的问题,在开始我们的编码。
  3. 需求里面是一句话,直接就是干,别墨迹。
  4. 做设计的时候,开发人员在考虑?还是技术经理在考虑?

用什么方法做?

瀑布流程(互联网直接忽略)

需求确定的基础上,系统设计的方方面面设计的都很全面,把每个阶段都有非常严格的验证条件,在主流的大型软件的开发方式。

基于原型,快速迭代(互联网常用)

许多创业公司的老板真心喜欢,感觉业务可以进行快速的开发,其实在里面还是有很多的坑在里面的。很少有人基于瀑布来开发。其实快速迭代也变成了很多老板让各位老铁赶项目的理由了。我几个亿的单子,先让用户验证,让用户体验到,大家不能耽误我们伟大的商业模式,就算是这种开发模式也是需要有文档的,对设计不清楚的地方也会有很多,很多的坑在里面,包括后期的性能和扩展也好,如果前期底子没有搭建好的话,后期伤筋动骨。随随便便改一个小功能可能要对程序进行伤筋动骨。但是这个时候老板是不会管你的,测试人员更不会管你,产品也不会管你,他们只知道我们满足业务和需求。

具体设计什么

具体到底需要设计什么?如果系统没有做好一个设计,如果你还是基于所谓的原型,快速迭代敏捷开发以这为借口的话,程序后期越来越大,越来越大的时候真心很伤,根本都不改你的系统,就比如说:银行,社保里面的代码基本是10年前的代码,里面的问题一大堆,但是没有人敢改,这也是设计部合理导致的一个毛病。

  • 体系结构设计
    1.指明了一个系统是什么,它是整个软件中最本质的表现

开发人员看文档的时候,首先就要看体系结构。它是软件系统最本质的东西,主体的形态,人的骨架就是体系结构。如果你设计的体系结构是个大猩猩,后期不管如何进化,如何发展,它始终无法变成一个人,只能是个猩猩。比如盖房子,可能盖高层,可能盖土房,可能盖平房,或者是窑洞,一开始就想盖高层,它需要的材料,地基深度什么都是不一样的。所以体系结构就需要了解软件设计的本质。也可以说架构。

2.应当设计的很稳定

盖到一半,要换地基是不是很悲催。开发的设计的时候一定要三思而后行。

3.设计的原则

3.1 适应性

    满足用户需求,达成商业的目的。而不是开发人员自己歪歪,高水平的设计人员就是设计出来刚刚满足用户需要的软件,而不是不惜一切代码设计出来一个最先进的软件,没有最好,只有最合适。打造闭环是最好的,对于很多互联网项目,可能不是刚需需求,可能不是成熟的商业模式,如果非要进行闭环,试错的机会都不给,开发的成本老板接受不了,老板无法快速推广到市场里面。开发的功能越多,功能越强大的话,一旦业务发生调整的话,软件不好发生变动。所以要分为很多个阶段。开发和产品经理很多容易犯这个毛病,刚开始就设计都喜欢大而全,精而细。 产品经理经常爱说:『别人的系统都有这个功能,你为什么做不了!』,其实可以这么怼过去,给他上一课:『这样的产品设计根本就不能满足现阶段产品设计的适应性!』

3.2 结构稳定性

    我们设计的要相对的稳定性,一定确定一定要相对的稳定性,如果经常变动,就相对于房子的地基,你看到那个房子盖好后的地基经常发生变动。如果软件经常发生,太悲剧了。体系结构设计的不稳定,范围不清楚,如果一个系统刚开始是B2C,突然要变成B2B,表结构,系统模块,界面,全部都要发生比较大的改变。整个项目变的很轮乱,需求不停的变动导致系统很混乱。导致开发人员不敢动代码(牵一发动全身),都是复制一份 代码。最后维护多份代码。对于高水平的设计师都是有一定经验的,可以预先知道那些需求是基本不变的,那些需求是可变的。
必须导出:可变需求和可变需求。
    举个例子:之前项目中针对消息中心的设计,消息中心:对于用户来说会有很多种类的消息。消息除了pc端,移动端也有很多的消息,物流消息,营销消息,通知消息。当时就有一个问题, 实际的消息中心,就是接收到各种渠道的消息,然后分发到各个平台(邮件,短信,推送,系统消息信息)。之前没有消息中心,都是业务方自己各自来完成的。为了满足原子性,原子是不可变的,消息中心需要做的就是按照业务方的需求把消息发送出去,发送到对应的渠道,短信。但是消息中心是在业务平台之后设计的,业务平台不可能因为发送消息修改自身的业务代码。在消息中心专门设计了一个监听模块,监听业务方的一个动作,这个模块跟业务平台是紧耦合的,事件监听模块随着业务而变动,消息中心的核心功能不会发生变动的,因为功能很纯粹就是发消息,收消息,推送消息。这就是当时如何保证稳定性的问题。在模块上进行划分。如果之后在需要拆分的话,直接把模块进行拆分。监听模块,按照业务的变更进行变更。
     稳定性,就不会被业务需求方赶着走,项目是可控的。天天不用担心老板又有新需求。

3.3 扩展性

    软件在扩展新功能的难易程度。扩展性越好,适应变化的能力越强,尤其是敏捷开发,如果扩展能力不强的话,很容易进入一个死胡同里面去。区分可变动和不可变动。软件体量约小,扩展能力越强,船小好调头。为什么项目分阶段,就是为了可扩展。系统的体量肯定受限业务的,越大的项目扩展性越难,所以要进行分布式(应用层,中间业务层,原子服务层),分层(控制层,服务层,数据访问层),越是往下稳定。
    合理的业务模块划分,扩展的时候根据模块进行拆分扩展。业务的边界划分。

3.4 是不是所有的系统在设计的时候都要考虑扩展性

    一次性项目,只要完成现阶段的功能就可以了,例如两个单独的公司的对接接口,其实很多时候因为可能是一次性的,没必要考虑扩展性,如果考虑可能就变成了过度设计。如果做开放平台的话,肯定要考虑扩展性。

3.5 可复用性

    用一次还可以继续在用,工具类,公共的组件。工具类一定设计的纯粹(对使用环境没有假设,少配置零配置,没有依赖)

  • 表结构设计
  1. 方法论
  2. 表结构设计
  3. 性能扩展性考虑
  • 系统的模块设计

  • 原型界面设计

  • 设计模式

  • 数据结构和算法

PS:在之前也是不做设计的,但是做过设计的后明显是跟不做设计有很大的区别的。很多提前设计的好,做设计很容易可控。不管大家对设计的理论有多少,设计是必须的。凡事预则立不预则废。设计是为了让开发,测试人员,产品经理(设计没有偏差)。

热门文章

暂无图片
编程学习 ·

JavaScript-Promise的使用及详细解释

JavaScript-Promise的使用及详细解释案例使用多种方法实现以下案例第一种---setTimeout嵌套第二种---封装函数Promise详解小案例第三种---使用Promise来实现最开始的案例Promise---具体使用的案例第一版---点击按钮显示图片第二版---加载出第一张之后在加载其他,依次加载第三版…
暂无图片
编程学习 ·

Leetcode 题解 - 栈和队列

用栈实现队列 232. Implement Queue using Stacks (Easy) 栈的顺序为后进先出,而队列的顺序为先进先出。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。 class MyQueue {private …
暂无图片
编程学习 ·

python:matplotlib 绘制两条y轴

实例代码 x= np.arange(10) y1 = x**2 y2 = x**4 _,ax=plt.subplots() ax.plot(x,y1,b) ax.set_xlabel(x) ax.set_ylabel(y1,color=b) ax2 = ax.twinx() ax2.plot(x,y2,r) ax2.set_ylabel(y2,color=r)结果
暂无图片
编程学习 ·

13年蓝桥杯javaB组

13年蓝桥杯javaB组1.末世纪的星期天2.马虎的算式3.振兴中华4.黄金分数割5.有理数类6.三部排序7.错误票据 1.末世纪的星期天 曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。 还有人称今后的某个世纪末的12月31日,如果是星期一则会是世界末日 有趣的是,任何一个…
暂无图片
编程学习 ·

java常用面试题——笔试选择题解析

1.以下关于 abstract 关键字的说法,正确的是(D)。 A.abstract 可以与 final 并列修饰同一个类。 B.abstract 类中不可以有 private 的成员。 C.abstract 类中必须全部是 abstract 方法。 D.abstract 方法必须在 abstract 类或接口中。解析: final的类不能被重写和继承;而a…
暂无图片
编程学习 ·

ESP32使用MicroPython快速开发

Python基本语句一:Print语句:1. 输出字符串和数字>>>print("runoob") # 输出字符串runoob>>> print(100) # 输出数字100>>> str = runoob>>> print(str) # 输出变量runoob>>> L = [1,2,a] …
暂无图片
编程学习 ·

OSPF路由协议详情和实验!带大家手把手理解OSPF的协议!还有超详细的OSPF三台路由器的实验!

文章目录前言:一、OSPF的基本概念和工作过程1、OSPF路由协议概述1.1、自治系统(AS)1.2、内部网关协议(IGP)1.3、外部网关协议(IGP)1.4、OSPF是链路状态路由协议2、OSPF工作过程2.1、建立邻居列表2.2、链路状态数据库2.3、形成路由表3、OSPF基本概念3.1、OPSF区域3.2、Ro…
暂无图片
编程学习 ·

C#单例模式

子窗体:Form_employee_Quit fm;string userId;DataTable sesstab;private Form_employee_Quit_Handle(Form_employee_Quit fmz,string Code){InitializeComponent();userId = Code;fm = fmz;}private static Form_employee_Quit_Handle instance;//三.通过静态方法创建字窗体p…
暂无图片
编程学习 ·

小白带你简单了解一下渗透测试

小白带你了解KaLI Linux2KaLI Linux2是专业人士所提供的渗透测试和安全审计操作系统。下载安装安装目录为https://www.kali.org/downloads/下载Kali Linux2的2017.1版本需要:20G空间。 需要2G以上内存。通过镜像文件kali-linux-2017.1-i386.iso文件安装。将光盘文件写入到u盘上…
暂无图片
编程学习 ·

web编程期末大作业

web编程期末大作业—项目一实验内容: 首先在项目文件的终端中输入 npm install xxx 安装所有依赖的node modules 其次建立2个mysql表,保存用户信息和操作日志。 然后我们需要建立连接mysql配置文件要求1:用户注册可登录网站,非注册用户不可登录。 登录页然后是登录页路由,…
暂无图片
编程学习 ·

「清华」区块链工程师大讲堂之区块链基础-公益活动

背景 十三五规划明确区块链作为新一代核心技术以后,区块链上升为国家战略,22省市将区块链写入政府工作报告,2019年"1024"政治局全体学习明确发展方向。此外,2019年中国市场区块链相关企业总量为36224家,各大互联网科技公司都在积极布局区块链。各行各业对于区块…
暂无图片
编程学习 ·

https://www.cnblogs.com/sunsky303/p/7731911.html https://blog.csdn.net/lilele12211104/article/details/80393463
暂无图片
编程学习 ·

PMP-质量成本:一致性成本和非一致性成本对比

一致性成本vs非一致性成本,原文链接:https://www.ffeeii.com/1882.html质量成本:质量成本(cost of quality)包括在产品生命周期中为预防不符合要求,为评估产品或服务是否符合要求,以及因未达到要求(返工),而发生的所有成本。一致性成本:一致性成本(cost of conform…
暂无图片
编程学习 ·

4.4.1 SpringCloud遇到的坑和实践案例

云课堂的总体架构云课堂Eureka的实践云课堂Ribbon中的实践云课堂Fegin中的实践云课堂Hystrix中的实现云课堂中Zuul中的实践SpringCloud在网易的实践 微服务的概念 一个真正的微服务具备的特性:可组合性 把springboot进行一个随意的组装会形成一个新的系统 每一个服务都是围绕自…
暂无图片
编程学习 ·

最大子列和问题

实例1.1 最大子列和问题 (20分)给定K个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -…
暂无图片
编程学习 ·

2020年Java面试题解析

本文分为十九个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 如下图所示:共包含 208 道面试题,本文的宗旨…
暂无图片
编程学习 ·

RSA加密、解密、签名、验签的原理及方法

一、RSA加密简介RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分…
暂无图片
编程学习 ·

CSR8675模组,支持蓝牙APTX

FSC-BT806采用最新的蓝牙5.0解决方案,具有多功能CSR8670或CSR 8675芯片组,可通过BR/EDR和蓝牙低功耗连接在音频设备之间无线传输音频数据。确保用户有更多可能集成他们的设计,主要适用于无线立体声耳机和扬声器,免提耳机,TrueWireless立体声设备,汽车信息娱乐系统,对讲音…
暂无图片
编程学习 ·

The emulator process for AVD Nexus_5X_API_29 was killed.

The emulator process for AVD Nexus_5X_API_29 was killed.Android Studio打开模拟器时出错: Android Studio打开模拟器时出错: Error while waiting for device: The emulator process for AVD Nexus_5X_API_24 was killed. 在File\Settings\System Settings\Android SDK,…