
System design introduction: Cómo empezar aunque no domines la arquitectura de software

Juan Correa
Desarrollador de Software Senior
En este artículo "System design introduction", he preparado todo lo que necesitas para empezar con system design si vas iniciando en este tema.
Comprender cómo diseñar sistemas es crucial para el crecimiento profesional de cualquier desarrollador de software como veremos a continuación.
Table of Contents
Qué es system design en el desarrollo de software
System design en el desarrollo de software es el proceso de diseñar la arquitectura de un sistema para resolver un problema.
Por ejemplo, diseñar un sistema para una aplicación de banca en línea implica definir cómo los usuarios se autentican, cómo se procesan las transacciones y cómo se asegura la integridad de los datos.
La arquitectura implica cuáles van a ser los elementos de un sistema, cómo se comunican entre sí, cómo se van a almacenar los datos, cómo se va a escalar el sistema, cómo se va a monitorear, entre otros.
Cuando trabajas en un proyecto como programador, alguien más ya ha diseñado el sistema.
Alguien ya definió los requerimientos, la arquitectura, los componentes, las tecnologías a utilizar, las tareas a realizar (normalmente tickets o historias de usuario en un software como Jira), entre otros.
Si quieres dar el siguiente paso y crecer como desarrollador de software, es elemental que además de que sepas programar, también sepas cómo diseñar la arquitectura de un sistema.

Qué tipo de sistemas necesitas diseñar
Va a depender de la industria y tipo de empresa en la que trabajes para saber qué tipo de sistemas necesitas diseñar. Por ejemplo:
E-commerce
Sistema de e-commerce, sistema de pagos, sistema de inventario, sistema de logística, sistema de marketing, sistema de atención al cliente, entre otros.
Banca
Sistema de banca en línea, sistema de pagos, sistema de créditos, sistema de inversiones, sistema de seguros, sistema de riesgos, sistema de cumplimiento, entre otros.
Telecomunicaciones
Sistema de telecomunicaciones, sistema de facturación, sistema de atención al cliente, sistema de redes, sistema de seguridad, entre otros.
Salud
Sistema de salud, sistema de historias clínicas, sistema de citas, sistema de laboratorio, sistema de farmacia, sistema de seguros, sistema de investigación, entre otros.
Educación
Sistema de educación, sistema de matrícula, sistema de notas, sistema de biblioteca, sistema de investigación, sistema de administración, entre otros.
Gobierno
Sistema de gobierno, sistema de impuestos, sistema de seguridad, sistema de salud, sistema de educación, sistema de justicia, sistema de transporte, entre otros.
Viajes
Sistema de viajes, sistema de reservas, sistema de pagos, sistema de logística, sistema de atención al cliente, entre otros.
Entretenimiento
Sistema de entretenimiento, sistema de streaming, sistema de juegos, sistema de redes sociales, sistema de publicidad, entre otros.

