JAVA está subestimado criminalmente

El punto de vista de un estudiante de informática ignorante



imagen




Probablemente leíste el título de esta publicación y pensaste: “¿Qué está fumando este tipo? ¡Java está en todas partes! " Tiene razón, Java todavía domina la industria y potencia algunas de las aplicaciones de misión crítica más grandes del mundo. Pero la difusión de Java no es de lo que estoy hablando, estoy hablando de la exageración que la rodea. Paso mucho tiempo con programadores sin experiencia. ¿Qué les gusta hacer a los programadores sin experiencia? Esté ansioso y confiado en herramientas como los lenguajes de programación. Ninguno de los estudiantes de informática que conozco admira Java, y creo que no debería ser así.



Los desarrolladores jóvenes / ingenuos (incluido yo mismo) a menudo caen en la trampa de fetichizar nuevos lenguajes y herramientas a expensas del rendimiento y la cordura. Antes de trabajar en Halp (ahora propiedad de $ TEAM), tenía una relación casi romántica con TypeScript del lado del servidor. Pensé que el ecosistema node.js era lo mejor: me encantó la idea de código transpilado, depuración en tiempo real, una biblioteca de paquetes enorme e incluso sistemas de compilación extraños y fragmentados. Cuando lo usé en el desarrollo y hablé con ingenieros más experimentados, la magia desapareció rápidamente.



Tenía un apego irracional al ecosistema JS porque era algo nuevo y candente; fue una exageración. La realidad no estuvo a la altura de mis expectativas. Hoy disfruto de las cosas maravillosas que he llegado a esperar de JavaScript a medida que adquiero experiencia con Java. Me siento engañado porque el bombo publicitario no me llevó a Java antes. Java es divertido de escribir, productivo y goza de una reputación de dinosaurio injusta entre los nuevos desarrolladores.



La ergonomía es lo que hace de Java un gran lenguaje de programación



Esto no debe subestimarse: escribir Java es un placer. Esto se debe en gran parte a la habilidad que JetBrains pone en IntelliJ IDEA. Todo se completa automáticamente, saltar a la definición es rápido, usar la búsqueda funciona bien y la refactorización es fácil. Sin embargo, donde Java realmente brilla es en la experiencia de los desarrolladores con bibliotecas de terceros.



Gran dependencia de la carga de trabajo y tendencias de la industria



Mi experiencia es limitada, pero siento que el viento se ha movido hacia la liberalización de las dependencias externas. No Inventado Aquí ya no está de moda, No Inventado No está de moda . En particular, es más probable que los desarrolladores de JavaScript incluyan bibliotecas de terceros incluso para operaciones triviales como completar el número de la izquierda . No creo que el adjunto actual a las dependencias de terceros sea particularmente dañino, pero los cambios de API en el flujo ascendente podrían dañar las bases de código JS / Python sin tipo.



Cuando utiliza bibliotecas de terceros en Java, siempre sabe exactamente qué tipos necesita pasar a un método. Más importante aún, el mal uso de la función resultará en líneas onduladas rojas en su editor. Dado que las bibliotecas se utilizan ampliamente, creo que más personas deberían estar entusiasmadas con Java.



La marcación nominal ahorra tiempo



La escritura dinámica / implícita / débil / cualquier tipo tiene una serie de desventajas. Cuando una dependencia cambia el método de API y su aplicación falla en tiempo de ejecución en lugar de tiempo de compilación, eso es un problema. Cuando un desarrollador tiene que volver a la implementación de un método para averiguar qué tipos aprobar, es una pérdida de tiempo. Las sugerencias de tipos de TypeScript y Python abordan esto ligeramente, pero carecen de la capacidad de verificar los tipos pasados ​​en tiempo de ejecución sin código adicional.



La protección de tipos es mi característica de TypeScript que menos me gusta. Básicamente, se trata de una escritura implícita que debe implementar usted mismo y confiar en que se implementa correctamente. En mi opinión, este es el peor de ambos mundos. Considera lo siguiente:



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();
}
      
      





Hay algo sobre la declaración de tipo AND de la necesidad de escribir lógica de validación para el tipo especificado que realmente me preocupa. El código anterior parece que alguien estaba usando la herramienta incorrecta.



A diferencia de las definiciones de TypeScript, los sistemas de tipos nominales de Java alivian la carga del cerebro del programador al cristalizar las definiciones de tipos y garantizar la protección de tipos predeterminada.



Eliminación de la responsabilidad de la optimización



Los desarrolladores de Java pueden confiar en la JVM para crear las mejores aplicaciones. Ya sea que estén implementando una aplicación de subprocesos múltiples o almacenando una gran cantidad de datos en el montón, pueden estar seguros de que no recibirán un golpe en el pie por la administración de memoria o las carreras de datos. Esto es principalmente una ventaja sobre C ++, que contiene muchas pistolas.



Esto es parte de la experiencia ergonómica de Java. Cuando un desarrollador necesita preocuparse menos por los detalles técnicos, puede concentrarse más en el problema actual.



El santo grial de la productividad



¿Cuántos idiomas puede recordar que cumplen las siguientes condiciones?



  1. Gestor de paquetes de calidad y sistema de compilación (Maven)
  2. Conjunto nominal
  3. Gran comunidad
  4. Optimización automática


Creo que la única herramienta adecuada es Java, ¡pero avíseme si hay otras!



editar: Como señaló Jwosty , el rival de Java Microsoft C # tiene todas estas características y más / nuevas características de lenguaje. Nunca he usado C # fuera del motor de juego de Unity, pero lo voy a aprender.



Sorprendente ausencia del plan de estudios universitario



Actualmente estoy estudiando en la Universidad de Colorado en Boulder; esta es una gran escuela, pero no es exactamente conocida por CS. La mayor parte de nuestro plan de estudios de ciencias de la computación de la escuela secundaria, sin embargo, es robado descaradamente de CMU o Stanford. Durante mis estudios en CU, utilicé los siguientes lenguajes de programación:



  1. C++. : , , . . , , .
  2. Python Julia. , .
  3. Scala. Principles of Programming Languages, . Scala JVM Java, , Java.
  4. Lenguajes web (HTML / CSS / JS). Solo se utilizaron en un curso, Técnicas y herramientas de desarrollo de software, sobre las tendencias de la industria.


Estoy terminando este semestre y Java no ha aparecido ni una sola vez; Lo considero una pena.



Conclusión



No existe una forma única de crear aplicaciones, pero creo que Java no está recibiendo la atención que se merece, especialmente entre las nuevas empresas y la comunidad de programación principiante. Los lenguajes sin tipo son herramientas útiles, pero no creo que deban ser la opción predeterminada para crear aplicaciones grandes. Si es un desarrollador con todas las funciones y nunca ha utilizado Java de forma extensiva, creo que se sorprenderá gratamente si lo prueba en su próximo proyecto.



Java y la JVM se promocionaron en los años 90 y principios de los 2000, ¡pero no creo que deban desaparecer nunca! La experiencia de desarrollo que he ganado con IntelliJ y Java es admirable.



Tengo curiosidad por saber por qué Java ha perdido el bombo publicitario. La historia cultural de los programadores está mal documentada, y si tiene algún conocimiento , envíeme un correo electrónico o deje un comentario (en reddit / Hacker News ).



All Articles