Unix哲学

2023-11-14

“Unix哲学”起源于Ken Thompson在早期关于如何设计一个设计接口简洁、小巧精干的操作系统的思考。随着Unix文化在学习如何尽可能发掘Thompson设计思想的过程中不断成长,同时它还一路上博采众长。

 

Unix哲学并不是一个正规的设计方法。它从不在理论上宣称可以生产出更好的软件。那些毫无动力、松松垮垮而且薪水微薄的程序员们,能在短短期限内,如同神灵附体般造出稳定而新颖的软件——这只不过是经理人永远的梦呓罢了。


Unix哲学(以及其它领域内被认为是成功的“民间”传统)是自下而上的,而非相反。它注重实效并且基于经验。你不能在正式的方法和标准中找到它们,它们属于隐性、反身性知识。


Doug McIlroy,Unix管道的发明者也是Unix传统的奠基人之一,说:
(i)让每一个程序只很好得做一件事情。当出现新工作的时候应该重组已有的程序而不是通过添加新特性使得原有程序变得复杂。
(ii)每个程序的输出应该可以成为另一个程序的输入,甚至一个未知程序。不让让彼此无关的消息混乱你的输出。尽量避免二进制输入格式。不要强求交互式输入方式。
(iii)设计和建造软件,包括操作系统,应尽早规划好。对于拙劣的部分不要犹豫不决,扔掉并重写它们。
(iv)使用工具可以减轻编程负担,即使你可能决定这些工具在建造后只使用几次。

他后来又这样总结:This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.


Rob Pike,一位伟大的C语言大师,从一个略微不同的角度给出了一些C编程的注解:
规则1:你无法预料一个程序在何处花费时间。瓶颈常会发生在出人意料的地方,所以在你能证明瓶颈所在之前,不要做第二次无谓的猜想。
规则2:测量。在你测量之前不要盲目追求速度,除非某个部分的代码淹没了其它的。
规则3:在n很小的时候,一个新异的算法会很慢,而且通常n不会很大。这些算法会有很大的常数。除非你确信n会很大,否则不要使用。(即使n很大,也先适用规则2)
规则4:新异的算法要比简单算法大得多,并且很难实现。尽量使用简单得算法和简单得数据结构。
规则5:数据支配。如果你准确选择了数据结构并正确组织它们,那么算法很可能已经自动构筑完成。数据结构,而不是算法是编程的重点。
规则6:没有规则。

Ken Thompson,Unix得设计和缔造者之一,用了禅宗里得一句话进一步描述了上面得规则4:
When in doubt,use brute force(拿不准就穷举)


更多得Unix哲学隐含在先哲们的行为以及Unix本身,而不是在先哲们留给我们的话语。纵观全局,我们可以总结出一部分思想:
1 模块化原则:编写简单的组件,用整齐的接口让它们互联。
2 清晰性原则:清晰要比灵巧重要。
3 整合化原则: 新设计的程序要考虑和其它程序共同工作。
4 分离性原则: 让机制与策略分离;让接口同引擎分离。
5 简单化原则: 为了简单而设计;只在你确信必要的地方增加复杂度。
6 吝啬性原则: 只有被证明了其它东西无法完成工作时才编写“大”程序。
7 透明化原则: 设计一个高度可见的程序可以使检查及调试更容易。
8 健壮性原则: 健壮性是透明化以及简单化的产物。
9 表示原则:把知识叠入数据以求逻辑质朴而健壮。

10 最小立异化原则: 在接口设计方面,一定不要总想标新立异。
11 安静性原则: 当一个程序没有什么值得炫耀时,就不要炫耀。
12 修复原则: 是的,一旦当你不得不面对失败时,失败就会变得愈发喧闹。
13 经济性原则: 程序员的时间是宝贵的,把它让度于机器时间。
14 生产化原则: 避免手工hacking操作;尽可能让程序完成编程工作。
15 优化性原则: 先做模具再打磨润色;先让程序工作,然后优化它。
16 多样化原则: 千万不要信赖包治百病的药。
17 控制性原则: 多为将来考虑,因为它会比你预料更快地来到现实。

如果Unix对你还是陌生的,这些原则值得你去沉思。软件工程的教科书会也向你夸耀这里的多数原则;但是大多数操作系统缺少好的工具和传统,所以这些平台上的程序员根本无法应用它们。这些程序员不得不接受生硬的工具,坏的设计,疲劳工作以及过度臃肿的代码,甚至习以为常(他们甚至不知道Unix爱好者为什么如厌恶他们的工作和习惯)。

