Faragiri

Aprender Fundamentos de programaciónProgramación

Los ocho temas de abajo contestan una sola pregunta: qué cuesta una operación cuando hay más datos. Es la parte que no se pierde al cambiar de lenguaje.

5Secciones
7Minutos
2Profundidad

Ocho temas, una pregunta

Los ocho no van en fila: los ocho preguntan lo mismo

Están sobre una pista y no en un orden porque una falla en cualquiera de ellos se termina pagando en otro.

Qué cuesta cuando hay más datos
  • Cómo corre el código
  • Los bloques básicos
  • Estructuras de datos
  • Algoritmos
  • Programación orientada a objetos
  • Patrones de diseño
  • Código que se puede mantener
  • Depuración
  • 01Cómo corre el códigoLo que la máquina cobra de verdad, debajo de todo lo demás
  • 02Los bloques básicosLas cinco construcciones, y el costo escondido en la que va indentada
  • 03Estructuras de datosUna apuesta sobre cuál operación va a repetirse más
  • 04AlgoritmosAlguien ya encontró el camino barato y le puso nombre
  • 05Programación orientada a objetosEl mismo trato al tamaño de un programa y no al de un ciclo
  • 06Patrones de diseñoFormas con nombre, y caras cuando se aprenden antes del problema
  • 07Código que se puede mantenerEl precio de la segunda lectura, que suele ser la tuya en ocho meses
  • 08DepuraciónLo que se paga cuando alguno de los otros siete se adivinó

No dice cuánto se tarda cada uno en aprenderse, que varía muchísimo y sin relación con su lugar aquí. La depuración es la más corta de explicar y la última en llegar.

Yesenia Ocampo terminó el tecnólogo en análisis y desarrollo de software en Pereira y puede definir una tabla hash sin pensarlo. En marzo le pidieron cruzar los 3800 aprendices del centro contra los horarios de taller, para encontrar a quién le habían asignado dos talleres a la misma hora. Escribió catorce líneas que comparaban cada aprendiz contra cada uno de los demás: 14.44 millones de comparaciones, y seis minutos de espera para contestar una pregunta de horarios.

La palabra la tenía desde segundo semestre. El precio no.

Hay un detalle de esta orilla que alarga el asunto: le echó la culpa al portátil, que tiene seis años. Una máquina vieja vuelve visible el costo de una forma mal elegida y al mismo tiempo ofrece una explicación falsa que siempre está a la mano. Quien programa en un equipo recién comprado tarda dos años en ver un número así; aquí el número aparece la primera semana, con el culpable equivocado ya escrito al lado.

Los ocho temas de abajo son una sola pregunta hecha en ocho tamaños

La pregunta es qué cuesta una operación cuando hay más datos. Una estructura de datos es una apuesta sobre cuál operación va a repetirse más. Un algoritmo es una ruta que alguien ya midió y bautizó: la búsqueda binaria descarta la mitad de la lista en cada paso, así que los 3800 aprendices se resuelven en doce miradas en vez de en 3800. Un patrón de diseño es el mismo trato hecho al tamaño de un programa entero en vez de al de un ciclo. Hasta los hábitos de código que se puede mantener son un precio: el de la segunda lectura, que suele ser la de uno mismo ocho meses después.

Por eso los ocho van juntos, y por eso este tema es la parte de programación que conserva su valor cuando cambia el lenguaje. Ninguno de los ocho va primero. Yesenia no necesitaba el nombre de lo que había escrito. Necesitaba saber que la forma que eligió tenía tarifa, y que otra forma tenía otra. Lo que queda afuera de este tema es lo que pasa después de que el programa sirve, y eso vive en la puesta en producción.

Tres precios, antes de abrir cualquier tema

El primero arregló el cruce de horarios. Una lista se recorre hasta encontrar lo que se busca, así que el trabajo crece con el largo de la lista. Un diccionario se direcciona: la clave se convierte en una posición, y esa posición se mira una vez. Por eso una búsqueda en un diccionario cuesta lo mismo con diez elementos que con diez millones, y por eso el cruce entero cabe en una pasada que va archivando a cada aprendiz bajo su hora y avisa cuando el casillero ya estaba ocupado.

  • ocupado = {}
  • for a in aprendices:
  • clave = (a.documento, a.hora)
  • if clave in ocupado: print(a.nombre, ocupado[clave])
  • ocupado[clave] = a.taller

3800 consultas en lugar de 14.44 millones de comparaciones, y contesta antes de que la terminal termine de desplazarse. El diccionario de Python conserva el orden de inserción desde la versión 3.7, de 2018, y eso conviene saberlo porque bastante material anterior manda buscar otra estructura para recuperarlo.

El segundo precio es lo que Yesenia había escrito de verdad. Dos ciclos anidados sobre una misma lista es n al cuadrado, y el número se va de las manos más rápido de lo que permite la intuición: mil aprendices son un millón de comparaciones, y duplicar el centro cuadruplica el trabajo en lugar de duplicarlo. El hábito que sirve no es calcular la cifra exacta. Es notar el segundo for indentado bajo el primero y preguntarse de qué tamaño va a estar esa lista el año entrante.

