最近在网上看了一个很是好的帖子《程序员一辈子必读的书》, 这张图是由ThoughtWorks(全球软件设计与定制领域的领袖级企业)的资深人士提供的,它将程序员要读的书分为四个类别,每一个类别又分为初级、进阶和高级读物,并用黄色三角形点出了强烈推荐阅读的书籍。四个类别包括:java
相信这张图会帮助到不少迷茫的职业人,由于好书就像明灯同样会照亮咱们的方向,那些大师级的人物将他们的经验分享给咱们,真的有如浴春风的感受。有时候会很感慨国外有那么多厉害的技术做家写了那么多好的做品,而国产技术书籍中的好书真算得上是百里挑一。有时候也会问本身,能不能作一个技术做家呢,我想个人修炼还远远不够。
虽然不可以本身写一本好书,可是仍是很愿意把本身的读书心得跟你们一块儿分享,雷达图上的书我读过的约有1/3,下面就把读这1/3的心得跟你们分享。程序员
若是一我的没有据说过《重构》这本书,那么他必定不敢说本身是程序员;若是一我的没有阅读过《重构》这本书,那么很难想象他会是一名优秀的程序员。这本书是不少公司要求Java程序员必读的三本书之一(另外两本书是《Java编程思想》和《Effective Java》),其实无关编程语言,是程序员就可以从这本书中受益。
这本书我我的最喜欢的第三章 - “代码的坏味道”,由于我喜欢在写完代码后去思考个人代码中有没有这些坏味道,而后再去想想应该如何重构代码。这本书的做者是世界级的软件开发大师Martin Fowler,他也被誉为软件开发“教父”,同时他仍是敏捷开发的创始人之一。Martin Fowler编写了不少极好的书籍,包括《企业应用架构模式》、《领域特定语言》、《NoSQL精粹》、《分析模式:可重用对象模型》等。Martin Fowler给出的代码的坏味道包括:
-Duplicated Code(重复代码):“代码有不少中坏味道,重复是最坏的一种”,这句话我常常讲给本身的学生听,可是他们真正领悟并践行这句话的人却很少。一个类中的两个方法有重复代码,那么必定能够经过抽取方法的方式将重复代码放到另外一个方法中以供调用;两个互为兄弟的子类中若是有重复代码能够将其重复代码抽取到父类中;两个没有关系的类中若是有重复代码,那么能够从新抽取一个类将重复代码放到这个第三方类中。
-Long Method(长的方法):程序越长理解起来就越困难,这已是常识了,使用短小的方法首先符合高内聚的要求,同时也能够给经过给方法起一个好的名字来帮助理解方法的做用。若是感受到方法的某个地方须要注释来讲明什么,那么能够把这些东西放入一个独立的方法中,并以用途(注意不是实现手法)来命名方法。
-Large Class(巨大的类):若是但愿写一个类来作不少的事情,那么最终势必致使重复和混乱的代码。类的设计应当遵循单一职责原则(SRP)。重构一个巨大的类可使用抽取接口的方式来搞清楚这个类应该如何分解。
-Long Parameter List(长参数列表):这个对于作过Windows编程或者用过MFC(Microsoft Foundation Class)的程序员来讲再熟悉不过了,Windows函数和MFC中的方法那些长得变态的参数列表对程序员来讲都是恶梦。重构的方式不少,比较常见的是将相关的参数组织成一个对象来替换掉这些参数。
-Divergent Change(分散的可变性)和Shotgun Surgery(散弹式手术):这两种坏味道前者讲的是新功能难以加入,后者说的是某种变化会引起多个细节的修改。简单的说若是程序中的可变因素散落在代码的各个角落中,那么代码的维护将是一场恶梦。重构的方法是找到特定缘由形成的全部变化,而后将它们抽取到另外一个类中。设计模式中的桥梁模式就是为了解决这一问题而提供的解决方案。
-Feature Envy:这个真没想到如何翻译会比较容易理解,简答的说就是一个方法从另外一个类的对象那里获取许多的值,重构的方案是将该方法移到另外一个类中。
-Data Clumps(数据群集):情况相似于长参数列表。
-Primitive Obsession(基本类型偏执)
-Switch Statements(重复的switch语句):面向对象程序的一个明显特征就是用多态替换掉switch结构,由于这种switch结构会在多个地方重复。
-Parallel Inheritance Hierarchies(平行继承结构):状况跟Shortgun Surgery差很少,可使用桥梁模式进行重构。
-Lazy Class(冗余类):若是一个类不值得存在,那么它就应该消失。
-Speculative Generality(投机通用性):重构方式是若是你的抽象类、委托、方法的参数没有实际的做用,那么就应当被移除掉。
-Temporary Field(临时字段)
-Message Chains(消息链):我我的并无感受到这个有多么坏。
-Middle Man(中间人):若是一个类的不少功能都经过委托给其余类来完成,那么就不如去掉这些中间人直接和真正负责的对象打交道。
-Inappropriate Intimacy(过于亲密)
-Alternative Classes with Different Interfaces(殊途同归)
-Incomplete Library Class(不完整类库)
-Data Class(数据类):类的退化结构。咱们在分层开发中常用的失血模型(事务脚本模式)中的业务实体不就是数据类吗,这明显与面向对象的思想是背道而驰的。
-Refused Bequest(拒绝遗产):若是子类复用了父类的行为,又不肯意支持父类的接口,能够考虑用合成关系聚合关系取代继承关系来消除这种坏味道
-Comments(注释劣质代码):注释不是用来补救劣质代码的,事实上若是咱们去除了代码中的全部坏味道,当劣质代码都被移除的时候,注释已经变得多余,由于代码已经讲清楚了一切。
若是你但愿完全根除这些坏味道,这本书的第六章到第十二章提供了完整的操做手册,赶忙读这本书吧!web
其实我应该先介绍下面那本书,喜欢下面那本书的缘由是书中有不少很是精炼可是有用的Tip,这些Tip能够说是大师级的经验总结;而我我的喜欢这本书多是由于非技术方面的缘由(我喜欢这本书中的插图)。这本书的第一章的第一句话是这样说的:读这本书一般有两个缘由:1. 你是一名程序员。2. 你想成为更好的程序员。咱们须要更好的程序员。
这本书的每一章均可以总结出一句话或是一张图,就是下面这些:
面试
本书的第一章是关于什么是整洁代码的讨论,引用了Bjarne Stroustrup(C++之父)、Grady Booch(UML的创始人之一)等人固然也Bob大叔(本书的做者Robert Martin)本身对整洁代码的理解。顺便说一下,上面那张图上的代码应该是保龄球计分程序(你必须佩服个人眼力)。算法
无论是现实世界仍是软件项目中,命名都是一件让人头疼的事情,给小孩起过名字的就知道,你但愿把你对孩子的指望包含在这个名字中,你又但愿这个名字读起来要好听,至少不至于未来成为别人的笑柄(好比庞光大、魏升京这样的名字),可能你还要考虑族谱的排辈等等。软件项目中的命名状况会更加复杂,简单的说命名的原则是“见名知意”,固然你还须要用各类方式防范命名冲突的问题,不一样的编程语言也有本身不成文的像契约同样的命名规则和方式(例如匈牙利命名法),这些可能都是须要考虑的事情。
第三章讲的是函数,说了这么一句话:Function should do one thing. They should do it well. They should do it only. (函数只应该作一件事情,把一件事情作好,并且只由它来作这一件事情),听起来很简单的一句话可是要践行这条原则却并不容易,因此咱们的代码中才会有不少的坏味道(上一本书中提到的东西)。事实上,上升一个层次,咱们在设计类的时候也应该如此,这是面向对象设计原则中说的单一职责原则(SRP),当咱们的代码中出现了冗长的方法或者巨大的类的时候,咱们就应该依据职责来对其进行拆分,这样程序的结构才会趋于合理,最终达到“高内聚”的目标。固然,这一章里面还提到不少理念,包括:Command Query Separation(一个方法要么执行某种命令,要么返回查询数据)、DRY(不要重复本身)、Prefer Exceptions to Returning Error Codes(异常优于返回错误码)等。
第四章讲的是注释,有一句话我很喜欢,说的是:Comments Do Not Make Up for Bad Code (注释不是对劣质代码的补救)。事实上好的代码即使没有注释也拥有良好的可读性,但恰当的注释会让代码变得更可读、可维护性更高。
第五章讲的是代码风格。现代IDE(集成开发环境)几乎都有代码格式化代码的功能,你只须要设置好你使用的代码风格就能够了,其实不仅是IDE,不少高级的文本编辑工具也可以按照指定的风格格式化你的代码。用什么样的代码风格不是关键,关键是整个项目组的成员应当使用相同的代码风格,让多我的编写的代码看起来像一我的书写的。我我的特别钟爱1TBS(One True Bracing Style,也叫作K&R风格,这种风格是Kernighan和Ritchie两位老师在The C Programming Language一书中使用的代码风格),固然Allman风格(FreeBSD系统的做者之一使用的代码风格)也是很好的选择。
第六章讨论的是对象和数据结构,读完以后的感受是虽然咱们每天都嚷着吼着要面向对象编程,可是不少时候咱们都使用了类的退化结构,包括咱们开发时常用的失血模型和贫血模型(事务脚本模式)都和面向对象的设计理念相违背。我得认可在读这一章的时候我没有太抓住做者的观点,也欢迎你们来帮助我理解这章的内容。
第七章对错误处理(异常)的讲解仍然是很是精彩的,整洁的代码中对错误的处理应当是被分离的关注点(不要跟正常的业务逻辑混杂在一块儿),而面向对象中的异常机制就是一种在不打乱原有业务逻辑的前提下处理掉程序在运行时发生的不正常情况的手段。这章有两个观点我特别欣赏,一是Use Unchecked Exceptions(非受检异常容许你在适当的地方处理异常,而适当的地方就是异常影响代码执行逻辑的地方,无论作哪一种类型的应用,都应该尽量向用户隐藏异常的发生,除非发生了不可挽救的情况,这才是符合最小惊讶原则的设计);二是Don’t Return Null(若是一个方法在出情况的时候返回null,那么调用者都要经过频繁的检查返回值来断定是否出错,一旦忘了这件事情就有可能出错,既然null是一种异常情况,那么用抛出异常的方式来代替null明显是更好的作法)。
第八章的内容对实际开发有重要的指导意义,由于咱们的项目中不可避免的要使用第三方工具,所以咱们须要将这些东西整洁的归入到咱们的系统中,这时就须要考虑系统边界的问题。有的时候咱们会千辛万苦的发现系统中的一些bug是来源于第三方工具的,固然咱们基本上没有时间去重头学习和研究第三方工具或者本身写代码来实现第三方工具的功能,可是咱们至少应该先对第三方工具进行测试。我在之前的项目中,即便用Apache提供的那些著名的第三方工具,个人作法也是先写测试代码对这些工具的可用性和有效性进行证明,固然有的时候多是过于谨慎了,但这种习惯和作法自己是好的行为。在这种场景下,适配器模式是很是好的设计,它不只能将不兼容的接口改写成兼容的接口,还可以对经过对第三方工具从新封装来避免边界的变化对系统的影响。
第九章的内容是单元测试。Bob大叔是TDD(测试驱动开发)的倡导者,这一章讲的是如何编写整洁的测试,Bob大叔的答案是FIRST规则(Fast、Independent、Repeatable、Self-Validating、Timely)。
第十章介绍类的设计,最重要的仍是SRP。
第十一章是关于系统设计的内容,开篇引用了微软首席技术官Ray Ozzie的一句话:Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test. (复杂要人命,它消磨开发者的生命,让产品难于规划、构建和测试)。这章对于但愿了解面向切面编程的开发者是极好的,包括了对依赖注入、代理模式以及AOP的探讨。
第十二章探讨了系统的迭代式演进。spring
第十三章对并发编程的讨论很是常常,不少开发者都畏惧并发编程,也有的开发者迷信多线程能够解决全部的并发问题,若是你是这两类人之一,本章会教给你真正的并发编程。编程
第十四章是一个精彩的案例用来说解对代码的持续改进,你能够本身好好阅读一次。
第十五章到第十七章说的都是重构,至关精彩。你在《重构》中了解过的代码的坏味道及其改进方案这里几乎都能见到它是如何应用的。
总之,这本书从引言到附录都无比精彩,赶忙去阅读吧。
这本书最初出中文译本的时候,它的名字叫《务实的程序员》,而这本书也正像它书名的副标题那样,是一本带领程序员从小工成为行业专家的著做。这本书里有70个Tip(指点、提示),这些Tip都是短小精炼的句子,但都是大师们编程经验的总结和沉淀。所以无论何时看这本书,也无论你翻到第几页,总会发现这样的Tip,而它们也会让你有醍醐灌顶的感受。下面分享了这本书部分的Tip:设计模式
- Tip8: Invest Regularly in Your Knowledge Portfolio (按期为你的知识资产投资)
- Tip9: Critically Analyze What You Read and Hear (批判的分析你读到的和听到的)
- Tip10: It’s Both What You Say and the Way You Say It (你说什么和你怎样说一样重要)
- Tip11: DRY - Don’t Repeat Yourself (不要重复本身)
- Tip13: Eliminate Effects Between Unrelated Things (消除无关事物之间的影响)
- Tip18: Estimate to Avoid Surprises (经过估计来避免意外发生)
- Tip20: Keep Knowledge in Plain Text (用纯文本保存知识)
- Tip23: Always Use Source Code Control (老是使用源码控制)
- Tip27: Don’t Assume It - Prove It (不要假定要证实)
- Tip29: Write Code That Writes Code (用代码生成代码)
- Tip31: Design with Contracts (按照契约设计)
- Tip33: If It Can’t Happen, Use Assertion to Ensure That It Won’t (用断言确保不能发生的不发生)
- Tip38: Put Abstraction in Code, Details in Metadata (将抽象置于代码,细节置于元数据)
- Tip39: Analyze Workflow to Improve Concurrency (分析工做流以改善并发性)
- Tip42: Separate Views from Models (让视图和模型分离)
- Tip63: Coding Ain’t Done ‘Til All the Tests Run (测试不经过编码不中止)
- Tip69: Gently Exceed Your User’s Expectations (超出用户指望一点点就好)
除此以外,该书中有不少名人名言以及不少经验的分享,例如:“不要让调试改变了被调试系统的行为”、“异常尽可能不被做为程序正常流程的一部分来使用”、“要善始善终,分配资源的程序也应当释放它”、“最大的弱点是惧怕暴露弱点”等等。 固然,这本书也包括了对契约式编程、解耦合、重构、算法效率、测试等内容的探讨。
老实说,整本书的内容都很棒,附录也不例外,附录A中列出了一些做者推荐阅读的计算机书籍,这些书籍正好也出如今了咱们给的这个必读书籍的列表中,真的是英雄所见略同(就算我臭美了一次哈)api
这本书是给予我无数次帮助的书籍,我会慢慢的把我读这本书的心得记录在这里。每次当我遇到问题不知所措的时候,这本书老是能给我答案;在我参加的全部面试中,只要有答不上来的问题,想一想这本书中的一些只言片语就能在电光火石间发现答案。数组
C语言之父Dennis Ritchie以及Brian Kernighan两位老师合著的神同样的书籍。我到如今都没有想明白为何国内只有极少数的几所大学用这本书做为教材,难道C语言的入门书中还有出其右者吗?这本书的内容无比精彩,无论是对于初学者仍是有经验的程序员;这本书中的代码无与伦比,几乎每一段代码都是经典。即便你尚未读过本书,可是你必定据说过一个叫Hello, world的程序,该程序就出如今这本书中。
这本书是号称软件工程领域的第一奇书,与《人件》合称为软件工程著做中的倚天剑和屠龙刀。Brooks博士为人们管理复杂项目提供了最具洞察力的看法。既有不少发人深省的观点,又有大量软件工程的实践,其内容都是来自Brooks博士在IBM公司System/360家族和OS/360中的项目管理经验。这本书是项目经理和系统分析师必读的不朽之做,也是流行了30多年的传奇经典。
该书是我最近几乎天天都翻翻的一本书,准确的说这本书是硅谷创业之父Paul Graham的文集,主要介绍优秀程序员(书中称之为黑客,固然这和咱们尤为是国内对黑客的理解有所差异)的爱好和动机,讨论它们如何成长以及如何为世界作出贡献,固然也包括了对编程语言和优秀程序员工做方法等的探讨和思考。该书的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解咱们这个时代,迫使读者独立思考。该书的中文版是阮一峰博士翻译的,翻译的水准和书中的旁注都至关好。
除此以外,由于本身作了很长时间的Java程序员,有一些Java方面的好书能够推荐给你们
其实国产的Java书籍里面也有部分优秀的书籍,虽然国产书的质量整体偏低,可是最近几年仍是有不少有责任感的技术做家(他们不少人同时也是一线程序员或架构师)写了很多好书。
若是你之前不是计算机相关专业又想转型从事软件行业,那么我推荐先看一些专业气质养成类书籍,固然最入的书就是《计算机导论》、《计算机文化》之类的书,也能够看看《计算机科学概论》或者是《计算机专业英语》,建议看原版的,一方面对整个行业有一个全面的了解,另外一方面锻炼一下本身的英语水平。不管如何,我以为程序员仍是应该让英语成为本身的工做语言。
若是你但愿从零基础开始作一个Java程序员,那么我建议的这些书的阅读顺序是这样的(每项读一本就OK了):
说明:读书心得我只能一点点与你们分享和交流了
- Computer Concepts / Computer Science Illuminated
- The C Programming Language
- Core Java (Vol. 1 & Vol. 2) / Introduction to Java Programming
- MySQL Crash Course / 深刻浅出MySQL / Sams Teach Yourself SQL in 10 Minutes
- Thinking in Java / Effective Java / 编写高质量代码:改善Java程序的151个建议
- Servlet & JSP: A Tutorial / Head First Servlets & JSP
- Java与模式 / Design Patterns Explained / 设计模式之禅
- 精通Hibernate / Java Persistence with Hibernate
- Spring in Action / Spring企业应用开发实战 / Spring技术内幕
- Clean Code / Refactoring Impoving the Design of Existing Code
- The Well-Grounded Java Developer
- Algorithms / Data Structures and Algorithm Analysis in Java
- POJOs in Action / Core J2EE Patterns: Best Practices and Design Strategies
- Java Performance
- Software Engineering A Practitioner’s Approach