当前位置: 首页 > news >正文

抽象之美——万物皆可设计

目录

前言

抽象的层次性

软件设计中的分层抽象

容器虚拟化技术,“抽象维纳空”

化繁为简,抽象思维让万物皆可设计


前言

美好的事物大家都喜欢,人是视觉动物,天生都倾向于看得见和摸得着的具象之美。蓝天白云、浩瀚星空、汪洋大海、崇山峻岭大自然从不吝啬,把它的美一览无余的展现在我们的眼前。人类在追求美的道路上也从不停歇,我们感叹大自然的鬼斧神工的同时,也在设计属于自己的美的艺术。

科学技术是人类的第一生产力,技术不光发展日新月异,也在变得越来越美。艺术源于生活,可以高于生活,技术的美同样也源自生活,甚至超越生活。“若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。”——来自大卫*林奇的《钓大鱼:大卫*林奇的创意之道》,这句话把抽象和美丽展现的淋漓尽致。技术的美可以无限延伸,可以简洁无比,这一切都源自技术的抽象。技术的抽象之美到底在软件设计中是如何体现的呢?下面从我个人理解的角度与大家一起探讨一下技术的抽象之美!

还记得读的第一本有关编程的书籍中教会我们的是什么吗?没错,就是面向对象编程。面向对象编程中有四个基本特性分别是:封装 继承 多态 抽象,抽象思维是面向对象中一个很重要的思维,工程师们每天都要动用抽象思维,对问题进行分析、归纳、综合、判断、推理。从而抽象出各种概念,挖掘概念和概念之间的关系,设计出具体的软件模型,最后通过编程语言实现业务功能。我们面向某个问题通过抽象思维设计出模型,解决这个问题;回到问题最初产生的原因,试着跳出这个圈层,站在更高层次来分析问题;将会得到10个不同的模型,而这10个模型都可以解决这个问题;化繁为简,变抽象为具体,一个问题可以得到10个不同的答案,这就是技术的抽象之美!而具体实现软件设计和开发的编程语言里面同样存在着抽象之美。

 还记得Java编程语言里面如何新建一个对象吗?没错,就是用new关键字,一个用Java语言编写的软件系统或应用里面,可以看到无数个对象,当我们需要某个功能的时候只需要new一个对象出来,或许我们仅仅只是想要得到该对象的某个属性或方法,回到实际业务需求本身,我们可以设计10个不同的对象来实现这个功能。再往更高一层,某个对象又可以抽象出多个不同的模型来,这就涉及到抽象的另一个话题:抽象的层次性。

抽象的层次性

穿越时光再一次回到大学第一节编程课堂,映射到面向对象编程,抽象狗就是抽象类(Abstract Class),代表了所有狗的抽象。抽象狗可以泛化成更多的狗,比如宠物狗、猎狗、狼狗、牧羊犬等,每一种狗都代表了一类(Class)狗,对于每一类狗,我们可以通过实例化,得到一头具体的狗实例(Instance)。

 

从这个简单的案例中,我们可以到抽象的三个特点:

1. 抽象是忽略细节的。抽象类是最抽象的,忽略的细节也最多,就像抽象狗,只是一个模型而已。在代码中,这种抽象可以是 Abstract Class,也可以是 Interface。

2. 抽象代表了共同性质。类(Class)代表了一组实例(Instance)的共同性质,抽象类(Abstract Class)代表了一组类的共同性质。对于我们上面的案例来说,这些共同性质就是抽象狗的那个模型。

3. 抽象具有层次性。抽象层次越高,内涵越小,外延越大,也就是说它的涵义越小,泛化能力越强。比如,狗就要比猎狗更抽象,因为它可以表达所有的狗,猎狗只是狗的一个种类(Class),再往上狗、猫、羊等都是动物,这时候动物的抽象层次更高一级了。

抽象的这种层次性,是除了抽象概念之外,另一个我们必须要深入理解的概念,因为小到一个方法要怎么写,大到一个系统要如何架构,以及系统与系统之间各个模块与模块之间,都离不开抽象层次的概念。

可以看到,抽象层次越高,内涵越小,外延越大,泛化能力越强。软件设计中,抽象的层次性给了工程师们可以发挥无限想象力和创造力的空间。

软件设计中的分层抽象

在软件设计里面都强调“高内聚低耦合”,我们所熟知和常用的23种设计模式中,抽象工厂模式(Abstract Factory)就是“低耦合”很具代表性的例子。抽象工厂模式以一个超级工厂创建其他工厂,它属于创建型模式。抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。

