从C语言继承来的实用主义色彩强烈,不追求理论和哲学上的美感,注重用起来的一时爽。比如ioctl一用就是几十年,什么东西都往一个int型的fd里面装,什么错误都往全局变量写,类型安全那都不是事。有人炮轰宏内核设计不够优雅精美,linus则声称,现有的开发方式更为省心,至于一些隐含的指针和类型错误,反正排查的负担没超过一个阈值,不足为虑。能用老框架伸缩一下接着用的,绝不改进新方法。比如说epoll/poll用了这么多年,aio已经鸽掉。又比如进程间通信,大家宁可靠锤炼tcp栈达到逼近memcpy的效果,也不去搞共享内存之类的花哨技法。总体来说,我感觉UNIX系的哲学是“人类是愚蠢的,不如搞一坨简单的土逼方法让程序员去组合。”然后社区各自为阵,反复重造轮子。windows的理念是”我们的架构是牛逼的,要搞一套巴洛克式的鸿篇巨著一统天下“,然后就大力出悲剧,万年没人用。
多用户分时共用一台主机的文化:UNIX发明的年代计算机是如此昂贵,以至于唯一合理的利用方式就是多用户分时共享一台机器。这就解释了为什么UNIX一开始就支持多进程、多用户、用户组和权限管理。同时,还催生了一批允许同时登录一台机器的用户“单机聊天”的工具:write / talk / wall / mesg 以及后来的Telnet BBS把文件操作利用到极致的文化:UNIX有极其丰富的文件操作API,还有mmap,因此允许用户以最小的CPU/内存开销管理极其复杂的文件。这样导致的后果就是UNIX用户不爱用传统的数据库技术来保存数据,而是更偏向于自己管理索引、玩手工优化到极致的“文件API杂技”。我印象中的Telnet BBS服务端软件早期基本都是用文件系统而不是数据库来持久化数据的面向行的输入、输出格式:UNIX推崇在CLI Shell下通过管道组合多个进程协同完成工作,因此所有的程序都面临如何在读完标准输入流之前(谁也不知道会有多长)就要干活并输出的问题。理论上需要实现一个状态机来解析输入流,实际上为了省事基本上所有的程序都是以行为基本分割符来切割数据;这样做上游程序也省事:面向行的输出基本上都可以直接屏显给用户。因此,导致的后果是UNIX程序很少采用高度可靠的自分隔格式(如XML、JSON)作为标准输出,而是靠用户临时用sed / awk这样的工具来适配上下游程序的行内格式,造成了无穷无尽的(微妙的)解析bug。这是UNIX风格最大的弊端之一。






