Posts archived in Recommend

30 comments

NPR简介

不论在美国的什么地方,只要你有一部收音机,调到一个电台,就立即能够深刻了解世界和社会。 这个电台,就是大名鼎鼎的NPR,美国国家广播电台。

和美国之音这样更多的负责外宣和价值观输出的电台不一样的是,NPR 就是为了教育美国公众而设立的。这个非盈利的电台不播送任何广告. NPR 的节目每个都质量上乘,有极强的知识性。正是如此, NPR 的听众相对教育程度较高。去年有本讽刺搞笑的书叫做《白人喜欢的东东》(Stuff White People Like), 调侃中产阶级白人的各种喜好, NPR 就是其中一样。比尔克林顿这哥们不止一次表示喜欢 NPR。 当年创立麦当劳的亿万富翁的遗孀,更是把所有遗产捐献给NPR基金会. 美国人的确喜欢听 NPR, 每年听众给NPR的捐款,占到NPR所有收入的一半。
对于大部分这篇文章的读者来说,NPR 可以作为一个非常好的英语学习工具。如果你在美国,那么可以免费听到最新鲜的英语,而且一点不需要专门花时间去听,只要闲暇时候带上收音机就行了。我练习发音的方法就是每天开车的时候跟读 NPR。 如果你不在美国也不要紧,NPR 的大部分节目都是可以在 iTunes 里面免费下载的(如果你到 iTunes 的 Podcast 的新闻、咨询分类里面,就会看到NPR的podcast 的流行度永远是前几名)。

我个人喜欢 NPR 的两个节目,一个叫 Wait wait… don’t tell me, 另一个是 Car Talk. 这两个节目都是搞笑见长。 前者是把每周新闻拿过来考打电话进来的听众,后者是两个兄弟解答听众的关于汽车的问题。 其中,Wait wait 可以说集成了美国文化的各个方面,有简单的名人访谈,有所有的美式幽默,有对政治和社会新闻的插科打诨。基本上 Wait wait 能听懂每个笑话的话,对美国社会和文化就有非常深刻的理解了。而一般的名人,都以上NPR 的 Wait wait 为荣。比如 Steven Chu 就说,他虽然是所有兄弟中最不聪明的,可他是第一个上 Wait wait 的。Car talk 则更加搞笑。表面上是一个解答车辆故障的节目,但两位MIT毕业的汽车修理工愣是把这个节目做成了NPR最受欢迎的节目,也让这两个人成为了美国文化的一部分。迪斯尼的电影汽车总动员,就把两兄弟请过去为那个锈迹斑斑的拖车和面包车配音。NASA 的 JPL (喷气动力实验室)的科学家甚至不止一次给他们打电话一起搞笑,有一次问的问题是“我们有个交通工具将要度过一个漫长的冬季,请问我们怎么准备”,结果搞笑了一阵子才知道他们问的是火星车怎么度过火星漫长的冬季。除了这些搞笑之外,Car talk 的确还能帮你学到汽车的一些基本知识,了解莫名其妙的疑难杂症。

除了这两个节目, All things considered 是一个非常好的新闻综述,Science Friday 是一个质量上乘的科普节目(常常采访一线科学家)等等,反正我打开收音机从来没有失望过。即使你不在美国,只要有 iTunes 就可以免费下载到大部分优质节目的 PodCast,所以一定不要错过 NPR。

这是一篇关于《我是一只 IT 小小鸟》的书背后的故事

霍炬

2007年冬天的,圣诞节,我从美国飞到北京,航班延误了8个小时,等我到北京的时候,已经是凌晨一点多了。我在机场给霍炬打了个电话,一个小时之后,我第一次见到了这个传说中的很义气的哥们,睡他们家客厅。2009 年夏天,敏感词那一天,在他的婚礼上,几乎有7,8个人都提到“第一次到北京就是睡在霍炬家客厅”。 霍炬就是这样一个人际关系的中心结点,三教九流的人他都认识,所以只要认识霍炬,就可以认识很多有趣的人。比如,我就认识了余晟,戴飞等一群人,其中有一个和这篇文章有关的,就是博文视点的周筠老师。

周筠

