Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

¿En qué se diferencia Java de otros lenguajes populares? ¿Por qué Java debería ser el primer idioma a aprender? Creemos un plan que te ayudará a aprender Java tanto desde cero como aplicando habilidades de programación en otros lenguajes. Enumeremos las diferencias entre crear código de producción en Java y desarrollar en otros lenguajes. Mikhail Zatepyakin leyó este informe en una reunión para futuros participantes pasantías Yandex y otros desarrolladores principiantes: reunión de Java Junior.


— Hola a todos, mi nombre es Misha. Soy desarrollador de Yandex.Market y hoy te diré por qué aprender Java y cómo hacerlo de forma eficaz. Quizás haga una pregunta razonable: ¿por qué contaré esta historia y no la de un desarrollador sólido con muchos años de experiencia? El hecho es que yo mismo estudié Java recientemente, hace aproximadamente un año y medio, así que todavía recuerdo cómo era y qué dificultades hay.

Hace un año hice una pasantía en Yandex.Market. Desarrollé el backend para Beru, para el propio Market, probablemente lo usaste. Ahora sigo trabajando allí, en un equipo diferente. Creamos una plataforma analítica para Yandex.Market para socios comerciales.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Empecemos. ¿Por qué aprender Java desde un punto de vista práctico? El hecho es que Java es un lenguaje de programación muy famoso. Tiene una comunidad muy grande.

Por ejemplo, existe un índice TIOBE, un índice popular de popularidad de los lenguajes de programación, y Java ocupa el primer lugar allí. Además, en los sitios de trabajo, probablemente notarás que la mayoría de las vacantes son sobre Java, es decir, desarrollando en Java, siempre puedes encontrar un trabajo.

Dado que la comunidad es muy grande, cualquier pregunta que tenga encontrará una respuesta en algún Stack Overflow u otros sitios. Además, al desarrollar en Java, en realidad estás escribiendo código en la JVM, por lo que puedes cambiar fácilmente a Kotlin, Scala y otros lenguajes que usan la JVM.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

¿Qué tiene de bueno Java desde un punto de vista ideológico? Existen diferentes lenguajes de programación. Resuelven diferentes problemas, lo sabes. Por ejemplo, Python es excelente para escribir scripts de una línea para resolver problemas rápidos.

En el lado positivo, puedes controlar completamente el código ejecutable. Por ejemplo, tenemos automóviles, vehículos sin conductor Yandex, cuyo código está escrito en ventajas. ¿Por qué? Java tiene tal cosa: Garbage Collector. Limpia la RAM de objetos innecesarios. Esto comienza espontáneamente y detiene el mundo, es decir, detiene el resto del programa y va a contar objetos, borrar la memoria de los objetos. Si algo así funciona en un dron, no está bien. Su dron conducirá en línea recta, en este momento borrará su memoria y no mirará la carretera en absoluto. Por lo tanto, el dron tiene ventajas.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

¿Qué problemas resuelve Java? Es principalmente un lenguaje para desarrollar grandes programas escritos durante años por decenas o cientos de personas. En particular, gran parte del backend de Yandex.Market está escrito en Java. Contamos con un equipo distribuido en varias ciudades, diez personas en cada una. Y el código es fácil de mantener, ha recibido soporte durante diez años o más y, al mismo tiempo, llega gente nueva y comprende este código.

Qué características debe tener un lenguaje para que el código que contiene sea fácilmente soportado y pueda desarrollarse fácilmente en grandes equipos. En primer lugar, debe ser un código legible y debe ser fácil implementar soluciones arquitectónicas complejas. Es decir, debería ser fácil escribir abstracciones de alto nivel, etc. Todo esto es lo que nos proporciona Java. Este es un lenguaje orientado a objetos. Es realmente fácil implementar abstracciones de alto nivel y arquitecturas complejas.

También hay muchos frameworks y bibliotecas para Java, porque el lenguaje tiene más de 15 años. Durante este tiempo, todo lo que se podía escribir se escribía en él, por lo que hay toneladas de bibliotecas para todo lo que puedas necesitar.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

