<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>阅读相关 - 老赵点滴 - 追求编程之美</title>
    <link>http://blog.zhaojie.me/reading/</link>
    <description>先做人，再做技术人员，最后做程序员。打造国内最好的.NET技术博客。</description>
    <language>zh-cn</language>
    <managingEditor>jeffz@live.com (老赵)</managingEditor>
    <webMaster>jeffz@live.com (老赵)</webMaster>
    <pubDate>Tue, 26 Oct 2010 14:51:59 GMT</pubDate>
    <lastBuildDate>Wed, 13 Jul 2011 14:35:31 GMT</lastBuildDate>
    <ttl>60</ttl>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>老赵书托（4）：浪潮之巅（内含牢骚，不喜勿入）</title>
      <link>http://blog.zhaojie.me/2011/11/recommended-reading-4-langchaozhidian.html</link>
      <guid>http://blog.zhaojie.me/2011/11/recommended-reading-4-langchaozhidian.html</guid>
      <description>&lt;p&gt;我是一个码农，一个很彻底，很标准的码农，自认为比我遇到过的绝大部分技术人员要码农得多。我喜欢搞技术，玩技术，不喜欢搞管理，搞人，或是搞产品等等。我是死脑筋，凡事都要想很多遍，想个明白，想不明白就不表态。我不喜欢猜测，不喜欢无法验证的事物，因此我成不了那种常见的，著名的，经常指点江山的分析师。每次有人问我对某某事物未来的看法，十有八九我只会婉言谢绝。其实照我的个人口味，我是不太会对《&lt;a href="http://book.douban.com/subject/6709783/"&gt;浪潮之巅&lt;/a&gt;》这种类型的书感兴趣的，但之前在网上看过谷歌黑板报上的连载，感觉不错，因此也去“搞”来一本品读一番。&lt;/p&gt;

&lt;h1&gt;这是一本历史书&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/books/langchaozhidian-568x798.jpg"&gt;&lt;img class="floatRight" alt="浪潮之巅" src="http://img.zhaojie.me/blog/books/langchaozhidian-568x798.jpg" width="200" /&gt;&lt;/a&gt; 

&lt;p&gt;在我看来，《浪潮之巅》其实是本讲产业历史的书，记录了IT产业里那些曾经（或是现在）叱诧风云过的明星，从大家耳熟能详的微软谷歌，到许多人看来并不怎么引入注意的惠普和雅虎。这些明星从起步到鼎盛，再到平淡甚至是衰落，似乎只有苹果现在正好刚到达波峰——毕竟这些都是悠久历史的公司而不是互联网新贵。这样的书其实很难写，因为要去了解的东西太多，更难得是把这些信息有条不紊地整理起来，这点我就自忖做不到。&lt;/p&gt;

&lt;p&gt;而且在我看来，写历史一定要保持中立客观，应该以记录和描述为主，而不是阐述自己的观点，简单如“太史公云”便已足够。但是，既然已经了解到那么多的情况，显然远远胜过绝大部分人，有多少人又能够克制住自己内心叱咤风云的冲动，不要那么急于做出“预言”或“展望”？殊不知，同类书籍中的大部分都像是些预言家的作品，而互联网上也充斥着看过几篇二三手新闻报道，便能够自信满满指点江山的产业分析师。反而是码农同学们，你们都到哪里去了？&lt;/p&gt;

&lt;p&gt;这也是我为什么之前会说“按照个人口味”会对此类书籍不感兴趣，因为我只是一介码农。我希望类似书籍可以更多一些，如今能让我立刻回忆起来的，似乎也只有许多年前的《Borland传奇》，以及前两年出版过中译本的《观止》。实在应该多出一点，让人相互参考也好。即便我愿意相信《浪潮之巅》的品质，也想看一下其他人眼中的历史来对照一番——是吧，我就是那么死脑筋。&lt;/p&gt;

&lt;p&gt;当然，这本书也不只是记述了巨人们的历史，它也讲述了一些有影响力的事物，从摩尔定律的影响到风险投资，从硅谷到斯坦福大学，等等。说起来实在丢脸，从理论上说，我也是参与过创业的人了，但也只有看了这本书以后，才明白对于一个创业公司来讲，股权分配之类究竟是什么样的操作方式。&lt;/p&gt;

&lt;p&gt;值得一提的是，由于我&lt;a href="http://blog.zhaojie.me/2011/07/get-away-from-paper-books.html"&gt;决定远离纸书&lt;/a&gt;，因此这本书看的是电子版。感谢电子工业出版社Just Pub团队的电子书试点服务，要领先则必须做别人不敢做的，&lt;a href="http://www.lixiaolai.com/archives/11150.html"&gt;管那些小白们说什么&lt;/a&gt;。《浪潮之巅》的版式&lt;a href="http://blog.zhaojie.me/2010/08/my-view-of-good-blogging-theme.html"&gt;也符合我的口味&lt;/a&gt;：行间距较大，段间距明显，首行无缩进。&lt;/p&gt;

&lt;h1&gt;技术人员的踏实&lt;/h1&gt;

&lt;p&gt;这本书我觉得适合行业里绝大部份的人拿来看看吧，就当是开阔眼界。我也更希望读过这本书的人能够学会这本书里面点踏实做法。这虽然不是一本谈论技术的书籍，但却能对我这码农的胃口，我认为很关键的一点就是它符合我的思考的“规范”：有一分事实，说一分道理；有七分依据，不做八分肯定；即便无可避免，也尽量从各个角度给出各种推测，而不是只推测出自己喜欢的结果。我本以为这是个很朴实，也很普适的准则，但现在看来似乎还真不容易被人接受。&lt;/p&gt;

&lt;p&gt;就拿最近发生的一件事情来说吧，京东上个星期搞了次半价促销，结果服务器撑不住了，于是又引起了微薄上一些有头有脸的大牛对.NET技术的批判，说.NET和Windows性能差撑不住云云。我自然还是一贯以码农视角来应对这些问题：说.NET和Windows性能差，就一起来跑个测试，无论多简单的Benchmark来试试看嘛。我现在只是没有条件而已，以前有条件的时候做过好几次，性能绝对不差，远远胜过当时最火热的Apache——当时nginx还没有像现在这么流行，而且就算看现在nginx的数据，也并不比我当年测IIS领先多少嘛。更重要的是，这些数据早就没有什么意义了，因为对于绝大部分情况来说，性能瓶颈还是在你写的程序上，而不会是这些技术本身的能力上。&lt;/p&gt;

&lt;p&gt;可惜大牛们依然只是再不断地举出“事实”：为什么搞个促销活动，淘宝就好好的，但京东就出问题呢？显然，他们的答案是“Java的性能比.NET好”。这里我就不提什么“架构最重要”这种老生常谈的东西，我只想说，在把原因归结到技术本身的能力之前，先关注下双方对技术的态度如何吧。淘宝在各大会议分享他们的技术探索的时候，京东在做什么？当淘宝的技术人员在社区里与人交流的时候，京东方面似乎只能看到刘总本人在搞笑搬的叫着“&lt;a href="http://weibo.com/1866402485/xvqkEqkJS"&gt;加三倍服务器&lt;/a&gt;”。淘宝的技术团队（据说）独立架构，京东的技术团队隶属信息部。一个是正规军，一个是保安处，为什么说他们战斗力的差距来自手中武器？淘宝和京东在对待技术的态度上天差地远，在此之前比较技术又能有多大意义呢？&lt;/p&gt;

&lt;p&gt;我想大家都明白，技术是要看人怎么用的。比如StackExchange用.NET做的很不错，可能的确是因为他们的技术人员水平很高，平常人根本达不到（哎，原微博被删了）。但同样从这方面来讲，淘宝的技术人员在Java乃至各方面的水平都是国内，甚至在世界上首屈一指的。就拿薪资待遇来说吧，阿里巴巴技术人员的待遇在国内属于第一梯队，而今年早些时候我从京东内部打听下来的情况，似乎我能获得的待遇也就跟我工作一年的时候差不多。其实我也并非不知道身边“.NET转Java失败”的案例，要知道当时他们也是投入重金聘请了许多业内高手，但最后还是失败了，但我绝对不会以此事说Java平台如何——我只会骂Java语言，因为我只对这方面有十足把握，因此论证也绝对仔细。&lt;/p&gt;

&lt;p&gt;我相信大牛们的水平一定比我高很多，眼界也一定比我开阔，思维也一定比我严谨，逻辑也一定比我清晰。我说的这些你们肯定都了解，但为什么就回避了呢？技术人员有倾向性是好事，这让人们产生热情有动力去探索，但是在讨论技术时，无论如何也该用技术人员的方式啊。&lt;/p&gt;

&lt;p&gt;我始终坚持技术人员应该有技术人员的风骨。技术上的事情其实最容易讨论，因为人的观点是活的，人有喜好有感情，但技术不会，完全能够做到有一说一有二说二。但是，我总觉得国内许多技术人员在这方面有所欠缺，双重标准耍起来端的熟练。一会儿可以说：“很多事情不是技术决定的，XX更重要”，一会儿又表示“MySpace的失败一定是因为.NET技术问题”。这实在苦了我这个码农，无论是向人打听，还是从各个演讲里，都希望能找到到底是什么“技术问题”，&lt;a href="http://highscalability.com/blog/2011/3/25/did-the-microsoft-stack-kill-myspace.html"&gt;但都基本得不到结果&lt;/a&gt;。点评转Java也一样，他们到底因为.NET出了什么问题了呢？如果您了解这两家的情况，也请告诉我，无论是公开还是私下都行。&lt;/p&gt;

&lt;p&gt;我其实本已经对国内这种缺少“技术风骨”的技术风气有点习惯了，但这次被人点了名，一时没忍住又掺和了进去。之前还有某位反对微软的同学，据说是为了“兼听则明”会主动前来“挑战”。但有了即便拥有十年经验之后依然还是“三分事实，七分推测”。最近一次，则是根据Build大会上的一些演讲来批评微软的技术走向。我自诩看过的Build大会视频绝对多过这位同学，但我还是认为自己绝对还没有到可以对此表态或是做什么展望的程度，更谈不上能如此“自信满满”。这位同学，我相信您一定也会看到这篇文章，这次您一定能明白我的标准了吧？您要再来的话也请换种方式。还有，之前您一直看不上国内社区，那么这段时间里有没有在我推荐给您的StackExchange，Reddit或是Y Combinator上“兼听则明”呢？&lt;/p&gt;

&lt;p&gt;《浪潮之巅》有资格骄傲，但它给我的感觉却是无比的踏实，这值得我们学习——但我依然会怀疑，有些人看了浪潮之巅以后，是否会更加自信满满地叱咤风云，指点江山呢？&lt;/p&gt;

&lt;h1&gt;扩展阅读&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/books/borland-legend-436x544.jpg"&gt;&lt;img class="floatRight" alt="Borland传奇" src="http://img.zhaojie.me/blog/books/borland-legend-436x544.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;正如之前提到的那样，与《浪潮之巅》同类又靠谱的书实在不多。《&lt;a href="http://book.douban.com/subject/1027528/"&gt;Borland传奇&lt;/a&gt;》算是一本，如果您没有看过的话也不放搞来一看。我当时看这本书，是因为听说过Anders Hejlsberg的传奇（他其实也是我接触C#的主要原因之一），也对Borland当年的辉煌心生向往。这本书的作者李维与《浪潮之巅》的作者吴军一样，都是技术和文笔都十分了得的人，而李维Borland的资深员工，可谓亲身经历了公司的起伏，以他的角度记录公司的历史，相信可以胜过一些旁敲侧击所得。&lt;/p&gt;

&lt;p&gt;一个创始人Phillippe打工赚钱，一个创始人Anders开发产品，并最后靠Turbo Pascal一飞冲天，Borland就是这样诞生的。Borland在当年完全可以称为是一个软件帝国，相比微软绝对有过之而无不及。在当时程序员的眼中，Borland的产品可谓是各个精品，在与微软的竞争过程中多次获胜。可惜在巅峰时刻，Phillippe被迫辞职，郁郁不得志的Anders被Bill Gates揽至麾下，在微软继续实现他在开发平台上的构想。从我之前&lt;a href="http://www.infoq.com/cn/articles/neal-gafter-on-java"&gt;翻译过的一篇文章&lt;/a&gt;来看，Anders一直扮演着指引语言发展方向的作用，这也是为什么C#比Java发展更为健康的缘故。&lt;/p&gt;

&lt;p&gt;之前我也一直以为Borland的失败是由于微软挖人的结果，也会想为什么一个创始人会放弃自己的公司，而投入竞争对手的怀抱。看了《Borland传奇》之后，至少在这本书里，并没有将Anders的离开作为Borland失败的主要原因，毕竟他也只是一个人。Borland迅速衰退的主要原因还是决策上的失误，市场判断错误，产品线过多，从技术导向变成销售导向，以及Java开发工具和数据库产品上的失败等等。一群天才技术人员的成果败在一群高管的折腾里，说起来也算是技术浪潮使然，造化弄人。&lt;/p&gt;

&lt;p&gt;最后，如果您感兴趣的话，也不妨看看《&lt;a href="http://book.douban.com/subject/3699395/"&gt;观止&lt;/a&gt;》，记述了微软构建NT的风风雨雨。内容不错，可惜翻译质量实在有些不敢恭维。&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2009/05/recommended-reading-1.html"&gt;老赵书托（1）：写在前面&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html"&gt;老赵书托（2）：计算机程序的构造与解释&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2009/11/recommended-reading-3-csapp.html"&gt;老赵书托（3）：深入理解计算机系统&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;老赵书托（4）：浪潮之巅（内含牢骚，不喜勿入） &lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2011/11/recommended-reading-4-langchaozhidian.html#comments</comments>
      <pubDate>Sun, 06 Nov 2011 06:35:08 GMT</pubDate>
      <lastBuildDate>Tue, 08 Nov 2011 16:39:56 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <title>从今开始远离纸版图书</title>
      <link>http://blog.zhaojie.me/2011/07/get-away-from-paper-books.html</link>
      <guid>http://blog.zhaojie.me/2011/07/get-away-from-paper-books.html</guid>
      <description>&lt;p&gt;纸版图书的历史实在太长了，似乎也已经看得到它被淘汰的那一天。这几天在为去深圳做准备，手边许多技术图书都成了大问题。搬去深圳会大动干戈，况且这些书基本也都只是偶尔翻阅一下，不太可能再认真读起。但如果把它们留在上海，那跟空置也没什么区别。以前我有个习惯，看到经典的书，在看完电子版或国内引进版之后都会买本英文原版的来“收藏”，现在已经“幡然醒悟”，之前也已经转让了一部分。现在除了一部分书，都打算出手了。这里开了个书单，感兴趣的同学可以各取所需。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;《&lt;a href="http://book.douban.com/subject/4058874/"&gt;领域驱动设计与模式实战&lt;/a&gt;》，七成新，20元。&lt;/li&gt;

  &lt;li&gt;&lt;strike&gt;《&lt;a href="http://book.douban.com/subject/1229951/"&gt;Computer Networks, 4th Edition&lt;/a&gt;》，原版，几乎全新，经典教科书，80元。&lt;/strike&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/4722708/"&gt;系统程序员成长计划&lt;/a&gt;》，九成新，15元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/1441780/"&gt;游戏之旅：我的编程感悟&lt;/a&gt;》，九成新，15元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;&lt;strike&gt;《&lt;a href="http://book.douban.com/subject/2977175/"&gt;Concurrent Programming on Windows&lt;/a&gt;》，原版，六成新，100元。&lt;/strike&gt;&lt;/li&gt;

  &lt;li&gt;&lt;strike&gt;《&lt;a href="http://book.douban.com/subject/2567634/"&gt;Windows Internals, 5th Edition&lt;/a&gt;》，硬壳原版，全新，100元。&lt;/strike&gt;&lt;/li&gt;

  &lt;li&gt;&lt;strike&gt;《&lt;a href="http://book.douban.com/subject/3674988/"&gt;Data Access Patterns: Database Interactions in Object-Oriented Applications&lt;/a&gt;》，硬壳原版（链接是软皮的），全新，60元。&lt;/strike&gt;&lt;/li&gt;

  &lt;li&gt;&lt;strike&gt;《&lt;a href="http://book.douban.com/subject/1237003/"&gt;Cryptography and Network Security: Principles and Practices, 3rd Edition&lt;/a&gt;》，硬壳原版，全新，80元。&lt;/strike&gt;&lt;/li&gt;

  &lt;li&gt;&lt;strike&gt;《&lt;a href="http://book.douban.com/subject/1246136/"&gt;.NET Patterns: Architecture, Design and Process&lt;/a&gt;》，原版，全新，50元。&lt;/strike&gt;&lt;/li&gt;

  &lt;li&gt;&lt;strike&gt;《&lt;a href="http://book.douban.com/subject/1246134/"&gt;Effective XML: 50 Specific Ways to Improve Your XML&lt;/a&gt;》，原版，全新，40元。&lt;/strike&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/3117898/"&gt;Python源码剖析：深度探索动态语言核心技术&lt;/a&gt;》，八成新，20元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/4719230/"&gt;编程之魂：与27位编程语言创始人对话&lt;/a&gt;》，七成新，20元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/5273954/"&gt;Collective Intelligence实战&lt;/a&gt;》，九成新，20元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/1205482/"&gt;算法与数据结构（第二版）&lt;/a&gt;》，旧书，好书，15元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/3651015/"&gt;事务处理：概念与技术（影印版）&lt;/a&gt;》，几乎全新，40元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/3558788/"&gt;卓有成效的程序员&lt;/a&gt;》，八成新，15元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/4086029/"&gt;架构之美&lt;/a&gt;》，七成新，20元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/4214151/"&gt;并行开发艺术（影印版）&lt;/a&gt;》，几乎全新，15元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/3590768/"&gt;JavaScript语言精粹&lt;/a&gt;》，作者签名版，九成新，15元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/4736118/"&gt;结网：互联网产品经理改变世界&lt;/a&gt;》，全新，20元。&lt;/strike&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strike&gt;《&lt;a href="http://book.douban.com/subject/1467587/"&gt;Unix编程艺术&lt;/a&gt;》，八成新，20元。&lt;/strike&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些书大约都以三折左右出售（购买多本亦可小刀）。我不送书，并不是想赚钱，而是希望可以让书到达真正想要的人手中，如果卖不掉我也会送给公司图书馆。如果您看上了其中某些书，可以在回复里留下您的联系方式（建议是邮箱或是新浪微博）以及书籍名称，我会与您联系。您可以来我这里现取（地址：上海市浦东新区郭守敬路356号），亦或是选择快递。国内快递的价格大约是每公斤10元，我与您各付一半。您可以在现取时付钱给我，也可以通过支付宝打款。&lt;/p&gt;

&lt;p&gt;接下来我会远离纸版图书，以购买正版电子书为主，也希望国内出版社能尽快跟上时代潮流，发行电子版。如果出版社无法做到的话，我愿意以两倍书价从作者那里购买电子版，保证绝不外泄。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2011/07/get-away-from-paper-books.html#comments</comments>
      <pubDate>Thu, 07 Jul 2011 16:07:09 GMT</pubDate>
      <lastBuildDate>Wed, 13 Jul 2011 14:35:31 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>出售一批原版技术图书（CLR via C#等）</title>
      <link>http://blog.zhaojie.me/2010/10/selling-some-original-books-including-clr-via-csharp.html</link>
      <guid>http://blog.zhaojie.me/2010/10/selling-some-original-books-including-clr-via-csharp.html</guid>
      <description>&lt;p&gt;我是图书（收藏）爱好者，经常会因为看了一本经典的好书，就买一本原版来收藏，可谓美刀滚滚流。不过最近我慢慢意识到这么做并不合适，其一是因为书是用来看而不是用来收藏的，纸书相对于电子书有诸多不便，每次搬家都麻烦之至。而就算是所谓“阅读体验”的话，如今的影印版从各方面也几乎赶上原版书籍了。以后，我可能会买更多的电子书，然后在Kindle及电脑上阅读，或是购买影印版。至于手中已有的那些，就只保留少量经典的吧。&lt;/p&gt;

&lt;h1&gt;定价及交易方式&lt;/h1&gt;

&lt;p&gt;上篇文章&lt;a href="http://blog.zhaojie.me/2010/10/tech-books-published-in-china-are-not-expensive.html"&gt;谈到美金与人民币的购买力大约为1比2&lt;/a&gt;，于是我现在就把每本书定为“美金原价*2”，再把单位换成人民币的价格，并根据折旧或是版次新旧酌情打上一定折扣。理论上不二价，因为讨价还价是一件费神费时又伤感情的事情。当然，如果您一次购买多本想要点折扣，不妨直接开出一个价格，让我看看能不能接受。总体原则就是，不要在这方面花太多时间。&lt;/p&gt;

