Cuando tenía 18 años decidí no entrar a la universidad a estudiar informática y ponerme directamente a trabajar ya que la mayoría de las opiniones que había oído sobre ir a la universidad eran negativas: “es una pérdida de tiempo”, “la principal razón de estudiar una carrera es para el título”, “enseñan la informática de hace 20 años”.
Ahora tengo 28 años y hace un par de semanas acabé mi último examen. Si algún “Juan” de hace 10 años está leyendo estas líneas, le gustaría saber más sobre informática y está pensando si merece la pena o no entrar en la universidad con ese objetivo mi respuesta es “sí”. Pasarse 4 o 5 años estudiando no es una decisión fácil, aprender no es lo único que te proporciona la universidad y el tema del empleo es un tema aparte. Esta entrada está pensada únicamente para esos otros posibles “Juanes” idealistas que hayan usado algun programa que les haya despertado la curiosidad de cómo demonios funcionará o simplemente quieran saber más y tengan esa pregunta rondándoles la cabeza.
AVISO: La siguiente lista no es en absoluto exhaustiva, incluye algunas asignaturas específicas de mi elección (especialmente en quinto), no incluye asignaturas de libre elección ni varias asignaturas relacionadas con economía que mi universidad tenía en su plan de estudios de ingeniería superior en informática ni tampoco asignaturas que no me parecían tan interesantes y los ejemplos son los primeros que se me han venido a la cabeza. Muchas asignaturas probablemente se conozcan con otro nombre en otras universidades o se den en años diferentes. Por último en algunos casos he comprimido varias asignaturas en una sola (por ej: Bases de datos, Diseño de bases de datos o Fundamentos físicos de computadores, Estructura de computadores y Arquitectura de computadores).
Primer año
- Álgebra: ¿Quieres hacer un nuevo motor en 3D? ¿Quieres ser capaz de probar que un algoritmo (una forma concreta de resolver un problema) que se te ha ocurrido realmente hace lo que dices que hace y es más rápido que las soluciones existentes? Necesitas saber álgebra.
- Cálculo: ¿Qué significa que algo crece de forma lineal, cuadrática, exponencial o logarítmica? Cálculo ofrece muchas herramientas que se necesitan más adelante. Si por ejemplo te dedicas a la inteligencia artificial y quieres resolver un problema en 2 dimensiones a lo mejor es imposible hacerlo mientras que mediante ciertas técnicas puedes convertirlo en un problema de a lo mejor 50 dimensiones en las que sí es posible resolverlo.
- Metodología de programación: ¿Cómo escribir código en el menor número de líneas posible pero de forma que sea entendible por la mayor cantidad posible de programadores? ¿Qué prácticas te van a ahorrar bugs y tiempo en el futuro y qué prácticas van a hacer que te llamen a las 3 de la mañana por un extraño bug que solo ocurre de madrugada? Metodología de la programación es como un manual para aprender a escribir.
- Programación 1 o programación funcional: ¿Cómo se programa? ¿Qué es un programa?
Segundo año
- Bases de datos: ¿qué es una base de datos? ¿Cómo organizo las información de cientos de millones de llamadas de millones de personas de forma que averiguar cuántas llamadas ha hecho una persona sea una operación que tarde menos de segundo? ¿Cómo organizar información que ocupa gigabytes de espacio de forma eficiente?
- Estadística: una asignatura esencial no solo para informática sino para la vida en general. ¿Por qué es más seguro viajar en avión que en coche? ¿Por qué hay que tener mucho cuidado a la hora de leer una gráfica o cómo se pueden manipular para darte una impresión errónea? Esa optimización que has hecho en tu aplicación parece que mejora el rendimiento pero el cambio ha hecho el código mucho más difícil de mantener o no, ¿es la optimización realmente significativa? Amazon, Google y otras empresas no aplican una mejora si las estadísticas no confirman que el cambio sea positivo. La intuición es engañosa, la estadística no es una solución a todo pero ofrece mucho más rigor/seriedad si se emplea bien.
- Estructura y arquitectura de computadores: ¿Cómo funciona un ordenador? ¿Debería gastarme 200€ más en ese nuevo tipo de procesador? Quiero desarrollar un nuevo juego en 3d, ¿qué tipo de algoritmos gráficos o motor de 3d debería desarrollar para sacar el máximo rendimiento a las tarjetas gráficas y ordenadores actuales o que están a punto de salir? Me han encargado diseñar el hardware y el software de un robot que se tiene que pasear por Marte. El robot tiene viaje de ida, tengo 3 años para diseñarlo, 150 millones de euros y no puede colgarse. ¿Cómo lo hago?
- Estructuras de datos: ¿cómo organizo los datos con los que tienen que trabajar mis algoritmos? Cada estructura de datos tiene unas ventajas y unos inconvenientes y en la mayoría de situaciones la diferencia entre que tu algoritmo o programa funcione o no va a depender de las estructuras de datos que uses.
- Matemática discreta: árboles y grafos son herramientas muy útiles para entender muchos problemas, desde colorear mapas a resolver problemas de comunicación en una red de sensores forestal a diseñar sistemas de inteligencia artificial basados en redes neuronales. Las recurrencias, otro apartado dentro de las matemáticas discretas, son muy útiles para averiguar la velocidad a la que tus algoritmos funcionan.
- Métodos numéricos: todos los programas ejecutan operaciones pero hay operaciones muy complejas que realizarlas de forma exacta llevaría demasiado tiempo. Hay métodos numéricos que te dan resultados aproximados para muchas operaciones en una fracción del tiempo que llevaría calcular el resultado exacto. Dependiendo de qué tipo de problema el grado de precisión que necesitarás es mayor o menor.
- Programación de robots: ¿cómo programar sistemas mecánicos que se comportan más o menos como un ser humano? La mayoría de las fábricas de coches aunque tienen gente trabajando entre las máquinas lo que hacen es principalmente controlar que los cientos de robots capaces de apretar tornillos, pintar chapas o “quemar” con láser un circuito en un espacio del grosor de un pelo en milésimas de segundo funcionen correctamente.
- Programación orientada a objetos: ¿cómo diseñar un sistema operativo (OSX, Linux, Windows) o un programa de cientos de miles de líneas de forma que miles de desarrolladores puedan trabajar a la vez en diversas partes?
- Sistemas operativos: ¿cómo funciona un sistema operativo? ¿Por qué Windows va lento a veces? ¿Qué diferencia hay entre memoria RAM y memoria virtual? ¿Cómo es posible que con un procesador o unos pocos núcleos haya más de 200 tareas ejecutándose a la vez? ¿Qué diferencias hay entre Linux, Windows y OSX? ¿Qué sistema operativo es mejor para qué tarea?
Tercer año
- Ingeniería del software: ¿cómo pensar a la hora de enfrentarte a un nuevo problema? ¿En qué lenguaje puedo expresar mis ideas de forma que las pueda discutir con otras personas? ¿Cómo diseñar sistemas que tienen que responder en milésimas de segundo o con una precisión de nanómetros? ¿Como puedo construir un brazo médico que haga operaciones quirúrgicas de forma precisa y tenga la seguridad de que no se va a cargar al paciente? Al igual que Estadística esta asignatura no es solo útil para informática. La esencia de lo que aprendes es aplicable a otros entornos: ¿cómo funciona una empresa, de dónde le viene el dinero, qué produce a cambio? ¿qué integrantes hay en el mercado eléctrico, cuál es la interacción entre cada uno de ellos?
- Investigación operativa: la base de la revolución industrial. ¿Por qué es más eficiente tener en un restaurante de comida rápida a 5 personas cada una haciendo una parte diferente del burrito mejicano que piden los clientes que tener a los 5 haciendo el burrito entero cada una? ¿Cómo distribuyo los elementos de mi fábrica o de mis instalaciones de forma que el tiempo que se pierda en desplazarse sea mínimo? Tengo que fabricar 5 tipos de productos diferentes, cada uno tiene un coste diferente y cada uno lo puedo vender a un precio diferente. ¿Cuántos productos de cada tipo debería producir para maximizar mi beneficio?
- Teoría de automátas, lenguajes formales: ¿cómo puedo representar un lenguaje con un número de caracteres finito que pueda “validar” que una cadena pertenezca o no a ese lenguaje? ¿cómo representar los diferentes estados en los que “algo” puede estar? ¿cómo puedo escribir un programa que genere nombres o ciudades aleatoriamente? Al igual que estadística y cálculo la teoría de autómatas es una herramienta que puedes utilizar más adelante para resolver problemas más complejos.
- Transmisión de datos, redes: ¿cómo funciona internet? ¿cómo es posible comunicar dos o más ordenadores o móviles entre ellos? ¿Qué diferencia hay entre ADSL, cable, satélite? ¿Cuando usar wifi en lugar conexión por cable en una lan? ¿Qué significa DNS?
Cuarto año
- Ingeniería del conocimiento: ¿cómo escribir de forma que un ordenador entienda cosas como las reglas que sigue un operario para determinar si debe parar o no un reactor nuclear? ¿Cómo hacer un programa de ordenador que simule un diagnóstico médico en base a un doctor o a varios doctores?
- Procesadores del lenguaje: ¿Cómo funciona un lenguaje de programación? ¿Cómo puedo escribir yo uno?
- Técnicas avanzadas de bases de datos: soy Facebook, tengo más de 200 millones de usuarios, tengo billones de imágenes, no hay un ordenador capaz de almacenar toda esta información, ¿cómo lo hago?
Quinto año
- Aprendizaje máquina: ¿cómo haces un programa capaz de diferenciar a un ladrón de un cliente en una tienda? ¿Cómo funcionan los sistemas de reconocimiento de voz cuando llamas a cualquier empresa? (Los que funcionan medianamente bien) ¿Cómo funciona el modo de teclado inteligente de los móviles? ¿Cómo detectar mensajes de spam de mensajes no spam? ¿Cómo hacer sistemas que aprendan igual que las personas?
- Minería de datos: Tengo un supermercado y quiero aumentar mis beneficios, ¿hay algun producto más que la mayoría de los clientes que compran el producto A también compran? Si lo averiguo puedo ponerlos más juntos o hacer ofertas que aumenten más las compras. ¿Cómo encuentro en una cadena de millones de genes los genes responsables de este tipo de cáncer o de esta otra enfermedad? ¿Qué diferencia hay en el ADN de esta persona que no envejece y del resto de personas? ¿Cómo encontrar patrones en la inmensidad de información que se genera cada día que me dén ideas para mejorar la calidad de vida de la gente?
- Procesamiento de lenguaje natural: ¿cómo puedo saber el sentimiento general que hay con respecto a un nuevo producto en base a las opiniones de los cientos de webs que están hablando del tema? ¿Cómo hacer buscadores web inteligentes que sepan encontrar relaciones entre enfermedades y síntomas de forma automática? ¿Cómo hacer programas que traduzcan automáticamente de un idioma a otro?
- Seguridad informática: ¿qué es una botnet y cómo funcionan? ¿Cómo me comunico de forma segura con mis tropas en medio de Iraq? ¿Qué es Spam, cómo funciona? ¿En qué consisten las tecnologías DRM y qué problemas tienen? ¿Cómo funcionan los virus, cómo estudiarlos y averiguar lo que hacen a tiempo para pararlos antes de que echen abajo una central eléctrica de la que dependen hospitales? ¿Cómo analizar por dónde puede un hacker atacar mi programa?
- Sistemas distribuídos: ¿Cómo funcionan programas P2P como bittorrent o eMule? Tengo una red de sensores de bajo coste para detectar incendios forestales? Soy Google, tengo 14 mil millones de páginas web que analizar y cientos de miles de servidores para hacerlo, ¿cómo lo hago de la forma más eficiente posible? ¿Cómo hago para que en cuanto se detecte un incendio se notifique lo antes posible a los bomberos para apagarlo cuanto antes? ¿Cómo diseño un juego multijugador como Quake, Unreal Tournament, Call of Duty o World of Warcraft resistente a ataques de cheaters pero que sea jugable?
- Sistemas de información textual: Soy Google, un usuario busca en internet “chicas guapas”, ¿cuáles de los 14 mil millones de páginas web que conozco devuelvo en primer lugar? ¿Qué películas recomiendo a mis clientes en base a las películas que han visto anteriormente? Soy Amazon, ¿qué libros recomiendo a mis visitantes de forma que la probabilidad de que los compren sea más alta?
- Algoritmos: ¿Cómo resuelvo problemas? ¿Cómo lo hago de la forma más eficiente posible?
Una buena parte de lo que se estudia no se acaba utilizando pero no es lo mismo saber que un tipo de problema o situación ya se ha resuelto, que tiene nombre y que más o menos te suena por dónde van los tiros que intentar reinventar tú mismo la rueda. Y aunque como persona idealista (y raya yogui) que soy no dudo que exista alguien capaz de aprender todo esto por su cuenta, en el tiempo de ir al trabajo, al baño o mientras ve Lost la fuerza de voluntad, capacidades necesarias o vidas pasadas necesarias para hacerlo no son comunes.