Java开发一直是当前互联网领域最火热的开发技能之一,Java工程师也一直是需求量非常大的开发职位。本书主要针对一名合格的Java工程师的必备技能做了大纲性的总结和阐述。本书内容包括了工程化、常用开发框架、数据存储、数据传输、Java编程高级知识、性能优化、安全技术等内容,基本涵盖了Java工程师需要掌握的绝大部分技能点。
打造后端技术栈新高度 底层提升系统架构能力
推荐序一
Hey!新来的读者,为了吸引你的注意力我真是煞费苦心,但最终还是没能写出一句特别吸引眼球的话来,毕竟写序的我不是标题党出身。此刻我真的非常能理解你拿到新书之后那渴望知识的心情,所以你恨不得一个字的“序”也不要看到,直接到达“最有价值”的知识点。但作为一名资深转业码农(对!你没看错,是“转业”,不是“专业”)还是想说一句,你先看完序,5分钟后到达知识的战场,会更稳!
相信你已经在看“序”了,那么我们来说点正经事。
你的知识体系的养成有3个关键阶段:看山是山,看山不是山,看山还是山。本书的适用人群是“看山不是山”的那些人,如果你恰好处于这个阶段,恭喜你!书钱没白花。
Java是一门非常容易入门的语言,初学者经过初期的学习之后基本能掌握DEMO级别的编程应用。相信读者你已经度过了这个阶段,但是Java庞大的体系可能会把你绕晕,又或者你还没看到Java的生态系统有多么复杂。此时,你需要本书。从事程序员这个工作,到比较高阶的时候,其实是不挑语言的,语言只是工具,而你可以在纷繁复杂中游刃有余。但几乎每一位高手都是先深入一个领域,再横向发展的。你可以不用着急后续的横向发展,先坚定自己学习Java的信心!因为,从广泛的应用场景、顶级的开源生态、未来可期的薪水和职位来说,Java都是非常不错的选择。
敲黑板,画重点!下面来解释一下,为什么本书面向的是“看山不是山”的人群。在度过Java的入门期之后,会有一个烦恼,那就是面对Java这么庞大的体系,我们究竟应该学习什么?选择方向,往往比努力更重要!是使用J2SE编写桌面程序?是使用J2ME编写嵌入式应用?还是使用J2EE编写企业级应用?这些是我们那个泛黄的年代特有的烦恼。而现在的烦恼可能是学Android?还是学Java后端?即便大方向你已经十分坚定,而且选择了Java后端编程,但因为复杂的知识体系和Google发布的各种教程文档,眼前看到的已经不再是清晰的山脉,而是一片迷雾。此时,你需要本书,因为它给你指明了努力的方向。
本书的结构、阐述的方式和大部分的“指南”书籍有较大的区别,本书是以笔记和要点的形式进行呈现的,用现在的话说就是捞干货。本书涵盖的知识,是以现代工程实践中的实际案例出发来组织的,所以知识点范围非常广泛,每一个点都对最关键的“Best Practice”简明扼要地进行了说明。你在阅读本书的时候需要一些相关经验,不然无法跟上作者的节奏,建议在有一定的知识准备后再阅读本书,这样你会受益匪浅。从另外一个角度看,在你有了一定的基础积累之后,本书可以帮助你全面地了解一个现代化的最先进的工程实践是怎样的。本书讲述了目前行业中最常用的,经过了实践的工程方案,这将是你快速进阶的最佳指引。
——孙建,随身云(中华万年历)联合创始人& CEO
推荐序二
2013年,我和本书作者的接触是从基于网易的一个大型互联网应用合作开始的,我见证了从第一行代码到整个系统服务于亿级用户的过程,并且相信这种经历对开发者来说是一笔巨大的财富,其中大量的开发和实战经验都会在本书中得到充分的体现,相信读者能从书中直接领略到丰富的实战知识。在与本书作者的合作过程中,其对Java技术的热爱与追求,对问题刨根问底,直到理解透彻、灵活应用,这些都令我印象深刻。这些年,我与本书作者一直保持沟通交流、相互学习,他将近十年的实战经验沉淀于本书以实现对后端技术的探索、布道,非常值得开发者与近高窗卧听秋。
后端技术涉及内容非常广泛,Java语言也是互联网开发行业使用的主流语言,相信后续也将继续流行很长一段时间,而本书作者也一直从事Java后端开发工作。在本书中作者比较系统地从总体上描述了后端技术相关的理论知识,包括基础设施、网关服务及框架选型等基本原则,然后以实际经验进行示例说明,接着详细梳理了Java的后端技术,相信读者读完本书后会更全面地理解后端技术。互联网的业务建设需要不同角色的开发者共同协作完成,因此,系统工程化是开发者首先要共同遵守的规范或约定,包括代码规范、版本管理和代码质量检查等。
开发框架的选型进一步地为工程化提供了基础,也能加速推进互联网开发,尽管是否重复造轮子是一个恒久的话题,但是没有永远的银弹,只要在合适的时间里根据团队的能力选择合适的技术框架就好。一般来讲,目前常用的框架包括基本的依赖注入、AOP、事务管理、连接池管理、数据操作、日志服务等,在众多的框架中,本书作者选用目前在Java领域使用最广泛的Spring做深入的分析,详细地说明各组件的基础知识、基本原理和实际使用案例,最难得的是把较多开发者遇到的坑都用真实的示例进行了说明,可以帮助开发者快速地跳过这些伤心地带,同时也把最佳实践画龙点睛地带给开发者。
数据存储无疑是所有系统应用中非常重要的一环,应用的场景用例也和数据库的选型有着极其重要的关系,开发者选择关系型数据库还是非关系型数据库是需要根据软件成本与人力成本来进行权衡的,比如选择MySQL、Oracle等开源或商业的数据库。本书重点从数据库的基础知识、索引和表优化等方面以详尽的示例为更好地选择数据库的存储类型提供了更多的知识。
早期的关系型数据库一般能满足数据达到一定规模的企业的需求,而在互联网业务领域,特别是移动互联网领域内的元数据或者日志数据等,达到亿数量级别是很常见的,这时通常使用非关系型数据库,在非关系型数据库里使用非常多的有MongoDB、HBase等分布式数据库系统。作者在自身的企业开发实践中,得到了大量的使用经验和最佳实践。为了加速后端应用,缓存热数据是加速业务、提高业务性能、提升用户体验的重要手段,通过使用本地缓存、远程缓存进行数据加速、数据预热或提高数据的命中率,是开发者在应用开发的过程中常会遇到的场景。
“路漫漫其修远兮,吾将上下而求索”,后端技术每年都在不断发展,所用技术也有变化,近些年Java语言的发展速度不那么快了,但是总体是在不断前进发展的,本书作者带领的团队一直深耕此领域并希望通过本书为技术开发人员带来更多帮助。
——尧飘海,网易云基础服务(蜂巢)首席架构师
前言
目前互联网行业如火如荼,进入这个行业的技术人员也越来越多。对于研发来说,从工程角度其主要分为前端工程师、客户端工程师(又分为iOS和Android工程师)、后端工程师、算法工程师等职位。本书所说的Java工程师指的是以Java作为主要开发语言的后端工程师。
笔者从2008年还未毕业时做一些小的项目至今,做后端开发已经有差不多10年时间。经历过刚学Java时的迷茫,第一次写出Java程序时的激动,第一次写出一个Web系统的醍醐灌顶,一直到接触Java更底层的东西,总的来说对Java有了系统性的认识,对后端技术体系有了宏观的感受。这期间,笔者用过各种各样的编程语言,尝试过各种开源软件,挖过各种坑,也填过各种坑。针对后端技术来说,笔者认为自己的这些知识体系,还是有一定价值的。
此外,还记得当笔者毕业后进入第一家公司时,入职培训的课程虽然不难,但确实有种恍然大悟的感觉。业界的最佳实践和自己在学校里学到的、使用到的知识,差别还是非常大的。直到后来加入现在的这家公司,给新老员工做过一系列后端技术的培训课程,在校招的笔试和面试过程中深刻体会到学校与业界脱节之严重,在平时的社招中遇到很多对后端技术缺乏系统性认识、技能点不足的工程师,并且也经常被人问起如何学习Java后端技术,于是就打算将目前后端工程师一些比较主流、前沿的技术以及实际工作中会用到的技能串联起来,给刚上大学以后打算以Java后端为职业的学生、刚毕业入职的应届生以及初学者们一些入门的指引,使其少走弯路。另外也希望给一些有经验的工程师提供一个参考手册,将零散的知识点串起来,减少在解决某些实际问题时无头绪搜索带来的时间成本,同时也是对自己的一个阶段性总结和查漏补缺。需要注意的一点是,像数据结构、计算机网络等计算机科学基础知识以及Java SE的基本用法,笔者认为是从事程序开发工作的Java工程师应该必备的知识,因此并不包括在内。
本书会针对Java后端开发工作中经常用到的关键技能点做阐述,会尽量覆盖实际工作中需要的所有技能。但由于很多技能并非一两个章节就能完整讲述,因此本书仅做一些实践性的经验总结和阐述,更加详细和深入的学习则需要参考专门的书籍或者官方文档。
本书的大部分内容都来自笔者的博客以及平时工作、学习中的一些自我总结和笔记,记录了笔者进入这个行业以来的一些经验教训和思考。
面向读者
未入门或者刚入门的Java工程师
包括未来以Java后端开发为职业方向的在校学生、刚毕业入职的Java工程师以及未形成知识体系的Java工程师。这类读者通过阅读本书能够对Java工程师的必备技能有一个全局认识,逐步形成自己的Java技术体系。
有经验的Java工程师
有经验的Java工程师可以通过本书查漏补缺,巩固自己的开发技能,进一步完善自身的Java技术体系。
对Java后端开发感兴趣的非Java工程师
非Java工程师可以通过本书了解Java工程师的技能体系,尤其对于其他语言的后端工程师来说,本书的很多内容也是通用的,并不局限于Java开发。
内容概览
第1章 后端技术导言
本章主要从总体上描述后端技术的概念、组成、作用、需要的知识点,并给出了学习后端技术的建议。
第2章 Java项目与工程化
本章主要讲述Java项目与工程化需要掌握的软件、技能等。
第3章 开发框架
本章主要讲述Java后端开发中的一些主流框架的使用方法。
第4章 Spring
本章主要讲述Spring核心、数据操作以及一些常用组件的使用。
第5章 数据存储
本章主要讲述Java应用中数据存储上使用的一些软件、服务等。
第6章 数据通信
本章主要讲述Java应用中数据传输、通信上使用的一些软件、服务等。
第7章 Java编程进阶
本章主要介绍一些Java开发中的高级特性以及在Java开发中非常流行的类库。
第8章 性能调优
本章主要讲述如何对Java应用的性能进行分析和调优,并给出了开发建议。
第9章 安全技术
本章主要对Java开发中常用的加密技术、HTTPS以及防范各种攻击的方案做了阐述。
参考资料
在写作本书的过程以及平时的工作中,笔者阅读、参考过很多书籍,以下是其中具有代表性的一些书籍。对于本书讲述不够深入的地方,可以参考这些书籍进一步学习。
《Effective Java(第2版)》:此书讲解了Java的一些高级特性和技巧。
《Java并发编程实战》:此书是并发编程经典书籍,涵盖了并发编程的各种知识点以及相关理论知识。
《七周七并发模型》:此书讲述了主流的7种并发编程模式。
《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》:此书讲解了JVM的内存、GC、字节码、编译器等高级特性和优化实践。
《高性能MySQL(第3版)》:此书讲述了MySQL各种优化技巧,并结合原理给予讲解。
《Redis开发与运维》:此书在原理层面对于Redis的使用、优化做了详尽的描述。
《深入理解Elasticsearch(原书第2版)》:此书讲述了对Elasticsearch的使用、原理和优化技巧。
《Java性能权威指南》:此书是Java性能调优的权威书籍,几乎涵盖了Java调优的方方面面。
《构建高性能Web站点(修订版)》:此书从各种案例出发,讲解了高性能Web站点需要的各种优化技巧、实践经验等。
《白帽子讲Web安全》:此书基本涵盖了Web安全技术的方方面面,包括客户端安全、服务器端安全等。
虽然以上书籍都是非常实用的参考资料,但就笔者自己来看,更为推崇的则是直接通过相关技术的官方文档来学习,这样既能够锻炼自己的英文阅读能力,又能够直面相关技术的第一手文档,避免了在看相关书籍时被一些偶然的纰漏所误导。
此外,上面的《Effective Java(第2版)》和《Java并发编程实战》这两本书都是基于Java的旧版本来写作的,但是里面介绍的很多内容并不过时,尤其是JDK底层源码、设计理论、优化思想等仍然适用于现在的Java开发。
勘误和支持
在本书的写作过程中,笔者一直是战战兢兢的,一直害怕写成那种侃侃而谈却没有实质内容的东西或者传递给读者一些误导信息,因此对于每一个知识点,都是在查阅官方文档以及其他权威资料并经过自己深入思考之后才敢落笔的。但由于笔者知识能力有限,难免有错误和疏漏,希望得到各位读者的理解和指正。
如果在阅读本书的过程中发现错误,请提交到网址https://github.com/superhj1987/pragmatic-java-engineer/issues或博文视点官网本书页面。
同时,请随时注意勘误信息的发布:https://github.com/superhj1987/pragmatic-java-engineer/wiki/Mistakes。
致谢
由于工作以及个人身体等方面的原因,中间数次延期,历时一年多才完成本书。因此首先要特别感谢笔者的父母和妻子,在笔者写作本书的过程中给予了非常大的后勤支持和鼓励,让笔者能够专心地完成写作。
同时要感谢中华万年历的同事们在平时的工作中给了笔者很多启发和思路,感谢公司的设计总监张喜亮抽出时间帮助修饰了一些图片,尤其要感谢CEO孙建在本书写作过程中给予笔者了充分的信任和支持。
还要感谢笔者的前同事,也是笔者刚毕业时的工作导师尧飘海,他在百忙之中审阅了本书并给本书写序;也要感谢前同事张小川、阙杭宁和好友秦绪震、饶洵,他们抽出了宝贵的业余时间校对了本书并给出了很有价值的建议。
最后,感谢电子工业出版社永恒的侠少,他找到我出版本书,并允许我一次次延期。也感谢付睿编辑的辛苦校对和修改,让本书得以顺利出版。
也把本书献给我刚出生的女儿——依依。
联系方式
邮箱:superhj1987@126.com
博客:http://rowkey.me
微博:http://weibo.com/superhj1987
“提示”的第一点改为“.gitignore中添加不需要版本管理的文件,如:.DS_Store、logs、target、node_modules等。根据工程的类型不同这里需要加入的文件也不同。”
单元测试的代码中“public static void initMethod”和“public static void afterMethod”应该为“public void initMethod”和“public void afterMethod”
这里根据笔者自己的一些经验和实践,列出一些最为需要遵循的Java编码规范。”下面的第二点应为“变量和类命名务必具有意义,能让人一眼看出表示的意思。如userList表示用户列表,不要使用list、set、button这种无意义的命名方式。”
此页最后一点修改为“程序需要状态,对象不需要状态,如果对象有了状态,就会引发多线程问题。程序的状态应该统一由数据库、缓存、任务队列这些外部容器来容纳,处理时以局部变量的形式在线程内部流转直至被回收。”
“3.3日志”这一节,在构造Logger时,由于一些代码片段没有写出所在的类,因此使用了this.getClass()代替了类对象字面量,没有做特殊说明,造成了读者误解。在实际使用时,this.getClass()都应该换成所在类的类对象字面量,如”LoggerTest.class”。