&lt;p&gt;选定想要的书以后，可以&lt;a target="_blank" href="http://settings.messenger.live.com/Conversation/IMMe.aspx?invitee=fba4447598b1d752@apps.messenger.live.com&amp;amp;mkt=en-US"&gt;在这里与我联系&lt;/a&gt;。您可以和我当面交易，我在上海浦东张江地区。或者，您可以从支付宝转账给我，我用快递寄给您，快递费可以选择“到付”或是连同书款一并转账给我（“到付”一般会贵一些）。当然，如果您蛋疼地慌，我也可以接受“当面付款，快递送书”的方式，保您满意。&lt;/p&gt;

&lt;h1&gt;书单&lt;/h1&gt;

&lt;p&gt;以下是这次我想卖掉的书籍，请谨慎挑选。&lt;/p&gt;

&lt;h2&gt;CLR via C#, 2nd Edition（已出售）&lt;/h2&gt;
&lt;a href="http://img.zhaojie.me/blog/books/clr-via-csharp-2e-330x402.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/books/clr-via-csharp-2e-330x402.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;《&lt;a href="http://www.amazon.com/CLR-Via-C-Pro-Developer/dp/0735621632"&gt;CLR via C#&lt;/a&gt;》内容丰富，难度适中，相信对于.NET程序员来说一定不陌生。虽然从理论上来说，“是否了解.NET/CLR”与“是否看过这本书”并无直接联系，但是我还是愿意使用这本书来做一些简单的判断，我一时也想不出更合适的同类书籍。目前这本书已经出到了第三版，覆盖了.NET 4.0的内容，但是我这里卖的还是第二版，讲的是.NET 2.0，虽然内容并没有什么问题。此外，2008年的时候作者Jeffrey Richter曾经来过上海，因此这本书上还附有作者的签名。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;价格：&lt;/strong&gt;八成新，略有水渍。原价$60，现价￥80。&lt;/p&gt;

&lt;h2&gt;Code Reading: The Open Source Perspective（已售出）&lt;/h2&gt;
&lt;a href="http://img.zhaojie.me/blog/books/code-reading-427x408.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/books/code-reading-427x408.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;《&lt;a href="http://www.amazon.com/Code-Reading-Open-Source-Perspective/dp/0201799405/"&gt;Code Reading&lt;/a&gt;》是2004年Jolt生产效率大奖获奖图书，简单地说就是教你“读代码”。更多信息请参考网上评论。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;价格：&lt;/strong&gt;九成新。原价$70，现价￥140。&lt;/p&gt;

&lt;h2&gt;Microsoft .NET: Architecting Applications for the Enterprise（已售出）&lt;/h2&gt;
&lt;a href="http://img.zhaojie.me/blog/books/ms-net-arch-app-enterprise-327x405.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/books/ms-net-arch-app-enterprise-327x405.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;《&lt;a href="http://www.amazon.com/Microsoft-NET-Architecting-Applications-PRO-Developer/dp/073562609X"&gt;Microsoft .NET: Architecting Applications for the Enterprise&lt;/a&gt;》是本适合初学者的书，其中详细谈论了应用程序各层的设计，对于不知如何下手设计及开发一个应用程序的同学是个颇为称职的领路者。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;价格：&lt;/strong&gt;九成新。原价$45，现价￥90。&lt;/p&gt;

&lt;h2&gt;Prefactoring（已售出）&lt;/h2&gt;
&lt;a href="http://img.zhaojie.me/blog/books/prefactoring-318x417.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/books/prefactoring-318x417.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;《&lt;a href="http://www.amazon.com/Prefactoring-Extreme-Abstraction-Separation-Readability/dp/0596008740"&gt;Prefactoring&lt;/a&gt;》是2006年Jolt大奖获奖图书，谈论了一个项目从设计到实现的完整决策及实现过程。更多信息请参考网上评论。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;价格：&lt;/strong&gt;九成新。原价$30，现价￥60。&lt;/p&gt;

&lt;h2&gt;Refactoring to Patterns（已售出）&lt;/h2&gt;
&lt;a href="http://img.zhaojie.me/blog/books/rafactoring-to-patterns-312x426.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/books/rafactoring-to-patterns-312x426.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;《&lt;a href="http://www.amazon.com/Refactoring-Patterns-Joshua-Kerievsky/dp/0321213351"&gt;Refactoring to Patterns&lt;/a&gt;》是2005年Jolt生产效率大奖获奖图书。当年我迷过一阵子的“重构”和“模式”，这本书便是当年购入的，但结果并没有怎么看。如今我对这方面的话题已经很难提起兴趣，Martin Fowler亲笔签名的PoEEA和Refactoring也已经出售，这本书自然也不打算留下。当然，书是好书。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;价格：&lt;/strong&gt;硬壳，全新。原价$65，现价￥130。&lt;/p&gt;

&lt;h2&gt;Enterprise Integration Patterns&lt;/h2&gt;
&lt;a href="http://img.zhaojie.me/blog/books/enterprise-intergration-patterns-315x420.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/books/enterprise-intergration-patterns-315x420.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;《&lt;a href="http://www.amazon.com/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683"&gt;Enterprise Integration Patterns&lt;/a&gt;》是本“企业用书”。当年我也老是想着“企业级”云云，认为这是未来方向。不过慢慢的我被“企业类”应用中缤纷复杂的各种花样吓退了，还是更喜欢简单的东西，也慢慢地走进了互联网领域。如果您是“企业架构师”，这本书可能会对您有所帮助。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;价格：&lt;/strong&gt;硬壳，全新。原价$65，现价￥120。&lt;/p&gt;

&lt;h2&gt;Customizing the CLR（已售出）&lt;/h2&gt;
&lt;a href="http://img.zhaojie.me/blog/books/customizing-clr-185x227.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/books/customizing-clr-185x227.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;《&lt;a href="Customizing the Microsoft .NET Framework Common Language Runtime"&gt;Customizing the Microsoft .NET Framework Common Language Runtime&lt;/a&gt;》是本对于在软件中嵌入CLR（如SQL Server）时进行定制化的书，面向.NET 2.0。更多信息请参考网上评论。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;价格：&lt;/strong&gt;九成新。原价$50，现价￥80。&lt;/p&gt;

&lt;h2&gt;其他&lt;/h2&gt;

&lt;p&gt;尚有《&lt;a href="http://www.amazon.com/NET-Patterns-Architecture-Design-Process/dp/0321130022"&gt;.NET Patterns&lt;/a&gt;》、《&lt;a href="http://www.amazon.com/Architectures-Enterprises-PRO-best-Practices-Microsoft/dp/0735625786"&gt;Simple Architectures for Complex Enterprises&lt;/a&gt;》及《&lt;a href="http://www.amazon.com/Effective-XML-Specific-Ways-Improve/dp/0321150406"&gt;Effective XML&lt;/a&gt;》三本书待售，稍后给出信息。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2010/10/selling-some-original-books-including-clr-via-csharp.html#comments</comments>
      <pubDate>Thu, 28 Oct 2010 06:08:10 GMT</pubDate>
      <lastBuildDate>Fri, 03 Dec 2010 14:58:35 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/essential/">重中之重</category>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>国内计算机图书真的不贵</title>
      <link>http://blog.zhaojie.me/2010/10/tech-books-published-in-china-are-not-expensive.html</link>
      <guid>http://blog.zhaojie.me/2010/10/tech-books-published-in-china-are-not-expensive.html</guid>
      <description>&lt;p&gt;经常看到社区里有朋友抱怨说，现在的书好贵啊。但事实上我想要指出的一点是，在国内计算机图书真的不贵。不信我们一起来看看国外计算机图书的价格如何。&lt;/p&gt;

&lt;p&gt;原版计算机图书，视书籍包装、厚度、出版社、种类，价格会有很大差距，但是一般都在40美金以上。例如一本软壳460页的《&lt;a href="http://www.amazon.com/gp/product/073562609X/"&gt;Microsoft .NET: Architecting Applications for the Enterprise&lt;/a&gt;》价格为45美元，而一本差不多厚度的硬壳《&lt;a href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/0321545613/"&gt;Framework Design Guidelines (2nd Edition)&lt;/a&gt;》是55美元。普通的技术图书定价不会相差太远，但是有一种会特别昂贵，那就是教科书。我手上有几本非常出名的教科书：其中《&lt;a href="http://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/"&gt;Computer Systems: A Programmer's Perspective (2nd Edition)&lt;/a&gt;》（即传说中的CSAPP）是108美元，《&lt;a href="http://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811/"&gt;Compilers: Principles, Techniques, and Tools (2nd Edition)&lt;/a&gt;》（即传说中的龙书，Dragon Book）是106美元，而《&lt;a href="http://www.amazon.com/Introduction-Algorithms-CD-Rom-Thomas-Cormen/dp/0072970545/"&gt;Introduction to Algorithms (2nd Edition)&lt;/a&gt;》（即传说中的算法导论，CLRS）更是达到了111美元（不过奇怪它新出的&lt;a href="http://www.amazon.com/Introduction-Algorithms-Third-Thomas-Cormen/dp/0262033844/"&gt;第3版&lt;/a&gt;反而降到87美元了）。这些教科书虽然都是硬壳，但由于页数太多但又不好太厚，因此纸张可谓“薄如蝉翼”。&lt;/p&gt;

&lt;p&gt;那么这种原版书这些价格是什么概念呢？我们可以考虑美国人民群众手中美金的购买力。我今天在推特上调查了一小下，身居硅谷的&lt;a href="http://twitter.com/lordhong"&gt;@lordhong&lt;/a&gt;同学&lt;a href="http://twitter.com/lordhong/status/28761888222"&gt;告诉我&lt;/a&gt;，一美元大约可以买：“3磅香蕉，一罐1磅的盐，一杯小咖啡，一个麦当劳小汉堡，一罐可乐，40来根葱，5两鸡肉/猪肉”，再加上其他一些同学的讨论结果，大约可以得出“1美元在美国”与至少“2元人民币在国内”的购买力差不多（甚至要更多）。当然，在美国买一些汽车、首饰的价格甚至比国内还要便宜，但是我想，比较生活必需品显然更为合适。那么换句话说，在美国购买一本100美元的书，相当于在国内购买一本200元人民币的书。您在国内买过200元计算机图书吗？至于收入，微软在美国的Entry Level是5到6万美金一年，国内是十到十二万人民币，也是差不多的比例。当然，我知道国内有不少两三千元月薪的人，我不太清楚美国一两千元月薪的人是什么情况。&lt;/p&gt;

&lt;p&gt;上面提到的一些书，在国内大都有影印版或是翻译版。例如《&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&amp;amp;s=books&amp;amp;qid=1288102600&amp;amp;asin=B003Q97N8E&amp;amp;sr=8-1"&gt;Microsoft .NET企业级应用架构设计&lt;/a&gt;》为69元，《&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_fkmr0_1?_encoding=UTF8&amp;amp;qid=1288102692&amp;amp;asin=B00332FM9Q&amp;amp;sr=1-1-fkmr0"&gt;.NET设计规范:约定、惯用法与模式（第2版•英文版）&lt;/a&gt;》为60元，《&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_2?_encoding=UTF8&amp;amp;s=books&amp;amp;qid=1288102784&amp;amp;asin=B0011C9L24&amp;amp;sr=1-2"&gt;深入理解计算机系统（英文版）&lt;/a&gt;》为89元，《&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&amp;amp;s=books&amp;amp;qid=1288102858&amp;amp;asin=B001NGO85I&amp;amp;sr=1-1"&gt;编译原理（第2版）&lt;/a&gt;》为89元，《&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&amp;amp;s=books&amp;amp;qid=1288102908&amp;amp;asin=B0011BVTRK&amp;amp;sr=1-1"&gt;算法导论（原书第二版）&lt;/a&gt;》为85元。可见国内计算机图书的价格甚至比原价的美金数值还低，更别说折算后的购买力了。难怪上次&lt;a href="http://blog.zhaojie.me/2010/04/something-about-groovy-and-fsharp-from-qcon.html"&gt;在QCon 2010&lt;/a&gt;陪&lt;a href="http://blogs.msdn.com/timng/"&gt;Timothy Ng&lt;/a&gt;（F#的Dev Lead）逛书摊时他惊呼“实在太便宜了”。更重要的是，如今国内图书的质量也越来越好，如《.NET设计规范》除了不是硬壳封面，无论从纸张还是印刷方面和原版几乎一模一样。&lt;/p&gt;

&lt;p&gt;因此，其实国内的计算机图书可谓十分便宜，我们应该舍得为知识进行投资，知识不应该是便宜的东西。国内的计算机图书市场其实处在一个很尴尬的境地：读者嫌贵，但其实作者和出版社都赚不到什么钱。一个认真写书的作者，最后他的所得与付出相除，最后发现可能只有每月一两千元（翻译则更少）。要知道作为一个有水平的作者，本身就已经有了很高的工资，根本不愿意耗费宝贵的时光、甚至健康来换取如此“微薄”的报酬。在国外，作者可以靠一本较为畅销的技术图书养活自己，在国内除了那本前无古人后无来者的“谭浩强C语言”又有谁能做到？&lt;/p&gt;

&lt;p&gt;所以，对于每个在国内认真写书的作者，我们都应该视他们为楷模，他们实在是很不容易。我很佩服他们，因为我在权衡之后承认我做不到这种付出。我们要谴责的是那些写烂书，沽名钓誉的作者和出版社，因为正是他们还在继续扰乱国内计算机图书市场。而我们作为读者，对于图书市场也有十分关键性的力量，促进图书市场的良性循环是一种双赢的结果。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2010/10/tech-books-published-in-china-are-not-expensive.html#comments</comments>
      <pubDate>Tue, 26 Oct 2010 14:51:59 GMT</pubDate>
      <lastBuildDate>Tue, 26 Oct 2010 14:51:59 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>我爱编程，我很快乐。你找理由，你不快乐。</title>
      <link>http://blog.zhaojie.me/2010/09/about-the-passionate-programmer-book.html</link>
      <guid>http://blog.zhaojie.me/2010/09/about-the-passionate-programmer-book.html</guid>
      <description>&lt;a href="http://img.zhaojie.me/blog/books/passionate-programmer.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/books/passionate-programmer.jpg" width="150" /&gt;&lt;/a&gt; 

&lt;p&gt;大约一个月前看了一本书，中文名叫《&lt;a href="http://book.douban.com/subject/4923179/"&gt;我编程，我快乐&lt;/a&gt;》，副标题是“程序员职业规划之道”。前段时间挺忙，一直没去记点什么东西，趁现在起了个大早，就写点吧。很显然，这本书是讲程序员职业规划的，200页，50篇短文。至于讲的内容，所实话，我认为常识成分居多的，其中大部分我同意，并且我也是这么做的——剩下一小部分中的大部分，我不会这么去做，但我也基本上也承认，照书上地去做，可能更有助于职业发展。&lt;/p&gt;

&lt;p&gt;这本书的作者Chad Fowler原本是一个音乐家，吹萨克斯，拿的是音乐专业的学位。后来因为对于电子游戏感兴趣，因此投身于IT行业，一发不可收拾，现在是某资讯公司的CTO，主页是搞Ruby。书中第1章的最后一篇文章题为“热爱它，不然就离开它”，谈的就是Chad发现现在大部分人都缺少热情，他们干IT的原因很多，比如父母鼓励，上大学时自己没想清楚，或是觉得这个行业的收入不错。没有热情，便很难将工作做好。&lt;/p&gt;

&lt;p&gt;除了对行业的态度之外，对于工作本身的认知也是影响十分热情的。如果你不喜欢当前的行业或是工作，就快点离开吧，至少要尝试改变。我时常在论坛上看到许多人抱怨搞IT又累，还没前途，早知道当初去做别的什么，比如烤羊肉串。有时我会说，“IT行业不是这样的，其实还是可以发展一下的”，这时得到的答复往往是各种理由，比如最常见的：国情。&lt;/p&gt;

&lt;p&gt;找理由谁不会，可以找的理由太多了，随便找个事清出来，都可以从正反两方面来找理由。就拿我见过的情况来举例，认为“Java语言使用者多，说明Java就是门好语言”，与认为“Windows虽然使用者多，但是质量很差”可以是同一个人。我这里不想讨论Java或是Windows的质量问题，我只是想反映这两句话所表现出来的逻辑本身。程序员的智商大都不低，再由于大部分人缺少必要的逻辑训练，因此理由总归是找的出来的，还都能说服“自己”。&lt;/p&gt;

&lt;p&gt;如果您喜欢找理由，那么这本书对您基本上没什么作用，甚至于，这类书对您都没有什么作用。因为无论它给出了什么建议，您都会觉得它不符合现状，或者说您的情况有些特殊，等等。在书里Chad提过的一些建议，例如学习其他平台的技术，例如尝试未成熟的新技术，例如每周找出时间来研究尖端技术。您愿意去做吗？还是您会找出各种理由来坚持自己的看法，管他写了什么。&lt;/p&gt;

&lt;p&gt;比如，下面这个理由，我觉得就很好用：作者是外国人，不了解国内的情况，国内写程序的就是码农，没前途的。我不同意这个看法，我不知道什么叫做码农，如何成为码农，真要我说的话，码农的一个重要特征是“太会找理由”了吧。&lt;/p&gt;

&lt;p&gt;当然，我也喜欢找理由，谁不喜欢呢？比如我说过，就算看过了这本书，我还是会坚持自己某些看法。毕竟一个人在行业里混了小几年，基本已经形成自己的思路和判断，一本书很难改变什么。我估计，对于大部分工作了五年左右的人来说，这本书都不太会起多少的作用。所以我认为，这本书可能更适合刚踏上工作岗位的人，甚至是在校学生，或是对职业前途有些迷茫，至少您还要有点怀疑自己的可能。否则，就别看了吧。30块钱留着吃饭更合适。&lt;/p&gt;

&lt;p&gt;最后再补充几句。每次我写点读书感想时，尤其是国内的书，就有人会说书托什么的。比如上次那本《Scala程序设计》，就有人评论说：不用花钱买书就是好，可惜要帮忙说好话。只可惜，我上次在文章里一开始就写着我“买”了那本书，而这次我则同样表示：这本书的确是出版社送的。送的又如何，买的又如何？送的书就以为是托，这不还是在找理由无视文章内容嘛。&lt;/p&gt;

&lt;p&gt;真要说起来&lt;a href="http://blog.zhaojie.me/2010/02/0-bug-and-sjtu-acm-champion.html"&gt;当年的0 Bug老师&lt;/a&gt;就不是这样的观点，在他看来，买书的人也可能是为了当好一个“托”或是“枪手”。我知道，一个真正会找理由的人内心是无比强大的。我很怀念他。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2010/09/about-the-passionate-programmer-book.html#comments</comments>
      <pubDate>Fri, 17 Sep 2010 01:29:50 GMT</pubDate>
      <lastBuildDate>Fri, 17 Sep 2010 01:29:50 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>读完《Scala程序设计》，随便谈一些想法吧</title>
      <link>http://blog.zhaojie.me/2010/08/programming-scala-and-more.html</link>
      <guid>http://blog.zhaojie.me/2010/08/programming-scala-and-more.html</guid>
      <description>&lt;a href="http://img.zhaojie.me/blog/books/programming-scala-cn.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/books/programming-scala-cn.jpg" width="200" /&gt;&lt;/a&gt; 

&lt;p&gt;虽然我对Scala还算熟悉，但还是在china-pub上订阅了一本图灵引进的《&lt;a href="http://www.china-pub.com/196931"&gt;Scala程序设计&lt;/a&gt;》。上上周五在公司收到了这本书，顺手带回家，在路上简单翻了翻。周六用来欢乐，周日懒觉睡觉中午，直到下午才又拿起这本书，不过加上周一上班途中的工夫也算将这本不到200页的小册子浏览完了。这本书的内容本身并没有给我留下太深刻的印象，但我也想谈一些有关Scala语言和其他一些方面的想法。&lt;/p&gt;

