Justo antes del verano cumplí con el último de los requisitos para continuar en el programa de doctorado en la Universidad de Virginia. Estoy hablando de los temidos exámenes de cualificación o “Qualifying exams, quals for short”. El sistema ha cambiado desde que estoy aquí, pero para mí el requisito se puede resumir de la siguiente forma: 5 exámenes escritos y uno oral, con dos oportunidades para aprobar cada uno. Te examinan en enero o mayo. Suspendes dos veces y dices adiós al doctorado en UVA -por eso va lo de temidos. Posiblemente es el paso más importante para cursar el doctorado, ya que aunque no es parte de tu tesis es la criba más importante en el programa. A no ser que Google te ofrezca un sueldo que se aproxima bastante a las 6 cifras y decidas dejar la vida académica con el título de Master of Computer Science – se han dado casos-.
Para los que tengáis curiosidad, los exámenes de cualificación se dividen en 5 secciones: Lenguajes de programación/Compiladores, Ingeniería del Software, Sistemas Operativos, Teoría de la Computación/Algoritmos y Arquitectura de Computadores. Hay un examen escrito por cada sección y un examen oral que cubre todo el temario. Este enero pasado aprobé el último escrito que me faltaba y me presenté por primera vez al oral, que no aprobé por los pelos. La impresión del comité fue que con un poco más de preparación no debería tener problemas en mi segunda -y última- oportunidad. Claro está, jugarte la permanencia en el programa de doctorado a un examen oral de 50 minutos ante un comité de 5 profesores es extremadamente estresant, por decirlo de alguna manera.
El caso es que felizmente superé la prueba a finales de mayo pasado después de encerrarme un mes con los libros y hacer sesiones de práctica con mis compañeros y varios profesores. Para los curiosos, esto es lo que recuerdo de las preguntas (10 minutos por sección):
- Compiladores: Dibuja un diagrama con los componentes principales de un compilador. ¿Quál es la salida de cada componente? Describe la teoría matemática detrás del Scanner y del Parser. ¿Qué partes usan la tabla de símbolos? Describe dos optimizaciones, una independiente de la arquitectura y otra dependiente de ella.
- Arquitectura: Diferencia entre coherencia y consistencia de memoria en sistemas con varios procesadores. ¿Quáles son las condiciones suficientes para tener un sistema de memoria coherente? ¿Tiene sentido la optimización “merging write buffer” en cachés si queremos tener un sistema de memoria estrictamente consistente? ¿Por qué?
- Teoría/Algoritmos: ¿Es el problema de la parada NP-Completo? ¿Es NP-difícil? ¿Puedes demostrar que es NP-difícil? ¿Cómo se hace una reducción? Escribe 5 algoritmos diferentes que conozcas con 5 tiempos de ejecución diferentes-big O notation-.
- Sistemas Operativos: ¿Qué es RPC? Dibuja un diagrama con dos procesos en un sistema distribuido ejecutando una RPC. ¿Quáles son los posible problemas en una RPC que no suelen darse en una llamada local? ¿Cómo distingue el cliente entre ellos? ¿Quáles son las posibles semánticas para una RPC?
- Ingeniería del Software: ¿Cómo probarías un sistema operativo -enrollate por 5 minutos- ?¿ Cómo decides que ya has hecho suficientes tests a un sistema software?
Bueno, ¿qué pensáis? ¿Fácil/díficil/no sé de lo que me hablas? Por cierto, si alguien tiene curiosidad por el temario, aquí tenéis una foto con parte de los libros a estudiar (no se incluyen los libros de Ingeniería o Compiladores):

