晚上吃饭的时候,有人提到了“抽象”这个词。孩子的好奇心是最强的。女儿马上问我:爸爸,什么是抽象?一大堆图:电影头脑特工队里的牛顿万有引力公式,三个分别代表k8spod、rs、服务设计模式接口和抽象类……这些她都看不懂,所以我决定用一个简单的例子来说明一下Perfunctory她:“我先给了你一个苹果,然后又给了你一个苹果,你现在有几个苹果?”“二”“我先给你一根香蕉,然后又给你一根香蕉,你现在有多少根香蕉?”《二》《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很难找到。有的时候可以直接对应业务概念,有的时候需要自己“创造”一些概念,这很考验开发者的抽象能力。软件业发展到今天,就是一部不断抽象的历史。抽象降低了复杂性,这是一件非常好的事情,但是现在很多程序员的日常工作就是针对抽象的概念进行编程。因为屏蔽了很多细节,所以作品比较枯燥。有趣的是,我有两个建议:首先,了解这些抽象下的内容。2、争取创造抽象的力量,即设计的力量和建筑的力量。【本文为专栏作家“刘欣”原创稿件,转载请通过作者微信获取授权公众号编码】点此查看该作者更多好文