使用抽象工厂模式的系统普遍符合以下几个条件:

①一个系统不要求依赖产品实例如何被创建、组合和表达,也就是含有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

②这个系统有多个系列产品,而系统中只消费其中某一系列产品,也就是多个具体产品类都衍生自同一个接口或抽象类。

③系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现类

从上面这些条件不难看出,抽象工厂模式可以简单理解为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。在面对复杂和抽象的业务时,运用这种分层抽象的设计模式,可以一步步把庞大又繁杂的整体支解为一系列具有同一特征的模块。说到庞大又繁杂的整体,我们站到软件设计的更高一层来分析抽象思维。大部分软件系统大致可以分为以下几个层面,“从内到外”依次是:

I存储数据的数据库层

II连接数据库与系统代码的数据持久层

III实现业务逻辑的代码层

IV系统间交互和通信的网络层

V部署和装载应用的服务层

VI展现给用户的界面和APP前端层

 这些大的分层下面又抽象出了很多个小的分层,比如底层的数据库存储层,无论是在传统的单体架构时代还是在微服务分布式架构时代,到时下盛行的云原生时代,数据一直都是企业的核心,也必然是技术所关注的焦点。从数据的存储层面的抽象来讲,可以分为单库单表、分库多表、缓存中间件、以及云原生数据存储。根据业务量的大小以及场景,选择合适的数据存储方式显得尤为重要。可以想象当企业的业务发展到一定阶段,体量足够大的时候,原来技术无法再满足和支撑现有业务量的时候,就需要升级系统和技术。正如前阵子很多互联网大厂都在设计各自的数据中台。而数据中台的设计更是少不了抽象分层的应用。

1.数据汇聚

数据汇聚是数据中台数据接入的入口。所有数据来自于业务系统、日志、文件、网络等,这些数据分散在不同的网络环境和存储平台中,数据汇聚把各种异构网络、异构数据源的数据方便地采集到数据中台中进行集中存储,为后续的加工建模做准备。

2.数据开发

数据开发是一整套数据加工以及加工过程管控的工具,有经验的数据开发、算法建模人员利用数据加工模块提供的功能,可以快速把数据加工成对业务有价值的形式,提供给业务使用。

3.数据体系

有了数据汇聚、数据开发模块,中台已经具备传统数据仓库(后面简称:数仓)平台的基本能力。大数据时代,必须考虑数据的一致性和可复用性,垂直的、烟囱式的数据和数据服务的建设方式注定不能长久存在。按照贴源数据、统一数仓、标签数据、应用数据的标准统一建设更好。

4.数据资产管理

数据资产管理包括对数据资产目录、元数据、数据质量、数据血缘、数据生命周期等进行管理和展示,以一种更直观的方式展现企业的数据资产,提升企业的数据意识。

5.数据服务体系

数据服务体系就是把数据变为一种服务能力,通过数据服务让数据参与到业务,激活整个数据中台,数据服务体系是数据中台存在的价值所在。

6.运营体系和安全管理

通过前面的数据汇聚、数据开发、数据体系、数据资产管理、数据服务体系,已经完成了整个数据中台的搭建和建设。一个健康地、持续运营的数据中台还需要有一整套完善的运营体系和安全管理体系,这样的抽象分层设计才算是完整地和可持续健康运营的数据中台。

数据中台可谓是治理超大体量数据问题的杀手锏,越是复杂的问题越需要分层抽象,分层是分而治之,抽象是问题域的合理划分和概念语义的表达。不同层次提供不同的抽象,下层对上层隐藏实现细节,通过这种层次结构,我们在应对像网络通信、云计算、人工智能AI等超级复杂的问题时也能轻松自如。

容器虚拟化技术,“抽象维纳空”

在计算机科学中,虚拟化技术(Virtualization) 是一种资源管理优化技术,将计算机的各种物理资源(如:CPU、内存、磁盘网卡等 I/O 设备)进行抽象、转换,呈现出一个可以供分割和组合的一个或多个虚拟机计算机环境。近50年来的虚拟化技术原型和准则发展演进如下所示:

随着微服务的兴起,在过去的几年里,一种新的抽象方式席卷了整个行业,那就是容器,容器也是虚拟化技术的一种抽象形式。容器不是新技术,几年前 Docker 兴起的让更多的工程师和团队开始使用容器。你可以把容器看作是具有软边界的独立环境,其中包含你自己的应用程序以及运行它的软件依赖项。而实例(或 VM)虚拟化硬件,以便运行专门的操作系统,容器技术又可以虚拟化操作系统,这样你可以运行具有不同(通常是不兼容)软件依赖性的独立应用程序。

