为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

Java 与其他流行语言有何不同? 为什么Java应该成为第一门学习语言? 让我们制定一个计划,帮助您从头开始学习 Java,并应用其他语言的编程技能。 让我们列出使用 Java 创建生产代码和使用其他语言进行开发之间的差异。 米哈伊尔·扎特皮亚金 (Mikhail Zatepyakin) 在面向未来参与者的会议上宣读了这份报告 实习 Yandex 和其他初级开发人员 - Java Junior 聚会。


——大家好,我叫米莎。 我是来自 Yandex.Market 的开发人员,今天我将告诉您为什么学习 Java 以及如何有效地学习。 你可能会问一个合理的问题:为什么我要讲述这个故事,而不是一些拥有多年经验的强大开发人员? 事实上,我自己最近学习了Java,大约一年半前,所以我仍然记得它是什么样的,有什么陷阱。

一年前,我在 Yandex.Market 获得了实习机会。 我为 Beru 开发了后端,对于 Market 本身,您可能使用过它。 现在我继续在那里工作,在另一个团队中。 我们为业务合作伙伴创建了 Yandex.Market 分析平台。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

让我们开始吧。 为什么要从实用的角度来学习Java? 事实上,Java 是一种非常著名的编程语言。 它有一个非常大的社区。

比如有这样一个TIOBE指数,一个编程语言流行度的流行指数,Java在那里排名第一。 另外,在招聘网站上,你可能会注意到,大部分职位空缺都是关于Java的,也就是说,通过Java开发,你总能找到工作。

由于社区非常大,您的任何问题都可以在 Stack Overflow 或其他网站上找到答案。 而且,用 Java 开发时,实际上是在 JVM 上编写代码,因此可以轻松切换到 Kotlin、Scala 等使用 JVM 的语言。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

从思想的角度来看Java有什么好处呢? 有不同的编程语言。 他们解决不同的问题,你知道的。 例如,Python 非常适合编写一行脚本来解决快速问题。

从好的方面来说,您可以完全控制可执行代码。 比如说我们有汽车,Yandex无人驾驶汽车,他们的代码是用pluses写的。 为什么? Java有这样一个东西——垃圾收集器。 它清除 RAM 中不必要的对象。 这个东西自发地启动并且确实停止了世界,也就是说,它停止了程序的其余部分并去计算对象,清除对象的内存。 如果这样的东西在无人机上起作用,那就不酷了。 你的无人机会直线行驶,此时清除记忆,根本不看路。 因此,无人机是写在优点上的。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

Java解决什么问题? 它主要是一种用于开发由数十或数百人多年编写的大型程序的语言。 特别是,Yandex.Market 中的很多后端都是用 Java 编写的。 我们在几个城市有一个分布式团队,每个城市有十个人。 而且代码很容易维护,已经支持了十年甚至更长时间,同时新人进来并理解这段代码。

一种语言应该具备哪些特性,才能让其中的代码容易被支持,才能在大型团队中轻松开发。 首先,它应该是可读的代码,并且应该易于实现复杂的架构解决方案。 也就是说,应该很容易编写高级抽象等。这一切都是Java为我们提供的。 这是一种面向对象的语言。 实现高级抽象和复杂架构确实很容易。

Java 也有很多框架和库,因为该语言已有 15 多年的历史了。 在这段时间里,所有可以写的东西都写在上面了,所以有大量的库可以满足你可能需要的一切。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

我认为一个JA新手应该具备哪些基本技能? 首先,这是Java核心语言的知识。 接下来是某种依赖注入框架。 下一位发言者基里尔将更全面地讨论这一点。 我不会说得太深。 接下来是架构和设计模式。 我们需要能够编写架构上漂亮的代码才能编写大型应用程序。 这是某种用于处理数据库任务的 SQL 或 ORM。 这更适用于后端。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

去! Java 核心。 我不会在这里真正发现美国——你需要了解语言本身。 你应该注意什么。 首先Java这几年发布了很多版本,就是2014-2015年发布了第七个,然后是第八个、第九个、第十个,很多新的版本,里面引入了很多新的很酷的东西,例如Java Stream API,lambda等。非常酷、新鲜、酷的东西,在生产代码中使用,他们在面试中问什么以及你需要知道哪些。 因此,你不应该从Java-4图书馆书架上拿一本书去学习。 这是我们的计划:我们学习 Java-8 或更高版本。