Como puedes ver, existen muchos tipos de sistemas, pero no es necesario que los domines todos.
Normalmente, te vas a especializar en un tipo de sistema y vas a ir aprendiendo sobre otros sistemas a medida que vayas trabajando en diferentes proyectos.
Ahora bien, el tamaño o tipo de empresa también va a influir en el tipo de sistemas que necesitas diseñar. Por ejemplo:
- Startups: Es muy probable que tengas que diseñar el sistema desde cero sólo para ver que tienes que cambiarlo si aún están buscando "product market fit" (aún están en fase de descubrimiento). Espera muchos cambios y mucha incertidumbre. La flexibilidad del sistema a los cambios es clave.
- Empresa grande: Puedes esperar un ritmo mucho más lento, estable y algunas veces, burocrático. Es posible que debas diseñar sistemas que se integren con otros sistemas existentes. La estabilidad y la escalabilidad del sistema son clave.
- Consultora: Quizá tengas la oportunidad de exponerte a diferentes industrias y tipos de sistemas, pero las tomas de decisiones no siempre dependen de ti ya que el cliente es el que manda. La adaptabilidad y la comunicación con el cliente son clave, además de la calidad del sistema.
Estos son sólo ejemplos. Va a depender de la industria y tipo de empresa en la que trabajes para saber qué tipo de sistemas necesitas diseñar.
System design introduction: Qué necesitas saber para empezar
Necesitas primero ser un buen desarrollador de software antes de ser un buen diseñador de sistemas.
¿Cómo puedes saber si ya estás listo para empezar con system design?
Te voy a compartir una lista de 7 conceptos y conocimientos que debes tener para que hagas una autoevaluación:
- Habilidad para resolver problemas: Debes ser capaz de descomponer un problema en problemas más pequeños y resolverlos uno a uno, siempre con la capacidad de traducir ideas a código. Esto debes tenerlo si ya estás trabajando como desarrollador de software.
- Conceptos de ciencias de la computación: Por lo menos debes conocer las principales estructuras de datos, algoritmos, calcular la complejidad computacional y cómo se guarda la información en la memoria de la computadora.
- Programación: Debes saber programar en al menos un lenguaje de programación, como JavaScript, Go, Python, etc. Debes conocer tipos de paradigmas de programación, ventajas y desventajas del lenguaje que utilizas, cómo se ejecuta el programa en la máquina (¿Se compila? ¿Se interpreta?).
- Principios de diseño de software: Debes conocer los principios SOLID, DRY, KISS, YAGNI, entre otros. Debes saber cómo escribir código limpio, cómo hacer pruebas unitarias, cómo refactorizar código, cómo documentar código, entre otros.
- Bases de datos: Es importante que tengas experiencia trabajando con bases de datos, comprender las diferencias entre una base de datos relacional y no relacional (o SQL y NoSQL), conocimientos en indexación, normalización y transacciones.
- Redes: Si tienes una aplicación web, entonces debes conocer cómo es posible que al ingresar una url, la petición conozca a qué servidor debe llegar y cómo se comunica el cliente con el servidor usando peticiones HTTP.
- Sistemas operativos: Sólo necesitas conocer los conceptos básicos de sistemas operativos, como procesos, hilos, memoria, archivos, entrada/salida.
Visión general de system design
Si ya tienes la mayoría de los conocimientos anteriores, entonces estás listo para empezar con system design.
En cualquier sistema que diseñes, vas a tener que tomar decisiones sobre:
- Requerimientos: ¿Cuál es el problema que queremos resolver?
- Diseño arquitetónico: Componentes y su comunicación.
- Componentes del sistema: Monolitos, microservicios, funciones, etc.
- Almacenamiento de datos: Bases de datos relacionales, no relacionales, caché, etc.
- Escalabilidad: Estrategias de escalabilidad horizontal y vertical.
- Seguridad: Protección de datos y comunicaciones.
- Monitoreo: Supervisión de componentes y accesos.
- Costos: Estimación de costos de infraestructura y mantenimiento.
Lo común es que en entrevistas técnicas de system design te den un problema y te pidan que diseñes un sistema que resuelva ese problema por medio de un diagrama.
Por ejemplo, te pueden pedir que diseñes un sistema de chat, un sistema de recomendaciones, un sistema de búsqueda, un sistema de inventario, un sistema de pagos, entre otros.
Pero system design no sólo se usa en entrevistas técnicas, también se usa en la vida real cuando estás trabajando en un proyecto de software.
Cuando trabajas en un proyecto de software, es común que realices un documento de diseño de sistema que contenga la arquitectura del sistema, los requerimientos, los casos de uso, los componentes, las tecnologías a utilizar, los diagramas y todo lo que se requiera para que un equipo lo pueda implementar.
Siguientes pasos para aprender system design
Como puedes ver, esto no es más que el principio de system design. Todo lleva su tiempo y su práctica.
El siguiente paso es que comiences a familiarizarte con los conceptos de system design y veas algunos ejemplos reales.
Para ello, te recomiendo: System design concepts: Los 10 conceptos más importantes que debes conocer