Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Como o Java é diferente de outras linguagens populares? Por que Java deveria ser a primeira linguagem a ser aprendida? Vamos criar um plano que o ajudará a aprender Java do zero e aplicando habilidades de programação em outras linguagens. Vamos listar as diferenças entre criar código de produção em Java e desenvolver em outras linguagens. Mikhail Zatepyakin leu este relatório em uma reunião para futuros participantes estágios Yandex e outros desenvolvedores iniciantes - encontro Java Junior.


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

Há um ano consegui um estágio no Yandex.Market. Desenvolvi o backend para o Beru, para o próprio Market, provavelmente você já usou. Agora continuo trabalhando lá, em uma equipe diferente. Criamos uma plataforma analítica para Yandex.Market para parceiros de negócios.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

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

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

Como a comunidade é muito grande, qualquer dúvida que você tiver encontrará resposta em algum Stack Overflow ou em outros sites. Além disso, ao desenvolver em Java, você está, na verdade, escrevendo código na JVM, para poder mudar facilmente para Kotlin, Scala e outras linguagens que usam a JVM.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

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

O lado positivo é que você pode controlar totalmente o código executável. Por exemplo, temos carros, carros Yandex sem motorista, seu código está escrito em pontos positivos. Por que? Java tem uma coisa dessas - Garbage Collector. Limpa a RAM de objetos desnecessários. Essa coisa começa espontaneamente e faz stop-the-world, ou seja, para o resto do programa e vai contar objetos, limpar memória de objetos. Se tal coisa funcionar em um drone, não é legal. Seu drone irá dirigir em linha reta, neste momento limpará sua memória e não olhará para a estrada. Portanto, o drone está escrito nos profissionais.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Que problemas o Java resolve? É principalmente uma linguagem para desenvolver grandes programas que são escritos ao longo dos anos, por dezenas ou centenas de pessoas. Em particular, grande parte do back-end do Yandex.Market é escrito em Java. Temos uma equipe distribuída em diversas cidades, dez pessoas em cada uma. E o código é fácil de manter, tem suporte há dez anos ou mais, e ao mesmo tempo novas pessoas chegam e entendem esse código.

Quais características uma linguagem deve ter para que o código nela contido seja facilmente suportado e possa ser facilmente desenvolvido em grandes equipes. Em primeiro lugar, deve ser um código legível e fácil de implementar soluções arquitetônicas complexas. Ou seja, deve ser fácil escrever abstrações de alto nível, etc. Tudo isso é o que Java nos fornece. Esta é uma linguagem orientada a objetos. É realmente fácil implementar abstrações de alto nível e arquiteturas complexas.

Existem também muitos frameworks e bibliotecas para Java, porque a linguagem tem mais de 15 anos. Durante esse tempo, tudo o que poderia ser escrito foi escrito nele, então existem inúmeras bibliotecas para tudo que você precisa.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Quais habilidades básicas, na minha opinião, um jogador iniciante de JA deve ter? Em primeiro lugar, trata-se do conhecimento da linguagem central Java. A seguir está algum tipo de estrutura de injeção de dependência. O próximo palestrante, Kirill, falará sobre isso de forma mais completa. Não irei muito fundo. Em seguida estão os padrões de arquitetura e design. Precisamos ser capazes de escrever códigos arquitetonicamente bonitos para escrever aplicações grandes. E isso é algum tipo de SQL ou ORM para tarefas de trabalho com banco de dados. E isso se aplica mais ao back-end.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Ir! Núcleo Java. Eu realmente não vou descobrir a América aqui – você precisa conhecer o idioma em si. 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 foi lançada a sétima, depois a oitava, a nona, a décima, muitas versões novas e muitas coisas novas legais foram introduzidas nelas , por exemplo, Java Stream API , lambda, etc. Coisas muito legais, frescas e legais que são usadas no código de produção, o que perguntam nas entrevistas e o que você precisa saber. Portanto, você não deve pegar um livro da estante da biblioteca Java-4 e ir aprendê-lo. Este é o nosso plano: aprendemos Java-8 ou superior.