谈到容器和虚拟化技术,不得不提AWS的虚拟化技术, AWS 最具代表性的一款轻量级虚拟机 AWS Firecracker ,它的底层原理也是抽象分层的应用:

  • 基于 VirtIO 的网络,磁盘和套接字驱动(virtio-net,virtio-blk,virtio-vsock),分别用于 MicroVM 的网络与磁盘 IO 访问,以及 MicroVM 上的 AF_VSOCK 套接字与宿主机的 AF_UNIX 套接字通信,从而实现 MicroVM 内运行的应用传递 vhost 内核代码到宿主机的通信
  • 可编程的间隔计时器
  • KVM 时钟
  • 串口终端控制台(例如 /dev/ttyS0)
  • 仅包含关机键的键盘

AWS基于虚拟化抽象分层技术的应用发布了一系列产品级的容器控制平面:AWS ECS、基于 Kubernetes 的新服务EKS(Amazon Elastic Container Service for Kubernetes)更有基于代码的抽象层AWS Lambda它允许工程师上传代码,而允许的环境和规则则可以交给AWS。

虚拟化技术从诞生到如今已经历经了近五十年,芯片硬件,虚拟化软件,操作系统厂商都在不断迭代自己技术,从而共同推动虚拟化技术的发展。近年来随着云计算的崛起,云厂商充分整合优化硬件、软件、系统三条线上独立发展的技术,在此基础上又结合业务需求进行了优化和剪裁,让大家已经看到了虚拟化的老树又开出了新花,AWS运用其先进的云平台和抽象化虚拟容器技术,给广大用户展现出了一个妙曼地“抽象维纳空”。

化繁为简,抽象思维让万物皆可设计

像AWS这样的高科技企业,一直走在技术发展的前沿,产品的足迹遍布了世界各地,用技术实力和产品完美的服务赢得了广大客户和技术团队的信赖及支持。

抽象的思维,抽象的应用无处不在,小到一行代码大到一个系统,再到今天普及的云计算云原生,人工智能AI,万物互联5G,技术已经渗透到我们生活的方方面面:商业体系 医疗医药 轨道交通 航天航空等。如果说一定要用一个词来形容枯燥和虚拟的技术的美的话,我想那一定是“抽象之美”。作为一名技术人员、IT工程师很重要的能力是抽象思维的能力。化繁为简,抽象思维让万物皆可设计!

相关文章:

  • steam搬砖项目,2022年详细讲解具体操作流程
  • c语言进阶:指针的进阶(下)
  • 嵌入式开发之驱动测试实践
  • GAMES101 路径追踪
  • CCF- CSP 202009-2风险人群筛查 满分题解
  • 《Python3 网络爬虫开发实战》:什么是AJAX?
  • 超详细Python自动化测试学习指南,附学习路线图+企业真实项目。看完月薪30K指日可待。。。
  • 卷积神经网络基础
  • PCIe系列专题之二:2.1 TLP的前世今生
  • 【面经】HTTP篇
  • web自动化测试(selenium.webdriver)
  • grpc和protobuf在一起
  • 1. HelmTemplate 3分钟将项目打包成Helm Chart并部署至k8s
  • 【Shell】算术运算符、流程控制、函数使用、数组以及加载其它文件的变量
  • Redis 备份恢复(持久化)手册
  • 自己简单写的 事件订阅机制
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2017届校招提前批面试回顾
  • CSS 专业技巧
  • IDEA 插件开发入门教程
  • Java超时控制的实现
  • PHP 7 修改了什么呢 -- 2
  • SAP云平台里Global Account和Sub Account的关系
  • spark本地环境的搭建到运行第一个spark程序
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 大主子表关联的性能优化方法
  • 第2章 网络文档
  • 排序算法之--选择排序
  • 巧用 TypeScript (一)
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 再谈express与koa的对比
  • 在electron中实现跨域请求,无需更改服务器端设置
  • NLPIR智能语义技术让大数据挖掘更简单
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # include “ “ 和 # include < >两者的区别
  • #define
  • #QT(TCP网络编程-服务端)
  • (3)nginx 配置(nginx.conf)
  • (9)STL算法之逆转旋转
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (差分)胡桃爱原石
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .Net中的设计模式——Factory Method模式