Cómo convertirte en un Senior Developer Backend

Voy a plantear mi punto de vista de los temas que son requeridos afianzar para llegar de Junior a Senior. Me saltaré los intermedios y te contaré lo que yo creo necesario trabajar día a día para llegar a este objetivo.

Todos los que estamos en el desarrollo de software conocemos los diferentes ‘senioritis’ con los que nos etiquetan para establecer qué nivel de conocimiento tenemos.

Los senioritis principales son Junior, Semi Senior, Senior, Arquitecto.

De aquí se desprenden otros intermedios como Trainee, Semi Junior, Junior Advance, Semi Senior y Senior que pueden variar según la empresa que los use o el país.

Trainee, Junior, Junior Advance, Semi Senior, Senior, Arquitecto.

En general todos los que empezamos en el desarrollo de software pretendemos escalar entre esos senioritis hasta el rol de Senior y nos hacemos preguntas relacionadas a ¿que debemos aprender para ser un Senior Developer?

Hay temas importantes en los que todo un desarrollador debe prepararse y practicar. Cuando eres Junior es bueno que te hagas un plan que te lleve paso a paso en tu carrera.

Estos son los tópicos que creo tienen que estar en tu plan de crecimiento:

  • Algoritmos
  • La JDK y el ‘core’ de Java. Fundamentos básicos de Java
  • Patrones de diseño
  • Principios básicos de arquitectura, SOLID y Clean Code
  • Testing
  • El uso de frameworks (Spring Boot, Hibernate, etc)
  • Metodologías Agile
  • Inglés
  • Soft Skills

Java Senior

Algoritmos

El software un algoritmo refiere a la secuencia de instrucciones que se deben ejecutar de forma ordenada para cumplir procesos y tomar decisiones.

Algorithm Senior Dev

Recuerdo cuando estudié Algoritmos Matemáticos, uff!.. El método de Euclides para resolver el máximo común divisor de dos enteros positivos o el método de Gauss para las ecuaciones lineales. ¿Haz visto esos algoritmos en la Universidad?

Cuando trabajas desarrollando software te dedicas una gran parte de tu tiempo a pensar en cómo el código que estás construyendo debe resolver los problemas para entregar un resultado esperado. Debes estructurar los pasos de modo secuencial y ordenado para que tu código tomé la decisión en base a una entrada (input). Sobre este input realizará un proceso y entregará una salida (output). Esta es la base de todo algoritmo.

Comprender cómo funcionan y cómo crear algoritmos ordenará tus pensamientos y te ayudará a pensar de modo claro y conciso la mejor forma de construir el software que tienes entre tu cabeza y tus dedos. Te ahorrará enredos de código y tiempo.

La JDK y el ‘core’ de Java. Fundamentos básicos de Java

De todos estos puntos el primero es conocer los aspectos fundamentales del ‘core’ de Java. Debes comprenderlos y debes practicar cada uno de ellos.

Es necesario que mientras vayas estudiando cada punto escribas fragmentos de código y los ejecutes para cada tópico. No sirve leer contenido sino lo bajas a código y experimentas con él.

Piensa en la JDK y en el core de Java como tu principal herramienta de trabajo. Es tu bisturí, que usarás todos los días para resolver cada problema que encuentres. Entre más afilada tengas esa herramienta y entre más la domines mejor resolverás los problemas con los que te encuentres y con mayor rapidez.

La rapidez y calidad con que resuelvas los problemas es un gran punto a favor que te distinguirá como un candidato a mejorar tu seniority.