Prestamos muita atenção a inovações como Stream API, var, etc. Elas são solicitadas durante entrevistas e são constantemente utilizadas na produção. Ou seja, a API Stream é muito mais legal que os loops, 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. Coisas que parecem sem importância para você, desde que você mesmo escreva alguns pequenos códigos. Você não precisa dessas exceções, quem precisa delas, afinal? Mas com certeza serão questionados em entrevistas, com certeza serão úteis para você na produção. Em geral, você deve prestar atenção a Exceções, iteradores e outras coisas.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Estruturas de dados. Você não pode ficar sem estruturas, mas será ótimo se você não souber apenas que existem conjuntos, dicionários e planilhas. E também diferentes implementações de estruturas. Por exemplo, o mesmo dicionário em Java possui muitas implementações, incluindo HashMap e TreeMap. Eles têm assintóticos diferentes, são estruturados de maneira diferente por dentro. Você precisa saber como eles diferem e quando usar qual deles.

Também será muito legal se você souber como essas estruturas de dados funcionam internamente. Ou seja, não é fácil saber sua assintótica - quanto funciona a aposta, quanto tempo funciona o passe, mas como funciona a estrutura interna - por exemplo, o que é um balde no HashMap.

Também vale a pena prestar atenção às árvores e aos gráficos. Essas são coisas que não são muito comuns no código de produção, mas são populares em entrevistas. Conseqüentemente, você precisa ser capaz de percorrer árvores e gráficos em largura e profundidade. Todos esses são algoritmos simples.

Assim que você começar a escrever qualquer código grande, complexo, usando bibliotecas, código multiclasse, você perceberá que é difícil para você construir sistemas e resolver dependências. Estes são principalmente Maven e Gradle. Eles permitem importar bibliotecas para o seu projeto em uma linha. Ou seja, você escreve um xml de uma linha e importa bibliotecas para o projeto. Ótimos sistemas. Eles são aproximadamente iguais, use um deles - Maven ou Gradle.

Próximo - algum tipo de sistema de controle de versão. Eu recomendo o Git porque é popular e há muitos tutoriais. Quase todo mundo usa Git, é uma coisa legal, você não consegue viver sem ele.

E algum tipo de ambiente de desenvolvimento. Eu recomendo o IntelliJ Idea. Ele agiliza muito o processo de desenvolvimento, ajuda muito, escreve todo o código padrão para você, em geral é legal.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Links do slide: SQLZOO, habrapost

SQL. Um pouco sobre backends. Na verdade, houve um caso engraçado aqui. Dois dias antes da minha segunda entrevista de estágio, uma garota do RH me ligou e disse que em dois dias iriam me perguntar sobre SQL e HTTP, eu precisava aprender. E eu não sabia quase nada sobre SQL ou HTTP. E encontrei este site legal - SQLZOO. Aprendi SQL nele em 12 horas, quer dizer, sintaxe SQL, como escrever consultas SELECT, JOIN, etc. Site muito legal, recomendo fortemente. Na verdade, em 12 horas aprendi 90% do que sei agora.

E também é ótimo conhecer a arquitetura do banco de dados. São todos os tipos de chaves, índices, normalização. Há uma série de posts sobre isso no Habré.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

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

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

Coisa muito legal. Eu mesmo, quando não conhecia SQL, usava JPA. Em geral, preste atenção. Se você tem preguiça de aprender SQL, é um desastre. E, em geral, fogo!

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Primavera. Quem já ouviu falar de algo como a estrutura Spring? Você vê quantos de vocês existem? Não sem razão. Spring está incluído nos requisitos de cada segunda vaga de back-end Java. Sem ele, realmente não há lugar nenhum para um grande desenvolvimento. O que é a primavera? Em primeiro lugar, esta é uma estrutura de injeção de dependência. Sobre isso também irá dizer próximo orador. Mas, resumindo, isso permite facilitar a importação das dependências de algumas classes para outras. Ou seja, o conhecimento das dependências é simplificado.

Spring Boot é uma parte do Spring que permite executar seu aplicativo de servidor com um botão. Você vai para o THID, pressiona alguns botões e agora seu aplicativo de servidor está instalado e funcionando no localhost 8080. Ou seja, você ainda não escreveu uma única linha de código, mas já está funcionando. Coisa muito legal. Se você escrever algo de sua autoria, atire!

