最常被程序员们谎称读过的计算机书籍

马克·吐温曾经说过,所谓经典小说,就是指很多人希望读过,但很少人真正花时间去读的小说。这种说法同样适用于“经典”的计算机书籍。

Stack Overflow(以及其它很多软件论坛)上,诸如”程序员最应该读的计算机书籍有哪些?“这样的问题会周期性的出现。这样的问题不断的被提出、被回答,只是形式不同罢了。相同的几本书总是会出现在清单的前几名内,所以,如果想知道人们谈论的都是些什么,你有必要去读一读这些书的。

大多数程序员真正读过的计算机书籍

  1. 代码大全(Code Complete)——两届Software Jolt Award震撼大奖得主!
  2. 程序员修炼之道(The Pragmatic Programmer)
  3. C程序设计语言( C Programming Language)(第2版)
  4. 重构:改善既有代码的设计(Refactoring: Improving the Design of Existing Code)
  5. 人月神话(The Mythical Man-Month)
  6. 编码——隐匿在计算机软硬件背后的语言(Code: The Hidden Language of Computer Hardware and Software)
  7. Head First 设计模式(Head First Design Patterns)
  8. 编程珠玑(Programming Pearls)
  9. Effective Java中文版(Effective Java (2nd Edition))or Effective C++(第三版)中文版
  10. Test Driven Development: By Example

上面的这些书我自己都读过,所以我不难相信很多不是很优秀的程序员也都读过它们。如果你对编程有足够的兴趣,能够来到这里读这篇博客,你很可能读过 其中的大部分,甚至还有很多不在这个清单中的,所以我就不浪费时间每本书都评论一番了。我想说的是,这个清单上的每本书都是它各自领域里的奇书。所以,很 多有愿望不断提高自己的编程技术的程序员都读过这些书,这就不足为怪了。

在人们备受推崇的计算机书籍中,还有一类书受到了独特的待遇。我称下面这个清单为“最常被程序员们谎称读过的计算机书籍”。这并不是说推荐这些书的 人都没有真正读过它们。我只是有相当的信心怀疑更多的人只是在口头上宣称读过下列书籍,而实际上很少人真正读过它们。下面就是这个清单。

最常被程序员们谎称读过的计算机书籍

  1. 算法导论(Introduction to Algorithms)(CLRS) 这本书的名称是所有出版过的计算机书籍中最让人误解一个。它被广泛的使用在很多大学里,通常被当作毕业生必需的算法课程。于是,只要在大学里上过计算机课 程的学生几乎都有一本这样的书。然而,除非你拥有计算机硕士学位(而且是算法研究领域的),我怀疑你顶多只读过算法导论(Introduction to Algorithms)里节选的几章内容。这个书名让人误解,是因为”Introduction”这个词让人以为它很适合初级程序员。实际上不是。这本书对算法做尽可能详尽综合的介绍,就像其它一些随处可见的类似的书一样。请不要再把这本书推荐给初学者。
  2. 编译原理(Compilers: Principles, Techniques, and Tools)(the Dragon Book).这本恐龙封面的书涵盖了开发一个编译器你所需要的全部的知识。它的内容包括词汇分析,语法分析,类型检查,代码优化,以及其它很多高深的题 目。请不要把这本书推荐给初级程序员,他们需要的只是分析简单的包含数学公式或HTML的字符串。除非你真的需要实现一个能够实用的编译器(或解释器), 你根本不需要掌握这本“恐龙”书的全部强大威力。把它推荐给一个遇到简单文本分析问题的人,这证明你根本没有读过它。
  3. 计算机程序设计艺术(The Art of Computer Programming)(TAOCP) 我经常听到人们把这本书描述为“每个程序员必读”的系列计算机书籍。我认为这明显不是实情。在我说出这样大不敬的话、被你们用板砖拍死之前,请让我做解释 一下。这不是一本让你一页一页翻着读的书。这是一本参考大全书。把它放在你的书架上看起来会很不错(实际上也它确实很好),但如果想把它通读一遍,你需要 几年时间,而且最后什么都没记住。这并不是说手边放这样一本书没有什么价值。它是一本参考书,当我遇到难题,走投无路时,很多次我都在这本书里找到办法。 但这本书终究是被我当作参考书。它复杂难懂,很理论,里面的例子都是汇编语言的。好的一面是,如果你想在这本书里寻找针对某一问题的解决方案,如果你找不 到,那就说明这个问题无解。它是一本对它所涉及到的领域做了最最详尽介绍的一本书。
  4. Design Patterns: Elements of Reusable Object-Oriented Software(Gang of Four)这本书是唯一一本在这个清单里我从头到尾读过的书,读的结果是,我不知道该把这本书归到哪个类别。它出现在这个清单里,并不是因为我认为只有很少人真正读过它。很多人都读过。只是因为有更多推荐过这本书的人自己却没有读过。Design Patterns这边书的问题在于,很多书里给出的信息,你在其它很多地方都能看到。这样就使得一个初学者在维基百科上读了几篇关于设计模式的内容后,就敢在面试中宣称自己看过这本书。这就是为什么Singleton成 了一种新的全局变量的原因。如果有更多的人花时间读过这本也叫做Gang of Four的书的原著,那世界上就不会有这么多人会把17种设计模式硬塞到一个日志(logging)框架里了。这本书最精彩的部分是每章里描述如何正确的 使用一种模式的段落。遗憾的是,这些精华却在很多其它设计模式资料里被漏掉了。
  5. C++程序设计语言(The C++ Programming Language)这本书不像一本编程教材,更像一本编程语言参考。有很多的迹象表明有人确实读过这本书,否则我们不可能有这么多的C++ 编译器可选择。编程初学者(或者甚至其它语言的专家),如果想学C++,不应该直接去啃C++程序设计语言(The C++ Programming Language)这本书。告诉他们去读《C++ Primer中文版》。