Estos son los conceptos básicos de Java que debes comprender. De seguro alguno se me escapa y lo iré agregando a medida que me acuerde.

  • Comprender la JDK
  • Estructura básica de un programa en Java
  • Cómo ejecutar un programa en Java
  • Que es un package
  • El método main
  • Qué son los métodos
  • Qué son las variables
  • Datos primitivos
  • Variables
  • Operadores de asignación
  • Operadores de comparación
  • Operadores matemáticos básicos
  • Arrays (arreglos) y métodos básicos
  • String y métodos básicos de String
  • Control de flujo y de decisión
  • Bucles
  • Manejo de excepciones
  • Como tirar una excepción
  • Que es una clase
  • Campos en una clase (fields)
  • Métodos de una clase (methods)
  • Constructores de una clase
  • Diferencia entre clase y objeto. Crear un objeto.
  • Entender static
  • Herencia
  • Polimorfismo
  • Clases abstractas
  • Interfaces
  • Java Collections
  • Manejo de archivos
  • Generics
  • Crear un proyecto en java.

Patrones de diseño

Esto es algo que ya he mencionado en otro artículo y que me gustaría transcribir aquí:

Los patrones de diseño nos ayudan a crear aplicaciones robustas resolviendo los problemas comunes utilizando soluciones conocidas y probadas. Esto ayuda a ahorrar tiempo evitando crear soluciones particulares para algo que ya ha sido resuelto antes.

Cuando tengas un tiempo realiza una lectura de ese artículo, baja el codigo y siguelo mientras lo estudias. Luego intenta volver a realizarlo con tus propios ejemplos.

Tipos de patrones de diseño

Generalmente cuando somos junior, tratamos de resolver el problema sin preocuparnos mucho en cómo lo resolverlo ni en el mantenimiento posterior. Visualizar este aspecto es un punto distintivo de un senior. Debes comprender que el código necesita siempre mantenimiento futuro.

Trabaja siempre que puedas con patrones de diseño o úsalos como base y modificalos a la necesidad puntual que tengas.

Principios básicos de arquitectura, SOLID y Clean Code

Sobre este punto también he escrito y me gustaría que le des una lectura y te detengas a comprenderlo. Esta es la base de una buena arquitectura en tu código.

SOLID tiene intención hacer que el diseño de software sea más simple y comprensible permitiendo reducir además los costes de mantenimiento.

SOLID Principios

Aquí me detengo un poco para tranquilizarme, no es necesario que de primera, entiendas en profundidad todos estos principios SOLID. Más bien que los conozcas, sepas que existen, te hagas una idea y los vuelvas leer a medida que avanzas en tu experiencia para llegar a profundizar.

Respecto al término Clean Code, este surge del libro “Clean Code: A Handbook of Agile Software Craftsmanship”.
El Clean Code o código limpio hace referencia a crear código que sea fácil de leer y de entender. Que pueda extenderse y que no resulte complicado adaptarlo a los cambios que surjan para acompañar al negocio. Cuando te sea posible, dale una lectura, anota lo que más te guste del libro y repasalo cada vez que puedas.

Testing

No existe software sin errores. No existe software sin bugs. Sin embargo debes esforzarte en evitarlos, corregirlos y volver a evitarlos una vez corregidos.

Hoy existen mil formas de hacer lo mismo en software. Cada compañía, cada empresa intenta destacarse por sobre otra creando su propio software que acompañe, guíe y empuje al negocio. La calidad del software es la principal herramienta con la que puede contar una empresa para distinguirse.

Son innumerables las veces que me he encontrado con fallas introducidas sin intención en el software que podrían haberse evitado con un test que valide los cambios antes de la puesta productiva. Fallas que provocan una mala experiencia con los usuarios y caídas en la continuidad del servicio.

Recuerdo el caso en el que dentro de mi equipo agregamos un valor nuevo dentro de un Enumerador para permitir al usuario la selección de otra opción nueva. Sin embargo ‘olvidamos’ que ese valor era enviado a otro servicio para realizar una comprobación. Todas nuestras pruebas manuales fueron satisfactorios y se puso productivo. En ese momento nos dimos cuenta que el segundo servicio en las pruebas manuales, no validaba nada pero en producción si lo hacía. Nos dejó sin servicio durante un par de horas por no contar con test automático que verificará de modo integral los cambios.

Testing Senior Dev

El desarrollo del test es parte de desarrollo de la solución. NO son dos puntos por separado. Pienso que no se ha terminado la solución si esta solución en código no está acompañada de un test que lo valide.