其实我连周筠老师面都没有见过,但是可以从各个侧面体会到她的人格魅力。 记得我写的文章第一稿交上去,周筠老师就大大的夸奖我错字很少。 我是羞愧难当的。我写中文文章有两个毛病: 老用英文标点;的地得不分。 周筠老师倒没责怪我,还夸了我一顿。 这以后,我每次修改文章的时候,都小心翼翼,害怕把当时的美好形象给破坏了:)

刘未鹏

那个冬天,我也顺便去了一趟南京,见到了当时刚刚开始做 TopLanguage 论坛的刘未鹏师兄。 我们在南大旁边的一家咖啡馆聊了很多。 当年刘师兄满腹的书积累的功底已经开始显山露水,和他说话我已经感觉是和阅历比我大好几岁的人说话,虽然我们年龄上几乎没有区别。 这两年,我就看他的豆瓣的读过的书单一天一天的往上加。 从两年前写了著名的 “我们都是信息时代的远古人” 开始,转型到专门写学习方法和认知科学的内容,从此一发不可收拾,成了很多我周围认识的人必看的博客。

西乔

西乔是霍炬的夫人。 我是见证了他们从开始到结婚的几个关键时刻的。 她现在给《程序员》杂志画漫画。 这次小小鸟书里面我的那篇文章前面的一个兔子洞的插图,画得很有灵气,就是西乔同学亲自绘制的。 她是在去香港的飞机起飞之前4个小时的时候赶工完成的。

许莹编辑

许莹编辑是专门负责修改润色我文章的编辑,也是一直负责和我联系所有的事情的编辑。 在北京的时候和她见过一面。 她做事很认真,我文章里面的错别字,不优雅的语法等等,都是她负责改正的。 最后书里的稿子和我博客上的稿子有比较多的区别,很多是许莹编辑的功劳,周筠老师也亲自操刀修改了一些。

硬币的反面

文章贴到 TL 的时候,就有读者说我的这篇光写了光鲜的一面,没写失败的一面。 其实我只不过才二十几岁的人而已,哪有什么巨大的失败呢,即使是一些不顺意的事情,过去之后都觉得不过如此,因此觉得很琐碎,不愿意花笔墨提了。不过如果非要写的话,我简略的补充两个吧。 第一个是高中,我花了很多的精力去准备计算机竞赛和数学竞赛,结果高二都没得到任何奖;我高三的水平和高二区别并不大,却一下子都得了奖。可以想象,我的高二到高三那段日子是极其苦闷的。 这种苦闷,和在单人牢房里的人的心境其实并无区别,而不亲自体会过的人是不知道的。 好在当时我有话就写在日记上,调节自己的心理状态,慢慢也就熬过来了。还有就是大学的数学建模竞赛了。 所有我认识的同学都认为我肯定会得奖的,偏偏就没有。 当时也是意难平,几个月过去之后也就毫无所谓了。 这两个硬币的反面,尤其是第一个,让我较早的就知道,没必要把所谓的”失败”看那么重,说不定几个月之后你当时苦苦追求的东西回头看来也是若有若无的东西而已,所以不要太执着什么成功失败。 如果这些所谓的失败让我学会了什么,我觉得就这个。 至于勤奋啊,专注啊这些,其实何必要失败教会你呢,只要勤奋一个月就知道勤奋的好处了,远不需要失败来刺激。

推广

因为我也参与了,所以也就厚颜无耻的鼓励大家去买这本书了 :) 人的经历本身不见得能够完全复制,但是这本书可以作为一手的资料,作为一种好的读品来消费。 我们这些作者的美好愿望是,写下最真实的经历,或许这些经历和感想能够帮后人吧。但是怎么读,读出什么,也就是看各人了。

