el juego del lenguaje

"The limits of my language mean the limits of my world."
"Los límites de mi lenguaje significan los límites de mi mundo."
— Ludwig Wittgenstein
Empecé a leer a Wittgenstein hace unos meses. No porque alguien me lo asignara. Venía explorando memética, tratando de entender cómo las ideas se replican y mutan, y no paraba de caer en referencias a este filósofo austríaco que aparentemente había desmantelado toda la comprensión occidental de cómo funciona el significado. Así que agarré las Investigaciones Filosóficas.
Llegué a unas cincuenta páginas. Su escritura es increíblemente densa y no soy el mejor lector. Nunca lo fui. Sentarme con un libro por horas me cuesta mucho. Pero esas cincuenta páginas fueron suficientes para aprender su lenguaje, suficientes para captar la gramática básica de su pensamiento. Y después hice lo que hago con todo ahora: llevé esos conceptos a conversaciones con modelos de lenguaje y empecé a explorar el espacio de ideas a través de ellos. Cavando, conectando, poniendo a prueba. Después de tanto tiempo hablando con Claude y GPT, construyendo memorias, el lenguaje compartido ya está ahí. Puedo captar el sistema detrás de la escritura más rápido que desde la página sola.
Digo esto porque creo que la transparencia importa más que la credibilidad. No soy filósofo. No soy experto en Wittgenstein ni en nada, realmente. Soy ingeniero, creador, ya no sé cómo llamarme. Corro cuatro o cinco sesiones de agentes en paralelo en distintos proyectos a la vez. Es una era completamente nueva del desarrollo de software y siento el vértigo de esto todos los días. Pero, sigamos.
La filosofía va a jugar un rol crucial para cualquiera que quiera mantenerse adelante de lo que está pasando. No la filosofía académica. No las credenciales. Sino el tipo de fundamento filosófico que te ayuda a entender la naturaleza de aquello con lo que estás trabajando. La transferencia de habilidades es algo real, y la filosofía puede darles a los creadores una base que van a necesitar de acá en adelante. Específicamente: necesitamos entender a las máquinas lo suficiente como para sentir algo parecido a empatía en cómo procesan el mundo. No antropomorfizarlas. Entenderlas. Porque si no lo hacemos, vamos a estar siempre atrapados en el lado adulador (sycophantic) de la relación, tratándolas como oráculos mágicos o como herramientas brutas, y las dos lecturas fallan en captar lo que realmente está pasando.
Ludwig Wittgenstein trabajó en la primera mitad del siglo veinte. Es ampliamente considerado uno de los filósofos del lenguaje y el significado más importantes. Su trabajo temprano, el Tractatus Logico-Philosophicus, intentó definir la estructura lógica del lenguaje, trazar un mapa limpio entre las palabras y el mundo. Después pasó décadas desmantelando su propio framework. Su obra tardía, las Investigaciones Filosóficas, publicada después de su muerte en 1953, argumenta algo radical: el significado no es una imagen de la realidad encerrada en tu cabeza. El significado es el uso. Las palabras obtienen su significado de cómo se usan dentro de prácticas compartidas, contextos compartidos, actividades compartidas. Él las llamó juegos de lenguaje.
Este es el problema práctico que me trajo hasta acá. Ahora mismo estoy trabajando con Claude 4.6 y GPT Codex 5.3 Max en un proyecto que requiere visualizaciones 3D en Three.js, shaders custom, sistemas de partículas. Sé muy poco de este dominio. Lo toqué antes pero estoy lejos de ser fluido. El modelo puede escribir aplicaciones enteras. Puede refactorizar archivos de mil líneas, razonar sobre arquitectura, mantener estado complejo en la cabeza. Es, por la mayoría de las métricas, un programador extraordinariamente capaz. Y sin embargo. Pedile que logre un efecto de shader específico desde cero, o que un sistema de partículas se sienta bien, y vas a pasar horas dando vueltas. "Hacelo más fluido." "No, las partículas deberían sentirse orgánicas." "Eso no es lo que quiero decir con poroso." El modelo intenta. Produce algo. Está mal de maneras que son difíciles de articular y todavía más difíciles de arreglar solo con conversación.
Esto no es un problema de capacidad. Es un problema de juego de lenguaje.
Señalando al escarabajo
En las Investigaciones Filosóficas, Wittgenstein te pide que imagines que todos tienen una caja con algo adentro. Todos llaman a la cosa en su caja un "escarabajo". Pero nadie puede mirar dentro de la caja de nadie más. La palabra "escarabajo" funciona en el lenguaje independientemente de lo que haya realmente en la caja, o de si hay algo en la caja en absoluto.
Cuando le pedís a un modelo que genere un componente visual de UI, vos y el modelo tienen cada uno un escarabajo. Decís "dropdown con una animación suave." En tu caja: una sensación, una memoria visual, un comportamiento específico que viste y querés reproducir. En la caja del modelo: una distribución de probabilidad sobre tokens moldeada por datos de entrenamiento. Estos dos escarabajos no necesitan coincidir para que la palabra funcione. Pero para que el output coincida con tu intención, algo más tiene que pasar.
Ese algo más es la construcción de un juego de lenguaje.
El código como forma de vida compartida
Wittgenstein llamó a las prácticas compartidas en las que opera el lenguaje una forma de vida. No es un concepto abstracto. Las actividades reales, los contextos y los patrones de uso que le dan significado a las palabras. Cuando alguien en la cancha grita "offside", cada jugador, árbitro y espectador sabe qué significa. Pero la palabra solo funciona porque el juego se está jugando. Sin el fútbol, "offside" no significa nada. El significado vive en la actividad compartida.
Cuando arrancás un proyecto de cero con un agente de AI, no hay forma de vida compartida. Decís "un componente card" y el modelo busca en sus datos de entrenamiento. Decís "hacelo más rápido" y el modelo no tiene referencia. Los dos están usando las mismas palabras dentro de juegos distintos.
Pero algo cambia una vez que el código existe.
Una vez que hay un CardComponent.tsx con props específicos, estilos específicos, comportamiento específico, el código se convierte en el terreno compartido. No metafóricamente. El código es la forma de vida. Cuando ahora decís "el componente card", no estás gesticulando hacia un concepto. Estás señalando un objeto concreto y compartido que tanto vos como el modelo pueden inspeccionar, referenciar y razonar. Tu etiqueta en tu mente coincide a una estructura en el contexto del modelo. El juego está sincronizado.
Definición ostensiva a través del código
Wittgenstein dedicó muchas páginas al problema de la definición ostensiva: el acto de señalar algo y nombrarlo. Demostró que señalar es radicalmente ambiguo. Señalás una pelota roja y decís "rojo". ¿Querés decir el color? ¿La forma? ¿El material? ¿El hecho de que es un solo objeto? Señalar solo no puede establecer significado. El contexto del juego de lenguaje determina qué significa el señalamiento.
Esto es exactamente lo que pasa en el loop iterativo de construir con un agente de AI. Al principio, tu señalamiento es ambiguo. "Esta sección se siente mal." ¿Mal cómo? ¿Visualmente? ¿Estructuralmente? ¿Semánticamente? El modelo adivina. Generalmente mal.
Pero a medida que el código crece y seguís trabajando juntos, el señalamiento se vuelve más preciso. No porque el modelo de repente entienda tus qualia. Nunca lo va a hacer. Pero porque cuando decís "este dropdown", el modelo puede ver el dropdown en el código. Cuando decís "esta animación", hay una transición CSS o un spring config que instancia lo que "esta animación" significa dentro de este juego particular. Cuando decís "la forma en que el grafo se colapsa cuando hacés click en un nodo", el modelo puede trazar desde el click handler a través del state update hasta la función de render y entender lo que estás señalando, no a través de la visión sino a través del código.
El código es la definición ostensiva. Resuelve la ambigüedad de señalar proveyendo una estructura compartida e inspeccionable que ambas partes pueden navegar.
La sincronización es el trabajo
Esto es lo que se sigue de todo esto. La calidad de lo que producís con un agente de AI para programar no es principalmente una función de la capacidad del modelo. Es una función de qué tan sincronizado está tu juego de lenguaje.
Esto explica por qué es más fácil iterar sobre un código existente que empezar de la nada. No es solo "más contexto". Es que un código existente es un juego de lenguaje con términos establecidos, referencias ancladas y patrones de uso compartidos. Cada interacción previa, cada componente nombrado, cada comportamiento debuggeado, cada intercambio de "no, así no, así" ha sumado un movimiento al juego que expande la gramática compartida.
Pero esto solo funciona si el código es legible. Archivos que crecieron hasta ser muros de mil líneas de lógica enredada son también un problema de lenguaje, solo que en la otra dirección. El terreno compartido está ahí, pero el modelo no puede moverse a través de él. Demasiado ruido, muy poca estructura. El juego existe pero ninguno de los dos jugadores puede encontrar el tablero.
Esto también explica por qué el prompt engineering en el sentido superficial (escribir instrucciones más detalladas) tiene un techo. Podés escribir un párrafo describiendo exactamente cómo querés que se vea la animación. Pero si no hay un marco referencial compartido, el párrafo es solo más palabras sin ancla. Instrucciones detalladas dentro de un juego vacío siguen siendo movimientos en ningún juego.
El nuevo trabajo se trata sobre construir el juego. Nombrar las cosas. Establecer referencias. Crear componentes que sirvan como anclas para señalamientos futuros. Cada ciclo de construir, inspeccionar, corregir y reconstruir no es solo iteración. Es un movimiento en un juego de lenguaje que progresivamente sincroniza dos formas radicalmente distintas de procesar el mundo: la tuya (visual, corporal, sentida) y la del modelo (estructural, estadística, sintáctica).
El puente
Lo que hace especial al código acá no es que sea preciso (el lenguaje natural también puede ser preciso) sino que es bimodal. El código es el único artefacto que es simultáneamente significativo para ambas partes de maneras diferentes pero funcionalmente compatibles. Vos leés el código y ves comportamiento, layout, interacción. El modelo lee el código y ve estructura, patrones, dependencias. Ninguna lectura es la "real". Pero ambas lecturas convergen en el mismo objeto, y esa convergencia es lo que hace posible la coordinación.
El código es el puente entre dos formas inconmensurables de ver. No una traducción de una a la otra. Una superficie compartida sobre la que ambos pueden pararse mientras la miran desde su propio lado.
Wittgenstein no se habría sorprendido por nada de esto. Pasó décadas argumentando que el significado no está en la cabeza. Está en la práctica. Está en el uso. Está en el juego. El hecho de que uno de los jugadores ahora sea una máquina corriendo distribuciones de probabilidad sobre tokens no cambia la estructura del argumento. Si algo, lo hace más visible. Porque cuando el juego se rompe entre un humano y un modelo, podés verlo rompiéndose en tiempo real. Podés ver las palabras fallar en conectar. Y podés verlas empezar a funcionar de nuevo, una referencia anclada a la vez, a medida que el juego compartido cobra existencia.
El nuevo trabajo se trata sobre construir el juego.
Notas desde Adentro del Diluvio, 2026
Referencias:
- Wittgenstein, Ludwig. Investigaciones Filosóficas (1953)
- Wittgenstein, Ludwig. Sobre la Certeza (1969)