Quizás una de las cuestiones que más nos atormenta en el mundo de la informática es entender cómo de *esto* puede salir *esto*. ¿Cómo es posible que veamos ventanas en una pantalla y las podamos arrastrar con nuestro ratón, reproducir películas o incluso jugar a videojuegos? En nuestro día a día damos todo esto por hecho, como si se tratase de una especie de magia negra que sólo pocos eruditos consiguen dominar.
Si nos paramos a pensar, simplemente se nos escapa, es demasiado complejo y abstracto, sobre todo si no estamos adentrados en el mundo de la programación. ¿Cómo es posible que de tan solo corriente y unos cuantos componentes electrónicos puedan salir tantas maravillas? Todos hemos oído hablar de ceros y unos, que a nivel físico se traducen en uno para la presencia de corriente eléctrica y cero para su ausencia. Es así de simple, incluso sabiendo que lo que hace nuestro procesador son simples operaciones aritméticas con estos dos valores, al final la complejidad resulta sobrecogedora.
La verdad es que realmente lo es, y es más bien raro que un solo hombre conozca y entienda con detalle absolutamente todas las partes que componen esta compleja máquina. No dista tanto de cómo funciona el mundo real, donde también tenemos una gran complejidad. Un ejemplo es un simple pato de goma. Si nos paramos a pensar, ¿Cuánto conocimiento humano, esfuerzo y cadenas de procesado son necesarias para que este pato exista? Algo similar ocurre con los ordenadores, la diferencia es que el pato es algo físico, podemos visitar la fábrica, aprender sobre cómo se obtiene el plástico o cómo funciona una cadena de montaje.
En general, es mucho más fácil imaginar cómo es el proceso de fabricación de un producto físico en nuestro mundo moderno. En el caso del software, sin embargo, es bastante complejo llegar a imaginar, sobre todo para alguien no familiarizado con ciertos conceptos de computación, de qué se compone YouTube, Excel o Netflix, o cómo es posible que juguemos a Overwatch online con alguien que está al otro lado del océano.
La abstracción en el software
Principalmente, el problema del software es que es abstracto, no es algo tangible, a diferencia de un árbol, por ejemplo. Con un árbol podemos imaginar el proceso que lleva a transformarlo en una mesa o una silla. Sin embargo, de ceros y unos a lo que finalmente se muestra en nuestra pantalla hay un gran abismo, y aún más si intentamos imaginar cuál es el proceso que llevan a cabo los programadores para crear esta «magia negra». ¿Cuáles son las órdenes secretas que hacen que una pantalla pueda mostrar una ventana?
Veréis, esta es una de las dudas que me atormentó desde que era muy pequeño. Siempre quise entender cómo funciona un ordenador. En particular, lo que más me llamaba la atención es ese código binario del que tanto hemos hablado. ¿Cómo puede convertirse en algo visual en nuestra pantalla?
Intenté varias veces poner fin a todas mis dudas. El primer intento fue con un libro de *Visual Basic .NET*, donde explicaban específicamente cómo crear ventanas, cómo programarlas y darles vida. Pero la verdad es que me llevé una gran decepción. Ese libro no me explicaba qué eran las ventanas, de dónde salían. Tan solo me decía cómo podía crear una y personalizarla, cómo poner botones, hacer que esos botones realicen una acción y otro tipo de «brujerías». Pero seguía teniendo la misma duda, ¿de dónde salen estas ventanas? ¿Quién las creó?
Tras muchos meses de frustración intentando entender muchos conceptos de distintas disciplinas de la informática, solo conseguí tener en la cabeza un lío aún mayor. Eventualmente, descubrí Linux. Con él, podía tener acceso a información que en Windows me era invisible. Podía montarme incluso mi propio Linux desde cero, siguiendo guías como el *FS*, también conocido como *Linux From Scratch*, y entender mucho mejor todos los elementos que componen un sistema operativo.
Obviamente, todo ese proceso me llevó una gran cantidad de tiempo, frustración, y si bien lo que aprendí no contestaba directamente a todas mis preguntas, me ayudó a entender mucho mejor cómo funciona este mundo. Y hay muchas cosas que aún hoy en día simplemente se me escapan. Pero por lo menos he entendido de dónde proviene tal complejidad y cómo el ser humano ha podido llegar a crear sistemas tan complejos, y sobre todo en tan poco tiempo. La respuesta a todo son las {capas informatica} y {abstracción informática}.
Las capas de abstracción
Lo bueno de las capas es que existen en nuestro mundo tangible, y es mucho más fácil explicarlo. Imagina por un momento que eres un hábil arquitecto con una buena cantidad de dinero en tu cuenta bancaria. Un buen día, decides retirarte, comprar un terreno y construir tu propia casa. Por tu cuenta, decides hacer este proyecto, un reto personal, y completas toda la obra prácticamente solo.
No te privas de ningún lujo, los mejores materiales de construcción, grandes ventanas, buena orientación, bien aislada en cuanto a temperaturas y ruidos. Dedicas meses a levantar paredes, ladrillo por ladrillo, tuberías de cobre, cableado eléctrico, pintura, colocas las ventanas e incluso el parquet. Un trabajo bastante duro, la verdad, pero que te dará una gran satisfacción.
Desde luego, usas una buena cantidad de prefabricados, incluso partes a partir de un modelo de casa bastante común. Completas la obra con un gran esfuerzo y sacrificio, pero valió la pena. Puedes decir que has construido tu propia vivienda.
Ahora, imagina que un día un hombre de las cavernas viaja desde el pasado y aterriza justo en la puerta de tu casa. Se trata de un Homo Sapiens de la era Paleolítica, no conoce nada sobre nuestra cultura, tan solo conocen la tecnología básica basada en trabajar piedras y otros objetos que consigue a su alrededor.
Nuestro hombre de las cavernas, obviando el problema del idioma, claro, no porque vete a saber qué hablaban en esa época, se te presenta y te pregunta qué es esto. «Rocas transparentes, paredes con formas regulares, colores vivos. No se asemeja a nada que haya visto jamás».
Tú contestarías: «Mira, se trata de mi casa. Aquí es donde vivo, la he construido yo mismo». Y el cavernícola, que se ha saltado unos cuantos siglos de evolución humana, intenta imaginar cómo has podido construir semejante cosa, pero simplemente se le escapa. No concibe cómo has podido levantar una pared tan perfecta y colorearla de un blanco tan homogéneo.
Algo similar nos ocurre cuando intentamos imaginar cómo de todos esos ceros y unos, que simplemente representan presencia o ausencia de corriente, pueda salir el vídeo que estás viendo ahora mismo. En este momento, tú, con el objetivo de calmar a tu nuevo amigo cavernícola, intentas explicarle que realmente no has comenzado desde la nada.
Si bien es cierto que has construido tú la casa, no has fabricado los bloques de la que se compone, como ventanas, paredes, puertas y suelos, o incluso las tuberías de cobre o cableado necesario para que la electricidad llegue a tu casa. Simplemente has adquirido estos materiales y los has utilizado con tus conocimientos, incluso utilizando conceptos tradicionales para construir la casa. El cavernícola, muy extrañado, te contesta: «Entonces, no has construido la casa, simplemente has montado bloques preexistentes. No puedes decir que realmente la has construido tú».
En realidad, sí que puedes. En tu nivel de abstracción, tú eres quien construyó la casa. El cavernícola lo ve de una forma. Junto con otras cientos de personas, habéis contribuido a fabricar el cemento, extraer la arena necesaria para fundir el cristal, fabricar los ladrillos y extraer el cobre de las minas, refinarlo para que pueda convertirse en cables, diseñar las ventanas y marcos, o puertas. Si nos ponemos escrupulosos, hay miles de personas que han contribuido a fabricar todo aquello que compone tu vivienda.
Y realmente, si lo piensas, más bien has hecho muy poco por construir tu hogar, una parte bastante pequeña. Sin embargo, tú sigues pensando que la casa ha sido fabricada por ti. Según tu punto de vista, hay muchas cosas que das por hecho que no vas a poder fabricar por tu cuenta, o el esfuerzo no vale la pena, ya que existen productos que te las proporcionan. Das por sentado que, en la construcción de tu casa, usarás bloques, tales como los ladrillos.
Los ladrillos son un concepto abstracto para ti, son un producto acabado que viene de otro nivel de fabricación, no sabes ni te importa de dónde vienen, cómo se fabrican o cuánto tiempo o trabajo implica su realización. Tú solo sabes cuánto cuestan y cómo tienes que usarlos. Se trata de una {abstraccion en informatica}. Para ti, el ladrillo es un concepto que te viene dado de forma no necesitas conocer todos los detalles en tu labor. El ladrillo es un bloque básico, y en la tarea de construir la casa, hay muchos otros como este.
La abstracción en la informática
Esto en la informática, y en otros campos, se llama capa o nivel de abstracción. Tú vives feliz en tu mundo, con tus conceptos y tus bloques básicos, construyes casas. Mientras tanto, en la capa inferior, tenemos ingenieros industriales que no tienen ni idea de cómo se construye una casa, pero saben unas cuantas cosas sobre ladrillos.
Y en la capa que está por debajo, tendríamos expertos en extraer materiales de las minas para que el fabricante de ladrillos pueda crear su producto, que tampoco necesariamente sabe ni le importa cómo los ingenios diseñan sus productos o cómo tú construyes tu casa. Cada uno vive en su nivel, apartado, o mejor dicho, ha abstraído cómo funcionan los demás niveles. No me malinterpretéis, puedes entender cómo funcionan todos los niveles, pero desde luego será mejor en tu trabajo si te dedicas a dominar a fondo tu campo y tu nivel de abstracción.
Lo mismo ocurre con los ordenadores, aunque aquí hay un concepto bastante difícil de asimilar: la tecnología digital. Antiguamente, estábamos ligados a un hardware, una serie de componentes que estaban específicamente diseñados para conseguir un resultado específico. Si queríamos otros resultados, pues teníamos que modificar estos circuitos físicamente para hacer que el resultado cambie.
Pero gracias al trabajo de matemáticos y físicos como Ada Lovelace, John von Neumann y Alan Turing, así como muchos otros, nace la idea de una máquina única, la máquina definitiva capaz de realizar cálculos basados en la presencia o ausencia de corriente. Aquí nace el mundo digital y la computación tal y como la conocemos hoy en día. Dejamos de trabajar con componentes específicos a nivel de hardware, lo damos por hecho. Ya no nos importa quién hace quizás una de las primeras capas de abstracción en la informática, nos olvidamos de los componentes físicos y empezamos a trabajar con memorias y cálculos.
El valor que tienen nuestros números en estas máquinas se alejan del aspecto que tenga la máquina en sí. En otras palabras, la máquina definitiva, capaz de resolver cualquier problema, una máquina universal, realmente no es el objetivo de este video. Entender cómo funciona un ordenador desde el más bajo nivel, nuestras capas, simplemente entender que cada nivel de evolución nos da una nueva capa de abstracción, nos resuelve muchos problemas con los que ya no tendremos que lidiar y podremos centrarnos en evolucionar, dando muchas cosas por hecho.
Muy bien, pues tenemos una máquina que puede hacer operaciones aritméticas. Un siguiente nivel sería automatizar operaciones, hacer que la máquina ya sea capaz de saber cómo realizarlas y nosotros tan solo le dijéramos «realiza esta secuencia de acciones» y fuera capaz de hacerlas sin asistencia alguna.
En ese caso, lo único que necesitaríamos son unos valores de entrada y nos devolvería otros de salida. Algo tan simple como una suma. Luego pasaríamos a la multiplicación. Si nuestra máquina tan solo puede sumar o restar, sabiendo que una multiplicación es repetir la suma del mismo número una cierta cantidad de veces, podríamos crear un procedimiento que, sabiendo cuáles son los números implicados en la multiplicación, simplemente realice este procedimiento para darnos el resultado de la operación, sin tener que nosotros instruir las sumas una tras otra. La máquina de ceros y unos, presencia de corriente, ausencia de corriente y todas las instrucciones las recibe de esta manera.
Suena muy complicado y contraproducente, desde luego, pero ¿qué tal si definimos un sistema de letras y números basados en códigos, ceros y unos, algo parecido al morse? Usando estos códigos, crearíamos un simple lenguaje, algo parecido a esto:
C = 1,
A = 1,
S = 0,
A = 1,
–
El resultado de esta operación sería 4, la suma de 1 y 3. La máquina, obviamente, no entiende este texto, pero crearíamos unos procedimientos para que se encarguen de traducir este texto en los ceros y unos necesarios para realizar la suma. Y así, poco a poco, capa tras capa, llegamos a los ordenadores modernos. Esto que acabamos de ver sería el nacimiento de los lenguajes de programación.
Si nos movemos algo un poco más moderno, el programador del driver gráfico no conoce cómo se representan los colores en tu pantalla. Él tan solo envía una tabla de valores con el color que tiene cada pixel. La pantalla es la que se encargaría luego de mostrarlos, ya que sabe cómo tiene que hablar con cada componente físico para que la acción se lleve a cabo. A su vez, el programador que creó la consola de texto desconoce cómo se crea esa tabla de colores, pero sabe que, para mostrar texto, tiene que pasar una serie de datos específicos.
De la misma manera, el programador de programas basados en texto no sabe cómo se representan los textos en la pantalla, solo sabe qué es lo que tiene que hacer para mostrarlos. Cada uno en el nivel inferior se ha encargado de que el nivel superior lo tenga fácil para hacerlo, y se ha encargado de dejar preparado el trabajo sucio. Básicamente, es una caja negra. El PC que estás usando ahora mismo está repleto de cajas negras, una con la otra. Cada nivel desconoce cómo funciona internamente el nivel superior o inferior.
Ahora mismo, estamos hablando de los niveles más bajos de nuestra gran montaña de capas. Pero si vamos arriba de todo, podremos encontrar, por ejemplo, a un programador web que tan solo utiliza el navegador, el editor de texto y algunas otras tecnologías como las redes, el protocolo HTTP, para crear su página web. Y no necesita saber ni de dónde salen, ni cómo funciona. Lo mismo ocurrió con aquel libro de Visual Basic.
En este libro, nosotros ya damos por hecho que alguien se ha encargado de crear el sistema que, usando una gran cantidad de capas por debajo, es capaz de pintar las ventanas en la pantalla. Y el programador de Visual Basic .NET tan solo se encarga de configurar estas ventanas y hacerlas interactuar. De hecho, el lenguaje de programación que se usa, Visual Basic, antes de ejecutarse, es traducido a otro lenguaje mucho más complejo, que a su vez se traduce a otro lenguaje aún más complejo, que acaba en simples operaciones aritméticas sobre una memoria en nuestra CPU.
Si son millones de operaciones que a nuestro programador no sabe ni le importa cómo ocurre, no se encarga de esta función. De la misma manera que el panadero nos lleva el pan, así es como funciona el mundo de la informática y realmente cualquier otro sistema extremadamente complejo de la humanidad.
Primero, que, para que se produzca un avance tecnológico, cada gran contribuidor coge el legado de quien le precede y lo mejora, y segundo, que cada programador, ingenio electrónico o industrial utiliza las herramientas y bloques básicos proporcionados por la capa inferior. Por lo cual, se puede decir que nadie lo sabe todo, solo una pequeña parte. Esto es lo que les permite centrarse en lo que realmente es importante y hacer el mejor trabajo posible en su área.
Dicho esto, nos podemos sentir identificados con aquel hombre de las cavernas que se maravilla ante una obra de gran complejidad que no es capaz de entender. Sobre todo, lo que no entiende es cómo un hombre fue capaz de hacer todo aquello. Para él, este hombre es un poderoso mago que manipula la realidad.
Mientras que, en realidad, lo que tenemos es una gran tr