另外,按照稿酬分配方案,我应该会拿到大约 6% 左右的稿酬。 我能拿到的这笔钱,会捐献给 OCEF(海外中国教育基金会)。 这个基金会的好处是,可以保证每笔钱都交给贫困的学生,然后把有着学生歪歪扭扭签字的领取资助的名单交给捐助人,有些捐助人甚至可以和学生直接通信询问情况,所以,最多只有 0% 的捐款会流向贵国政府。 我平均每年给这个基金会捐100美元的样子,今年因为经济危机的影响,前些天刚刚收到他们的邮件,说今年捐款下降,可能有孩子要被义务辍学。因此,我就拿着帮助贫困小朋友的高尚旗号,为这本书推广推广,恳请广大觉得这本书不错的朋友掏掏钱包。 我们都是有能力读书的人,但还有很多没能力读书的小朋友。或者你可以直接通过 OCEF 资助他们,不买这本书也成,就是出版社和周筠老师会比较伤心。不论买与不买,资助一下别人总是功德无量的,所以原谅我在这里唠唠叨叨的给大家说这些。

OCEF 的网址是:  http://www.ocef.org/newocef/en/

我已经和这个基金会打了好几次交道了,收到过地址姓名日期详细的受资助人名单 。他们非常值得信赖。

杂七杂八的堆一块儿不成文章了,对这本书感兴趣的国内读者留意各大书店的书架吧。

第一眼看到这个美剧的时候, 还以为是胡编乱造的民科, 像 CSI 和 Gray 一样不靠谱瞎编. 看了开头几集之后发现: 数学细节几乎没有错的. 加上好莱坞原有的犯罪片编剧的水平, 这可比其他美剧好看多了. (而且还有这么 l33t 的名字 :)

以开头的几集为例. 第一季第一集是一个真实的数学建模. 数据, 假设各方面要素都全了. 第二集是有点扯淡的测不准(只会影响微观测量), 但是顺便看到扫雷问题是 NP 完全的时候我还是会心一笑. (顺带八卦一下, Knuth 大爷说了, NP 和 P 的问题, 会在 2048 2^11 年或者 4096 2^12 年被解决 :) 这哥们黑板上写了 CLIQUE3SAT, 不知道大家注意到没有, 呵呵.

第三集的 Patient Zero 理论还是很靠谱的, SIR 模型列在黑板上的常微分方程也是看得我心痒痒的真想当场列一个 logistic 方程(SARS刚过去的那年我参加数学建模竞赛用的数学模型就是 SIR). 就是生物信息那边是极其不靠谱的. 病毒DNA测序之后哪有能拿DNA的N级结构直接 diff 一下就能比较出病毒不同的, 那还要基因挖掘和生物信息学干啥. 不过把数学家英明神武的塑造成一个生物信息学家还算可以接受. 第四集其实没啥技术含量, 说白了也可以说非线性方程的特性不能仅从坐标维度上的信息刻画. 比如 z = xy 在 (0, 0) 点的形态是非线性的, 但是沿两个坐标轴导数都是0 (八卦一下, 我去年很长一段时间的研究就是从子空间的性态去刻画非线性函数在全空间的性态, 显然需要很多的假设才能刻画准确). 第五集有点小民科, 因为黎曼猜想的证明方法可能是代数数论或者代数几何, 不见得就能“分解任意质数”. 况且, 要是有了任意分解质数的, 就 NP=P 了, Chariles 就可以直接回家享福了 (我可能是错的, 因为分解质数好像不是 NPC). Anyway, 分解质数必然会给 NP=P 问题更多的洞见.

下面的我还没时间看. 就转了一圈. wikipedia 有专门的每集用到的数学的列表.  还有无数的博客在分析这个剧集, 或者做科普. 可贵的是, 来自科研一线的数学家在帮助设计规划这个剧集. 据说当初一开始就是 Caltech 的数学家和研究生设计的脚本, 连黑板上的公式都是他们写的. 现在 Wolfram 接手了. Wolfram Research 据说还专门派了一个小组到哥伦比亚广播公司作剧集的数学顾问. 象牙塔里面的数学系也没闲着, 西东北大学有专门的关于剧集的博客. 康乃尔大学也有关于此的数学博客. 连 TI 都有面向教育的教案.

其实这也不是个案了. 我几个月前买了一本书, 叫做 “The Physics of Superheroes” (超人背后的物理学) 文风优美, 讲解深刻, 而且写作的教授可不是民科, 而是正儿八经的明尼苏达大学的物理学教授 James Kakalios.