我们密切关注 Stream API、var 等创新,它们在面试时被问到,并在生产中不断使用。 也就是说,Stream API 比循环酷得多,总的来说,是一个非常酷的东西。 一定要注意。

还有各种各样的东西,比如迭代器、异常等等。 在你看来不重要的事情只要你自己写一些小代码就可以了。 你不需要这些例外,谁还需要它们呢? 但面试时肯定会被问到,在生产中肯定对你有用。 一般来说,你应该注意异常、迭代器和其他东西。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

数据结构。 你不能没有结构,但如果你不只知道有集合、字典和表,那就太好了。 还有结构的不同实现。 例如,Java中同一个字典有多种实现,包括HashMap和TreeMap。 它们具有不同的渐近性,内部结构也不同。 您需要知道它们有何不同以及何时使用哪一种。

如果您知道这些数据结构的内部工作原理,那也会非常酷。 也就是说,要知道它们的渐进性并不容易——下注多少有效,通行多长时间有效,但内部结构如何工作——例如,HashMap 中的桶是什么。

树和图也值得关注。 这些在生产代码中不太常见,但在面试中很流行。 因此,您需要能够在宽度和深度上遍历树、图。 这些都是简单的算法。

一旦您开始编写任何大型、复杂、使用库、多类代码,您就会意识到,如果不构建系统并解决依赖关系,您将很难实现。 这些主要是 Maven 和 Gradle。 它们允许您在一行中将库导入到您的项目中。 也就是说,您编写一行 xml 并将库导入到项目中。 伟大的系统。 它们大致相同,使用其中之一 - Maven 或 Gradle。

接下来 - 某种版本控制系统。 我推荐 Git,因为它很受欢迎并且有大量教程。 几乎每个人都使用 Git,这是一件很酷的事情,没有它你就活不下去。

以及某种开发环境。 我推荐 IntelliJ Idea。 它大大加快了开发过程,对你有很大帮助,为你编写了所有样板代码,总的来说,这很酷。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

幻灯片中的链接: SQL动物园, 哈布拉邮政

SQL。 关于后台程序的一些信息。 这里其实有一个有趣的案例。 第二次实习面试的前两天,HR妹子打电话给我,说过两天他们会问我关于SQL和HTTP的问题,我需要学一下。 而且我对 SQL 或 HTTP 几乎一无所知。 我发现了这个很酷的网站 - SQL动物园。 我在 12 小时内学会了 SQL,我的意思是,SQL 语法,如何编写 SELECT 查询,JOIN 等。非常酷的网站,我强烈推荐它。 事实上,我在 12 个小时内就学会了我现在所知道的 90%。

了解数据库架构也很棒。 这些是各种键、索引、规范化。 Habré 上有一系列关于此的帖子。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

在Java中,除了SQL之外,还有各种对象关系映射系统,例如JPA。 有一些代码。 第一种方法中有一些 SQL 代码 - SELECT id name FROM info.users WHERE id IN userIds。 从用户数据库的表中获取他们的 ID 和名称。

接下来,有一个特定的映射器将对象从基础对象转换为 Java 对象。 下面还有第三种方法实际执行此代码。 所有这些都可以使用JPA用一行代码来替换,如下所示。 它做同样的事情 - 查找所有 ByIdIn。 也就是说,它根据方法的名称为您生成一个 SQL 查询。

非常酷的事情。 我自己在不懂SQL的时候就用过JPA。 一般来说,要注意。 如果你懒得学 SQL,那就是一场灾难。 而且,总的来说,火!

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

春天。 谁听说过 Spring 框架这样的东西? 你看看你们有多少人吗? 并非没有理由。 Spring 包含在每一个 Java 后端空缺的需求中。 没有它,大发展就无处可去。 什么是春天? 首先,这是一个依赖注入框架。 也关于这个 会告诉 下一位发言者。 但简而言之,这是一个可以让您更轻松地将某些类的依赖项导入到其他类中的东西。 也就是说,依赖关系的知识被简化了。

Spring Boot 是 Spring 的一部分,它允许您一键运行服务器应用程序。 您转到 THID,按几个按钮,现在您的服务器应用程序已在 localhost 8080 上启动并运行。 也就是说,您还没有编写一行代码,但它已经可以运行了。 非常酷的事情。 如果你自己写一些东西,那就火吧!

