彭小路
My life is brilliant~

导航

 

我看过很多类似#程序员必读XX本书#的书单,似乎在几乎所有的推荐书单里面,《程序设计实践》(英文名The Practice of Programming)都没有出现作为一本被推荐的书。我也是在今年暑假突然想开始读一些英文版的技术书籍,然后豆瓣上大致浏览了一下,机缘巧合的买下了这本书。

在技术博客,出版书籍充斥着各种云计算、大数据等时髦名词的今天,这本书从名字上就不是太引人注目,作为作者之一的Brian W. Kernighan这个名字似乎也很陌生,不过他还有一本书,就是被奉为C圣经的《The C Programming Language》,相信你一定听过。而另一位作者Rob Pike,可能更加陌生,不过他设计了一门最近非常红火的语言:Go。《The Practice of Programming》这本书确实颇为冷门,豆瓣上各个版本的评价数目加起来也不过400来人,分数倒是可以,9/10分的样子。

在阅读这本书之前一两个月,我大概做过如下一件事:

  • 在网易公开课上看了斯坦福的《编程范式》里面关于C语言的几集。
  • 看完了《The C Programming Language》,是中文版。
  • 开始在HDOJ平台上做题,熟悉C语言,用C写一些基本的算法。

从05年开始,我就一直对C/C++保持半生不熟的状态,之后差不多两年的工作,基本上也以使用SQL、Ruby和Java为主,虽然能拿来用解决一些问题,但是一直都没有系统的学习过,总感觉不踏实,干脆,在语言的学习上,一切推倒重来,从C开始。

好像扯得比较远了,不过也当做是我看这本书的背景吧;关于《程序设计实践》这本书,首先,书很不算太厚,我所看的评注版也就300多页,分为9个章节,像我一天看两个小时,大概一个礼拜就能看完一章的样子,当然,里面有些章节可能会围绕一个程序来展开,这样的话,自己把程序实现一下会更好。虽然书中代码大部分都是由C来实现的,但是一般同时也会给出一个C++、Java甚至是Awk,tcl实现的版本,所以,可以说这本书不算是语言类的书籍,作者在用不同的语言实现同一个程序的时候,更多展示的是不同语言在设计思维上的差别、在编程范式上的差别以及在适用领域上的差别。

从章节上来讲,以下更多是我个人的一些体会

第一章:Style,养成良好的编程习惯和编程风格比较重要,包括遵循一些约定成俗的代码风格和程序设计风格。其一,这样写出的代码更容易理解;其二,这在很大程度上降低了BUG出现的概率。这一章给我印象最为深刻的一段代码是C的qsort函数经常用到的一个cmp函数的写法。被注释掉的return写法非常常见,也很好用,但是在极端情况下却有问题。

1 int cmp ( const void *a , const void *b ) 
2 { 
3       //return *(int *)a - *(int *)b;//会有溢出隐患
4       return *(int *)a > *(int *)b;
5 } 
6 
7 qsort(array,arrayLength,sizeof(array[0]),cmp);

 

第二章:Algorithms and Data Structures, 主要是一些常见的查找、排序算法和一些常见的数据结构,这一章内容不多,但是结构相当紧凑,很多代码实现清晰明了,很接地气,虽然由于书比较老,像使用Java的版本比较旧,但是一点都不影响阅读。

第三章:Design and Implementation,整章围绕一个马尔科夫链的单词后缀的程序展开,给出了C、C++(STL deque)、C++(STL list)、Java、Awk、Perl的设计和实现方式,让人叹为观止,这一章应该是值得反复阅读并且自己去动手实现完整代码的。虽然以前在排队论的课上也接触过随机过程里面的马尔科夫链,但是当时的那些枯燥的公式让我实在是没啥收获,而书中的程序给了马尔科夫链一个非常通俗易懂而且优雅的解释。

后面的几个章节,包括接口的设计,在我们日常Coding中,也是频繁接触的;作者分别给Debugging和Testing各自一个章节,这两个经常被我们在学习过程中忽略而在实际工作中又避免不了的东西,至少你应该明白Debugging是发现问题后去想方设法解决问题fix bug的过程,而Testing是系统化地去挖掘潜在问题(BUG)的过程;两者是不可以混为一谈的。最后的三章包括性能、可移植性和Notation(我在中文中找不到一个词能准确描述这个词,虽然有人翻译成“记法”,但似乎不够全面,这章更多是在讲述论证要学会选择在正确的领域选择好正确的工具做正确的事),毫无疑问,也是非常不错的。

总的来说,我认为这本书非常适合作为你#阅读的第一本英语技术书籍#,学过了基础算法和数据结构的学生,可以把这本书作为一本进阶书籍,然后开始尝试动手将你所学习到的东西运用起来。而刚刚步入工作的同志们也应该好好读一读这本书,在职业素养上做好身份的转型。工作两三年的同志们也可以读一读,见贤思齐。

posted on 2012-12-14 14:01  彭小路  阅读(3659)  评论(2编辑  收藏  举报