¿Qué habilidades básicas, en mi opinión, debería tener un jugador principiante de JA? En primer lugar, se trata del conocimiento del lenguaje central de Java. Lo siguiente es algún tipo de marco de inyección de dependencia. El próximo orador, Kirill, hablará más detalladamente sobre este tema. No profundizaré demasiado. Lo siguiente son los patrones de arquitectura y diseño. Necesitamos poder escribir código arquitectónicamente hermoso para poder escribir aplicaciones grandes. Y este es algún tipo de SQL u ORM para tareas de trabajo con la base de datos. Y esto se aplica más al backend.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

¡Ir! Núcleo de Java. Realmente no descubriré América aquí; es necesario conocer el idioma en sí. A qué debes prestar atención. En primer lugar, Java ha lanzado muchas versiones en los últimos años, es decir, en 2014-2015 se lanzó la séptima, luego la octava, novena, décima, muchas versiones nuevas y se introdujeron muchas cosas nuevas e interesantes en ellas. , por ejemplo, Java Stream API, lambda, etc. Cosas muy interesantes, novedosas y interesantes que se utilizan en el código de producción, sobre qué preguntan en las entrevistas y qué necesitas saber. Por lo tanto, no debes tomar un libro del estante de la biblioteca Java-4 y aprenderlo. Este es nuestro plan: aprendemos Java-8 o superior.

Prestamos mucha atención a innovaciones como Stream API, var, etc. Se preguntan durante las entrevistas y se utilizan constantemente en producción. Es decir, Stream API es mucho más genial que los bucles, en general, algo muy bueno. Asegúrate de prestar atención.

Y hay todo tipo de cosas como iteradores, excepciones, etc. Cosas que no te parecen importantes siempre que escribas un pequeño código tú mismo. No necesitas estas excepciones, ¿quién las necesita de todos modos? Pero definitivamente te los preguntarán en las entrevistas, definitivamente te serán útiles en la producción. En general, debes prestar atención a las excepciones, iteradores y otras cosas.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Estructuras de datos. No puedes prescindir de estructuras, pero sería fantástico si no supieras simplemente que hay conjuntos, diccionarios y hojas. Y también diferentes implementaciones de estructuras. Por ejemplo, el mismo diccionario en Java tiene muchas implementaciones, incluidas HashMap y TreeMap. Tienen diferentes asintóticas, están estructurados de manera diferente en su interior. Necesita saber en qué se diferencian y cuándo usar cuál.

También será genial si sabes cómo funcionan internamente estas estructuras de datos. Es decir, no es fácil conocer sus asintóticas: cuánto funciona la apuesta, cuánto dura el pase, pero cómo funciona la estructura interna, por ejemplo, qué es un cubo en HashMap.

También merece la pena prestar atención a los árboles y los gráficos. Estas son cosas que no son muy comunes en el código de producción, pero son populares en las entrevistas. En consecuencia, debe poder atravesar árboles y gráficos en ancho y profundidad. Todos estos son algoritmos simples.

Tan pronto como comience a escribir código grande, complejo, que utilice bibliotecas y código de múltiples clases, se dará cuenta de que es difícil para usted sin construir sistemas y resolver dependencias. Estos son principalmente Maven y Gradle. Le permiten importar bibliotecas a su proyecto en una línea. Es decir, escribe un xml de una línea e importa bibliotecas al proyecto. Grandes sistemas. Son aproximadamente iguales, use uno: Maven o Gradle.

A continuación, algún tipo de sistema de control de versiones. Recomiendo Git porque es popular y hay toneladas de tutoriales. Casi todo el mundo usa Git, es algo genial, no puedes vivir sin él.

Y algún tipo de entorno de desarrollo. Recomiendo IntelliJ Idea. Acelera enormemente el proceso de desarrollo, te ayuda mucho, escribe todo el código repetitivo por ti, en general, es genial.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Enlaces de la diapositiva: SQLZOO, habrapost

SQL. Un poco sobre los patrocinadores. De hecho, hubo un caso divertido aquí. Dos días antes de mi segunda entrevista de prácticas, una chica de RR.HH. me llamó y me dijo que en dos días me preguntarían sobre SQL y HTTP, que necesitaba aprenderlo. Y no sabía casi nada sobre SQL o HTTP. Y encontré este sitio genial. SQLZOO. Aprendí SQL en 12 horas, es decir, sintaxis SQL, cómo escribir consultas SELECT, JOIN, etc. Un sitio muy interesante, lo recomiendo ampliamente. De hecho, en 12 horas aprendí el 90% de lo que sé ahora.