Spring是一个非常大的框架。 它不仅可以获取您的服务器应用程序并解决依赖注入。 它允许您做很多事情,包括创建 REST API 方法。 也就是说,您编写了一些方法并为其附加了 Get 映射注释。 现在您已经在本地主机上有了一些方法来向您写入 Hello world。 两行代码就可以了。 很酷的东西。

Spring 还使编写测试变得更加容易。 在大型开发中没有测试是没有办法的。 代码需要测试。 为此,Java 有一个很酷的库 JUnit 5。和 JUnit 一样,但最新版本是第五个。 有用于测试的一切,各种断言和其他东西。

还有一个很棒的 Mockito 框架。 想象一下您有一些想要测试的功能。 该功能可以执行很多操作,例如,在中间的某个位置,它使用您的 ID 登录 VKontakte,并从 ID 接收 VKontakte 用户的名字和姓氏。 您可能不会在测试中包含 VKontakte,这很奇怪。 但是你需要测试功能,所以你使用 Mockito 制作了这个类,修改它,模仿它。

您会说,当带有这样那样的 ID 的请求来到此类时,它会返回一些姓氏,例如 Vasya Pupkin。 它会起作用的。 也就是说,您将测试一个类的所有功能。 非常酷的事情。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

幻灯片中的链接

设计模式。 这是什么? 这些是解决开发中出现的典型问题的模板。 在开发过程中,经常会出现相同或相似的问题,如果能以某种方式很好地解决就好了。 因此,人们提出了解决这些问题的最佳实践和某些模板。

有一个网站最流行的模式——refactoring.guru,你可以阅读它,找出有哪些模式,阅读一堆理论。 问题是它实际上毫无用处。 事实上,没有实践的模式并不是特别有用。

您会听说一些模式,例如 Singletone 或 Builder。 谁听到了这些话? 很多人。 有一些简单的模式您可以自己实现。 但大多数模式:策略、工厂、外观——尚不清楚在哪里应用它们。

除非您在实践中看到其他人的代码应用了此模式,否则您将无法自己应用它。 因此,练习对于模式来说非常重要。 仅仅在 refactoring.guru 上阅读这些内容并不是很有帮助,但绝对值得这样做。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

为什么需要模式? 假设您有某个用户类别。 它有一个 ID 和一个名称。 每个用户都必须有一个 ID 和一个名称。 左上角是教室。

初始化User的方法有哪些? 有两个选项 - 构造函数或设置器。 两种方法的缺点是什么?

构造函数。 新用户(7,“债券”),好的。 现在假设我们没有 User 类,而是其他一个具有七个数字字段的类。 您将有一个包含七个连续数字的构造函数。 目前尚不清楚这些数字是什么以及其中哪些属于哪个财产。 设计师并不伟大。

第二个选项是设置器。 你清楚地写了:setId(7), setName(“Bond”)。 您了解哪个属性属于哪个领域。 但二传手有一个问题。 首先,您可能忘记分配某些内容,其次,您的对象是可变的。 这不是线程安全的,并且会稍微降低代码的可读性。 这就是为什么人们想出了一个很酷的模式——Builder。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

这是关于什么的? 让我们尝试将 setter 和构造函数这两种方法的优点结合在一起。 我们创建一个特定的对象 Builder,它也将具有 Id 和 Name 字段,它本身将基于 setter 构建,并且将具有一个 Build 方法,该方法会返回一个包含所有参数的新 User。 我们得到一个不可变的对象和一个设置器。 凉爽的!

存在哪些问题? 这里我们有经典的 Builder。 问题是我们仍然可能忘记检查某些字段。 如果我们忘记访问 ID,在这种情况下,在 Builder 中它会被初始化为零,因为 int 类型不可为空。 如果我们将名称设为“Bond”并且忘记访问 ID 办公室,我们将有一个 id 为“0”、名称为“Bond”的新用户。 不酷。

让我们尝试对抗这个问题。 在 Builder 中,我们将 int 更改为 int,以便它可以为空。 现在一切都很棒。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

如果我们尝试创建一个名为“Bond”的 User,却忘记输入他的 ID,我们将得到一个空指针异常,因为 ID 不可为空,而 Builder 有一个空指针异常。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

但我们仍然可能忘记输入名称,因此我们将对象重放设置为 null。 现在,当我们从 Builder 构建对象时,它会检查该字段是否不可为空。 这还不是全部。

