前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈unix之美

浅谈unix之美

作者头像
tyrchen
发布2018-03-28 12:59:16
7720
发布2018-03-28 12:59:16
举报
文章被收录于专栏:程序人生程序人生

昨天写作写得膀子疼,看来花费同样的时间,写作比写代码累多了。今天是个伟大的节日,祝老婆,妈妈及家人节日快乐!祝所有女性读者节日快乐!

今天早上收获一封意外的惊喜,知乎日报收录了我上周的一篇文章『能花钱的,就不要花时间』!感谢知乎,在这个伟大的节日给我送上了一份大礼,同时也给普天的女性朋友送上了福音 —— 今天节约时间的唯一途径就是花钱!(嘿嘿)

今天讲点稍微技术些的,有同学看了『高效能程序员的七个习惯』,对unix哲学感到困惑,让我举个例子。其实这样的例子非常多,你随手使用的某个shell命令就体现了这个哲学,比如说:

代码语言:javascript
复制
$ 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的解决之道吧?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档