一句话Unix哲学

所有这些这些哲学其实可以浓缩成一个被专家工程师奉为经典的法则:
KISS 法则
KISS 的全写是KISS Is Simple,Stupid(或者Keep It Simple, Stupid)
Unix能够给你提供一个极好的平台应用KISS法则。

应用Unix哲学

这些哲学原则绝不是含糊的概念。在Unix世界,它们直接源于经验,并指导我们正在从事的具体开发实践。这里有一份可能尚不完全的表:

* 任何与源代码、目标无关的过滤器都要有一个。
* 数据流只要可能就应该是文本的(这样才可以用标准的工具阅读和过滤)
* 数据库规划和应用协议只要可能应该是文本的(文本可读、文本可编辑)
* 复杂的前端(用户界面)和负责的后端之间应该被清晰分离
* 如果可能,在决定用C语言编码前尝试解释性语言(译者注:包括脚本语言)
* 使用多种语言要比单一的语言好,除非这这会增加复杂性
* 更多得接受各种输入,对于输出则要吝啬的控制
* 过滤时不要丢掉你可能并不需要的信息
* 小就是好的,写程序时做到刚好能够完成你的任务

我们将会观察Unix设计规则以及从这些规则中导出的原则,并应用它们。就像预料中的,它们正成为其它领域内软件工程里最好的原则。

态度决定一切

当你面对正确的选择,去做它——在一个短期计划中,经常会是这样,而然在一个长期的计划中这也许并不能取得什么效果。如果你还不能确定到底改作什么,那么就做能让工作完成的最少的事情,至少在你确定真正正确的事情前。

正确地应用Unix哲学,需要你的忠诚。你必须绝对相信软件开发是一个要动用你所有智慧、创造力和激情的活计。此外你不能指望简单的套用过去方法实现现在的设计;你必须在你应该思考的地方进行新的编码。你会在不经意间使得本该简单的实现复杂化-接着你会疑问并抱怨为什么你的代码会迅速膨胀并难以调试。

正确地应用Unix哲学,充分利用你的所有时间不要浪费。如果某个人已经针对某个问题做出了好的解决方案,不要因为好面子而进行无意义的重复工作。不要做出比预计更复杂的设计,让设计轻巧更重要。用你的工具,让可能的事情自动化。

软件开发应该是一个令人愉乐的艺术,一个高级的游戏。如果你不同意这个看法,停下手边的工作,问问自己遗忘了什么?为什么你做软件开发而不是去挣更多的钱或者空耗时间?你必须将软件作为一件燃烧你激情的事情。

正确地应用Unix哲学,你需要接受这个态度。你需要维护它,需要去游戏,需要有探索的意愿。
我们希望你带着这个态度去阅读本书。或者至少希望本书能帮助你建立其这种态度。


本文转载自http://www.20cn.net/club/security/unix/1090240314.html

文章翻译得不太好,什么时候找到《Unix编程艺术》这本书的英文原版,自己动手翻译下


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unix哲学 的相关文章