Son varios los tipos de testing:

  • Test unitarios (Unit Test).
  • Pruebas de integración (Integration testing).
  • Test de sistema (System testing).
  • Test de aceptación (Acceptance testing)

Trata de aprender sobre test unitarios utilizando Junit y Mockito principalmente. Siempre crea test sobre los puntos más importantes que realizan validaciones y reglas de negocio en tu software.

El uso de frameworks (Spring Boot, Hibernate, etc)

Spring Boot es sin dudas el framework de desarrollo que más utilizo. He publicado algunos post interesantes sobre Spring Boot en especial el que refiere a Spring Boot con Docker y PostgreSql.

De por sí Spring es muy conocido por el manejo de inyeccion dependencias que tanto ha ayudado a crear codigo de calidad, el manejo simple con el acceso a la base de datos y como nos ha ayudado a integrar tantos otros frameworks como Hibernate por ejemplo. Sin olvidar todo lo que hizo con Spring MVC para crear aplicaciones web.

El ecosistema de Spring es muy interesante partiendo desde Spring Boot, Spring Batch, Spring Security, Spring Cloud, Spring Integration, Spring Kafka, etc.

De todo esto Spring Boot se lleva a mi criterio la estrella por simplificar y ahorrarnos tanto código para trabajar con microservicios y creo que de todos los productos de Spring, este es el que primero debes conocer.

Un microservicio es una arquitectura que permite a los desarrolladores crear servicios independientes. Cada servicio corre ejecutando sus propios procesos de modo independiente recibiendo y respondiendo peticiones enviadas por otros microservicios.

Cada microservicio cumple una función acotada y bien específica del negocio que lo hace fácil para entender y mantener. Además la arquitectura de microservicios ayuda a simplificar el despliegue y a escalar la aplicación con mayor rapidez y simplicidad.

Spring Boot se lleva una gran estrella por su simplicidad de configuración y facilidad de ejecución para crear microservicios.

SQL

SQL es el lenguaje de consulta que vas a utilizar para obtener información y guardar datos con bases de datos.

Las consultas y otras operaciones SQL toman la forma de comandos escritos como declaraciones. Las instrucciones SQL más habituales que seguro usaras son seleccionar (select), insertar (insert), actualizar (update) y eliminar (delete).

Algunos pocos ejemplos solo para ilustrar:

select: Quizás lo que más utilices serán las consultas SQL queries. Está operaciones SQL es esencial y debes dominarla bien. Mediante una consulta SQL, se puede buscar en la base de datos la información necesaria. SELECT * FROM user WHERE firstname= “Guason” ORDER BY lastname, firstname;

insert: Otra sentencia común serán los insert . Con esto podrás agregar nuevos registros a una tabla. INSERT INTO user(firstname, lastname) VALUES( Guason’, ‘Joker’);

update: Un ejemplo de update para actualizar un registro. UPDATE user SET firstname= ‘John’ WHERE id = 123;

delete: Un ejemplo de delete para eliminar un registro. DELETE FROM user WHERE id = 123;

Sobre SQL hay muchas guias. Tomate el tiempo para aprender estos conceptos básicos y avanza luego en profundizar principalmente sobre las queries (select) para obtener resultados y estadísticas basadas en diferentes condiciones.

GIT

¿Por qué necesitas un sistema de control de versiones como Git?

Cuando trabajes con proyectos dentro de un equipo vas a participar junto a otros desarrolladores en cambios sobre el mismo código en paralelo. Por lo tanto, se necesita algún sistema que garantice que no haya conflictos entre los desarrolladores que trabajen simultáneamente.

Git te ayudará registrando los cambios que fueron realizados por los diferentes miembros del equipo a lo largo del tiempo, evitando que se sobreescriben cambios de forma involuntaria y permitiendo un ‘versionado’ de todos los cambios.

Este versionado permite conocer qué se hizo con el código, quién lo hizo, por qué se hizo y recuperar una versión anterior del código si se desea.

