El trabajo de un programador consiste básicamente en dar instrucciones a un ordenador. Podemos definir un programa como un conjunto cerrado de instrucciones, ordenadas de una forma predeterminada, que se transmiten al ordenador con el objetivo de que este las ejecute y nos devuelva a cambio un resultado esperadoi.
Al igual que para escribir un texto convencional necesitamos primero saber una lengua, como el inglés o el español, escribir programas requiere del dominio de al menos un lenguaje de programación. Existen muchos lenguajes de programación diferentes, pudiendo clasificarse, entre otras formas, según sean de alto o bajo nivel. Los lenguajes de alto nivel se caracterizan por que su sintaxis es más parecida al lenguaje humano – en concreto al idioma inglés – y son los que utilizan la inmensa mayoría de los programadores. Por el contrario, los lenguajes de bajo nivel se asemejan más al "dialecto" que entienden las máquinas. En el nivel más bajo de todos se encuentra el llamado código máquina, que está formado sólo por unos (1) y ceros (0).
Esta diversidad de lenguajes implica que es posible escribir el mismo programa de múltiples maneras diferentes. Esto se aprecia claramente en el siguiente ejemplo:
Queremos crear un programa sencillo cuyo objetivo sea mostrar en la pantalla del ordenador el texto "Hola". Por tanto, el resultado que pretendemos obtener es el siguiente:

A continuación, mostramos dicho programa escrito en tres lenguajes diferentes: Python, que es de muy alto nivel; Ensamblador, que es de bajo nivel; y Código Máquina, que es el más bajo de todos:
Python:

Ensambladorii:

Código Máquina:

Como puedes observar, con Python sólo necesitamos una línea de código para conseguir el mismo resultado. Para ello, utilizamos la palabra clave "print", que en inglés significa "imprimir". En este caso estamos diciéndole al ordenador: "Imprime en pantalla el texto ‘Hola’".
Llegados a este punto quizás te estés preguntado cómo conseguimos que los ordenadores entiendan estas instrucciones de alto nivel. Pues bien, existen a su vez otros programas, llamados compiladores o intérpretesiii, cuya función es "traducir" las órdenes de alto nivel y convertirlas en unos y ceros. Suelen estar desarrollados por grandes empresas tecnológicas (como Microsoft) o por programadores aislados muy talentosos. La mayoría de los programadores no tenemos ni idea de cómo funcionan, y nos limitamos a confiar en que van a traducir nuestro código satisfactoriamente.
Abstracciones, interfaces y detalle de implementación
En el ejemplo anterior decimos que Python actúa como una capa de abstracción, cuya función es ocultar gran parte de la complejidad del sistema. Con ese fin, pone a disposición del programador una serie de palabras clave (como la función print del ejemplo anterior) a través de las cuales se puede modificar el estado de dicho sistema, y todo ello sin necesidad de conocer los detalles de cómo se efectúan internamente tales cambios; esa responsabilidad recae en el intérprete de Python, no en el programador.
En la jerga informática, a todos los componentes que quedan ocultos al usuario o programador se les denomina detalle de implementación, mientras que al conjunto de todas las palabras clave expuestas por un lenguaje de programación (lo que queda visible al usuario) se le conoce como interfaz de programación o API, por sus siglas en inglés.
Las implicaciones de este modelo resultan evidentes: los programadores pueden lograr resultados más potentes con relativa facilidad, acortando el tiempo empleado en el desarrollo de los programas gracias a una mayor sencillez del lenguaje. Esto se traduce en un incremento de la productividad y posibilita la viabilidad económica de proyectos que serían imposibles de llevar a cabo de no existir este tipo de abstracciones.
El progreso de la humanidad
De manera similar al caso de la programación, en nuestra vida diaria hacemos uso de multitud de abstracciones. Piensa, por ejemplo, en el concepto de transportarse de un sitio a otro: a lo largo de los siglos se han ido creando abstracciones más y más potentes, que nos han permitido desplazarnos cada vez más rápido y a mayores distancias. Si analizamos el medio de transporte por antonomasia – el coche – la mayoría de nosotros no tiene ni idea de cómo funciona, ni conoce todas las piezas que lo integran, y mucho menos para qué sirve cada una de ellas. Todo esto "oculto" a nuestra consciencia sería el detalle de implementación, haciendo una analogía con lo expuesto en la sección anterior. En cambio, nos basta con interactuar con una interfaz (el volante, los pedales, el asiento, etc.), y siguiendo una serie de pasos sencillos podemos extraer el máximo potencial del sistema.
Otro ámbito que ha experimentado una transformación extraordinaria con el paso del tiempo es el acceso a la energía: para calentarnos, hemos pasado de tener que hacer fuego con un par de piedras y unas ramas a simplemente interactuar con un termostato, en el que ajustamos la temperatura con solo apretar un botón.
En resumidas cuentas, parece razonable afirmar que el progreso de la humanidad está basado en el continuo desarrollo de nuevas abstracciones – no solo en el mundo de la programación, el transporte o el acceso a la energía – sino en cualquier ámbito que se nos pueda ocurrir. Tal como se ha explicado hasta ahora, cada vez se nos permite tener un mayor impacto, teniendo que emplear a su vez menos tiempo y esfuerzo para conseguirlo. Sobre el papel todo esto parece idílico, pero ¿de verdad son todo ventajas?
El lado negativo de abstraer
El principal problema de abstraer se deduce fácilmente: cuanto más potente es la abstracción, menos consciente se es de lo que realmente ocurre dentro del sistema. Esto no supone un inconveniente – o apenas lo hace – mientras todo funciona correctamente; el verdadero problema aparece en el momento en que se produce un fallo que altera el funcionamiento normal del sistema, y que, por tanto, debe ser corregido.
Por ejemplo, si programas en Python es bastante probable que tarde o temprano te topes con un error originado en un nivel muy bajo o interno del sistema. En ese momento te dispones a leer la descripción del error, con la intención de arreglarlo, para luego descubrir que no has entendido absolutamente nada de lo que te están diciendo.
Una situación similar se aprecia claramente en el caso de los trabajadores autónomos. Por norma general, estos recurren a un gestor para que se ocupe de sus obligaciones fiscales. Desde el punto de vista del cliente, el gestor actúa como una abstracción: una especie de "caja negra" a la que envía unos inputs (sus facturas) y de la que espera unos outputs (los modelos de impuestos debidamente cumplimentados). Los pormenores de las gestiones realizadas quedan absolutamente fuera del conocimiento del autónomo. El problema, de nuevo, se presenta en caso de que el gestor haya cometido un error: cualquier irregularidad detectada por Hacienda implica una sanción para el autónomo, no para el asesor, ya que este se limita a actuar como representante.
Los dos ejemplos anteriores evidencian una consecuencia potencialmente grave: abstraer conlleva una pérdida de control por parte del usuario. Si definimos potencia como el beneficio obtenido al abstraer, y la pérdida de control como el coste asociado, y suponiendo una relación lineal de estas dos medidas con el grado de abstraccióniv, podemos generar el siguiente modelo:

Una posible vía para mitigar el efecto de la pérdida de control es mediante la puesta en marcha de una infraestructura de soporte o asistencia. Por ejemplo, si el coche se nos estropea, disponemos de una red de talleres en nuestra ciudad donde podemos llevarlo para que nos lo arreglen. De igual modo, si adquirimos un software para nuestra empresa y empieza a dar fallos, debería de haber un equipo de atención al cliente que nos atienda y resuelva nuestro problema.
La adición de este soporte modificaría la función mostrada en el diagrama 1, tal como se muestra a continuación:

Paradójicamente, ocurre con frecuencia que el mayor desafío no está en crear la abstracción en sí, sino en proporcionar un buen soporte una vez que la abstracción está en funcionamiento. Todos hemos oído alguna versión de la frase "lo complicado no es llegar, sino mantenerse", y no le falta razón. Considero que es en este punto donde las empresas deberían enfocar una parte significativa de sus recursos, ya que una buena estrategia en este sentido tiene un impacto muy positivo en la fidelización de los clientes en el largo plazo.
Es importante también tener en cuenta que el riesgo nunca podrá reducirse a cero: es posible que lleves tu coche a un taller y no termines nada contento con el servicio prestado. Es más, existen abstracciones cuyo fallo no puedes permitirte, ya que éste sería irreversible (véase el ejemplo anterior del autónomo y su gestor). En estos casos, lo único que se puede hacer es adoptar una estrategia preventiva, empleando el tiempo necesario para elegir la abstracción correcta.
Dos filosofías de entender la vida
Encontrar la posición óptima dentro de la curva del diagrama anterior no es algo trivial; suele ser necesario tener que pasar por un proceso de prueba y error, afinando de manera progresiva hasta dar con el punto que resulte más beneficioso para cada uno.
A modo orientativo, podemos resolver este problema de una forma teórica, utilizando "el nivel de riesgo que cada cual esté dispuesto a asumir" como nuestra variable de estudio. Así, si eres una persona orientada a maximizar resultados y con alta tolerancia al riesgo y a la volatilidad, quizás te convenga situarte en la gráfica hacia el lado de la potencia; esto es, ser más agresivo a la hora de abstraer. Por ejemplo, si eres emprendedor/a, procura apoyarte en herramientas que automaticen tu negocio al máximo, para así conseguir los objetivos marcados en el menor tiempo posible. Por el contrario, si lo que más valoras es sentirte seguro y en control de la situación, probablemente te encuentres más cómodo si te desplazas hacia el lado opuesto de la curva. En este caso, el crecimiento quizás sea más lento, pero también será mucho más estable; quizás los productos que ofrezcas no sean el último grito, pero sí sean productos contrastados y fiables. Además, este enfoque más "manual" implica un conocimiento más profundo del producto o servicio que ofreces, lo que deriva en una mayor sensación de que es algo que realmente es tuyo.
Gráficamente, podemos plasmar estas dos maneras de entender la vida, en general, y los negocios, en particular, utilizando para ello una medida representativa de cualquier negocio, como es la facturación, y analizando su variación a lo largo del tiempo:

Las zonas de bajada que se aprecian en la curva verde pueden deberse, por ejemplo, a un fallo en la plataforma de comercio electrónico que utilizas, o a que uno de tus empleados – único experto en un área específica del negocio – haya tenido que cogerse una baja de manera repentina. En el peor de los casos, una brecha de seguridad en una de tus bases de datos en la nube podría provocar la pérdida de la información de todos tus clientes, lo que, además de sus evidentes consecuencias económicas, podría incluso derivar en problemas legales.
En cuanto a los desafíos que conlleva el modelo representado por la curva roja, quizás el más importante es la gestión de la impaciencia. Mucha gente abandona a mitad de camino, desmotivados al ver que pasan los meses – o incluso los años, en muchos casos – sin haber conseguido resultados apreciables. Además – especialmente en perfiles a los que les gusta llegar al fondo de las cosas – existe un alto riesgo de caer en la procrastinación, y entrar en un bucle del tipo "cuando haga este curso y aprenda esto otro, entonces sí podré sacar mi producto con garantías", y así dejar pasar los años contándose esa fantasía.
En estos casos, el entorno puede llegar a jugar un papel determinante, ya que, ante la ausencia de resultados visibles, es posible que empiecen a preguntarse si estás tirando tu tiempo, y si no deberías estar dedicándote a otra cosa que te reporte resultados más inmediatos. Esta "presión" puede ser positiva, en caso de que te encuentres dentro del bucle descrito anteriormente, o también negativa, en caso de que tu objetivo sea realmente a muy largo plazo, y por tanto requiera un nivel alto de profundización y de paciencia. Un ejemplo claro de esto lo encontramos en personas que dedican años de su vida a prepararse oposiciones como la de notaría o judicatura.
Por último, ambos modelos también se ven limitados por una variable adicional: la económica. En el lado de la potencia, esto puede significar no poder acceder a ciertas abstracciones cuyo coste exceda el presupuesto. En el lado del control, una situación de precariedad económica obliga a priorizar el lanzamiento del producto esté como esté, o a apoyarse en abstracciones básicas para empezar a generar ingresos en el corto plazo, dejando el perfeccionamiento para más adelante.
Opinión final: una lanza a favor del progreso estable
En este artículo hemos definido primero qué es una abstracción, hemos seguido describiendo las fortalezas y debilidades que presentan, para luego analizar cómo jugar con dos variables – la potencia y el control – para diseñar una estrategia a la hora de afrontar los desafíos. Todo ello nos ha llevado a la conclusión de que no existe un punto teórico ideal; corresponde a cada persona determinarlo en función de sus valores y rasgos personales (como, por ejemplo, su tolerancia al riesgo).
Una vez aclarado todo lo anterior, quiero cerrar el artículo dando mi opinión personal, que se resume en la siguiente afirmación: siempre que la situación te lo permita, la mejor opción es apostar por seguir el modelo que he denominado de "progreso estable" vi.
Para empezar, lanzo la hipótesis de que la curva roja del diagrama 3 no es una línea recta estrictamente hablando: pienso que la realidad se asemeja más a una línea recta al principio, pero, a partir de un punto en el tiempo, que he llamado "punto de inflexión", este crecimiento pasa a ser exponencial. En esta nueva fase el conocimiento es tan grande y la base es tan sólida que cualquier aprendizaje o mejora aplicada multiplica los resultados conseguidos por la iteración anterior. El diagrama por tanto cambiaría parcialmente, y quedaría como se muestra en la siguiente figura:

Este modelo sugiere por tanto que, en el largo plazo, la estrategia del control bate a la estrategia de la potencia. En palabras de James Clear, autor del libro superventas Hábitos Atómicos:
"La persona que se centra en una tarea y la lleva a cabo hasta el final, aunque trabaje de forma algo lenta u obsoleta, supera al optimizador incansable que salta de una herramienta a otra y siempre espera que una nueva tecnología le ayude a terminar lo que empieza."
Hoy día estamos conviviendo con la que parece que es la mayor abstracción creada hasta la fecha: la inteligencia artificial. Prácticamente cada día nos llegan noticias alarmantes: que si vamos a perder nuestro trabajo, que si nos van a dar una renta mínima para que malvivamos, que si no tienes un dominio de la IA te vas a quedar obsoleto, etc. En consecuencia, actualmente resulta complicado no vivir con una sensación de como que no llegas a nada, de sentirte sobrepasado, lo cual ha provocado que la tendencia a abstraer haya alcanzado unos niveles jamás vistos: todo el mundo quiere pillar "la cresta de la ola", y no quedarse atrás.
Por eso, en un mundo donde todo cambia a ritmo vertiginoso, quiero romper una lanza a favor de – tal como se titula el libro escrito por Morgan Housel – lo que nunca cambia. Puede parecer contraintuitivo, pero si nos centramos en dominar los conceptos y habilidades que, por mucho que avance la tecnología, no van a verse afectados por el paso del tiempo, quizás tengamos algo que decir en una sociedad del futuro que poco pueda parecerse a la actual.
Nos vemos en el próximo blog.
Saludos,
José
Notas al pie
(i): Piensa como analogía en una receta de cocina: siguiendo una serie de pasos, ordenados de una determinada manera, con un principio y un final, obtenemos un resultado esperado, que en este caso es un plato de comida.
(ii): Los fragmentos de código, tanto del lenguaje ensamblador como del código máquina, han sido generados mediante inteligencia artificial. Lejos de poder corroborar que ambos ejemplos estén 100% correctos, el objetivo que se persigue, en cualquier caso, es mostrar de manera clara cuán diferentes son los lenguajes de alto y bajo nivel.
(iii): A este tipo de programas se les llama compiladores o intérpretes, dependiendo de la filosofía que apliquen a la hora de traducir y ejecutar las instrucciones.
(iv): Tal como señalé en mi artículo anterior, la hipótesis aplicada no tiene por qué representar la realidad de manera exacta (la relación podría no ser lineal, y obedecer a otro tipo de función), pero resulta suficiente para describir un fenómeno existente de una forma sencilla y entendible.
(v): Esto me recuerda al mítico anuncio de Pirelli: "La potencia sin control no sirve de nada".
(vi): Este modelo no implica la ausencia total de abstracciones, sino que alienta a utilizarlas "con cabeza".