一线的科学家能够放下身段找些大家感兴趣的话题作科普, 这个国家的下一代怎么能不强大? 什么叫科学技术强国, 从一些小侧面就看出来了.

补: 既然说到了科普, 最近关于爱科普的文章引起的争议也很多, 补几句废话吧.

首先, 我从来就不认为方舟子的科普写的好, 或者原创性高. 不信? 读读这篇. 你要是问我方舟子一天一篇从鳄鱼到链霉素哪来这么多材料(让我一天一篇写计算机科普我都要X尽人亡啊), 我就回答了: 呵呵, 呵呵, 美国的国家地理杂志恰好很多次都比方舟子的文章早一个月两个月印刷出来送到我手里. 所以我觉得, 大家不必迷信他的科普. 他囫囵吞枣的写很多不是他的研究方向的东西, 并且脱离科研一线很多年, 写出来的东西, 看了启发是不大的. 不必迷信这个人的文章.

其次, 我也是不怎么同意连岳在地震的时候的言论的, 但是我依然敬佩他作为一个评论人的勇气和洞见. 这些洞见并不因为他没学过概率论就失去价值. 我就算知道高深的数学, 我还是没他在社会问题上深刻. 人和人是有差距的, 不要用英俊的科学脸庞去鄙视别人, 至少读这篇博的人, 我希望没有这样的不健康的心态.

英文中哲学叫做 philosophy, 中文叫做爱智慧. 智慧是个抽象的东西, 只有去爱它, 才会变得有趣. 爱科学, 或者说, 爱这个世界和社会, 科学和社会才会变得有趣. 如果一个科普工作者不爱这个世界, 哪里会有超人的物理学这样有趣的书问世呢?

这七条都是我这个不怎么高效能编程的人悟到的. 不权威, 不一定全对. 

 

1. 使用工具帮你找 Bug, 而不是人工找. 

工具包括用单元测试, assert语句, 代码测试容器. 人工指用 print 和 debugger 一行一行跟踪. 我们知道, 编程中绝大部分时间是耗费在除 bug 上. 不同的人有不同的 debug 的方法. 我个人比较喜欢”极限编程(XP)” 学派的主义, 也就是说, 代码未动, 测试先行. 

单元测试中的红棒绿棒(熟悉 JUnit 的读者知道我在说什么)一出现, 哪里出了问题就一目了然. 单元测试的另外一个好处在于增加写程序的自信. 以前没用单元测试之前, 每天晚上改代码改到很晚的时候脑子常常不灵活, 把代码改错, 然后第二天来还要重头弄. 有了单元测试之后每天晚上保证测试全部过掉, 这样心理踏实, 睡觉也香, 早晨也不忙, 吃饭也棒. 

一般的语言都有 assert, 但是很少有人用. 其实 assert 是一个非常好的DEBUG 工具, C 的 assert 能够把哪一个文件哪一行出了错都告诉你. 不过我一般会自己写一个这样的 assert 宏:

#define ASSERT(value, msg) if (!(value)) {fprinft(stderr, "At file %s, line %d: \n message: %s\n", __FILE__, __LINE__, msg); exit(-1);}

这样的 ASSERT 可以带一个信息出来, 比起原来只告诉你哪个文件哪一行更加有价值. 

第三个是用容器帮你找 Bug. 这一点以 C/C++ 程序最为突出, 因为编译之后直接就是可执行代码, 运行时的信息不像 Java 和 Python 这样有 VM 的语言容易得到. 这时候, 我推荐 valgrind. 这个工具能够把 C/C++ 程序放到一个容器中执行, 记下每一个内存访问. 被这样的容器 debug 一下, 基本上指针指飞了 (Segmentation Fault) 的情况几乎就没有了. 想像一下是用 GDB 追踪非法指针和内存泄露方便, 还是用容器告诉你哪一个指针非法, 哪一个内存没释放方便 :)

 

2. 选用自动化工具构建

用 gcc 或者简单的 IDE 来编译和运行程序在编程初期是很快速的, 可是越到后来, 会越臃肿. 在编译的时候, 不同的参数, 不同的目标, 在 IDE/gcc 里面每次都要设定. 而且一般的 IDE 也不能做到自动解决依赖等高级方法. 因此, 最好的方法是用 Ant 或者 Makefile 管理项目. 这方面教程很多, 而且我估计编程的个个都知道. 不管项目大小, 注意频繁使用就是了. 