让我们看最后一个例子。 在这种情况下,如果我们以某种方式将 null 放入 ID 运行时,那么立即知道您已经这样做了就太好了,而且现在犯了错误并不酷。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

您需要的不是在创建用户时抛出错误,而是在将 ID 设置为 null 时抛出错误。 因此,在Builder中我们将setter Integer改为int,他会立即发誓他们扔掉了null。

简而言之,重点是什么? 有一个简单的 Builder 模式,但即使它的实现也有一些微妙之处,因此查看模式的不同实现非常酷。 每个模式都有数十种实现。 这一切都非常有趣。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

我们如何在生产代码中编写Builder? 这是我们的用户。 我们将 Lombok 库中的 Builder 旋转附加到它,它本身会为我们生成一个 Builder。 就是我们不写任何代码,但是Java已经认为这个类有Builder了,我们可以这样调用。

我已经说过,Java 拥有几乎所有内容的库,包括 Lombok,这是一个很酷的库,可以让您避免编写样板文件。 生成器,获取。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

模式可以是架构性的——不仅与一个类相关,而且与整个系统相关。 系统设计中有一个很酷的原则:单一职责原则。 他在说什么? 事实上,每个类都必须负责它自己的一些功能。 在本例中,我们有一个与用户、JSON 对象通信的控制器。 Facade 可以将 JSON 对象转换为 Java 应用程序随后可以使用的模型。 有一个具有与这些模型一起工作的复杂逻辑的服务。 有一个数据访问对象将这些模型放入数据库并从数据库中检索它们。 还有数据库本身。 换句话说,并不是所有的内容都在一个类中,而是我们创建了五个不同的类,这是另一种模式。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

一旦您或多或少地学习了 Java,就可以编写自己的项目,该项目将具有数据库、与其他 API 一起使用并将您的服务器应用程序公开给 REST API 客户端。 这将是一件很棒的事情添加到你的简历中,这将是你的教育的一个很酷的结束。 有了这个你就可以去找工作了。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

这是我的服务器应用程序的示例。 第二年,我和这些人一起写了一篇学期论文。 他们正在编写一个用于组织活动的移动应用程序。 在那里,用户可以通过 VKontakte 登录、在地图上放置点、创建活动、邀请朋友参加、保存活动图像等。

我在项目中做了什么? 在 Spring Boot 中编写一个服务器应用程序,而不使用 SQL。 我不认识他,我用过JPA。 它能做什么呢? 通过 OAuth-2 登录 VK。 拿着用户的token,带着它去VK,检查它是否是一个真实的用户。 通过 VKontakte 接收有关用户的信息。 它能够通过 JPA 将信息保存在数据库中。 熟练地将图片和其他文件保存在计算机内存中,并将它们的链接保存在数据库中。 当时我不知道数据库里有CLOB对象,所以我就这样做了。 有一个供用户、客户端应用程序使用的 REST API。 并且有基本功能的单元测试。

[...] 我成功学习 Java 的一个小例子。 在大学的第一年,我学习了 C# 并了解了 OOP 编程 - 什么是类、接口、抽象以及为什么需要它们。 这对我帮助很大。 如果没有这个,学习Java是相当困难的;不清楚为什么需要类。

为什么学习 Java 以及如何有效地学习 Java。 Yandex 报告

在我大二的时候,他们又教了Java core,但我并没有就此止步,我自己去学习Spring,写了一篇课程论文,我的项目,就是我上面提到的。 就这样,我去 Yandex 实习,通过了面试,进入了 Yandex.Market。 我在那里为 Beru(这是我们的市场)以及 Yandex.Market 本身编写了后端。

此后,六个月前,我调到同一市场内的另一个团队。 我们为业务合作伙伴进行分析。 我们在分析平台,后端有我们三个人,所以我对项目的影响力非常大。 实际上,这非常有趣。 也就是说,我们实际上为商业伙伴、大型知名公司提供市场上的数据——销售量是多少、品类是什么、型号是什么。 而且只有我们三个人,我们编写了这段代码,这非常酷。

谢谢你! 有用的链接:
- 《Java 8. 初学者指南》.
- 数据结构.
- SQL动物园.
- 数据库规范化.
- 设计模式.
- 设计模式.
- 干净的代码.
- 有效的Java.

来源: habr.com

添加评论