私以为可以提高程序员技术档次的书和博客

私以为可以提高程序员技术档次的书和博客

为什么中国的程序员总是在不断学习新的开发工具、钻研程序代码,而不逐步提升自己的视野、思维和经验?
我大胆把程序员分为两种——工人艺人
工人,类似于泥瓦匠,按部就班,可以做好本职工作,但不具备创造性,在编程时也没有考虑系统的架构、各模块之间的分工等。这种人往往死守某一种语言或技术,不肯接纳新思想,也拒绝接受新的技术。其最大的特点就是,写出的代码能勉强能运行,但没有经过任何重构,代码完全是一团错综曲折的杂酱面。这种工人有许多称呼,如码农IT民工
艺人,即是艺术家。我们常听见有人说编程是一门艺术,他们口中所说的就是这类人。艺人级别的程序员,所写的代码精炼简洁,架构优良,各模块分工明确且结构清晰。他们选用某种语言,不是因为它流行,而是因为它适合,因此他们不会拘泥于语言,追求完美与极致。这种艺人也有许多称呼,如黑客、极客
并局限于某门编程语言,并实现工人艺人的华丽转变。按照这个标准,我推荐了以下书籍:
1.《代码的未来》松本行弘,编程的本质是思考。
关于作者

Ruby之父
编程的本质是什么?
编程的本质是思考。
什么又是编程?
创造出一种人类和计算机都能够理解的语言(编程语言),并通过这样的语言将人类的意图传达给计算机,这样的行为就叫做编程。
我是在大学在读到这本书的,在此之前,我已有了3年多编程经历。但不可避免的,在读到这本书之前,我对编程的理解却仍然淡薄。
我曾经在学习汇编语言的过程中,得到了老师的善意提醒:“汇编语言已经过时了,没多少人用,现在主流的语言是JAVA,你应该学习JAVA。”
我非常困惑,因为在此之前,我同样得到另一个人的提醒:“语言只是一种工具,真正的高手,不管用什么编程语言都一样。”
刚学的语言却早已过时,刚进入正轨却要重新开始......你很难想象当时的我有多么低落。
这,还不是最可怕的。
可怕的是老师还告诉你:“现在都是可视化编程,不用再写那么多代码,需要什么直接用就好了,就像搭积木一样。未来的话,可能只需要你把你的需求告诉编程软件,它就自动为你生成代码了。”
恐惧!
我第一次感觉到学了编程没有任何意义,因为我跟不上时代发展的潮流,世界每一天都在变化,并且,很快就会将我抛弃。
如果你对此没有太多感触,不以为然,那么,你可以看看现在层出不穷的新语言新技术新思想,你觉得你曾经学的东西还能支撑多久?而智能程序替换掉你的那一天,又会在什么时候到来?
我的恐惧是在读到这本书之后才烟消云散,或许是随着接触的编程语言增多,我对编程有了更多的认识,又或者,是这本书给了我一个善意的谎言,让我有了继续坚持下去的勇气。
编程的本质是思考。
这意味着,语句中是用for还是while,编程语言是采用面向过程还是面向对象,对话框是放置到左边还是右边......这一切一切的背后,都是思考。
换句话说,无论你用多么高效的语言,多么强大的框架,多么牛逼的编程思想,该写的代码还是要写,该解决的问题还是要解决。最终,编程还是得靠你的大脑思考,思考,就是编程的本质。
至于仍在担心的问题:未来的某一天,程序员这个职业会被更智能的编程软件(AI)替代,从此消亡。
这个不是放弃编程的理由,因为既然AI能够替代程序员,那么也就意味着它能替代掉更多是人。要担心的不是我们程序员应该怎么办,而是,我们人类该怎么办?

2.《编程高手箴言》:梁肇新,做一个程序员一定要有耐心。
关于作者
豪杰超级解霸作者(过去的豪杰超级解霸 == 现在的暴风影音
程序与软件是一样的么?
程序不等于软件。
程序与软件的区别是什么?
程序要变成软件,这中间是一个商业化的过程。
在此之前,你可能从某些方面知道了它们的区别:软件 = 程序 + 文档;规模小的是程序,规模大的是软件;写的差的是程序,写的好的是软件......
但是,这是第一本从商业的角度探讨程序与软件区别的书。不仅如此,这本书还在编程人员的编程习惯、学习态度、个人发展、产品商业化等方面都给出了可供参考的见解。
如果你需要的不是那种完全是讲解技术的书籍,而是能够拓展你的思维,那么这本书或许能够给你更多的思考。
注意:本书涉及到的技术较为底层,且同其他编程书籍一样,技术讲解占据很多)

3.《UNIX编程艺术》: Eric S. Raymond ,KISS
关于作者
大教堂与集市》的作者
UNIX的哲学是什么?
一个程序只做一件事,并做好。
程序要能协作。
一个好的程序应该遵循哪些原则?
简洁原则:设计要简洁,复杂度能低则低 。

吝啬原则:除非确无它法,不要编写庞大的程序。

缄默原则:如果一个程序没什么好说的,就保持缄默。

优化原则:雕琢前先得有原型,跑之前先学会走。

扩展原则:设计着眼未来,未来总比预想快。

KISS原则:Keep It Simple, Stupid!
听说Unix/Linux不错,作为一个合格的程序员应该去尝试一下。
于是你下载安装了Ubutu/RedHat,打开了桌面环境,单击双击,复制粘贴。
呃,Unix/Linux相比Windows,没什么不同嘛!
Unix相对于Windows,其最大的特色,我觉得就是程序之间的协作,也就是管道。围绕管道而设计出来的程序,便会顺理成章的去遵循上面提出的几个原则。
如果你认同Linux的设计哲学,那么你可以看看这本书。
这本书在模块化文本化配置接口复杂度优化可移植性等方面,都提供了Unix/Linux世界所积累的宝贵经验。
好的程序可以经受时间、平台与用户的考验,好的编程思想可以经受实践的检验。
附:
不懂UNIX的人注定最终还要重复发明一个蹩脚的Unix。
Those who do not understand Unix are condemned to reinvent it, pooly。 —— Usenet 签名, Henry Spencer