&lt;p&gt;“编程语言”这东西自然是和“编程”相关，刚出版的8月份《程序员》杂志的专题是“语言”，其中田春（binghe）写了一篇关于Common LISP的文章，里面有这么一句话：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;作为一门以编程为职业的程序员，时间是如此宝贵，以至于绝对不能把宝贵的时间浪费在不断跟进各种草率设计的新语言上，而忽略了对编程语言本质和一般编程方法（算法、数据结构上）的理解上。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这句话从道理上来看似乎是没错的，不过给我的感觉多少有些原教旨主义了。或者应该这么说：要理解这句话，还得谈一下“什么是编程语言本质”及“哪些是草率设计的新语言”等话题。我不懂“本质”，各种东西的“本质”我都不懂，就像我理解不了《建筑的永恒之道》对于学习GoF设计模式有哪些帮助一样。但如果你真要我谈一下心目中编程语言的“本质”，我可能会说是“更好地表达人类思考”，“辅助人类解决问题”一样。举个例子，C语言体现了编程语言的本质吗？在我看来，没有，因为它体现的是冯诺依曼机的本质，是操作机器的本质，和“表达人类思考”，“辅助人类解决问题”无关。因为，要不是有冯诺依曼机就不会有C语言；同时，在我看来人类也不会在“思考”时关心指针、地址、堆/栈、偏移量、字节等事物。&lt;/p&gt;

&lt;p&gt;当然，如果您是一位C语言粉丝，看到这里也不要急着反驳。首先，我只是说“C语言不能代表编程的本质”，并没有说“不本质就不好了”，也没有对C语言做出“不重要”或是“不值得了解”之类的评价。其次，我不都已经说过我不懂所谓“本质”了嘛。&lt;/p&gt;

&lt;p&gt;回到这个话题来说，什么样的语言算是“本质”了呢？按照我的标准，就是能够“更好地辅助人类解决问题”的语言，再通俗地讲，就是生产力更高的语言。比如人们发现C/C++中的内存管理造成了很大的麻烦，于是出现了垃圾收集机制；人们发现C++过于复杂，而Java语言便可以视为是它的一种简化。虽然我一直说Java是种劣质语言，但也必须承认它的历史地位，它在十几年前绝对是一种突破，只不过多年来的不思进取、固步自封让它成为了“现今标准”下的劣质语言——这很正常，因为即便是C# 2.0，在现在看来也是一种劣质语言。语言在发展，它的评价标准也在不断提高。&lt;/p&gt;

&lt;p&gt;在&lt;a href="http://news.csdn.net/a/20100813/278161.html"&gt;刚获得Jolt图书大奖&lt;/a&gt;的《&lt;a href="http://www.amazon.com/Masterminds-Programming-Conversations-Creators-Languages/dp/0596515170"&gt;Masterminds of Programming&lt;/a&gt;》一书中，作者向&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;问起过有关C#和Java在语言演化方面的问题：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When I compare C# to Java, C# seems to have a stronger push toward evolution. The Java people seem to want a baseline where everyone’s code looks more or less the same. Whether you’ve programmed Java for a decade, never programmed before, or just graduated from a six-month course on Java, all of your code will look the same. C# seems to pull in new ideas from Haskell or from F#. Is there a desire to add new features that people who’ve just finished the six-month C# course haven’t seen and won’t immediately understand?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anders回答道：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What is it that powers the Internet revolution and the electronic revolution that we’ve seen? It’s the fact that we’re constantly evolving. I bring it back to that. The minute you stop evolving, I don’t know that you’re adding any value. This is, again, taking it to the extreme. Of course, there is value in stability of the platform, but I think you provide that value by ensuring backward compatibility. You are free to get off the bus at C# 1.0 and just not move any further. For those people that really want to be more productive and want to build newer kinds of apps like SOA or whatever and get into more dynamic styles of programming—adaptable programs and more declarative styles of programming like we’re doing with LINQ—then you’ve got to evolve or get out of the way, or something else will replace you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;人们对生产力的探索和追求是无止境的，“固步自封”是一种违背潮流的行为。&lt;/p&gt;

&lt;p&gt;之所以设计出新的语言，主要原因大都是设计者对现有语言的不满——当然也不排除一些商业上的因素，例如当年Sun迫使微软不得触碰Java语言，于是微软设计了.NET和C#语言与之竞争（无独有偶，Oracle最近又和Google展开了有关Java的专利诉讼）。例如，&lt;a href="http://blog.zhaojie.me/2010/04/something-about-groovy-and-fsharp-from-qcon.html"&gt;Groovy在考虑到Java语言的平滑升级的基础上&lt;/a&gt;融入了有更好生产力的元素，而F#和Scala都在并发编程和DSL方面给予了加强。那么，它们都是草率设计的语言吗？可能有人说，是的，因为这些语言里的语法糖特别多。那么，语法糖便意味着草率吗？&lt;/p&gt;

&lt;p&gt;我的看法是否定的，一个特性是否草率或是是否重要，关键不在于它是不是个所谓的“语法糖”，而是要看它有没有带来编程思维上的改变，或者说，它有没有遵循语言设计者的文化。我们可以从各种语言找到许多此类“有文化”的“语法糖”：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;C#的Lambda表达式是匿名委托的语法糖，但是它带来/鼓励了函数式编程及无副作用编程的思维。 &lt;/li&gt;

  &lt;li&gt;Haskell中的“$”运算符，和F#中的“&amp;lt;|”运算符的作用是简单地“改变优先级”，让程序员可以省略括号，写出流畅的代码。 &lt;/li&gt;

  &lt;li&gt;Scala中的方法调用a.method(b)可以省略点和括号，写为a method b，这样开发人员便很容易写出one day ago这样的DSL。 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scala还有许多用于“省略”或是“替代”的规则，目的就是让程序员可以写出更为漂亮而紧凑的代码，这便是Scala的文化（之一）。Scala是我认为最有机会，也是最适合代替Java的语言。因为从JVM上的语言来说，Jython和JRuby都是“另一种语言”，程序员甚至需要在“Ruby的Date对象”和“Java的Date对象”间进行切换；Clojure是一种类LISP的语言，它的编程模型和思想与Java相距太远；Groovy是Scala的有力竞争对手，因为它考虑到了Java程序员的平滑过渡，只不过它是一门动态类型语言，这点和Java程序员的习惯有所不同；而Scala是一门静态编译型语言，性能很高，能够和Java一样进行面向对象和命令式编程，也可以表现出和Java一样的对象模型——自然还有额外的提高生产力的语言特性。&lt;/p&gt;

&lt;p&gt;有些朋友认为Scala过于复杂，难以掌握。关于这点我想说：有利自然有弊，Scala既然可以带来更好的生产力，自然需要您进行额外的学习，从Java语言切换到Scala并非一蹴而就的，但是这些付出在我十分值得，因为Scala是一门挺有想法的语言。再者，Scala真难学吗？或者说，它比Java语言难学吗？在我看来真不见得。这里有一个事实是：&lt;a href="http://java.sun.com/docs/books/jls/download/langspec-3.0.pdf"&gt;Java的语言规范&lt;/a&gt;比&lt;a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"&gt;Scala的语言规范&lt;/a&gt;要多得多，因此其实从某些角度来说，Scala要比Java要简单的多。出现这个情况的原因也很容易理解：因为Java是一门十分死板的语言，它需要用大量篇幅来表示各种限制和规定，而Scala只是提供一些最基本的语法描述和变化规则，剩下的都是这些规则的自由组合了——此正所谓&lt;font color="#ff0000"&gt;Scala&lt;/font&gt;ble。&lt;/p&gt;

&lt;p&gt;例如，在Scala中，“1 + 2”这个基本表达式，从概念上说也是一个Int对象上的方法调用，其完整形式为“1.+(2)”。那么，试想在语言规范中，还需要定义次方运算或是求模运算吗？这些篇幅都可以省下了，因为这些“运算符”都已经变成了“类库”，要知道整数之间有哪些运算符，只要去浏览文档就行了。至于“+”方法最终表现为一个加法指令而不是方法调用，这便是编译器在优化时所做的事情了。“语言”有自己的文化，“编译器”也有自己的优化策略。&lt;/p&gt;

&lt;p&gt;当然，语言规约的规模并不能直接用于论证语言的复杂度，“变化”有时也会带来复杂度。其实我只是想说，Scala语言并不可怕，作为一个程序员，比这门语言难以掌握的东西有太多了。在C#这边也有人经常抱怨说“C# 3.0太复杂，不能保证团队里人人都会”，对此我的说法是，当年我在创业时，招了几个工资在3000左右的程序员，他们都能在一个星期里学会C# 3.0的新特性（原本就会C# 2.0）——假如说一份能力一份待遇的话，那么您的期望薪资是多少呢？&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/books/programming-in-scala.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/books/programming-in-scala-s.gif" class="floatRight" /&gt;&lt;/a&gt; 

&lt;p&gt;最后再回到《Scala程序设计》这本书吧，这是本连附录也只有180页的小册子，很明显只能是Scala语言的概述和入门，并没有企图让您精通这门语言。这本书的副标题是“Java虚拟机多核编程实战”，这我认为只是个“噱头”而已，因为这本书对于Scala引以为豪的Actor库也只用了20页不到的篇幅。不过话说回来，即便是《&lt;a href="http://www.amazon.com/gp/product/0981531601/"&gt;Programming in Scala&lt;/a&gt;》这本近800页的，覆盖了Scala语言方方面面的“巨著”，其中关于Actor的那章也只有30多页——因为Scala的Actor模型本身也只是以标准库的形式提供的，且十分简单，并不是Scala的重点。如果您对这方面感兴趣，我觉得更应该关注的是&lt;a href="http://akkasource.org/"&gt;akka&lt;/a&gt;这个类库而不是Scala的标准库。而如果要将Actor模型和并发编程的方方面面都讲清楚的话，估计又需要整本书的篇幅了。&lt;/p&gt;

&lt;p&gt;总体来说，《Scala程序设计》可以算作是一本“称职”的书，即使您无法在工作中使用Scala语言，甚至您不是个Java程序员，也不妨可以从这本小册子里简单地体会一下这门语言。许多开发人员常说“静态语言”的开发效率如何如何低，其实也只是被Java这门劣等语言给误导了，事实上Haskell、C#，F#和Scala都是静态语言的典范，了解Scala也有助于开阔眼界。《&lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X"&gt;Programmatic Programmer&lt;/a&gt;》里建议开发人员每年学一门新的语言，Scala也是个不错的选择。与此相比，如果让一个C#程序员去学习Java，那投资回报率则实在是太低了。&lt;/p&gt;

&lt;p&gt;最后我也在想，可能这种小册子形式的书也是有不少价值的，例如阅读的代价较低，也比较容易快速地翻译引进，而像《Expert F# 2.0》这样的由语言设计者（还是个科学家）亲自编写的砖头，受众面自然会狭窄许多。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2010/08/programming-scala-and-more.html#comments</comments>
      <pubDate>Sun, 15 Aug 2010 15:13:11 GMT</pubDate>
      <lastBuildDate>Sun, 15 Aug 2010 15:13:11 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>老赵书托（3）：深入理解计算机系统</title>
      <link>http://blog.zhaojie.me/2009/11/recommended-reading-3-csapp.html</link>
      <guid>http://blog.zhaojie.me/2009/11/recommended-reading-3-csapp.html</guid>
      <description>&lt;p&gt;这次我要推荐的是《&lt;a href="http://csapp.cs.cmu.edu/"&gt;Computer Systems: A Programmer’s Perspective&lt;/a&gt;》（下文简称CSAPP），在国内可以买到其&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&amp;amp;s=books&amp;amp;qid=1258890021&amp;amp;asin=B0011C9L24&amp;amp;sr=8-1"&gt;影印版&lt;/a&gt;。它也已经被翻译成为中文，即中国电力出版社的《&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_2?_encoding=UTF8&amp;amp;s=books&amp;amp;qid=1258890021&amp;amp;asin=B0011ATXIS&amp;amp;sr=8-2"&gt;深入理解计算机系统（修订版）&lt;/a&gt;》。&lt;/p&gt;  &lt;h1&gt;基本知识&lt;/h1&gt; &lt;a href="http://img.zhaojie.me/blog/170283/o_csapp.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/170283/r_csapp.jpg" width="200" /&gt;&lt;/a&gt;   &lt;p&gt;如果说&lt;a href="http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html"&gt;我上次推荐的SICP&lt;/a&gt;强调的是编程能力，抽象能力的话，那么CSAPP这本书强调的便是作为一个程序员的基本知识。SICP来自世界顶级学府MIT，而CSAPP也同样出身名门：CMU（卡耐基梅隆大学）。虽然没有SICP那么历史悠久，但它被&lt;a href="http://csapp.cs.cmu.edu/public/adoptions.html"&gt;世界几百所大学&lt;/a&gt;（幸运的是也包括我所就读的复旦大学）用作教材也有好多年了。&lt;/p&gt;  &lt;p&gt;这本书的中译名为“深入理解计算机系统”，我非常，十分，以及百分之一百二十地不满意。我这么说的原因在于这个译法完全扭曲了书的本意。如果直译原书名，应该是类似于“以程序员的视角理解计算机系统”，何来“深入”二字。可能在国内编辑看来，这是讲系统的，用C和汇编语言的，因此很“深入”，但我认为这只能说明国内技术氛围的浅薄。因为事实上，这是一本入门级别的书，这本书其实并不“深入”，它谈论的内容还是相对比较浅的。但“浅”不代表“浅薄”，写一本面向初学者的好书往往是非常困难的，因此无论是SICP还是CSAPP，它的作者都是顶尖学府的教授，结合多年教学经验而写出来的。&lt;/p&gt;  &lt;p&gt;CMU把这本书作为“Introduction to Computer System”课程的教材，是面向计算机专业低年级学生的“计算机系统介绍（导论）”，可能这些学生只是刚刚了解如何使用一门高级语言——如Java进行编程，对于计算机系统的工作方式等话题可谓一点都没有接触过，而CSAPP对读者的背景也只要求是“一些编程经验”而已。这本书的话题覆盖面很广，从计算机的基本组成，二进制数据表示方式，到机器级别的指令，CPU工作方式，存储结构和优化，操作系统的虚拟内存管理，程序运行方式，I/O，网络、到（较底层）程序性能优化和并行程序开发等等。所以，它其实覆盖了“计算机组成原理”，“操作系统”等许多课程的内容，其中的许多话题都能再次展开，继续深入，都能再变成一本，甚至N本经典。事实上，在高年级的计算机专业课程设置中，都会有更加纵向的内容出现。&lt;/p&gt;  &lt;p&gt;因此，如果有人说它“底层”，我同意。但如果说它“深入”，至少我不那么赞同。&lt;/p&gt;  &lt;p&gt;“覆盖面广”，其实就是这本书的最大优点。它告诉我们计算机是如何设计和工作的，操作系统有哪些重点，它们的作用又是什么。CSAPP的目标其实便是要讲清楚原理，但并不会把某个话题挖掘地过于深入，过于细节。例如书中第4章使用了自己“设计”和“实现”的“Y86”处理器架构，便是为了简化X86指令集，使课本内容在能够说明问题的前提下也不至于太复杂。因此，读完（其实也并不一定要读完，说实话我也没有读完）这本书后，我们就可以对计算机系统各组件的工作方式有了理性的认识。&lt;/p&gt;  &lt;p&gt;那么，这本书适合什么人阅读呢？对于这个问题我也有过犹豫。在打算写“老赵书托”系列的之后，前两本列在书单的上便是SICP和CSAPP。我对CSAPP推崇备至，在以前的几篇文章中也都有提及，但最后还是先推荐了SICP。怪怪同学当时在回复中说到“我还以为你会先推荐CSAPP”，其实这就是因为一个“适合面”的问题。在我看来，SICP所强调的编程和抽象能力是任何程序员都需要的，但是如果您问我“所有程序员都应该读CSAPP吗？”，或者再具体一些：“前端JavaScript程序员需要看CSAPP吗？”，那么我可能就无法给出100%令人满意的答案了。我可能会这样回答：其实这些内容很多时候并不一定可以“直接用于”某个工作，但是它其实和操作系统，编译原理等话题一样，包含的是一套“工作方式”，“算法集”，“实践成果集”，其中很多理念，如Cache Hierarchy，Copy on Write等理解的适用范围其实都是非常广泛的。在一定程度上，其实它和SICP一样也是在锻炼思维方式，只不过是已经经过具体化的实践方式而已。&lt;/p&gt;  &lt;p&gt;因此，即便你是一个前端JavaScript程序员，也可以从CSAPP这本书中获益。如果您是.NET程序员，那么您更加适合看这本书了。说一句“豪情万丈”的话：如果不知道XX，YY或ZZ的话，这如何算是一个优秀的程序员？这本书和平时的工作可能的确不一样，相比起来“底层”了一些，但是它还是会把“底层内容”控制在一定深度之内，而不会讲某个具体话题挖掘到“事倍功半”的程度。而事实上，虽然在进行.NET开发的时候我们已经在一个较高的抽象上工作了，但是我们的程序还是运行在操作系统上，还是在遵循着某个规律在运行着，了解一些内部的工作机制也有助于我们写出更好的应用程序。&lt;/p&gt;  &lt;p&gt;说来也奇怪，虽然各种语言，框架发展地越来越好，按理来说我们写程序也应该越来越容易。但是现在看来，一些基础性的内容反而也变得越来越重要了，例如在并行计算面前，计算系统的一些细节，如&lt;a href="http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html"&gt;内存一致性模型&lt;/a&gt;，线程调度，程序的局部性（Locality）又被提上台面，否则我们&lt;a href="http://blog.zhaojie.me/2009/01/system-architecture-and-program-performance.html"&gt;很难写出高效的应用程序&lt;/a&gt;。同样，一些如函数式编程，Monad等在几年前看起来十分科研型，数学化的事物也离我们越来越近了，如LINQ，&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;等等，其实它们都已经是我们身边的事物了。&lt;/p&gt;  &lt;h1&gt;阅读建议及相关资源&lt;/h1&gt;  &lt;p&gt;CSAPP这本书覆盖面很广，我认为并非要一字不漏地读完才行。根据我的个人观点，我们应该着重阅读书的第1章“A Tour of Computer Systems”和第一部分“Program Structure and Execution”（从第2章开始，大约占据了书中一半篇幅），其中包含了数据的机器级别表示方法，汇编语言和执行方式以及CPU架构方面的内容，我们应该关键性地理解其原理。如第6章“Optimizing Program Performance”提出了许多种机器级别的优化方式，在现在看来，其中的某些方式过于细致，乃至在实际工作过程中已经不再推荐了（如内联一些方法以提高性能），我们要在把握住“为什么”而并不是单纯的吸收“怎么做”。对于书中的第二部分“Running Programs on a System”主要讲述的是操作系统方面的内容，可以读得略为简单一些，但其中的第10章“Virtual Memory”，它谈论了操作系统中虚拟内存机制的各个方面，非常关键，需要细读。至于书中的第三部分“Interaction and Communication Between Programs”便可以更加“选择性”地阅读，我只阅读了第13章“Concurrent Programming”，而其他两章都只是简单地扫过而已。&lt;/p&gt;  &lt;p&gt;作为经典的教材它一定有许多附加资源，例如在&lt;a href="http://csapp.cs.cmu.edu/"&gt;它的官方站点&lt;/a&gt;给出了一些链接，其中最关键的可能是&lt;a href="http://csapp.cs.cmu.edu/public/students.html"&gt;学习者站点&lt;/a&gt;，其中包括这本书所需要的各种工具，参考文档等各种资源。从网站上也可以了解到，CSAPP即将在2010年2月份推出第2版，根据&lt;a href="http://csapp.cs.cmu.edu/public/2e/"&gt;近几年的发展做出了不少改进&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;不过，在这里我要着重推荐的是接下来的内容：我的大学时代就读于复旦大学软件学院，属于教育部35所实验性软件学院，学费比较昂贵——幸运的是，我所接受的“实验性教学”使用了一种比较“西化”的方式，无论是课程设计还是教材都比较“与国际接轨”。例如和爱尔兰都柏林大学合作办学，有些课程由老外来教，同时也会接触一些“函数式编程”等国内较少接触的内容。大二的“计算机系统导论”课程便参考了CMU的ICS这门课，教材自然就是CSAPP这本书。在我印象中，每年最热闹的课程便是大二的这门必修课（高年级所开设的“计算机组成原理”，“编译原理”、“计算机网络”等就是“方向性”课程，并非人人必修），尤其是做一些大作业的时候，在BBS上便会讨论的非常热烈（不得不承认，“拆炸弹&lt;sup&gt;1&lt;/sup&gt;”等实验也特别有趣），而每年此时也往往会诞生出一些“牛人”，基本上都是些“前途似锦”的人物，大都即将或已经在世界顶级学府深造，令人难以望其项背。而在两年前，这门原本是一个学期的课程，也已经变成了为期一年的课程，这也说明了ICS的重要程度。现在这门课已经成为了复旦大学的精品课程之一：“&lt;a href="http://ics.fudan.edu.cn/jpkc/main.html"&gt;计算机系统基础&lt;/a&gt;”，我们从网站上可以下载到所有的PPT，练习和解答等内容，甚至还有&lt;a href="http://ics.fudan.edu.cn/jpkc/videolist.html"&gt;视频下载&lt;/a&gt;。希望这些内容能够对您有所帮助。&lt;/p&gt;  &lt;p&gt;上次我也提到北大使用SICP的课程：“&lt;a href="http://www.math.pku.edu.cn/teachers/qiuzy/progtech/"&gt;程序设计技术和方法&lt;/a&gt;”。其实现在国内有很多大学都在使用世界一流教材，希望也会有越来越多公开的内容。&lt;/p&gt;  &lt;h1&gt;扩展阅读&lt;/h1&gt; &lt;a href="http://img.zhaojie.me/blog/170283/o_prog-linker-loader-lib.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/170283/o_prog-linker-loader-lib.jpg" width="150" /&gt;&lt;/a&gt;   &lt;p&gt;在这里我想可以再提及两本书，一本是之前所提到的国产书精品《&lt;a href="http://blog.zhaojie.me/2009/11/linker-loader-library-correction-about-call-stack.html"&gt;链接、装载与库&lt;/a&gt;》。这本书主要讲解了编译过程中的“生成文件”的过程，以及应用程序执行时文件是如何被操作系统加载的，并且同时涉及到Linux和Windows两个平台。实话说，这些内容并对我来说并不是些必须了解的内容（相信对大部分同学也一样），因此我把它当作一种“扩展阅读”以及“知识巩固”。&lt;/p&gt;  &lt;p&gt;对于这种类型的书，我有自己特殊的阅读方式，那就是“快速浏览”。例如，对我来说，我可能更需要知道链接是做什么用的，一个可执行文件或一个动态链接库文件大致组成有哪些，加载时各段的作用是什么等等，但我不需要具体了解每个段的布局，文件头的具体格式，占多少字节等等。因此，我更关注的可能是其中的示意图，而对于其中一些和具体数据相关的表格和代码就匆匆掠过了。这本书我“翻”得很快，大约只用了4、5天，我想等我真需要这些内容的时候再回头细读吧。有朋友说，更值得一读的是著名的《&lt;a href="http://www.amazon.com/Linkers-Kaufmann-Software-Engineering-Programming/dp/1558604960"&gt;Linkers and Loaders&lt;/a&gt;》，但这部分话题对我来说实在有些距离，我还是从更容易接受的《链》来接触吧。&lt;/p&gt;  &lt;p&gt;说来有意思，我建议您在读《链》这本书的时候，着重关注&lt;font color="#ff0000"&gt;非&lt;/font&gt;“链接、装载与库”的部分，而是那些少量的，如操作系统的线程和内存管理方式，甚至于附录中有关“字节序（Byte Order）”的内容。因为它们往往是书中主要内容的基础，拥有更广的适用性。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/170283/o_windows-internals-5th.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/170283/r_windows-internals-5th.jpg" width="150" /&gt;&lt;/a&gt;   &lt;p&gt;而第二本书“顺便提及”的书是《&lt;a href="http://www.amazon.com/Windows%C2%AE-Internals-Including-Windows-PRO-Developer/dp/0735625301"&gt;Windows Internals 5th Edition&lt;/a&gt;》，人民邮电出版社已经引进了其&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&amp;amp;qid=1258900698&amp;amp;asin=B002PEX4Y8&amp;amp;sr=8-1-fkmr0"&gt;影印版&lt;/a&gt;（而且影印质量好的令人发指，我仔细对比之后发现，除了不是硬皮之外，从纸张和文字几乎和原版一模一样）。这的确是本“深入”级别的书，基本上覆盖了Windows内核的方方面面，包括系统架构，内存管理，线程调度，安全机制，文件系统等各种话题，对于我们Windows平台上的程序员，这方面内容可能更有针对性。&lt;/p&gt;  &lt;p&gt;不过说实话，我刚刚购入这本书，更别提仔细阅读了。不过我看过这本书&lt;a href="http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&amp;amp;s=books&amp;amp;qid=1258901008&amp;amp;asin=B0011F3VZY&amp;amp;sr=8-1"&gt;第4版中文版&lt;/a&gt;的大部分内容，它由潘爱民老师翻译，应该说翻译地很不错。如果您对英文的接受程度不高，也可以从中文版入手。不过第5版覆盖了Windows Server 2008和Windows Vista，直接增加了200多页的篇幅，还加入了Superfetch、BitLocker和Hyper-V相关的内容，可谓是一次重大的升级——其实这其实也可以看出Vista的相对于XP，在内核级别有了很大改进。而目前Windows Internals第6版也在写作过程中，其中包含Windows 7和Server 2008 R2的内容。我本以为Win 7的内核改进不大，但是从近期的PDC大会上发现&lt;a href="http://www.betanews.com/article/PDC-2009-Scuttling-huge-chunks-of-Vista-architecture-for-a-faster-Windows-7/1258443953"&gt;似乎也不能这么说&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;Windows Internals一书的主要作者之一是&lt;a href="http://www.microsoft.com/presspass/exec/techfellow/Russinovich/default.mspx"&gt;Mark Russinovich&lt;/a&gt;，这位和基努·李维斯有几分相像的帅哥除了是Windows NT内核专家，微软Technical Fellow之外，还是著名的&lt;a href="http://technet.microsoft.com/en-us/sysinternals/default.aspx"&gt;Sysinternals&lt;/a&gt;工具包的作者。Sysinternals工具包可谓Windows程序员居家旅行，杀bug灭口的必备工具，因此Windows Internal的重要特点之一便是用Sysinternal中的各种工具来进行“实验”，这也给这种有深度的书带来了相当的实践性。在我看来，这本书虽然深入，但并非是“枯燥”理论，还是一本写得比较“好看”的书。&lt;/p&gt;  &lt;p&gt;说到“好看”的技术书，那么我还是以CSAPP这本书中“致谢”部分的最后一句话来结尾吧：&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Finally, we would like to acknowledge the great technical writers Brian Kenighan and the late W. Richard Stevens, for showing us that technical books can be beautiful。&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;如何把技术书写的“好看”，真是门艺术。&lt;/p&gt;  &lt;h1&gt;相关文章&lt;/h1&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2009/05/recommended-reading-1.html"&gt;老赵书托（1）：写在前面&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html"&gt;老赵书托（2）：计算机程序的构造与解释&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;老赵书托（3）：深入理解计算机系统&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;注1：&lt;/strong&gt;“拆炸弹”是ICS课程的配套实验之一，它的主要工作便是通过将一些小程序（即“炸弹”）反汇编后阅读其汇编代码，然后通过在程序运行时输入特定的字符串来“拆除”炸弹。有些炸弹可能只是输入某个特定的字符，而有些炸弹可能需要输入复杂的字符串，通过“内存溢出”来覆盖掉堆栈中的特定内存（如return address），以此改变程序运行的“轨迹”。整个过程非常有挑战，但也很有趣味。能设计出这样的实验的确令人敬佩。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/11/recommended-reading-3-csapp.html#comments</comments>
      <pubDate>Sun, 22 Nov 2009 16:10:00 GMT</pubDate>
      <lastBuildDate>Sun, 22 Nov 2009 16:10:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/dotnet/">.Net框架</category>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>《链接、装载与库》里的一个错误：关于调用栈</title>
      <link>http://blog.zhaojie.me/2009/11/linker-loader-library-correction-about-call-stack.html</link>
      <guid>http://blog.zhaojie.me/2009/11/linker-loader-library-correction-about-call-stack.html</guid>
      <description>&lt;a href="http://img.zhaojie.me/blog/170283/o_prog-linker-loader-lib.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/170283/o_prog-linker-loader-lib.jpg" width="200" /&gt;&lt;/a&gt;   &lt;p&gt;周六老同学聚会，出门前随手从桌上抓起了《&lt;a href="http://www.douban.com/subject/3652388/"&gt;程序员的自我修养——链接、装载与库&lt;/a&gt;》在路上翻。自从武汉博文出版社的周筠老师送给我这本书后，我基本上还没怎么看过。对这本书第一感觉是“标题党”，主标题起大了，虽然&lt;a href="http://bvbook.javaeye.com/blog/373794"&gt;经过解释之后并非无法理解&lt;/a&gt;，但还是不太喜欢。但书还是好书，已经看完大半，而且基本上会在近期找个方式推荐一把。不过现在我想细说的并不是推荐相关话题（如适合谁看，该怎么看，结合什么一起看等等），而是想指出书中还未被《&lt;a href="http://images.china-pub.com/ebook195001-200000/195439/kanwu.pdf"&gt;勘误&lt;/a&gt;》收录的一个错误：P288讲调用栈时，文字描述和配图上的问题。&lt;/p&gt;  &lt;p&gt;什么是调用栈呢？这里的“栈”和平时我们谈论的&lt;a href="http://en.wikipedia.org/wiki/Stack_(data_structure)"&gt;数据结构“栈”&lt;/a&gt;关系并不大。数据结构里的“栈”是一种先进后出的容器，日常生活中我们经常使用叠在一起的盘子进行类比。而计算机系统中的“栈”是一种有类似行为的内存区域，每次“压”进去和“弹”出来的都是数据。而这块内存区域，是在CPU进行过程调用时所“形成”，或者说是“使用”。与常见高级语言中的“方法”、“函数”不同，这里的“过程”并不是一种高级的抽象，它是CPU可以识别的概念，它的调用自有call指令与之应对。&lt;/p&gt;  &lt;p&gt;那么这个“栈”又是什么形态的呢？它是“从高地址向低地址”扩展的一块区域，使用ebp和esp分别作为&lt;font color="#ff0000"&gt;单个&lt;/font&gt;过程的调用栈的栈底和栈顶：&lt;/p&gt;  &lt;pre class="code"&gt;         0xFFFFFFFF