Spring é uma estrutura muito grande. Ele não apenas pega seu aplicativo de servidor e resolve a injeção de dependência. Ele permite que você faça várias coisas, incluindo a criação de métodos REST API. Ou seja, você escreveu algum método e anexou a anotação de mapeamento Get a ele. E agora você já tem algum método no localhost que escreve Hello world para você. Duas linhas de código e funciona. Coisas legais.

O Spring também facilita a escrita de testes. Não há como sem testar em grande desenvolvimento. O código precisa ser testado. Para isso, Java possui uma biblioteca bacana JUnit 5. E JUnit em geral, mas a versão mais recente é a quinta. Há tudo para testar, todo tipo de afirmações e outras coisas.

E há uma estrutura Mockito incrível. Imagine que você tem alguma funcionalidade que deseja testar. A funcionalidade faz muitas coisas, inclusive, em algum lugar intermediário, faz login no VKontakte com seu ID, por exemplo, e recebe o nome e o sobrenome do usuário VKontakte do ID. Você provavelmente não incluirá o VKontakte nos testes, isso é estranho. Mas você precisa testar a funcionalidade, então você fez essa classe, usando o Mockito, mok, imitando.

Você dirá que quando uma solicitação chega a esta classe com um ID tal e tal, ela retorna algum sobrenome, por exemplo, Vasya Pupkin. E vai funcionar. Ou seja, você testará todas as funcionalidades do mok one class. Coisa muito legal.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Link do slide

Padrões de design. O que é isso? Estes são modelos para resolver problemas típicos que surgem no desenvolvimento. No desenvolvimento, muitas vezes surgem problemas idênticos ou semelhantes que seria ótimo resolver de alguma forma. Portanto, as pessoas criaram melhores práticas, certos modelos, sobre como resolver esses problemas.

Existe um site com os padrões mais populares - refactoring.guru, você pode lê-lo, descobrir quais padrões existem, ler um monte de teoria. O problema é que é praticamente inútil. Na verdade, os padrões sem prática não são particularmente úteis.

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

E até que você veja na prática no código de outra pessoa um local ao qual esse padrão é aplicado, você não será capaz de aplicá-lo sozinho. Portanto, a prática é muito importante com os padrões. E apenas ler sobre eles em refactoring.guru não é muito útil, mas definitivamente vale a pena fazer.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Por que os padrões são necessários? Digamos que você tenha uma determinada classe de usuário. Tem um ID e um nome. Cada usuário deve ter um ID e um nome. No canto superior esquerdo está a sala de aula.

Quais são as maneiras de inicializar o usuário? Existem duas opções: um construtor ou um setter. 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 sim alguma outra, com sete campos numéricos. Você terá um construtor contendo sete números consecutivos. Não está claro quais são esses números e quais deles pertencem a qual propriedade. O designer não é ótimo.

A segunda opção é 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 atribuir algo e, em segundo lugar, seu objeto acaba sendo mutável. Isso não é thread-safe e reduz ligeiramente a legibilidade do código. É por isso que as pessoas criaram um padrão legal - Builder.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Do que se trata? Vamos tentar combinar as vantagens de ambas as abordagens – setter e construtor – em uma. Criamos um determinado objeto, Builder, que também terá os campos Id e Name, que será construído com base no setter, e que terá um método Build que retorna um novo usuário com todos os parâmetros. Obtemos 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 verificar algum campo. E se esquecemos de visitar o ID, neste caso no Builder ele é inicializado com zero, pois o tipo int não é anulável. E se fizermos o Nome “Bond” e esquecermos de visitar o escritório de identificação, teremos um novo Usuário com id “0” e o nome “Bond”. Não é legal.

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

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

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

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Mas ainda podemos esquecer de colocar um nome, então definimos a reprodução do objeto como nula. 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 colocarmos null 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 agora.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Você precisa gerar um erro não no momento da criação do usuário, mas ao definir null como o ID. Portanto, no Builder mudaremos o setter Integer para int, e ele imediatamente jurará que foi descartado nulo.