4.《程序员修炼之道:从小工到专家》:Andrew Hunt / David Thomas, 死程序不说谎。
关于作者
本书作者
“拿来就用”主义应该受到鄙视吗?
你不是在窥探,你是在向他们学习。而且要记住,访问是互惠的——不要因为别人钻研你的代码而苦恼。
怎样看待抽象与细节?
将抽象放进代码,细节放进元数据(put abstractions in code, details in matadata) 。
复用,俗称Copy,文人称之为拿来主义。在站在巨人的肩膀上独立自主的争论中,复用造轮子各自朝着不同的方向快速发展着。
有一种观点认为一个好的程序员应该自己从底层做起,而不是去复制粘贴别人的代码。但随着开源运动的崛起,以及程序员所做的大量重复工作,迫使我们对复用有了更深的认识。
这本书可以看作是对《UNIX编程艺术》的补充,是对编程好程序所应遵循原则的进一步阐述。同时相比上一本书,本书更着重于实际的建议:如何划分调用者与被调用者之间的职责范围如何处理传递给函数的参数,如何正确调试等。
用户需求的看法上,本书不同于其他主流观点,推崇挖掘需求——不要搜集需求——挖掘它们。(don't gather requlrementsdig for them)
它不是字典般的代码大全,却更像是百科全书般的编程指南

5.《重构:改善既有代码的设计》: Martin Fowler, 事不过三,三则重构。
关于作者
协助创作了“敏捷软件开发宣言”
什么是重构?
重构,是这样一个过程,在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。
为什么要重构?
任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员。
我对大学编程类课程的一个感受时,大学老师不会讲授软件调试
调试对软件开发而言,无疑是非常重要的一个步骤,因为它能发现软件中存在的很多语法问题与逻辑问题。
但就算如此重要的调试,也只是发现了代码的表面问题,更深层次的架构设计之类,仍需要借助与重构
重构,通俗的称修改代码,或者代码优化
在多数程序员处于匠人级别,是因为他们所写的代码仅仅是勉强能够运行,没有达到优化原则,在进阶艺人的台阶上,止步不前。
开源软件之所以在软件质量上通常都远高于闭源软件,很重要的一个原因是开源软件有更多的人参与软件的重构工作,不断修正软件中不完美的设计或组件。
重构不是修复Bug,而是一个把“玩具”变为“可用产品”的优化过程,琢石成器!
重构也不是随便看到哪里不顺眼就立即去修改,它有一些必须遵循的基本规范,其中最重要的一个就是在不改变软件可观察行为的前提下改善其内部结构”。
这也意味着,使得在重构完成后,不会影响软件的正常使用,同时尽量减少重构之后的代码调试。
由于每次修改的幅度都很小,所以任何错误都很容易发现,你不必耗费大把时间调试。
遵循合适的重构规范,重构之后的软件,在用户眼中它与重构前的软件没有任何差异,但在代码内部,软件小麻雀却早已“飞上枝头变凤凰”,变得更加强健、简洁、易于维护等。
同时,重构也不是一个永无止境的过程,要懂得适可而止。在重构的过程中,要时刻谨重构的目的是为了解决软件结构中的问题,而不是为了编程完美的代码。
单凭对完美的追求无法写出实用的代码,而“实用”是软件压倒一切的要素。
附:
我不是个伟大的程序员,我只是个有着一些优秀习惯的好程序员。
—— Kent Beck

6.《人月神话: 弗雷德里克.布鲁克斯, 向进度落后的项目中增加人手,只会使进度落后。
关于作者

主持开发OS/360
如何处理大型项目中的管理问题?
我相信由于人员的分工,大型编程项目碰到的管理问题和小项目碰到的管理问题区别很大;我相信关键需要的是维持产品自身和概念完整性。
为什么我们时常陷入产品延期的僵局?
系统编程的进度安排背后的第一个错误的假设是:一切都将运作良好,每一项任务仅花费它所应该花费的时间。
这是一本被软件开发人员(特别是项目管理人员)推崇的神书,能够获得如此尊称的书并不多,除《人月神话》之外,《计算机编程艺术》也是其中之一。
我在多年前曾接触到这本书,当时我并没有任何团队开发经验,读这本书只是它的名声实在过于响亮。不幸的是第一次它给我的印象并不是很好,觉得百般无聊,如读天书,很快我就将它搁置在一旁。
直到高三那年我和3位好友创业失败,在创业过程中暴露出来的问题,以及自己在团队开发过程中学到的种种经验,才使得当我再次捧起这本书时,如若知己。
《人月神话》中的代表参与开发工作的人员数量,代表开发周期。在很多人眼中,人月是可以互换的,也即是安排更多的员参与开发那么开发工作只需要更短的就可以完成
但正如作者在书中所言:
我们围绕成本核算的估计技术,混淆了工作量和项目进展。人月是危险和带有欺骗性的神话,因为它暗示了人员数量和时间是可以相互替换的。

项目的时间依赖于顺序上的限制,人员的最大数量依赖于独立子任务的数量。
最终,我们得到了著名的布鲁克斯法则:
向进度落后的项目中增加人手,只会使进度落后。
这只是作者在实践中总结出的众多心得之一,除此之外,本书还涉及了其他软件开发与项目管理中出现的各种问题,如功能的取舍、手册编写、制定开发周期等。
如果你没有任何团队开发经验,我不建议你读这本书。
如果你已经参与团队开发,并且深陷项目管理的焦油坑,本书将带给你更多有价值的思考。
附:
手中有个锤子,看到什么都是钉子。

7.《黑客与画家》:Paul Graham, 编程是一种艺术创作,黑客就是艺术家。
关于作者

创业投资公司Y Combinator创始人
编程语言对我们的思维有何影响?
你选择什么语言,决定了你能说什么话。编程语言就是程序员的思维方式。
什么才能成为一个优秀的黑客?
优秀的黑客养成了一种质疑一切的习惯。
一直以来,程序员总是给人一种呆子的错觉。他们木讷、情商低下、不善言辞.......普通人很难理解这些呆子,因为在作者看来:
书呆子已经在思考的东西,正是真实世界看重的东西。
换而言之,他们不是,他们只是在专于他们着迷的问题。
这本书是一个程序员到艺术家的转变之路,使得程序员不再执着于技术,而是对商业、设计等都有更深的认识。
对于很多人盲目追求新语言、新技术,或者其他流行的东西,本书的观点是:
他们接受流行,不是因为想要与众不同,而是因为害怕与众不同。
对于那些被动跟着潮流而动,却又想要看到潮流方向的人,这本书狠狠得打了他们一个耳光:
如果自己就是潮水的一部分,怎么能看见潮流的方向呢?
附:
世界潮流,浩浩荡荡。顺之则昌,逆之者亡!

8.《大教堂与集市》, Eric S. Raymond,只要眼睛多,Bug容易捉。

关于作者
UNIX编程艺术》的作者
怎样才能写出好的软件作品?
好的软件作品,往往源自开发者的个人需要。
如何成为一个优秀的程序员?
优秀的程序员知道写什么,卓越的程序员知道改写和重用什么。
一直以来存在着两种开发模式:大教堂集市
第一中模式中,软件开发人员类似于大教堂中专门研究神学的神职人员,关在小黑屋里,每日每夜的和其他人一起精雕细琢。通俗的讲,这就是集中力量办大事。要想进入此道,需有一个神职人员特许证。
第二个模式中,软件开发人员就是集市中熙熙攘攘的商贩。你可以随意参与你感兴趣的开发工作,而他人的成果也对你开放,不会被供奉在神探供他人景仰。如果你觉得某个软件用起来不爽,或者有什么问题,没关系,自己修改一下,然后再将它奉献给集市。通俗的讲,这就是人多力量大。要想进入此道,需要一种拿来就用,不爽就改开源精神
这是一本可以引领你进入开源世界的书,你顽固不化且邪恶的灵魂若想得以解脱,需每日诚心诵读全文,并按照大神指引的精神之路,参与开源事业。若你违反开源协议,将开源作品采用虚假手段作为个人的荣誉或公司产品,并给其披上邪恶的伪装,你将被世代钉在开源世界的耻辱柱!遭受所有程序员的不屑!
附:
开源是第一生产力。

9.失控》,凯文·凯利 ,量变引起质变。


关于作者
maverick(游侠)

什么是量变引起质变?

大量个体和少量个体的行为存在重大差异。群聚的个体孕育出必要的复杂性,足以产生涌现的事物。随着成员数目的增加,两个或更多成员之间可能的相互作用呈指数级增长。当连接度高且成员数目大时,就产生了群体行为的动态特性——量变引起质变。
如何看待信息化所带来的民主?
在任何社会中,只要交流和信息连接的强度适中,民主就必然出现,在思想自由流动并产生新思想的地方,政治组织会最终走向民主这个必然的自组织的强大的吸引子。
刚进大学时,辅导员就强调一句话——量变引起质变。当然听着,感觉还有些哲理,但一直苦于不知道其出处。后来终于在这本书里看到了它。
本书作者是互联网教父般的凯文·凯利,简称KK。《失控》一书写作于1994年,其全称是《失控:机器、社会与经济的新生物学》。
这本书探讨了可能在当下也依然热门的很多问题,如蜂群思维控制论分布式计算蝴蝶效应人工智能混沌理论...... 很难想象,这样一本对未来饱有远见的书,却写于20多年前。而在20多年后,它仍被很多人推崇,其价值可见一斑。
近些年人工智能领域突发猛进,也引发越来越多的人,开始担忧人与机器的新生。对此,KK在书中是如何评论的:
在将生命的力量释放到我们所创造的机器中的同时,我们就丧失了对他们的控制。
而随着网络的快速发展,我们也有幸见证了微博反腐的变革,信息化所推动的民主革新,不可避免。对此,KK在书中又是这样论断:
唯有庞大的网状结构才能包容形态的真正多样性。这就是为什么网络差不多与民主和市场意义等同的原因。
而在社交网络,若你有幸是一个中心结点,那么你的价值也会随着与他人直接或间接的连接而提高。对此,KK在书中又是这样:
他们的联系越多,我的联系就变得越有价值。
这就是你要的思想著作,精神洗礼,灵魂深造!
附:
网络符号象征着心智的迷茫,生命的纠结,以及追求个性的群氓。


10.《哥德尔、艾舍尔、巴赫——集异璧之大成》:侯世达,quaerendo invenietis(觅之,自有所获)
关于作者

Douglas Richard Hofstadter,中文名为侯世达,本书获普立兹奖
什么是侯世达定律?
做事所花费的时间总是比你预期的要长,即使你的预期中考虑了侯世达定律。
怎样才能创造出灵活的智能?
智能的灵活性来自大量的不同规则和规则的层次。
哥德尔、艾舍尔、巴赫——集异璧之大成》,分为《集异壁GEB》与《异集壁EGB》 上下两篇。其英文原书名为《Godel, Escher, Bach--an Eternal Golden Braid》,其中braid一词有2种含义:
  1. 辫子,名词
  2. 编织,动词
标题中的braid具有双关的作用。
作为数学名词暗示了正题和副题之间有“GEB”和“EGB”这种词首字母在次序上的照应。
而对于中文标题中的“GEB”,分别对应着"GodelEscherBach",即是“哥德尔埃舍尔巴赫”。由此扩展下去,又代表着“哥德尔的哥德尔不完备定理、埃舍尔的、巴赫的音乐”。
好吧,之所以对一个书名都如此纠结,是因为这本书是一本跨度很大,且非常烧脑的书。
按照作者侯世达在”鸣谢“与“导言”中自述,本书在他的脑海中酝酿了几乎有二十年之久,起初他打算写一篇以哥德尔定理为核心的小册子,后来想法像球面一样扩展开来,不久就触及了巴赫和艾舍尔,并涉及数理逻辑,可计算理论,人工智能等诸多领域
最后提醒:本书的中文译本共计1053页,涉及音乐,绘画,宗教,哲学,人工智能,数理逻辑......
这就是你想要的那本奇书!
附:
侯世达定律指做复杂任务需要花费的时间总是很难预计的。程序员经常会引用这一定律,特别是在进行有关提高效率的讨论时(如《人月神话》和极限编程)。其自指的特征反映了即便意识到任务的复杂性,预计花费的时间仍是困难的。
11.《算法导论》:Thomas H. Cormen / Charles E. Leiserson / Ronald L. Rivest / Clifford Stein

关于作者
暂未找到作者详细资料
在处理器速度大幅提高和存储器容量显著增加,且价格趋于便宜的的今天,为什么还要学算法?
计算机可以做的很快,但还不能是无限快。存储器可以做到很便宜,但不会是免费。
关于此书,我不用做太多的介绍。一方面是其大名早已被人所熟知,另一方面是我压根就没看多少。
我初次看这本书完全没任何数据结构与算法的知识,而书中的的例子都是用伪代码表示,看起来着实吃力。所以对于没有任何数据结构与算法基础知识的人,我不推荐直接看这本书。
后来虽然学了数据机构的课程,但无奈老师虽把知识点背的滚瓜烂熟,我听的却也恍惚。把各种概念、知识点、公式一股脑的塞给我,却未有任何思路的讲解,最后的结果就是,我通过了期末考试,但老师所讲,我都已忘记。
因为看书并记住书中的东西只是记忆,并没有涉及推理,只有靠推理才能深入理解一个事物,看到别人看不到的地方。
我欠《算法导论》一个约会。

12.《数据之巅:大数据革命,历史、现实与未来》,涂子沛,把科技符号变成文化符号。
关于作者

科技作家,专治各种“差不多”。
少数服从多数一定是正确的么?
多数人的意见虽然代表了多数人的利益,但“多数”恰恰可能是平庸的多数,精英永远是少数,大众民主并不能保证人类社会向正确的方向发展。
追求完全准确的正确态度是什么?
在可能获得一个大概的情况下,满足于事物固有的精确度、停止追求完全准确,这是思维受过训练的标志。 ——亚里士多德
数据、信息、知识、智能,它们之间有何关系?
数据是对客观世界的记录,当我们赋予数据背景时,它就成为信息;信息是知识的来源,当把信息提炼出规律的时候,它就上升为知识;知识的智能的基础......
毫无疑问,这本书是大数据方面的权威著作。但正如你所看到的那样,它并不是一本讲授用各种方法、算法、软件来获取并分析大数据的工具书。
相反,这是一本尝试从美国历史发展来探讨数据/大数据对社会影响的书,全书没有繁乱的概念解释,有的只是一个个鲜活震撼的历史事件,关乎民主、科学,已经我们对待数据的应有态度。
或者,它又是一本关于大数据的科普小书。
随着互联网的发展,以及政府工作更多的采取信息技术,我们似乎都相信,我们的社会正朝着更民主、公正的方向发展。
而以中国文化中所流淌的“大概、可能、也许、好像、显著、明显”等不严禁的思想,民主道路似乎任重道远。
民主的质量依赖于大众的理性思考水平。
于此,本书所推崇的,其实是一种“数字”精神,即是依照“数据”治国,按照“数字”行事。
或许我们所或缺的,不是吃苦耐劳的优秀品德,而是追求严禁的科学精神。
附:
公民,无数的公民,才是推动一个社会不断进步的源源动力。
(我总是不由自主的想起熟悉的话:今年我国/省/市/县/校/......人民的XXX,在去年的基础上,明显/显著/极大/.......提高。)

13.《奇点临近》,Ray Kurzweil ,我们正在创造我们自己的继承者。
关于作者

人工智能、机器人、深度学习等领域的奇才
我们的大脑与思想有何关系?
我们的大脑创造了思想,思想又反过来创造了大脑。
为什么说人工智能一直“没有”进步?
一旦人工智能的目标实现,便不再认为它属于人工智能的领域,而只是一个一般的有用技术。

21世纪刚刚开始,这是人类历史上充满变革、最激动人心的时代。它是这样的一个时代:人类的本质意义将得到扩充何挑战。随着我们这个种族突破基因法则的掣肘,人类将达到前所未有的智能水平、高度的物质文明,并突破寿命的极限。
1997年,IBM的深蓝战胜国际棋王卡斯帕罗夫;2016年,Google的AlphaGo战胜世界围棋冠军李世石。
那些在历史进程中具有划时代意义的时刻,正是我们踏入新纪年的起点。
那些冰冷的机器,曾经只知道靠大量的重复性劳动来取胜,野蛮而愚笨,而今,它们却变得聪慧过人,并且,正在或者已经取代其创造者的地位。
这是一本探讨人工智能(AI)的书,但同《数据之巅:大数据革命,历史、现实与未来》一样,它不是一本讲授人工智能各种算法或底层技术的工具书,而是一本对人类社会发展有高明远见的预言书
纳米机器人进入体力消灭病变细胞,修复受损组织,机器成为我们身体的一部分;基因技术得到飞速发展,我透过那微小的分子链,望尽你的一生;你是通过机器获得新生的人类?还是附加于人类却开始觉醒的机器?
知识累积、加速回归定律、摩尔定律、大脑逆向工程、基因技术、纳米技术、机器智能......
这就是本书所探讨的内容:一个我们正在跨入的、崭新的新世界。
机器的新生,人类的永生。
附:
当你站在起点时,一切都是新的。
14.深入理解计算机系统》:Randal E.Bryant, David R.O'Hallaron ,从程序员的角度看计算机系统。
关于作者

任教于卡内基-梅隆大学。
什么是信息?
信息就是位+上下文。
计算机系统中抽象的重要性
抽象的使用时计算机科学中最为重要的概念之一。例如,为一组函数规定一个简单的应用程序接口(API)就是一个很好的编程习惯,程序员无需了解内部的工作便可以使用这些代码。
这本书是从比较底层的角度讲解计算机系统,涵盖程序、信息的表示和处理、处理器、存储器、链接、IO、网络、并发编程等。
相比国内某些讲解操作系统的书,本书最大的特点就是说人话,尽量用你听得懂的语言,教授你所忽略或不在意的知识。
书中的很多内容,集精炼简洁与通俗易懂为一体。例如,其中一个对抽象的理解上,就有这样一段描述:
文件是对I/O的抽象,虚拟存储器是对程序存储器的抽象,而进程是对正在运行的程序的抽象。
总而言之,这是我所看到的有关操作系统的书中,有足够的深度与广度,并读完能让我有“原来如此”“恍然大悟”的感觉。
附:
世界上有10种人,懂二进制的和不懂二进制的。
15.数学之美》:吴军,信息的作用在于消除不确定性。
关于作者

《浪潮之巅》作者
信息的作用是什么?
信息的作用在于消除不确定性。
数学的精妙之处是什么?
数学的精妙之处就在于简单的模型可以干大事。
这是一本关于数学知识的科普书,书中介绍了如下的数学知识:隐含马尔可夫模型布尔代数、图论、TF-IDF、有限状态机和动态规划、余弦定理、非对称加密算法、最大熵模型、布隆过滤器、马尔可夫链、贝叶斯网络、条件随机场模型、维特比算法、期望最大化算法、逻辑回归模型、分治算法。
作者吴军博士曾担任Google研究院资深研究员,具有工科背景。所以本书的特点是说人话 + 做实事。书中的数学知识大都可以和实际工作结合起来,并且与用计算机解决实际问题息息相关。
我印象中比较深刻的是利用余弦定理判断相似性,以及利用贝叶斯网络减少垃圾邮件。
同时,数学的简洁与强大也被应用到了软件开发中。如:
简单性和模块化是软件工程的基石;分布式和容错性是互联网的生命。

在工程上简单实用的方法最好。
当然,本书也讲解技术型知识的同时,也饱含人文的温情:
先帮助用户解决80﹪的问题,再慢慢解决剩下的20﹪问题。
如果你是一个足够优秀的开发者,一个伟大产品的缔造者,并不仅仅局限于一个技术型工作者。或许上面的文字,可以给你更多思考。
最后,本文最初将程序员分为工人艺人,也来自本书的延伸。
技术分为术和道两种,具体的做事方法是术,做事的原理和原则是道。
附:
许多失败并不是因为人不优秀,而是做事情的方法不对,一开始追求大而全的解决方案,之后长时间不能完成,最好不了了之。

16.《浪潮之巅》:吴军, Stay Hongry, Stay Foolish。
关于作者

《数学之美》作者
如何理解浪潮?
在工业史上,新技术代替旧的技术是不以人的意志力为转移的。人生最幸运之事,就是发现和顺应这个潮流。
对待创新的正确态度是什么?
创新必须依靠技术实力。
这本书讲述硅谷兴盛发展的简史。从IBM微软,从甲骨文Facebook,从苹果谷歌
谈及硅谷,我会很自然的想到两个地方:一个是中国中关村,另一个是印度班加罗尔
中国,若要发展某一产业,大多有政府主导,投入大量资金,在某地新建XXX产业园,集合顶尖人才,共创民族辉煌。
而与我们困境相似的印度,却采取的另一种不同的方式。我们所看到的是印度对教育,特别是对IT教育的巨大投入与重视。
世界上大多数成功的投资和新产业的出现并不是靠政府的扶植,而是商业发展的自然结果。
技术与行业的革新发展,其关键,不在硬件配置,而在软实力;一个国家最宝贵的东西不是土地资金,而是知识人才;集权式的管理并不能让行业迸发生机,自由才是它们进步的动力。
而今中关村班加罗尔,两者在国际上的地位,或许正是2种发展模式的真实写照。
再谈及硅谷,这个创新圣地,早在几十年前,就以借助于大学优质的人才与企业丰富的资源而快速发展。它的发展不是一蹴而就,但似乎却有规律可循:
开放校园的真正含义在于像斯坦福大学那样,让大学融入社会。
对年轻的学生最有益的校园环境就是那种最贴近今后真实生活的社会环境。
虽然市场是可以买来,但是收入却要靠真本事才能挣到。
梦想不是在象牙塔中铸造的, 开放亦不是“你家大门常打开”。
附:
硅谷过去是、今天是、明天还会是年轻人梦开始的地方。
17.《程序员的数学》:结城浩,简单的数学思维

关于作者
写程序,写书。
如何理解逻辑?
逻辑是消除歧义的工具。
如何理解完整性与排他性?
没有“遗漏”,即具备完整性。
没有“重复”,即具备排他性。
以我有限的阅读日本IT书籍的经验来看,日本IT书籍有一个显著的特点:通俗易懂又不乏深度。
无论是关于编写操作系统的《30天自制操作系统》,还是关于C语言的《征服C指针》,都是如此。
当然,让我印象最深的,还是这本书。
数学的发展是有一定规律可循的,而且很多都是为了解决社会发展中所遇到的问题。但我所接受的数学教育,一般确是下面这种模式:
  1. 老师讲授XX定理的概念。
  2. 学习XXX个公式,做习题,考试。
  3. XXX定理/公式不够好?没关系,我们再介绍一个XXX定理/公式。
  4. 转至第1步。
What I cannot create, I do not understand." -- Richard Feynman

国内所盛行的满堂灌式的教育,只给出了最后的结果,却未给出得到这个结果的过程,尽管他们也一直宣称“成功不重要,重要的是过程”。盲目给出结果而忽略过程,换一种说法就是科学精神所推崇的可重现被彻底忽略了,所以尽管我能做数学题,并用数学知识去解决问题,但是很多情况下我都是处于迷糊的状态,“知其然而不知其所以然”。
本书可以让你对数学有更为深刻的理解,“知其然且知其所以然”。如果你以前所接受的教育都是老师直接给你某个理论,那么这本书所做的,就是给你那个发现理论的思想/脑袋。
从基本的010进制之类的基础知识,再到对计算机中所采用2进制递归深入理解,以及我最喜欢的图灵机停机问题的证明......这是一场思想之旅。
(关于图灵机停机问题,可参阅刘未鹏大神的 康托尔、哥德尔、图灵——永恒的金色对角线(rev#2) 一文)
最后,爱上数学,《程序员的数学》和《数学之美》更配哦。
附:
认清模式,进行抽象化。

18.《松本行弘的程序世界》:松本行弘, 软件开发的最大敌人是复杂性。


关于作者

Ruby之父,《代码的未来》作者
如何看待编程的历史?
从某种角度说,编程的历史就因为想当然而失败的历史。
面向对象编程的三原则?
多态性,数据抽象和继承被称为面向对象编程的三原则。
按照豆瓣图书对此的介绍,作者从全局的角度,利用大量的程序示例及图表,深刻阐述了Ruby编程语言的设计理念,并以独特的视角考察了与编程相关的各种技术。
重点是后面的内容。
松本行弘其Ruby之父的身份,并未使得本书将重点放在对Ruby的讲解,尽管在很多地方不可避免的提及到了Ruby
不少有一定编程经验的人,特别是具有学习多种编程语言经历的人,只要所学编程语言不具有面向过程/面向对象/函数式编程/异步编程......等的跨度较大的区别,一般都很容易上手。
这也意味着,不同编程语言之中存在着很多相同的东西,只不过它们在不同的编程语言被千奇百怪的语法糖给裹着。
If it walks like a duck and quacks like a duck,it must be a duck(走起来来想鸭子,叫起来也像鸭子,那么它就是鸭子) 。
这就是著名的鸭子定理
在本书,你可以看到很多这样的鸭子。
迭代器就是循环的意思。
设计模式是个编程术语,它是指设计上经常反复使用的模式。
异步通信是将处理细分成多个处理来交替执行。
最后,本书相比《代码的未来》,所涉及的技术细节更多且范围更广,可以看作是对《代码的未来》一书的补充。

19.编程珠玑》:Jon Bentley,啊哈!算法!
关于作者

曾在卡内基-梅隆大学担任教授,计算机科学大家培养专业户
为什么要花费一定的时间在细节上?
仔细分析小问题有时可以带来巨大的实际好处。
解决问题所应遵循的普遍原则有哪些?
恰当的问题
时间和空间之间的权衡,二者不可偏废。
简单的设计。
没学走路之前想要跑,没弄懂问题之前却急着编码。
年轻人你的问题就是想得太多而书读得太少。----杨绛
珠玑维基百科中文页面对此无解释,百科百科则将其解释为有珠玉珠宝之意。
说得太文绉绉了,通俗的说就是蚌壳里的珍珠
在国内很多数据结构与算法书籍上,其基本的模式同我对《程序员的数学》中对数学的教授模式。而老师的具体教授模式可能是这样:
  1. 今天我们学习XXX数据结构,它的定义是什么啊,可以运用到哪些地方啊。
  2. 我们再学习与之与此有关的XXX算法,分析一下其执行流程,看看黑板上的伪代码或代码片段。
  3. 最后你们可以做做课后的习题,比如根据什么画出它的什么。XXX题和XXX题很重要,考试可能要考哦。
  4. 那个XXX,不要求掌握,考试也不考,有兴趣的同学自己看一下吧。
正确解决一个问题的前提是要有一个正确的问题。国内数据结构与算法书籍上有你做不完的习题。
个人觉得,程序员编写程序,是用于解决实际问题,而各种层出不同的问题也是推动IT技术不断进化发展的动力。作为支撑程序的位于低层的数据结构与算法,也应该是来源于实际问题。
但与数据结构与算法有关的很多书籍,却陷于概念定义做习题的怪圈,忽略了其解决问题的本质。
这就是特立独行的书,一本让你可以解决实际问题的书。它有实际的问题,以及解决问题的思考过程。
编程珠玑》,一本关于数据结构与算法的书,说人话做实事,却不止于此。
附:
程序员你的问题就是代码写得太多而对问题思考得太少。----某个人

20.《暗时间》:刘未鹏脱离语言思考,使用语言实现

关于作者
mindhacks 刘未鹏 | Mind Hacks博主。
什么是暗时间?
只有靠推理才能深入理解一个事物,看到别人看不到的地方,这部分推理的过程就是你的思维时间,也是人一生中占据一个显著比例的”暗时间”。
投入越多的时间,就越可能成功么?
“投入时间”这个说法本身就是荒唐的,实际投入的是时间和效率的乘积。
最初接触到刘未鹏大神,是源于我在搜寻有关图灵机的资料中,意外发现了有个图灵机停机问题的好文章——康托尔、哥德尔、图灵——永恒的金色对角线(rev#2)
所以本书的书名虽然是《暗时间》,但却并不是一本有关时间的什么书籍,而是一本有关思维逻辑心理学计算机算法.......的书。
我忘了告诉你,刘未鹏大神还是一个程序员。所以你在书中看到很多用程序员所容易理解的类比,也就不足为奇。
例如,在谈及为什么要专注于做某件事,而不是朝三暮四。作者的比喻就是:
如果一个系统不停地在多个任务之间来回倒腾,就会耗费大量的时间在上下文切换上,无形中浪费很多的时间。
当然本书着重的还是让读者认清思维的误区。而程序员在此的显著表现就是因长久熟悉某一语言/模式/工具,而不接纳新的东西,最终形成的思维定势。
设计模式是补丁,其出现往往意味着语言不够强大,其使用意味着大量的、与所要达到的编程目的无关的样板式代码。

不要觉得不用设计模式就不够好不够强大,以尽可能简单的方式完成任务才是王道。

避免思维被一门语言束缚的最好办法就是“学习其它语言”。
如果你是某某编程语言或某某模式之类的圣教徒,口头禅是“XXX是世界上最好的语言“,那么你需要接收本书的洗涤。
跳出思维观察思维,这就是这本书所能带给你的。
附:
不知道是不了解,没有是了解之后得出的结论。
别把不知道当成没有。
21.《疯狂的程序员》,绝影,学技术先学做人

关于作者
工作的时候,不因为赚多少钱快乐,而因为写程序员快乐。
这是一本自传性程序员小说,作者为绝影,最初在CSDN开博连载,后来写得多了,变集结为册,是为《疯狂的程序员》。
这本书按照作者刚入大学接触计算机,学习技术,参加工作,创业.......的顺序,讲述了一个计算机小白是如何成长为编程高手的故事。书中虽涉及部分技术性的知识,但未自成体系,其重点还是程序员的成长经历以及感情经历。
书中绝影为了能给女友和自己带来更好的生活环境,加班加点努力工作,而忽视了对女友的关爱。及至后来女友与之分手,绝影不由得询问自己:当初自己努力工作是为了自己所珍爱的东西,如今所珍爱的东西没了,我当初那么努力工作又是为了什么?
好吧,这本小说离你想要的提高技术之类差得很远。但是我想在此谈谈我推荐这本书的原因。
中国传统文化一直强调“”,一个人,若没有“”,能力越大,对这个社会的危害越大。不少人也都熟悉蜘蛛侠那句名言:
能力越大,责任越大。
而著名武侠小说作家金庸先生则强调:
侠之大者,为国为民。
在书中,绝影曾破解商业软件,编写外挂,后期创业失败后,写下了一本小说,就是这本《疯狂的程序员》。
不得不承认,这是一本优秀的小说,因为它激励我想要成为一个像绝影那样很牛逼的人,书中的情节让作为程序员的我感同深受。
于是读完此书后,我准备去作者的博客留言,以作纪念,但其博客已被关闭,无法打开。
后来从看雪论坛和其他站点得知,在现实中,《疯狂的程序员》一书的作者绝影,因涉及编写外挂程序而锒铛入狱。
附:
创造还是毁灭,这是一个问题。
22.《编程之道》,杰弗雷﹒詹姆斯 ,三日不编程,食肉无味。
关于作者
把最好的管理技术与最成功的高科技企业相结合。
什么是编程之道?
寂静的虚空里诞生了神秘的东西,这种东西恒久存在永不消失,它是所有程序的根源所在,我不知道怎么形容它,姑且称它为编程之道。
为什么要花费必要的时间在程序的设计上?
“程序被测试时再去改变它的设计已经太晚了。”
庄周梦中化蝶,醒来后却不知是我庄周梦中化蝶,还是蝶在梦中化我庄周
超级大师图灵曾梦见自己是一台机器,醒后他这样回忆:“我不知道是图灵梦见自己变成机器还是机器梦见自己变成图灵。”
这本书被归类于程序员的哲学书,如同《庄子》,包含智慧,并且有人评论此书大有借鉴《庄子》之意,书名也有一个极具东方色彩的“”。
关于层出不同的编程语言,编程大师如是说:
道生机器语言,机器语言生汇编器。
汇编器生编译器,最后产生上万种高级语言。
关于软件维护,编程大师如是说:
既使一个程序只有三行长,也总有一天需要去维护它。
最后一个饱含深意的故事是,有个人参加一个计算机展览,并告诉门卫:
“先警告你,我是偷盗高手,我入室偷盗的本领闻名遐迩。这次展览会也再劫难逃。”
但每次警卫对编程大师搜身时,却未能发现任何东西。于是在展览会的最后一天,警卫按捺不住他的好奇心:
告诉我,先生,您到底偷了什么?”
这个人笑了笑
“我在偷想法。”
附:
风不动则草不动, 没有软件,硬件只是一堆发热的电子器件
23.梦断代码》:Scott Rosenberg,你越懂软件,就越不会去做软件。

关于作者
暂未找到作者详细资料
对于自己的软件作品,应追求完美么?
数字时代的新时间机制下,一切皆有可能发生,而且速度惊人。这意味着你没时间做到尽善尽美——无须担心,因为别人也一样。
为何创造大型软件产品困难重重?
创造并使用真正有用的软件大型可复用组件,无关乎志向,亦无关乎技能。只因为难题源自软件的多样性,根深蒂固且难以解决。
《人月神话》一书中,作者将那些陷入开发僵局的大型软件项目,类比为身陷焦油坑的史前巨兽。听天由命,不挣扎,于是身体逐渐被埋没,寂静无声;垂死挣扎,却越陷越深,最终消亡;弃车保帅,如壁虎断尾一般,终于求得一丝生机。
想要成为那只陷入焦油坑却又奇迹般生还的史前巨兽,需要具备很多条件:要足够轻巧,至少不要过于庞大,转身的速度要足够快;要够明智,懂得舍弃某些东西换来整体的存在;要足够警惕,以至于不会陷得太深才发现自己需要转身。
这本书讲授的,就是《人月神话》所提及到的,史前巨兽在焦油坑中垂死挣扎的情景。你会变成一个冷漠的旁观者,看着那个叫做Chandler的软件项目,是如何一步步陷入僵局,并最终趋于消亡。
向落后的项目加派人手?将一切推倒重来一次?还是其他?
需求变更,设计不合理,结构混乱,莫名其妙的Bug,进度缓慢.......
附:

电脑死机,你可以按下Reset键重启。软件开发陷入僵局,你会不会又重头做起?
一切倒塌又得以重建,再造它们的人满心欢喜。 —— William Butler Yeats

24.世界因你而不同》:李开复,lead, don’ t follow(引领,不要跟随)

关于作者

创新工场创始人

学校教育对个人最大的影响是什么?

你从学校带走最有价值的不是这份论文,而是你分析和独立思考的能力、研究和发现真理的经验,还有科学家的胸怀。当你某一天不再研究这个领域的时候,你依然能在任何一个新的领域做到最好。
如何理解创新?
创新不仅仅可以是做出一项前无古人、后无来者的技术,也可以存在于一个更为广义的领域,商业模式的创新、产品的创新、技术的创新,甚至把别人做过的概念重新汇集起来,也是一种创新。
为了让斯卡利加入苹果,乔布斯问了前者那个著名的问题:
你是想卖一辈子糖水,还是跟着我一起改变世界?
为了让李开复加入苹果乔布斯(此处不确定,后续根据书的内容确定)同样问了前者那个著名的问题:
你是想一辈子写一堆像废纸一样的学术论文呢?还是要来真正地改变世界?
作为一个技术人员,李开复先生应该是从技术转为投资人的成功典型。
技术人员大都尊崇技术至上,有很多人看不起策划销售管理等。程序员们也乐观的相信,只要技术够厉害,改变世界的日子指日可待!
事实真的是如此么?
再次谈到本文开头的那个问题:
为什么中国的程序员总是在不断学习新的开发工具、钻研程序代码,而不逐步提升自己的视野、思维和经验?
这里所提及的视野思维经验,我觉得在小的方面,它们已经被包含在产品的整个阶段。从设计开发,从管理推广,等等等等
在本书里,我们可以发现技术人员本身以及坚持技术至上这种思想的不足:
我们犯了一个工程师最容易犯的错误,为了自己的技术而牺牲了用户真正的需要。
产品的成功.不光取决于技术,而且取决于市场,尤其是渠道建立得是否正确。
作为技术出身的管理人员,既有好处也有弊端。好处是技术人员可以看出一个产品的发展趋势,预测它的未来。而弊端就是,技术人员喜欢追求真理,而忽视整体运营,注重智商,而忽略管理中需要的情商。而作为一个管理人员,情商比智商要重要得多。
另外关于技术人员深度广度的争论,本书对为什么读博士问题的思考,可以给我们更多感悟:
读博士,就是挑选一个狭窄并重要的领域作研究,毕业的时候交出一篇世界一流的毕业论文,成为这个领域里世界首屈一指的专家。任何人提到这个领域的时候,都会想起你的名字。
最后,本书是李开复先生的自传,关乎技术,关于事业,更关乎成长。
附:
我们做的是软件,必须停止用硬件的思维模式来思考。
25.《你的灯亮着吗?》:高斯 (Donald C. Gause) / 温伯格 (Gerald M.Weinberg) ,发现问题的真正所在。
关于作者

数学王子;1979年度诺贝尔物理学奖获得者。
如何理解问题?
问题就是理想状态和现实状态之间的差别。

为什么大多数人对问题选择视而不见?

“忽略问题”是一种古老但有效的方法。这种方法其实是让我们降低敏感度,当敏感度降低到一定程度时,我们就再也感受不到事务现在的状态和理想中的状态有什么区别了。
代码中存在Bug,或者存在着可以优化的地方,但你有各种原因和理由,选择对此视而不见。
这样的情景不断重复,可能是你自己,也可能是团队中的其他成员。最终这些问题不断积累,量变引起质变,千里河堤毁于蚁穴。终于,项目崩塌。
我们的大脑之中存在着思维定势:学编程一定要数学好、英语好,XXX的时候一定要用YYY设计模式......
我们急于用以前习惯化形成的思维定势,还没发现真正的问题所在,却想当然的去解决它。
有关思维的书,我介绍了《暗时间》。有关发现问题和解决问题的书,我介绍这本《你的灯亮着吗?》。
本书以实际问题出发,逐步的让你发现问题、分析问题、解决问题
如果牵强的类比与软件开发,就是发现需求分析需求解决需求
附:
习惯化——当一种刺激重复出现时,人类对它的反应逐渐递减。习惯化使人们能忽略坏环境中恒定不变的东西,从而简化自己的生活。当人们生活的小环境中刚出现什么新事物时,刺激性是非常强的。如果它停留一小段时间,既不制造危险也不创造机遇,就好变成“环境”或者背景的一部分,最终被完全删除出去。

26.暂未阅读但多人推荐的书籍(欢迎补充)

a.《计算机程序设计艺术》

b.《代码大全》


————————————————————————————

其他说明

1.关于本文

本专栏的名称是“杜小豆的编程小道”,不是“XXX编程高手的编程大道”。

本文的标题是“私以为可以提高程序员技术档次的书和博客”,不是“提高程序员技术档次必读的书和博客”,亦不是“XXX编程高手给菜鸟推荐的N大经典书和博客”。标题中的“”代表”杜小豆同学“,所以对本文的正确对待态度是:“杜小豆同学以为可以提高程序员技术档次的书和博客”。

另外,本文源自我关于问题“有哪些可以提高程序员技术档次的书或博客?”所做的回答。这类开放性问题相比“1+1=?”这种问题,其最大的特点就是没有唯一的答案,允许不同观点存在,并鼓励思想交流。本文就是在这样一种思想下诞生的。

最后,微信公众号图灵教育在2016年09月01日对本文的转载已获得授权,某小编将其以“读书中的心得和体会”看待,这也是我希望读者对本文所应秉持的态度。

2.关于书籍列表

既然本文是“杜小豆同学以为可以提高程序员技术档次的书和博客”,所以你赞赏的某本书没有出现在书籍列表中,或者你认为某本书不应该出现在书籍列表中,都不会对已有的书籍列表造成影响。我不会因为照顾到每一个读者的感受而修改书籍列表,有任何不同观点,欢迎在问题下提供不同答案。

3.关于评论

评论区秉持开放,自由,平等的原则,未贬低或删除任何评论。鼓励对书籍列表中的书籍提出不同观点或其他有价值的见解。

对于主观性较强的评论,无论是“提高编程技术需要看合适的书籍”,还是“读这些书没有卵用”,亦或是“提高编程技术只能看源代码”.......等,不做任何评论。

同时,建议在评论中适当加入修饰语,如“我认为”,“就我个人而言”,“我觉得”......等。

对于无明显说服力的评论,无论是“读书没什么用”,还是“埋着头编程没什么用”等,我自动忽略。

同时,建议给出能增强你观点说服力的具体参考数据,或是请在进行对比试验后,再进行探讨。

对于无显著价值的评论,如“Mark”,“不错”,“还好”,“垃圾”等,原谅我不能一一回复。

另外,涉及到辱骂他人或是进行人身攻击的评论,会被我删除,同时我会对此公开说明。

4.授权转载

  1. 图灵教育,2016年09月01日
  2. CocoaChina,2016年09月02日

5.其他

自由是每个人都有选择的权利,请自由的表达你的观点/看法/心得等。

生命,宇宙,以及一切的答案。

让我们的思想自由恋爱吧!


————————————————————————————

本文源自我的一个回答有哪些可以提高程序员技术档次的书或博客? - 杜小豆的回答

(2016年09月07日,停止更新)
编辑于 2016-09-07

文章被以下专栏收录

    这个国家的每个人都应该学习如何编程,因为它教你如何思考。 ——史蒂夫 乔布斯 杜小豆的编程小道,分享个人编程见解、经验。 The answer to life, the universe, and everything。 生命,宇宙,以及一切的答案。 让我们的思想自由恋爱吧!