Por que aprender Java e como fazê-lo com eficiência. Relatório Yandex

Qual é a diferença entre Java e outras linguagens populares? Por que Java é a primeira linguagem a aprender? Vamos fazer um plano que ajudará você a aprender Java do zero e usando habilidades de programação em outras linguagens. Listamos as diferenças entre a criação de código de produção em Java e o desenvolvimento em outras linguagens. Mikhail Zatepjakin leu este relatório em uma reunião para futuros participantes do estágio da Yandex e outros desenvolvedores iniciantes - o encontro do Java Junior.


- Olá pessoal, meu nome é Misha. Sou desenvolvedor do Yandex.Market e hoje vou lhe dizer por que aprender Java e como fazê-lo de forma eficaz. Você pode fazer uma pergunta razoável: por que eu vou contar, e não algum desenvolvedor forte com um monte de anos de experiência? O fato é que eu mesmo estudei Java recentemente, há cerca de um ano e meio, então ainda me lembro de como era e quais são as armadilhas.

Há um ano, consegui um estágio na Yandex.Market. Desenvolvi um back-end para "eu aceito", para o próprio mercado, você provavelmente o usou. Agora continuo trabalhando lá, em outra equipe. Criamos a plataforma analítica Yandex.Market para parceiros de negócios.



Vamos começar. Por que aprender Java de um ponto de vista prático? O fato é que Java é uma linguagem de programação muito famosa. Ele tem uma comunidade muito grande.

Por exemplo, existe um índice TIOBE, um índice popular da popularidade das linguagens de programação, e o Java fica em primeiro lugar. Além disso, em sites com vagas, você provavelmente notará que a maioria das vagas é apenas sobre Java, ou seja, desenvolvendo em Java, você sempre pode encontrar um emprego.

Como a comunidade é muito grande, todas as suas perguntas serão respondidas em alguns Stack Overflow ou em outros sites. E, ao desenvolver em Java, você está realmente escrevendo código usando a JVM, para poder alternar facilmente para Kotlin, Scala e outras linguagens que usam a JVM.



O que o Java é bom do ponto de vista ideológico? Existem diferentes linguagens de programação. Eles resolvem problemas diferentes, você sabe disso. Por exemplo, no Python, é ótimo escrever scripts de linha única para resolver tarefas rápidas.

Para os profissionais, você pode controlar completamente o código executável. Por exemplo, dirigimos carros, veículos não tripulados Yandex, seu código está escrito nos profissionais. Porque Java tem uma coisa dessas - Garbage Collector. Ele limpa a RAM de objetos desnecessários. Essa coisa começa espontaneamente e faz parar o mundo, ou seja, para o resto do programa e vai contar objetos, limpar a memória dos objetos. Se algo assim funciona em um drone, não é legal. Seu drone continuará reto neste momento para limpar a memória e não olhar para a estrada. Portanto, o drone está escrito nos profissionais.



Quais tarefas o Java resolve? Esta é principalmente uma linguagem para o desenvolvimento de grandes programas que foram escritos há anos, dezenas ou centenas de pessoas. Em particular, muitos backend no Yandex.Market são escritos em Java. Temos uma equipe distribuída em várias cidades, dez pessoas cada. E o código é fácil de manter, é suportado por dez anos ou mais e, ao mesmo tempo em que novas pessoas chegam, elas entendem esse código.

Quais características uma linguagem deve ter para que o código seja facilmente suportado e seja fácil de desenvolver em grandes equipes. Antes de tudo, deve ser um código legível e fácil de implementar soluções arquiteturais complexas nele. Ou seja, deve ser fácil escrever abstrações de alto nível, etc. Tudo isso apenas nos fornece Java. Esta é uma linguagem orientada a objetos. É realmente fácil implementar abstrações de alto nível e arquiteturas complexas nele.

Também existem muitas estruturas e bibliotecas para Java, porque a linguagem tem mais de 15 anos. Durante esse período, tudo o que poderia ser escrito estava escrito nele, então há várias bibliotecas para tudo o que pode ser útil para você.



