¿Qué se aprende realmente con una licenciatura en informática?

Para dar una visión general – un grado de informática enseña la «ciencia» de un ordenador. Para estudiar la ciencia de algo, se estudian los principios de funcionamiento.

Si alguien te preguntara cómo funciona una bicicleta, probablemente irías a explicar cómo el pedal transfiere la energía a las ruedas a través de la cadena. Del mismo modo, la Informática es básicamente una respuesta a «¿Cómo funciona el ordenador?».

Aparentemente, no todas las carreras de informática son iguales. Esto es lo que he pasado yo. Está un poco anticuado (me gradué en 2002, hace casi dos décadas)

Se suele empezar con algunas clases de codificación básica. Personalmente tuve 3 clases en las que se enseña a programar. Dos de C++ y una de Java. Las dos clases de C++ duraron dos semestres, y la de Java es sólo un verano. Eso es todo lo que son las clases de «programación». Según entiendo, el punto es tener un lenguaje para hablar de los principios. No puedes ser un programador competente sólo con estas clases.

A diferencia de lo que uno suele pensar – las clases de informática no son tanto para enseñar a escribir código. Al igual que si tienes una clase en la que se enseña cómo funciona una bicicleta, probablemente no se dedique mucho tiempo a enseñarte a montar en bicicleta. Esta es probablemente la mayor idea errónea sobre la educación en Ciencias de la Computación.

Un ordenador es un trillón de veces más complicado que una bicicleta. El adjetivo «un trillón de veces» no es sólo muchas, es literalmente un trillón de veces. Si piensas en que una bicicleta tiene unas pocas partes, el pedal, la cadena, las ruedas, etc. Sólo un microprocesador tiene 1.400.000.000 de transistores. La forma de entenderlo es por el principio de abstracción. En resumen, no hay que abrir la caja. Sólo enciéndelo y disfruta de la magia.

Así es como la mayoría de la gente ve el ordenador. Estudiar informática, sin embargo, hace exactamente lo contrario. Abre todas las cajas.

En mi programa, en concreto, empezamos con el diseño de circuitos. A fin de cuentas, un ordenador está hecho de circuitos. Sólo si entendemos los circuitos entendemos la unidad básica de un ordenador. El diseño de circuitos es un gran tema, yo personalmente pasé por diseños analógicos básicos (resistencias, diodos, transistores polares de doble unión), diseños digitales básicos (puertas lógicas, latches, flip flops), diseño de procesadores básicos (unidades aritméticas, data-path, pipelining), esta cadena de clases termina cuando diseñé un diseño de silicio de un componente simple (en mi caso un interruptor de barra cruzada) y una discusión en arquitecturas modernas (cómo funcionaba el hyper-threading, que era la tecnología de moda en mis tiempos)

Ligeramente por encima del hardware, empezamos con el software del sistema. Aprendemos cómo funciona un sistema operativo. Cómo puede el ordenador ejecutar varios programas a la vez? Cómo puede el ordenador compartir recursos de forma justa y eficiente entre diferentes procesos? ¿Cómo se programa un microcontrolador? (un microcontrolador es un microprocesador muy reducido que suele utilizarse en dispositivos distintos de los ordenadores). Mi escuela no tenía una clase de compilador, si la hubiera tenido, habría aprendido cómo se compila un programa de alto nivel y se ejecuta en un ordenador.

Más adelante, llego a estudiar los componentes de software muy utilizados. Empezando por las estructuras de datos básicas (como una lista, un árbol o un gráfico), entendiendo cómo implementar una base de datos utilizando las estructuras de datos. Cómo asegurarse de que el acceso a los datos es rápido, cómo hacer que los datos estén disponibles cuando los accesos son concurrentes, cómo asegurarse de que la integridad de los datos se mantiene intacta cuando pueden producirse fallos. Finalmente, esto nos lleva a estudiar los algoritmos (es decir, métodos bien prescritos) para resolver problemas computacionales difíciles.

Estudiar algoritmos requiere un cierto nivel de madurez matemática. Para ello, estudiábamos álgebra lineal, cálculo multivariable, probabilidad y estadística, y algunas ecuaciones diferenciales básicas.

Más arriba en la pila, nos enseñan cómo funcionaban los sistemas distribuidos. (Distribuidos significa básicamente más de 1 ordenador). Para ello, empezamos con los fundamentos de las redes. ¿Cómo modelamos las señales, cómo transformarlas para que sean adecuadas para ser transmitidas a través de los medios de comunicación> ¿Cómo detectar y corregir errores? ¿Cómo encaminar el mensaje al destino en una red enorme (como Internet)? ¿Cómo asegurarse de que los mensajes están protegidos contra las escuchas, la manipulación o simplemente la caída? Esta clase es muy práctica y se espera que implementemos un sistema moderadamente grande en un semestre. Esto nos da algo de experiencia limitada.

El resto son optativas. Podíamos elegir especializarnos en un montón de temas diferentes. Teníamos clases de IA (que yo tomé), gráficos por ordenador (que no tomé), programación funcional, ingeniería inalámbrica, y muchas otras cosas.

Con todo esto, un graduado en ciencias de la computación puede decir con orgullo que entendemos un ordenador de arriba a abajo. Desde lo más grande como un sistema distribuido (como Google) hasta lo más pequeño como un transistor (Que sólo tiene unos pocos nanómetros, o 0,000000005m) de tamaño.

El tema general de toda la carrera es explicar cómo funciona el ordenador. No se trata de enseñar a ser un ingeniero de software. Este es el error clave. Al igual que ir a una clase que te enseñe cómo funciona una bicicleta, probablemente no te hará montar mejor en bicicleta.