自动化测试也有很多工具, 特别是 GUI 和命令行测试的自动化, 工具链都很完整. 大公司里的程序员走这方面的流程都比较规范(我在西门子实习过), 但是小一点的公司中, 或者个人搞小项目的时候, 就不一定想得起来了(大部分我见到的程序员就手工来测试). 手工测试看上去快, 但是要是积累的次数多了就比较浪费时间了. 其实自动化测试工具的学习成本很低的, 事半功倍. 

 

3. 买本小书做参考, 而不是用 Google. 

这是大实话. 我大三开始学 Python 的时候, 语言特性并不熟悉, 手头也没有书, 因此常常连取个随机数都要上 Google 查一下库. 我发现, 不管网络多快, 自己搜索技术多牛, 还是没有手头一本书方便. 后来打印了一个7页的标准库的 cheatsheet, 编程立即行云流水. 我在实习的时候也观察到, 大部分时候程序员不可能记住一个框架所有的API, 所以他们要不等 IDE 几秒钟做代码补全, 要不一边翻文档一边做. 或许MSDN 这些本地文档系统比查书快吧, 但是用 Google 和网络搜索绝对比书慢. 现在因为工作原因, 常常要学一些新的语言, 我做的第一件事情, 就是把他的库接口的网页全部打印了下来. 

 

4. 用脚本语言开发原型

人月神话的作者 Brooks 说: 准备把第一版扔掉, 因为第一版必然要被扔掉. 这是大实话和真理. 既然第一版要被扔掉, 咱们就让第一版扔掉得越早越好. 说白了就是, 原型要快速的被开发. 

所谓的快速原型开发, 大致有两个捷径, 第一是只做核心的功能, 输入输出都是构造好的简单的例子. 第二是只做最简单的情况, 对于性能和健壮性什么的都不太考虑. 这两点, 恰好是脚本语言最擅长的. 脚本语言擅长于用精简的几行构造出复杂的功能, 并且语法很松散, 潜在假设程序是正确的. 

即使在代码编写阶段, 一些功能的实现, 也是要先写个简单的, 再慢慢打磨成复杂的. 脚本语言此时依然有用. 比如我在用 Java 的时候, 常常不确定一个函数返回的对象究竟某个属性是什么样的值. 这时候我就会用 Java 的 bsh 脚本写一行打印, 而不会写一个复杂的 out.println 再编译再运行再把那行删除掉. 当然, 这几年很流行动态语言, 原型和产品之间的差距已经变得很小了. 

 

5. 必要的时候, 程序要使用清晰的, 自我解释的文本文件作为日志输出. 

不知道各位调试程序的时候是不是和我一样, 看到不确定的和要跟踪的变量就直接插入一行 print. 我以前一直这样做, 但是频繁的插入这样的打印会使得屏幕的输出很乱, 不知道哪行是什么意思. 一个更加好的办法是写一个日志函数, 可以分也可以不分优先级, 总之保证 Debug 的时候的输出以一种统一的, 可管理的方式出现. 这样, 在最后发布稳定版本的时候, 只需要简单的几行命令就可以从代码中剔除所有的日志打印行. 

如果必然要输出日志, 最好要分配一个单独的命令行参数, 用来控制程序究竟输出不输出日志, 输出哪些日志. 一开始看上去这个是费时费力, 越到后来日志越多的时候, 就体会到方便之处: 有时候你只想要某一类日志, 可是其他的记录偏偏来捣乱. 多加一个参数可以使得程序更加灵活, 根本不需要去修改代码或者条件编译就能得到不同级别的程序日志.

日志和程序的输出结果一定要清晰且能自我解释, 否则不如没有日志. 我切身经历是这样的: 几个月前, 我一个程序跑了大约一天, 最后输出了很大的日志和结果. 但是很不幸的是, 结果里只有数字, 没有任何说明. 我自己都忘了每一行是什么意思. 而且更加麻烦的是程序的输出藏在重重判断和循环之内, 使得根本没有办法分析这一行输出对应的输入是什么. 于是, 最终只能再次浪费一天的时间让程序再跑一次.  经过这次教训, 我的程序日志和结果中插入了不少让人可读的内容. 这样, 即使程序丢失了, 结果还是能够被人解读的. 

