【前言】
掌握软件开发需要学习一组完全不同的概念。无论你是一名初级的软件开发人员,还是更有经验的开发高手,这看起来都是一个不可逾越的障碍。你是否应该花时间去学习面向对象世界中既有的主题,比如SOLID原则、设计模式或测试驱动开发?你是否应该去尝试一些越来越流行的东西,比如函数式编程?
即使你已经选择了一些主题来学习,通常也很难确定它们是如何结合在一起的。什么时候应该在项目中应用函数式编程思想?什么时候担心测试问题?如何知道在什么时候引入或改进这些技术?是否需要读一本关于这些主题的书,然后再读一些博客文章或看视频来弄清楚如何把这些主题结合在一起?该从哪里开始呢?
不用担心,本书就是来帮助你的。它将通过一个综合的、项目驱动的方式来帮助你学习。你将学习成为一名高效的开发人员所需了解的核心主题。不仅如此,我们还展示了如何将这些东西组合起来,以应用于更大的项目。
【为什么写作本书】
多年来,我们在教授开发人员编写代码方面积累了丰富的经验,我们都写过关于Java 8的书籍,并围绕专业软件开发运营了一些培训课程。在这个过程中,我们被认证为了Java Champion并成为多个国际会议的演讲者。
这些年我们发现许多开发人员都可以从几个核心主题的介绍或复习中受益。通过实践,通常可以很好地覆盖到设计模式、函数式编程、SOLID原则以及测试,但是很少看到它们如何良好地工作以及相互配合。人们有时甚至会因为对学习内容的选择性麻木而放弃提高自己的技能。我们不仅想教授人们核心技能,而且还要以一种容易接近和有趣的方式来做这件事。
【面向开发者的方式】
本书也给了你一个以面向开发者的角度去学习的机会。书中包含大量的代码示例,每当我们引入一个主题时,都会提供具体的代码示例。你可以获得书中项目的所有代码,因此,如果你想继续学习,甚至可以在集成开发环境(IDE)中单步调试书中的代码,或者运行程序来尝试它们。
涉及技术的书籍通常是以正式的、讲义式的方式编写的,那不是正常人说话的方式!本书采用会话式风格,帮助你参与到书的内容中来,而不是被居高临下地教导。
【本书内容】
本书每章都围绕一个软件项目展开。在每章的结尾,如果你一直在跟进,应该能够编写出那个项目。这些项目一开始是简单的命令行批处理程序,但随着复杂度的增加,它们会发展成功能齐全的应用程序。
你将从项目驱动的结构中以多种方式获益。首先,你将看到不同的编程技术如何在集成环境中协同工作。当我们在本书的最后部分看到函数式编程时,它不仅仅是抽象的集合处理操作,而是为了计算所讨论的项目中要使用的实际结果而提出的。这解决了一个问题,那就是:对于教学资料中看起来很好的想法和方法,开发人员经常会不恰当地或脱离上下文地使用它们。
其次,项目驱动的方法有助于确保在每个阶段都能看到实际的示例。教学资料中经常有很多被称为Foo的示例类和被称为bar的方法。而我们的示例与所讨论的项目相关,并展示了如何将这些想法应用到实际问题中,这些问题类似于你在职业生涯中可能会遇到的那些问题。
本书每章都是一个全新的项目,是一个学习新事物的新机会。我们希望读者能从头到尾读完本书,并且真正享受阅读的过程。这些章节以一个将要解决的挑战开始,带你去了解它的解决方案,然后通过评估你学到了什么以及如何解决这个挑战来结束。我们在每章的开头和结尾都特别指出这个挑战,以确保你清楚它的目标。
【本书目标读者】
我们相信,各种不同背景的开发人员都将在本书中发现一些有用和有趣的东西。而且,某些开发人员将会从这本书中获得最大的价值。
初级的软件开发人员,通常是刚从大学毕业或从事编程工作几年的开发者,我们认为他们是本书的核心读者。你将了解一些基本的主题,我们希望这些主题与你的整个软件开发生涯都是息息相关的。不要求读者一定有大学学历,但是要知道编程的基础知识,这样才能更好地利用本书。例如,我们不会解释if语句是什么或循环是什么。
你不需要了解太多关于面向对象或函数式编程的知识就可以开始阅读本书。在第2章中,除了假设你已知道类是什么并且能使用集合和泛型(例如,List)之外,我们没有做其他任何假设。我们是从基础开始的。
另一个对本书特别感兴趣的群体是正在学习Java的开发人员,他们可能熟悉其他编程语言,如C#、C++或Python。这本书帮助你快速掌握语言结构,以及编写好的Java代码所必需的原则、实践和习惯用法。
如果你是一名很有经验的Java开发人员,你可能想跳过第2章,以避免重复你已经知道的基本内容,但是第3章将会包含对许多开发人员都有用的概念和方法。
【示例代码】
可以从https://github.com/Iteratr-Learning/Real-World-Software-Development下载补充材料(示例代码、练习等)。
【推荐序】
软件开发是互联网、软件、工业等行业中最核心的智力活动。需要从业者具备知识的大量输入和高度聚合能力,并在实际业务中,充分运用在软件工程基础理论和实践两大方向所学所感的多种技能。软件工程基础理论的核心是对编程语言和设计模式、设计原则的深刻理解,并将两者融会贯通。工程实践是对各种方法论的理解和使用。
本书通过各章实例,很好地向读者传授了基础和实践相结合的实践方法。项目驱动下的软件设计不再是空谈,我们耳熟能详的SOLID原则、KISS原则、DRY等理论,在各章的实例中准确地指导了项目案例的设计。同时,作者在每章的实践中,展示了在设计模式和原则的指导下,如何优雅地完成编码。
此外,本书还从实践角度展示了工程构建(Gradle)和测试驱动开发(TDD)。通常实际的业务项目都是模块化的,如何利用构建工具对项目进行编译、调试、构建、分发,如何运用TDD等理论实现快速迭代和持续交付,这些都是开发者的基本修养。这本书虽然没有面面俱到地讲到工程实践的完整技术栈,但是开而弗达,将读者引到以工程项目为主视角的设计和开发的正确道路上来。
对初学者来说,通过阅读本书,可以在较短的时间内对软件开发有较清晰的理解,并能产生与自身结合的学习路线图。对于有一些工作经验的开发者来说,本书可以帮助你梳理这些年积累的理论和实践,温故而知新,然后再出发。
—阿里巴巴资深Java技术专家,韩陆
【译者序】
Java作为OOP(面向对象编程)的集大成者,融合了其他语言的诸多优点,在经历了多个版本更新之后,它也重新焕发出新的生机,特别是Java 8的发布,更是让开发者体验到了函数式编程的精妙及强大之处。而随着这几年开源社区的蓬勃发展,越来越多的组件、框架、方案如雨后春笋般涌现,现代工程师们大多不用再像前辈们那样从零开始编写代码,而是更多地将精力放在业务功能的实现上,这在很大程度上提高了软件开发的效率。特别是在Java方面,其技术体系之庞大,解决方案之丰富,完全超出任何其他语言平台,可以说,我们遇到任何一种“钉子”,都能随手找到一大堆“锤子”。但同时我们也会发现,开发中所遇到的很多问题也并非一个新框架、新方案能完全解决的。以代码级别的扩展性、可维护性等问题为例,它考察的是工程师对常见设计原则、模式的理解,以及对软件工程最佳实践的掌握程度,而这才是工程师真正的核心竞争力!
所以我一直认为,工程师在学习编程技术时,除了要详细了解编程语言的核心API、组件和框架之外,还应该去探索编程语言的最佳开发模式,就像习武之人一样,招数重要,但内功心法更重要。幸运的是,编程语言发展数年,前辈们留下很多已被无数次证明的最佳实践,这些实践经过时间的沉淀和打磨,逐渐形成一套基本的设计原则,它们是超越框架,甚至是超越语言的存在。作为现代工程师,想要获取这些资料易如反掌。由于设计原则或设计模式都是经过高度抽象和提炼形成的,初学者非常容易被各种“概念”“词汇”带偏。目前市面上很多模式相关的书籍资料,为了让工程师便于理解,其示例代码都力求简单直接,甚至做了非常多的不切实际的具象化(拟人拟物)。所以现实情况是,很少有资料是以真实的项目迭代为蓝本进行讲解的,这会导致大家“即使懂很多道理,但仍写不好代码”。
而这本书填补了这方面的空白。首先,本书是以项目驱动式的方式来讲解的,即核心章节都会根据一个项目案例来引出开发过程中遇到的问题,然后引导读者一起去思考这些问题的解决方案,甚至包括一些设计权衡上的讨论。这种结合具体的业务场景进行反复验证、持续迭代的讲解方式,能让读者有身临其境之感。其次,本书在内容上涵盖了工程师必知必会的一些基本设计原则或模式,比如SOLID原则。SOLID是一组旨在帮助开发易于维护的软件的原则集,包括:单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)。书中并不会很生硬地介绍每个原则,而是会根据实际情况来引出这些原则的使用方式。最后,本书还介绍了TDD(测试驱动开发)、流式API、函数式编程等目前比较流行的主题,相信大家同样会有所收获。
当然,由于篇幅有限,本书不可能全面介绍上述所有内容,很多时候只是给读者指明一个思考的方向,同时在很多问题上,作者并不会很武断地表达出对某种设计选型上的肯定或否定。一般情况下,我们需要根据实际情况做出选型上的权衡,以找出当下的最优解。假如我们总是期望在最开始就能找到一个绝对正确的答案,很可能会失望而归。
本书的两位作者在Java领域都有一定的造诣,他们曾在多个大型国际会议上发表过精彩的主旨演讲,同时也是多本畅销书的作者,比如Raoul-Gabriel Urma博士曾出版过《Java 8实战》,而Richard Warburton博士曾出版过《Java 8函数式编程》,这两本书可谓是学习Java 8的必备资料,大家应该都比较熟悉。由如此经验丰富的作者来执笔,本书在质量上也是经得起推敲的。
由于我是第一次翻译整书,所以刚拿到原著时,比较担心自己能否准确地呈现原著之意,好在快速读完原著之后,发现书中所讲内容也是自己多年来心中所思所想,所以翻译过程比较顺利,竟然实现了人生第一次提前交稿。不过由于译者水平有限,书中所译内容难免存在词不达意的情况,在此也请各位读者朋友批评指正。我的邮箱是angel6380@126.com,对书中有任何疑问,都可以通过该邮箱联系我,谢谢!
在本书的翻译工作完成之际,我首先要感谢机械工业出版社华章公司王春华老师的信任,在今年年初,正是她询问我是否有兴趣翻译本书,最终才促成了这次合作。然后非常感谢本书的责任编辑李忠明老师,在翻译过程中他帮我解答了大量问题。
最后,感谢家人、朋友的支持与陪伴,你们是我前进路上的最大动力!