计算科学中的所有问题都可以通过增加一层抽象来解决。

All problems in computer science can be solved by another level of indirection.

没有抽象的世界

想象这样一种场景,如果我们的语言中没有代词这种形式,那么我们想表达“张三是个好人“该怎么说呢?可能是这样的:

”你还记得我说过的人吧,穿着邋邋遢遢的,公司在中关村,整天背着个双肩包,写代码的,天天996,这个人是个好人“,看到了吧,在没有代词的情况下我们想表达一件事是非常困难的,因为我们需要具体的描述清楚所有细节,但是有了”张三“这种抽象后,一切都简单了,我们只需要针对张三这种抽象进行交流,再也不需要针对一堆细节进行交流了,抽象大大增强了表现力,这就是抽象的力量。

接下来回到计算机世界。

计算机使用层面

我们在使用计算机时其实抽象就在发挥作用,在Word中编辑文档时我们不会去考虑CPU是如何处理这些字符的,这些字符是如何被保存到磁盘的。在浏览网页时我们不需要关心网页中的数据是如何在网络中传输的、浏览器是怎样把这些数据适当的渲染出来的,我们需要做的仅仅就是在Word中简单的输入字符,用鼠标或者手指滑动网页。

因此只要在使用计算机,那么抽象就在发挥作用,只不过是我们没有意识到而已,而之所以我们没有意识到是因为抽象工作的太好了。

编程语言层面

程序员也可以从抽象中获得极大好处,因为软件是复杂的,但程序员可以通过抽象来控制复杂度,方法就是抽象。

比如一个好的设计就是对某项功能抽象出一组简单的API,这样其它程序员在使用这个模块时只需要关注这几个简单的API而不是一堆内部实现细节。

不同的编程语言提供了不同的机制来让程序员实现这种抽象。

比如面向对象语言(OOP)的一大优势就是让程序员方便进行抽象,这样类的使用者就无需关心类的实现了,更不用提OOP中的多态、抽象类等,有了这些程序员可以只针对抽象而不是具体实现进行编程,这样的程序会有更好的可扩展性,也能更好的应对需求的变化。

系统设计层面

计算机从本质上将就是在抽象的基础上建立起来的。计算机科学中的一大主题其实就是在不同层面提供抽象表示从而对外屏蔽实现细节

对于CPU来说,其对外提供的是一堆指令集,程序员只需要使用这些指令就可以指挥CPU工作了,这样就无需从细节上知道CPU是如何取出指令、执行指令的。

在操作系统层面,我们将I/O设备抽象成了文件、把程序的运行抽象成了进程、把程序运行时占用的内存抽象成了虚拟内存、又把进程和进程运行以来的环境抽象成了容器、最后把所有的一切包括操作系统、进程、CPU、内存、磁盘、网络抽象成了虚拟机。现在虚拟机技术是云计算的基石,实际上这种技术在上世纪60年代就出现了,并在当前火热的云计算中大放异彩。

难怪计算机科学中有一句名言,“计算机科学中没有什么是不能通过增加一层抽象解决的”,当然后面还有半句,“除了存在太多抽象层这个问题”。

总结

抽象的目的其实就是通过移除不必要的信息从而减少复杂度,因此抽象可以让我们更加关注重点。

在这里没有用太多编程语言中的示例来讲解,其实这也是一种抽象,那就是学习编程也好其它领域也罢,最好理解“顶层原理”,这个是通用的。个人一直有这样一种观点,那就是学计算机不是学一堆语言语法,那不过就是一些文法规则的实现细节罢了,编程高手之所以是高手不在于比别人有多了解一门编程语言有什么稀奇古怪的用法,更重要的还是这所说的“顶层原理”,那么顶层原理存在哪里呢?就存在于我们常说的基础中:操作系统、编译原理、网络、数据结构算法等。

更多精彩内容,欢迎关注公众号“码农的荒岛求生”。