|                       |
|                       |  高地址
|                       |
           ...
|                       |
|                       |
-------------------------
|                       |
|                       |  前一个过程的调用栈
|                       |
-------------------------  &amp;lt;-- 当前ebp（栈底）
|                       |
|                       |  当前过程的调用栈
|                       |
-------------------------  &amp;lt;-- 当前esp（栈顶）
|                       |
|                       |
           ...
|                       |
|                       |  低地址
|                       |
        0x00000000&lt;/pre&gt;

&lt;p&gt;以上是在32位体系结构中的内存地址示意图。每次执行push指令时，esp都会减4（因为栈是向低地址增长的），每次pop时esp都会加4。当方法main需要调用foo时，它的标准形式为：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;在main方法的调用栈中，将foo的参数push到栈中。 &lt;/li&gt;

  &lt;li&gt;把main方法当前指令的下一条指定地址（即return address））push到栈中。 &lt;/li&gt;

  &lt;li&gt;使用call指令调用目标函数体。 &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;请注意，以上3步都处于main的调用栈，其中ebp保存其栈底，而esp保存其栈顶。而在foo方法body的标准形式为：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;将ebp的当前值push到栈中，即saved ebp。 &lt;/li&gt;

  &lt;li&gt;将esp的值赋给ebp，则意味着进入了foo方法的调用栈。 &lt;/li&gt;

  &lt;li&gt;剩下的便是根据需要，保存（push）一些寄存器的值，或是计算过程中所需要的临时变量等等。 &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;而在foo方法调用完毕后，便执行前面阶段的逆操作：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;恢复（pop）一些寄存器的值。 &lt;/li&gt;

  &lt;li&gt;将ebp的值赋给esp，意味着恢复foo调用时的栈顶。 &lt;/li&gt;

  &lt;li&gt;将栈顶的值赋给ebp（pop ebp），即恢复main调用栈的栈底。 &lt;/li&gt;

  &lt;li&gt;ret，根据esp的位置，即栈顶获得之前保留的return address，继续执行。 &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;可见，main方法先将foo方法所需的参数压入栈中，然后再改变ebp，进入foo方法的调用栈。因此，如果在foo方法中需要访问那些参数，则需要根据当前ebp中的值，再向高地址偏移后进行访问——因为高地址才是main方法的调用栈。也就是说，地址ebp + 8存放了foo方法的第1个参数，地址ebp + 12存放了foo方法的第2个参数，以此类推。那么地址ebp + 4存放了什么呢？它存放的是return address，即foo方法返回后，需要继续执行下去的main方法指令的地址。在著名的&lt;a href="http://csapp.cs.cmu.edu/"&gt;CSAPP&lt;/a&gt;中有这么一幅图，具体地展示了这一切：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/168980/o_stack-frame-structure.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/168980/r_stack-frame-structure.png" /&gt;&lt;/a&gt; 

&lt;p&gt;可惜，书中P228却是这样写的：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;在参数之后的数据（包括参数）即使当前函数的活动记录，ebp固定在图中所示的位置，不随这个函数的执行而变化，相反地，esp始终指向栈顶，因此随着函数的执行，esp会不断变化。固定不变的ebp可以用来定位函数活动记录的各个数据。在ebp之前首先是这个函数的返回地址，它的地址是ebp - 4，再往前是压入栈中的参数，它们的地址分别是ebp - 8、ebp - 12等，视参数数量和大小而定……&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;虽然书中的描述正确，但ebp + 4，ebp + 8，ebp + 12等地址都被错误的写成了ebp - 4，ebp - 8，ebp - 12。我估计这可能是由于栈是“从高地址向低地址扩充”的，此时的“之前”应该是“加”而不是“减”的缘故吧。这点的确不太符合人们“从小到大”的计数习惯，一时疏忽容易造成差错。此外，我认为书中配套的这幅示意图，似乎也有一些问题——至少不太妥当。如下：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/168980/o_lll-p288-illustration.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/168980/r_lll-p288-illustration.jpg" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;在这幅图中，ebp的指针指向old (saved) ebp和return address之间，那么ebp地址究竟算是保存了什么值呢？正确说来，ebp地址中保存的应该是old ebp，也就是说，在这幅图中“取值”是由高地址向低地址进行的——这不太自然。而更容易产生“歧义”的是，esp的指针指向了整个“活动记录”的最底部，这给人的感觉似乎是，如果谈起“esp”地址保存的值，则应该向“高地址”来获取（因为“低地址”已经没了）。这就和ebp产生矛盾了。可能正因为如此，我看这幅示意图时总觉得有些别扭，虽然我的确可以将ebp理解为“向下”取值，但总还是想着将ebp往下“掰一格”，使其和esp的方向“感觉上”保持统一。那么更好的做法是什么呢？个人认为，最不会产生歧义的方式，是像CSAPP那样（即前面的那幅图），将指针直接指向某个内存“块”，而不是某个“边界”。&lt;/p&gt;

&lt;p&gt;最后还有一个“问题”，那便是“Stack Frame”，即书中的“活动记录”的范围究竟是什么。在CSAPP中，一个Stack Frame是从ebp开始到esp范围的这块内存区域，但《链接》一书却认为它是从方法调用的参数开始到esp。这个区别从上面两幅图中也可以看出。我不知道孰对孰错，但是书中写的很清楚，因此这里肯定不是疏忽。我怀疑是不是“流派”之间的差异所致&lt;/p&gt;