Em suma, qual é o objetivo? Existe um padrão simples do Builder, mas até sua implementação possui algumas sutilezas, então é muito legal observar diferentes implementações de padrões. Cada padrão possui dezenas de implementações. Tudo isso é muito interessante.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Como escrevemos o Builder no código de produção? Aqui está nosso usuário. Anexamos a ele uma rotação do Builder da biblioteca Lombok, e ele próprio gera um Builder para nós. Ou seja, não escrevemos nenhum código, mas o Java já pensa que essa classe tem um Builder, e podemos chamá-la assim.

Eu já disse que Java tem bibliotecas para quase tudo, inclusive Lombok, uma biblioteca legal que permite evitar escrever clichês. Construtor, GET.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Os padrões podem ser arquitetônicos – relacionados não apenas a uma classe, mas ao sistema como um todo. Existe um princípio muito interessante no design de sistemas: Princípio da Responsabilidade Única. Do que ele está falando? O fato de que cada classe deve ser responsável por algumas de suas próprias funcionalidades. Neste caso, temos um Controller que se comunica com os usuários, objetos JSON. Existe o Façade, que converte objetos JSON em modelos com os quais o aplicativo Java irá trabalhar. Existe um Serviço que possui uma lógica complexa que funciona com esses modelos. Existe um objeto de acesso a dados que coloca esses modelos no banco de dados e os recupera do banco de dados. E há o próprio banco de dados. Em outras palavras, não está tudo em uma turma, mas estamos fazendo cinco turmas diferentes, e esse é outro padrão.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Depois de aprender mais ou menos Java, é ótimo escrever seu próprio projeto que terá um banco de dados, trabalhar com outras APIs e expor seu aplicativo de servidor a clientes da API REST. Isso seria ótimo para adicionar ao seu currículo, seria um final legal para sua educação. Com isso você pode ir e conseguir um emprego.

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

Aqui está um exemplo do meu aplicativo de servidor. No meu segundo ano, escrevi um trabalho final com os rapazes. Eles estavam escrevendo um aplicativo móvel para organização de eventos. Lá, os usuários podiam fazer login via VKontakte, colocar pontos no mapa, criar eventos, convidar amigos para eles, salvar imagens de 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 JPA. O que isso poderia fazer? Faça login no VK via OAuth-2. Pegue o token do usuário, vá até o VK com ele, verifique se é um usuário real. Receba informações sobre os usuários através do VKontakte. Foi possível salvar as informações em um banco de dados, também através do JPA. Salve fotos e outros arquivos com habilidade na memória do computador e salve links para eles no banco de dados. Naquela época eu não sabia que existiam objetos CLOB no banco de dados, então fiz desta forma. Havia uma API REST para usuários, aplicativos clientes. E houve testes unitários para funcionalidades básicas.

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

Por que aprender Java e como fazê-lo de forma eficaz. Relatório Yandex

No meu segundo ano na universidade, eles ensinaram novamente Java core, mas não parei por aí, fui estudar Spring sozinho e escrevi um trabalho de curso, meu projeto, que mencionei acima. E com tudo isso, fiz um estágio no Yandex, passei em uma entrevista e entrei no Yandex.Market. Lá escrevi o backend para Beru, este é o nosso mercado, e para o próprio Yandex.Market.

Depois disso, há seis meses, fui transferido para outra equipe do mesmo Mercado. Fazemos análises para parceiros de negócios. Estamos na plataforma analítica, somos três no backend, então tenho uma grande influência no projeto. É muito interessante, na verdade. Ou seja, na verdade fornecemos dados de mercado - quais são as vendas, em quais categorias, em quais modelos, para parceiros de negócios, grandes empresas conhecidas. E somos apenas três, escrevemos esse código e é muito legal.

Obrigado! Links Úteis:
- "Java 8. Guia para iniciantes".
- Estruturas de dados.
- SQLZOO.
- Normalização de banco de dados.
- Padrões de design.
- Padrões de design.
- Código Limpo.
- Java eficaz.

Fonte: habr.com

Adicionar um comentário