您现在的位置是:亿华云 > IT科技
女儿问了我一个问题:什么是抽象?
亿华云2025-10-04 03:02:38【IT科技】3人已围观
简介晚上吃饭的时候,有人提到了“抽象”这个词,孩子的好奇心是最强的,我女儿立刻就问我:“爸爸,什么是抽象?”刹那间我的脑海中涌过了很多画面:头脑特工队的电影牛顿的万有引力公式三个代表k8s的pod, rs
晚上吃饭的女儿时候,有人提到了“抽象”这个词,问个问题孩子的什抽好奇心是最强的,我女儿立刻就问我:“爸爸,女儿什么是问个问题抽象?”
刹那间我的脑海中涌过了很多画面:
头脑特工队的电影
牛顿的万有引力公式
三个代表
k8s的pod, rs, service
设计模式
接口和抽象类
......
这些她都听不懂,于是什抽我决定用一个简单的例子来敷衍她:
“我先给你一个苹果,然后又给了你一个苹果,女儿你现在有几个苹果?问个问题”
“两个”
“我先给你一根香蕉,然后又给你了一根香蕉,什抽你现在有几根香蕉?女儿”
“两根”
“1 + 1 等于几?”
“2”
“对,1+1 = 2就是问个问题抽象,知道了吧。什抽”
她点点头。女儿
"将来你还会学代数,问个问题x+y = z,什抽那是更高级的抽象......”
她似懂非懂地点点头,眼神中充满了迷茫。
回到正题吧,我今天想给大家分享的是服务器托管下面这幅图以及由它引发的感想。
这幅图来自于《深入理解计算机系统》, 我第一次看到它时候可以说是拍案叫绝,画得实在是太棒了。
1
对程序员来讲,我们并不是直接面向硬件进行编程的,因为硬件细节实在是太复杂了,所以必须要做封装和抽象。
比如说你要是想针对CPU这个硬件来编程, 这实在是太难了。
但是如果我们把CPU抽象为指令集,其中无非就是一些 MOV 指令,ADD指令, JUMP指令,那难度一下子就降低了一个数量级。
有了指令集,以及依托于指令集的汇编就够了吗?远远不够!因为汇编语言还是非常低级,需要直接操作CPU的寄存器和内存,如果一直用汇编语言编程,我估计现在的云服务器程序员数量要减少90%以上。
所以C语言,Pascal,C++出现了,Java,Python, Ruby出现了,用这些语言编程,根本不用考虑寄存器的事情,程序员离物理机器越来越远,和硬件打交道的事情都交给了编译器和解释器。
有时候,有了高级语言还不够,为了更加贴近业务领域,甚至让业务人员直接编程,程序员还会创建领域特定语言(DSL)。
2
硬盘在没有抽象的情况下,我们看到的就是盘面,磁道,扇区这样的底层概念, 你要是想在上面写点儿东西,或者读取一点儿东西,可就要累死了。
可以先做一点简单的抽象,隐藏磁道扇区这样的概念,服务器租用让磁盘变成逻辑上按顺序编号的磁盘块,即磁盘块1、磁盘块2、磁盘块3......这就好多了,但使用起来依然非常低级。
于是操作系统给我们提供了一个漂亮的抽象,文件!你只需要打开文件,写入数据,关闭文件即可,根本不用考虑底层的概念。
更重要的是,在Linux/Unix中,一切都是文件,可以用统一的接口来处理,这就更漂亮了。
3
文件是个非常好的抽象,可是对于商业应用来讲,它关注的是业务概念,是用户名,电子邮箱,地址,部门,账户,存款,取款,余额等等,在这种场景下,文件就变得太低级了。
所以数据库出现了,把文件这个概念也隐藏了,对于关系数据库来说,你面对的就是一个个逻辑上表格,你只要发出SQL语句就可以存取数据,并且还能保证ACID的特性,根本不用考虑底层的实现细节, 用起来就更加舒服了。
4
前面说的这些抽象,看起来似乎是分层的:
在日常的编程中,我们经常做的一件事情就是“数据抽象”,或者说找出抽象数据类型(ADT),在Java中就是抽象类或者接口。比如说List就是一个ADT,它的实现可以是ArrayList,可以是LinkedList。
ADT的特点就是稳定,很少变化,在项目和产品的开发中,一个非常重要的工作就是定义自己项目的ADT(以及ADT之间的关系),ADT一旦确定,那这个项目的骨架基本上就定下来了。
但是这个ADT不好找,有时候可以直接和业务概念对应上,有时候需要自己“造”一些概念出来,这就考验开发人员的抽象能力了。
软件业发展到今天,就是一部不断抽象的历史。抽象降低了复杂度,是一件非常好的事情,但是现在很多程序员日常的工作就是针对抽象的概念进行编程,由于很多细节被屏蔽,工作就显得比较无趣,如果想让自己的编程生涯变得有趣一点,我有两点建议:
一、要了解这些抽象下面是什么东西。
二、努力争取到创建抽象的权力,即设计的权力和架构的权力。
【本文为专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】
戳这里,看该作者更多好文
很赞哦!(8)
相关文章
- tk域名是什么域名?新手对tk域名有什么看法?
- 微博给自家CEO加了“头发特效” 网友调侃:来去之间变莱芝简
- 这5个Python代码的坏习惯很容易养成,千万不要养成这些坏习惯
- Java:就是要让你学会内部类
- 域名不仅仅是一个简单的网站。对于有长远眼光的公司来说,在运营网站之前确定一个优秀的域名对有长远眼光的公司来说是非常重要的。这对今后的市场营销、产品营销和企业品牌建设都具有十分重要的意义。优秀的域名是企业在市场竞争中获得持久优势的利器。
- 2020年Java程序员应该学习的10大技术
- 这个极客的Linux命令用起来,批量执行工具得心应手
- 万万没想到,HashMap默认容量的选择,竟然背后有这么多思考!?
- 2. 不要花大价钱买域名,新手鉴别能力不足,容易投资失误。
- 请你们不要调侃中台,它是我们赖以生存的镰刀
站长推荐
其次,一般域名注册有一个获取密码的按钮,域名注册商点击后会向您发送密码。在得到域名注册商发送的密码后,将其传输到域名服务提供商网站,然后输入密码,此时域名呈现申请状态。提交申请后,原注册人通常会向您发送一封电子邮件,询问您是否同意转让。此时,您只需点击同意转移按钮,域名注册商就可以成功转移。
2020年云计算和容器的发展预测
六边形架构和分层架构的区别
滴滴为啥值3600亿?看它的数据中台就知道了_技术栈微信半月刊第55期
其次,一般域名注册有一个获取密码的按钮,域名注册商点击后会向您发送密码。在得到域名注册商发送的密码后,将其传输到域名服务提供商网站,然后输入密码,此时域名呈现申请状态。提交申请后,原注册人通常会向您发送一封电子邮件,询问您是否同意转让。此时,您只需点击同意转移按钮,域名注册商就可以成功转移。
内存用量1/20,速度加快80倍,QQ提全新BERT蒸馏框架,未来将开源
Spring Boot异步请求和异步调用,一文搞定!
Python中如何实现参数化测试?