&lt;p&gt;虽然《链接、装载与库》中有这么一个小问题，但瑕不掩瑜，它仍然是国内难得踏实的技术书籍。而且，这本书的作者“余甲子”是2006年在读研一的“同学”——所以我经常说，总有一些牛人让我汗颜。此话真的不假。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/11/linker-loader-library-correction-about-call-stack.html#comments</comments>
      <pubDate>Mon, 16 Nov 2009 16:29:00 GMT</pubDate>
      <lastBuildDate>Mon, 16 Nov 2009 16:29:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>书评：卓有成效的ThoughtWorks程序员的45个习惯</title>
      <link>http://blog.zhaojie.me/2009/10/book-review-practices-of-an-agile-developer-the-productive-programmer-the-thoughtworks-anthology.html</link>
      <guid>http://blog.zhaojie.me/2009/10/book-review-practices-of-an-agile-developer-the-productive-programmer-the-thoughtworks-anthology.html</guid>
      <description>&lt;p&gt;这个书名看起来似乎有些莫名其妙，因为其实它包含了三本书：&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.pragprog.com/titles/pad/practices-of-an-agile-developer"&gt;Practices of an Agile Developer&lt;/a&gt;（中文名《高效程序员的45个习惯》，即将出版）  &lt;li&gt;&lt;a href="http://oreilly.com/catalog/9780596519544"&gt;The Productive Programmer&lt;/a&gt;（中文名《卓有成效的程序员》，已出版）  &lt;li&gt;&lt;a href="http://www.pragprog.com/titles/twa/thoughtworks-anthology"&gt;The ThoughtWorks Anthology&lt;/a&gt;（中文名《软件开发沉思录：ThoughtWorks文集》，已出版）&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;虽然最后一本书的中文标题里包含“沉思”字样，但总体来说其实这三本都是实践性的很强的书，基本上是会告诉你“怎么做”——当然同样也会告诉你为什么。基本上这三本小于等于200页的小册子陪伴了我半个多月来的上下班，上厕所已经睡觉前的时间，也带给了我不少体会和思考。&lt;/p&gt; &lt;p&gt;有人可能会说，大学教育应该加强培养学生的实践能力，不过我的看法正好相反。我倒想说，在学校里就别再生产实践上投入了，这是教不出来的。学校的老师现在基本上都是100%的博士毕业，科研出身，本身工业实践可能就不足，除了照本宣科（而这实践性的“本”可能本身就不怎么样），又能指导学生什么东西呢？记得有段时间我又重新混迹于学校的BBS了，在系版上和讲授Web基础课程的老师争论“标准布局方式”，老师坚持认为布局就该使用table，而CSS只是用来填充样式，而并非用来布局的。但此时已经是2008年了，我想只要简单关心一些业界发展，也不应该出现这个情况。但是对于老师来说，他们的目标是科研，就像那位老师，除了这堂课，又何必了解Web开发的发展动态？而大学里应该为学生以后发展打下坚实的基础，&lt;a href="http://blog.zhaojie.me/2009/08/1443234.html"&gt;授以“渔”，授以“能力”&lt;/a&gt;，至于实践性的内容，自有实践来培养，学校就不要做这些本不擅长的事情了，几乎不可能做好。&lt;/p&gt; &lt;p&gt;我大学读的是软件学院，比较注重“实践”。记得当时大一结束后系里组织项目组，由于我专业成绩比较好于是“光荣入选”。于是近20个人的项目组分为了几个小组，各由1个研究生作PM。还有一个需求分析组。然后我们使用标准的瀑布型开发方式，从需求分析开始，产品设计，用例图，时序图，类图一个一个地画。记得文档的页数，UML的复杂程度（当时叫“专业”程度）都是值得自豪的事情。最后很显然，项目失败了。似乎这样轰轰烈烈的项目开发行动也没有出现过，大一的学生都早早进入各实验室进行有针对性地科研性培养，这点还是让我非常高兴的。&lt;/p&gt; &lt;p&gt;不知道现在的大学教育还有没有这样的情况，不过在我现在看来，似乎在那时我积累了不少误区，而这些误区基本上都产生在“实际生产”方面。例如我被不断教导“语言是没有用的，思想是关键”，但我几年下来我愈发认识到“语言影响思想”；例如我也被不断教导“程序员是没有前途的，要做PM”，导致我当时也总喜欢谈“设计”谈“项目管理”，而现在我坚持认为自己是“光荣的程序员”。还有例如“做作测试没有意义”等等，诸如此类，不一一列举了。总之，我当时学习了许多的“反模式”，这些东西在我接触“敏捷”，接触实际生产过程，接触前人在实际生产过程中总结的经验之后都被一个一个推翻了，几乎一个不留。当时我也很痛苦，认为自己过去浪费了很多时间。但是现在想想，这也是我的积累，至少我知道了什么是错的，我知道某个东西为什么是对的，而并不都是纸上谈兵。还有既然已经经历过一次思维转变，我想我也已经可以坦然接受未来新一轮的革命。想着想着，我也就坦然了。&lt;/p&gt;&lt;a href="http://img.zhaojie.me/blog/170283/o_pragmatic-programmer.jpg" target="_blank"&gt;&lt;img class="floatLeft" src="http://img.zhaojie.me/blog/170283/o_pragmatic-programmer.jpg" width="200"&gt;&lt;/a&gt;  &lt;p&gt;因此，如果您也有这样的经历，我想也没有任何问题——看准之后，马上改变。在思维改变的过程中我看了很多书，其中有一本值得在现在提起，那就是《&lt;a href="http://www.pragprog.com/titles/tpp/the-pragmatic-programmer"&gt;The Pragmatic Programmer: From Journeyman to Master&lt;/a&gt;》（中文名《程序员修炼之道——从小工到专家》）。这本书完全是实际经验的总结，一条条建议基本上都是精华，现在看来亦有常读常新之感。不过这本书的最大问题就是，说的很多，信息量很大，但相对比较简单（条条扩充就变成另一本《代码大全》了），于是对于没有一定经验的初学者来说，难以引起共鸣。当时我在看这本书的时候的心态也是“好书，讲的是真理，一定要接受”，而并没有进行更多的反思和比较，在我现在看来这种读书方式是很危险的，我的幸运之处也在于“盲从”对了人。&lt;/p&gt;&lt;a href="http://img.zhaojie.me/blog/170283/o_practices-agile-programmer.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/170283/r_practices-agile-programmer.jpg" width="200"&gt;&lt;/a&gt;  &lt;p&gt;之所以提起这本书，是因为《&lt;a href="http://www.pragprog.com/titles/pad/practices-of-an-agile-developer"&gt;Practices of an Agile Developer&lt;/a&gt;》（中文名《高效程序员的45个习惯》，即将出版）被看作是它的后续，虽然我认为这“后续”并没有达到前辈的高度——不过也正因为如此，我看来它可能更适合初学者，或者说更加实践一些，更贴近普通生产过程，更容易按部就班的干——几乎告诉您应该怎么做，并且需要考虑哪些东西了。这本书关注的是如何敏捷地构建出成功的软件项目，其中涉及到各个方面。如一上来讲的并非如何进行“项目管理”（可能敏捷本身就是淡化传统软件开发的管理，讲究的是“自我管理”），它讲的是“态度”，作为每个开发人员来说该如何在项目中把握自己的做事方法。后来又谈了开发人员的自我发展，如何开发，如何调试，如何交付，如何协作等各个话题。&lt;/p&gt; &lt;p&gt;这本书把一个实践分为三个部分：“魔鬼（错误的做法）”，“天使（正确的做法）”以及“平衡的艺术”。有趣的事，至少我从自己身上或身边，也可能是工作上，或是社区里发现了几乎一一对应的“魔鬼现象”。例如书中一开始讲的“态度”中提到“对事不对人”，这难道不正是最近博客园的“热点问题”吗？此外，这本书吸引我的另一个原因是书中的许多说法让我非常赞同，或者说“有共鸣”。例如书中说到“持续学习”，“架构师必须写代码”，“用写博客等方式进行总结”，对我来说真可谓“正中下怀”。&lt;/p&gt; &lt;p&gt;这本书最大的问题并非是书中哪里写的不对，而是有些“成功学”的意味——许多“道理”的确都是正确的，但是关键还是要靠“执行”。说到底，不执行，知道再多正确的做法也没有用。而且，在我平时看来，大家不是不知道该怎么做，而是“不愿意去做”。例如谁都知道要对项目负责，但是在别人都不负责的时候，你还愿意负责吗？书中说要交流要分享，但是各位也一定听到过许多声音，例如说“要有保留，否则你就失去了价值”——咋听上去真很有道理，有些更直接就是书中所列举的“魔鬼的诱惑”。书里也谈到一些“平衡的艺术”，但和现在流行的一些“办公室政治”方面来看，算是小巫见大巫了。我是理想主义者，有人说我幼稚，所以您也要对我的说法进行独立思考。:)&lt;/p&gt;&lt;a href="http://img.zhaojie.me/blog/170283/o_productive-programmer.jpg" target="_blank"&gt;&lt;img class="floatLeft" src="http://img.zhaojie.me/blog/170283/r_productive-programmer.jpg" width="200"&gt;&lt;/a&gt;  &lt;p&gt;《&lt;a href="http://oreilly.com/catalog/9780596519544"&gt;The Productive Programmer&lt;/a&gt;》（中文名《卓有成效的程序员》，已出版）一书与前者不同，它的目标是“个人效率”，而不是“项目开发”。&lt;/p&gt; &lt;p&gt;这本书分为两个部分，第一部分主要讲的是工具的使用，其中提到了许多提高开发效率的方式，例如如何使用虚拟桌面，如何使用宏、命令行和快捷键等等——里面的确提到了许多我原本不知道的使用方式（例如把资源管理器的“根目录”固定住）。对于Windows程序员来说，还有相当部分可以帮助我们了解其他平台，如Unix上的一些开发文化（如PowerShell和cygwin的使用。Unix平台是面向程序员的平台，其中总结出了许多开发经验同样可以运用在Windows平台上——即便有些*nix程序员不太相信这点，但是我对此深有体会。而书中的第二部分是“实践”，通俗地说便是“如何写出更好的程序”，其中谈到了单元测试，谈到了设计方式，谈到了代码检查工具等等——说实话，我认为与第一部分相比它并不怎么出彩，有些老生常谈的味道，随便找本讲敏捷编程的书就会谈到这些内容——就好比那《45个习惯》。&lt;/p&gt; &lt;p&gt;既然是在进行“个人效率”的修炼，这更加涉及到“执行”问题了，例如谁都知道快捷键能提高效率，但是你愿意努力去背快捷键，而不是继续自己点菜单的习惯吗？还有便是，这本小册子讲的还是简单了，当您看过了这本书之后，不妨再多关注一下它的提纲（好吧，其实就是“目录”），然后针对其中的每一点再作进一步的挖掘。&lt;/p&gt;&lt;a href="http://img.zhaojie.me/blog/170283/o_thoughtworks-anthology.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/170283/r_thoughtworks-anthology.jpg" width="200"&gt;&lt;/a&gt;  &lt;p&gt;最后便是《&lt;a href="http://www.pragprog.com/titles/twa/thoughtworks-anthology"&gt;The ThoughtWorks Anthology&lt;/a&gt;》了。这本书是一群乐于思考，善于总结和分享的人的心得体会。其实每个公司都有许多项目，但为什么ThoughtWorks总是给人一种“盛产思想领袖”的感觉呢？我认为这关键还是以Martin Fowler为首的“思想家”们的作用吧。他们在不断地进行“思考”和“总结”，更重要的是不断的分享“分享”——我并不是在夸他们nb，我的目的是想说“其实你我也可以这么做”。当然，我更不是在轻视他们，我也乐于和他们这样的人一起工作。&lt;/p&gt; &lt;p&gt;刨开前言，这本书收录了13篇文章（外国人咋不忌讳这个数字了？），有项目管理方面的：如何走好从“开发完毕”到“交付成功”这最后几步路，如何使用“迭代经理”这个角色等等；也有项目实践方面的内容：如何使用Ant构建项目，如何进行自动化的“一键发布”，如何进行性能测试等等。也有一些编程方面的实践，如DSL构建，&lt;a href="http://blog.zhaojie.me/2009/09/talk-about-muti-language-programming-in-thoughtworks-anthology.html"&gt;多语言开发&lt;/a&gt;，对象“健身操”等等。基本上，可以认为是精华，值得一读吧。这本书有些部分的确让我开了眼界，让我了解了不少我原本不太知道的内容（尤其是项目管理方面），这感觉好像我在大学里第一次看到一些项目管理书一样：“原来，这才是专业的做法啊”。但是，现在我比当年要谨慎了许多，很多东西我还是在项目开发过程中尝试一下再发表意见吧。至于其他方面也大都不错，可能这种类型的“总结”还是挺吸引我的。&lt;/p&gt; &lt;p&gt;总之，这三本书都值得一读。但是这有个前提，首先您得主动思考而不是一味地机械吸收，但更重要的可能还是需要有效地“执行”——而这点可能只能靠您自己的，别人很难给予有效的帮助吧&lt;/p&gt; &lt;p&gt;忘说了，这三本书我看得都是中文版，翻译地挺通顺的，没啥读不明白的地方。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/10/book-review-practices-of-an-agile-developer-the-productive-programmer-the-thoughtworks-anthology.html#comments</comments>
      <pubDate>Sun, 25 Oct 2009 16:46:00 GMT</pubDate>
      <lastBuildDate>Sun, 25 Oct 2009 16:46:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>最受欢迎中国技术博客评选（PB50）结果公布</title>
      <link>http://blog.zhaojie.me/2009/10/popblogger50.html</link>
      <guid>http://blog.zhaojie.me/2009/10/popblogger50.html</guid>
      <description>&lt;p&gt;国外有博客评选榜单，记得之前也有人提议国内也做一下类似的评选。这不，&lt;a href="http://blog.zdnet.com.cn/html/25/413425-2881994.html"&gt;ZDNET搞了一个&lt;/a&gt;：&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;PoPblogger50(PB 50) 评选是中国技术博客受网友关注度的一个风向标。该评选由ZDNet等国内主流技术社区共同举办。PB 50 评选跟踪的博客主要来自软件、网络、安全、存储、服务器、企业管理信息化等6大技术领域。有独立博客，也有来自BSP的博客。PB 50 数据每个2个月更新一次。数据依据，网友推荐打分，国内主流BSP推荐，业内专家推荐，博客访问量、博客评论、博客文章量、博客更新频率等几十项主、因素的综合考量。虽然PB 50 不是中国技术博客的绝对排行榜，但可以给关注中国技术博客的用户一个参考。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;现在结果终于揭晓了，看看有几位是您已经知道并订阅了呢？&lt;/p&gt; &lt;table&gt; &lt;tbody&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第1名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/495.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.cnblogs.com/Terrylee/"&gt;李会军&lt;/a&gt;&lt;/td&gt; &lt;td&gt;软件公司的项目经理。擅长基于.NET平台的Web开发，ASP.NET 、AJAX、Silverlight等技术。&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第2名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/486.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.cnblogs.com/JeffreyZhao/"&gt;赵劼&lt;/a&gt;&lt;/td&gt; &lt;td&gt;赵劼，网名老赵，洋名Jeffrey Zhao。目前担任上海柏盛网络技术有限公司架构师（兼程序员）。&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第3名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/500.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://aimingoo.spaces.live.com/"&gt;周爱民&lt;/a&gt;&lt;/td&gt; &lt;td&gt;有十余年的软件开发、项目管理、团队建设的经验。曾任多家软件公司高级程序设计师、项目经理、部门经理、区域总经理等职，现任 alipay（&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第4名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/497.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.csdn.net/david_lv"&gt;吕建伟&lt;/a&gt;&lt;/td&gt; &lt;td&gt;客户细分 客户获取 客户转换 客户保持-创新应用-盈利模式-开发组织-业务架构-计算平台 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第5名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/513.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://coolshell.cn/"&gt;陈皓&lt;/a&gt;&lt;/td&gt; &lt;td&gt;芝兰生于深谷，不以无人而不芳；君子修道立德，不为困穷而改节。&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第6名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/492.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.eygle.com/blog/"&gt;盖国强&lt;/a&gt;&lt;/td&gt; &lt;td&gt;eygle的Oracle Blog，提供Oracle技术研究及深入探讨，同时记录个人爱好及生活历程。&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第7名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/494.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.javafox.org/"&gt;胡长城&lt;/a&gt;&lt;/td&gt; &lt;td&gt;工作流，BPM，SOA，Java，J2EE、Flex；个人主页http://www.javafox.org；普元BPS业务流程平台 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第8名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/490.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://chinese.catchen.biz/"&gt;陈广琛&lt;/a&gt;&lt;/td&gt; &lt;td&gt;Web开发工程师，微软最有价值专家，精通ASP.NET(C#)与ASP(VBScript)，熟悉HTML与CSS以及其它Web标准，熟练设计符合Web标准的网站&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第9名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/493.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.zdnet.com.cn/?uid-419061"&gt;张大志&lt;/a&gt;&lt;/td&gt; &lt;td&gt;张大志(leo) 即将出版：《程序员羊皮卷》 zhaopinpro创始人从事研发人员考核的培训与咨询&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第10名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/468.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.csdn.net/jhzyz"&gt;冯强&lt;/a&gt;&lt;/td&gt; &lt;td&gt;信息化咨询/IT行业研究&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第11名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/499.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.zdnet.com.cn/html/25/380725-type-index.html"&gt;叶开&lt;/a&gt;&lt;/td&gt; &lt;td&gt;长期从事企业财务、ERP（用友、Oracle）、CRM（Siebel、SalesLogix、MSCRM、PowerCRM）等管理软件系统的定制、实施与咨询服务，有丰富的&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第12名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/508.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://sery.blog.51cto.com/"&gt;田逸&lt;/a&gt;&lt;/td&gt; &lt;td&gt;资深系统管理员，精通linux/unix，多年系统管理经验，擅长并热衷于大规模的网络运维。 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第13名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/479.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.gaoang.com/"&gt;高昂&lt;/a&gt;&lt;/td&gt; &lt;td&gt;有了理想 就不要寻找放弃的理由&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第14名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/501.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.zdnet.com.cn/html/70/398870-type-index.html"&gt;董海涛 &lt;/a&gt;&lt;/td&gt; &lt;td&gt;董海涛，PMP，“2006中国制造业优秀CIO”获得者，长期从事制造业信息化工作。2004年主持实施的FOURTH SHIFT ERP项目，被评为“四班亚太&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第15名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/465.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.cnblogs.com/supper3000/"&gt;苏鹏&lt;/a&gt;&lt;/td&gt; &lt;td&gt;在中国某知名电信企业任技术主管 微软最有价值专家, 微软“十大杰出IT英雄” MSDN特邀讲师 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第16名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/475.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.zdnet.com.cn/html/41/396241-type-index.html"&gt;曾建根&lt;/a&gt;&lt;/td&gt; &lt;td&gt;职场四气论：锐气藏于胸，和气浮于脸，才气现于事，义气示于人。 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第17名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/473.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://yulimin.javaeye.com/"&gt;俞黎敏&lt;/a&gt;&lt;/td&gt; &lt;td&gt;俞黎敏,国际商业机器全球服务(中国)限公司广州分公司软件部高级工程师现任国际商业机器全球服务(中国)限公司广州分公司软件部高级工程师&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第18名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/512.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.dbanotes.net/"&gt;冯大辉&lt;/a&gt;&lt;/td&gt; &lt;td&gt;在 IT 行业的这几年基本上是做 Oracle 数据库相关的技术工作，对 Oracle 数据库的管理与性能优化有一点研究，是一名Oracle ACE 技术杂家&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第19名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/487.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.codingnow.com/"&gt;云风&lt;/a&gt;&lt;/td&gt; &lt;td&gt;思绪来的快去的也快，偶尔会在这里停留&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第20名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/482.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.cnblogs.com/callwangxiang/"&gt;王翔&lt;/a&gt;&lt;/td&gt; &lt;td&gt;软件架构师，主要方向为XML技术、.NET平台开发与集成、领域设计和公钥基础环境应用。近年主要参与数据交换系统、自订制业务领域语言平台&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第21名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/502.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://mindhacks.cn/"&gt;刘未鹏&lt;/a&gt;&lt;/td&gt; &lt;td&gt;思维改变生活&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第22名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/477.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.csdn.net/calvinxiu/"&gt;肖桦 &lt;/a&gt;&lt;/td&gt; &lt;td&gt;网名为“江南白衣”，Java领域专家，开源JavaEE项目SpringSide发起人，现任广州电信研究院亿迅科技有限公司任设计中心设计主管。&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第23名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/503.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.csdn.net/absurd"&gt;李先静&lt;/a&gt;&lt;/td&gt; &lt;td&gt;致力于基于linux的嵌入式系统的学习和研究，包括内核、驱动、GUI、MMI、软件设计方法和软件优化等方面。欢迎交换友情链接。&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第24名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/489.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.awflasher.com/blog/"&gt;郭启睿 &lt;/a&gt;&lt;/td&gt; &lt;td&gt;关注互联网行业、RIA、视频应用与移动通信业前景，专注于互联网相关产品的用户体验设计与实现，尤其是视频应用方向。&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第25名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/469.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.anysql.net/"&gt;楼方鑫 &lt;/a&gt;&lt;/td&gt; &lt;td&gt;楼方鑫,98-99年致力于电力企业的MIS系统开发,98年主要用Developer 2000/99年主要用PB在Oracle上发. 00-01年在南京一培训机构当SQL Serv&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第26名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/461.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.csdn.net/dl88250"&gt;丁亮&lt;/a&gt;&lt;/td&gt; &lt;td&gt;讨论软件制造过程中的艺术与工程，软件哲学&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第27名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/466.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.blogjava.net/BlueDavy"&gt;林昊&lt;/a&gt;&lt;/td&gt; &lt;td&gt;China OSGi User Group Director，淘宝网平台架构部架构师。从2006年来开始在实际的商业产品中使用OSGi，根据自己的经验先后编写了《OS&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第28名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/496.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://hi.baidu.com/litiejun"&gt;李铁军&lt;/a&gt;&lt;/td&gt; &lt;td&gt;安全是管理，杀毒软件只是帮手 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第29名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/460.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.nona.name/"&gt;李默&lt;/a&gt;&lt;/td&gt; &lt;td&gt;ThoughtWorks公司高级咨询师、业务分析师，敏捷过程教练，BJUG创始人。目前主要专注于互联网产品需求管理与市场营销的合作、产品交互设&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第30名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/472.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://iamsujie.com/"&gt;苏杰&lt;/a&gt;&lt;/td&gt; &lt;td&gt;阿里巴巴集团产品经理，现在主要负责产品的商业架构、业务规划、数据分析、用户体验等等。2008年春夏开始，与团队一起撰写产品相关的专&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第31名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/484.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.cnblogs.com/aawolf/"&gt;马宁&lt;/a&gt;&lt;/td&gt; &lt;td&gt;梦想一个移动的未来 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第32名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/470.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.ningoo.net/"&gt;宁海元&lt;/a&gt;&lt;/td&gt; &lt;td&gt;宁海元，湘人，善吃辣，混迹于网络，常出没于Itpub。现栖身于人间天堂，隐迹于淘宝网，以Oracle DBA为生，痴迷于数据库技术。 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第33名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/510.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://erlang-china.org/"&gt;赵东炜&lt;/a&gt;&lt;/td&gt; &lt;td&gt;网名 jackyz，创建了 erlang-china.org 网站。是《Ajax实战》和《Erlang程序设计》的主要译者。从业 12 年，对"架构高负载/大并发的系统&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第34名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/488.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.chedong.com/blog/"&gt;车东&lt;/a&gt;&lt;/td&gt; &lt;td&gt;良好引用，良好结构，良好导航 Well referenced and well organized, with easy navigation&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第35名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/463.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.chinaunix.net/u1/37091/"&gt;寇柱&lt;/a&gt;&lt;/td&gt; &lt;td&gt;寇柱的虚拟化BLOG &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第36名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/464.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.sansky.net/"&gt;冯凯&lt;/a&gt;&lt;/td&gt; &lt;td&gt;1998年毕业于西安理工大学，2000年前负责中国三峡水电站的设计和实施，2002年加入sobey，曾负责多项重大全台网系统的设计和实施。2005年&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第37名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/471.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://hi.baidu.com/teyqiu"&gt;崔衍渠&lt;/a&gt;&lt;/td&gt; &lt;td&gt;崔衍渠|KingZoo计算机安全咨询中心|百度反病毒知识专家 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第38名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/498.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.zdnet.com.cn/?421625"&gt;项有建&lt;/a&gt;&lt;/td&gt; &lt;td&gt;深度分析通信、IT相关的技术、产品与趋势&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第39名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/504.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://winda.blog.51cto.com/"&gt;王达&lt;/a&gt;&lt;/td&gt; &lt;td&gt;十余年笔耕不辍，发表过千余篇以技术专题为主的文章，出版过多本以网络为主的图书。多家媒体的专栏作者。所著《网管员必读》系列是网络&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第40名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/476.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.cnblogs.com/thinhunan/"&gt;谭振林&lt;/a&gt;&lt;/td&gt; &lt;td&gt;THINK-事繁勿慌，事闲勿荒，取象于钱，外圆内方 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第41名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/478.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.csdn.net/KerryZhu"&gt;朱少民 &lt;/a&gt;&lt;/td&gt; &lt;td&gt;测试.质量.管理之最佳实践&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第42名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/507.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://yuelei.blog.51cto.com/"&gt;岳雷&lt;/a&gt;&lt;/td&gt; &lt;td&gt;教育部ITAT项目组金牌讲师，教育部ITATPRO项目组专家组组长。微软最有价值专家（MVP），51CTO版主，多家IT媒体特约撰稿人。专注网络、虚&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第43名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/481.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blogs.itecn.net/blogs/ahpeng/"&gt;彭爱华 &lt;/a&gt;&lt;/td&gt; &lt;td&gt;独立的虚拟化解决方案顾问 六届 微软最有价值专家（国内唯一的虚拟化MVP）/VMware认证工程师/微软高级讲师/Microsoft Press签约作者/IT&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第44名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/483.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.jianzhaoyang.com/"&gt;简朝阳 &lt;/a&gt;&lt;/td&gt; &lt;td&gt;简朝阳 (Sky Jian) MySQL &amp;amp; Oracle DBA 目前就职于阿里巴巴 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第45名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/485.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://fairyfish.net/"&gt;Denis &lt;/a&gt;&lt;/td&gt; &lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第46名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/462.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.click2earth.com/"&gt;老蒋&lt;/a&gt;&lt;/td&gt; &lt;td&gt;讨论存储技术，IP存储， 数据库容灾等&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第47名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/467.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.blogjava.net/xyz98"&gt;郑晖&lt;/a&gt;&lt;/td&gt; &lt;td&gt;冒号专栏 机器灵魂工程师的blog&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第48名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/491.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://imysql.cn/"&gt;叶金荣&lt;/a&gt;&lt;/td&gt; &lt;td&gt;多年从事MySQL管理、优化，LAMP开发等工作。有丰富的LAMP，尤其是MySQL方面的经验。业余时间兼职做独立MySQL咨询师。 &lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第49名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/505.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://www.junchenwu.com/"&gt;吴隽辰&lt;/a&gt;&lt;/td&gt; &lt;td&gt;设计师，Blogger，UCDChina发起人，WaSP ILG 成员&lt;/td&gt;&lt;/tr&gt; &lt;tr class="catch_it"&gt; &lt;td width="50"&gt;第50名&lt;/td&gt; &lt;td width="100"&gt;&lt;img src="http://img.zdnet.com.cn/moudlepic/134_module_images/509.jpg" width="80" ?&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;a href="http://blog.delphij.net/"&gt;李欣&lt;/a&gt;&lt;/td&gt; &lt;td&gt;FreeBSD fans，大学期间做过一些 Windows 应用和少量驱动程序的开发，大学毕业以后一直在做开源平台上的开发和系统管理工作。我目前在美&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;不过，我还是感觉大部分的博客更新的实在不够频繁，这和人家世界级的榜单差太远了啊，兄弟们还得努力才是。&lt;/p&gt; &lt;p&gt;呃……好像这篇文章技术方面的内容少了一点，最后补充一点吧。其实上面这张列表&lt;a href="http://blog.zdnet.com.cn/popblogger50.shtml"&gt;出自这里&lt;/a&gt;。但是如果要整理成适合博客的HTML实在……有些麻烦。那么，就动用正则表达式吧。我们可以用这个：&lt;/p&gt;&lt;pre class="code"&gt;&amp;lt;img style="padding-left:3px; padding-top:2px;"src="(?&amp;lt;img&amp;gt;&lt;a href="http://[^&amp;quot;]*&amp;quot;)"&gt;http://[^"]*")&lt;/a&gt; height=76 width=76 /&amp;gt;[\s\S]*?&amp;lt;p class="STYLE5"&amp;gt;(?&amp;lt;rank&amp;gt;第\d+名)&amp;lt;/p&amp;gt;[\s\S]*?&amp;lt;a href="(?&amp;lt;url&amp;gt;&lt;a href="http://[^&amp;quot;]*)&amp;quot;"&gt;http://[^"]*)"&lt;/a&gt; class="STYLE4"&amp;gt;(?&amp;lt;name&amp;gt;[^&amp;lt;]+)&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;\s+&amp;lt;/tr&amp;gt;\s+&amp;lt;tr&amp;gt;\s+&amp;lt;td[^&amp;gt;]*&amp;gt;(?&amp;lt;detail&amp;gt;[^&amp;lt;]*)&amp;lt;/td&amp;gt;&lt;/pre&gt;