更多的关于数据和程序结果要能自我解释的精彩论述, 可参见 More Programming Pearls 第四章. 

 

6. 使用命令行小工具操控分析你的结果和代码, 而不是用自己的眼睛和手.

我发现, 人有一个固有的习惯, 就是喜欢自己去”人工”, 而不喜欢用工具. 因为人工让人感觉工作更加刻苦, 更加快, 更加有控制感. 比如说吧, 上面我说的测试, 我就不只一次见到为了测一个交互式的命令行, 一个程序员宁愿老是每次打相同的三个命令, 而不愿意用一个简单的 expect. 再比如说, 面对长长的日志文件, 我见到很多人都是用文本编辑器直接打开, 用鼠标滚轮一行一行的往下翻, 而不是使用 grep. 包括看网页, 很多人从来不用查找功能, 而是一行一行的往下瞄. 包括打游戏也是, 好的UI脚本(不是外挂)一大把, 可是玩 WoW 的人很少用, 都喜欢自己重复点鼠标.

别看上面说的这些好像程序员没有, 其实我们常常陷入这个误区. 举个简单的例子, 一个 python 程序里面有十几个 print 函数, 我们想把这些打印全部灭掉, 一般人会打开文件慢慢瞄, 稍微高级一点的用查找, 找到了, 用快捷键删掉整行. 其实最好的方法根本都不要编辑器, 应该用 grep -v. 或者 sed, 但是这样的方法极少会有人用的. 我也是强迫自己无穷多次之后, 才渐渐的用这套快速的方法. 

 

7. 程序能跑就是万岁. 除非万不得已, 尽量不要在性能上优化你的代码

Knuth 名言: Premature optimization is the root of all evil. (提前优化是万恶之源). 一般我们写代码的时候, 不知不觉的就会觉得, 哎呀, 这样写效率不高, 我要构造一个数据结构啥啥. 随机访问一定要哈希表, 排序一定上快排, 查找一定要二分, 强连通分量一定要用 Tarjan 算法, 动规一定比穷举好等等, 这些竞赛的时候极限情况下正确的论断其实在实际环境中并不重要, 因为做编程的一开始关键是能跑, 而不是跑得快. 往往这么以优化, 程序很难 debug, 倒是还要去翻算法导论和TAoCP 看人家的二分怎么写的等等. 

在程序能跑的情况下, 优化也要特别小心. 我曾经有一个程序, 大约有 90% 的运算是查表, 只有 1% 的是乘法, 另外是一些判断和把插到的结果插入到一个集合中. 我的查表是用的最土的 list.index. 按照正常的想法, 应该把这个优化成哈希表. 而实际上我用 profile 工具一看, 才知道, 原来是插入到一个集合的操作费时间, 因为每次都需要 extend, 涉及到很多内存分配的操作. 我做过非常多的 profile 测试, 没有一次不出乎我预料的. 程序运行时间总是在自己不认为浪费的地方被浪费掉. 因此, 就算万不得已优化, 也务必要先做一下 profiling. 我喜欢 python 的地方就在于, 他的 profiling 只需要一行语句就完成了, 而且结果具体干净. 其他的语言, 至今没见到这么简单的 profiling 工具. 

 

另外: 用两个或者大于两个显示器. 不要用或者少用鼠标.

1. 梁文道老师写了一篇文章, 我认为很值得推荐.

西方媒体的偏见源于价值观

 2.  今天CNN上一个华裔教授也写了一篇文章,提到了 self-rightness 和 hypocrisy, 即自认为正确和自认为道德优越. 以我看,很多西方媒体,以及中国愤青,都是一样的手段. 利用自认为宽容的政治正确(或者自认为完美的民主自由,或者自认为正确的爱国主义)和道德制高点的大棒杀人,并不能以理服人。