Quais são as principais habilidades, na minha opinião, um javista iniciante deve ter? Primeiro de tudo, esse é o conhecimento da linguagem principal do Java. Além disso, é qualquer estrutura de injeção de dependência. O próximo orador Kirill falará mais sobre isso. Eu não vou particularmente fundo. Além disso, são padrões de arquitetura e design. Precisamos ser capazes de escrever um código arquitetonicamente bonito para gravar aplicativos grandes. E isso é algum tipo de SQL ou ORM para tarefas de banco de dados. E isso é mais sobre o back-end.



Vamos lá! Núcleo Java. Aqui não vou descobrir especialmente a América - você precisa conhecer o próprio idioma. O que você deve prestar atenção. Em primeiro lugar, o Java lançou muitas versões nos últimos anos, ou seja, em 2014-2015, a sétima, depois a oitava, nona, décima, muitas novas versões foram lançadas e eles introduziram muitas novidades interessantes, por exemplo, a Java Stream API , lambda, etc. Coisas legais muito legais que são usadas no código de produção, que são solicitadas nas entrevistas e que você precisa saber. Portanto, você não deve pegar um livro de uma prateleira na biblioteca Java-4 e aprendê-lo. Tal plano: aprenda Java-8 ou superior.

Prestamos muita atenção a inovações como Stream API, var etc. Eles são solicitados em entrevistas e são constantemente usados ​​na produção. Ou seja, a API Stream é muito mais legal do que ciclos, em geral, uma coisa muito legal. Certifique-se de prestar atenção.

E há todo tipo de coisas como iteradores, exceções e assim por diante. O que lhe parece sem importância enquanto você escreve um código pequeno. Você não precisa dessas exceções, quem precisa delas? Mas eles definitivamente serão solicitados em entrevistas, eles definitivamente serão úteis para você na produção. Em geral, vale a pena prestar atenção às exceções, iteradores e outras coisas.



Estruturas de dados. Sem estruturas, em nenhum lugar, será ótimo se você não souber apenas que existem conjuntos, dicionário, folhas. E também diferentes implementações de estruturas. Por exemplo, o mesmo dicionário em Java tem muitas implementações, incluindo HashMap e TreeMap. Eles têm diferentes assintóticos, são organizados de maneira diferente por dentro. Você precisa saber como eles diferem, quando usar.

Também será ótimo se você souber como essas estruturas de dados funcionam por dentro. Ou seja, não é fácil conhecer seus assintóticos - quanto a aposta funciona, quanto a passagem funciona e como a estrutura interna funciona - por exemplo, o que é um balde no HashMap.

Também vale a pena prestar atenção em árvores e gráficos. Essas são coisas que não são muito numerosas no código de produção, mas são adoradas em entrevistas. Portanto, você precisa ser capaz de contornar árvores, gráficos em largura, profundidade. Todos esses são algoritmos simples.

Assim que você começar a escrever código de alguma forma grande, complexo, usando bibliotecas e códigos de várias classes, perceberá que é difícil construir sistemas e resolver dependências. Isto é principalmente Maven e Gradle. Eles permitem importar bibliotecas para o seu projeto realmente em uma linha. Ou seja, você escreve xml de linha única e importa no projeto da biblioteca. Grandes sistemas. Eles são praticamente iguais, use Maven ou Gradle.

Em seguida é um sistema de controle de versão. Eu recomendo o Git porque é popular, há muitos tutoriais. Quase todo mundo usa o Git, uma coisa legal, sem ele em qualquer lugar.

E - algum ambiente de desenvolvimento. Eu recomendo o IntelliJ Idea. Ele acelera bastante o processo de desenvolvimento, ajuda muito, todo código padronizado escreve para você, em geral, legal.


Links do slide: SQLZOO , Habrapost

