几十年来,Java 一直是最受欢迎的编程语言之一。想成为专家的人越来越多。因为竞争激烈,仅仅成为一名优秀的 Java 开发人员已经不够了------你需要获得深厚的知识并熟悉许多概念才能在竞争中领先。如果您一直在问自己"作为一名 Java 开发人员,我应该学习什么才能脱颖而出?",这篇博文可以帮助您解决问题。
1.对OOP原则有一个坚实的基础和清晰的认识
Java 是一种面向对象的语言,因此开发人员不应低估 OOP 原则,而应努力深入了解该概念。学习如何在编程时应用 OOP 原则,并深入了解对象建模、SOLID 原则、设计模式、继承和其他概念。这些是您在编写软件时应该牢记的事情,尤其是在现代面向对象语言中。
2. 阅读涵盖这些原则的书籍
掌握这些概念将帮助您轻松构建应用 OOP 原则的项目。一些我认为是开发人员必读的经典书籍中涵盖了许多概念:
- “设计模式:可重用面向对象软件的元素”,“四人帮”
- “鲍勃叔叔"罗伯特-马丁的"清洁代码”
- “鲍勃叔叔"罗伯特-马丁的"清洁建筑”
- Martin Fowler 和 Kent Beck 的"重构"(第 2 版)
- Kent Beck 的"极限编程解释"
- Kent Beck 的"测试驱动开发:示例"
3.熟悉Spring框架
Spring框架在现代Java开发中扮演着重要的角色。Spring框架组件,如Spring MVC和Spring Boot,通常被公司用于构建微服务或web应用程序。了解Spring框架所有优点的开发人员更有可能在他们的领域中脱颖而出,将本地Java方法转换为管理操作或远程过程。
如果您以前从未使用过Spring,那么第一步是熟悉Spring的基本内容,比如依赖注入(DI)、控制反转(IoC)和Spring MVC的一般原理。
下一个里程碑无疑是Spring Boot以及它为构建和运行web应用带来的能力。了解它提供的主要重要注释及其行为,并考虑一般的Spring注释(特别是如果您来自更基于xml的背景)。
像@Repository、@Service和@Controller或@RequestMapping这样的工具将成为你的日常伙伴。试着用它们构建一个小型的web应用程序。当然,为了学习这些知识,您需要很好地理解设计模式,以及这些注释定义的组件应该如何相互交互。
与以前使用Java使用的其他部署选项相比,使用Spring Boot启动和运行新创建的应用程序是如此容易,您会感到惊讶。这个框架的目的是简化你的生活非常,让你获得一个可运行的“全包”的. jar文件,你可以从命令行运行在您的计算机上,从码头工人容器,或部署Linux作为一个正常服务和把它背后Nginx如果你不使用码头工人在生产。
下一个您肯定希望尽早学习的Spring组件是Spring安全性。设置对端点和服务的适当访问所需的一切、身份验证和授权、登录、注册以及不同的安全提供者,您都可以在这里找到。
另一个你可能在很多项目中遇到的相当大的组件是Spring Data。它为数据访问提供了方便而优雅的抽象。它本身不是ORM,也不是JPA实现——它只是在ORM之上提供了一个通用的抽象,允许您减少数据操作所需的代码量,并使其简单易懂且可支持。
最后,一个值得明确提到的组件(不要忘记整个Spring是巨大的)是Spring AOP(面向方面编程)。它提供了一种包括各种注释的方法,以声明方式控制代码行为的多个方面,如日志、异常或事务。理解这种哲学和方法将会在任何工作面试中对你有帮助。
毫无疑问,Spring是Java世界中的一条大鱼,但它不是唯一的一条。并不是每个Java开发人员都想完全屈服于Spring的主导地位——有些人想专攻不同的技术,并在不同的领域深入研究。对于这些开发人员,我会区分Java EE堆栈。虽然已经很老了,但它仍然存在,特别是在一些较老的大型项目中。
4. 学习最重要的 API 和库
api和库处于Java底层,所以如果你想脱颖而出,了解它们是很重要的。他们是Java生态系统的一个组成部分,在StackOverflow问答网站上拥有第二大社区。
这是一个非常广泛的主题,同时包含很多内容——我可以写十几篇文章来讨论它——但总的来说,对核心api、主库和第三方库以及Java开发工具包(JDK)的深入了解,定义了一个高技能的Java开发人员。为了避免混淆,我应该说,专家不应该学习所有可能的api,也不应该知道库中的每一个元素。对Apache Commons、Guava、Maven和其他一些主要的api和库有一个清晰的理解就足够了。
5. 深入了解 Java 11
最近,Java开发人员社区见证了Java 15的上一个版本的发布。然而,当涉及到采用任何新版本时,Java领域的软件开发流程通常是相当缓慢的——“如果它没有损坏,就不要修复它”的原则在企业项目中尤其受欢迎。
在这些项目中发生的每一个小的变化都必须符合高安全性的要求,并且使用旧的技术是很常见的。例如,在银行、航空公司或保险系统中,你不太可能遇到任何少于五年的技术。这就是为什么“老”意味着稳定、可靠和安全。
尽管如此,新版本在这些领域也得到了缓慢但稳定的采用。在每一个新版本发布后,越来越多的公司会要求你熟悉新特性。Java 8是当时的一个重大突破,它花了几年时间才成为行业标准。如果不掌握这个版本的Stream API、默认接口方法、Lambda表达式、Java Time API和其他主要特性,你绝对“不能通过”。
最新的Java版本保持了主动特性的采用。下一个LTS版本是Java 11——这是你现在在工作中经常遇到的一个。许多公司不会从它切换到下一个LTS发布,预计Java 17将于2021年9月发布。我绝对不建议您在接触和熟悉所有Java 11特性之前就开始找工作。
后来的Java版本,如上面提到的多达15个,在某种程度上仍处于获得更广泛采用的过程中,但它们已经在使用了相当多。例如,已经有一个Amazon Corretto 15版本可用。
无论是哪种方式,优秀Java开发人员的一个重要实践是非常认真地遵循每个新发行版,并迅速熟悉所有的新特性。任何一个都不能忽视。
6. 关注 JVM 及其内部结构
没有 JVM(Java 虚拟机),Java 就不存在。它是一个运行时引擎,允许 Java 应用程序在任何可能的平台上运行。所以,如果你想加入一群优秀的Java开发者,了解JVM工作原理是必须的。除此之外,虚拟机的知识将帮助您在开发过程中解决问题。因此,除其他外,请确保掌握 JVM 系统线程以及 Java 在运行时环境中的执行方式。
7. 手头有多种方法论
如果您想领先于许多其他Java程序员,就应该特别注意不同的方法。首先,要熟悉敏捷,特别是SCRUM,但也要理解瀑布,并准备好使用它。只要许多开发人员根据客户的偏好选择方法,了解他们中的许多人将有助于您在此之上。
此外,您还可以学习极限编程技术(上面提到了Kent Beck的经典著作),以获得更丰富的经验和有效的工作。
8.习惯自动化测试
真正的Java开发人员与那些试图看起来像Java开发人员的区别在于进行自动化测试的能力。简单地说,任何非手动的测试都可以被认为是自动化的:单元测试、集成测试和其他测试,如果你想成为一名优秀的Java程序员,这些测试都需要改进。您还应该了解如何以这样一种方式交付项目:测试是CI/CD管道的一部分,如果测试没有涵盖某些重要部分,代码就不会投入生产。
下面是您的开发和进一步部署流在测试后的样子。
您开发应用程序的一个组件,并使用单元测试覆盖它,直到继续进行下一个组件。
如果您完全遵循此实践,您可能会注意到它如何隐式地迫使您保持良好的代码模块化。一个好的单元测试允许您独立运行组件的代码。您不能使用数据库、外部api或依赖其他类。此刻只有你的组件在现场。
您向它提供您精确地组合在一起的演示数据,考虑所有边缘情况,如空值或空值,然后检查输出是否完全如预期的那样。这样做之后,您就可以确定您的组件不是故障的来源,您可以在其他地方仅仅依赖于它的逻辑。JUnit 5和Mockito是你最好的朋友——每天掌握和使用它们。
另外,在编写测试用例和测试时,甚至在编写组件代码本身之前,就使用TDD。
在像这样开发所有组件之后,您需要提供自动集成测试。
在大多数情况下,这只是意味着用一个简单的脚本以编程方式利用您的应用程序,使用一些输入数据运行它,并控制输出(您经常在Docker容器中这样做)。然而,有时这意味着测试单独的组件或组件链,但这一次使用真实的外部资源,如数据库或文件存储。
无论哪种方式,考虑你可以全局拥有哪些输入边情况,并检查你的应用能否正确处理这些情况。
3.最后,应该将测试嵌入到CI/CD管道中。
一种经典的现代方式是,一旦你将代码提交到Git仓库中,无论是提交、拉取请求,还是合并到特定的分支,就会触发一个Hook。这将运行一个部署脚本并利用一个Docker容器,该容器将根据您的部署尝试构建您的应用程序,或为您的应用程序构建一个Docker映像。
无论哪种方式,如果应用被成功构建(如果没有,你会自动从生产中受到破坏的应用的保护),它会尝试在容器中运行你的所有测试,包括单元和集成。如果任何一个测试失败,整个过程就会失败,Git不会自动批准pull请求,或者只是让构建失败。
这一流程的一些细节会有所不同,但通常情况下,这种应用交付方法将为你带来明确的质量控制,为你在应用生产过程中崩溃时节省时间。
9. 提高你的编码技巧
编程主要是练习。不管你读了多少书,它们都不会像你在实践中磨练了知识那样有效。幸运的是,现在的编码并不像你想象的那么无聊——网络上有许多游戏化平台让编码变得有趣。