Ejercicios
Aquí están todos los ejercicios del curso en un solo lugar, por módulos. Cada uno lleva a la lección que explica lo que necesitas.
Ejercicios de las lecciones
Sección «Ejercicios de las lecciones»Patrones de diseño
- Por qué patrones
- Strategy
- Observer
- Factory Method y Simple Factory
- Builder
- Singleton e inyección de dependencias
- Adapter y Facade
- Decorator
- Composite
- Command
- State
- Template Method e Iterator
- Repository
- La tienda: qué patrón dónde: Los estados del pedido · Un descuento sobre 100 € · Un almacenamiento que recuerda · Un mensajero ajeno
Código limpio y refactorización
- Nombres en el código
- Funciones: una tarea, pocos parámetros, sin efectos secundarios ocultos
- Comentarios que mienten y comentarios que ayudan
- Code smells: método largo, clase grande, duplicación, primitivos en vez de tipos, cadenas largas de if
- Las pruebas como red de seguridad
- Refactorización en pasos pequeños
- SOLID sin dogma
- Ejercicio: una clase desordenada, limpiada paso a paso: El recibo en su propia clase · El plan desde texto · La noche desde la hora · El estudiante
Complejidad
- Complejidad en tiempo: contar pasos
- Big-O: cómo crece el trabajo
- Mejor caso, caso promedio y peor caso
- Complejidad en espacio
- Complejidad amortizada
Búsqueda
Ordenamiento
- Ordenamiento por inserción y por selección
- Ordenamiento por mezcla y «divide y vencerás»
- Quicksort y el mal pivote
- Montículo y ordenamiento por montículo
- Ordenamiento por conteo y radix
- Ordenamiento estable y el ordenamiento incorporado
Recursión
- La pila de llamadas por dentro
- De la recursión al bucle
- Exponenciación rápida
- Divide y vencerás y el árbol de recursión
Estructuras de datos
- El arreglo dinámico por dentro
- Lista enlazada
- Pila y cola
- Tabla hash
- Árbol binario de búsqueda
- Cola de prioridad
- Trie
- Union-Find
Grafos
- Grafo: lista de adyacencia y matriz
- BFS: las menos paradas
- DFS: islas y ciclos
- Ordenamiento topológico
- Dijkstra
- Árbol de expansión mínima
Programación dinámica
- Subproblemas superpuestos
- El problema del cambio
- El problema de la mochila
- La subsecuencia común más larga y diff
- Reconocer un problema de DP
Algoritmos voraces
Técnicas para resolver problemas
Proyecto: navegación por la ciudad
- Navegación por la ciudad
- Navegación por la ciudad
- Navegación por la ciudad
- Navegación por la ciudad
- Navegación por la ciudad
- Navegación por la ciudad
Concurrencia y condiciones de carrera
- Por qué hilos
- Condición de carrera
- Bloqueo
- Operaciones atómicas y objetos inmutables
- Deadlock
- Productor y consumidor
- Grupo de hilos y tareas
- async no es un hilo
- Cómo probar código concurrente
Seguridad para programadores
- Entrada no confiable
- Inyecciones: cuando los datos se vuelven una orden
- XSS: un script ajeno en tu página
- Contraseñas
- Sesiones, cookies y CSRF
- JWT y sus trampas
- Secretos en el código y en git
- Dependencias: el código ajeno que ejecuta el tuyo
- Criptografía que no escribes tú
Arquitectura de software
- Capas
- Arquitectura hexagonal y clean architecture
- Monolito, monolito modular, servicios
- Eventos y colas
- Transactional Outbox
- Diseño de API: contrato, versiones, solicitudes repetidas
- Caché
- Escalado
- ADR: registros de decisiones de arquitectura
El arquitecto en acción
- Requisitos no funcionales que puedes medir
- Trade-offs
- Cuando el vecino es lento: timeout, retry, circuit breaker
- Una transacción entre servicios (Saga)
- Integrar sistemas antiguos y ajenos
- Cambiar un sistema en marcha (Strangler Fig, Expand–Contract)
- Revisión de arquitectura
- El panorama de la empresa y sus capacidades
- Tu primera tarea de arquitectura
- Tu primera tarea de arquitectura
- Tu primera tarea de arquitectura
- Tu primera tarea de arquitectura
- Tu primera tarea de arquitectura
- Tu primera tarea de arquitectura
- Tu primera tarea de arquitectura
- Tu primera tarea de arquitectura