Hello World
Spiga

老赵书托(2):计算机程序的构造与解释

2009-07-15 00:11 by 老赵, 36326 visits

我要推荐的第一本书便是大名鼎鼎的《Structure and Interpretation of Computer Programs》,在国内可以买到中译版,即机械工业出版社的《计算机程序的构造与解释》。

抽象

sicp

豪不夸张地说,这是一本影响了好几代程序员的书。自从上世纪80年代MIT开始使用这本书作为教材开始,它使用Lisp语言——直到前两年才被Python取代,但是使用哪本教材不得而知,由这个侧面也可见SICP这本书的影响力有多么深远。在技术日新月异的计算机行业,有多少教材可以经得起20年的考验?

至于为什么要推荐这本书,还是要从这本书在讲什么东西谈起。您觉得,对于一个程序员来说,他最需要培养哪些能力?需要了解哪些知识?如果要我回答,我会说,一个合格的程序员需要一定要对计算机算法与数据结构有较为踏实的了解(这点在以前的文章中也重复了很多次)。至于“操作系统”、“计算机网络”、“编译原理”等课程是否重要?我不知道。这些课程都被广泛接受,所以它们肯定是有用的,但是如果您追问我它们的具体作用,我无法清晰明确地告诉您答案(例如,“编译原理”对普通程序员有什么作用?)——所以我不知道。当然,以后我还是会推荐一些这方面的书籍(因为“需要与否”其实都是个“尺度”和“方向”问题),到那时我们再继续谈论这方面的话题。

不过我可以肯定的是,一个合格的程序员(无论前台/后台,系统/应用),必须要有一定的分析问题解决问题的能力——或者说,抽象的能力。抽象是使用程序解决问题的必备手段之一。例如:

  • 您是否可以把一个多级的系统分类,理解为一颗树,然后用树或图的方式来处理它?
  • 如果让您解八皇后问题,或者走一个简单的迷宫,基本上不太会难倒你,但是您可以把自己的思路使用程序表现出来吗?
  • 领域驱动设计的一个重要部分,便是将真实世界中的“领域”提炼成模型,再使用计算机语言实现出来。

需要抽象能力的情况,数不胜数。而SICP这本书,其目标便是培养您的抽象能力,自然还有使用基本的手段进行组合来解决问题的能力。这点正如书中1.1节The Element of Programming中所述:

Thus, when we describe a language, we should pay particular attention to the means that the language provides for combining simple ideas to form more complex ideas. Every powerful language has three mechanisms for accomplishing this:

  • primitive expressions, which represent the simplest entities the language is concerned with,
  • means of combination, by which compound elements are built from simpler ones, and
  • means of abstraction, by which compound elements can be named and manipulated as units.

函数式编程

全书使用Lisp进行教学,这是一门函数式编程语言。有人说,函数式编程语言适合在实验室里把玩,不适合开发大型工程——我觉得这还是一个怎么看的问题。这里谈一个我的亲身经历:我在大学里也有课程是讲述LISP语言,但当时的感觉只是“一种比较新奇的语言”,至于它有什么用,它有什么帮助我根本一概不知。然而,经过了“工程”的磨练和实践之后,我反而慢慢体会到函数式编程的优势来。在我看来,函数式编程对于实际工程上的影响,一个主要的方面在于它可以使用更小粒度的抽象单元。对于面向对象编程来说,其抽象的最小单元为“类”和“实例”。试想如果您的程序想要展开“交互”,无论如何都必须从一个“实例”和“类”上面发起。而对于函数式编程来说,它最小粒度的抽象为“函数”。例如,您可以把一个方法作为另一个方法的参数或返回值(所谓高阶函数),而一段逻辑的实现完全可以通过“小方法”的组合来进行。不要小看这种抽象级别的改变,它会大大影响系统API的设计。

这里举一个示例。一个小问题作为示例:“求出a到b之间所有整数之和”。这很容易,您可以会这么做。

static int Sum(int a, int b)
{
    int sum = 0;
    for (int i = a; i <= b; i++) sum += i;
    return sum;
}

那么,“求出a到b之间所有整数的平方之和”或“绝对值之和”呢?当然,您可以再写两个方法。但是,从函数式编程角度来说,这完全是一个可以复用的逻辑:

static int Sum(Func<int, int> f, int a, int b)
{
    int sum = 0;
    for (int i = a; i <= b; i++) sum += f(i);
    return sum;
}

您可以将一个函数(在.NET里用委托表示)作为参数传入Sum方法,在调用时只需传入f的实现即可:

int i = Sum(x => x * x, 1, 3); // 14
int j = Sum(x => Math.Abs(x), -3, 3); // 12

甚至于,我们可以将其“部分应用(partial application)”1。简单说来,“部分应用”是将函数的部分参数固定,以得到一个新的函数:

static Func<int, int, int> SumCurry(Func<int, int> f)
{
    return (a, b) => Sum(f, a, b);
}

这样我们就可以使用SumCurry来获得新的函数了2

var sumOfSquare = SumCurry(x => x * x); // int i = sumOfSquare(1, 3);
var sumOfCube = SumCurry(x => x * x * x); // int j = sumOfCube(1, 3);

如果您理解了上面的代码,其实您已经对函数式编程更细致的抽象能力有所体会了。如果是面向对象编程,您需要怎么做呢?首先,您可能需要定义一个抽象类SumCalculator,其中有一个抽象方法为F。我们要复用算法,就必须构造SumCalculator的子类,提供F的具体实现。哪种做法简单,哪种做法繁琐,一目了然。

目前函数式编程几乎已经成了高级语言的必备特性了,如C#,F#,甚至颇有代替Java语言之势的Scala中也包含了相当的函数式编程能力。事实上,我认为出现这种趋势的一个重要原因,便在于人们之前对面向对象语言的抽象能力寄予过高期望,而这种期望的破灭(或者说“冷静”)使得许多人的注意力又回到了更容易“组合”和“复用”的函数式编程理念上。而且,其实人们从来没有放弃过对小粒度的事物的热爱。例如很多人喜欢C语言的原因,便是因为它没有庞大的架构,可以通过各种方法的组装来编写程序。而Unix编程艺术之一,便是大量小程序的组合复用。

