编程珠玑(ProgrammingPearls)读后感(⼀)
很早就买了编程珠玑(英⽂版第⼆版),但是⼀直没有时间来学习。最近意识到每天上下班班车上的两个多⼩时其实很珍贵,下决⼼利⽤这个时间来看些书。历时2个⽉,终于把这本⼩册⼦囫囵吞枣般的通读了⼀遍。
以前看完书,总是很有成就感的把书⼀扔,过不了⼏天就把当时的领悟忘记了。也很少再去读第⼆遍。最近突然意识到,读书就是跟原作者的思想交流,这跟我们平常⾯对⾯的交流有很多相似之处,但更加系统化。往往第⼀遍阅读能抓住作者思想的30%就不错了,反复阅读温故知新是必须的,读书笔记更是必须的。因此通过这篇⽂章记下⾃⼰从书中所得,以便下次阅读时能快速恢复⾃⼰领悟的部分。
思想很重要
思想是灵魂,这是最近在⼯作和读书过程中的体会。具体到IT⾏业,有思想的写代码就是⼤师,没有思想的写代码就是码农。从之前看过的《代码⼤全》和
《C++沉思录》,到《编程珠玑》,处处体现着思想的光芒。突然想起刚学习写代码时读过的《VC技术内幕》,⼏乎没有什么思想⽽已,通篇只是⼯具介绍。真应该早⼏年能读到这种⼤师级的作品。
⾔归正传,看看这本书⾥体现的思想:
真正的程序员怎样写出正确的程序:problem definition, algorithm design, and data structure selection.这告诉我们,当我们遇到问题的时候,⾸先要弄清楚到底问题是什么?然后再考虑合适的算法设计和数据结构。这⾥问题的定义很重要,它是指对⽤户需求⾼度抽象以后,从程序员的⾓度所看到的“问题”。问题定义得精确与否,直接影响到后⾯的算法设计和数据结构的难易度和效率。
Scaffolding(脚⼿架). 顾名思义,脚⼿架是我们在盖房⼦之前搭建的临时的框架,保证房⼦能按照设计来建造。scaffolding帮助我们能确保程序的正确性,就像我们盖房⼦⼀样。这个过程往往出现在coding过程中,特别是实现⼀个算法的时候。
⾸先,伪码帮助我们理清思路
在真正编码的过程中,利⽤scaffolding(通常是assert或者log)来确保程序执⾏到某⼀⾏时,某个变量预期的值应该是多少。这样在代码编写过程中保证我们的实现是正确的,避免之后通过debug来查错误,提⾼编码效率。
本书的第⼆部分的主题是Performance。包括时间效率和空间效率,往往这两个直接是有⼀定联系的。关于空间复杂度和时间复杂度的问题,《算法导论》有详细解释,我⽬前还处于初学阶段。本书通篇都在根据同⼀问题的不同solution来探讨如何把时间复杂度从n^2减少到 nlog(n),甚⾄线性的n,这些内容需要在下次阅读时仔细琢磨。说⽼实话,这个部分我最多理解了30%。作者还在书中提到研
究performance 的三个原因,有必要记录⼀下:
它在所有application的内在重要性(intrinsic importance)
Performance是学习编程的很好的素材,它⼏乎要考虑⽅⽅⾯⾯的问题。这⾥提到两个名词:估算(back of the envelope calculations), performance tuning.怎样写代码 自己做编程
第三个原因,也是最重要的原因:速度是必须的。作者引⽤了《壮志凌云》的原话引出 - immortal words of the 1986 film Top Gun:"I feel
the need for speed!"
本书的第三部分虽然叫做Product,但只是⽤前两个部分中的⽅法来解决⼀些有意思的⼩问题。往往⼀个问题有很多种⽅法来实现,然后根据当前⽅法的不⾜,来进⼀步提⾼并实现更好的解法。详细介绍了排序搜索(quick sort),Binary Search Trees, Heaps(binary tree的⼀种典型应⽤)。总结了部分经验:
对于⼤量数据n, Quick Sort可以做到O(nlogn)的run time排序;但对少量数据的排序,Insertion Sort表现更好,特别是那种基本上排序好了⽽只有少数⼏个没有按照顺序的数据。
heap的两个属性:order 和 shape。 order是指⽗亲总是⼩于或者等于孩⼦的值。shape是指树中没有空节点,叶⼦节点总是在最底下的两层中,⽽且如果⼀个节点只有⼀个孩⼦的话,这个孩⼦⼀定是在左节点,右节点为空。
Hash的重要性。在介绍查的时候(13.4),利⽤hash思想的bins搜索⽅法最快,超过了binary tree,让我对Hash有了深层认识。15.1中也提到了同样的⽐较。但对其中具体如何实现hash,我还存着疑问,只有等下次阅读来解决这个问题了。
最后,⽤作者在第⼀版的结束语中,对design process的总结来结束这篇读后感:
Work on the right problem
Explore the design space of solutions
Look at data
Use the back of the envelope
Exploit symmetry
Design with components
Build prototypes
Make tradeoffs when you have to
Keep it simple
Strive for elegance
keep it simple和Strive for elegance是我⽬前能理解和追求的两个⽅⾯,产⽣共鸣的感觉真好...  (全⽂完)