浅谈unix之美
昨天写作写得膀子疼,看来花费同样的时间,写作比写代码累多了。今天是个伟大的节日,祝老婆,妈妈及家人节日快乐!祝所有女性读者节日快乐!
今天早上收获一封意外的惊喜,知乎日报收录了我上周的一篇文章『能花钱的,就不要花时间』!感谢知乎,在这个伟大的节日给我送上了一份大礼,同时也给普天的女性朋友送上了福音 —— 今天节约时间的唯一途径就是花钱!(嘿嘿)
今天讲点稍微技术些的,有同学看了『高效能程序员的七个习惯』,对unix哲学感到困惑,让我举个例子。其实这样的例子非常多,你随手使用的某个shell命令就体现了这个哲学,比如说:
$ docker ps -a -q | xargs docker rm
先解释一下,docker ps -a -q
列出了系统中所有container的id,docker rm
根据id删除某个container。但是我要删除所有的container怎么办?难道要我再做一个新的命令 docker rm-all
,或者 docker rm --all
?
两种方式都不优雅。其实我们需要的就是把两个已有的功能组合起来使用。怎么办?
unix的pipe和xargs就是为此设计的。pipe创建了一个管道,允许左右两端的进程通讯;xargs将管道左边的进程的标准输出重定向到管道右边的进程的标准输入,任其处理。用人话来说就是,pipe好比水管一样,xargs好比阀门,控制让水从一头流向另一头。
乍一看,本来我要实现一个程序,现在反而多实现了两个,有点不经济啊?其实这就是unix的哲学 —— 做一件事,做好它。
pipe只关心水管做得结不结实,xargs只关心水流是不是正确从左边流到了右边,docker ps -q -a
只显示container id,docker rm
只删除一个container。四个彼此互相并不认识的命令,凑在一起,优雅地解决了一个问题。有没有乐高积木的感觉?
复杂是软件的大敌,当你把一件事情做得足够简单的时候,你犯错的机会就少了很多,程序的健壮性就得到了保证。简单还有一些其它的美妙的副作用:
- 灵活,可以使用在很多你想象不到的场景
- 高效,你可以进行彻底地局部优化,而不用担心制肘
- 可伸缩,因为只做了一件事,使用者可以按照自己希望的方式将其并行或并发运行
有一个叫minecraft的游戏,游戏中你只能干一件事,搭积木(不好意思,我还真没玩过,只听说过)。你的基本素材就是方块。就是这样一个简单而又开放的游戏,造就了许许多多的奇迹。题图中的企业号(To 非星迷,请脑补星际迷航)就是一群天才一点点用一个个小方块搭建成的。
简单 = 无穷无尽的想象
复杂 = 思维禁锢并僵化
回到unix。
几天前工作的时候要解决一个问题:两个进程本来在同一台机器上用unix socket通信,后来其中一个进程转到了另外一台机器,两者还要通信,怎么办?
我们当然可以打开源码,将unix domain socket转成tcp socket进行通讯。
但是,如果其中一个进程的源码不受你的控制怎么办?
想想unix的解决之道吧?
- 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 数组属性和方法
- 多线程之NSOperation小结
- 判断一个坐标点是否在封闭曲线内的方法(swift)
- OC循环方法推荐-块循环遍历(比for循环好用)
- oc工程中oc、swift混编代码打包成静态framework踩坑笔记
- alloc 和 init都做了什么验证。
- 回顾冒泡排序(新增优化代码)
- 计算输入的一句英文语句中单词数
- 《剑指offer》第21天:合并两个有序链表
- 单细胞转录组基础分析六:伪时间分析
- 使用PaintCode便捷地实现动画效果
- 用墨卡托和GPS坐标计算距离时误差测试
- 单细胞转录组基础分析五:细胞再聚类
- Semaphore回顾
- iOS13 关闭黑暗模式+状态栏显示问题解决方法
- 0807-6.2.0-CDSW中Session列表和team分析