Bashing China is not the answer

 真心希望多出现这样的理性思考者. 左派愤青请停止网络暴力,右派也请用理性思考,而不是屁股决定脑袋。大家一起合力解决这个国家对内对外的问题.没有什么能比上这件事情激起大家观点的激荡了,倘若中国的启蒙进程因此加快,言论和媒体因此放开,则不得不说是各派人士都乐于见到的. 

前天看到 pongba 说好书太多 以致于没时间写博客, 深有同感. 架子上目前放着 Dreaming in CodeTAoCP 第四卷第三册, 手不释卷, 以至于三上时间都不放过. 细想自己读过的好书不少(至于烂书, 只能用无数这个词来衡量了), 勉强回忆了一些让自己印象深刻的, 写一两句话的点评, 算是我眼中的必读经典吧.

A类. 基础

Structure and Interpretation of Computer Programs (SICP)


SICP 计算机程序的构造和解释 (SICP) 堪称是MIT计算机系的镇山之宝之一, 书中通过展示 LISP 语言和程序设计两条主线, 向读者展示了程序设计的几乎所有重要概念. 数十年来各种语言层出不穷, MIT 依然故我给入学本科生教 LISP. LISP 这种函数式的语言, 和过程语言相比, 理论更加优美(lambda 演算), 描述更加简洁. 现代的动态语言如 Javascript, Python 和 Ruby 都或多或少被 LISP 影响. 任何想写具有清晰结构, 或者正确思路的程序的人, 都应当阅读这本书. 好消息是, 这本书是可以在线免费看的.

The Art of Computer Programming (TAOCP)


计算机程序设计艺术 (TAOCP) 是计算机领域的一部未完成的里程碑. 如果之前没有听过它的大名, 那就不算学过计算机科学. Knuth (中文名高德纳) 阅读文献无数, 博古通今, 文风幽默. 书中讲解细致深入, 大开大阖. 如果说 SICP 是练童子功的话, 这本书就是属于名门正派的顶极内功. c0031186_46dce4fb1637c.gifTAoCP上往往一个普通的习题, 就是一个很经典的结论; 往往不经意的一句话, 就是一个巧妙的算法. Knuth 常常把貌似不相关的结论深刻的联系在一起, 比如我现在读的第四卷第二册上九连环问题和Gray码是深刻联系的, 易经和生物遗传密码子也是有对应关系的(当然不是民科说的那种).

如此的打通任督二脉的例子和习题俯拾皆是, 真的是穷人进了皇宫的感觉. 即使对于面试工作, 这套书也是值得一翻的: 在Google面试的时候, 面试官问一道题目, 我很快给了一个答案, 其中用到了一个不太显然的结论. 面试官问, 这个结论怎么来的? 我说, TAOCP 第二卷讲了这道题目的一个推广情形. 面试官说, 这道题目就是看面试的有没有看过 TAOCP. 我看很多人面试之前都在网上疯狂做题, 尚不能穷其一隅. 其实读过 TAoCP 的人极少会害怕面试的时候那些技巧性的问题. 万变都极少超出TAOCP划出的框架.

Introduction to Algorithm (CLRS)

0262032937-f30.jpg算法导论 (Introduction to Algorithm), 在圈子里常常按四个作者的首字母写成 CLRS, 算是对不愿意看或者看不懂 TAOCP 的人送上了半个梯子(还有半个当属具体数学 Concrete Mathematics). 这本书在美国大部分大学中被列为算法类教材, 在国内也是 ACM 竞赛集训必看的教材之一. 虽然名字里面带一个导论, 内容却一点不含糊. 在我个人看来, 其内容基本覆盖绝大多数常用的算法, 在 NP 复杂性理论以及近似算法方面也有所涉及. 这本书最好的地方是习题详细且全部没有答案, 非常适合作为大学课本和ACM讨论班阅读材料, 最坏的地方也在于没有答案, 对于自学者来说, 可能会觉得枯燥无味且困难重重.

另: 如果有淘老书的习惯, 不妨选择 The Design and Analysis of Computer Algorithms (计算机算法设计与分析) 这本书在 CLRS 出现之前绝对是算法教材一哥. 可惜这本书一直没有更新, CLRS 才以算法多而全取胜.

