Una de las acciones más perjudiciales que he observado en la industria, es cuando un Junior Developer le pregunta a un «Senior» acerca de lo que debería aprender para obtener trabajo en Java, siendo la respuesta más o menos así:
- Aprende Spring Boot porqué es el framework más demandado por la industria
- Aprende Java para Android porque lo nuevo y lo de hoy son las apps móviles
- No aprendas Java porque Java está muerto, lo de hoy es Go
Durante los años estas frases han sido el resultado de diversas tendencias, y esas mismas frases se hubieran leído así en 2009:
- Spring es un framework bastante útil que complementa a Java EE pero no es necesario aprenderlo, lo importante es Struts
- Java en realidad esta bien, pero el nicho mejor pagado son las apps móviles para Blackberry, Java ME es el futuro
- No aprendas Java porque Java está muerto, lo de hoy es Ruby
Y solo les puedo decir que todos estos consejos estaban mal, estuvieron mal y estarán mal.
¿A que se debe estos malos consejos?
Luego de algunos años participando en cursos tanto como profesor y como asistente, les puedo decir los 5 errores más comunes que yo cometí y que veo cometer a la mayoría de desarrolladores:
- Aprender lo mínimo de un lenguaje de programación o asumir que todos son iguales
- Enfocarse en aprender un framework antes que el lenguaje
- Seguir tutoriales específicos de un IDE
- Ignorar la existencia de las herramientas de compilación
- Omitir la documentación oficial y preferir solo tutoriales cortos
Y todos tienen más o menos la misma motivación: El tiempo.
¿Quien se tomaría 2 días en leer la documentación cuando puede desperdiciar semanas en prueba y error?
¿Entonces como debería aprender?
Como sugiere la infografia que acompaña el post, al utilizar cualquier software «comercial» o de moda, a la larga siempre trae mejores resultados aprender primero los fundamentos. Con los años esto se vuelve más importante ya que esto permite saltar al siguiente framework de moda (antes fue J2EE, luego fue Struts, luego Spring, ahora MicroProfile y mañana quien sabe). Entonces mi secuencia lógica seria:
1- Aprende programación orientada a objetos y programación funcional con Java
La mayoría de frameworks en Java utiliza tres estilos básicos de programación:
- Programación orientada a objetos para definir comportamiento y funcionalidad
- Programación reflectiva en estilo AOP (anotaciones), para darle «pistas» al framework de cual es el comportamiento que esperamos
- Programación funcional con expresiones lambda para completar «bloques» de funciones, especialmente en programación de sistemas escalables/reactivos
Esta situación es similar en otros lenguajes/plataformas, todos los frameworks presuponen un conocimiento general y bueno del lenguaje de programación. De lo contrario programar sera un acto de escribir software imperativo, agregar anotaciones que copiamos de un blog y culpar a Java porque se cayó el servidor.
Y este es el error #1 que veo en las universidades, en mi experiencia por ejemplo recuerdo que me metieron de cabeza en Swing a hacer una calculadora cuando ni siquiera entendía que era un compilador hacia Bytecode, aun no entiendo como no desistí de ser ingeniero de software.
2- Aprende los fundamentos de la JVM
Conceptos básicos como:
- Saber diferenciar entre las APIs de la JVM
- Entender el papel del bytecode en la ejecución
- Y probablemente el más importante, entender como funciona el modelo stack-heap de la memoria RAM y el recolector de basura
- Entender que existe no una sino varias JVM
Con el simple hecho de conocer como funciona la memoria eliminaras el mito de que Java siempre limpia la memoria. Hay programadores que se esfuerzan demasiado en hacerle la vida dificil a la JVM.
3- Seleccionar tus herramientas
No hay carpintero sin martillo y hoy en día es dificil ser un programador unicamente con un IDE, pero al pretender realizar programación comercial con Java uno suele necesitar:
- Un IDE: De hecho lo reescribiría a ser capaz de utilizar cualquier IDE, hoy en día casi todos los proyectos Java son compatibles con todos los IDEs, tanto NetBeans, como IntelliJ como Eclipse son compatibles con Maven y Gradle
- Un sistema de construcción: Para entender como se crea un proyecto y poder usar cualquier IDE nunca está de mas conocimiento en Maven o Gradle :).
- Principios basicos de shell scripting: Hasta Windows ya aceptó que el Shell scripting es necesario para los programadores
- Versionamiento de código: Hoy sera Git, mañana no lo se y pasado no se si estaremos vivos
En resumen saber una herramienta NO es igual que saber programar, pero saber una herramienta si te hará más productivo.
4- Aprende los frameworks de la industria
¿Llegaste hasta acá? Que bien, muchos empiezan por aquí y vuelven el desarrollo de software una experiencia frustrante.
Una buena forma de saber cuales son los frameworks demandados por la industria es realizar búsqueda de trabajos en LinkedIn o acudir a tu Java User Group más cercano, la buena noticia es que a la larga los frameworks en Java se parecen porque muchos de ellos usan cosas que se estandarizaron en el Java community process.
Y la mejor noticia es que si sabes Java con buen nivel de detalle, ya estas listo para saltar al siguiente gran framework, que saldrá en el futuro.
Probablemente estos sean los stacks más populares hoy en día (2019):
- Spring Framework: (Pivotal)
- Jakarta EE: Payara, Wildfly/JBoss (Red Hat), TomEE (Apache/Tomitribe), WebSphere (IBM), WebLogic (Oracle)
- MicroProfile: Payara, Quarkus (Red Hat), TomEE (Apache), OpenLiberty (IBM), Helidon (Oracle)
5- Continua aprendiendo
Java lleva 25 años en la industria y continua evolucionando cada 6 meses. Probablemente le queden otros 25 más por los entornos donde se utiliza, pero la única constante en TI es el cambio.
Mozilla/5.0 (Linux; Android 9; SM-G955F Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/253.0.0.28.116;]
Excelente que compartas tus experiencias y recomendaciones, te doy toda la razón en cómo la educación superior no brinda los pasos adecuados para la adquisición de conocimientos, ya que se resumen en «si logras hacerlo es porque eres bueno».
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0
Muy de acuerdo con tuxtor, pero creo que no tenemos que ver la educación de la universidad como algo que nos tenia que dejar como expertos en un lenguaje o plataforma. Lo que nos tuvo que dejar la universidad es la curiosidad educada y el metodo para ir buscando las mejores herramientas y definir nuestros propios criterios… «Es en la diversidad de criterios, donde radica el concepto de universidad»
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:73.0) Gecko/20100101 Firefox/73.0
@Luis creo que ese es precisamente el problema, a veces por dar habilidad practica nos hacian «saltarnos las gradas», viendolo en retrospectiva a mi por ejemplo me pidieron en progra 1 manipular graficos en Swing porque «Swing era lo que se usaba para hacer apps de escritorio» en mi primer proyecto (2.5 meses estudiando programación).
Fui capaz de hacerlo porque ya sabia programar en otros lenguajes, pero hubo gente que no sobrevivío 🤔
Mozilla/5.0 (Linux; Android 8.0.0; moto e5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36
Actualmente voy por el noveno semestre de ing sistemas, y lo único que la U me enseñó a mí y a muchos compañeros es odiar la programación. Porque nos tiraban al matadero con los proyectos, y uno se daba la idea de que uno no sirve para la programación, pero es porque no se tienen los fundamentos necesarios. Pero como soy necio retrocedí para empezar con los fundamentos y así ir escalando en el ecosistema de Java
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36
Amigo, Nesecito un consejo…Estoy estudiando java en la web…Soy un simple comerciante que adquirió un software de ventas de alto valor para nuestra realidad, el cual nos cobra mensualidades para su mantención, sin cumplir con las expectativas para mi negocio, por lo que me decidí estudiar programación en la web, con la intencion de desarrollar mi propio software de ventas.
Llevo app 6 meses estudiando, todos los dias, por diferentes medios pagados o no pagados en la web, pero no logro comprender la escencia de la programacion en java.
Deberia dejar de estudiar java y familiarizarme previamente en C…
Espero tu respuesta