Unix编程艺术心得

Wesley13
• 阅读 577

这本书被称为Unix世界"教外别传"的心法,此言不虚!

大家都公认主流的IT文化就是Unix的文化。此书对这种原来靠言传身教和源代码流传的文化进行总结。是一本深入到文化精髓,值得仔细反复玩味的经典。 同时书中还有很多坊间故事,对Unix历史发展历史的梳理,案例的分析等。有助于了解历史的脉络,深入理解文化精髓的奥秘。

翻阅此书不时能发现一些或让人眼前一亮,或茅塞顿开,或醍醐灌顶,或沉思良久,亦或莞尔一笑之处。

现将印象深刻的几点做一小结。

  • 明示胜于隐喻

这是一条Unix发展过程中非常重要的原则。在实现方面体现在采用文本化的协议,文本化的配置,反对专有软件。提倡能够使用最普通的文本工具即可读取与修改;也体现在提倡代码的开源(提高对程序员用户的透明度),反对二进制的封闭。

这种文化的内涵乍看不过尔尔,细想其实不然。比如没有受过unix文化熏陶的人(比如在下)在通讯协议上,往往会采用基于二进制的格式。而二进制的协议导致不得不依靠专有工具才能阅读与调试,大量专用代码与工具的产生。稍有不慎,常常会落得不可扩展的结果。而文本化的协议,几乎避免了绝大部分这种情况。从HTTP协议及大量基于HTTP协议的扩展协议可见一斑。

这种文化不尽在Unix上发扬光大,而且在其之上发展起来的编程语言也深受影响。比如所谓的Python之禅中就明确“ 明了胜于晦涩”。

  • 数据重于算法

"程序=数据结构+算法"是一个众所周知的公式。这一公式虽然有名却未必获得了真心实意的应用。现代主流编程思想更多的体现在OO方面,在算法方面。而对数据的关注较少。

先辈们已经在结构方面发展出大量方法和技术,比如数据流图,数据字典,ER,甚至关系型数据库等等等等。这些方法可以非常自然,非常直接的反映出现实世界的模型。有时候比OO更加直接与明朗。

举个例子,在OO方法里,有一个非常著名的通过找名词,动词来确定对象及其方法的技术。然而真正运用这些方法的话,就会发现找出来的对象往往莫名其妙,名称怪异。甚至会陷入到一个词究竟是名词、动词还是形容词的纠结当中。这完全是把宝压在了从不精确的自然语言提炼精确的OO表达之上。语言是否能够完全描述现实都不一定,从其上提炼出来的对象就更可想而知了。

换个角度,如果从数据的视角来看,几乎能够将现实世界的某些模型直接映射到数据上来。这个过程精确而直接。

  • 现有实现再有标准

标准的制定必须要有实现的验证。据说X标准是与其实现同步编写的,在此之后标准几乎没有变化。

  • 除非必要,绝不写庞大的软件

一个软件应该专注于其所面对的核心功能,其他功能尽量能够借助已有的工具/库来完成。提倡编写短小精悍,功能足够的小型软件。除非别无选择。

这一原则背后还有Unix通过管道,重定向等基础设施构建起来的上下文环境管理的支撑。这两者相辅相成,最终让Unix成为一个最好用的开发平台。也有助于培养程序员协作,共享,专注的思维。

  • 烂代码就要扔掉

众所周知,维护烂代码远比重写编写的成本要高。在Unix文化里对烂代码从不姑息,现在流下来的代码都是经过历史考验遗留下来的。都是非常优秀的代码。

这一原则给我们大胆重构,重写提供了底气。但动手之前,一定要有足够的理由认定这是维护代价高昂的烂代码,而不是出于对_别人的代码不可靠,只有我的才是最棒_的心里因素。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql简单常用语句汇总
1\.常用函数uuid和时间戳SELECTUUID(),UNIX_TIMESTAMP();将时间戳转为日期格式FROM_UNIXTIME(mw.created_at,'%Y%m%d%H:%i:%s')设置参数select@m_no:max(m_no)fromvc_m;set@m
Wesley13 Wesley13
2年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
unix-linux 发展历史 linux的基本特性
1、linux就是一套操作系统包括内核(kennel)以及程序调用接口(shell)2、unix、linux发展历史1、bell、MIT、GE的“Multics”系统(1)MIT,开发了分时操作系统(CTSS)允许多台终端使用一台主机,但先进的分时系统只能支持30台左右的终端同时登录。(2)1965年BELL、MIT、GE,发起了Multics系
Stella981 Stella981
2年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这