Una Proyección Simple de Nosotros Mismos
Cuando programamos, tratamos con elementos que, aunque concretos en su ejecución, son abstractos en su concepción. Un objeto en programación orientada a objetos, por ejemplo, es un concepto abstracto que encapsula estado y comportamiento.
La abstracción es uno de los pilares más importantes en el desarrollo de software. Sin ella, estaríamos constantemente sumidos en los detalles más minuciosos de la implementación, incapaces de crear estructuras más complejas. Sin embargo, cuanto más abstracto es un concepto, más difícil es definirlo. Las respuestas a las preguntas que suponemos saber con exactitud al momento de hacer nuestro trabajo como programadores, a veces no son más que eso: suposiciones.
Esta incapacidad de definir con precisión ciertos elementos no es un defecto, ya que tendemos a pensar en términos más generales a la hora de desenvolvernos en un mundo complejo como el que vivimos. Existe un libro interesante que nos abre una ventana a esta forma de ver los procesos en los cuales desciframos nuestro entorno para actuar de la manera más óptima y convencional: Thinking, Fast and Slow por Daniel Kahneman. Si tienes tiempo para leerlo, te harías un favor. Kahneman habla sobre cómo nuestra mente opera en dos sistemas: uno rápido e intuitivo, y otro lento y deliberado. Al programar, muchas veces transitamos entre ambos sistemas, dependiendo de la tarea que estemos abordando.
Como programadores, el término abstracción nos resulta muy familiar. En computación, cuando no hay evidencia visible, tendemos a imaginar; esto supone una gran herramienta para comprender ciertas características y comportamientos de los sistemas digitales. Conceptualizamos, buscamos patrones hasta encontrar coincidencias casi irrefutables (algoritmos) de comportamientos y resultados (validaciones).
En el artículo anterior, hablé sobre la simulación (o, más bien, la ejecución mental de sentencias de lenguajes de programación). Cuando se nos enseña sobre esta conceptualización de términos, a menudo interiorizamos de manera incorrecta las implementaciones reales de dichos términos en su uso práctico. Por lo tanto, nuestro proceso de ejecución mental ya tiene un error instalado antes de su ejecución. En este sentido, es como si nuestro compilador mental presentara errores, introduciendo malentendidos en nuestra comprensión. Y muchas veces, la romantización del lenguaje hace que pasemos por alto estos detalles. Nos enfocamos en la sintaxis, no en la implementación.
Un programa, en su esencia, es simplemente una secuencia de instrucciones que una computadora ejecuta con precisión. Quiero enfatizar esto porque la computadora nunca duda en cuanto al resultado de las instrucciones que recibe.
¿Te has puesto a pensar en esto? Si la computadora no está haciendo lo que deseas, no es probable; es seguro que no te estás comunicando correctamente con ella. La interpretación del lenguaje como herramienta de comunicación puede estar mal entendida en nuestros cerebros, en nuestro entorno de ejecución personal. Recuerda, la computadora siempre ejecuta lo que se le pide, sin errores. Nunca se equivoca. No se inventa nada. No es prejuiciosa. No introduce nuevos datos para tomar decisiones. El resultado, a nivel bajo, es básicamente un 0 o un 1.
De esto se deriva que el lenguaje de programación no es más que una herramienta para expresar ideas a una computadora. Este lenguaje es muy limitado; carece de las interjecciones habituales de la comunicación emocional. Es formal, preciso, lógico, ordenado y conciso.
Este lenguaje contiene características de nuestro sistema de pensamiento lento, complejo y controlado. A menudo, programamos en piloto automático, sin prestar atención a los detalles de ejecución según la implementación de los conceptos abstractos involucrados. Creemos que la computadora debería ser lo suficientemente inteligente como para comprender nuestras ambigüedades, lo cual no es cierto. La computadora es una máquina tonta con respecto a nuestras inseguridades y expectativas, ejecutando solo lo que explícitamente le pedimos.
Quizás he estado leyendo mucha ciencia ficción, pero hay un poco de verdad en lo que digo si lo piensas detenidamente. Reflexiona sobre cómo piensas cuando escribes código: ¿realmente estás considerando la implementación detallada o solo la sintaxis? Este es un punto crucial para comprender por qué a veces nuestros programas no hacen lo que esperamos.
En resumen, programar es mucho más que escribir líneas de código. Es una danza constante entre la abstracción y la precisión, entre lo que queremos que la máquina haga y lo que realmente le pedimos. Si no somos conscientes de cómo estamos formulando nuestras instrucciones, corremos el riesgo de perder el control sobre nuestros resultados.
Recuerda que la computadora no tiene intención, no tiene juicio: simplemente ejecuta. Si algo sale mal, es porque nuestra comunicación, a través del lenguaje de programación, ha fallado. Por eso, reflexionar sobre nuestro proceso mental al escribir código es vital. No basta con conocer la sintaxis; debemos también profundizar en la lógica y la implementación.
Así que la próxima vez que te sientes a programar, detente un momento y pregúntate: ¿estás pensando en la implementación o en la sintaxis? Tal vez ahí encuentres la clave para elevar tu código al siguiente nivel.
Recuerda, el lenguaje es una herramienta de comunicación de instrucciones, no las instrucciones en sí.
Yo, en realidad, apenas estoy aprendiendo sobre todo esto, lo cual se ha vuelto una lucha diaria de comprensión y adiestramiento personal. Pero, a medida que avanzo, me doy cuenta de que cada paso en este camino me ayuda a entender mejor tanto la programación como a mí mismo.
Seguiré escribiendo sobre estos temas en mis próximos artículos, con la esperanza de compartir lo que voy descubriendo y, quizás, ayudar a otros que se encuentren en la misma travesía.