您对函数式编程的重要性还有所怀疑吗?如果您觉得上面的例子还有些“玩具”感觉的话,您还可以参考我之前实现的CacheHelperAsyncTaskDispatcher(上下)或者微软的并行库——还有Matthew Poswysocki发起的“反对for行动”。您不妨思考一下,如果没有函数式编程特性,又该如何实现这些功能呢?

自然,函数式编程的优点远不止这一个。例如函数式编程中“无副作用”的纯函数,对于目前愈发热烈的并行环境也有重大意义。这些就要靠您来自行挖掘了3

补充建议

最后,还是补充一些我自己的建议吧4

首先,SICP是一本教科书,里面的示例和习题都是经过精心设计的,几乎可以说都是有针对性地培养各种能力。换句话说,如果您太“功利”地阅读这本书,可能会让您觉得失望。您没法从中学到如何开发一个网站,开发一个记事本,如何绘图,它完全是在锻炼程序员的基本能力,而不是“技术”。有时候,您可以把它当作一本数学书看,里面的题目也经常和数学有关——别担心,似乎高中数学水平应该足够了吧。另外,我建议您在看这本书时,最好可以挑一个风和日丽天气,准备一台笔记本去附近大学的图书馆里找个座位,像一个学生那样参加自习,慢慢地看耐心的看——没有笔记本?那也没关系,一个拔网线的台式机也可以起到差不多的效果。我也欢迎大家和我一起探讨其中的题目——虽然有相当部分内容我也不会。:P

ssics

看一本书,不一定要从头到底全部看完。SICP全书共分五章,我建议可以认真阅读前三章——没时间的话就精读前两章“过程抽象”与“数据抽象”。如果您有时间的话,也可以把第四章看完。至于第五章,有人说是SICP的精华所在,但是我认为啃下第五章的投入产出比相对前几章来说就相对较低了(第四和第五章使用Lisp实现一个解释器及一个简单的CPU逻辑实现,很难,不过这的确是Lisp最“美”最能体现出完备性的地方)。如果,我是说如果,您在阅读前两章时较为困难,也不妨先看一下《Simply Scheme: Introducing Computer Science》,您可以把它看作是SICP的基础5。值得一提的是,SICPSSICS都在互联网上公开——不得不敬佩他们对学术推广的态度。

real world haskell

您在学习SICP这本书时,也可以选择配合相关的公开视频。您有两个选择,一是Berkeley的上课视频,二是MIT的公开课件。前者的讲述较为轻松有趣,相对容易理解一些,我看了大半;而后者为SICP原书作者Hal Abelson 和Gerald Jay Sussman为Hewlett-Packard公司员工培训时的录像,我感觉更为体系、理论、也相对较为难懂——当然,这只是我看了Lecture 1的两段录像后的感觉。此外,北大也开设了《程序设计技术和方法》课程,使用SICP作为教材,相信也是不错的参考。

最后便是开发环境了。SICP使用Lisp语言,而在实验时,您不妨使用Scheme,它是Lisp语言的两种常见方言之一(还有一种是Common Lisp)。您可以使用GNU/MIT Scheme作为编译/解释器,不过我使用的是IronScheme,它基于DLR,也是.NET平台下的另一个编程语言实现。不过话说回来,其实我在做SICP的习题时使用最多的还是F#,它是由微软研究院发明的又一种.NET语言,同时拥有强大的函数式编程和面向对象能力。此外,我现在对于Haskell也有相当兴趣,这个老牌的纯函数式编程语言也慢慢地回到人们视线中来。我使用的参考书是《Real World Haskell》,它获得了Jolt大奖最佳技术书籍,希望能从中获取更多灵感。最关键的是,这本书也在互联网上完全公开——这是一种什么样的精神!

相关文章

 

注1:原本我这里写了“柯里化”,有朋友指出,严格说来这其实应该是“部分应用”。关于这点有待稍后确认。

注2:其实,如果您要在C#中实现部分应用,更通用的做法可能是构造如下的扩展方法:

public static Func<T2, T3, TResult> Currying<T1, T2, T3, TResult>(
    this Func<T1, T2, T3, TResult> f, T1 t1)
{
    return (t2, t3) => f(t1, t2, t3);
}

注3:这段文字只是为了说明FP并非玩具,是对您有切实帮助的——当然您也无需将其理解为“不学FP非好汉”的观点。关于这方面话题,您可以浏览怪怪同学的文章《嗯嗯,关于SICP》,一起品味一下。

注4:这些建议,乃至整篇文章都是根据我个人体会总结得来,有相当的主观成分。欢迎提出不同意见,多种看法的汇总对读者是最有价值的。

注5:这本书我只是简单的浏览过部分章节,因此感觉可能会有所偏差——当然,“SICP基础书籍”这个观点也是SSICC一书给自己的定位。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