正如我之前说的,我知道你们当中会有一些人真正的读过这些书。那这篇文章不是针对你的,针对的是那些企图通过假装读过这些书来表现自己的民众。 如果你自己没有读过这些计算机书籍,请不要推荐给别人。这样做会耽误别人的时间,误人子弟,因为一些阅历更丰富的人可能会有更好的书(更针对某一领域,更容易理解,跟某种编程语言或某种编程水平更契合的书)来推荐。除此之外,你也能避免被那些真正读过计算机程序设计艺术(The Art of Computer Programming)的人用MMIX知识给拷问住造成的尴尬(如果你不知道我在说什么,那我指的就是你)。

[本文英文原文链接:Books Programmers Claim to Have Read ]

愈加混乱的手机市场!罗永浩老师进入手机领域

教师?手机生产商?也许两个永远画不上等号,但是也有例外。4月8日下午,老罗英语培训创始人罗永浩微博透露,将于下周注册一家新公司进入手机领域。据罗永浩此前的微博透露,产品方向将注重于用户体验和设计。


         此前罗永浩曾拜访小米公司,想以营销推广方面的能力入伙,但因与雷军的理念不合未果。雷军想做高性能、高性价比的手机,而罗永浩想做注重用户体验和设计的手机,因而决定另起炉灶进军手机领域。 虽然罗永浩与小米手机合作未果,但雷军在微博评价称:“我觉得他(罗永浩)对手机太专业了!”暗示看好罗永浩进军手机市场。

Android 开发者不得不面对的五大问题

IDC最近一份关于移动应用开发的调查报告显示,Androdid开发者对谷歌的移动操作系统平台的兴趣正在下降。尽管依然有79%的开发者表示对Android “非常感兴趣”,但IDC的调查报告显示,一些迹象表明在2012到2013年间,Android 将随着遇到的问题,市场份额会出现大的变化。解决这些问题,对于谷歌如何维持Android 生态系统的活力来说意义重大。同样,独立开发者也要意识到这些问题将给自己的商业计划带来困难。

1、Android 的碎裂化问题

现如今,用户手中的Android 系统版本各异。相信你已经看到过有很多关于开发者如何为最低通用版本编码 的文章(现在可能是2.3版本了)。但是,不止在操作系统方面存在Android 版本碎裂化这个问题。在SDK开发工具上,也没有统一的标准。你可能要为六种尺寸的屏幕编码,不同的按钮、键盘,有的可能根本就没有按钮……好吧,你可以 在一个代码分支上为所有的这些设备编码(这种方案即笨拙又不容易实现),或者开发多个版本(听起来就很糟糕)。当然,如果回报还不错的话,这么做也未尝不 可,可事实上并非如此。

2、投资的回报