Y también es genial conocer la arquitectura de la base de datos. Estos son todo tipo de claves, índices, normalización. Hay una serie de publicaciones sobre esto en Habré.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

En Java, además de SQL, existen todo tipo de sistemas de mapeo relacional de objetos, como JPA. Hay algo de código. En el primer método hay un código SQL: SELECCIONE el nombre de identificación DE info.users DONDE la identificación EN los ID de usuario. De la base de datos de los usuarios, de la tabla, se obtienen sus ID y nombres.

A continuación, hay un determinado asignador que convierte un objeto desde la base en un objeto Java. Y hay un tercer método a continuación que realmente ejecuta este código. Todo esto se puede reemplazar usando JPA con una línea, que se escribe a continuación. Hace lo mismo: buscar All ByIdIn. Es decir, según el nombre del método, genera una consulta SQL para usted.

Algo muy bueno. Yo mismo, cuando no sabía SQL, usé JPA. En general, presta atención. Si eres demasiado vago para aprender SQL, es un desastre. Y, en general, ¡fuego!

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Primavera. ¿Quién ha oído hablar del marco Spring? ¿Ves cuántos de ustedes son? No sin razón. Spring está incluido en los requisitos de una de cada dos vacantes de backend de Java. Sin él, realmente no hay ningún gran desarrollo. ¿Qué es la primavera? En primer lugar, este es un marco de inyección de dependencia. Sobre esto también le diré próximo orador. Pero en resumen, esto es algo que le permite facilitar la importación de las dependencias de unas clases a otras. Es decir, se simplifica el conocimiento de las dependencias.

Spring Boot es una parte de Spring que le permite ejecutar su aplicación de servidor con un solo botón. Vas a THID, presionas un par de botones y ahora tienes la aplicación de tu servidor funcionando en localhost 8080. Es decir, aún no has escrito ni una sola línea de código, pero ya está funcionando. Algo muy bueno. Si escribes algo propio, ¡disparo!

Spring es un marco muy grande. No sólo recoge la aplicación de su servidor y resuelve la inyección de dependencia. Le permite hacer muchas cosas, incluida la creación de métodos API REST. Es decir, usted escribió algún método y le adjuntó la anotación Obtener mapeo. Y ahora ya tienes algún método en localhost que te escribe Hola mundo. Dos líneas de código y funciona. Cosas interesantes.

Spring también facilita la redacción de exámenes. No hay manera sin pruebas en un gran desarrollo. Es necesario probar el código. Para ello, Java tiene una biblioteca genial, JUnit 5. Y JUnit en general, pero la última versión es la quinta. Hay de todo para realizar pruebas, todo tipo de afirmaciones y otras cosas.

Y hay un marco Mockito increíble. Imagine que tiene alguna funcionalidad que desea probar. La funcionalidad hace muchas cosas, incluido, en algún punto intermedio, iniciar sesión en VKontakte con su ID, por ejemplo, y recibir el nombre y apellido del usuario de VKontakte de la ID. Probablemente no incluyas a VKontakte en las pruebas, eso es extraño. Pero necesitas probar la funcionalidad, así que creaste esta clase, usando Mockito, mok it, imitándola.

Dirá que cuando llega una solicitud a esta clase con una identificación tal o cual, devuelve algún apellido, por ejemplo, Vasya Pupkin. Y funcionará. Es decir, probará todas las funciones de mok one class. Algo muy bueno.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Enlace desde diapositiva

Patrones de diseño. ¿Lo que es? Se trata de plantillas para resolver problemas típicos que surgen en el desarrollo. En el desarrollo a menudo surgen problemas idénticos o similares que sería genial resolver de alguna manera bien. Por lo tanto, a la gente se le ocurrieron mejores prácticas, ciertas plantillas, sobre cómo resolver estos problemas.

