JAVA é criminalmente subestimado

O ponto de vista de um estudante ignorante de ciência da computação



imagem




Você provavelmente leu o título deste post e pensou: “O que esse cara está fumando? Java está em todo lugar! " Você está certo, Java ainda domina o setor e capacita alguns dos maiores aplicativos de missão crítica do mundo. Mas a propagação do Java não é o que estou falando, estou falando sobre o hype em torno disso. Passo muito tempo com programadores inexperientes. O que os programadores inexperientes gostam de fazer? Esteja ansioso e confiante em ferramentas como linguagens de programação. Nenhum dos alunos de CS que conheci admira Java, e acho que não deveria ser assim.



Desenvolvedores jovens / ingênuos (eu inclusive) freqüentemente caem na armadilha de fetichizar novas linguagens e ferramentas em detrimento do desempenho e da sanidade. Antes de trabalhar na Halp (agora de propriedade de $ TEAM), eu tinha um relacionamento quase romântico com o TypeScript do lado do servidor. Achei o ecossistema node.js a coisa mais legal: adorei a ideia de código transpilado, depuração em tempo real, uma enorme biblioteca de pacotes e até sistemas de construção estranhos e fragmentados. Quando eu realmente o usei no desenvolvimento e falei com engenheiros mais experientes, a magia desapareceu rapidamente.



Eu tinha um apego irracional ao ecossistema JS porque era uma coisa nova e quente; foi exagero. A realidade não correspondeu às minhas expectativas. Hoje eu gosto das coisas maravilhosas que espero do JavaScript à medida que ganho experiência com o Java. Eu me sinto enganado porque o hype não me levou a Java antes. Java é divertido de escrever, produtivo e goza de uma reputação injusta de dinossauro entre os novos desenvolvedores.



Ergonomia é o que torna Java uma ótima linguagem de programação



Isso não deve ser subestimado: Java é simplesmente um prazer de escrever. Isso se deve em grande parte à habilidade que a JetBrains coloca no IntelliJ IDEA. Tudo é preenchido automaticamente, pular para a definição é rápido, usar find funciona bem e a refatoração é fácil. No entanto, onde o Java realmente brilha é na experiência dos desenvolvedores com bibliotecas de terceiros.



Dependência pesada da carga de trabalho e tendências do setor



Minha experiência é limitada, mas sinto que o vento moveu-se para a liberalização das dependências externas. Não inventado Aqui não está mais na moda, Não inventado Há na moda . Em particular, os desenvolvedores de JavaScript são mais propensos a incluir bibliotecas de terceiros, mesmo para operações triviais, como preencher o número à esquerda . Não acho que o anexo atual às dependências de terceiros seja particularmente prejudicial, mas as alterações da API no upstream podem prejudicar as bases de código JS / Python não digitadas.



Ao usar bibliotecas de terceiros em Java, você sempre sabe exatamente quais tipos precisa passar para um método. Mais importante ainda, o uso indevido da função resultará em linhas onduladas vermelhas em seu editor. Considerando que as bibliotecas são amplamente utilizadas, acho que mais pessoas deveriam estar entusiasmadas com Java.



A discagem nominal economiza tempo



Dinâmico / implícito / fraco / qualquer tipo tem uma série de desvantagens. Quando uma dependência altera o método da API e seu aplicativo trava no tempo de execução em vez de no tempo de construção, isso é um problema. Quando um desenvolvedor precisa voltar à implementação de um método para descobrir quais tipos passar, é uma perda de tempo. As dicas de tipo TypeScript e Python tratam disso um pouco, mas não têm a capacidade de verificar os tipos passados ​​em tempo de execução sem código adicional.



A proteção de tipo é meu recurso menos favorito do TypeScript. Basicamente, essa é uma tipagem implícita que você mesmo deve implementar e confiar que seja implementada corretamente. Na minha opinião, esse é o pior dos dois mundos. Considere o seguinte:



interface Dog {
    bark: () => void;
}

/* The developer has to manually implement
a heuristic check for interface adherence!
When they update the interface, they have
to update the type guards too! */
function isDog(pet: object): pet is Dog {
  return (pet as Dog).bark !== undefined;
}
const dog: any = {bark: () => console.log('woof')};

if (isDog(dog)) {
    // TS now knows that objects within this if statement are always type Dog
    // This is because the type guard isDog narrowed down the type to Dog
    dog.bark();
}
      
      





Há algo sobre a declaração de tipo AND da necessidade de escrever lógica de validação para o tipo especificado que realmente me preocupa. O código acima parece que alguém estava usando a ferramenta errada.



Ao contrário das definições do TypeScript, os sistemas de tipo nominal do Java aliviam a carga do cérebro do programador cristalizando as definições de tipo e garantindo proteção de tipo padrão.



Remoção da responsabilidade pela otimização



Os desenvolvedores Java podem confiar na JVM para fazer os melhores aplicativos. Esteja eles implementando um aplicativo multithread ou armazenando uma grande quantidade de dados no heap, eles podem ter certeza de que não serão atingidos por gerenciamento de memória ou corrida de dados. Esta é principalmente uma vantagem sobre o C ++, que contém muitas armas de fogo.



Isso faz parte da experiência ergonômica do Java. Quando um desenvolvedor precisa se preocupar menos com detalhes técnicos, ele pode se concentrar mais no problema atual.



O Santo Graal da produtividade



Quantas línguas você consegue se lembrar que satisfazem as seguintes condições?



  1. Gerenciador de pacotes de qualidade e sistema de construção (Maven)
  2. Conjunto nominal
  3. Grande comunidade
  4. Otimização automática


Acho que a única ferramenta adequada é o Java, mas me avise se houver outras!



editar: Como Jwosty apontou , o rival do Java, Microsoft C #, tem todas essas características e mais / novos recursos de linguagem. Nunca usei C # fora do mecanismo de jogo Unity, mas vou aprender.



Ausência surpreendente do currículo universitário



Atualmente, estou estudando na Universidade do Colorado em Boulder; esta é uma ótima escola, mas não exatamente conhecida por CS. A maior parte do currículo de ciência da computação do ensino médio, entretanto, é descaradamente roubado da CMU ou de Stanford. Durante meus estudos na CU, usei as seguintes linguagens de programação:



  1. C++. : , , . . , , .
  2. Python Julia. , .
  3. Scala. Principles of Programming Languages, . Scala JVM Java, , Java.
  4. Linguagens da Web (HTML / CSS / JS). Eles foram usados ​​apenas em um curso, Técnicas e Ferramentas de Desenvolvimento de Software, sobre as tendências do setor.


Estou terminando este semestre e o Java não apareceu nem uma vez; Eu considero uma pena.



Conclusão



Não existe uma maneira verdadeira de construir aplicativos, mas acho que Java não está recebendo a atenção que merece, especialmente entre iniciantes e a comunidade de programação novata. Linguagens não digitadas são ferramentas úteis, mas não acho que devam ser a escolha padrão para a construção de grandes aplicativos. Se você é um desenvolvedor completo e nunca usou Java extensivamente, acho que ficará agradavelmente surpreso se tentar em seu próximo projeto.



Java e a JVM foram promovidos nos anos 90 e no início dos anos 2000, mas não acho que devam desaparecer! A experiência de desenvolvimento que ganhei com IntelliJ e Java é admirável.



Estou curioso para saber por que Java perdeu todo o entusiasmo. A história cultural dos programadores é mal documentada, e se você tiver algum entendimento, por favor me envie um e-mail ou deixe um comentário (no reddit / Hacker News ).



All Articles