这似乎是既定的法则:Android 应用的利润一般都比 iOS 应用的利润少。这可能是因为人们在买手机时更关注它的功能而不是应用的质量,但是这意味着开发者将获得较少的利润。如果开发者拥有的时间和资源有限,在需 要选择平台时,平台已经建立的基础将变得不再重要,他们更关心的将会只是:“我能否赚到钱?”

3、克隆应用的数量

让我们先假设你有一款优秀的应用,它能做一些与众不同的工作,可能是能够联机到社交网络上、处理 PIM 数据,或者能提供一种新的游戏玩法。然后你有办法让你的应用从成千上万个应用里脱颖而出。但是,接下来就会有数不清的开发者开发出克隆版本,从而拉低你的 应用的价格,和你展开竞争。Android 商店几乎是一个无法无天的社会。如果不解决这一问题,让开发者面对不公平的竞争,还有多少开发者愿意在里面做应用推广呢?

4、选择哪家商店销售你的应用?

Google Play商店、亚马逊的Android商店Barnes and Noble’s Nook Apps……有很多地方你可以选择用来销售你的应用。这是市场方面的碎裂化问题,而且,有时候它也会让设备型号变得纷乱繁杂。这就意味着要建立更多的版本、协议等等,这些都会是令你头痛的工作。与此相反的是,iOS 和 Windows 手机就没有这么多繁杂的工作要做。

EAUbisoft这样的公司或许可以应付这些问题,但是那些个人开发者是不可能把他们所有的时间都花在应用商店的管理上的。有时候,当平台已经不再处于快速发展阶段时,开放和免费并不是做好的选择

5、解决竞争问题

现如今,Windows Phone正在不断的发展。AT&T也将在4月份,用Lumia 900和HTC Titan 2对Android 的生态系统发起冲击。倘若Android 对以上问题还束手无策的话,将面临被开发者抛弃的危险。开发者可能会转投其它诸如Windows Phone平台,并思考这个新平台可以做什么、开发环境如何、能否在新的市场里名扬万里、能否为我带来更大的利润?虽然外国的月亮未必比自家的圆,但倘若能为开发者带来更高的回报和长期良好回报的承诺,Windows Phone将挖走很多开发者

事实上,IDC的调查指出,对Windows Phone感兴趣的开发者的数量在不断增加,40%参与此次调查的开发者表示,对为微软的移动平台开发应用很感兴趣。而这一数字已经超过对Android平台很感兴趣的开发者数量的一半。

虽然Android 平台依然占据很大的市场份额,但倘若对以上问题没有好的解决办法,未来发展恐怕会困难重重。

英文原文:Five Reasons Why Developers Need To Be Wary About Android

一个 Python 程序员的进化

不久前,在互联网上出现了一篇有趣的文章,讲的是对于同一个问题,不同层次的Python程序员编出的Python代码显示出了不同的风格,代码都 很简单,有趣。

编程新手

  1. def factorial(x):
  2. if x == 0:
  3. return 1
  4. else:
  5. return x * factorial(x – 1)
  6. print factorial(6)

一年编程经验(学Pascal的)

  1. def factorial(x):
  2. result = 1
  3. i = 2
  4. while i <= x:
  5. resultresult = result * i
  6. ii = i + 1
  7. return result
  8. print factorial(6)

一年编程经验(学C的)

  1. def fact(x): #{
  2. result = i = 1;
  3. while (i <= x): #{
  4. result *= i;
  5. i += 1;
  6. #}
  7. return result;
  8. #}
  9. print(fact(6))

一年编程经验(读过 SICP)

  1. @tailcall
  2. def fact(x, acc=1):
  3. if (x > 1): return (fact((x – 1), (acc * x)))
  4. else: return acc
  5. print(fact(6))

一年编程经验(Python)

  1. def Factorial(x):
  2. res = 1
  3. for i in xrange(2, x + 1):
  4. res *= i
  5. return res
  6. print Factorial(6)

懒惰的Python程序员

  1. def fact(x):
  2. return x > 1 and x * fact(x – 1) or 1
  3. print fact(6)

更懒的Python程序员

  1. f = lambda x: x and x * f(x – 1) or 1
  2. print f(6)

Python 专家

  1. fact = lambda x: reduce(int.__mul__, xrange(2, x + 1), 1)
  2. print fact(6)

Python 黑客

  1. import sys
  2. @tailcall
  3. def fact(x, acc=1):
  4. if x: return fact(x.__sub__(1), acc.__mul__(x))
  5. return acc
  6. sys.stdout.write(str(fact(6)) + ‘\n’)

