Diseño de Sistemas a Gran Escala y Arquitectura de Software
What you'll learn
- Atributos de un sistema software a gran escala.
- Diseñar sistemas con alta escalabilidad, disponibilidad y fiabilidad.
- Diseñar sistemas que soporten decenas de millones de usuarios concurrentes.
- Prepararte para entrevistas de diseño de sistemas (system design).
- Patrones de Arquitectura Software. Arquitecturas multilayer y multitier, Microservicios, CQRS y Event Sourcing.
Requirements
- Conocimientos básicos de programación y diseño de software.
Description
Como programadores, muchas veces nos centramos demasiado en las funcionalidades de nuestro sistema y no le damos el valor que merece a la escalabilidad y a la disponibilidad .
La mayoría de aplicaciones que utilizamos en nuestro día a día son bastante sencillas en cuanto a funcionalidades. El mayor reto de un programador no es implementar dichas funcionalidades, si no que las mismas funcionen de forma eficiente para decenas de millones de usuarios concurrentes.
En este curso veremos una serie de componentes, técnicas y patrones para construir sistemas con alta escalabilidad, rendimiento, disponibilidad y fiabilidad.
Los contenidos del curso serán los siguientes:
Atributos de calidad de un sistema a gran escala. Empezaremos con una introducción viendo la importancia de la arquitectura de software y comentando en detalle los atributos de calidad que todo sistema a gran escala debe tener. Esos son el rendimiento, la escalabilidad, la fiabilidad y la mantenibilidad.
Conceptos clave en el diseño de sistemas a gran escala. A continuación, pasaremos a ver una serie de componentes que nos ayudarán a escalar nuestras aplicaciones y servidores. Veremos los Load Balancer o balanceadores de carga, las API Gateway, los Message Brokers, la Caché, los CDN o Content Delivery Network y el despliegue multi data center.
Almacenamiento de datos a gran escala. También trataremos en detalle ciertas técnicas para conseguir que nuestro almacenamiento de datos escale bien. Empezaremos viendo los distintos tipos de sistemas de almacenamiento disponibles, comparando los sistemas relacionales con los no relacionales o NoSQL. A continuación, veremos los índices y la desnormalización, y pasaremos a técnicas más complejas como la replicación de datos y el particionado de Base de Datos o sharding. Para finalizar la sección, veremos el teorema CAP.
Patrones de Arquitectura Software. Veremos una serie de opciones para organizar nuestro software a más bajo nivel. Comentaremos las arquitecturas multilayer y multitier, la arquitectura orientada a microservicios, el Command Query Responsibility Segregation o CQRS y el Event Sourcing.
Ejercicios Prácticos. Para finalizar el curso, aplicaremos todo lo aprendido en las secciones teóricas analizando y diseñando una serie de sistemas a gran escala reales. Propondremos diseños para un acortador de URLs como tinyurl o bitly, un sistema de chat como WhatsApp, Telegram o Facebook Messenger, un E-Commerce como Amazon o Ebay y un sistema de publicaciones cortas como Twitter.
Este curso no sólo te va a ayudar si quieres mejorar tus conocimientos en arquitectura de software y diseño de sistemas. También te ayudará si te estás preparando para pasar entrevistas de system design que piden en muchas empresas a partir de niveles mid o senior.
Quiero recalcar que en este curso no se va a tratar nada de código. El diseño de sistemas y la arquitectura de software es un tema a alto nivel y no depende estrictamente de los lenguajes y las tecnologías usadas, por lo que no tiene sentido incluirlas ni debe estar en el alcance de este curso.
El primer paso ya lo has dado, te has interesado por la Arquitectura de Software y el diseño de sistemas ¡Te animo a unirte a este curso para mejorar como programador!
Who this course is for:
- Profesionales que quieran aprender sobre la arquitectura de software y el diseño de sistemas.
- Profesionales que aspiren a posiciones mid-level, senior o superior.
- Programadores que quieran escalar su sistema a millones de usuarios concurrentes.
- Personas que estén preparando entrevistas de diseño de sistemas (system design).
Instructor
Graduado en Ingeniería Informática, actualmente trabajo como Ingeniero de Software en MongoDB, desarrollando aplicaciones de manera full stack, en un entorno ágil que sigue las buenas prácticas del desarrollo de software. Previamente, estuve tres años en Dublín, trabajando en Salesforce.
Cuento con diez años de experiencia en Java, siete de ellos de forma profesional. También he desarrollado webs y distintos proyectos personales, además de tres aplicaciones Android, una de ellas llegando a las 95.000 descargas.
En todos estos años que llevo programando, me he interesado mucho por la calidad del código, aplicando los principios SOLID y Clean Code. Esto lo considero fundamental para desarrollar aplicaciones fáciles de mantener en el medio y largo plazo.
Otros lenguajes / tecnologías en las que tengo experiencia: C#, Python, Typescript, Javascript, Docker, Jenkins, SonarQube, Nexus, Maven, Git, Wordpress, Android, Raspberry Pi.
Si tienes alguna duda sobre mis cursos o cualquier otro tema relacionado con el desarrollo de software no dudes en contactarme por Linkedin o Twitter. Te responderé encantado!
Disclaimer: Ninguno de mis cursos tienen relación con MongoDB como empresa. Mis cursos son desarrollados de forma totalmente independiente al trabajo desempeñado en MongoDB.