<译> 推荐给编程菜鸟的书籍
有一些刚刚开始编程的人会问我,如何可以从写代码转变成写漂亮的代码。为了满足这个需求,我有一些相关的书籍推荐。这些书对于一些刚开始编程的菜鸟来说是非常赞的,但对于我这种已经经历几年编程生涯的老鸟来说,它们同样也能带给我很多。它们中的大部分都是采用不同语言讲解的,比如 C、Ruby 或者 Java,所以读这些书可能是个不小的挑战。但多数情况,这些概念都是被清晰地转换成对应的编程语言的,而且在早期就培养多种编程语言的技能也不是一件坏事。
Practical Object-Oriented Design in Ruby
by Sandi Metz
长时间关注我的读者都了解我对 Sandi Metz 的喜爱。我认为她做了一些很棒的事情 - 把简单的概念解释给聪明的人,这本书也不例外。
以一个修车的例子,她就把面向对象这个概念简单地解释了出来。慢慢地从只有一个方法的对象,搭建为一个 Fowler 在 Refactoring(这本书我在稍候会介绍)中讲述的以多态取代条件表达式模式的完整实现。这本书中的概念不是一次讲完而让读者高潮,它们是被慢慢地,耐心地完美地解释了出来。
Design Patterns
by Gamma, Helm, Johnson, and Vlissides
这四位作者被大家称为「四人帮」,这本书是在 1994 年出版的。它是第一本介绍一些经常使用到的设计模式的书,这本书介绍了它们应该在什么时候、什么场合使用,而且还贴出了该如何使用的例子。其实我推荐的几本书都是这种类型的,虽然它们看起来很像教科书,但是你也值得像阅读普通书一样阅读它们。当到了使用其中一个设计模式的时候,你就知道应该跳到哪一章来获取你需要的技术细节了。
这本书是在桌面应用时代被创作出来的,其中的一些设计模式也是针对那个时代的。比如命令模式,对于可以执行撤销的菜单命令是很有用的。但是这些动作场景在 iOS 和 Web 中是很难见到的,所以这些设计模式可能有点过时了。但是看这些设计模式解决问题的过程,可以帮助你对你的问题,提出有创造力的解法。
Patterns of Enterprise Application Architecture
by Martin Fowler
如果上一本书是被写在桌面图形应用的时代,那么这本书就是在 Web 服务的年代诞生的。它的标题虽然看起来很枯燥,但我认为它是一个包含各种非常有用的模式的集合。它读起来就像在实现一个类似于 Ruby on Rails 框架的 cookbook,所以如果 DHH 在写 Ruby on Rails 框架之前读过这本书,那我也不会感到惊讶。
这些模式,已经被用于 Web 中的处理表单、HTML、还有数据库。前两类很有趣,数据库模式可以在写现代 iOS 应用的地方用到。如果你想了解一下类似于 Core Data(或者 ActiveRecord)的 ORM 是如何实现的,你就可以看看这本书了。比如,Core Data 使用了标识映射、延迟加载、元数据映射和查询对象等模式。像「四人帮」写的那本书一样,我们不需要在每天写代码的时候都把它们用一遍,但是看作者解决问题的过程,是很令人兴奋的。
Refactoring
by Martin Fowler
这本书也是由 Martin Fowler 编写的。它给重构下了一个准确的定义:
有人问我,“难道重构只是清理代码?”,在某种程度上,答案是肯定的,但我觉得重构更进了一步,因为它为清理代码提供了一个更加高效和更为可控的方式。
这本书还介绍了,重构是如何融入通常的软件开发过程中的:
当使用重构来开发软件的时候,需要把时间分为两个部分:添加功能和重构。当你添加的新功能的时候,不应该改变现有的代码;你只是添加新的功能。
在介绍完开头的引言和相关定义之后,Fowler 深入了几个重构的例子。他从抽取方法这种简单的开始,然后逐渐深入到类似引入空对象的重构方式。像之前的两本书一样,这本书从头读到尾也需要花些功夫。
Domain-Driven Design
by Eric Evans
其它的书籍大多都是介绍一系列模式的,而这本书有一条小小的叙事线。一个开发者和一个领域的专家,搭建了一个管理船行程的应用。在这个过程中,从最初的研究阶段到实际的编码过程,你将学到如何把一个领域模型化。我从这本书了解到 value types 比 Swift 发布它的 value types 早了两年。
作者在程序员和领域专家之间编造的苏格拉底式对话对于我们也是很有帮助的。有人认为,在一个理想的世界中,一个产品经理可以在开发者和利益相关者之间传话。而在真实的世界中,你(作为开发者)最终对于表达软件的能力和局限也负有责任,这本书展示了这些对话而且应该是什么样子的。
如何思考 vs 思考什么
这五本书中的每一本都是有价值的 - 并不只是为了教你内容,同时也为了教你如何看待你所面对的问题。它们都遵循一个一般的结构:出现问题,给你解决方案。把问题和解决方案连接起来,有助于你看到问题是以一个什么样的过程被解决的,最终有助于你把这个解决过程应用到其它问题上。