Java与其他流行语言有何不同? 为什么Java是学习的第一语言? 让我们制定一个计划,以帮助您从零开始学习Java和使用其他语言的编程技能。 我们列出了用Java创建生产代码和使用其他语言进行开发之间的区别。 Mikhail Zatepjakin在一次会议上阅读了此报告,以供Yandex和其他新手开发人员-Java Junior聚会的未来参与者使用。
-大家好,我叫Misha。 我是Yandex.Market的开发人员,今天我将告诉您为什么学习Java以及如何有效地学习Java。 您可以提出一个合理的问题:为什么我会告诉您,而不是一些经验丰富的强大开发人员? 事实是,我本人大约一年半前最近才学习Java,所以我仍然记得它的初衷和陷阱。
一年前,我在Yandex.Market实习。 为市场本身开发了一个“我接受”的后端,您可能会使用它。 现在,我继续在那里的另一个团队工作。 我们为业务合作伙伴提供Yandex.Market分析平台。

让我们开始吧。 为什么要从实际角度学习Java? 事实是Java是一种非常著名的编程语言。 他的社区很大。
例如,有一个TIOBE索引,这是编程语言的流行程度的流行索引,而Java在那儿排名第一。 另外,在有空缺的网站上,您可能会注意到大多数空缺都是与Java有关的,也就是说,使用Java开发时,您总能找到一份工作。
由于社区很大,因此您的任何问题都会在某些Stack Overflow或其他站点上得到解答。 在使用Java开发时,您实际上是使用JVM编写代码,因此可以轻松地转移到Kotlin,Scala和其他使用JVM的语言。

从意识形态的角度来看,Java有什么好处? 有不同的编程语言。 他们解决了不同的问题,您知道的。 例如,在Python中,编写单行脚本来解决快速任务非常好。
在专家方面,您可以完全控制可执行代码。 例如,我们驾驶汽车,Yandex无人驾驶汽车,它们的代码写在专业人士身上。 怎么了 Java有这样的东西-垃圾收集器。 它从不必要的对象中清除RAM。 这个东西自发地启动并停止运行,也就是说,它停止了程序的其余部分并开始计数对象,清除对象中的内存。 如果这样的事情可以在无人机上使用,那就不酷了。 您的无人机将直走,这时清除内存,而不是看着路。 因此,无人驾驶飞机是写在专家身上的。

Java解决什么任务? 这主要是用于开发已经编写了数十年,数百人的大型程序的语言。 特别是,Yandex.Market中的许多后端都是用Java编写的。 我们在多个城市设有分散的团队,每个城市十个人。 而且该代码易于维护,已经获得了十多年的支持,与此同时,新人们也开始了解此代码。
语言应具有什么特征,以便易于支持其代码并易于在大型团队中开发。 首先,它应该是可读的代码,并且应该容易在其上实现复杂的体系结构解决方案。 也就是说,在上面编写高级抽象应该很容易,等等。所有这些都为我们提供了Java。 这是一种面向对象的语言。 在其上实现高级抽象和复杂体系结构确实很容易。
还有许多用于Java的框架和库,因为该语言已有15年的历史了。 在这段时间里,所有可以写的东西都写在上面,因此有很多库对您有用。

我认为,初学者应该具备的主要技能是什么? 首先,这是Java核心语言的知识。 此外,它是任何依赖注入框架。 下一位发言人基里尔将更全面地讨论这一点。 我不会特别深入。 此外,它是架构和设计模式。 我们需要能够编写结构精美的代码来编写大型应用程序。 这是用于数据库任务的某种SQL或ORM。 而这更多地与后端有关。