&lt;p&gt;替换成：&lt;/p&gt;
&lt;pre class="code"&gt;&amp;lt;tr class="catch_it"&amp;gt;&lt;br&gt;&amp;lt;td width="50px"&amp;gt;${rank}&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;td width="100px"&amp;gt;&amp;lt;img src="${img}" width="80px" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;td width="50px"&amp;gt;&amp;lt;a href="${url}"&amp;gt;${name}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;td&amp;gt;${detail}&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;/tr&amp;gt;&lt;/pre&gt; 
&lt;p&gt;啊哈，这下看起来终于有些技术气息了，不是吗？正则表达式是开发人员手中有力的武器，无论您是搞哪个方面的，我想还是多少了解一些吧。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/10/popblogger50.html#comments</comments>
      <pubDate>Fri, 09 Oct 2009 10:36:00 GMT</pubDate>
      <lastBuildDate>Fri, 09 Oct 2009 10:36:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/discussion/">思考讨论</category>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>谈谈我对《ThoughtWorks文集》中多语言开发部分的看法</title>
      <link>http://blog.zhaojie.me/2009/09/talk-about-muti-language-programming-in-thoughtworks-anthology.html</link>
      <guid>http://blog.zhaojie.me/2009/09/talk-about-muti-language-programming-in-thoughtworks-anthology.html</guid>
      <description>&lt;p&gt;一早看&lt;a href="http://www.cnblogs.com/guaiguai/"&gt;怪怪&lt;/a&gt;同学评论《&lt;a href="http://www.china-pub.com/196006"&gt;ThoughtWorks文集&lt;/a&gt;》公开的&lt;a href="http://www.china-pub.com/ureader/product.asp?bookid=196006"&gt;样章&lt;/a&gt;，一谈&lt;a href="http://images.china-pub.com/ebook195001-200000/196006/ch05.pdf"&gt;多语言开发（第5章）&lt;/a&gt;，二谈&lt;a href="http://images.china-pub.com/ebook195001-200000/196006/ch13.pdf"&gt;测试（第13章）&lt;/a&gt;。怪怪同学的&lt;a href="http://www.cnblogs.com/guaiguai/archive/2009/09/26/1574322.html"&gt;看法&lt;/a&gt;是贬前者而捧后者，并提出“同样一个包装下、同一个公司不同的作者，差异如此之大，那么在我们的学习过程中，就要注意去芜存菁了”。说实话，我没有理解他对第5章的评价，如在“抽象方式”方面的说法我没有太深的理解。如果怪怪看到我这篇文章能够再详细说说抽象方法的看法就再好不过了——目前我只能说我同意他的论点（讨论软件思想学习这方面），但是没有理解他的论据，呵呵。&lt;/p&gt; &lt;p&gt;我对第5章有自己的看法，讲的是多语言开发。我是非常提倡多语言开发的，原因可能一是因为我是语言爱好者，二是因为.NET平台是多语言共存的一个良好环境，我以前也经常提出过用IronPython作动态逻辑的“宿主”，用F#作并行开发等等。因此，我是拥护“混合开发”的一个人。但是，很巧，对于这第5章，我还是同意它的论点（或描述），而不同意它的论据（即示例）。&lt;/p&gt; &lt;p&gt;例如，书中举的第一个例子是使用Groovy的方式读取文打印文件每一行，并在每行之前加上行号：&lt;/p&gt;&lt;pre class="code"&gt;def number = 0