Hay un sitio web con los patrones más populares: refactoring.guru, puedes leerlo, descubrir qué patrones hay y leer un montón de teorías. El problema es que es prácticamente inútil. De hecho, los patrones sin práctica no son particularmente útiles.

Escuchará sobre algunos patrones como Singletone o Builder. ¿Quién escuchó estas palabras? Mucha gente. Existen patrones tan simples que puedes implementar tú mismo. Pero la mayoría de los patrones: estrategia, fábrica, fachada, no está claro dónde aplicarlos.

Y hasta que no vea en la práctica en el código de otra persona un lugar donde se aplica este patrón, no podrá aplicarlo usted mismo. Por eso, la práctica es muy importante con los patrones. Y simplemente leer sobre ellos en refactoring.guru no es muy útil, pero definitivamente vale la pena hacerlo.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

¿Por qué se necesitan patrones? Digamos que tienes una determinada clase de usuario. Tiene un Id y un Nombre. Cada Usuario debe tener tanto un Id como un Nombre. Arriba a la izquierda está el aula.

¿Cuáles son las formas de inicializar el usuario? Hay dos opciones: un constructor o un definidor. ¿Cuáles son las desventajas de ambos enfoques?

Constructor. nuevo Usuario (7, "Bond"), está bien. Ahora digamos que no tenemos una clase Usuario, sino alguna otra, con siete campos numéricos. Tendrás un constructor que contiene siete números consecutivos. No está claro cuáles son estos números y cuál de ellos pertenece a qué propiedad. El diseñador no es genial.

La segunda opción es setter. Escribe claramente: setId(7), setName(“Bond”). Entiendes qué propiedad pertenece a qué campo. Pero el colocador tiene un problema. En primer lugar, es posible que se olvide de asignar algo y, en segundo lugar, que su objeto resulte mutable. Esto no es seguro para subprocesos y reduce ligeramente la legibilidad del código. Por eso a la gente se le ocurrió un patrón genial: Builder.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

¿De qué se trata esto? Intentemos combinar las ventajas de ambos enfoques (setter y constructor) en uno. Creamos un determinado objeto, Constructor, que también tendrá campos Id. y Nombre, que a su vez se construirá en función del definidor y que tendrá un método de compilación que le devolverá un nuevo usuario con todos los parámetros. Obtenemos un objeto inmutable y un fijador. ¡Fresco!

¿Cuáles son los problemas? Aquí tenemos el clásico Builder. El problema es que aún podemos olvidarnos de marcar algún campo. Y si olvidamos visitar el ID, en este caso en Builder se inicializa a cero, porque el tipo int no admite valores NULL. Y si hacemos el Nombre “Bond” y nos olvidamos de visitar la oficina de identificación, tendremos un nuevo Usuario con id “0” y el nombre “Bond”. No es genial.

Intentemos luchar contra esto. En Builder cambiaremos int a int para que sea anulable. Ahora todo es genial.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Si intentamos crear un Usuario con el nombre “Bond”, olvidándonos de poner su ID, obtendremos una excepción de puntero nulo, porque el ID no es anulable y el Constructor tiene una excepción de puntero nulo, específicamente.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Pero aún podemos olvidarnos de poner un nombre, por lo que configuramos la reproducción del objeto en nulo. Ahora, cuando construimos nuestro objeto desde Builder, verifica que el campo no admita valores NULL. Y eso no es todo.

Veamos el último ejemplo. En este caso, si de alguna manera ponemos nulo en el tiempo de ejecución de ID, sería fantástico saber inmediatamente que lo hiciste y no está bien que estés cometiendo un error ahora.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Debe generar un error no en el momento de la creación del usuario, sino cuando establece nulo en el ID. Por lo tanto, en Builder cambiaremos el setter Integer a int, e inmediatamente jurará que descartaron nulo.

En resumen, ¿cuál es el punto? Hay un patrón Builder simple, pero incluso su implementación tiene algunas sutilezas, por lo que es genial observar diferentes implementaciones de patrones. Cada patrón tiene docenas de implementaciones. Todo esto es muy interesante.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

¿Cómo escribimos Builder en código de producción? Aquí está nuestro Usuario. Le adjuntamos una rotación de Constructor de la biblioteca de Lombok y él mismo genera un Constructor para nosotros. Es decir, no escribimos ningún código, pero Java ya piensa que esta clase tiene un Builder y podemos llamarlo así.