走吧 Java核心。 在这里,我不会特别发现美国-您需要了解语言本身。 您要注意什么。 首先,Java近年来发布了很多版本,即在2014-2015年,发布了第七个版本,然后发布了第八个,第九个,第十个版本,发布了许多新版本,并且引入了很多很棒的新功能,例如Java Stream API。 ,lambda等。在生产代码中使用的非常酷,新鲜的东西,这些东西在面试时需要询问,您需要知道。 因此,您不应从Java-4库的书架上拿书,而是去学习它。 这样的计划:学习Java-8或更高版本。
我们会认真注意Stream API,var等创新,它们会在面试时问到并在生产中不断使用。 也就是说,Stream API比循环要凉爽得多,通常来说,这是一件很酷的事情。 请务必注意。
还有各种各样的事情,例如迭代器,异常等等。 在您自己编写一些小代码时,对您而言似乎不重要的事情。 您不需要这些异常,谁根本需要它们? 但是肯定会在面试时询问他们,它们在生产中绝对对您有用。 通常,值得注意Exception,迭代器和其他内容。

数据结构。 没有结构,无处不在,如果您不仅仅知道有设置的,字典的,工作表的纸张,那就太好了。 以及结构的不同实现。 例如,Java中的同一字典具有许多实现,包括HashMap和TreeMap。 它们具有不同的渐近线,它们在内部的排列不同。 您需要知道它们的区别以及何时使用。
如果您知道这些数据结构如何在内部工作,那也将很棒。 就是说,要知道他们的渐近性并不容易-赌注有效,段落有效以及内部结构如何工作-例如,HashMap中的存储桶是什么。
还值得关注树木和图表。 这些在生产代码中并不是很多,但是在访谈中很喜欢。 因此,您需要能够遍历树木,宽度,深度的图。 这些都是简单的算法。
一旦开始使用库和多类代码来编写庞大,复杂的代码,您就会意识到构建系统和解决依赖关系很困难。 这主要是Maven和Gradle。 它们使您可以真正地一行将库导入到项目中。 也就是说,您编写单行xml并导入到库项目中。 出色的系统。 它们大致相同,使用Maven或Gradle。
接下来是一些版本控制系统。 我推荐Git,因为它很流行,有大量的教程。 几乎每个人都在使用Git,这是一件很酷的事情,没有地方可用。
并且-一些开发环境。 我推荐IntelliJ Idea。 它极大地加快了开发过程,为您提供了很多帮助,每一个样板代码通常都会为您写的很酷。

的SQL 关于支持者的一些知识。 实际上,这是一个有趣的案例。 在我第二次实习面试的前两天,一个人力资源女孩给我打电话,说两天后他们会问我SQL和HTTP,我需要学习。 而且我既不了解SQL,也不了解HTTP。 而且我发现了一个很酷的网站
-SQLZOO 。 在它上面,我学习了12个小时的SQL,从某种意义上讲,它是SQL语法,如何编写SELECT查询,JOIN等。一个非常酷的网站,我强烈推荐它。 实际上,在12小时内,我学到了90%的知识。
了解数据库体系结构也很棒。 这些都是各种键,索引,规范化。 关于它,哈布雷(Habré)上有一系列帖子。

在Java中,除了SQL外,还有各种各样的对象关系映射系统,例如JPA。 有一些代码。 在第一种方法中,一些SQL代码是SELECT id name from info.users WHERE id IN userIds。 从用户数据库,从表中,接收其标识符和名称。
接下来,有一种映射器,可将对象从基础转换为Java对象。 下面是第三个方法,实际上,它执行此代码。 使用JPA的所有这些都可以替换为一行,如下所示。 她做同样的事情-找到All ByIdIn。 也就是说,通过方法的名称,它将为您生成一个SQL查询。
很酷的东西。 当我不了解SQL时,我自己使用了JPA。 一般来说,要注意。 如果您懒得学习SQL,请开火。 而且,一般来说,火!