SQL Um pouco sobre os backenders. Aqui, de fato, havia um caso engraçado. Dois dias antes da minha segunda entrevista de estágio, uma garota de RH me ligou e disse que em dois dias eles me perguntariam SQL e HTTP, eu preciso aprender. E eu não sabia sobre SQL nem HTTP sobre nada. E eu achei um site tão legal - SQLZOO . Nele, aprendi SQL por 12 horas, no sentido, sintaxe SQL, como escrever consultas SELECT, JOIN etc. Um site muito legal, eu recomendo. Na verdade, em 12 horas, aprendi 90% do que sei agora.

Também é ótimo conhecer a arquitetura do banco de dados. Estes são todos os tipos de chaves, índices, normalização. Sobre isso, há uma série de posts sobre Habré.



Em Java, além do SQL, existem todos os tipos de sistemas de mapeamento objeto-relacional, como o JPA. Existe algum código. No primeiro método, algum código SQL é SELECT id name FROM info.users WHERE id IN userIds. Do banco de dados dos usuários, da tabela, seus identificadores e nomes são recebidos.

A seguir, existe um tipo de mapeador que transforma um objeto de uma base em um objeto Java. E há um terceiro método abaixo, que, de fato, executa esse código. Tudo isso usando JPA pode ser substituído por uma linha, que está escrita abaixo. Ela faz a mesma coisa - encontre All ByIdIn. Ou seja, pelo nome do método, ele gera uma consulta SQL para você.

Coisas muito legais. Quando não conhecia SQL, usei o JPA. Em geral, preste atenção. Se você está com preguiça de aprender SQL - fogo. E, em geral, fogo!



Primavera Quem já ouviu falar de algo como o framework Spring? Viu quantos de vocês? Por uma boa razão. O Spring está nos requisitos de cada segundo trabalho para back-end Java. Sem ele, não há realmente nenhum lugar para ser desenvolvido. O que é a primavera? Essa é principalmente uma estrutura de injeção de dependência. O próximo orador também falará sobre isso. Mas, resumindo, isso permite facilitar a importação das dependências de uma classe para outra. Ou seja, o conhecimento das dependências é simplificado.

O Spring Boot é um pedaço do Spring que permite aumentar o aplicativo do servidor com um clique. Você acessa o THID, clica em alguns botões e agora o aplicativo do servidor foi criado no host local 8080. Ou seja, você não escreveu uma única linha de código, mas ela já funciona. Coisas muito legais. Se você escrever algo de sua preferência, atire!

A primavera é uma estrutura muito grande. Isso não apenas gera um aplicativo de servidor e resolve a injeção de dependência. Ele permite que você faça um monte de tudo, incluindo a criação de métodos da API REST. Ou seja, você escreveu algum método, coloque a anotação Get mapping nele. E aqui você já tem algum método no host local que escreve Hello world para você. Duas linhas de código e funciona. Coisas legais.

A primavera também facilita os testes de gravação. Sem testar em um grande desenvolvimento de qualquer forma. O código precisa ser testado. Para isso, o Java possui uma biblioteca legal do JUnit 5. E geralmente o JUnit, mas a versão mais recente é a quinta. Há tudo para testar, todo tipo de afirmações e outras coisas.

E existe uma estrutura impressionante do Mockito. Imagine que você tem alguma funcionalidade que deseja testar. A funcionalidade faz muitas coisas, incluindo em algum lugar no meio que ele digita "VKontakte" com seu, por exemplo, um identificador e recebe o nome e o sobrenome do usuário "VKontakte" por ID. Provavelmente, você não entrará no VKontakte nos testes, isso é estranho. Mas você precisa testar a funcionalidade, para que esta classe, usando o Mockito, a torne imitada.

Você dirá que, quando uma solicitação vem com esse ID, ele retorna um sobrenome, por exemplo, Vasya Pupkin. E vai funcionar. Ou seja, você testará toda a funcionalidade do mok para um tipo de classe. Coisas muito legais.


Link do slide

Padrões de design. O que é isso Esses são padrões para resolver problemas típicos de desenvolvimento. No desenvolvimento, muitas vezes surgem as mesmas tarefas ou tarefas similares que seriam ótimas para resolver de algum modo bem. Portanto, as pessoas apresentaram as melhores práticas, alguns padrões, como resolver esses problemas.