随机推荐

  • 【Python练习:幸运7游戏】:使用随机数生成函数randrange()模仿筛子点数和判断概率问题,多次迭代求规律

    Python练习题 幸运7游戏 随机数的应用 题目 赌场中有一种称为 幸运7 的游戏 游戏规则是玩家掷两枚骰子 如果其点数和为7 玩家赢4元 如果不是7 玩家就输1元 请你分析一下 这样的规则是否公平 知识准备 这里用到一个python库自
  • mybatis连接mysql url_MyBatis与JDBC连接数据库所使用的url之间的差异

    在Windows7 系统上安装了MySQL 8 0 然后创建Maven工程 配置pom xml文件 添加了如下依赖 org mybatis mybatis 3 4 6 mysql mysql connector java 8 0 11 1
  • 如何保证某个函数只被调用一次

    From http www cnblogs com baiyanhuang archive 2010 11 13 1876677 html 一个函数caller会在其内部调用另外一个函数callee 现在的情况是 caller可能会在多个地
  • 智能指针原理剖析(一):auto_ptr、unique_ptr

    通过常规指针管理动态内存的难点及缺点 1 忘记释放动态内存 使用new malloc分配动态内存时 需要使用delete free手动释放内存 但程序员容易忘记释放内存 从而产生内存泄露 2 动态内存释放时机不对 在尚有指针引用内存的情况下
  • 【老生谈算法】matlab实现图像压缩算法源码——图像压缩

    Matlab的图像压缩技术源码 1 文档下载 本算法已经整理成文档如下 有需要的朋友可以点击进行下载 序号 文档 点击下载 本项目文档 老生谈算法 Matlab的图像压缩技术 docx 2 算法详解 一 目的要求 掌握Matlab图像图像压
  • 零基础学习Java经常犯的错误有哪些?

    Java是一种复杂的编程语言 在很长一段时间内一直主导着许多生态系统 可移植性 自动垃圾收集及其温和的学习曲线使其成为软件开发中的绝佳选择 但是 与任何其他编程语言一样 它仍然容易受到开发人员错误的影响 本文探讨了Java开发人员最常犯的几
  • Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现菜

    Vue Element UI 实现权限管理系统 前端篇 十四 菜单功能实现 菜单功能实现 菜单接口封装 菜单管理是一个对菜单树结构的增删改查操作 提供一个菜单查询接口 查询整颗菜单树形结构 http modules menu js 添加 f
  • Java爬虫技术(一)普通网站爬取图片

    爬虫简单介绍 用户和网站服务器的操作如下 而爬虫需要做的是模拟仿照用户机 去向服务器发送请求数据 并接受响应数据 接着去解析数据 获得我们想要的数据 步骤大致分为 准备好要爬取的网址 定义爬虫的参数 开始爬 获取爬取的数据 使用xpath技
  • 未来两年以调试osgearth源码为主线,且整合GIS引擎

    按照 https blog csdn net hankern category 9281734 html 本来以为每天调试一节就可以了 没想到 试了3周 结果只调试了3节 平均每周一节 那么就要用2年左右了 花费这么长时间 值不值得呢 跳出
  • com.alibaba.easyexcel导出EXCEL文件

    com alibaba easyexcel导出EXCEL文件 1 POM XML
  • Redis安装配置

    1 下载 http redis io download 2 安装 安装C语言环境 已经安装可跳过 yum install gcc c 下载压缩包 wget http download redis io releases redis 4 0
  • Windows 运行窗口(win+r)常用命令

    打开运行窗口方法 windows系统电脑中 直接按键盘快捷键 win r 通过点击左下角搜索图标 输入 运行 进行搜索 就能找到 运行 点击之后即可打开运行窗口 点击左下角开始程序图标 然后点击 windows系统 之后 点击 运行 即可打
  • 曼彻斯特编码/差分曼彻斯特编码

    1 曼彻斯特编码 Manchester Encoding 位中间电平从低到高跳变表示 0 位中间电平从高到低跳变表示 1 2 差分曼彻斯特编码 differential Manchester encoding 在最初信号的时候 即第一个信号
  • stm32最小系统板烧录的简单说明

    首先 最小系统板烧录往往需要usb转串口模块 可以自行购买 一般买了会附送资料 上面都会有相应的驱动 根据以往的经验来看 这个模块的驱动经常出问题 比如一直显示占用 装了之后需要手动切换 具体可百度 就是打开设备管理器 点击相应com端口
  • Kubernetes 常见问题总结

    如何删除不一致状态下的 rc deployment service 在某些情况下 经常发现 kubectl 进程挂起现象 然后在 get 时候发现删了一半 而另外的删除不了 root k8s master kubectl get f flu
  • css实现勾号 √

    check position relative display inline block width 25px height 25px background red border radius 25px check after conten
  • 经典CNN卷积神经网络发展史+论文+网络实现(PyTorch)

    网络搭建目录 Lenet 学习笔记 pytorch官方demo代码复现 放风筝的猪的博客 CSDN博客 AlexNet网络结构详解与代码复现 放风筝的猪的博客 CSDN博客 VGG网络结构详解与代码复现 感受野计算 放风筝的猪的博客 CSD
  • qt制作播放器-进度条属性设置

    QSlider groove horizontal border 1px solid 4A708B background C0C0C0 height 30px border radius 1px padding left 1px paddi
  • Centos8安装WPS

    下载安装包 到wps官网下载linux版本的安装包 根据自己的linux是 32 位还是64位的 下载对应的安装包 我下载的是64位的rpm包 下载地址 http www wps cn product wpslinux 安装目录 如果想安装
  • Unix哲学

    Unix哲学 起源于Ken Thompson在早期关于如何设计一个设计接口简洁 小巧精干的操作系统的思考 随着Unix文化在学习如何尽可能发掘Thompson设计思想的过程中不断成长 同时它还一路上博采众长 Unix哲学并不是一个正规的设计