El tercero no tiene que ver con la velocidad y produce los errores más raros de explicar. Cuando Yesenia sacó una copia de trabajo del listado para ir tachando lo revisado, escribió revisados = listado, y al quitar un nombre de revisados el nombre desapareció también de listado. La misma lista con dos nombres es una sola lista con dos nombres. Un nombre es una etiqueta pegada a un objeto, no una caja con una copia adentro, y revisados = list(listado) es la línea que hace existir la segunda lista. Pasa igual en casi todo lenguaje que pasa referencias, y cada uno lo escribe distinto.

Cuando truena, el marco que hay que abrir primero es el propio

Un programa que lanza un error imprime la cadena de llamadas que seguían abiertas en el momento de detenerse. Un marco de la pila es una función en pausa, esperando a que regrese la que llamó, y la lista de marcos es la ruta que el programa tomó hasta donde murió. El error se notó adentro de una biblioteca instalada; se causó arriba, en un archivo escrito por uno, y ese es el marco que se abre primero.

Leer esa cadena separa arreglar de adivinar, y es la entrada a la depuración. Los dos temas de al lado, cómo corre el código y las estructuras de datos, son las dos mitades de entender por qué la cadena se ve como se ve.

El orden

Cada escalón es lo que le da sentido al siguiente

La escalera se sube al revés por dos caminos distintos: el tutorial entra por el segundo escalón y el temario entra por el tercero.

  1. 01Verse sorprendido por un número una vezVer que algo tarda seis minutos cuando debía tardar uno. Nada de lo de arriba se sostiene sin esto.
  2. 02Aprender qué cuesta cada formaUna lista se recorre, un diccionario se direcciona. Los nombres pueden esperar; los precios no.
  3. 03Encontrarse el mismo problema dos vecesUn patrón leído antes de la segunda vez es una solución sin falla asociada.
  4. 04Escribir para la segunda lecturaLos hábitos aparecen recién cuando uno abre su propio archivo ocho meses después.

No dice cuánto dura un escalón. El primero cabe en una tarde, y a quien programa en una máquina recién comprada le llega a los dos años.

El orden llega al revés, y por dos caminos distintos

El orden que sirve empieza en una sorpresa y termina en un hábito. Casi nadie lo recorre en ese sentido, y la razón cambia según de dónde venga cada quien.

Quien llega de un tutorial de lenguaje aprende las construcciones y no oye la palabra costo en ningún momento. Quien llega de un tecnólogo del SENA o de una ingeniería de sistemas trae lo contrario: notación O grande en el cuaderno, la tabla hash definida en un parcial, y ninguna tarde en que un programa propio se haya tardado seis minutos. Esa segunda persona va más adelante en vocabulario y exactamente igual de atrás en instinto, y el atasco es peor, porque los nombres suenan a materia ya vista.

Tomado al revés, la falla es concreta: alguien que recita qué es un mapa hash y nunca ha visto un ciclo anidado tardarse seis minutos va a elegir mal bajo presión y no va a saber por qué el programa anda lento. Los nombres salen baratos después. El instinto no, y se construye viéndose sorprendido por un número por lo menos una vez. Nada de esto es requisito previo para abrir los lenguajes de programación: los precios se aprenden adentro de un lenguaje, no antes de tocarlo.

El otro orden que se rompe son los patrones de diseño leídos antes de haber tropezado con los problemas. Un patrón aprendido temprano es una solución buscando una falla, y produce programas con seis archivos donde bastaba uno.

Qué abrir en 2026, y por qué la máquina vieja no es excusa

Para las preguntas de costo, timeit viene en la biblioteca estándar de Python y zanja en diez segundos una discusión entre dos versiones de un ciclo. timeit mide solo el fragmento, no el arranque del intérprete, y eso es justo lo que reemplaza: la costumbre de ponerle un reloj al script completo, que mide también lo que tarda Python en abrir. En un equipo de seis años esa diferencia deja de ser un detalle, porque el arranque pesa más que la parte medida.

Para las preguntas de dónde se detuvo, pdb también viene incluido y toma el lugar de agregar un print y volver a correr el archivo. python3 -m pdb -c continue horarios.py deja a quien lo corre parado en el marco donde falló, con todos los valores todavía en memoria, que es lo que un print no devuelve. Los depuradores de VS Code son la misma maquinaria con un ratón encima, y VS Code es gratis desde que le quitó el terreno a Sublime Text y a Atom, archivado en diciembre de 2022.

Las tres son gratis y ninguna se descarga con estorbo desde México ni desde Colombia. Lo que sí cuesta es el equipo, y la respuesta honesta no es cambiarlo: timeit compara dos versiones en la misma máquina, así que un portátil de 2019 contesta la pregunta igual de bien que uno nuevo. Un equipo lento es un instrumento de medición generoso, y esa es la única ventaja que da.

Un asistente de código dentro del editor escribe de inmediato y bien la versión con diccionario del cruce de horarios, porque es una forma común. Por eso mismo conviene entender por qué esa versión resulta más rápida en vez de quedarse con que lo es: el asistente es confiable en las formas que aparecen seguido y confiado en las que no, y distinguir los dos casos es la materia que describe esta página.

Lo que nada de esto resuelve es qué forma elegir cuando el problema no es una búsqueda, que es la pregunta para la que existen los algoritmos. Y cuando la respuesta deja de depender de la forma y pasa a depender de dónde queda guardada, la discusión se muda a las bases de datos.

Al lado de esto

Arriba de esto