Existe um site com padrões mais populares - refactoring.guru, você pode ler, descobrir o que são padrões, ler um monte de teoria. O problema é que é praticamente inútil. De fato, padrões sem prática não são de benefício particular.

Você ouvirá sobre alguns padrões como Singletone ou Builder. Quem ouviu essas palavras? Muita gente Existem padrões tão simples que você pode se implementar. Mas a maioria dos padrões: estratégia, fábrica, fachada - não está claro onde aplicá-los.

E até ver na prática, em algum código estrangeiro, o local ao qual esse padrão é aplicado, você não poderá aplicá-lo. Portanto, a prática é muito importante com os padrões. E apenas ler sobre eles em refactoring.guru não é super útil, mas você deve fazê-lo.



Por que os padrões são necessários? Deixe você ter alguma classe de usuário. Ele tem um ID e um nome. Cada usuário deve ter ID e nome. Classe superior esquerda.

Quais são as maneiras de inicializar o usuário? Duas opções são um construtor ou um levantador. Quais são as desvantagens de ambas as abordagens?

Construtor. novo usuário (7, "Bond"), ok. Agora, digamos que não temos uma classe User, mas alguma outra, com sete campos numéricos. Você terá um construtor no qual existem sete números consecutivos. Não está claro quais são esses números, qual deles pertence a qual propriedade. O construtor não é ótimo.

A segunda opção é setter. Você escreve claramente: setId (7), setName ("Bond"). Você entende qual propriedade pertence a qual campo. Mas o setter tem um problema. Em primeiro lugar, você pode esquecer de exibir algo e, em segundo lugar, seu objeto acaba sendo mutável. Isso não é seguro para threads e reduz um pouco a legibilidade do código. Portanto, as pessoas criaram um padrão interessante - Builder.



Sobre o que é isso? Vamos tentar coletar as vantagens de ambas as abordagens - setter e construtor - em uma. Criamos um determinado objeto, o Builder, que também terá os campos Id e Name, que serão criados com base no setter e que terão um método Build que retornará um novo usuário com todos os parâmetros. Temos um objeto imutável e um setter. Legal!

Quais são os problemas? Aqui temos o clássico Builder. O problema é que ainda podemos esquecer de preencher algum campo. E se esquecermos de preencher um identificador, nesse caso no Builder, ele será inicializado como zero, porque o tipo int não é nulo. E se criarmos o nome "Bond" e esquecermos de visitar o identificador, teremos um novo usuário com o ID "0" e o nome "Bond". Não é legal.

Vamos tentar combater isso. No Builder, altere int para int para que seja anulável. Agora está tudo ótimo.



Se tentarmos criar Usuário com o nome “Bond”, esquecendo de fornecer um ID, obteremos uma exceção de ponteiro nulo, porque o ID não é anulável, mas o Builder possui nulo, especificamente uma exceção de ponteiro.



Mas ainda podemos esquecer de colocar o nome, portanto anexamos a repetição do objeto a nulo. Agora, quando construímos nosso objeto a partir do Builder, ele verifica se o campo não é anulável. E isso não é tudo.

Vejamos o último exemplo. Nesse caso, se de alguma forma definirmos nulo no tempo de execução do ID, seria ótimo saber imediatamente que você fez isso e não é legal que você esteja cometendo um erro no momento.



Você precisa gerar um erro não no momento da criação do usuário, mas quando define nulo para o identificador. Portanto, no Construtor, alteraremos o setter Integer para int e ele imediatamente jura aqui que lançou nulo.

Em suma, qual é o objetivo? Existe o padrão mais simples do Builder, mas mesmo sua implementação possui algumas sutilezas, por isso é muito legal ver diferentes implementações dos padrões. Cada padrão possui dezenas de implementações. Tudo isso é muito interessante.



Como escrevemos o Builder no código de produção? Aqui está o nosso usuário. Penduramos a rotação do Builder da biblioteca Lombok e ela mesma nos gera o Builder. Ou seja, não escrevemos código, mas o Java já acredita que essa classe possui um Builder, e podemos chamá-lo assim.