春天 谁听说过诸如Spring框架之类的东西? 看到你们几个? 有充分的理由。 对于Java后端,Spring是每秒钟都要完成的工作。 没有它,实际上是无处可寻。 什么是春天? 这主要是一个依赖注入框架。 下一位发言人也
将对此进行讨论。 简而言之,这使您可以更轻松地将一个类的依赖项导入另一个类。 即,简化了依赖性的知识。
Spring Boot是Spring的一部分,使您可以一键启动服务器应用程序。 您转到THID,单击几个按钮,现在已在localhost 8080上启动了服务器应用程序。 也就是说,您没有编写任何代码,但是已经可以了。 很酷的东西。 如果您自己写东西,请开火!
Spring是一个非常大的框架。 它不仅引发您一个服务器应用程序,而且解决了依赖注入。 它允许您做很多事情,包括创建REST API方法。 也就是说,您编写了一些方法,将“获取映射”注释放在上面。 在这里,您已经在localhost上有了一些向您写入Hello world的方法。 两行代码,并且有效。 很酷的东西。
Spring还使编写测试变得更加容易。 无需以任何方式进行大规模开发测试。 该代码需要进行测试。 为此,Java有一个很棒的JUnit 5库,通常是JUnit,但最新版本是第五。 有用于测试的所有内容,各种断言和其他内容。
还有一个很棒的Mockito框架。 想象一下,您有一些要测试的功能。 功能性可以做很多事情,包括在中间的某个地方用您的标识符输入“ VKontakte”,并通过ID接收用户“ VKontakte”的名字和姓氏。 可能您不会在测试中输入VKontakte,这很奇怪。 但是您需要测试功能,因此您可以使用Mockito将该类模仿为mok。
您会说,带有此ID的请求带有此ID时,它将返回一些姓氏,例如Vasya Pupkin。 它将起作用。 也就是说,您将测试mok的所有功能的一种类。 很酷的东西。

设计模式。 这是什么 这些是解决典型开发问题的模式。 在开发中,经常会出现相同或相似的任务,这些问题对于很好地解决问题非常有用。 因此,人们想出了最佳实践,一些模式以及如何解决这些问题。
有一个网站上最受欢迎的模式-refactoring.guru,您可以阅读,了解什么是模式,阅读一些理论。 问题在于它实际上是无用的。 实际上,没有实践的模式并不是特别有益。
您将听到一些诸如Singletone或Builder的模式。 谁听过这些话? 很多人 您可以实现自己的简单模式。 但是大多数模式:策略,工厂,门面-尚不清楚将其应用于何处。
并且,除非您在实践中在某些外国代码中看到了应用此模式的位置,否则您将无法自己应用该模式。 因此,实践对于模式非常重要。 在refactoring.guru上阅读它们并没有多大帮助,但您必须这样做。

为什么需要模式? 让您拥有一些班级用户。 他有一个ID和一个名字。 每个用户必须同时具有ID和名称。 左上方-班级。
初始化用户有哪些方法? 构造器或设置器是两个选项。 两种方法的缺点是什么?
构造函数。 新用户(7,“绑定”),确定。 现在让我们说我们没有User类,但还有一些其他的具有七个数字字段的类。 您将拥有一个包含七个连续数字的构造函数。 目前尚不清楚这些数字是什么,其中哪些属于哪个财产。 构造函数不是很好。
第二个选项是二传手。 您可以清楚地写出:setId(7),setName(“债券”)。 您了解哪个属性属于哪个字段。 但是二传手有一个问题。 首先,您可能会忘记弹出一些东西,其次,您的对象变得易变。 这不是线程安全的,并且会稍微降低代码的可读性。 因此,人们想出了一个很酷的模式-Builder。

什么事啊 我们将尝试将两种方法(设置方法和构造方法)的优点合而为一。 我们创建一个特定的对象Builder,该对象还将具有Id和Name字段,该对象本身将基于setter进行构建,并且将具有一个Build方法,该方法将为您返回一个具有所有参数的新User。 我们得到了一个不变的对象和二传手。 好酷!
有什么问题? 在这里,我们有经典的Builder。 问题是我们仍然可以忘记填充某些字段。 而且,如果我们忘记填充标识符,在这种情况下,在Builder中,它将被初始化为零,因为int类型不可为空。 如果我们将名称设置为“ Bond”而忘记访问标识符,我们将拥有一个ID为“ 0”且名称为“ Bond”的新用户。 不酷
让我们尝试解决这个问题。 在Builder中,将int更改为int,以便它可以为空。 现在一切都很好。

如果我们尝试用“ Bond”作为用户名,而忘记给它提供一个ID,则将得到一个空指针异常,因为该ID不可为空,但是Builder具有空值,特别是指针异常。