new File(args[0]).eachLine { line -&amp;gt;
    number++
    println "$number: $line"
}&lt;/pre&gt;
&lt;p&gt;与书中举出的二十多行Java代码（样章的代码是图片，我不想敲一遍了）相比，Groovy的确是简单了很多。但是在我看来，这个例子是很不妥当的。如果您看一下书中的Java代码就会发现，复杂的Java版本是在于使用了类似C#中StreamReader的做法，以及一个古怪而复杂的LineNumberReader，需要打开文件，再一行一行地读，并且加上异常处理。为什么不使用一个number变量，而且Groovy代码的异常处理在哪里呢？也就是说，Groovy版本并没有完成Java版本所处理的所有问题。&lt;/p&gt;
&lt;p&gt;当然，有人可能会说，我们目标是完成工作，本就不需要关心异常，而Java中的异常处理代码是因为语言特性，迫使我们必须这么做。但问题就在于，这其实涉及的是“类库”方面的内容。例如，您看这段C#代码：&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;int &lt;/span&gt;number = 0;
&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;line &lt;span style="color: blue"&gt;in &lt;/span&gt;&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.ReadAllLines(&lt;span style="color: #a31515"&gt;&amp;#64;"C:\test.txt"&lt;/span&gt;))
{
    number++;
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(number + &lt;span style="color: #a31515"&gt;" " &lt;/span&gt;+ line);
}&lt;/pre&gt;
&lt;p&gt;这和那段Groovy代码有本质区别吗？但是，在这里代码里有没有使用Java所无法实现特性呢？没有。也就是说，Java代码麻烦是麻烦在“缺少类库”，而不是“语言特性”。因此在我看来，用这个例子证明Java是种生产力低下的语言是不恰当的——远不如我之前&lt;a href="http://blog.zhaojie.me/2009/08/from-delegate-to-others-2.html"&gt;谈委托时的示例&lt;/a&gt;有说服力。&lt;/p&gt;
&lt;p&gt;样章中还举了其他一些例子，如判断是个字符串是否为空所使用的isBlank方法，Java需要写在一个额外的StringUtils类中，而Ruby直接打开String类型并添加新方法就可以了：&lt;/p&gt;&lt;pre class="code"&gt;class String
  def blank?
    empty? || strip.empty?
  end
end&lt;/pre&gt;
&lt;p&gt;这个示例与Jaskell（JVM上的Haskell语言）中SafeArray的示例相对就有说服力多了——但是它后面又举了一例：Haskell的函数惰性求职特性可以轻易生成无限长的列表：&lt;/p&gt;&lt;pre class="code"&gt;makeList = 1 : makeList&lt;/pre&gt;
&lt;p&gt;这点在Java语言中就不可以了吗（您可以用C#语言想一下可以怎么编写一个辅助方法来实现这个功能——但不要使用yield）？我在读这些文字的时候会有一种感觉，作者是一个动态语言的爱好者，但是在举这些示例的时候并没有想过这些示例的说服力如何，是否真的可以体现出与Java的差距，这差距究竟是语言上的还是类库上的。&lt;/p&gt;
&lt;p&gt;而在下一个使用Ruby进行单元测试的示例中，我脑子里差点就冒出“骗子”两个字。为什么这么说呢？首先，您可以去看看样章里Java和Ruby两个语言的测试代码。如果您熟悉单元测试，如果你可以区分&lt;a href="http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=Mock+Stub&amp;amp;aq=f&amp;amp;oq=&amp;amp;aqi=g10"&gt;Mock和Stub两个概念的区别&lt;/a&gt;，您应该也可以看出其中的问题来。&lt;/p&gt;
&lt;p&gt;简单的说，Java代码的单元测试使用的是Mock，使用了非常接近于Record/Playback的方式，而Ruby代码使用的是Stub，是单元测试的AAA（Arrange，Act，Assert）模式。Record/Playback是早些年较为流行的测试方式，它首先通过Mock对象“录制”待测试对象的行为，然后交给待测试对象进行测试，最后验证它和“录制”的结果是否相同。这种做法本身就较为复杂，因此目前在很多情况下已经被AAA给替代了。从名字上便可看出，AAA的做法是先安排，再行动，最后验证。它关心的只是被模拟对象“在某些调用时的反应”，而并不在意被模拟对象的整体行为。打个比方，在样章中举的Java示例，其中有这样的代码：&lt;/p&gt;&lt;pre class="code"&gt;warehouseMock.expects(once()).method("remove")
    .with(eq(TALISKER, eq(50))
    &lt;font color="#ff0000"&gt;.after("hasInverntory")&lt;/font&gt;;&lt;/pre&gt;
&lt;p&gt;看到这个after语句了吗？这个after表明remove方法的执行需要在hasInverntory方法调用之后执行。这就是Record/Playback的特征之一：“录制”的行为是可以要求严格按照顺序的。而AAA模式只关心待模拟的对象在某些调用时的反应状况（所以叫做Stub），因此它在“顺序严格”的情况下反而会麻烦一些。例如，如果您要确保一个ITransaction对象的Commit方法必须在Begin之后调用，使用AAA的方式，可能就要自己准备一个order变量，在Begin和Commit方法中引发回调，并检查order的当前数值了。&lt;/p&gt;
&lt;p&gt;在来看看Ruby的代码，它使用的便是Stub，并且——它并没有去确认remove方法和hasInverntory方法的调用顺序。如果要确认的话，使用的代码便会复杂一些了。也就是说，Ruby版本使用的本身就是简单的AAA模式，且功能实现的并不如Java版本的完整。以此说明Ruby用于测试更加方便，是不是有点“忽悠”的嫌疑呢？&lt;/p&gt;
&lt;p&gt;顺便一提，大名鼎鼎的Oren Eini&lt;a href="http://ayende.com/Blog/archive/2009/09/03/planning-for-rhino-mocks-4.0.aspx"&gt;正打算Rhion Mocks 4.0的开发&lt;/a&gt;，计划之一便是移除Record/Playback模式的支持，仅保留AAA方式。而后起之秀Moq框架从一开始就只支持AAA方式。&lt;/p&gt;
&lt;p&gt;上周我读了样章的作者Neal Ford的另一本书《卓有成效的程序员》（一本200多页的小册子），其中“元编程”一章中他也提到了使用Groovy进行单元测试比Java方便很多，在我看来这同样也是类库的问题。因为Groovy可以使用普通方法调用的方式去访问一个对象的private成员，而Java中使用反射会麻烦很多（和C#差不多，因此您可以想象一下）。但是，这完全也可以通过补充一些辅助方法来完成工作。此外，Java代码中最麻烦的还是checked exception特性，Neal使用的Java代码中大部分还是在try...catch。&lt;/p&gt;
&lt;p&gt;《卓》是好书，但是Neal在两本书中对多语言编程的论述的确不能让我感到满意。可能混合编程是个大话题，不是一句两句话能说清的吧。&lt;/p&gt;
&lt;p&gt;最后，样章提出ThoughtWorks的第一个商业产品Mingle使用了JRuby进行开发，但我认为这不是混合编程的优秀示例。因为——它还是只用了Ruby，即使是运行在JVM上，Ruby语言还是Ruby语言。因此Mingle的成功可以证明JVM上运行Ruby的可靠性，可以证明Ruby的生产力比Java高，但我认为它不能作为混合编程的典型案例。&lt;/p&gt;
&lt;p&gt;我想讲的东西讲完了，其实挺矛盾的。一则是我在为自己一直鄙视的Java说好话，二是我“反对”了别人对混合编程的论证，而混合编程也是我一直提倡的东西。不过，毕竟要达成目的也必须通过正确的方式。对就是对，错就是错，虽然我坚持技术人员的信仰，但我也认为个人情感不应该左右判断。如果我看到鄙视Java的说法就叫好，那和某些人无端对微软技术搞FUD又有什么区别。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/09/talk-about-muti-language-programming-in-thoughtworks-anthology.html#comments</comments>
      <pubDate>Sat, 26 Sep 2009 09:44:00 GMT</pubDate>
      <lastBuildDate>Sat, 26 Sep 2009 09:44:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>MIT 6.00 Introduction to Computer Science and Programming, Fall 2008</title>
      <link>http://blog.zhaojie.me/2009/09/mit-open-course-sicp-replacement.html</link>
      <guid>http://blog.zhaojie.me/2009/09/mit-open-course-sicp-replacement.html</guid>
      <description>&lt;p&gt;两个月前我在&lt;a href="http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html"&gt;推荐SICP&lt;/a&gt;这本书时，我提到MIT已经使用Python代替经典的SICP这本书进行编程基础课的教学——但是不知道用的是哪本教材。不过现在已经有了&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/CourseHome/index.htm"&gt;更进一步的消息&lt;/a&gt;，那就是：似乎没有一本如SICP这样的教材。如果说有什么统一参考，那么可能就是《&lt;a href="http://en.wikibooks.org/wiki/Python_Programming"&gt;Python Programming&lt;/a&gt;》这本wikibook了，可能还要算上官方的&lt;a href="http://docs.python.org/tutorial/index.html"&gt;Tutorial&lt;/a&gt;，还有《&lt;a href="http://www.greenteapress.com/thinkpython/thinkCSpy/thinkCSpy.pdf"&gt;How to Think Like a Computer Scientist: Learning with Python&lt;/a&gt;》。事实上从MIT的课程主页上来看，这门课程中&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/Readings/index.htm"&gt;需要阅读的资料&lt;/a&gt;并不仅限于“书”，而包括各种各样的资料——这简直是一定的，因为这门课是在教“编程”而不是教“Python”。&lt;/p&gt; &lt;p&gt;当时我还提过学习SICP时，可以配合两个公开视频：一是&lt;a href="http://webcast.berkeley.edu/course_details_new.php?seriesid=2008-D-26263&amp;amp;semesterid=2008-D"&gt;Berkeley的上课视频&lt;/a&gt;，二是&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-001Spring-2005/VideoLectures/index.htm"&gt;MIT的公开课件&lt;/a&gt;（为SICP原书作者Hal Abelson 和Gerald Jay Sussman为Hewlett-Packard公司员工培训时的录像）。这两个视频的历史都较为久远了，如果要与时俱进的话，现在我们有更“新”的选择了——不敢说更好，因为我也是今天早点看到&lt;a href="http://www.michaelfeathers.com/"&gt;Michael Feathers&lt;/a&gt;的Twitter消息才知道&lt;a href="http://www.youtube.com/watch?v=k6U-i4gXkLM"&gt;新的公开视频&lt;/a&gt;已经发布了。如果您无法观看Youtube，也可以从MIT的课程主页上&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/LectureVideos/index.htm"&gt;下载这些视频&lt;/a&gt;。看着教授用苹果在明亮的教室里讲课的感觉，的确比看之前的视频要舒畅很多。&lt;/p&gt; &lt;p&gt;我很憧憬MIT的这类顶级学府的学术氛围，虽然这个梦想似乎越来越遥远了。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/09/mit-open-course-sicp-replacement.html#comments</comments>
      <pubDate>Mon, 14 Sep 2009 02:02:00 GMT</pubDate>
      <lastBuildDate>Mon, 14 Sep 2009 02:02:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>书籍推荐：国内第一本ASP.NET 3.5 MVC技术专著</title>
      <link>http://blog.zhaojie.me/2009/08/1552389.html</link>
      <guid>http://blog.zhaojie.me/2009/08/1552389.html</guid>
      <description>&lt;a href="http://img.zhaojie.me/blog/170283/o_9215421_200908172002321.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/170283/o_9215421_200908172002321.jpg" width="150px" class="floatRight" /&gt;&lt;/a&gt;
&lt;p&gt;周五的时候我知道了&lt;a href="http://space.cnblogs.com/group/topic/31487/"&gt;国内第一本ASP.NET 3.5 MVC技术专著问世了&lt;/a&gt;。当时忙着搬家理东西，写代码，写博客，就没有仔细搭理。现在瞅瞅，不得了，了不得，至少有四大亮点值得推荐。&lt;/p&gt; &lt;p&gt;书名不错。ASP.NET 3.5 MVC，搞不懂究竟是ASP.NET 3.5还是ASP.NET MVC。想来想去，似乎理解了为什么会这么叫，因为在China-pub上看了看同作者书籍，发现那位龚老师思维的确有独到之处，例如《&lt;a href="http://www.china-pub.com/43684"&gt;VISUAL STUDIO 2008中的LINQ开发技术&lt;/a&gt;》，又把LINQ和VS绑定在一起，可谓深刻领会微软技术精髓，并突破微软限制，将“捆绑”上升到一个自由无束的境界。试想原本只有n种技术可写，一旦运起捆绑大法，可写的话题数目便可急剧上升，此可谓“没有内需，创造内需也要拉动内需”。小弟佩服作者和出版社对于国内图书市场所作出的努力，这种精神值得我们学习。&lt;/p&gt; &lt;p&gt;推荐不错。三位国外大牛——Scott Guthrie，Phil Haack，Stephen Walther，以及两个国内小牛——在下与&lt;a href="http://www.cnblogs.com/"&gt;重典&lt;/a&gt;兄。有意思的是重典兄的“ASP.NET MVC一周年版”也应此书需求改为“ASP.NET 3.5 MVC一周年版”。我不知道其他四位朋友有没有看过此书（如果国外那三位也看过的话，直接把如此好书推向国外市场吧，反正都翻译好了），我只知道我自己还真没有听说过这本书。当然有一点是没错，“ASP.NET 3.5 MVC框架是微软开发Web应用的又一种全新开发方式，它提供了一系列优秀特性，使ASP.NET开发人员拥有了另一个选择”这句话我肯定说过，而且说过无数遍（除了把它叫做“ASP.NET 3.5 MVC”这点之外）。不过是不是在推荐这本书，我自己也糊涂了。看看五个推荐序，我又想起当年郝刚同志的“国内第一本ASP.NET 2.0”，盛邀Scott Gu做推荐序，卖的很不错，尤其是其中出现的连续30多页的代码，让人倍感震撼。只可惜，从现在这本书的推荐序看来，这几年下来Scott Gu还是一贯地思路不清，明明让你说这本书的好话，怎么又说到那产品去了？更令人愤怒和惭愧的是，其他四个推荐序也犯了Scott Gu的错误。还是要多谢本书作者和出版社不计较这些，还是接受了这些“推荐序”。&lt;/p&gt; &lt;p&gt;内容不错。基本上覆盖了网络上可以找到的各种ASP.NET MVC的各种资料，同时覆盖包括Scott Gu等三大牛发布过的微软官方所有内容。再仔细看看目录，除了ASP.NET MVC框架之外，书中还会教我们使用Moq和Rhino Mocks两个功能几乎完全一样的Mock框架，哦还有MsTest和NUnit也是一样的，作者一定是要告诉如何选择和对比。它还教我们使用LINQ to SQL，自定义GridView，MSChart。这些内容一定能使这本书比市面上任何一本ASP.NET MVC图书来得充实，包括ASP.NET MVC技术团队自己编写的内容。&lt;/p&gt; &lt;p&gt;作者不错。更令人惊艳的是，如果目前这本书出版，那么按照图书出版规律倒推几个月，我们可以发现这本书的截稿时间即是ASP.NET MVC框架1.0正式版发布的时候。能够在如此短时间内为广大技术人员奉上如此大餐，这体现了作者无与伦比的技术水平，我们对此应该感到自豪。此外请看，仅在09年内，龚老师就出版了《&lt;a href="http://www.china-pub.com/195913"&gt;WEB开发新体验：ASP.NET 3.5 MVC架构与实战&lt;/a&gt;》、《&lt;a href="http://www.china-pub.com/43684"&gt;VISUAL STUDIO 2008中的LINQ开发技术&lt;/a&gt;》、《&lt;a href="http://www.china-pub.com/45918"&gt;ASP.NET 2.0网站开发案例教程&lt;/a&gt;》以及《&lt;a href="http://www.china-pub.com/45343"&gt;ASP.NET 3.5入门指南&lt;/a&gt;》四本重量级教程，这难道不直接证明了作者对技术的深入理解和快速掌握能力吗？&lt;/p&gt; &lt;p&gt;希望您不会错过这本书。您可能会说，你不是说你没有看过这本书吗？为什么不看完再推荐呢？这里还是引用苏鹏老师之前提到的奶油小故事吧：&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;……我也就事论事的说，我看见地上有一坨金灿灿黄澄澄的，抿了一口以后跟大家说，这个还是别吃了，您说认真吃完啊，没准里面有奶油呢，我觉得我吃完有点困难。您见谅，因为看了目录我就知道是金灿灿黄澄澄的了，再咂摸滋味确实我受不住，您包涵吧。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="color:red;"&gt;&lt;strong&gt;更新：&lt;/strong&gt;&lt;/span&gt;引用&lt;a href="http://www.cnblogs.com/haoxia/archive/2009/08/24/1552985.html"&gt;一段此书编辑的解释&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;本书出版后，因内部沟通问题，负责发布信息的同事错将介绍技术的文字用作推荐，给各位网友、出于推广技术提供评论文字的老师，以及本书的作者造成很大的困扰，非常抱歉！从本书封面无任何宣传文字与本书前言未曾引用任何人的技术评语等各方面可以看出，出版方绝无此方面的企图。当时只是考虑到作为新技术，需要一定的解读与认识，才产生了几段关于技术的评语，这一点评论者、作者及出版方是达成共识的。现在的失误的确是我们的问题，没有任何辩驳的余地，在此向本出于好意、现在却蒙受不白之冤的老赵及重点等人，表示诚挚的道歉。再次声明，参与本书的出版社工作人员未参与本帖的任何发言和回复，之后也不会参与，我们只想致歉。关于本书其他方面的批评和指正，我们非常欢迎，也会虚心接受。出版方与作者出版此书的主要目的在于推广和普及这一较新的技术，并无太多功利的考虑，因此也未曾在书中出现任何“第一本”的字眼，以出版经验来看，这种新技术推广的图书，绝大多数并不盈利，甚至亏损严重，以后我们会更加慎重对待这类选题。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;各位参考着看吧。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/08/1552389.html#comments</comments>
      <pubDate>Sun, 23 Aug 2009 07:39:00 GMT</pubDate>
      <lastBuildDate>Sun, 23 Aug 2009 07:39:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <title>收到了《博客园精华集Web分册》</title>
      <link>http://blog.zhaojie.me/2009/07/1535646.html</link>
      <guid>http://blog.zhaojie.me/2009/07/1535646.html</guid>
      <description>&lt;a title="web expert" href="http://img.zhaojie.me/blog/168980/o_web-expert-1.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/168980/o_web-expert-1.jpg" width="150px" alt="web expert" class="floatRight" /&gt;&lt;/a&gt;
&lt;p&gt;没想到快递8点45就来了——还好我今天不知所云地8点半到公司。&lt;/p&gt; &lt;p&gt;这本书其实没我什么事情，因为我不是负责Web分册的，对《精华集》这种形式的书籍也没什么好感（这是实话），认为这代表不了博客园的水平，里面选择的文章也难有太高价值——最多也就值的放在互联网上作为资源“库”的填充吧。还有一个原因，就是“时间”问题，这些文章是2007年及之前的文章，两年后的今天，基本上也有些过时了。做“精华集”是劳民伤财，得不偿失的事情。&lt;/p&gt; &lt;p&gt;不过翻看过后，不觉对我的想法感到羞耻。我太小看这些文章了，这些文章的确是精华——不论其他分册，目前我单指《Web分册》，甚至单指第一第二部分：HTML、CSS与标准。&lt;/p&gt; &lt;p&gt;我一直认为，要写一篇好的文章很难。首先，最重要的标准是说明自己的体会——不能是其他文件的拼接，不能是翻译。其次，必须把问题说清楚，不能纠缠于所谓的“道”、“悟”。随手翻看，立即吸引我的是&lt;a href="http://www.cnblogs.com/cathsfz/"&gt;CatChen&lt;/a&gt;、&lt;a href="http://www.cnblogs.com/yuntian/"&gt;爆牙齿&lt;/a&gt;和&lt;a href="http://www.cnblogs.com/JustinYoung/"&gt;杨正祎&lt;/a&gt;的文章。语言流畅，条理分明，叙述清楚。这些文章授我以“渔”而不是“鱼”，这才是有价值的文章！我现在正巴不得立即将这本书塞到公司的前台开发人员手中，让其一周看完，并写下读后感。&lt;/p&gt; &lt;p&gt;当然，后面的内容，如JavaScript就令人有些遗憾了——“鱼”多于“渔”，不够深入，详细和延伸。也有可能是我对JavaScript过于了解的缘故，并没有看出多少新意——包括我的文章《挣脱浏览器束缚》系列，看则看过，了解便了解了，其价值不值得进入精华集。但是我想，就前版本书的内容，应该也值这本书的价钱了吧（定价35，一般书店可打75折）——比太多书有价值多了。&lt;/p&gt; &lt;p&gt;订阅这些作者的博客吧，比看首页强多了。&lt;/p&gt; &lt;p&gt;最后，我认为有个现象值得反思：博客园的确不愧国内.NET第一社区，但是为什么我印象中这两年来就缺少如此高质量的内容呢？还有，不知道是不是我的错觉，因为我在筛选ASP.NET文章真没有发现那么好的文章，难道还是我对ASP.NET太过了解的缘故？&lt;/p&gt; &lt;p&gt;《Web分册》开了个令人赞叹的头，后续的分册还跟的上吗？&lt;/p&gt; &lt;p&gt;我忐忑，我语无伦次了。&lt;/p&gt;&lt;p&gt;为Web分册编委们鼓掌。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/07/1535646.html#comments</comments>
      <pubDate>Fri, 31 Jul 2009 01:36:00 GMT</pubDate>
      <lastBuildDate>Fri, 31 Jul 2009 01:36:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>老赵书托（2）：计算机程序的构造与解释</title>
      <link>http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html</link>
      <guid>http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html</guid>
      <description>&lt;p&gt;我要推荐的第一本书便是大名鼎鼎的《&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0262011530/qid=1080089333/sr=1-1/ref=sr_1_1/103-4667931-0130254?v=glance&amp;amp;s=books"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt;》，在国内可以买到中译版，即机械工业出版社的《&lt;a href="http://www.china-pub.com/17992"&gt;计算机程序的构造与解释&lt;/a&gt;》。&lt;/p&gt; &lt;h1&gt;抽象&lt;/h1&gt;
&lt;a title="sicp" href="http://img.zhaojie.me/blog/170283/o_sicp-cover.jpg" target="_blank"&gt;&lt;img class="floatRight" alt="sicp" src="http://img.zhaojie.me/blog/170283/o_sicp-cover.jpg" width="200"&gt;&lt;/a&gt;
&lt;p&gt;豪不夸张地说，这是一本影响了好几代程序员的书。自从上世纪80年代MIT开始使用这本书作为教材开始，它使用&lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;Lisp&lt;/a&gt;语言——直到前两年才被Python取代，但是使用哪本教材不得而知，由这个侧面也可见SICP这本书的影响力有多么深远。在技术日新月异的计算机行业，有多少教材可以经得起20年的考验？&lt;/p&gt; &lt;p&gt;至于为什么要推荐这本书，还是要从这本书在讲什么东西谈起。您觉得，对于一个程序员来说，他最需要培养哪些能力？需要了解哪些知识？如果要我回答，我会说，一个合格的程序员需要一定要对计算机算法与数据结构有较为踏实的了解（这点在以前的文章中也重复了很多次）。至于“操作系统”、“计算机网络”、“编译原理”等课程是否重要？我不知道。这些课程都被广泛接受，所以它们肯定是有用的，但是如果您追问我它们的具体作用，我无法清晰明确地告诉您答案（例如，“编译原理”对普通程序员有什么作用？）——所以我不知道。当然，以后我还是会推荐一些这方面的书籍（因为“需要与否”其实都是个“尺度”和“方向”问题），到那时我们再继续谈论这方面的话题。&lt;/p&gt; &lt;p&gt;不过我可以肯定的是，一个合格的程序员（无论前台/后台，系统/应用），必须要有一定的分析问题解决问题的能力——或者说，抽象的能力。抽象是使用程序解决问题的必备手段之一。例如：&lt;/p&gt; &lt;ul&gt; &lt;li&gt;您是否可以把一个多级的系统分类，理解为一颗树，然后用树或图的方式来处理它？  &lt;li&gt;如果让您解&lt;a href="http://en.wikipedia.org/wiki/Eight_queens_puzzle"&gt;八皇后问题&lt;/a&gt;，或者走一个简单的迷宫，基本上不太会难倒你，但是您可以把自己的思路使用程序表现出来吗？  &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Domain-driven_design"&gt;领域驱动设计&lt;/a&gt;的一个重要部分，便是将真实世界中的“领域”提炼成模型，再使用计算机语言实现出来。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;需要抽象能力的情况，数不胜数。而SICP这本书，其目标便是培养您的抽象能力，自然还有使用基本的手段进行组合来解决问题的能力。这点正如书中1.1节The Element of Programming中所述：&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;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:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;primitive expressions&lt;/strong&gt;, which represent the simplest entities the language is concerned with,  &lt;li&gt;&lt;strong&gt;means of combination&lt;/strong&gt;, by which compound elements are built from simpler ones, and  &lt;li&gt;&lt;strong&gt;means of abstraction&lt;/strong&gt;, by which compound elements can be named and manipulated as units.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt; &lt;h1&gt;函数式编程&lt;/h1&gt; &lt;p&gt;全书使用Lisp进行教学，这是一门函数式编程语言。有人说，函数式编程语言适合在实验室里把玩，不适合开发大型工程——我觉得这还是一个怎么看的问题。这里谈一个我的亲身经历：我在大学里也有课程是讲述LISP语言，但当时的感觉只是“一种比较新奇的语言”，至于它有什么用，它有什么帮助我根本一概不知。然而，经过了“工程”的磨练和实践之后，我反而慢慢体会到函数式编程的优势来。在我看来，函数式编程对于实际工程上的影响，一个主要的方面在于它可以使用&lt;font color="#ff0000"&gt;更小粒度&lt;/font&gt;的抽象单元。对于面向对象编程来说，其抽象的最小单元为“类”和“实例”。试想如果您的程序想要展开“交互”，无论如何都必须从一个“实例”和“类”上面发起。而对于函数式编程来说，它最小粒度的抽象为“函数”。例如，您可以把一个方法作为另一个方法的参数或返回值（所谓&lt;a href="http://blog.zhaojie.me/2009/04/csharp-higher-order-function.html"&gt;高阶函数&lt;/a&gt;），而一段逻辑的实现完全可以通过“小方法”的组合来进行。不要小看这种抽象级别的改变，它会大大影响系统API的设计。&lt;/p&gt; &lt;p&gt;这里举一个示例。一个小问题作为示例：“求出a到b之间所有整数之和”。这很容易，您可以会这么做。&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static int &lt;/span&gt;Sum(&lt;span style="color: blue"&gt;int &lt;/span&gt;a, &lt;span style="color: blue"&gt;int &lt;/span&gt;b)
{
    &lt;span style="color: blue"&gt;int &lt;/span&gt;sum = 0;
    &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = a; i &amp;lt;= b; i++) sum += i;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;sum;
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;那么，“求出a到b之间所有整数的平方之和”或“绝对值之和”呢？当然，您可以再写两个方法。但是，从函数式编程角度来说，这完全是一个可以复用的逻辑：&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static int &lt;/span&gt;Sum(&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt; &lt;font color="#ff0000"&gt;f&lt;/font&gt;, &lt;span style="color: blue"&gt;int &lt;/span&gt;a, &lt;span style="color: blue"&gt;int &lt;/span&gt;b)
{
    &lt;span style="color: blue"&gt;int &lt;/span&gt;sum = 0;
    &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = a; i &amp;lt;= b; i++) sum += &lt;font color="#ff0000"&gt;f(i)&lt;/font&gt;;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;sum;
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;您可以将一个函数（在.NET里用委托表示）作为参数传入Sum方法，在调用时只需传入f的实现即可：&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;int &lt;/span&gt;i = Sum(x =&amp;gt; x * x, 1, 3); &lt;span style="color: green"&gt;// 14
&lt;/span&gt;&lt;span style="color: blue"&gt;int &lt;/span&gt;j = Sum(x =&amp;gt; &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Abs(x), -3, 3); &lt;span style="color: green"&gt;// 12&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;甚至于，我们可以将其“部分应用(partial application)”&lt;sup&gt;1&lt;/sup&gt;。简单说来，“部分应用”是将函数的部分参数固定，以得到一个新的函数：&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt; SumCurry(&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt; f)
{
    &lt;span style="color: blue"&gt;return &lt;/span&gt;(a, b) =&amp;gt; Sum(f, a, b);
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;这样我们就可以使用SumCurry来获得新的函数了&lt;sup&gt;2&lt;/sup&gt;：&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;sumOfSquare = SumCurry(x =&amp;gt; x * x); &lt;span style="color: green"&gt;// int i = sumOfSquare(1, 3);
&lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;sumOfCube = SumCurry(x =&amp;gt; x * x * x); &lt;span style="color: green"&gt;// int j = sumOfCube(1, 3);&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;如果您理解了上面的代码，其实您已经对函数式编程更细致的抽象能力有所体会了。如果是面向对象编程，您需要怎么做呢？首先，您可能需要定义一个抽象类SumCalculator，其中有一个抽象方法为F。我们要复用算法，就必须构造SumCalculator的子类，提供F的具体实现。哪种做法简单，哪种做法繁琐，一目了然。&lt;/p&gt;
&lt;p&gt;目前函数式编程几乎已经成了高级语言的必备特性了，如C#，F#，甚至&lt;a href="http://www.infoq.com/cn/news/2009/07/scala-replace-java"&gt;颇有代替Java语言之势&lt;/a&gt;的Scala中也包含了相当的函数式编程能力。事实上，我认为出现这种趋势的一个重要原因，便在于人们之前对面向对象语言的抽象能力寄予过高期望，而这种期望的破灭（或者说“冷静”）使得许多人的注意力又回到了更容易“组合”和“复用”的函数式编程理念上。而且，其实人们从来没有放弃过对小粒度的事物的热爱。例如很多人喜欢C语言的原因，便是因为它没有庞大的架构，可以通过各种方法的组装来编写程序。而&lt;a href="http://www.amazon.com/UNIX-Programming-Addison-Wesley-Professional-Computing/dp/0131429019"&gt;Unix编程艺术&lt;/a&gt;之一，便是大量小程序的组合复用。&lt;/p&gt;
&lt;p&gt;您对函数式编程的重要性还有所怀疑吗？如果您觉得上面的例子还有些“玩具”感觉的话，您还可以参考我之前实现的&lt;a href="http://blog.zhaojie.me/2008/04/can-you-use-anonymous-method-properly.html"&gt;CacheHelper&lt;/a&gt;，&lt;a href="http://blog.zhaojie.me/2009/02/simplify-async-programming-1.html"&gt;AsyncTaskDispatcher（上&lt;/a&gt;，&lt;a href="http://blog.zhaojie.me/2009/02/simplify-async-programming-2-asynctaskdispatcher.html"&gt;下）&lt;/a&gt;或者微软的并行库——还有Matthew Poswysocki发起的“&lt;a href="http://www.infoq.com/cn/news/2009/07/anti-for-campaign"&gt;反对for行动&lt;/a&gt;”。您不妨思考一下，如果没有函数式编程特性，又该如何实现这些功能呢？&lt;/p&gt;
&lt;p&gt;自然，函数式编程的优点远不止这一个。例如函数式编程中“无副作用”的纯函数，对于目前愈发热烈的并行环境也有重大意义。这些就要靠您来自行挖掘了&lt;sup&gt;3&lt;/sup&gt;。&lt;/p&gt;
&lt;h1&gt;补充建议&lt;/h1&gt;
&lt;p&gt;最后，还是补充一些我自己的建议吧&lt;sup&gt;4&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;首先，SICP是一本教科书，里面的示例和习题都是经过精心设计的，几乎可以说都是有针对性地培养各种能力。换句话说，如果您太“功利”地阅读这本书，可能会让您觉得失望。您没法从中学到如何开发一个网站，开发一个记事本，如何绘图，它完全是在锻炼程序员的基本能力，而不是“技术”。有时候，您可以把它当作一本数学书看，里面的题目也经常和数学有关——别担心，似乎高中数学水平应该足够了吧。另外，我建议您在看这本书时，最好可以挑一个风和日丽天气，准备一台笔记本去附近大学的图书馆里找个座位，像一个学生那样参加自习，慢慢地看耐心的看——没有笔记本？那也没关系，一个拔网线的台式机也可以起到差不多的效果。我也欢迎大家和我一起探讨其中的题目——虽然有相当部分内容我也不会。:P&lt;/p&gt;&lt;a title="ssics" href="http://img.zhaojie.me/blog/170283/o_ssics-cover.jpg" target="_blank"&gt;&lt;img class="floatRight" alt="ssics" src="http://img.zhaojie.me/blog/170283/o_ssics-cover.jpg" width="150"&gt;&lt;/a&gt; 
&lt;p&gt;看一本书，不一定要从头到底全部看完。SICP全书共分五章，我建议可以认真阅读前三章——没时间的话就精读前两章“过程抽象”与“数据抽象”。如果您有时间的话，也可以把第四章看完。至于第五章，有人说是SICP的精华所在，但是我认为啃下第五章的投入产出比相对前几章来说就相对较低了（第四和第五章使用Lisp实现一个解释器及一个简单的CPU逻辑实现，很难，不过这的确是Lisp最“美”最能体现出完备性的地方）。如果，我是说如果，您在阅读前两章时较为困难，也不妨先看一下《&lt;a href="http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&amp;amp;tid=3662"&gt;Simply Scheme: Introducing Computer Science&lt;/a&gt;》，您可以把它看作是SICP的基础&lt;sup&gt;5&lt;/sup&gt;。值得一提的是，&lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book.html"&gt;SICP&lt;/a&gt;和&lt;a href="http://www.cs.berkeley.edu/~bh/ss-toc2.html"&gt;SSICS&lt;/a&gt;都在互联网上公开——不得不敬佩他们对学术推广的态度。&lt;/p&gt;
&lt;a title="real world haskell" href="http://img.zhaojie.me/blog/170283/o_real-world-haskell-cover.jpg" target="_blank"&gt;&lt;img class="floatLeft" alt="real world haskell" src="http://img.zhaojie.me/blog/170283/o_real-world-haskell-cover.jpg" width="150"&gt;&lt;/a&gt; 
&lt;p&gt;您在学习SICP这本书时，也可以选择配合相关的公开视频。您有两个选择，一是&lt;a href="http://webcast.berkeley.edu/course_details_new.php?seriesid=2008-D-26263&amp;amp;semesterid=2008-D"&gt;Berkeley的上课视频&lt;/a&gt;，二是&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-001Spring-2005/VideoLectures/index.htm"&gt;MIT的公开课件&lt;/a&gt;。前者的讲述较为轻松有趣，相对容易理解一些，我看了大半；而后者为SICP原书作者Hal Abelson 和Gerald Jay Sussman为Hewlett-Packard公司员工培训时的录像，我感觉更为体系、理论、也相对较为难懂——当然，这只是我看了Lecture 1的两段录像后的感觉。此外，北大也开设了《&lt;a href="http://www.math.pku.edu.cn/teachers/qiuzy/progtech/"&gt;程序设计技术和方法&lt;/a&gt;》课程，使用SICP作为教材，相信也是不错的参考。&lt;/p&gt;
&lt;p&gt;最后便是开发环境了。SICP使用Lisp语言，而在实验时，您不妨使用&lt;a href="http://en.wikipedia.org/wiki/Scheme_%28programming_language%29"&gt;Scheme&lt;/a&gt;，它是Lisp语言的两种常见方言之一（还有一种是&lt;a href="http://en.wikipedia.org/wiki/Common_Lisp"&gt;Common Lisp&lt;/a&gt;）。您可以使用&lt;a href="http://www.gnu.org/software/mit-scheme/"&gt;GNU/MIT Scheme&lt;/a&gt;作为编译/解释器，不过我使用的是&lt;a href="http://www.codeplex.com/IronScheme"&gt;IronScheme&lt;/a&gt;，它基于DLR，也是.NET平台下的另一个编程语言实现。不过话说回来，其实我在做SICP的习题时使用最多的还是F#，它是由微软研究院发明的又一种.NET语言，同时拥有强大的函数式编程和面向对象能力。此外，我现在对于Haskell也有相当兴趣，这个老牌的纯函数式编程语言也慢慢地回到人们视线中来。我使用的参考书是《&lt;a href="http://www.amazon.com/Real-World-Haskell-Bryan-OSullivan/dp/0596514980"&gt;Real World Haskell&lt;/a&gt;》，它获得了&lt;a href="http://www.joltawards.com/winners.html#bookstech"&gt;Jolt大奖最佳技术书籍&lt;/a&gt;，希望能从中获取更多灵感。最关键的是，&lt;a href="http://book.realworldhaskell.org/read/"&gt;这本书也在互联网上完全公开&lt;/a&gt;——这是一种什么样的精神！&lt;/p&gt;
&lt;h1&gt;相关文章&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.zhaojie.me/2009/05/recommended-reading-1.html"&gt;老赵书托（1）：写在前面&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;老赵书托（2）：计算机程序的构造与解释&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注1：&lt;/strong&gt;原本我这里写了“柯里化”，有朋友指出，严格说来这其实应该是“部分应用”。关于这点有待稍后确认。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注2：&lt;/strong&gt;其实，如果您要在C#中实现部分应用，更通用的做法可能是构造如下的扩展方法：&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T2, T3, TResult&amp;gt; Currying&amp;lt;T1, T2, T3, TResult&amp;gt;(
    &lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; f, T1 t1)
{
    &lt;span style="color: blue"&gt;return &lt;/span&gt;(t2, t3) =&amp;gt; f(t1, t2, t3);
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注3：&lt;/strong&gt;这段文字只是为了说明FP并非玩具，是对您有切实帮助的——当然您也无需将其理解为“不学FP非好汉”的观点。关于这方面话题，您可以浏览怪怪同学的文章《&lt;a href="http://www.cnblogs.com/guaiguai/archive/2009/07/16/1524693.html"&gt;嗯嗯，关于SICP&lt;/a&gt;》，一起品味一下。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注4：&lt;/strong&gt;这些建议，乃至整篇文章都是根据我个人体会总结得来，有相当的主观成分。欢迎提出不同意见，多种看法的汇总对读者是最有价值的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注5：&lt;/strong&gt;这本书我只是简单的浏览过部分章节，因此感觉可能会有所偏差——当然，“SICP基础书籍”这个观点也是SSICC一书给自己的定位。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html#comments</comments>
      <pubDate>Tue, 14 Jul 2009 16:11:00 GMT</pubDate>
      <lastBuildDate>Wed, 09 May 2012 06:32:50 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>老赵书托（1）：写在前面</title>
      <link>http://blog.zhaojie.me/2009/05/recommended-reading-1.html</link>
      <guid>http://blog.zhaojie.me/2009/05/recommended-reading-1.html</guid>
      <description>&lt;p&gt;最近我思考和总结地越来越多，感觉也是时候把自己许多年来的经验进行一番总结和整理。谈&lt;a href="http://blog.zhaojie.me/2009/04/1443234.html"&gt;基础与能力&lt;/a&gt;的时候，我把人脑比喻为“存储器”，里面存放了“知识”和“能力”等信息。而思考和总结便可以看作对这些信息的索引进行整理，好比数据库在运行一定时间之后需要整理索引碎片一样。因为种种原因，一些重要的内容可能已经淡忘了，或者有些东西当时认为“有空再关注”却从此置之不理，而整理和思考也正是一个查漏补缺的过程。&lt;/p&gt; &lt;p&gt;对于每个搞技术的人，技术方面的书籍相信都看了也不少，有些书籍看了就忘也没有太多关系，有些书籍却可能值得常备案头，每次翻阅都会有不同体会，这就是普通书和好书的区别之一。在每个人的成长过程中，总归会有那么几本书对自己的影响非常大，而对这些书进行整理和推荐也是一件快事——至少发现自己曾经也耗费数千小时看了数千页，一股成就感便“油然而生”。我自诩在读书，至少是技术书籍或资料方面涉猎颇多，小有心得，按照某些朋友喜爱的说法，“有资格”给后来者一定的指导。能够在自己积累的同时帮助他人，何乐而不为，也算是尽可能利用一把自己所谓的“影响力”。&lt;/p&gt; &lt;p&gt;这些书都是我认为的“&lt;font color="#ff0000"&gt;.NET开发人员必读书籍&lt;/font&gt;”，但是您会发现，它们不一定是和.NET有关的书籍。事实上，其中的大部分都和.NET没有必然联系，或者说，和具体技术没有太大关系。熟悉我的朋友一定知道，我是一个重视基础的人，因此推荐的许多内容也都是为了让一个技术人员可以更好，更快前进的基石；而另外一些，可能是面向国内许多.NET开发人员的“通病”而推荐的有针对性地书，希望他们能够改变一些朋友在使用.NET时的一些思维模式。&lt;/p&gt; &lt;p&gt;这些书都有一定共性，例如它们在业界都拥有顶级口碑，也都是我仔细阅读过（至少仔细阅读过其中大部分）的书籍。这些书籍可能会略带一些学术意味，但肯定不会过于深入&lt;sup&gt;1&lt;/sup&gt;。我在推荐的时候也尽可能把自己的个人喜好排出在外，推荐一些真正对尽可能多的人有用的书籍，而不是凭着自己的兴趣罗列出各种资料。例如，我不会推荐任何IL的书，因为我认为这对于.NET开发人员来说并没有太大帮助，掌握IL既不是优秀.NET开发人员的必要条件也不是充分条件；但是我推荐的书籍可以让您更好地理解IL是怎么样的东西，并且让您在需要了解IL的时候有足够的能力去学习及深入——这才是我认为的“基础”，“基础”与“底层”或“深入”无关，有时候它更接近是一种“能力”的培养和“常识”的形成，而不是对“技术”的掌握。&lt;/p&gt; &lt;p&gt;也正因为如此，我会在推荐每本书的时候详细谈论自己对这本书的看法，推荐它的原因，以及我个人认为该如何阅读这本书（哪些着重，那些可以略过，那些可以暂时跳过回头再读等等）。读好书也需要方法，好方法可以让您得到更好的效果，也可以相对节省一些时间。但是别误会了，这些书都是需要您花上数周甚至数月的时间来仔细阅读（全身心投入，或囫囵吞枣者除外），并且时不时再拿起来翻阅一番。有时，您可能还需要思考或实现一下书中的练习题，也欢迎大家和我一起讨论这些问题。&lt;/p&gt; &lt;p&gt;基于我一贯的风格，我会尽可能地认真对待每一本书，甚至会把它们重新浏览一番，因此无法保证“书托”行动的周期长度，请大家谅解。&lt;/p&gt; &lt;p&gt;至于书籍的来源，您可以在国内购买翻译版或影印版，也可以像我一样投入重金，把所有这些书的原版收入囊中……不过这可能只有我这样的“书痴”才能感受到这样做的乐趣&lt;sup&gt;2&lt;/sup&gt;吧。此外，我也会在推荐的时候附带一些额外的资源，其中也包括一些互联网上可以找到的Open Course，因此练好英语也是非常重要的。英语能力，至少是阅读能力，可能的确是成为优秀技术人员的“必要条件”之一吧。&lt;/p&gt; 
&lt;h1&gt;相关文章&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;老赵书托（1）：写在前面&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html"&gt;老赵书托（2）：计算机程序的构造与解释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.zhaojie.me/2009/11/recommended-reading-3-csapp.html"&gt;老赵书托（3）：深入理解计算机系统&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;注1：我经常想起李开复大叔非常“道貌岸然”的一句话：“如果你在大学里看完TAOCP，那么你的算法能力就不错了”——如果您可以做到这一点，在国内任何一所大学都是顶尖的学生。&lt;/p&gt; &lt;p&gt;注2：我不知道世界上有“电子书”这个东西可以下载，也不知道可以用emule找到其中大部分的书。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/05/recommended-reading-1.html#comments</comments>
      <pubDate>Tue, 05 May 2009 16:11:00 GMT</pubDate>
      <lastBuildDate>Tue, 05 May 2009 16:11:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <title>Jolt Awards提名已经出来了</title>
      <link>http://blog.zhaojie.me/2007/01/627575.html</link>
      <guid>http://blog.zhaojie.me/2007/01/627575.html</guid>
      <description>&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;其实按照&lt;a href="http://www.joltawards.com/faq.html;jsessionid=CBPU3XMXVIBJEQSNDLPCKH0CJUNN2JVN"&gt;Schedule&lt;/a&gt;已经出来一周了吧：&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;SCHEDULE&lt;/strong&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;Nominations open October 2006&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;Nominations close December 15, 2006&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;Finalists announced January 15, 2007&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;Winners announced at SD West 2007 on March 21, 2007&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;Jolt Awards年年关注，现在也只会买一下那些得奖的书了。不过Jolt Awards不仅仅是书，从这次的提名来看，微软的几个产品在开发环境或开发框架类别中榜上有名，它们是：&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython"&gt;IronPython&lt;/a&gt; &amp;#8211; Development Environments&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://www.netfx3.com/"&gt;.NET Framework 3.0 &lt;/a&gt;- Frameworks&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://msdn.microsoft.com/directx/xna/gse/"&gt;Microsoft XNA Game Studio Express&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/directx/XNA/default.aspx"&gt;XNA Framework&lt;/a&gt; &amp;#8211; Development Environments and Frameworks&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;以下是完整的提名：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Books (Practical/General Developer Interest)&lt;/strong&gt;
&lt;blockquote&gt;&lt;em&gt;Agile Software Development: The Cooperative Game&lt;/em&gt; (Addison-Wesley) by Alistair Cockburn&lt;br&gt;&lt;em&gt;Catastrophe Disentanglement&lt;/em&gt; (Addison-Wesley) by E. M. Bennatan&lt;br&gt;&lt;em&gt;Eric Sink on the Business of Software&lt;/em&gt; (Apress) by Eric Sink&lt;br&gt;&lt;em&gt;Practices of an Agile Developer&lt;/em&gt; (Pragmatic Bookshelf) by Venkat Subramaniam and Andy Hunt&lt;br&gt;&lt;em&gt;Software Creativity 2.0&lt;/em&gt; (DeveloperDotStar) by Robert L. Glass&lt;br&gt;&lt;em&gt;Software Estimation: Demystifying the Black Art&lt;/em&gt; (Microsoft Press) by Steve McConnell&lt;br&gt;&lt;em&gt;Weinberg on Writing: The Fieldstone Method&lt;/em&gt; (Dorset House) by Gerald M. Weinberg&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Books (Technical)&lt;/strong&gt;
&lt;blockquote&gt;&lt;em&gt;Code Quality&lt;/em&gt; (Addison-Wesley) by Diomidis Spinellis&lt;br&gt;&lt;em&gt;How to Break Web Software&lt;/em&gt; (Addison-Wesley) by M. Andrews, J. Whittaker&lt;br&gt;&lt;em&gt;Java Concurrency in Practice&lt;/em&gt; (Addison-Wesley) by Brian Goetz et al &lt;br&gt;&lt;em&gt;Rails Recipes&lt;/em&gt; (Pragmatic Bookshelf) by Chad Fowler&lt;br&gt;&lt;em&gt;Refactoring Databases&lt;/em&gt; (Addison-Wesley) by Scott W. Ambler and P. J. Sadalage&lt;br&gt;&lt;em&gt;Head First Object-Oriented Analysis and Design&lt;/em&gt; (O'Reilly) by B. McLaughlin, G. Pollice and D. West&lt;br&gt;&lt;em&gt;Ruby Cookbook&lt;/em&gt; (O'Reilly) by Lucas Carlson and Leonard Richardson&lt;br&gt;&lt;em&gt;CSS: The Missing Manual&lt;/em&gt; (O'Reilly) by David Sawyer McFarland&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Change and Configuration Management&lt;/strong&gt;
&lt;blockquote&gt;AccuRev 4.5 with AccuWorkflow (Accurev)&lt;br&gt;AnthillPro3 (Urbancode)&lt;br&gt;Automated Build Studio (AutomatedQA)&lt;br&gt;FLEXnet Connect (Macrovision)&lt;br&gt;Perforce SCM (Perforce)&lt;br&gt;Team Foundation Server (Microsoft Corporation)&lt;br&gt;CA Wily Introscope ChangeDetector (CA / Wily Technology)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Collaboration Tools&lt;/strong&gt;
&lt;blockquote&gt;Adobe Acrobat Connect Professional (Adobe Systems)&lt;br&gt;Code Collaborator (Smart Bear Software)&lt;br&gt;Confluence (Atlassian Software Systems)&lt;br&gt;NetBeans IDE (Sun Microsystems) &lt;br&gt;Sugar Professional (SugarCRM)&lt;br&gt;TeamCity (JetBrains)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Database Engines and Data Tools&lt;/strong&gt;
&lt;blockquote&gt;Coral8 Engine (Coral8)&lt;br&gt;dbdeploy (ThoughtWorks)&lt;br&gt;MarkLogic Server (Mark Logic)&lt;br&gt;SQL Anywhere (Sybase iAnywhere)&lt;br&gt;SQL Refactor (Red Gate Software)&lt;br&gt;Visual Studio 2005 Team Edition for Database Professionals (Microsoft)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Design and Modeling&lt;/strong&gt;
&lt;blockquote&gt;Compuware OptimalJ (Compuware)&lt;br&gt;Corticon Business Rules Modeling Studio (Corticon Technologies)&lt;br&gt;MagicDraw UML (No Magic)&lt;br&gt;RAVEN (Ravenflow)&lt;br&gt;stpBA Storyboarding for Microsoft Visual Studio 2005 Team System (stpsoft ltd.)&lt;br&gt;Stylus Studio 2007 XML Enterprise Suite (DataDirect Technologies)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Development Environments&lt;/strong&gt;
&lt;blockquote&gt;EiffelStudio Open Source Edition (Eiffel Software)&lt;br&gt;IntelliJ IDEA (JetBrains)&lt;br&gt;IronPython (Microsoft)&lt;br&gt;Microsoft XNA Game Studio Express, XNA Framework (Microsoft)&lt;br&gt;NetBeans IDE (Sun Microsystems)&lt;br&gt;Wolfram Workbench (Wolfram Research)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Enterprise Tools&lt;/strong&gt;
&lt;blockquote&gt;Cape Clear ESB Platform (Cape Clear Software)&lt;br&gt;Liferay Portal (Liferay)&lt;br&gt;Mule (MuleSource)&lt;br&gt;Appistry EAF (Appistry)&lt;br&gt;Pentaho Open BI Suite (Pentaho)&lt;br&gt;TeamCity (JetBrains)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Libraries, Frameworks and Components&lt;/strong&gt;
&lt;blockquote&gt;JViews (ILOG)&lt;br&gt;NetAdvantage for .NET (Infragistics)&lt;br&gt;telerik r.a.d.controls for WinForms (Telerik)&lt;br&gt;.NET Framework 3.0 (Microsoft)&lt;br&gt;Intel Threading Building Blocks (Intel)&lt;br&gt;Microsoft XNA Game Studio Express, XNA Framework (Microsoft)&lt;br&gt;The Mono Project (Novell)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mobile Development&lt;/strong&gt;
&lt;blockquote&gt;AccuSPEECH (Vangard Voice Systems)&lt;br&gt;Carbide .c++ Professional Edition (Nokia)&lt;br&gt;Crossfire (AppForge)&lt;br&gt;Qtopia Greenphone (Trolltech)&lt;br&gt;NetBeans Mobility Pack 5.5 and Sun Java Wireless Tookit 2.2 (Sun Microsystems)&lt;br&gt;Qtopia (Trolltech)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Project Mangement Tools&lt;/strong&gt;
&lt;blockquote&gt;6th Sense Analytics (6th Sense Analytics)&lt;br&gt;DevPlan (TechExcel)&lt;br&gt;Rally Enterprise (Rally Software)&lt;br&gt;TargetProcess (TargetProcess)&lt;br&gt;Teamwork (Open Lab)&lt;br&gt;V1: Agile Enterprise (VersionOne)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;
&lt;blockquote&gt;AppScan (Watchfire)&lt;br&gt;beSTORM (Beyond Security)&lt;br&gt;DevInspect (S.P.I. Dynamics)&lt;br&gt;Fortify Defender (Fortify Software)&lt;br&gt;Fortify Source Code Analysis (SCA) (Fortify Software)&lt;br&gt;Metasploit Framework (Metasploit)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Automated Testing Tools&lt;/strong&gt;
&lt;blockquote&gt;AgitarOne (Agitar Software)&lt;br&gt;CodePro AnalytiX (Instantiations)&lt;br&gt;Mindreef SOAPscope (Mindreef)&lt;br&gt;Parasoft Jtest (Parasoft)&lt;br&gt;Parasoft SOAtest (Parasoft)&lt;br&gt;TestComplete (AutomatedQA)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bug and Defect Tracking Tools&lt;/strong&gt;
&lt;blockquote&gt;JIRA (Atlassian Software Systems)&lt;br&gt;OnTime 2007 Hosted (Axosoft)&lt;br&gt;Software Planner Professional (Pragmatic Software Co.)&lt;br&gt;TestTrack Studio (Seapine Software)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Utilities&lt;/strong&gt;
&lt;blockquote&gt;Adobe Captivate 2 (Adobe Systems)&lt;br&gt;AutoPatch (Tacit Knowledge)&lt;br&gt;ElectricCommander (Electric Cloud)&lt;br&gt;TEKchecker and StyleWriter (ClearSpecs Enterprises)&lt;br&gt;TextMate (MacroMates)&lt;br&gt;VMware Lab Manager (VMware)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Web Development&lt;/strong&gt;
&lt;blockquote&gt;Adobe Flex 2 (Adobe Systems)&lt;br&gt;IntelliJ IDEA (JetBrains)&lt;br&gt;Kapow Mashup Server (Kapow Technologies)&lt;br&gt;LignUp Communications Application Server (LignUp)&lt;br&gt;Mindreef SOAPscope Server (Mindreef)&lt;br&gt;NetBeans Visual Web Pack (Sun Microsystems)&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Web Sites/Developer Networks&lt;/strong&gt;
&lt;blockquote&gt;CM Crossroads (CMC Media)&lt;br&gt;IBM developerWorks (IBM)&lt;br&gt;Sun Developer Network (Sun Microsystems)&lt;br&gt;Koders.com (Koders)&lt;br&gt;Krugle (Krugle)&lt;br&gt;Makezine.com (O'Reilly)&lt;br&gt;The Code Project (The Code Project)&lt;/blockquote&gt;</description>
      <comments>http://blog.zhaojie.me/2007/01/627575.html#comments</comments>
      <pubDate>Tue, 23 Jan 2007 01:44:00 GMT</pubDate>
      <lastBuildDate>Tue, 23 Jan 2007 01:44:00 GMT</lastBuildDate>
    </item>
  </channel>
</rss>