Ya he dicho que Java tiene bibliotecas para casi todo, incluida Lombok, una biblioteca genial que te permite evitar escribir textos repetitivos. Constructor, OBTENER.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Los patrones pueden ser arquitectónicos, relacionados no sólo con una clase, sino con el sistema en su conjunto. Existe un principio genial en el diseño de sistemas: el principio de responsabilidad única. ¿De qué está hablando? El hecho de que cada clase debe ser responsable de algunas de sus propias funciones. En este caso tenemos un Controlador que se comunica con los usuarios, objetos JSON. Está Facade, que convierte objetos JSON en modelos con los que luego funcionará la aplicación Java. Existe un Servicio que tiene una lógica compleja que funciona con estos modelos. Hay un objeto de acceso a datos que coloca estos modelos en la base de datos y los recupera de la base de datos. Y está la propia base de datos. En otras palabras, no todo está en una sola clase, sino que estamos creando cinco clases diferentes, y ese es otro patrón.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Una vez que haya aprendido Java más o menos, es fantástico escribir su propio proyecto que tendrá una base de datos, funcionará con otras API y expondrá su aplicación de servidor a clientes API REST. Sería genial agregar esto a tu currículum, sería un excelente final para tu educación. Con esto puedes ir y conseguir un trabajo.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

Aquí hay un ejemplo de mi aplicación de servidor. En mi segundo año, escribí un trabajo final con los chicos. Estaban escribiendo una aplicación móvil para organizar eventos. Allí, los usuarios podían iniciar sesión a través de VKontakte, colocar puntos en el mapa, crear eventos, invitar a sus amigos, guardar imágenes de eventos, etc.

¿Qué hice en el proyecto? Escribí una aplicación de servidor en Spring Boot sin usar SQL. No lo conocía, usé JPA. ¿Qué podría hacer? Inicie sesión en VK a través de OAuth-2. Tome el token del usuario, vaya a VK con él y verifique que sea un usuario real. Recibir información sobre los usuarios a través de VKontakte. Pudo guardar información en una base de datos, también a través de JPA. Guarde hábilmente imágenes y otros archivos en la memoria de la computadora y guarde enlaces a ellos en la base de datos. En ese momento no sabía que había objetos CLOB en la base de datos, así que lo hice de esta manera. Había una API REST para usuarios, aplicaciones cliente. Y hubo pruebas unitarias para la funcionalidad básica.

[…] Un pequeño ejemplo de mi aprendizaje exitoso de Java. En mi primer año en la universidad, me enseñaron C# y me dieron conocimientos sobre programación orientada a objetos: qué son las clases, las interfaces, la abstracción y por qué son necesarias. Me ayudó mucho. Sin esto, aprender Java es bastante difícil, no está claro por qué se necesitan clases.

Por qué aprender Java y cómo hacerlo de forma eficaz. informe yandex

En mi segundo año en la universidad, volvieron a enseñar Java Core, pero no me detuve ahí, fui a estudiar Spring yo mismo y escribí un trabajo del curso, mi proyecto, que mencioné anteriormente. Y con todo esto, hice una pasantía en Yandex, pasé una entrevista y entré en Yandex.Market. Allí escribí el backend para Beru, este es nuestro mercado y para el propio Yandex.Market.

Después de eso, hace seis meses, me trasladé a otro equipo dentro del mismo Mercado. Hacemos análisis para socios comerciales. Estamos en la plataforma analítica, somos tres en el backend, por lo que tengo una gran influencia en el proyecto. Es muy interesante, de hecho. Es decir, en realidad proporcionamos datos sobre el mercado: cuáles son las ventas, en qué categorías, en qué modelos, para socios comerciales, grandes empresas conocidas. Y solo somos tres, escribimos este código y es genial.

¡Gracias! Enlaces útiles:
- "Java 8. Guía para principiantes".
- Estructuras de datos.
- SQLZOO.
- Normalización de bases de datos.
- Patrones de diseño.
- Patrones de diseño.
- Código limpio.
- Java eficaz.

Fuente: habr.com

Añadir un comentario