Sumado a esto, los requisitos sobre los proyectos cambian continuamente. Un sistema de control de versiones como GIT ayuda a los proyectos a mantener el código productivo mientras se realizan cambios sobre el código. El código se ramifica (branches) para realizar modificaciones sobre casos puntuales del negocio y luego una vez probada la rama se lleva a producción.

GIT es además muy valioso para tu trabajo local. Puedes volver atrás cambios que estas probando, no te gustaron o no funcionaron rápidamente. Realizar pequeñas pruebas y descartarlas rápidamente sin perder todo lo hecho ni preocuparte de ‘pisar’ cambios que ya validaste. Bajar (pull) los cambios que otros desarrolladores han hecho para mantener tu codigo al día mientras lo modificas.

Estos son los comando que mas utilizo día a día y que te recomiendo los tengas a mano:

git config: Para configurar nombre de usuario, e-mail, entre otras configuraciones propias de git.

git init: Para inicializar un repositorio GIT en un proyecto nuevo o existente.

git clone: Para clonar un proyecto desde una fuente remota y mantener un control entre el código local y remoto.

git status: Para verificar el estado de todos los archivos que han cambiado en tu carpeta de trabajo desde el último commit.

git add: Para agregar cambios el índice de GIT a fin de mantener un track del mismo.

git commit: Para confirmar los cambios que fueron agregados al índice de GIT .

git push: Para ‘subir’ los cambios que ya hiciste commit al repositorio remoto.

git pull: Para bajarse los cambios que están arriba en el repositorio remoto.

git branch: para ver todas las ‘ramas’ locales y remotas (git branch -r) que se han creado.

git checkout: Para cambiar de branch o para crear otro branch y cambiar a ese branch inmediatamente (git checkout -b )

git stash: Para guardar y ocultar los cambios de modo temporal.

git merge: Para mezclar cambios entre branches.

git reset: Para moverse a otro commit realizado previamente. Según los parámetros (soft / hard) pueden o no perderse los cambios locales

git remote: Para verificar cual es el repositorio remoto al que está asociado el repositorio local o establecer un repositorio remoto.

Hay muchos comando más y muy útiles. Esfuerzate por entender bien Git, será un gran aliado en tu trabajo diario.

Metodologías Agile

Recuerdo los tiempos en los que trabajaba con metodologías en cascada y luego cuando empece a trabajar con Agile. Se me cae una lagrima de nostalgia (me estoy poniendo viejo). Realmente fue algo extraordinario empezar a usar Agile.

Senior Dev Agile

Agile es un proceso que ayuda a los equipos a entregar de forma más rápida soluciones a fin de obtener feedback temprano. Se destaca en la satisfacción del cliente, en la flexibilidad ante nuevos requisitos, en entregas en periodos cortos, en la motivación, la confianza, la calidad y en la autogestión entre otros puntos. Busca el Manifiesto Agile.

Los principios que son comunes al método ágil:

  • Satisfacer al cliente y desarrollar software de forma continua .
  • Aceptar que los requisitos son cambiantes para la ventaja competitiva del cliente.
  • Entregar software de forma frecuente en el menor tiempo posible.
  • El equipo de desarrollo y el cliente deben trabajar siempre juntos.
  • El equipo que trabaja los proyectos debe estar motivado. Se debe confiar en ellos para hacer su trabajo.
  • La comunicación cara a cara es la mejor manera de transferir información hacia y desde un equipo.
  • La entrega de software es la mejor forma de medir el progreso.
  • El desarrollo debe ser sostenible. Los patrocinadores, los desarrolladores y los usuarios deberían poder mantener un ritmo indefinido y constante.
  • Promover la excelencia técnica y el buen diseño..
  • La simplicidad maximiza el trabajo.
  • Los equipos autoorganizados crear los mejores diseños.
  • A intervalos regulares, el equipo reflexionará (retros) sobre cómo ser más efectivos como equipo y tomará acciones para ello.

