🚀 Aprendo en Público

Documentando mi viaje de aprendizaje en programación para inspirar a otros desarrolladores

📅 6 de Noviembre, 2025

Entendiendo el Algoritmo de Ordenamiento QuickSort

JavaScript Algoritmos

Hoy profundicé en el algoritmo QuickSort y finalmente comprendo por qué es tan eficiente. La clave está en la estrategia "divide y vencerás" y la elección del pivote.

💡 Lo que aprendí:

QuickSort tiene una complejidad promedio de O(n log n), pero puede degradarse a O(n²) en el peor caso si el pivote no se elige correctamente. Implementar la versión aleatoria del pivote reduce significativamente este riesgo.

function quickSort(arr) {
  if (arr.length <= 1) return arr;
  const pivot = arr[Math.floor(Math.random() * arr.length)];
  const left = arr.filter(x => x < pivot);
  const middle = arr.filter(x => x === pivot);
  const right = arr.filter(x => x > pivot);
  return [...quickSort(left), ...middle, ...quickSort(right)];
}
María González
¡Excelente explicación! Me ayudó a entender por qué elegir un pivote aleatorio mejora el rendimiento.
Carlos Ruiz
Tu implementación es muy clara. ¿Has considerado compararlo con MergeSort en términos de uso de memoria?
Ana López
Gracias por compartir tu proceso de aprendizaje. Me inspira a documentar el mío también.
📅 5 de Noviembre, 2025

Mi Primera Aplicación con React Hooks

React JavaScript

Después de semanas estudiando React, finalmente creé mi primera app funcional usando hooks. useState y useEffect ya no son un misterio para mí.

💡 Lo que aprendí:

Los hooks transformaron completamente mi forma de pensar sobre componentes. useEffect es increíblemente poderoso para manejar efectos secundarios, y entender su array de dependencias fue crucial para evitar renders innecesarios.

const [count, setCount] = useState(0);

useEffect(() => {
  document.title = `Clicks: ${count}`;
  return () => console.log('Cleanup');
}, [count]);
Pedro Martínez
¡Bienvenido al mundo de React! Espera a descubrir useContext y useReducer, son increíbles.
Laura Sánchez
Tu explicación del array de dependencias es muy clara. Me hubiera ahorrado muchos dolores de cabeza al comenzar.
📅 3 de Noviembre, 2025

Resolviendo Problemas de LeetCode con Python

Python Algoritmos

Empecé mi desafío de 30 días en LeetCode. Hoy resolví el problema "Two Sum" y aprendí sobre la importancia de los hash maps para optimizar búsquedas.

💡 Lo que aprendí:

La diferencia entre O(n²) y O(n) es dramática en la práctica. Usar un diccionario en Python para almacenar valores previos transformó mi solución de lenta a instantánea. La estructura de datos correcta lo cambia todo.

def two_sum(nums, target):
  seen = {}
  for i, num in enumerate(nums):
    complement = target - num
    if complement in seen:
      return [seen[complement], i]
    seen[num] = i
  return []
Diego Fernández
¡Sigue así! LeetCode es una de las mejores formas de mejorar tus habilidades de resolución de problemas.
Sofía Ramírez
Tu explicación sobre hash maps es perfecta. ¿Planeas hacer más problemas de patrones similares?
Javier Torres
Yo también estoy en el desafío de 30 días. ¡Ánimo compañero!
Isabel Moreno
Me encanta cómo explicas la complejidad temporal. Muy didáctico.
📅 1 de Noviembre, 2025

CSS Grid vs Flexbox: Cuándo Usar Cada Uno

HTML/CSS JavaScript

Siempre he usado Flexbox para todo, pero hoy descubrí que CSS Grid es mucho más poderoso para layouts bidimensionales. Reconstruí mi portfolio usando Grid y el código quedó mucho más limpio.

💡 Lo que aprendí:

Flexbox es unidimensional (fila o columna), mientras que Grid es bidimensional (filas y columnas simultáneamente). No son competidores, son complementarios. Grid para el layout principal, Flexbox para componentes internos.

.container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 2rem;
}
Roberto Silva
¡Exacto! Yo tardé meses en entender que Grid y Flexbox trabajan mejor juntos.
Carmen Vega
Tu explicación de unidimensional vs bidimensional es perfecta. Me ayudó mucho.
📅 30 de Octubre, 2025

Construyendo mi Primera API REST con Node.js y Express

Node.js JavaScript

Hoy fue un gran día: creé mi primera API REST funcional. Implementé CRUD completo para un sistema de tareas y aprendí sobre middlewares, routing y manejo de errores.

💡 Lo que aprendí:

Los middlewares son el corazón de Express. Entender el flujo request-response y cómo los middlewares se encadenan fue el momento "eureka". También aprendí la importancia de manejar errores de forma centralizada para mantener el código limpio.

app.use(express.json());

app.get('/api/tasks', (req, res) => {
  res.json(tasks);
});

app.use((err, req, res, next) => {
  res.status(500).json({ error: err.message });
});
Fernando Castro
¡Felicidades! El siguiente paso es conectar tu API a una base de datos como MongoDB.
Patricia Herrera
Tu explicación de middlewares es muy buena. ¿Has considerado agregar autenticación JWT?
Miguel Ángel Díaz
Me gusta cómo documentas cada paso. Inspira a seguir aprendiendo.
📅 28 de Octubre, 2025

Async/Await: De la Confusión a la Claridad

JavaScript Python

La programación asíncrona siempre me pareció intimidante. Después de días estudiando Promises y async/await, finalmente todo tiene sentido. Es increíble cómo simplifica el código.

💡 Lo que aprendí:

Async/await no es magia, es azúcar sintáctico sobre Promises. Entender que await "pausa" la ejecución sin bloquear el thread principal fue clave. El manejo de errores con try/catch hace el código mucho más legible que .catch().

async function fetchUserData(id) {
  try {
    const response = await fetch(`/api/users/${id}`);
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('Error:', error);
  }
}
Raúl Jiménez
¡Muy bien explicado! El paso de callbacks a async/await cambió mi vida como desarrollador.
Valentina Rojas
Me encanta tu enfoque de aprendizaje. ¿Has explorado Promise.all() para operaciones paralelas?
📅 26 de Octubre, 2025

Programación Dinámica: Mi Primer Breakthrough

Algoritmos Python

Finalmente entendí la programación dinámica después de resolver el problema de Fibonacci de múltiples formas. La diferencia entre recursión simple y memoization es alucinante.

💡 Lo que aprendí:

La programación dinámica es sobre evitar recalcular subproblemas. Fibonacci recursivo tarda años con n=40, pero con memoization es instantáneo. Este concepto es fundamental para problemas de optimización complejos.

def fib_memo(n, memo={}):
  if n in memo:
    return memo[n]
  if n <= 2:
    return 1
  memo[n] = fib_memo(n-1, memo) + fib_memo(n-2, memo)
  return memo[n]
Gabriela Mendoza
¡Excelente! Ahora intenta resolver el problema de la mochila (knapsack). Es perfecto para practicar DP.
Andrés Vargas
Tu código es muy claro. ¿Has considerado implementar la versión bottom-up también?
Lucía Ortiz
Me encanta tu entusiasmo por el aprendizaje. Sigue compartiendo tu progreso.

🔍 No se encontraron resultados

Intenta con otros términos de búsqueda o categorías