116 条回复

  1. Collector
    *.*.*.*
    链接

    Collector 2009-07-15 00:33:00

    老赵你也太霸道了吧!非要强制人装ie8吗?
    我保留ie6是为测试我做的页面的浏览器兼容性滴。
    用ie6的还大有人在吧。
    现在用chrome看你文章,给你留言,偏不装ie8!!!

  2. 老赵
    admin
    链接

    老赵 2009-07-15 00:36:00

    @Collector
    不错不错,我也用Chrome,我只是不希望你用IE6浏览。
    你要留着IE 6做测试的话……我建议你去装一个IE Tester,方便又省事。
    我自然也知道IE 6用的人很多,我不是在推动IE 6的淘汰吗?
    如果IE 6已经没多少人用的话,我去封锁它做什么,呵呵。

  3. Anders Cui
    *.*.*.*
    链接

    Anders Cui 2009-07-15 00:38:00

    感谢老赵推荐这些好的书籍!

  4. 卡卡龙
    *.*.*.*
    链接

    卡卡龙 2009-07-15 01:03:00

    老赵我很喜欢看你的博文(包括大家的留言),很过瘾也学到很多。
    只是里面有太多我不懂的东西,还要自己努力学习。

  5. 老赵
    admin
    链接

    老赵 2009-07-15 01:10:00

    @Anders Cui
    客气,我会努力写好这个系列的。

  6. Xuefly
    *.*.*.*
    链接

    Xuefly 2009-07-15 01:10:00

    《Structure and Interpretation of Computer Programs》搜了一下有pdf电子版,已经下载了下来,只是不知道我能不能看懂

  7. 老赵
    admin
    链接

    老赵 2009-07-15 01:10:00

    @卡卡龙
    慢慢来,其实很多时候我觉得是被“吓到”,有什么不会的就问什么,什么不会就去搜什么学什么,很快的。

  8. 老赵
    admin
    链接

    老赵 2009-07-15 01:11:00

    @Xuefly
    本来就是完全公开的书,何必再搞成“盗版”,呵呵。

  9. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2009-07-15 01:39:00

    柯里化严格定义并不是这样的。
    文中的"柯里化"严格的说其实是"部分应用"(partial application)。

    这两术语的差别,用C语言描述就是这样:

    一个返回类型为R的n元函数F,
    R F(P1,P2,P3, ... Pn);

    对F柯里化,得到的是一个一元函数g:
    (R (*)(P2,P3, ... Pn)) (*g) (P1) = curry(F);

    g以F的第1参数为其唯一参数。
    返回类型是一个函数,该函数返回类型与F相同,少一个P1参数。

    以一个实际参数调用g,返回一个函数h:
    R (*h)(P2,P3, ... Pn) = g(a1);

    通过a1,与余下参数a2, a3, ... an 调用h:
    R r1 = h(a2,a3, ... an);

    通过a1, a2, a3, .. an调用F:
    R r2 = F(a1,a2,a3, ... an);

    两者等价:
    assert(r1==r2);


    柯里化得到的函数,始终是1元函数。
    以一个实际参数调用该一元函数,得到的是原函数的部分应用,也就是通常说得"绑定(bind)"。也不严格称为柯里化。


    C#我就不知道怎么描述柯里化与部分应用的区别了……

  10. 横刀天笑
    *.*.*.*
    链接

    横刀天笑 2009-07-15 07:54:00

    终于见到了你的书托系列。。。

  11. 非空
    *.*.*.*
    链接

    非空 2009-07-15 08:08:00

    在 灵格斯 起始页上居然出现老赵头像
    老赵太红啦

  12. ibei
    *.*.*.*
    链接

    ibei 2009-07-15 08:22:00

    非空:
    在 灵格斯 起始页上居然出现老赵头像
    老赵太红啦



    我也看见了~~
    神秘的书托系列终于出现啦~

  13. 冰の酷龙
    *.*.*.*
    链接

    冰の酷龙 2009-07-15 08:26:00

    ie8~其实有时候也是懒,所以才用ie6.
    自己做过css,所以知道很多痛恨ie6的感触。

  14. winter-cn未登录[未注册用户]
    *.*.*.*
    链接

    winter-cn未登录[未注册用户] 2009-07-15 08:30:00

    OwnWaterloo:
    柯里化严格定义并不是这样的。
    文中的"柯里化"严格的说其实是"部分应用"(partial application)。

    这两术语的差别,用C语言描述就是这样:

    一个返回类型为R的n元函数F,
    R F(P1,P2,P3, ... Pn);

    对F柯里化,得到的是一个一元函数g:
    (R (*)(P2,P3, ... Pn)) (*g) (P1) = curry(F);

    g以F的第1参数为其唯一参数。
    返回类型是一个函数,该函数返回类型与F相同,少一个P1参数。

    以一个实际参数调用g,返回一个函数h:
    R (*h)(P2,P3, ... Pn) = g(a1);

    通...


    果然啊 原来一直理解错了...... 不过貌似SICP确实是这么讲的

  15. Ryan Gene
    *.*.*.*
    链接

    Ryan Gene 2009-07-15 08:49:00

    IETESTER和真IE还是有一定区别的

  16. 老赵
    admin
    链接

    老赵 2009-07-15 09:01:00

    OwnWaterloo:
    柯里化严格定义并不是这样的。
    文中的"柯里化"严格的说其实是"部分应用"(partial application)。


    谢谢提醒,我再去理清一下这些概念,看看是否值得发文再解释清楚。:)

  17. 麒麟.NET
    *.*.*.*
    链接

    麒麟.NET 2009-07-15 09:03:00

    在地铁上用手机评论总是失败,只好到公司再来评论了。
    支持老赵!:)

  18. airwolf2026
    *.*.*.*
    链接

    airwolf2026 2009-07-15 09:57:00

    博客园出问题啦?
    打开老赵和dudu的帖子都是错误...囧

  19. CHwANG
    *.*.*.*
    链接

    CHwANG 2009-07-15 10:04:00

    终于见到老赵的书托系列,来捧个场(虽然今天推荐的书一本都没看过...)

  20. 老赵
    admin
    链接

    老赵 2009-07-15 10:04:00

    airwolf2026:
    博客园出问题啦?
    打开老赵和dudu的帖子都是错误...囧


    用户浏览博客园的黄金时间就这样被浪费了。

  21. CoolCode
    *.*.*.*
    链接

    CoolCode 2009-07-15 10:05:00

    airwolf2026:
    博客园出问题啦?
    打开老赵和dudu的帖子都是错误...囧


    我第一次打开时也是这样。囧too

  22. 巫云
    *.*.*.*
    链接

    巫云 2009-07-15 10:15:00

    我用IE7没有问题。

  23. 老赵
    admin
    链接

    老赵 2009-07-15 10:28:00

    @巫云
    现在好了。
    // IE6就有问题了,呵呵。

  24. Kai.Ma
    *.*.*.*
    链接

    Kai.Ma 2009-07-15 10:44:00

    例子写的非常不错!

    建议如果要锻炼函数式编程的功力,可以用下最常见的javascript。

    这种小巧又方便(基于web浏览器)的语言,实在是让人回味无穷。

  25. 老赵
    admin
    链接

    老赵 2009-07-15 10:49:00

    @Kai.Ma
    只是function关键字实在太长,呵呵……

  26. oec2003
    *.*.*.*
    链接

    oec2003 2009-07-15 11:00:00

    呵呵 老赵 等了很久了

  27. Terry Sun
    *.*.*.*
    链接

    Terry Sun 2009-07-15 11:03:00

    这本书确实值得推荐,不过从文章中更多的看出老赵对函数式编程的推崇

  28. wind.hong
    *.*.*.*
    链接

    wind.hong 2009-07-15 11:07:00

    看到一篇老赵07年的一个post 题目是 “离开了博客园一个半月,终于可以回来了”

    当中有人问你,贵庚几何

    您答道:已然二十又三。。。

    您老今年才25岁????
    太有才了。。。佩服的五体投地。。和你相比实在是惭愧。。。。

  29. 老赵
    admin
    链接

    老赵 2009-07-15 11:09:00

    @Terry Sun
    也就是中间一段文字而已,这段文字不说FP的好处,还应该怎么说呢,呵呵。
    其实我喜欢的应该是拥有函数式编程特性的命令是编程语言。
    因为这样我就能结合使用了。

    还有就是,用命令式编程写出无side effect的pure function很容易,但是用pure fp遇到需要side effect的情况就麻烦了……

  30. 老赵
    admin
    链接

    老赵 2009-07-15 11:10:00

    @wind.hong
    年轻好,咱精神好,身体棒,有激情,有冲劲。
    不过其实我也很羡慕一些很牛的人比我更年轻……

  31. seagreen7
    *.*.*.*
    链接

    seagreen7 2009-07-15 11:29:00

    谴责老赵的这种塔利班行为,把IE的版本信息修改成 8.0 ,终于进来了,哈哈。。。

    ===============================
    如下文本保存为.reg 文件,双击导入注册表即可。
    ===============================
    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version Vector]
    "VML"="1.0"
    "IE"="8.0000"

  32. 老赵
    admin
    链接

    老赵 2009-07-15 11:32:00

    @seagreen7
    userAgent果然不靠普哪。
    hmmm……我打算换种验证方式,例如调用一个IE6没有的方法,看看会不会抛异常。
    // 你们都不理解我的苦心呐……

  33. 飞林沙
    *.*.*.*
    链接

    飞林沙 2009-07-15 11:47:00

    我觉得函数式编程看Javascript方面的书更合适,毕竟离我们更近...个人感觉

  34. zzfff[未注册用户]
    *.*.*.*
    链接

    zzfff[未注册用户] 2009-07-15 11:51:00

    最好也是最烂的书,总之是本极端的书

  35. RednaxelaFX
    *.*.*.*
    链接

    RednaxelaFX 2009-07-15 11:54:00

    嗯,SICP超推荐。另外有一本组织方式跟SICP其实很像的书,叫做《ML for the Working Programmer》,使用的是Standard ML语言,这本我也挺喜欢的。F#与SML同属ML系语言,这本与F#会更亲近些。
    话说SICP里用的LISP就是Scheme方言。跟所谓的Original LISP相比,Scheme有lexical scoping,于是closure之类的概念也就出现在语言中。
    我是在南京大学软院,我们就完全没这类课程,教语言的课程都比较吝啬。幸好大三的时候跑到计算机系去蹭了课,旁听了他们的程序设计语言概论课,一开始就是用Scheme来讲解FP相关概念。课上推荐使用的实现是Petite Chez Scheme。后来发现PLT Scheme也挺好用的。那门课用的课本是啥来着……我忘了,类似的书读了一堆,不记得是哪本了。

  36. 老赵
    admin
    链接

    老赵 2009-07-15 11:56:00

    @RednaxelaFX
    软院的好多呀,我也是,呵呵。

  37. 老赵
    admin
    链接

    老赵 2009-07-15 11:56:00

    @zzfff
    我倒建议,如果真要学FP,就用FP语言吧。
    等学好了,运用得时候选择就会很多。

  38. Ray Z
    *.*.*.*
    链接

    Ray Z 2009-07-15 11:57:00

    希望这个系列能够出快点,但同时保持质量,中间间隔太长了。Anyway, thanks for your effort.

  39. RednaxelaFX
    *.*.*.*
    链接

    RednaxelaFX 2009-07-15 12:06:00

    @Jeffrey Zhao
    老赵是复旦软院的吧?我总觉得南大软院好水……

    对了,提到MIT改为使用Python为入门语言,我就想起这篇:http://www.javaeye.com/topic/357380
    SICP的作者对这一变更显然是不满的 =v=

  40. rex xiang
    *.*.*.*
    链接

    rex xiang 2009-07-15 12:07:00

    FP中, 多个参数的函数调用, 都是单独依次调用参数的语法糖.

    sum a b c实际上是sum(a)(b)(c)的语法糖.所以curry能冒出来也很自然.

  41. 老赵
    admin
    链接

    老赵 2009-07-15 12:10:00

    @rex xiang
    你说的是逻辑上的完备性,至于某个编译/解释器的实现,是没有规定的。

  42. 老赵
    admin
    链接

    老赵 2009-07-15 12:10:00

    @RednaxelaFX
    其实……我觉得还是靠个人重要,学校就是个辅助……

  43. 虫子混混
    *.*.*.*
    链接

    虫子混混 2009-07-15 12:57:00

    等你等到我心碎。老赵以后会不会推荐一些针对.net的书?

  44. 老赵
    admin
    链接

    老赵 2009-07-15 13:07:00

    @虫子混混
    目前准备好的书里没有针对.net的……

  45. 老赵
    admin
    链接

    老赵 2009-07-15 13:17:00

    咦,这篇文章的“反对”怎么这么多?

  46. 陛下
    *.*.*.*
    链接

    陛下 2009-07-15 13:27:00

    Jeffrey Zhao:咦,这篇文章的“反对”怎么这么多?

    风云人物总是会有些争议,又不是“绯闻”,有点“反对”怕啥:)

  47. Haozes
    *.*.*.*
    链接

    Haozes 2009-07-15 13:32:00

    我是土木毕业的,现在在看<深入理解计算机系统>
    感觉相当不错(除了中文版的一些错误以外,其他都很好),不知这本和那本比起来,老赵更看好哪本.

  48. 老赵
    admin
    链接

    老赵 2009-07-15 13:35:00

    @Haozes
    CSAPP是我下次推荐的书,其实我之前也在犹豫,先推荐哪本好。
    两本完全不是一个类型的,都要看。

  49. Haozes
    *.*.*.*
    链接

    Haozes 2009-07-15 13:43:00

    @Jeffrey Zhao
    THX,对于你推荐以及推荐的详细说明评论很赞.在你推荐完关于计算机体系结构一类的书后,希望能推荐点关于算法以及数学方面的东东,这方面除了看过一本数据结构教材,连计算机系基本的数学就没学习过,感觉很欠缺.
    虽然我不是计算机专业毕业,我想很多人和我一样基础薄弱吧

  50. 老赵
    admin
    链接

    老赵 2009-07-15 14:01:00

    @Haozes
    其实我并不擅长算法和数学方面的东西,我量力而行吧,虽然也有这计划。
    这本书是编程基础,我认为比专功数据结构和算法的书更有阅读必要。

  51. Sumtec
    *.*.*.*
    链接

    Sumtec 2009-07-15 14:02:00

    @Jeffrey Zhao:
    你的本篇文章应该部分搬到维基百科上,如果我搬上去了,你不会抱怨版权问题吧?

  52. seagreen7
    *.*.*.*
    链接

    seagreen7 2009-07-15 14:05:00

    @Jeffrey Zhao
    在下是小鸟一只,期待大牛道出“苦心”

  53. just [未注册用户]
    *.*.*.*
    链接

    just [未注册用户] 2009-07-15 14:27:00

    这么好的文章,为什么会有这么多人反对?
    不管是针对LZ本人还是什么原因的,但这文章还是可取的,至少LZ用心去写了这文章。。。

  54. 老赵
    admin
    链接

    老赵 2009-07-15 14:36:00

    Sumtec:
    @Jeffrey Zhao:
    你的本篇文章应该部分搬到维基百科上,如果我搬上去了,你不会抱怨版权问题吧?


    我这边用CC授权,应该还是很宽松的吧。我倒是觉得维基百科那边会不会有要求。

  55. 老赵
    admin
    链接

    老赵 2009-07-15 14:38:00

    @just
    因为我太招摇了,例如会坚持一些我认为是正确的,但是广大群众一时接受不了的事情,所以看不惯我的人应该还是蛮多的,嗯嗯。
    在博客园第一年我是老好人,第二年我是普通人,第三年开始我就变得有激情了,因为我打算用自己微薄的影响力去做点有益的事情,嘿嘿。

  56. Justin
    *.*.*.*
    链接

    Justin 2009-07-15 14:51:00

    顶一下
    期待老赵书拖好久啦
    单看这篇文章,有点缺少感觉

  57. 老赵
    admin
    链接

    老赵 2009-07-15 14:55:00

    @Justin
    老赵书拖,当然老是要拖。
    // 缺少什么感觉?提一些改进意见吧?

  58. Xuefly
    *.*.*.*
    链接

    Xuefly 2009-07-15 16:20:00

    wind.hong:
    看到一篇老赵07年的一个post 题目是 “离开了博客园一个半月,终于可以回来了”

    当中有人问你,贵庚几何

    您答道:已然二十又三。。。

    您老今年才25岁????
    太有才了。。。佩服的五体投地。。和你相比实在是惭愧。。。。


    老赵是85年的

  59. 王德水
    *.*.*.*
    链接

    王德水 2009-07-15 16:57:00

    这个模版我用css和jquery都改不了右边的宽度。可以改右栏的宽度吗?

  60. 老赵
    admin
    链接

    老赵 2009-07-15 17:04:00

    @王德水
    一个网页,哪又改不了的道理……

  61. 王德水
    *.*.*.*
    链接

    王德水 2009-07-15 17:24:00


    div#sidebar {
    float:left;
    margin-left:-215px;
    width:200px;
    }
    知道了,后面的覆盖了

  62. 老赵
    admin
    链接

    老赵 2009-07-15 17:34:00

    @王德水
    这个模板不适合直接用,只适合有能力而且热爱hack的人。
    右边宽,因此适合需要放很多内容的人。

  63. 蓝色海洋
    *.*.*.*
    链接

    蓝色海洋 2009-07-15 19:04:00

    楼主:

    我们要想看楼主的文章,不安装IE8,否则连门都进不来。

    老实说,自己的机器较老,又是集成显卡,一直用IE6,也没觉什么。可是,一旦安装IE8,总是觉得不爽。

    楼主是MVP,想推广IE8也是情理之中的。只是希望楼主能否抽空,写一篇推介IE8的文章,让我们有个理由。

  64. 老赵
    admin
    链接

    老赵 2009-07-15 19:33:00

    @蓝色海洋
    mvp和ie8有什么关系,别有事没事就把我的动机和某些肮脏的东西联系起来,好不好?
    你这么想只能证明,假如你当了mvp就会不分青红皂白舔微软屁沟,我丢不起这个脸。
    facebook,twitter也咔嚓ie 6,难道它们也都收了微软好处?也不看看我是在“推广IE8”还是“抵制IE6”,我自己用的都是Chrome。
    我的理由就是,ie6这个恶劣的浏览器,从性能/功能/安全性/速度……都没有任何可取之处,早该淘汰了。

  65. 蓝色海洋
    *.*.*.*
    链接

    蓝色海洋 2009-07-15 20:20:00

    噫!刚吃完饭,怎么楼主就抓狂了?你是不是有点敏感了?

    我觉得自己并没有冲撞你啊!只是觉得你用IE8拦住我们,显得有点霸道!

    你是园中的名人,前几日你又当上MVP,还写了篇关于MVP的文章,大家关注你也是非常正常的呀。

    我63楼的帖子,怎么看也不象是侮辱你的。你要是条汉子,就将我这两个帖子留下。

    看来你的技术与心理反差太大了!

  66. Xuefly
    *.*.*.*
    链接

    Xuefly 2009-07-15 20:40:00

    @蓝色海洋
    不懂不要瞎YY
    Jeffrey Zhao一直都是MVP,始于2007年!你到现在才知道Jeffrey是MVP说明了Jeffrey的谦虚和不张扬,你没见过Jeffrey在哪里说过自己是MVP吧?反正我是从来没见过。
    Jeffrey Zhao他不是MVP,他是中国的Jeffrey Richter!
    ^_^
    Richter写了很多书,很多我读不懂的书,还是母语更有亲和力,很期待老赵的书。

  67. 蓝色海洋
    *.*.*.*
    链接

    蓝色海洋 2009-07-15 21:00:00

    又一马屁精!

  68. iPeng
    *.*.*.*
    链接

    iPeng 2009-07-15 21:14:00

    本以为老赵会首先推荐些.net的书籍,我浅薄了。像我等初级程序员看得也就是像《Programming ASP.NET》、《Programming C#》这样的书。
    继续期待这个系列。
    ps.看来在程序员这个群体里,抵制IE6也不是件一帆风顺的事儿。

  69. 老赵
    admin
    链接

    老赵 2009-07-15 21:15:00

    @蓝色海洋
    放心,我从来不删回复的,你在blog上搜搜看,骂我的评论一抓一大吧,你找不到我还可以推荐你一些密集的帖子。
    所以说,你还是“不吝以最恶劣的方式”来揣测别人的动机啊。不过我相信一点,对别人的猜测,就是自己内心世界的投影。

    关于封杀IE6问题,我再解释最后一句:
    你用IE7,你用FireFox,你用Chrome都可以正当访问,只有IE6不行,完全没有逼你装IE8。
    我既没有导向IE8页面,也没有给出IE8链接,三个推荐的浏览器我同时提及,不偏不倚。

    其他不就多作评论了。

  70. 老赵
    admin
    链接

    老赵 2009-07-15 21:16:00

    @Xuefly
    首先,我不谦虚的,我还是比较张扬的。
    其次,我只会写博客,写不来书的。
    不过还是多谢支持了。

  71. 老赵
    admin
    链接

    老赵 2009-07-15 21:20:00

    iPeng:
    本以为老赵会首先推荐些.net的书籍,我浅薄了。像我等初级程序员看得也就是像《Programming ASP.NET》、《Programming C#》这样的书。
    继续期待这个系列。


    SICP其实是给高中毕业,刚上大学的人看的,所以它其实的确是一本入门书。
    这本书好好在,往往可以常看常新,提高的是“能力”,是很踏实的。
    李笑来老师的新书《与时间做朋友》还建议,最好可以学一门编程语言,可以有效的提升思维能力。
    其实SICP……似乎还是蛮合适的。

  72. 蓝色海洋
    *.*.*.*
    链接

    蓝色海洋 2009-07-15 21:44:00

    Jeffrey Zhao:
    @蓝色海洋
    放心,我从来不删回复的,你在blog上搜搜看,骂我的评论一抓一大吧,你找不到我还可以推荐你一些密集的帖子。
    所以说,你还是“不吝以最恶劣的方式”来揣测别人的动机啊。不过我相信一点,对别人的猜测,就是自己内心世界的投影。

    关于封杀IE6问题,我再解释最后一句:
    你用IE7,你用FireFox,你用Chrome都可以正当访问,只有IE6不行,完全没有逼你装IE8。
    我既没有导向IE8页面,也没有给出IE8链接,三个推荐的浏览器我同时提及,不偏不倚。

    其他不就多作评论了。


    感谢你对我的揣测,可是我一点都不生气。因为,自己乃一小人物,没有任何的负担,一直快快乐乐的。

    我的两个帖子,没有任何攻击你的言行。我想看见这帖子的人,都会有一个自己的评价。

    不过,我还是想心平气和地问你一句:

    在你的一生之中,就从没有揣测过别人?

    如果,没有对别人揣测的体验,你又怎么会有内心世界的投影的认识呢?

  73. iPeng
    *.*.*.*
    链接

    iPeng 2009-07-15 21:45:00

    Jeffrey Zhao:

    iPeng:
    本以为老赵会首先推荐些.net的书籍,我浅薄了。像我等初级程序员看得也就是像《Programming ASP.NET》、《Programming C#》这样的书。
    继续期待这个系列。


    SICP其实是给高中毕业,刚上大学的人看的,所以它其实的确是一本入门书。
    这本书好好在,往往可以常看常新,提高的是“能力”,是很踏实的。
    李笑来老师的新书《与时间做朋友》还建议,最好可以学一门编程语言,可以有效的提升思维能力。
    其实SICP……似乎还是蛮合适的。


    谢谢,我会好好看看这本书的。笑来老师的这本书我也正在看,受益颇多。
    另外,我没上过大学,荒废了很多时间。数学和英语这方面的基础现在基本为0,羞愧。

  74. 老赵
    admin
    链接

    老赵 2009-07-15 21:48:00

    @蓝色海洋
    我又没有说过我是圣人,我当然也会有阴暗的想法,这点我从来不隐瞒。
    只不过,我能分清什么是恶意揣测,就能控制自己,不用这种方式去思考别人,至少不说出来,呵呵。
    好吧,您可能的确没有恶意,但是用你这些话来恶意攻击的人,我见了实在太多了,不好意思要您为那些人默默承受这些了。
    我虽然相信清者自清,但是我也相信FUD这种东西。所以至少在目前,我见一次这种说法,还是会反击一次的,实在是不好意思了。
    最后,我还是恭喜您摆脱了IE 6的魔爪,步入了互联网的新时代。

  75. 蓝色海洋
    *.*.*.*
    链接

    蓝色海洋 2009-07-15 22:00:00

    楼主还会“呵呵”啊?我还以为光会打 V~ 了!

    算了吧!

    今后要是还想接贴,还是先打个草稿,好好地润色润色。

    反正IE8也装上了,也不想卸了。

  76. 老赵
    admin
    链接

    老赵 2009-07-15 22:01:00

    @蓝色海洋
    恩,最好可以好好写篇文章,作为一篇博客发表,这才是认真的做法。
    就算对我有意见,只要言之有物有理,我一样捧场——当然,能做到对事不对人就更好了。
    例如这次,如果你不提mvp这回事,我肯定不会嗷嗷叫。可惜你一提mvp就是对人了——ie8好不好,ie6差不差,和mvp有什么关系?
    不围绕讨论的对象发言,转而猜测别人动机,这样做很不好——虽然我承认,这很常见。

  77. freecloud
    *.*.*.*
    链接

    freecloud 2009-07-15 22:34:00

    没得说,记得大学第一学期,就学的这本书,是从MIT网站down下来打印装订的。从这本书学到了很多编程的思想和算法

  78. 老赵
    admin
    链接

    老赵 2009-07-15 23:02:00

    @freecloud
    羡慕,我是毕业后才看的……

  79. ie6+ is garbage[未注册用户…
    *.*.*.*
    链接

    ie6+ is garbage[未注册用户] 2009-07-16 00:41:00

    太不厚道了,还变着花样玩
    强推IE6+你怎么不弹对话框不跳转链接了
    话说IE6+老爷机没法瞻仰
    只好把二奶Opera拖出来了废话了
    IETester无法完美模拟IE
    以IE6为基础写的CSS易于兼容IE6+,Firefox,Opera
    受不了IE6+要性能没性能要兼容性没兼容性
    所谓的性能提升也是以空间换时间,严重BS

  80. hyddd
    *.*.*.*
    链接

    hyddd 2009-07-16 08:38:00

    这本确实是好书啊~不过略嫌中文版的翻译有点烂:<
    希望老赵以后经常介绍好书。

  81. 老赵
    admin
    链接

    老赵 2009-07-16 09:18:00

    @hyddd
    我没有看过中文版……英文版是公开的,直接看吧。

  82. 老赵
    admin
    链接

    老赵 2009-07-16 09:20:00

    @ie6+ is garbage
    我可没有强推IE8,我是强踩IE6。Opera也不错,只要不是IE6就可以了。
    我也做过前台,不觉得为什么IE6写的css容易兼容FireFox,Opera。
    IE7/8,FireFox,Opera,Chrome很接近,都和IE6差蛮远的。

  83. 无恶意的猜测[未注册用户]
    *.*.*.*
    链接

    无恶意的猜测[未注册用户] 2009-07-16 18:32:00

    老赵,关于吉日硬回车的问题,我也观察许久。
    凡是没有图的文章,会出现此问题。
    估计他是用记事本写的,而且没有打开自动换行功能,所以得硬回车。
    据观察,断行的字数有规律的。

  84. 老赵
    admin
    链接

    老赵 2009-07-16 18:54:00

    @无恶意的猜测
    原来如此,很有道理!

  85. 我也不肯定[未注册用户]
    *.*.*.*
    链接

    我也不肯定[未注册用户] 2009-07-16 19:38:00

    老赵,吉日6月22日所写
    《大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(四)高效的后台权限判断处理》

    开头有一张三张表的关联图。但这不象是抓下来的,好象是自己画的。其中,两个关联箭头的其中一个,方向不对。自己也不肯定,请你看一看。

  86. peterzb
    *.*.*.*
    链接

    peterzb 2009-07-16 20:26:00

    Xuefly:
    老赵是85年的


    这么年轻, 看来我也快成一IT老人了,哈哈!

  87. 勇赴
    *.*.*.*
    链接

    勇赴 2009-07-17 16:47:00

    抓狂

  88. 勇赴
    *.*.*.*
    链接

    勇赴 2009-07-17 16:50:00

    博客园有点慢,微软的网站更慢,鼠标都摔坏,多亏没把本本拍坏,哈哈

  89. 老赵
    admin
    链接

    老赵 2009-07-17 19:59:00

    @勇赴
    最近博客园不是一点点地慢。

  90. testtest[未注册用户]
    *.*.*.*
    链接

    testtest[未注册用户] 2009-07-18 23:51:00

    问个不相关的问题,老赵今年贵庚啊,取得这么大成就。

  91. testtest[未注册用户]
    *.*.*.*
    链接

    testtest[未注册用户] 2009-07-18 23:53:00

    不好意思,楼上兄弟貌似已回答了,没看帖子。太牛了,令我汗颜呐。

  92. 暴文宾
    *.*.*.*
    链接

    暴文宾 2009-07-19 16:25:00


    85?
    恩,
    我也要脸红一下.

  93. airwolf2026
    *.*.*.*
    链接

    airwolf2026 2009-07-21 17:25:00

    老赵,会不会觉得自己的时间不够用呀?
    哈哈.看你的文章里面涉及的很多内容,俺都很想去看.
    可是经常觉得时间不够...那些喜欢的书,还有那些喜欢的游戏...
    还有那个喜欢的人...如何取舍呢?

  94. 老赵
    admin
    链接

    老赵 2009-07-21 17:35:00

    @airwolf2026
    肯定不够用的,一点点看,抓紧时间看就行了吧。
    至于喜欢的游戏……每天给自己制定任务,做完了才能玩。

  95. 王丰
    *.*.*.*
    链接

    王丰 2009-08-18 14:06:00

    看了老赵的大力推荐,在网上搜到e文电子版的,reading。

  96. Aslan[未注册用户]
    *.*.*.*
    链接

    Aslan[未注册用户] 2009-08-22 14:34:00

    虽然对这本书仰慕已久,但是最近在网上查资料的时候却发现从08年开始MIT就已经不再开设这门课程了,不知道是什么原因,是跟不上时代的脚步了还是有了更好的课程来代替?

  97. zhaorui
    *.*.*.*
    链接

    zhaorui 2009-11-24 01:11:00

    我想知道如果把这本书通读一遍,如果稍带着看看视频和课件,翻一下 SSICS ,得多长的时间?

    如果每天看一个小时,估计得半年以上?

  98. 老赵
    admin
    链接

    老赵 2009-11-24 01:24:00

    @zhaorui
    每天3小时吧。

  99. 老赵
    admin
    链接

    老赵 2009-11-24 01:25:00

    @Aslan
    的确不开这门课了,可能是有些“落伍”了吧,不过这门课的价值依旧,你可以关注一下大众舆论,呵呵。

  100. zhaorui
    *.*.*.*
    链接

    zhaorui 2009-11-27 00:01:00

    @Jeffrey Zhao

    有点被吓到了,每天三个小时,半年看完,也就是540小时左右的工作量。

    不太明白这个 6.001 SICP 和那个 6.00 ICSP 之间的区别。

    之前准备看 SICP,还翻了一下 the little schemer,感觉 schemer 似乎更加贴近计算机硬件的设计,比如只提供了 add1、sub1 等简单的操作……

    对 python 没有什么了解,只知道是动态语言。

    感觉似乎还是用 scheme 来表达计算机的底层设计比较合适。

    Jeffrey 推荐了 SICP(看了书托系列之后,原本打算按本溯源,先看 SICP,再看 CSAPP),现在又推荐了 mit 6.00,让我有些犹豫。

    不过闲着也是闲着,要是有时间干脆都看看好了。

  101. 老赵
    admin
    链接

    老赵 2009-11-27 00:03:00

    @zhaorui
    我的意思,既然每天1小时要读半年,那么不如一天读三小时,2个月就行了,呵呵。

  102. Alex HE
    116.232.91.*
    链接

    Alex HE 2010-06-10 12:20:50

    Dear 老赵, 书已经买了,但是被同事们鄙视了,他们说没有用,我会慢慢啃完的,谢谢你的推荐,否则我一辈子估计都不会知道这个书的

    Alex He

  103. ==
    221.224.90.*
    链接

    == 2010-07-23 19:41:28

    正文第一个字就错了

  104. lovedeeply
    119.131.164.*
    链接

    lovedeeply 2010-08-27 15:42:44

    老赵几时介绍下算法和数据结构的书呢.

  105. lixiong
    58.41.86.*
    链接

    lixiong 2011-03-07 21:49:31

    我日 好书!!! 老子买来放了三年了... 今年拿出来, 才看到40页, 什么函数编程,尾递归,高阶函数的, 原来人家lisp时代就已经搞定了....

  106. 老赵
    admin
    链接

    老赵 2011-03-08 12:25:43

    @lixiong

    本来函数式编程就比其他编程范式要早好久……

  107. lixiong
    58.41.86.*
    链接

    lixiong 2011-03-13 00:00:53

    不在于谁早谁不早, 在于这本书讨论的是本质. 原来Enumerator采纳的也就是stream的模式. 第一次知道了PV操作的P,V来源于荷兰语. 不过话说回来,要是大一的时候让我去看,没什么兴趣不说,还真看不懂.

  108. 养志1234
    114.112.44.*
    链接

    养志1234 2011-06-26 21:40:20

    请问博主,这本书用什么软件做习题啊,下载的这种软件很生僻的。我找了很长的时间,都没找到下载它的软件。下载了一个newlisp的软件,一开始书中前几页的代码还能运行,但第12页, 以后的代码就不能编译通过了。我参考了一些资料,但是都没有找到答案。有关lisp语言的资料实在是太少了。

  109. 链接

    Fergon 2011-10-01 14:01:32

    真是相见恨晚,只恨到现在才发现这本书,可怜的我这两年一直都在苦苦思考、推导书中的一些内容。 中文版可以加快阅读速度,但译者显然不是程序员出身,一些地方必须对照英文版。

  110. 老ID
    218.19.187.*
    链接

    老ID 2011-10-26 14:08:07

    大家把看这本书的体会说一下咯!

  111. 景天夕瑶
    199.255.83.*
    链接

    景天夕瑶 2011-11-07 18:09:12

    我没看过北大青鸟的东西,但是尚学堂的看过不少,我倒是不太排斥这种培训机构,最重要的是你自己要思考,听老师的,但同时不受制于他才是最重要的。

    这些培训机构对于初学者入门还是很有帮助的,至少我自己觉得,你可以比较快的掌握主线,所以这样你自己就可以利用自己的已有知识来对照新知识,知道从哪里下手。否则就只能从user guide、hello world一步步慢慢看,但是你不可能有那么多时间和精力把那么多东西都理解透彻。

    像在重点班,有人专注于数学竞赛、有人专注于物理竞赛,有人专注于化学竞赛,这样,你如果是数学竞赛为主,同时物理化学也不错,但是有些东西还是不很透彻,你非常可以像搞物理化学竞赛的同学求助,这样可以节省你非常多的时间,因为老师并不是时时刻刻都能找到的。

    在出了学校之后更是这样,所以这些培训机构既然能节省你的时间,那为什么不听下呢,还是一句话,关键在于你自己要思考,不能盲从。

  112. 老赵
    admin
    链接

    老赵 2011-11-07 18:28:25

    @景天夕瑶

    其实你说的不错,不过怎么评论在这篇文章下面啊,呵呵。

  113. 景天夕瑶
    199.255.83.*
    链接

    景天夕瑶 2011-11-08 12:09:46

    static int Sum(Func<int, int> f, int a, int b)
    {
        int sum = 0;
        for (int i = a; i <= b; i++) sum += f(i);
        return sum;
    }
    

    这段用java来实现的话,可以做一个Caculator的类,里面有abs之类的方法,然后通过反射来做,就是有点麻烦,如果有需要,可能会出框架(或者已经有了)。

    至于无副作用的纯方法,java里面很多static的就有这种特性,像String的toLowcase之类,主要是同步的时候要注意。

  114. Scan
    119.130.185.*
    链接

    Scan 2014-12-17 18:04:06

    (第四和第五章使用Lisp实现一个解释器及一个简单的CPU逻辑实现,很难,不过这的确是Lisp最“美”最能体现出完备性的地方)

    我记得第5章不是讲CPU实现的。

    第5章做了3件事:

    1. 为了不依赖具体的平台,自己设计了一套指令集,类似x86的。然后用Scheme解释执行这套汇编语言,这里不涉及任何门电路等。(挺像运行在Lisp machine上的x86模拟器)
    2. 第4章实现了Scheme自举,用Scheme实现了一个以Scheme源码作为输入的eval函数;而第5章这里,手工将第4章的eval翻译成第1步中的汇编语言,于是,自己设计的那台虚拟机拥有了第一个Scheme解释器。
    3. 实现Scheme编译器,对于输入的任何Scheme程序源码,都将他们编译成第1步设计的汇编语言。这个编译器本身仍然是Scheme写的,所以算是交叉编译。

    设计和实现ISA -> 用汇编实现Scheme解释器 -> 实现定向到新ISA的Scheme交叉编译器

    这个步骤演示了怎样将Scheme移植到一个新CPU上

    不过我也同意第5章性价比不高,真要做这些事还是用C比较好(也可以用C#写个Scheme->C的编译器),用汇编写太累,而且第2步、第3步的汇编代码我觉得有点hack了。

  115. loda
    60.191.30.*
    链接

    loda 2015-05-03 13:48:48

    麻烦问下,老赵,你的文章能够转载吗

  116. 知鸟
    123.124.154.*
    链接

    知鸟 2015-09-15 12:13:22

    看大师之作,如饮甘泉,能静心灵!

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我