关于层(layer)
29 Jun 2016 关于层(layer)
今天谈谈“层”这个字,如果要让我在计算机科学中挑选一个最神奇的字,我会选择“层”字,因为生活中随处可见使用“层”的例子。
先从我们身边的电脑说起,电脑就是一个典型的层次化产品的例子。从下往上看,第一层是看得见摸得着的硬件,比如CPU、内存条和硬盘等,第二层是BIOS(Basic Input Output System),即基本输入输出系统,主要作用是检测硬件和引导操作系统,第三层就是操作系统,比如Windows、Linux和Mac等,第四层就是我们常用的软件比如微信、QQ和浏览器等,这样做有什么好处呢?其实最主要的目的就是为了简单方便。你可以想象下如果使用QQ需要特定的硬件、特定的BIOS和特定的操作系统,那估计就没几个人使用了。通过抽象分层,QQ只依赖于具体的操作系统,即QQ只需要和自己的下一层通信即可,其他层如何变化不影响QQ的使用。所以有针对不同操作系统的QQ软件,但是没有针对不同硬件或者BIOS的QQ软件。
以编程语言为例,第一层肯定是01010101,第二层是CPU可以理解的汇编指令,第三层一般是编程语言比如C、C++和Go等,第四层就是编程语言提供的各种库,如果还有第五层,那就是你使用编程语言开发的软件了。当然这里的分层也不一定严谨,因为如果你留意的话,很多编程语言其实都是将C语言进行了不同的封装,提供一个更简易抽象的接口供程序员使用而已。层在编程语言中也可以理解成封装,通过编程语言提供的基本语法和内置函数,将很多常用的功能封装成库提供给大家使用,这就是层在编程语言中的具体体现,通过隐藏具体的实现细节,减少编程的复杂度,使得程序员能专注更重要的部分。但是太过于抽象容易在出错时不知所措,所以还是要好好看看C语言,不要让封装把你迷惑了,技术要学好学精,没有捷径可取,底层的东西还是需要关注的,比如一个JAVA程序员,他就不一定知道while(*s++=*t++);
是字符串拷贝代码。
以公司管理层为例,第一层是公司的董事长,第二层是公司的总经理,接下来还有副总层、部门负责人层、小组长层,然后才到一般职员。相信大家很轻易的就能看见这样分层的好处,董事长离职,换一个人就可以了,一般职员、小组长或者部门负责人根本就不需要关心谁是董事长,但是总经理就得关注了。一般职员离职,董事长也不需要关注,但是小组长就需要知道了,这样分层有利于管理,但是办事效率就不一定高了,有可能要申请购买一个设备,签字批准都得几天,没办法,大公司只能这样,人太多了。
以支付宝为例,支付宝其实就是一个中介,也是利用层次思想。以前我们难免会有很多张不同银行的储蓄卡或者信用卡,然后你一会需要去这个银行取钱,一会需要去哪个银行转账,有了支付宝,你懂的。支付宝就是我们和银行之间的一个层,当然,马云发现了这个层,以前我们每个人都需要和不同的银行打交道,很麻烦(至于有多麻烦,我想你懂的)。于是马云搞出了一个支付宝,我们只需和支付宝打交道,马云负责更麻烦的事(和银行打交道),看见没,支付宝知道我们的痛处,解决了我们的真正需求–存钱和转账,所以,成功了。
说完支付宝,不得不说说滴滴打车,以前我们打车时,总是在街上不停的招手,各种求带,但是经常被出租车司机拒载,至于拒载原因,我就不说了,相信你也懂的。直到有了滴滴打车,作为我们和司机之间的一个中间层出现了,你要做的就是确保手机没有停机,且支付宝或者微信有钱,然后发个订单即可,滴滴打车负责调度附近车辆,帮你完成打车这件麻烦事,价格便宜且服务态度好。你不是嫌打车麻烦吗?滴滴帮你解决。和支付宝一样,但凡牛逼的公司,肯定很清楚客户的真正需求,帮他们解决问题,就是这样简单。
其实,层次化思想在生活中随处可见,比如虚拟化技术、租房的中介、快递等。所以如果你能开发一个同时更新微博、微信朋友圈和QQ状态的APP,我肯定会下载使用的,因为你肯定知道同时维护几个社交软件的不易,当然如果你要创业,务必挑选好这个中间层,真正的帮用户解决问题!
LEo at 22:32
- Codeforces 777C Alyona and Spreadsheet
- HDU 1039 Easier Done Than Said?
- Codeforces 777A Shell Game
- Codeforces 777B Game of Credit Cards
- [Jenkins 新插件] 兼容阿里开发手册 (P3C) 的火线插件安装使用教程
- Codeforces 591B Rebranding
- 零基础学贪心算法
- WebSocket协议深入探究
- 全渠道客服中心聊天机器人实战
- Selenium+python自动化21-TXT数据参数化
- 1283 最小周长
- AtCoder Regular Contest 069 D
- 从零开始学算法:高精度计算
- HDU 1213 How Many Tables
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 重中之重的二分查找
- LeetCode 剑指Offer 面试题27. 二叉树的镜像
- 一文搞定选择排序算法
- 一文搞定冒泡排序算法
- 剑指Offer LeetCode 面试题25. 合并两个排序的链表
- LeetCode 20200601 打卡 1431. 拥有最多糖果的孩子
- 剑指Offer LeetCode 面试题24. 反转链表
- 剑指Offer LeetCode 面试题22. 链表中倒数第k个节点
- 剑指Offer LeetCode 面试题18. 删除链表的节点
- 剑指Offer LeetCode 面试题06. 从尾到头打印链表
- 最详细的docker中安装并配置redis
- 剑指Offer LeetCode 面试题59 - I. 滑动窗口的最大
- 剑指Offer LeetCode 面试题58 - II. 左旋转字符串
- 剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
- 剑指Offer LeetCode 面试题56 - II. 数组中数字出现的次数 II