编程高手必备的思维模式:为什么抽象在计算机科学中如此重要相关推荐

  1. java工厂模式和抽象工厂_Java中的抽象工厂设计模式

    java工厂模式和抽象工厂 Welcome to Abstract Factory Design Pattern in java example. Abstract Factory design pa ...

  2. 技术管理者应有的 4 种基本思维模式

    在看文章之前先思考两个问题: 人和人的差别究竟在哪? 人和人之间为什么会有差别? 在各种场合我们经常听到这样一句话:「听懂了很多道理,却依然过不好这一生」. 这里有两个逻辑,一个是知行合一的逻辑,另一 ...

  3. 实战并发编程 - 04基于不可变模式解决并发问题_2

    文章目录 Pre 业务描述 短信服务商基本信息 短信路由网关 基于不可变模式改造代码 第一步先将SmsInfo改造为不可变对象 接着在需要将获取服务商列表的代码改造为防御性复制 接着提供一个直接替换S ...

  4. 扯谈之编程高手VS武林高手

    不经意间觉得编程高手和这个武林高手好像有那么"一腿子",特列举了以下 证据,文字丑陋,欢迎补充修改. 体质-计算机基础    如果没有一个强壮的身体,就想成为武林高手,难免有些牵强 ...

  5. 独家 | 2种数据科学编程中的思维模式,了解一下(附代码)

    作者:Srini Kadamati 翻译:梁傅淇 校对:丁楠雅 本文约2500字,建议阅读10分钟. 本文以具体的例子阐释了如何最优化原型思维模式及生产流思维模式的应用. 数据科学的完整流程一般包含以 ...

  6. 2017WOT全球软件开发技术峰会:面向数据的思维模式和R语言编程

    跨界知识聚会系列文章,"知识是用来分享和传承的",各种会议.论坛.沙龙都是分享知识的绝佳场所.我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果.从听众到演讲 ...

  7. [《编程高手箴言》读后感]

    [<编程高手箴言>读后感] 毕业也有几年了,也看了和学了不少东西,<编程高手箴言>读后感.有时也想写点什么,但总是觉得头绪很多,一直没有动笔.最近翻了翻梁先生的<编程高手 ...

  8. [设计模式篇]工厂模式和抽象工厂模式

    最近在看Head First的Design Pattern,想想去年候捷来学校给我们讲Design Pattern,但当时水平太弱根本听不懂,今年想趁机再好好学一波,候捷反而不来了,哎,人生就是这样, ...

  9. 10个顶级商业思维:如何升级思维模式突破认知,让自己快速成长

    ​​人和人之间唯一的不同就是大脑的思维模式不一样,信念价值观不一样.不同的思维模式,不同的的信念价值观,造就了我们每个人不同的想法.看事情的角度和高度都不一样.学习的目的就是要打开我们的思维模式,心智 ...

最新文章

  1. 力扣算法题—045跳跃游戏二
  2. 死磕Java并发:J.U.C之并发工具类:CyclicBarrier
  3. Office协同办公:SkyDrive
  4. Android NDK学习笔记(转)
  5. word保存时标题变成黑框(mac版本)
  6. Java 反射的理解
  7. python--pandas 分位数
  8. 历数2013年优秀的开源游戏引擎与开源游戏项目
  9. Hbuilder--让手爽,飞一般的编码(二)
  10. 关于IOS数据解析的错误分析
  11. Android device monitor
  12. 质量管理用因果分析计算机成绩差,项目质量管理中的因果分析图
  13. 一文带你入门 HTTP 协议
  14. 京东自营客服初级考试
  15. 财务分析之资产负债表
  16. 微信公众号接入H5支付
  17. 微信小程序自动注册获取token
  18. Chrome HackBar工具下载
  19. linux 服务器加装硬盘流程及sda sdb加载顺序
  20. 改良IFDS扰动流场三维避障规划算法实现

热门文章

  1. 基于Ext-core 好玩的图片部分自由放大工具
  2. 从本地加载FASHION MNIST数据集并输入到模型进行训练
  3. 使用canvas画图,转换成图片路径
  4. JavaSE——基础知识回顾14之集合(下半部分Map)
  5. web前端日常更新 7.25
  6. matlab安装及其他资源推荐
  7. java爬取彩票数据_爬取彩票信息(有空试下)
  8. C# do-while循环控制台实现简单的猜数字游戏
  9. 关于unity ET框架Nlog的控制台Log不出来的问题
  10. 在工作之余是否要兼职?