Compilers: Principles, Techniques, and Tools

这就是著名的龙书 (Dragon Book) 啦. 和上面的 The Design 一样, 都是 Stanford 教授 Jeffrey D. Ullman 的巨著. 计算机的历史很大程度上是编译器发展的历史. 当年 Knuth 就是因为写了Alogo 60 编译器后, Addison-Wesley 过来找高爷爷约稿, 1962年的时候就让他写本编译器的书. Knuth 写啊写啊, 发现写了很久还没写到主题. 那边编辑急了, 说你都写了3000页手稿了, 你还不交稿. 高爷爷说, 这个, 我还没写到正题呢. 书商说, 算了, 你出多卷本吧. 于是才51xtgj64tzl.jpg有了 TAoCP. 这个小故事也就说明计算机编程的发展史和编译器的发展史是平行的. 龙书基本上框出了一个编译器的架子, 从词法句法分析到类型分析 代码生成. 新版加入了JIT, 垃圾收集等现代特性. 这部巨作的作者阵容也是强大的: Alfred Vaino Aho 是 grep 和 awk 的作者. Ravi Sethi 以前在 Bell 实验室, 现在好像是朗讯的首席技术官. Avaya 实验室的头. 至于 Jeffrey Ullman 这个老头, 好玩的趣事就更加多了, 比如他是 Sergey Brin的导师, 他有两大不回信原则: 陶瓷信不回, 问书后习题信不回.

[under construction, more later...]

Modern OS

(Artificial Intelligence: A Modern Approach(AIMA)

Structured Compter Architecture

Computer Architecture: A Quantitative Approach

Computer Networks

B类, 编程

K&R C

Programming Pearls and More Programming Pearls
The Practice of Programming
Code Complete or The Elements of Programming Style
MMM(Mythical Man Month)
GoF’s Design Pattern
The Art of Unix Programming

C类, Geek

H2G2
GEB
How to Solve It
Elements of Style
The Cathedral and the Bazaar

今天推荐三个博客, 两个师兄, 一个学弟, 都是技术和生活类博客.

1. Pongba 刘未鹏

比我大一岁已经出了好几本书的正牌师兄. 对C++和其他编程语言都有深刻研究. 文笔我, 说理清楚, 适合喜欢计算机科学的以及同龄人. 博客在 CSDN.

随机文章:

康托尔、哥德尔、图灵——永恒的金色对角线

关于谭浩强老先生的《C++程序设计教程》

学习密度与专注力


2. cn.zhangzheng 张振

比我大一岁的混迹数家知名企业的自称 IT民工的正牌师兄. 当年我在西门子实习的时候就是靠此师兄罩着. 博客叫做 Z^{2}, 其实可以当成中国调侃版 Joel on Software.博客在 MSN Spaces

随机文章:

一个程序员的自我修养

有什么样的人民就有什么样的程序员

两会报告之IT民工理解


3. chen yufei

比我小两岁的南京大学软件学院的师弟. (好像) 在 SUN 实习. 文章内容涵盖开源技术 Ruby等语言,以及大学生活. 独立博客.

随机文章:

求斐波那契 (Fibonacci) 数列第 n 项的算法

我来自浦口大学

看 Concrete Mathematics 时对教科书的一点感想

If you were on Digg or Slashdot yesterday, you might notice an article titled “Last Lecture“. Yes, it’s an eyeball-catching title, but it’s true. Prof. Randy Pausch from CMU gets incurable pancreatic cancer and is dying soon. He gave this lecture and talked about his childhood dreams several days ago at CMU, which was his “last lecture”.

Here are my understandings towards his lecture.

1. Don’t panic, there are lots of brick walls in our life — all kinds of difficulties. Break them!

2. How many dreams did you hold in your childhood? Can you write/have you written them down? How many items on that list are checked?

3. Leave something for the world. All of us are dying anyway, but we can choose to leave a legacy or just die like an insect.

4. Let our bodies to the dust, but let the souls be everlasting. Live free, and die with your own significance.

I strongly recommend this video for everyone, the “last lecture” from Prof. Randy Pausch.

And of course, the perfect Time Management talk.