专家级程序员

  1. from c_math import fact
  2. print fact(6)

大英帝国程序员

  1. from c_maths import fact
  2. print fact(6)

Web 设计人员

  1. def factorial(x):
  2. #————————————————-
  3. #— Code snippet from The Math Vault —
  4. #— Calculate factorial (C) Arthur Smith 1999 —
  5. #————————————————-
  6. result = str(1)
  7. i = 1 #Thanks Adam
  8. while i <= x:
  9. #result = result * i #It’s faster to use *=
  10. #result = str(result * result + i)
  11. #result = int(result *= i) #??????
  12. result = str(int(result) * i)
  13. #result = int(str(result) * i)
  14. i = i + 1
  15. return result
  16. print factorial(6)

Unix 程序员

  1. import os
  2. def fact(x):
  3. os.system(‘factorial ‘ + str(x))
  4. fact(6)

Windows 程序员

  1. NULL = None
  2. def CalculateAndPrintFactorialEx(dwNumber,
  3. hOutputDevice,
  4. lpLparam,
  5. lpWparam,
  6. lpsscSecurity,
  7. *dwReserved):
  8. if lpsscSecurity != NULL:
  9. return NULL #Not implemented
  10. dwResult = dwCounter = 1
  11. while dwCounter <= dwNumber:
  12. dwResult *= dwCounter
  13. dwCounter += 1
  14. hOutputDevice.write(str(dwResult))
  15. hOutputDevice.write(‘\n’)
  16. return 1
  17. import sys
  18. CalculateAndPrintFactorialEx(6, sys.stdout, NULL, NULL, NULL,
  19. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)

企业级程序员

  1. def new(cls, *args, **kwargs):
  2. return cls(*args, **kwargs)
  3. class Number(object):
  4. pass
  5. class IntegralNumber(int, Number):
  6. def toInt(self):
  7. return new (int, self)
  8. class InternalBase(object):
  9. def __init__(self, base):
  10. self.base = base.toInt()
  11. def getBase(self):
  12. return new (IntegralNumber, self.base)
  13. class MathematicsSystem(object):
  14. def __init__(self, ibase):
  15. Abstract
  16. @classmethod
  17. def getInstance(cls, ibase):
  18. try:
  19. cls.__instance
  20. except AttributeError:
  21. cls.__instance = new (cls, ibase)
  22. return cls.__instance
  23. class StandardMathematicsSystem(MathematicsSystem):
  24. def __init__(self, ibase):
  25. if ibase.getBase() != new (IntegralNumber, 2):
  26. raise NotImplementedError
  27. self.base = ibase.getBase()
  28. def calculateFactorial(self, target):
  29. result = new (IntegralNumber, 1)
  30. i = new (IntegralNumber, 2)
  31. while i <= target:
  32. result = result * i
  33. i = i + new (IntegralNumber, 1)
  34. return result
  35. print StandardMathematicsSystem.getInstance(new (InternalBase,
  36. new (IntegralNumber, 2))).calculateFactorial(new (IntegralNumber, 6))

IT女的福音 Etsy资助女性免费学习编程

Etsy,被誉为稀奇古怪玩意儿领域的 eBay,这家在线超市打算在其工程部门增加女性员工数量。据《福布斯》报道,这家公司于上周四宣布,公司将与纽约的 Hacker School 合作,在今年夏季资助女性编程爱好者学习编程。

这也是情理之中的事,因为这家公司的顾客和商家几乎被女人占据,2010年的调查显示,其博客读者 97% 都是女性。

Etsy 对女性工程师的需求日益增加,其工程部副总监 Marc Hedlund 在公司官方博客中写到:去年九月,工程及运营部 96 位员工中,只有1/3的都是女性,但没有一个是经理级的,作为一个服务于成千上万女性企业家的公司,作为一个主要把产品销售给女性的公司,作为一个已经有许多具有才能的女性员工的公司,Etsy 有理由为女性提供这么一个机会。

Maeghan Ouimet 还说:

“这次 5 万美金的资金将用于资助 10 位女性,一旦入选,将会接受 Hacker School 的一系列的紧密编程训练,地点在 Etsy 的布鲁克林总部。课程结束,公司将会招纳更多女性贤才,感兴趣的朋友请访问这里