Los Modelos Mentales en la Programación

Hanging mirrors with drying hooks

Bien, este post es largo pero necesario.

Quiero hablar sobre los aspectos menos visibles cuando escribimos código, aquellos que van más allá de las estructuras de datos y el estilo de programación. Me refiero a los modelos mentales que utilizamos mientras programamos.

Uno de estos modelos es la simulación mental. Cuando realizamos una tarea de rutina, solemos actuar con confianza en que obtendremos los resultados esperados. Esto ocurre porque, en muchas ocasiones, ya hemos ejecutado ese proceso previamente: conocemos los pasos y hemos validado los resultados. Es como si internamente corriéramos una simulación: seguimos las mismas reglas y usamos los mismos datos, lo que nos lleva a los mismos resultados. Esta confianza se basa en la regularidad de las leyes naturales que gobiernan dichos procesos.

En nuestras rutinas diarias, la mayoría de estas simulaciones son casi predecibles, a menos que ocurra una anomalía en el entorno. Y, cuando esto sucede, el modelo mental se enfrenta a una nueva situación, lo que nos obliga a ajustarlo o a crear uno nuevo.

De no hacerlo, cometeremos los mismos errores de ejecución constantemente y, por ende, obtendremos resultados erróneos.

Muchos estamos familiarizados con el concepto de simulación. Ya sea que seamos conscientes o no del proceso, nadie se escapa de hacerlo. El asunto aquí no es si alguien puede simular un proceso, sino si es consciente al hacerlo.

Aprender a simular es solo una etapa intermedia en la ejecución de procesos. Muchos nos quedamos estancados en esta fase, enfocándonos en perfeccionar los pasos internos y buscando claridad en la propia simulación.

Llevamos a cabo el proceso de simulación de manera continua, integrándolo en cada acción y decisión que tomamos a lo largo de nuestras vidas. Es decir, estamos constantemente simulando sobre los datos del entorno, validando y comprobando los nuevos datos. De no hacerlo, no podríamos ser humanos funcionales.

Pareciera que me lo estoy inventando, pero no. ¡Solo dame unos minutos!

Cuando somos nuevos en algo, es difícil predecir resultados. Nuestra capacidad de evaluar correctamente la situación es bastante limitada, lo que significa que no podemos simular con los datos que tenemos, ya que son muy pocos o erróneos.

Esto mismo ocurre cuando programamos y no comprendemos cómo se enlazan cada pieza de código internamente para crear todas las conexiones lógicas necesarias. Me refiero a conocer cómo funciona el ambiente de ejecución. Si eres programador o estudiante de computación, sabes a qué me refiero. Y si no sabes y quieres saberlo, ve a buscarlo.

El mundo invisible de la computación

A menudo, un artículo, un video, una imagen o incluso un meme nos dice que una variable es tal cosa, que un dato es otra cosa, y que todos estos elementos conviven juntos como un todo. Con ellos, podemos comunicarnos con los “duendes” que viven dentro del computador para que realicen diversas tareas. Esa es, más o menos, la explicación abstracta que nos dan. Puede parecer una broma, pero se dice mucho sobre todas estas cosas que no podemos ver. ¡Hay cada idiotez que te puedas imaginar!

Hasta este punto, creo que ya te imaginas a qué me quiero referir. Por cierto, el párrafo anterior es puro sarcasmo. Lo digo porque, cuando se enseña un nuevo lenguaje de programación en cualquier curso, ya sea en una escuela, bootcamp o donde sea, la forma de ejecución de la computación se omite como si no fuera necesaria para construir un modelo mental sólido y así poder simular mentalmente lo que escribes o lees.

Es decir, que al enseñar y aprender, muchas veces olvidamos o no somos conscientes de que no podemos simular correctamente sin suficientes datos sobre el ambiente de ejecución y las leyes que lo gobiernan. Esto sucede incluso en el mundo físico, donde validamos constantemente. Por ejemplo, sabemos que ciertas cosas no son posibles debido a las leyes naturales, como volar. Aunque tengas la idea de que puedes hacerlo, eso no significa que realmente puedas, a menos que ocurra una anomalía y seas Neo, y hayas aprendido a salir de la Matrix.

Cuando digo que todos olvidamos al enseñar computación que los fundamentos son reales y necesarios para una buena simulación mental, no me refiero a que te expliquen los hechizos mágicos del manejo de registros, los saltos en memoria y todas esas cosas fascinantes. Sin embargo, muchas veces, cuando aparece un mensaje en la pantalla, no entendemos nada de lo que nos está diciendo, y esto se debe a que nos enseñan a programar bajo un enfoque muy ingenuo.

Veamos…

Como programador, ¿alguna vez te has preguntado qué es un fallo de segmentación, un stack overflow, el heap o, más cercano, qué es una variable? ¿Qué es una expresión, un valor, un tipo? ¿Qué sucede cuando creamos bloques de código? ¿Qué es un ámbito? ¿Qué es un sistema de tipos? ¿Por qué existe tipificación fuerte y débil? ¿Qué significa que algo sea interpretado o compilado? ¿Qué es un objeto en realidad? ¿Qué es un dato primitivo? ¿El primitivo es el dato o la variable? ¿Por qué existen datos inmutables y por qué son así? Etc., etc., etc.

Aunque no lo creas, todo esto es muy importante para poder simular mientras escribes código. Conocer cada uno de estos conceptos a nivel de comprobaciones te ayudará a corregir tu modelo mental de simulación. Recordemos que la simulación no es más que una herramienta; no es una solución. Todos hablamos sobre los programas como una entrada y una salida, pero olvidamos que cada paso se ejecuta en un ambiente gobernado por los “duendes”. ¡Ja, ja, ja!

Mi intención es simplemente animarte a corregir estas deficiencias de semántica y contexto. No creas todo lo que digo; compruébalo.


Bien, creo que he hecho mucha crítica en un solo post, y no es mi intención, ya que cada ejemplo que se da alrededor de todo esto es simplemente para facilitar su comprensión. Sin embargo, muchas veces estas explicaciones aleatorias solo dañan tu modelo mental, es decir, te enseñan a ejecutar mentalmente con errores. Como programador, si deseas tener un simulador bien ajustado, no caigas en la trampa de quedarte sin entender lo que haces cuando escribes instrucciones en un lenguaje. Este post está diseñado para invitarte a buscar las respuestas.

Estaré escribiendo sobre estos temas en mis próximos posts. Si quieres seguir esta guía, puedes hacerlo regresando a leerme.

Únete a la newsletter de BitSpace

Una actualización por semana. Todos los últimos artículos directamente en tu inbox.