Algo que me gusta de Agile son los Sprint. Un sprint es un período de tiempo asignado para una fase particular de un proyecto y se repiten de forma regular durante todo el proyecto. Cada Sprint se planifica con los miembros del equipo y todos se comprometen con la planificación. Los Sprint son cortos, de dos a tres semanas en general, por lo que rápidamente se entrega valor y se recibe feedback.

Inglés

No requiere mucha explicación este punto. Inglés, el idioma universal y aún más que universal en el software. Me ha tocado trabajar con equipos dispersos alrededor del mundo y saber Inglés fue la única herramienta para comunicarnos con los trabajos con equipos remotos de distintas partes del mundo.

Necesitas y debes aprenderlo, llegar a un nivel suficiente para entender una conversación y brindar tus opiniones de modo claro.

Además de esto siempre escribe tu código en Ingles, por favor. Casi ruego aquí. Duele ver código escrito en español u otros idiomas distintos al Inglés. Es una realidad, todas las sentencias de lenguajes de programación están escritas en inglés, por favor continua usando el mismo lenguaje en el que escribes tus programas: Inglés.

Soft Skills

Más allá de todo lo técnico hay otros aspectos que hacen a un buen desarrollador que aplica a todos los senioritis pero que se esperan no falten en un desarrollador Senior.

La capacidad de comunicarse de forma clara y con convicción (pero sin terquedad) en lo que dice. Debes ser claro, conciso y confiado en lo que expresas a diario. Saber escuchar, prestar atención y escuchar las opiniones de otros con empatía.

Teamwork o trabajo en equipo. Siempre y de algún modo, tendrás que trabajar dentro de un equipo, por más pequeño que sea. Necesitas colaborar, ayudar, participar y divertirte dentro del equipo. Discrepar con educación respetando lo que otros opinan.

Mantener tu mente abierta y disponible para nuevas ideas, nuevas formas de hacer las cosas y soluciones distintas a las que habitualmente usas.

Resolver problemas, tuyos y ayudar en los problemas de otros. La forma en que piensas las soluciones es un ejercicio diario que requiere práctica, como todo. La agilidad en resolver problemas se obtiene resolviendo problemas, involucrándose en ellos y siendo parte de la solución al problema de algún modo. Los problemas son siempre oportunidades para hacer algo mejor, distinto o para aprender. Participa en los problemas brindando tus ideas, tu tiempo y recuerda que los problemas se resuelven muchas veces mejor entre varios. No te quedes solo ante un problema, pide ayuda siempre que la necesites.

La curiosidad para preguntar, investigar e indagar. No te quedes nunca con dudas. La experiencia me ha enseñado que cuando no pregunto al principio, luego las dudas se acumulan exponencialmente.

La empatía con tu equipo. Todos pasamos por momentos de mayor y menor lucidez, cometemos errores y sufrimos presiones dentro y fuera del ámbito de trabajo. Si vemos a un compañero con problemas, distraído, con errores involuntarios; acercarnos, entregar una palabra amable y saber que le está pasando dará un aire de comprensión y creará un clima colaborativo muy positivo.

El que mucho abarca poco aprieta:

He sido developer Junior (obvio), y tengo muchos compañeros junior. Algo que caracteriza a los que recién empiezan, son las ganas de saber todo. Saber todos los lenguajes que surge, todos los frameworks nuevos y todas las tecnologías que van naciendo cada día.
Es excelente que así sea, sin embargo saber un poco de todo no te convertirá en un especialista que se distinga en conocimiento por sobre el resto.

Intenta establecer tus objetivos, qué es lo que te gusta y concéntrate en convertirte en un experto en el tema. Sé un referente, alguien a quien otros acuden a preguntar ante dudas y que el resto reconoce como el experto en el tema.

Conclusión:

Para convertirte en un Senior Developer enfocate en tu carrera. Pongo en negrita enfocarse, porque es algo difícil hoy con la basta cantidad de herramientas y cambios que hay en nuestra profesión día a día. Enfócate en un plan, en los pasos que te propones y debes cumplir para llegar a tu objetivo. Busca primero conocer las bases que te sugiero en este artículo. Es lo que perdurará y te acompañara hasta que llegues a ser un Senior Developer.