但是我们仍然可以忘记输入名称,因此我们将对象重放附加为null。 现在,当我们从Builder构建对象时,它将检查该字段是否不可为空。 不仅如此。
让我们看最后一个例子。 在这种情况下,如果我们以某种方式在ID运行时中将null设置为null,那么很高兴马上知道您已执行此操作,并且现在就犯错也很酷。

您不需要在创建User时而是在将标识符设置为null时引发错误。 因此,我们在Builder中将设置器Integer更改为int,他立即在这里发誓将null抛出。
简而言之,有什么意义? 虽然有最简单的Builder模式,但即使其实现也有一些细微之处,因此查看模式的不同实现非常酷。 每个模式都有数十种实现。 这都很有趣。

我们如何在生产代码中编写Builder? 这是我们的用户。 我们将Builder旋转悬挂在Lombok库中,它本身会为我们生成Builder。 也就是说,我们不编写代码,但是Java已经相信该类具有一个Builder,因此我们可以这样称呼它。
我已经说过,在Java中,几乎所有东西都有库,包括Lombok,这是一个很酷的库,它使您无需编写样板文件。 生成器,GET。

有一些架构模式-不仅与一类有关,而且与整个系统有关。 系统设计中有一个很酷的原则:单一职责原则。 他在说什么 每个类必须对其某些功能负责的事实。 在这种情况下,我们有一个Controller与用户通信,即JSON对象。 有Facade,它将JSON对象转换为模型,并将继续与Java应用程序一起使用。 有一种服务,其中使用这些模型的逻辑很复杂。 有一个数据访问对象,该对象将这些模型放入数据库中并将其从数据库中删除。 还有数据库本身。 换句话说,并非所有这些都在同一个类中,但是我们创建了五个不同的类,这是另一种模式。

当您或多或少地学习过Java时,最好编写自己的项目,该项目中将有一个数据库,可与其他API一起使用,并为您的服务器应用程序提供REST API客户端。 在履历表中插入这样的东西将是很棒的,这对您的培训是很酷的结局。 这样,您就可以找到工作。

这是我的服务器应用程序的示例。 第二年,我和他们写了学期论文。 他们编写了一个用于组织事件的移动应用程序。 在那里,用户可以通过VKontakte登录,在地图上放置点,创建事件,在其上呼叫他们的朋友,保存事件的图像等。
我在项目中做了什么? 不使用SQL在Spring Boot上编写服务器应用程序。 我不认识他,我使用了JPA。 它能做什么? 通过OAuth-2登录到VK。 获取用户的令牌,与他一起去VK,检查这是真实用户。 通过VKontakte接收有关用户的信息。 它也可以通过JPA巧妙地将信息存储在数据库中。 熟练地将图片和其他文件保存在计算机内存中,并将指向它们的链接保存在数据库中。 我还不知道数据库中有CLOB对象,所以我是这样做的。 有一个用于用户,客户端应用程序的REST API。 并进行了基本功能的单元测试。
[...]我成功学习Java的一个小例子。 在我上大学的第一年,他们教给我C#,让我对OOP编程有了了解-类,接口,抽象是什么,为什么需要它们。 这对我很有帮助。 没有这些,学习Java就会非常困难,并且不清楚为什么需要类。

在大学的第二年,他们再次提供了Java核心,但我没有止步于此,自己去学习Spring并写了一个学期论文,这是我自己的项目,我在上面谈到过。 有了这些,我去了Yandex实习,接受了一次采访,进入了Yandex.Market。 在那儿,我为Beru(这是我们的市场)和Yandex.Market本身编写了一个后端。
之后,六个月前,我转到了同一市场内的另一个团队。 我们为业务合作伙伴进行分析。 我们处于分析平台中,后端有三个人,所以我对项目的影响很大。 实际上,这非常有趣。 也就是说,我们确实提供了市场数据-商业伙伴,大型知名公司的销售额,类别,模型。 我们只有三个人,我们编写这段代码,这非常酷。
谢谢你 有用的链接:
-
“ Java 8.面向初学者的指南 。
”-
数据结构 。
-SQLZOO 。
-
数据库标准化 。
-
设计模式 。
-
设计模式 。
- 清洁代码。- 有效的Java。