转《UNIX编程艺术》读书心得
花了一段时间看完了《UNIX编程艺术》,但不是看得特别仔细,尤其是后面作者通过对工具的讲解来阐述其设计思想,因为很多工具能未曾接触过,难免就会产生一些乏味的感觉。其实就像译者姜宏在译序里说的一样,本书并不是什么UNIX编程手册,而是对UNIX历史上众多成功经验和失败教训的一个总结。而且在读这本书的过程中,你会发现很多地方并没有什么绝对的对与错,我想这也是作者ESR的意图之一,让读者自己去思考,才能从中掌握一些技巧。相对来说,阅读这类描述编程思想的书籍比阅读充满代码的指导类书籍要困难一些,但也要有趣一些。比如,开篇的第一部分就是在着重介绍UNIX的哲学、文化,通过17条原则来阐述其大意,最后却一言以蔽之——“KISS(Kepp it sample,stupid!)“。
UNIX从1969年诞生至今,经历了无数的兴衰没落,但仍然能毅力不倒。如果UNIX仅仅是作为一个操作系统所存在,我想它并不能坚持至今,至少对于今天的普通用户来说,还是更习惯于Windows这类带有GUI、拥有华丽界面的操作系统,支撑其发展的就是它的设计思想。在作者眼中UNIX就是世界上最好的操作系统,因为其设计的简洁性、透明性时其他操作系统无法比拟的。
不要重复造轮子
我觉得这是很多程序员挂在嘴边的一句话,UNIX推动了开源事业的发展,也给我们带了了很多轮子。以前在博客园看过一篇文章《到底是否应该重复造轮子》,作者最后说道“99%的人都不应该重复造轮子,只有1%的人应该去做这件事,因为只有1%甚至更少的人,造轮子造出了未来,而剩下的,都成为了这少数人的绿叶,衬托着他们的光芒,对于剩下的这批人来说,这些轮子造的意义并不大,至少对他们自己来说,花费的时间与得到的成长不成正比。”。我个人的观点认为,作为新一代的程序员,我们踩在无数巨人的肩膀上,我们的确不应该去重复造轮子,但我们需要知道怎么去造轮子,懂得这个轮子背后的实现原理,这样你在遇到新问题的适合至少知道怎样去解决。而且对于新手程序员来说,“只管使用、不管原理”这样的想法也不利于自身的成长。其次,我们也要选择一个合适的轮子,不然你还不如自己造一个。
简洁的是最好的
UNIX哲学基础中有一条简洁原则——设计要简洁,复杂度能低则低。在UNIX系统中的工具就是最好的例子,它们只做一件事情,但通过管道将他们连在一起却能完成许多复杂的工作,当然UNIX的“文本化协议”息息相关。如果单从设计角度来说的话,简洁就是一个程序的功能要尽可能的单一,不要想着我做的这个程序能胜任所有工作,到头来才发现连一个简单的工作都完成不了,还经常出现BUG。另外,程序员在技术上的虚荣心也是导致程序复杂度无限提升的原因,为了展现自己的技术实力,他们经常使用复杂的算法去完成简单的功能,最后出了问题连自己也解决不了。这种本可以避免的错误就是在浪费我们的时间,我们应该把时间投入到新问题中,而不是为这样的旧错误擦屁股,所以,为了世界和平(程序员会做出什么事,连自己都不知道)请降低你的代码复杂度,记住难于理解、维护和扩展的代码就是复杂的代码。计算机编程的本质就是控制复杂度, Kepp it sample,stupid!
过早的局部优化实际上会妨碍全局优化,先制作原型,再精雕细琢,优化之前先确保能用
我很赞同这句话所表达的观点。优化是一个长期的过程,而且在你的程序都不能正常运行的情况下就去进行局部优化,除非你有足够的信息和技术,否则你就是在作死,因为你永远不知道你的优化会导致什么新的问题,还没学会走你就想跑了~
“极限编程”宗师Kent Beck说过“先求运行,再求正确,最后求快”,在电脑硬件极速膨胀的今天,对于大多数程序员(还有少数人属于特殊领域)来说真的没有必要为了节省一点运行时间去进行过早的优化,当你的程序能正确运行的时候,你自然会发现哪些地方需要进行优化。上周用Nodejs重写Global Configuration API的时候就运用了一下这个思想,我认为这样做的好处在于你的优化更具有针对性,而不是自以为这个地方就该优化一下。即便是在过程中产生了新的BUG,我们也能更快、更好的解决掉,同时也印证了另外一个观点——最好的优化工具就是Delete键。
模块不宜过小,也不能过大
要编制复杂软件而又不至于一败涂地的唯一的方法就是降低其整体复杂度——用清晰的接口把若干个简单的模块组合成一个复杂的软件。如此一来,多数问题就只会局限于某个局部,那么还有希望对局部进行改进而不至于牵动全身。模块作为其中重要的组成部分,扮演者重用的角色,模块过大或过小都会产生更多的BUG,那么怎样才能算是一个适合的模块呢?模块划分常常是程序设计中最难的一部分,可以把模块看成是一个小程序,就像UNIX系统中的小工具一样,他们的职责应该简单、单一,各个模块之间通过接口相互协作,我觉得一个模块可以被替换而不会影响整体的运行就是最合适的。当然,具体的划分还是需要根据具体的情况作出调整。
这里我想到另外一个观点——宽进严出,我觉得这同样也使用于模块设计,因为你不能保证其他模块或者用户的输入是严格按照你的要求来做的,但是你应该保证你的输出是严格一致的,不会经常发生变化(这里的变化通常是指数据结构的改变),这样才能与其他模块更好的协作。
代码是活代码、睡代码还是死代码?
“活代码”是指在你的周围存在一个非常活跃的开发社区,“睡代码”之所以睡着,经常是因为对作者而言,维护代码的痛苦超过了代码本身的效用,而“死代码”则是睡得太久,重新实现一段等价的代码更容易。(摘抄自书中原话)
提供机制,而非策略
个人理解的就是机制是做什么,策略是怎么做,这样的好处就是使用“机制”的用户可以根据自己的需要使用自己的“策略”来实现其中的细节,而且这样很容易更换“策略”而不会影响“机制”。其实这就是接口的工作,以前在学校学习三层架构的时候每一层都有一个接口层,比如,数据访问层有一个接口层定制了需要提供的功能(做什么),而具体的实现可以根据不同的场景而改变,SQL Server可以用SQL Server的访问层、Oracle可以用Oracle的访问层(怎么做),你底层的更换并不会影响到上一层。
总结
最初以为书本中会有许多示例代码,到头来才发现除了文字还是文字,阅读过程中难免会感觉枯燥,其实仔细想想,如果你真的能静下心来好好思考一下,你肯定会有更多的收获。对于这些思想性的东西,并不是一朝一夕就能掌握的,我觉得更多的是要结合实际项目进行练习,这样才能更好的把这些思想融会贯通。其实,作者所说的“UNIX是世界上最好的操作系统”,就我个人而言我还是更喜欢使用Windows(也许是习惯了图形化界面),因为我觉得UNIX的学习成本有点高,虽然我觉得在终端中使用命令很酷(尤其是使用yum安装软件的时候),但对于不熟悉的人来说效率真的不高。
BTW:读一遍真的不够
转《UNIX编程艺术》读书心得的更多相关文章
- 《Unix编程艺术》读书笔记(1)
<Unix编程艺术>读书笔记(1) 这两天開始阅读该书,以下是自己的体会,以及原文的摘录,尽管有些东西还无法全然吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance ...
- 读《UNIX编程艺术》一感
我记得早在2006年的时候就开始频繁使用awk做文本处理方面的工作,07年的时候周围有人用perl,我还感到很不解,觉得写得很复杂,没有awk one liner 那么方便和神奇.一直在了解awk的具 ...
- UNIX编程艺术
本文主要是 <UNIX编程艺术>的摘录,摘录的主要是我觉得对从事软件开发有用的一些原则. 对于程序员和开发人员来说,如果完成某项任务所需要付出的努力对他们是个挑战却又恰好还在力所能及的范围 ...
- 《UNIX编程艺术》读书笔记
最近这段时间比较忙,利用业余时间看完了这本书.虽然书中讲到的很多例子都是上古文物,我没有用过,不过原理都是相通的,对我的启发很大.比如无所不在的KISS原则,实践中慢慢体会到的SPOT原则,无不产生共 ...
- Unix编程艺术札记版本
这本书是一位面试官告诉我,.非常感谢他的忠告.面试的说明.我写后认为,足.一方面是面试的技巧.另一方面就是学习的方法. 阅读这本书非常享受,加上之前的积累,一些疑惑,另一些基础的不足,在这本书里找 ...
- Java加密与解密的艺术 读书心得
现在项目中加密与解密的方式很多,很早就想整理一下Java中加密与解密的方式,读完<<Java加密与解密的艺术>>一书.借此机会梳理一下这方面的知识点 一.基础普及 安全技术目标 ...
- JavaScript DOM编程艺术读书笔记(四)
第十章 实现动画效果 var repeat = "moveElement('"+elementID+"',"+final_x+","+fin ...
- JavaScript DOM编程艺术读书笔记(三)
第七章 动态创建标记 在web浏览器中往文档添加标记,先回顾下过去使用的技术: <body> <script type="text/javascript"> ...
- JavaScript DOM编程艺术读书笔记(二)
第五章 最佳实践 平稳退化(graceful degradation):如果正确使用了JavaScript脚本,可以让访问者在他们的浏览器不支持JavaScript的情况下仍能顺利地浏览你网站.虽然某 ...
随机推荐
- VS2010调试C程序,总是一闪而过
今天在vs2010调试C语言程序的时候,一闪而过,百度上搜了三种解决的方法,都是可以用的. 1. #include<iostream> using namespace std; int ...
- 怎么使用jquery阻止页面的离开或卸载
//绑定beforeunload事件$(window).bind('beforeunload',function(){return '您输入的内容尚未保存,确定离开此页面吗?';});//解除绑定,一 ...
- python线程池(threadpool)模块使用笔记
一.安装与简介 pip install threadpool pool = ThreadPool(poolsize) requests = makeRequests(some_callable, li ...
- 2016.12.01 搭建dendroid备忘
在2014年的时候看了freebuf的那篇,感觉很6,2014年搭了就一遍成功了,事过两年,物是人非啊,2016搞了云,没事测试,搞了一遍死活不成功,第二天测试成功,过程逗比坎坷,没什么难的 //环境 ...
- COCOS2D-X中UI动画导致闪退与UI动画浅析
前两天和同事一起查一个游戏的闪退问题,log日志显示最后挂在CCNode* ActionNode::getActionNode()函数中的首行CCNode* cNode = dynamic_cast& ...
- 论文笔记--Fast RCNN
很久之前试着写一篇深度学习的基础知识,无奈下笔之后发现这个话题确实太大,今天发一篇最近看的论文Fast RCNN.这篇文章是微软研究院的Ross Girshick大神的一篇作品,主要是对RCNN的一些 ...
- 用程序获取 Internet 时间 无通用性程序后的暂用办法
并不是完全失败,但没找到一个通用的办法,这个通用指的不能通用所有的时间服务器,而不是说操作系统. 网上的方案很多,有用Socket类.或TcpClient类(C#).或UdpClient类,端口有使用 ...
- oracle恢复误删除数据
--开启行移动功能alter table 表名 enable row movement;--恢复表数据flashback table 表名 to timestamp to_timestamp('201 ...
- jffs2文件系统制作
内核: linux-3.0 uboot: 2010.09 开发板: fl2440 交叉编译器: 2011. ...
- adb 命令
adb命令 su 获取权限 ls 显示目录下的文件 cd / 跳转路径 pm 直接执行设备命令 exit 退出 adb devices 查看设备 adb shell 登录设备shell adb 用桥接 ...