最早接触的计算机系统,是一家企业的FreeBSD的数据服务器。由于我家老大在其中工作,所以分配给我一个帐号,我就天天在其中尝试一些命令,who了,vi了,cc了什么的,当时,系统只是一个黑屏绿字的终端,比较无聊。后来上了大学,在自己的机器上装了Fedora Core Linux,用来学习数据结构,编译原理,操作系统原理等等,十分有意思。现在想来,*nix系统中的很多思想仍然是非常有用的。
大二的时候学习完软件工程后,看了一本书:《UNIX编程艺术》
,收获确实挺多,现在也工作了一段时间了,就把*nix系统中的一些简单的思想做个小小的总结吧。
- 保持简单
每个程序都应该尽可能的简单(当然不是Hello, world级别的简单)。简单的好处是显而易见的,易于维护,易于重新设计,代码易于被读懂等等。“当你想要设计一种复杂的文件格式时,最后的解决方法是躺下来,等这种冲动过去。”
- 降低耦合
每个程序尽量只做一件事,并且要做到最好。这样设计出来的系统,耦合度非常底,程序中模块与模块间耦合降低,很容易设计出基于插件的系统来。如linux
中的totem播放器,基本上什么都不能做,但是,如果你提供mp3的解码器,那么,它就是一个mp3播放器,如果你提供视频解码器,它就成为一个视频播
放器了。*nix下的大部分软件都有这样的特性。
- 尽量标准化
当一个用户比较熟悉*nix系统的命令行程序时,在遇到一个新的程序时,xxx --version应该如预期般打印出软件版本,而不是别的信息。这种趋势现在在windows中也流行起来了。如果所有的程序都遵循某标准的话,就可以很轻松的将他们整合起来,组装成更为强大,专用的东西。
- 文本化,抽象化
几乎所有的*nix系统下的程序都使用配置文件对应用进行高度的定制,这些配置文件都是一些最简单的,可读的文本,这样作的好处是,配置的分析器容易编
写,逻辑比较简单,应用的框架清晰,定制度高。在*nix中,所有的I/O都被抽象成了文件,如网络,音频/视频硬件,硬盘(真实的文件)等,这样作的好
处是,只需要提供一套标准的API,就可以对这些在某些程度上类似的东西进行统一的操作。
在linux提供的工具包中,通过管道连接,可以很容易的将很多个有专一功能的工具整合成可完成某种特定需求的高级工具。就像搭积木一样。这些思想,如果跟当今流行的面向对象思想
略微对比一下就会发现,简直……*nix就是用C写的面向对象的操作系统。
面向对象中,最重要的一点不是{继承,封装,多态}
,而是分工,即绝对相信别的模块,并向外部提供可以被信任的接口。OO体系中的所有参与者都是Object,它们通过消息进行交互,一个大的任务需要被分解,在各个独立的对象对这些分解过的人物进行计算后,再整合起来。注意这里提到的所有参与计算的Object的关系都是平等的,即使是入口处的调度者,也并不必某个字符串分析类更高级。
一个好的设计,每个类之做一件事(只有这样,才可能将其做好),每个类都应该保持相当的简单。而且尽量对调用者不做任何假设(即调用者可能以千奇百怪的方式使用你提供的类)。
在设计的初期,框架尽量是通用的,具体应用无关的,在一个设计的后期才可能涉及到具体的计算,比如linux中的totem播放器框架。
面向对象通过消息将多个对象协调在一起,完成特定的需求。而*nix提供的是操作系统级别的通信方式:管道!a的输出可以定向到b的输入,如此组成一个类似于过滤器的链,当数据从第一个工具中流入,并从最后一个工具流出时,数据已经完全加工好了。
*nix下的大部分工具可以无缝的连接,而这个特点正是由于这些工具之间毫无关系。有一个关于emacs编辑器的笑话:emacs环境太强大了,简直就是一个小型的操作系统,唯一的遗憾是没有一个像样的编辑器。emacs虽然经常会做为没有很好的体现分工,降低耦合等的反面教材提出,但是其中的核心系统+插件
的构架仍然是需要认真学习的。
分享到:
相关推荐
在 IT 领域,尤其是对于开发者和系统管理员而言,`dotfiles` 是一个非常重要的概念,尤其是在 *NIX 系统(包括 Linux 和 macOS)中。这些文件以点(.)开头,通常隐藏在用户的主目录下,用于存储用户自定义的配置...
Oracle出品的*nix系统性能参数采集工具是一款专为类Unix操作系统设计的监控和诊断解决方案,旨在帮助管理员深入了解系统的运行状态,及时发现并解决问题。这款工具通常被称为OS Watcher,它能够收集并分析各种系统...
nix, Rust 与 *nix api的友好绑定 Rust 绑定到 *nix api 文档( 释放)Nix试图为各种 *nix 平台 api ( Linux,达尔文,。) 提供友好的绑定。 目标是不提供 100%统一接口,而是统一什么可以以提供平台特定 api 。对于...
其设计哲学在于简单、可靠和易于集成,使得开发者和运维人员可以更加专注于业务逻辑,而无需担心后台服务的稳定性。 Go-immortal的核心功能包括: 1. **自动重启**:当守护进程意外退出或崩溃时,Go-immortal会...
**Prometheus Node Exporter** 是一个广泛使用的开源项目,它专为 *NIX 操作系统设计,用于收集和暴露硬件及操作系统级别的监控指标。由 Go 语言编写,它具有轻量级、高效以及可扩展的特点,使其成为 DevOps 社区中...
在分析“node.js 源码 *nix版”时,我们将关注与 *nix(Unix-like)操作系统相关的源码编译过程,以及遇到的问题和解决方案。 标题中提到的“*nix版”意味着我们讨论的是 Node.js 在类 Unix 系统(如 Linux 或 ...
“nix:与* nix API的Rust友好绑定”是指一个名为“nix”的Rust库,它的主要目的是为Rust程序员提供一个方便、安全的接口来使用各种* nix(包括Unix-like系统如Linux、macOS等)操作系统API。这个库使得开发者无需...
这个系统设计用于单个节点以及分布式部署,为那些寻求更高级别任务管理和监控的用户提供了理想选择。 1. **分布式特性**: Go-cronsun的核心优势在于其分布式特性。与传统的crontab不同,它可以将任务分布到多个...
*nix 下的邮件收取代码,很好用的,是个开源的
fs-easymotion 是一组 bash 函数,可帮助使用内置的 *nix 命令导航文件系统。 目前仅在 zsh 上进行了测试,但最终会更新以适用于所有流行的 shell。 受到,它试图通过很少的按键而不是长或重复的命令来简化向下...
目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。 <br> 正则表达式的使用,可以通过...
* nix操作系统的最小二进制生成器 内容 dnload.py是用于从C代码生成最小的ELF二进制文件的脚本。 它没有实际的实际用例,但可用于创建尺寸受限的演示产品。 可以在任何* nix或Windows平台上使用最新的Python安装和...
尼克斯该项目将我的* nix环境设置为。安装# non-nixos have to install nix firstcurl https://nixos.org/nix/install | sh# install home managernix-channel --add ...
- **构建与评估**:nix-repo使用Nix工具链对表达式进行解析和评估,生成一个独立于具体系统的软件包。 - **依赖管理**:nix-repo处理包之间的依赖关系,确保所有必要的依赖都能正确安装,并且在不同环境中保持一致...
在信息技术领域,尤其是在Linux(统称为*nix)操作系统环境中,命令行界面(Console)仍然是许多开发者和系统管理员的首选工具。然而,纯文本的输出有时缺乏视觉吸引力,不易于区分不同类型的输出信息。为了解决这个...
这里的*nix通常是一个泛指,涵盖了Unix、Linux以及其他类Unix系统,比如FreeBSD和OpenSolaris等。阿尔卡特Speedtouch USB是一款常见的ADSL调制解调器,用于通过电话线进行高速互联网连接。"开源"意味着该驱动程序的...
static-binaries, 作为静态链接二进制文件生成的各种 *nix 工具 静态二进制文件这个 repo 包含一组静态链接的各种工具,以及 Dockerfiles/其他构建脚本,这些脚本可以用来构建它们。 我通常只是根据需要创建这些工具...
`oxm`(Open eXtensible Manager)就是这样一个工具,专为这类系统设计,以源代码形式管理软件包。本文将深入探讨`oxm`的功能、工作原理以及其在软件生命周期中的作用。 1. **什么是`oxm`?** `oxm`是一个轻量级且...
4. **系统调用**:在*nix系统中,shell与操作系统内核交互主要通过系统调用。理解这些调用(如open、close、read、write、execve等)是如何工作的,对于创建"Tsh"这样的shell至关重要。 5. **文件系统交互**:shell...