Eu já disse que em Java existem bibliotecas para quase tudo, incluindo o Lombok, uma biblioteca legal que permite que você não escreva um boilerplate. Construtor, GET.



Existem padrões arquiteturais - relacionados não apenas a uma classe, mas ao sistema como um todo. Existe um princípio tão legal no design do sistema: Princípio de responsabilidade única. Do que ele está falando? O fato de que cada classe deve ser responsável por algumas de suas funcionalidades. Nesse caso, temos um controlador que se comunica com os usuários, objetos JSON. Há o Facade, que converte objetos JSON em modelos, que continuará a trabalhar com o aplicativo Java. Existe um serviço no qual existe uma lógica complexa trabalhando com esses modelos. Há um objeto de acesso a dados, que coloca esses modelos no banco de dados e os remove do banco de dados. E existe o próprio banco de dados. Em outras palavras, nem tudo isso está na mesma classe, mas fazemos cinco classes diferentes, e esse é outro padrão.



Quando você aprende Java mais ou menos, é ótimo escrever algum tipo de seu próprio projeto, no qual haverá um banco de dados, trabalhará com outras APIs e fornecerá seu aplicativo de servidor aos clientes da API REST. Será ótimo inserir isso no currículo, este é um final interessante para o seu treinamento. Com isso, você pode ir e conseguir um emprego.



Aqui está um exemplo do meu aplicativo de servidor. No segundo ano, escrevi um artigo com os rapazes. Eles escreveram um aplicativo móvel para organizar eventos. Lá, os usuários podem fazer login via VKontakte, colocar pontos no mapa, criar eventos, chamar seus amigos, salvar a imagem dos eventos etc.

O que eu fiz no projeto? Escreveu um aplicativo de servidor no Spring Boot sem usar SQL. Eu não o conhecia, usei o JPA. O que é capaz de fazer? Efetue login na VK através do OAuth-2. Pegue o token do usuário, vá com ele para o VK, verifique se este é um usuário real. Receba informações sobre usuários através do VKontakte. Ele habilmente armazena informações em um banco de dados, também através do JPA. Salve habilmente fotos e outros arquivos na memória do computador e salve links para eles no banco de dados. Ainda não sabia que havia objetos CLOB no banco de dados, então fiz dessa maneira. Havia uma API REST para usuários, aplicativos clientes. E havia testes de unidade para funcionalidade básica.

[...] Um pequeno exemplo do meu aprendizado bem-sucedido de Java. No meu primeiro ano na universidade, eles me ensinaram C # e me deram um entendimento sobre a programação OOP - o que são aulas, interfaces, abstração, por que são necessárias. Isso me ajudou muito. Sem isso, aprender Java é bastante difícil, não está claro por que as classes são necessárias.



No meu segundo ano na universidade, eles novamente deram o núcleo de Java, mas eu não parei por aí, fui estudar Spring e escrevi um artigo, meu próprio projeto, sobre o qual falei acima. E com tudo isso, fui para um estágio na Yandex, passei por uma entrevista, entrei no Yandex.Market. Lá, escrevi um back-end para Beru, este é o nosso mercado e para o próprio Yandex.Market.

Depois disso, há seis meses, fui transferido para outra equipe dentro do mesmo mercado. Fazemos análises para parceiros de negócios. Estamos na plataforma analítica, somos três no back-end, por isso tenho uma parcela muito grande da influência no projeto. Isso é muito interessante, na verdade. Ou seja, realmente fornecemos dados de mercado - quais vendas, em quais categorias, em quais modelos, para parceiros de negócios, grandes empresas bem conhecidas. E somos apenas três, escrevemos esse código e é muito legal.

Obrigada Links úteis:
- "Java 8. Um guia para iniciantes . "
- estruturas de dados .
- SQLZOO .
- Normalização de bancos de dados .
- Padrões de design .
- Padrões de design .
- Código limpo .
Effective Java .

Source: https://habr.com/ru/post/pt481688/


All Articles