想找到第一份Java工作,你需要学习多少Java知识?
从 Java 学徒到 Java 绝地武士
一个有志成为Java初级程序员的人需要掌握哪些知识才能找到第一份工作,甚至在一家不错的公司获得实习生职位?哪些工具可以帮助Java程序员提升到更高水平?应该学习哪些技术,哪些技术可以暂缓学习?
这些问题没有标准答案,就像没有一个行动方案能完全适用于所有人一样。有些公司致力于发展,不断引入新技术并测试新版本语言的功能,而另一些公司则固守旧技术。当然,也存在一些折衷方案,或许这些方案才是大多数折衷方案。
这个问题我经常被问到,所以我决定写一篇文章,以便日后可以参考这篇文章来回答它。此外,这篇文章不仅对那些亲自问我的人有用,对所有已经决定(或尚未决定)将生活与Java编程联系起来的人也很有帮助。
我使用了哪些资料来回答文章的主要问题?
为了尽可能完整地回答文章的主要问题,我主要依据以下几点:
- 我作为一名资深Java开发人员,曾面试过很多初级Java开发人员,这是我自身的经验。
- 我的辅导经历(或者更确切地说,是我的学生的经历)
- CodeGym Portal 对其校友进行的一项调查结果如下:
- 一些来自网络论坛的回答
首先:必须掌握核心 Java 知识
核心Java通常指的是这门编程语言的基础部分。它包含以下几个组成部分。
Java 语法
- 类、变量和方法
- 原始数据类型
- 字符串
- 基本运算符
- 基本结构:循环、分支
Java 语法就像是这门语言的入门基础。学生们通过实践来学习它,就像小孩子学习读写一样。这里最难的概念是编程原理,例如循环和分支。对于完全的初学者来说,这些原理可能比较难懂,但通常在编写一些代码之后,未来的程序员就会逐渐理解并掌握它们。
在获得第一份Java开发人员或Java实习生的工作机会之前,92.4%的程序员对Java语法的掌握程度达到良好或优秀水平。那么剩下的7.6%呢?他们掌握了中级水平,并且幸运地获得了实习机会。然而,这纯粹是运气。每位申请者都必须精通Java语法,好在Java语法学习起来既快捷又容易。
面向对象编程(OOP)
Java 和 OOP 几乎是同义词,因为在这种编程语言中,一切皆对象。
如果你习惯了过程式编程,一开始可能会觉得难以适应面向对象编程的思路和方式。但实际上,面向对象编程并没有那么难。而且,它本身就是一个非常优美的概念。重要的是,在编写大量代码的同时,也要思考如何构建对象层次结构。
面向对象编程的主要子主题有:类继承、接口实现、数据和行为的抽象、数据和类实现的封装、多态性和虚方法。
大多数(80.3%)获得第一份与 Java 相关的工作的人都精通面向对象编程 (OOP) 原则,并且一直在使用这些原则。
然而,“扎实的知识”有时会因经验而异。“我读过面向对象编程(OOP)的书籍,也用过继承和封装。我当时以为自己掌握了这些知识,但后来意识到,我之前似乎了解一些,但并没有真正理解其中的细微差别。直到我作为Java实习生参与一个大型项目时,我才真正深刻理解了抽象层次及其运用方法。”安迪说道,他现在是一家国际外包公司的初级Java程序员。
根据 CodeGym Portal 的调查,78.8% 的 Java 初级程序员和实习生在工作中经常使用面向对象编程 (OOP),12.1% 的人偶尔使用,7.6% 的实习生很少使用(他们通常从事单元测试和各种小任务)。
集合框架
一组被表示为一个整体的独立对象称为集合。Java 提供了一个集合框架,用于处理不同的集合。集合基于一些常用的数据结构:列表(包括普通列表和连通列表)、集合、哈希表等等。因此,在学习集合的同时,最好也对数据结构有所了解。
主要子主题:
ListSetMapArrayListLinkedListQueueDequeHashSet,,HashMapHashTableTreeSet学习集合的主要难点在于理解它们的工作原理以及何时使用哪种结构。这需要实践才能掌握。此外,TreeMap在实际工作中,虽然存在大量的结构,但只有少数几种会被频繁使用。作为教程,创建自己的集合版本会很有帮助。几乎所有(96.9%)的Java初级开发人员和实习生在第一份工作中都会使用集合框架,80.3%的受访者在获得第一份工作机会之前就已经对集合有了良好的或优秀的了解。
异常处理
异常是指程序执行过程中可能出现的不正常情况。所有异常类都是 `Exception` 类的子类型java.lang.Exception。异常处理机制极大地简化了程序中的错误捕获过程。通常,学生很早就开始使用异常,因此这个主题绝对值得您重视。
主要子主题:
- 异常处理机制
- 尝试-捕捉-最终
- 扔,扔
- Java 中的异常层次结构
- 已检查/未检查的例外情况
- 错误和异常的区别
- 无法访问的 catch 块错误
- 手动抛出异常
每个 Java 实习生和初级 Java 程序员在工作中都会用到异常处理,面试官也经常会问到有关这种机制的问题。
Java 输入/输出流
Java 使用流(Stream)进行输入输出操作。流是一种连续的数据流。在 Java 程序中,你需要频繁地读写数据。这对初学者来说并非易事,有时新手的工作中也很少用到它(这实际上取决于他们参与的项目)。数据显示,22.7% 的 Java 初级/实习生表示他们经常使用 I/O 流,31.8% 表示偶尔使用,25.8% 表示很少使用。也就是说,近 20% 的人在担任 Java 开发人员的第一年里完全没有使用过流。
主要子议题:
- 字节流(
FileInputStream,FileOutputStream) - 字符流(
FileReader,FileWriter) - 标准流(
System.in,System.out)
Java多线程/并发
这里我们来探讨Java核心中最高级的主题。几乎所有学生在理解和使用多线程时都会遇到困难,但当他们最终掌握了驾驭不同线程的技巧后,程序员们就会开始理解这项技术在Java中的出色实现以及它的强大之处。
然而,如果你觉得多线程非常困难,那么一开始不必深入研究它。事实上,只有 12.1% 的受访者表示他们在收到第一份工作邀请前对多线程有较好的了解,而 31.8% 的受访者承认他们对此一无所知。大多数受访者(56.2%)表示,他们在开始学习时对多线程“略知一二”。因此,多线程可以成为你在 Java 初级程序员面试中的竞争优势。你可以选择深入学习,也可以只了解一些基本概念。解决一些编程问题,然后专注于其他主题。
主要子议题:
- 线程的生命周期(新建、可运行、等待、定时等待、已终止)
- 恶魔
- 线程同步
- 处理线程死锁
- 线程操作
Wait,,notifynotifyAll- 中断线程
Sleep,,yieldjoin
在担任 Java 实习生或初级开发人员的第一年里,9.1% 的人经常使用多线程,36.4% 的人偶尔使用多线程,而 39.4% 的人很少使用多线程。
Lambda表达式
Java lambda 表达式在 Java 8 中首次出现,但初学者往往忽略了这个便捷的工具。Lambda 表达式扩展了 Java 的功能,使函数式编程的概念得以在该语言中应用。Lambda 表达式是一个无需隶属于任何类即可创建的函数,可以作为对象传递,也可以按需执行。仅有 22.7% 的受访者在获得第一份工作之前就对 lambda 表达式有所了解,而 48.5% 的受访者表示他们对 lambda 表达式的了解“几乎为零”。与此同时,超过 85% 的新程序员表示他们在工作的第一年就使用了 lambda 表达式。
主要子议题:
- Lambda 表达式,单方法接口
- 匿名接口实现
- Lambda 类型推断
- Lambda 参数
- Lambda 函数体
- 从 lambda 表达式返回值
- Lambda 作为对象
- 可变捕获
- 方法引用以 lambda 表达式的形式呈现
因此,我们可以说,对于任何有志成为Java初级开发人员甚至实习生的人来说,掌握Java核心知识是必不可少的。当然,如果你精通所有主题,即使对多线程和lambda表达式了解不多,也能获得工作机会。然而,掌握这些知识可以成为你求职时的竞争优势。尽管如此,你很可能还是需要同时运用这两种知识。
在我的实践中,我遇到过一些只掌握Java语法和面向对象编程(OOP)基本概念就找到工作的人。他们大多成为Java实习生,但有时我也会遇到几乎没有任何Java初级技能的人。一方面,他们很幸运:实现了成为程序员的梦想,可以直接从工作中学习。另一方面,雇主很快意识到他们的技能水平薄弱,因此他们长期被分配到重复单调的任务,这常常令人沮丧。我对这类程序员的建议是:努力提升自己,直到厌倦为止。解决实际问题,多阅读——然后进入下一个阶段。
哪里可以学习Java核心主题
CodeGym是我最喜欢的专注于核心 Java 的在线课程之一。你可以在这里找到所有核心 Java 主题(目前除了 lambda 表达式),以及超过 1200 个练习。jenkov.com
上的 lambda 表达式教程非常棒,涵盖了你需要了解的关于 lambda 表达式的所有内容。CodeCademy
上的 Java 课程也值得推荐。CodeCademy 是最著名的实践学习平台之一。在这个课程中,你可以找到大部分核心 Java 主题。
算法与数据结构:值得商榷
学习任何编程语言时,最具争议的问题之一就是学生是否应该学习标准的排序和搜索算法。一方坚持认为,所有高效的算法早已编写完成并包含在库中,因此任何人都可以直接使用。
反对者们坚信,自行编写算法是锻炼程序员思维的绝佳方式,而且还能检验学生是否具备这种能力。我更倾向于后者的观点,尤其是在Java初级程序员面试中,他们经常被要求编写算法,有时甚至需要在纸上写。虽然算法知识与Java本身的知识并无直接关联,但我仍然建议所有未来的程序员都应该学习这方面的知识。这绝不会多余。
另外,在程序员的实际工作中,你很可能用不到冒泡排序之类的算法。更重要的是了解哪些库里提供了标准算法。调查显示,69.6% 的学生表示,在收到第一份工作邀请之前,他们已经掌握并编写过排序和搜索算法,水平达到良好或中等。
我们在讨论Java集合时已经涉及过数据结构这个话题。我认为理解数据结构的架构对于了解何时何地使用哪种数据结构以及为什么使用它们至关重要。因此,我经常要求学生为特定的数据结构编写自己的类。
再次强调,在实际工作中,大家通常都会使用标准数据结构,但并非所有数据结构都会被使用。
哪里可以学习算法和数据结构
首先,你可以找一本好书,比如Robert Sedgewick 和 Kevin Wayne 合著的《算法》。另外,这两位作者还在Coursera 上开设了一门在线课程。这门课是我最喜欢的之一,而且是用 Java 编写的。GeeksForGeeks是一个庞大的在线社区
,你可以在那里找到很多算法相关的讲座和练习。
单元测试
优秀的程序员都能测试代码,而且不仅限于自己的代码,所以一定要学习如何为你的代码编写单元测试。新手有时会忽略单元测试,而更倾向于使用System.out.println验证类型测试(如果你已经尝试过编写代码,你就会明白我的意思)。记住,单元测试比使用控制台输出进行检查要有用得多。单元测试也是公司通常最先信任新开发人员编写的内容。调查显示,57.5% 的受访者在第一次成功获得 Java 相关面试机会之前使用过 JUnit,超过 83% 的受访者在入职第一年就已经使用过单元测试。
哪里可以学习单元测试
那就找个教程(例如这个视频教程或这个文字教程),然后为你的所有代码编写测试!
实用库和有用组件
有些雇主希望未来的程序员了解一些有助于他们工作的工具和库。
- Servlet 是 Java 软件组件,用于扩展服务器的功能。
- JDBC 是一个平台无关的标准,用于 Java 应用程序和数据库之间的交互。JDBC 以 java.sql 包的形式实现,包含在 Java SE(标准版)中。
- log4j 是最著名的日志记录库。它允许你在 Java 代码中编写库调用,然后灵活地对其进行自定义,而无需更改已编写的代码。
- Jackson/JSON。JSON(JavaScript 对象表示法)是一种极其流行的开放标准文件格式和数据交换格式,而 Jackson 是一个用于 Java 的高性能 JSON 处理器。
超过半数的受访者在获得第一份Java相关工作之前就已了解这些技术。所有新入行者都在工作中使用过JSON/Jackson,其中大多数人使用过JDBC(84.8%)或log4j2(83.3%)。三分之二的受访者在担任Java初级工程师或实习生的第一年就使用过Servlet。
- Guava 是一套开源的 Java 通用库,主要由谷歌工程师开发。
- Apache Commons 是一个庞大的 Apache 项目,专注于可重用 Java 组件的各个方面。
学习期间,我建议你花时间学习 log4j、JSON 和 JDBC(以及 SQL 和数据库工具)。当然,列表中的其他技术和库也很有用。
哪里可以学习实用库和有用组件
- tutorialspoint 上有关于 log4j 的文字教程,Udemy 上有视频课程。
- CodeGym 的课程中包含一些 JSON、log4j、JDBC 等主题和练习。
- edureca 上的Java Servlet
Spring/Hibernate
以前,没人会要求初级员工,更别说实习生,掌握框架知识。但时代在变,现在有些公司会因为你不了解这些技术而拒绝录用你。自学这些技术虽然可行,但非常困难。因此,我建议你找一些课程,最好还能有导师指导。
- Spring——33.3% 的受访者认为他们对 Spring 的了解程度“良好或优秀”,而 21.2% 的受访者对此框架一无所知。
- Spring Boot — 42.4% 的受访者了解 Spring Boot(良好或优秀水平),36.4% 的受访者不了解。
- Hibernate — 43.9% 的人对 Hibernate 有较好或非常好的了解,而 27.3% 的人从未尝试过它。
- Java API for RESTful Web Services — 90.9% 的用户在工作中使用它。
哪里可以学习 Spring/Hibernate
正如我之前所说,学习 Spring 和 Hibernate 的最佳方法是参加由小团队和导师授课的课程,但这并非总是可行。我找到了一些不错的学习资源。
Baeldung 上的Spring 教程
;Spring 实践任务; spring.io 上的
Spring 教程和Spring Boot 指南; Udemy 上的
Hibernate 和 Spring ; Udemy 上的
RESTful API 。
设计和架构模式以及编程原则
设计模式是解决特定问题的成熟方案。如果你不了解它们,未来的雇主会很头疼。花时间阅读相关资料并在实践中应用它们。架构模式也是如此,例如 MVC。我总是要求我的学生使用 MVC 编写一些程序。这确实会变得更难,但之后他们就掌握了 MVC 的使用方法。
此外,学习一些关于如何编写简洁易读代码的知识也很有帮助,比如遵循 KISS、DRY 和 SOLID 原则。说实话,这些原则很容易理解,但实践起来却需要时间。因此,我在面试初级职位申请人时,从不要求他们精通这些原则,因为我知道这些都需要实践才能掌握。
哪里可以学习和阅读有关模式和原则的内容
构建自动化工具、应用服务器和非 Java
大多数IT专业人士都应该掌握一些技术和技能。它们虽然与Java没有直接关系,但我还是要提一下——入门学习并不难。此外,最好在正式工作前就开始学习,因为工作之后你可能就没有时间了。
哪里可以学习构建自动化工具、应用服务器和非 Java 编程语言
Gradle教程和指南;
Maven五分钟
速成;Tomcat 7入门;
JBoss
SQL、JavaScript、HTML、CSS( w3schools平台)
结论
嗯……看起来有点吓人,不是吗?不过,如果你热爱编程,对技术感兴趣,并且决心成为一名程序员,那就没什么好怕的。一步一步来,练习,学习,愿原力与你同在。路,只有走得远的人才能走好。
首次发表于Better Programming。
文章来源:https://dev.to/selawsky/how-much-java-do-you-need-to-learn-to-get-your-first-job-57lc