El otro día me preguntaron: ¿qué es lo que diferencia un Junior/Mid de un Senior?

Y la verdad es que la pregunta me dejó pensando.

La respuesta no es tan trivial y es bastante subjetiva de responder.

Primero, todo depende de la empresa para la que trabajes y cuáles sean sus estándares. En la empresa A puedes ser un Mid-level, pero luego para la empresa B eres un Senior o viceversa.

Pero que pasa con las habilidades y que diferencia un Senior de un Junior/Mid?

Bueno, normalmente un Junior tiene la experiencia para escribir un CRUD, conectar una base de datos ó crear un servidor, pero esto no es realmente impresionante.

Qué pasa cuando hay que modelar datos, manejar eventos, colas o infraestructura? Normalmente cuando uno como desarrollador está comenzando, se queda en la zona de confort porque abruma bastante todo lo que hay allá afuera por aprender.

Y lo entiendo. A mi me pasó.

Pero hay un momento en el que le tienes que dar un parado a ese síndrome del impostor y entonces tomar las riendas de tu carrera.

Aquí te voy a poner unos puntos de cosas que puedes aprender y que sin duda van a aportar mucho a tu crecimiento profesional.

1. Modelado de datos

Aprender a modelar datos puede ser una de las habilidades infravaloradas dentro de la industria, pero que va a afectar al negocio directamente.

Imagina que te encomiendan un proyecto en el cual se van a requerir nuevos modelos de datos. Vas a necesitar hacer un modelo o una arquitectura que cumpla con:

  • Resolver el problema específico.
  • Debe encajar con el sistema ya existente.
  • Debe poder escalarse fácilmente.
  • Debe ser eficaz.

Todo esto vas a tener que resolverlo ya sea con una base de datos relacional o basada en documentos, entonces aquí es donde comienza el juego.

Vas a tener que hacer un pequeño estudio e investigar múltiples variables para poder conocer cómo cada una de ellas van a afectar la arquitectura y el problema que estás intentando resolver.

Y esto que te digo es simplemente una capa superficial. Te recomiendo estos dos libros si te interesa ir más profundo con el tema:

2. Manejo de eventos, colas y workers

Si eres junior, seguramente estés acostumbrado a trabajar con APIs que procesan los datos en tiempo real, pero allí no acaba la cosa.

Existen sistemas distribuidos que trabajar de forma asíncrona y que están dirigidos por eventos (aquí hablamos un poco de eso).

El modelo mental que tienes que utilizar es totalmente diferente a cuando trabajas con una API "normal". Te pongo un ejemplo:

Supongamos que tu aplicación necesita enviar una campaña de correos a millones de clientes. Vas a necesitar un servidor con recursos MUUUY caros para ejecutar la tarea en una sola corrida.

En lugar de eso, vamos a:

  • Lanzar los correos a una cola.
  • Los workers van a escalar y a recogerlos en lote.
  • Se van a enviar de forma asíncrona.

3. Infraestructura auto-escalable

Este es un tema con el que me topé hace poco, pero sin duda es bastante interesante.

Resulta que cuando un sistema tiene muchos picos de carga, lo óptimo es que este escale sin la necesidad de que haya intervención humana.

Con esto me refiero que si inicialmente se estaba utilizando un servidor y por alguna razón entraron un millón de usuarios a la app, entonces ese pico de carga debe distribuirse en múltiples servidores para evitar que el servicio se caiga.

Esta distribución debe ocurrir de forma automática y sin intervención humana.

Allí es donde entra en juego las instancias EC2 para los servicios que son un monolito y para micro-servicios puedes implementar un auto-escalado horizontal de pods en Kubernetes.

4. Servicios en la Nube

La mayoría de empresas modernas ejecutan sus aplicaciones y servicios en servicios como AWS, Azure, Google Cloud, Digital Ocean, etc.

Personalmente he estado utilizando el servicio de Amazon (AWS) y hemos resuelto bastantes problemas de distribución y escalado del negocio.

Aquí te dejo una lista de las herramientas más populares:

  • S3: Almacenamiento ilimitado para páginas estáticas, imágenes, videos, recursos.
  • EC2: Para ejecutar monolitos en servidores.
  • SNS, SQS: Arquitectura basada en eventos y colas de mensaje.
  • Kafka: Flujo de eventos.
  • ECR: Almacena y comparte de forma sencilla tus contenedores de Docker.

La verdad hay una infinidad de herramientas y servicios disponibles que provee Amazon y peor aún si incluimos a los otros proveedores. Te menciono estos porque puedes comenzar por allí e ir experimentando.

5. La Caché

Estoy seguro que al menos una vez escuchaste decir "Eso seguramente es la caché del navegador, refresca".

Yo creo que si bien todos sabemos sobre el almacenamiento en caché y todos hablamos de eso, no todo el mundo tiene experiencia real utilizándolo.

Si quieres conocer sobre casos de uso reales utiliza los blogs de ingeniería de las empresas como Figma, Twitch, Shopify, Dropbox, AWS, Github, etc.

Algunos tipos de caché que existen:

  • Caché de sitio - Sirve el contenido rápidamente a los visitantes del sitio web.
  • Caché de aplicación/salida - Caché HTML a nivel de servidor.
  • Caché de datos distribuidos - Redis, Memcached, GemFire.
  • Caché de archivos - CDN para archivos estáticos, imágenes, multimedia.

Para finalizar

Comienza a experimentar y deja de hacer CRUDs aburridos y TO-DO Lists.

Está bien que hayas aprendido desarrollando esas aplicaciones, pero ahora que ya sabes un lenguaje, te invito a ir más allá.

No importa si no eres experto, es más importante que sepas sobre sistemas, arquitectura de software y a resolver problemas.

Los lenguajes de programación vienen y van.

3 Noticias para ti

Nos vemos en la edición #13

Ten siempre presente, los lenguajes de programación son una moda. Aprende a resolver los problemas del negocio con tecnología.

Recuerda que si quieres hablar de algo en particular puedes sugerir el tema respondiendo este correo.

Hasta pronto 👊🏼

Nicolás Leal.

#12 - 5 Habilidades para dejar de ser Junior

Aquí te explico 5 tópicos que puedes comenzar a estudiar para dejar de hacer CRUDs aburridos.