Estoy terminando mi cuarto año en la escuela de posgrado en Caltech, y recientemente logré completar mi primer trabajo: Un nuevo algoritmo para la propagación de ondas gravitacionales.
Se basa en el campo de la relatividad numérica, que se asocia con la investigación de LIGO que Giordon Stark mencionó en su respuesta.
Las palabras no pueden describir cuántos errores tuvieron lugar en el transcurso de este documento. El proyecto comenzó como algo completamente diferente. A partir de hoy, literalmente cada una de las ~ 20,000 líneas de código que escribí ha sido reescrita dos veces o más.
Por supuesto, escribo errores todo el tiempo, y a veces incluso los comprometo a dominar. Cuando comencé este proyecto, nunca antes había escrito c ++. Incluso hoy sigue sorprendiéndome. Una de las mayores sorpresas vergonzosamente tardías en el proceso fue la pérdida de memoria. Aquí es donde asigna memoria pero se olvida de liberarla (probablemente debido a la pérdida de memoria humana), y su código se come toda la memoria, chilla y bloquea la computadora. Pronto descubrí valgrind, y en poco tiempo encontré una pérdida de memoria en una biblioteca de terceros que utilizamos.
Como un n00b casi total, tuve que aprender a usar Linux, específicamente Ubuntu. Mi enfoque durante aproximadamente 6 semanas fue instalar paquetes hasta que la computadora no se iniciara, luego reinstalar el sistema operativo desde cero. 10 veces en total. Me hice bueno en eso. El mejor error relacionado con ubuntu fue cuando la computadora funcionaba muy lentamente (probablemente debido a las fugas de memoria mencionadas anteriormente), verifiqué los trabajos en ejecución (ps -ux) y vi un probable delincuente. Se llamaba compiz, que me sonó bastante incompleto. Entonces (kill -9 ####) y abruptamente la pantalla se volvió negra. Una búsqueda rápida en mi teléfono me dijo que compiz es parte del sistema que permite a Linux operar un sistema operativo GUI. Literalmente había matado la capacidad de mi computadora para poner cosas en la pantalla. Después de un poco de maceración aleatoria, (ctrl f?) Me puse en modo de línea de comando. ¿Cuánto daño puede hacer un principiante completo con acceso a la raíz? OS reinstala los números 11 y 12!
De alguna manera me involucré en un proyecto de diseño satelital. Esto fue fortuito, ya que mis habilidades con Linux se habían desarrollado hasta el punto en que la programación de una MPU parecía factible. Los problemas de programación significaron que a menudo tenía que ensamblar hardware y software para el equipo de controladores. El mayor problema fue la falta de conexión del cable de tierra, pero el problema más divertido ocurrió cuando la fuente de alimentación simplemente no se comportaba. El voltaje se mantuvo bajo, la corriente era alta. Al darme cuenta de que tenía un corto, hice los cálculos en mi cabeza y determiné que me encontraría antes de encontrarlo. Efectivamente, en ese momento uno de los condensadores del bus de potencia emitió un destello brillante de llama y bastante humo púrpura mágico. Nos aseguramos de incluir sus restos ennegrecidos en nuestra próxima presentación de diapositivas.
Una vez se me ocurrió que ser capaz de usar Mathica desde mi teléfono sería genial. Instalé AndroidVNC y configuré el escritorio remoto. Muy pronto, mi computadora estaba funcionando muy lentamente. El registro de eventos en el hogar había crecido a 100 conciertos y volvió a crecer casi instantáneamente cuando lo borré. Resulta que los hackers estaban tratando de forzar mi contraseña súper segura (0000, creo). Más tarde, instalé un cliente ssh remoto que me permitió reiniciar las ejecuciones en computadoras nacionales mientras caminaba, lo que me pareció genial.
Una de las ecuaciones que mi algoritmo tiene que resolver tiene una estructura de fase compleja muy complicada. Mi enfoque inicial para esto fue descubrir la fase dividiendo por su valor absoluto, y luego aplicar una transformación de calibre muy casera para eliminar la fase. Problema resuelto. Excepto que dividir por números realmente pequeños (como la función era ocasionalmente) en las computadoras es una muy mala idea.
Más tarde, rediseñé ese algoritmo (después de un breve período de negación). Las ecuaciones eran lo suficientemente largas como para que una pizarra no fuera suficiente, así que utilicé una de las particiones de vidrio internas del edificio. No mucho después de eso, la partición de vidrio se hizo añicos, pero dudo que se deba a un marcador de pizarra o a errores en los signos.
En un momento estaba desarrollando un módulo de código simple (¡ja!) Para realizar una transformación de variables y coordenadas. Mi primer intento fue tan hilarantemente fuera de la base que terminé haciendo coincidir los valores de las funciones término por término (alrededor de 500 en total) con el código que la mina debía reemplazar. 499 correcciones más tarde, me estaba matando a mí mismo porque no podía conseguir que coincidiera el último término. Después de un día de cortar y cortar en cubitos, fui lo suficientemente arrogante como para que mi asesor / colaborador obtuviera el código anterior (que desarrolló originalmente hace unos 20 años de la misma manera). Lo revisamos término por término, y … una línea crucial había sido comentada. Según el control de versiones, una parte culpable sin nombre lo había eliminado como parte de las pruebas solo unos años antes, y nadie lo había atrapado. ¡OpenSSL te come el corazón!
Un pequeño fallo por parte de mi asesor. Aproximadamente 2 años después, cuando (estúpidamente) pregunté por qué esta parte del código no se había actualizado materialmente en décadas, aún escrito en FORTRAN, casualmente dejó escapar que estaban convencidos de que un tratamiento espectral del problema era imposible. Afortunadamente, una semana después tuve pruebas definitivas de que ese no era el caso, pero aún quedaba un largo camino por recorrer.
Hace unos 8 meses, resolvimos la mayoría de los errores y comenzamos a escribir el documento. Para completarlo, necesitábamos una comparación de referencia muy exhaustiva entre los dos códigos. Desafortunadamente, pocas personas realmente saben cómo ejecutar el código anterior, y los primeros intentos fallaron espectacularmente. Sin embargo, me animé mucho ya que el código anterior se ejecutaba en paralelo y se ejecutaba muy, muy lentamente. En una reunión de grupo, anuncié que con un error comparable, mi código era aproximadamente un millón de veces más rápido, que era en ese momento. Esto es algo bastante bueno para poner en un papel. Desafortunadamente para eso, más tarde descubrimos que funcionaba más rápido en un solo nodo, y después de muchos otros problemas (archivos de entrada incorrectos, parámetros incorrectos, eliminación involuntaria, uso de hasta 10 terabytes de datos demasiado rápido, etc.) finalmente produjeron los datos en el papel. Solo tomó 8 meses más o menos, y afortunadamente condujo a muchas otras mejoras mientras tanto.
Una anécdota final, de algunas incursiones muy breves a la física experimental en mis días de estudiante. Intentábamos medir la calidad de algunas cavidades ópticas producidas por nuestros colaboradores. Esto es parte de un esfuerzo de investigación para producir procesamiento de señales fotónicas (en lugar de electrónicas). La técnica es la siguiente.
- Tome una longitud de fibra óptica, de aproximadamente 0.2 mm de ancho. Retire unos 5 cm de revestimiento de plástico con una cuchilla de afeitar, limpie con metanol para disolver cualquier residuo.
- Empalme la fibra en el bucle de señal óptica para que pueda controlar sus propiedades de transmisión en tiempo real.
- Fije la fibra en la plataforma cónica, un artilugio que aplica calor suave de una antorcha de butano mientras los motores paso a paso estiran la fibra.
- Manipule la fibra para introducir una ligera curva. Aplique un giro, forme un bucle, hágalo con un encendedor, luego sepárelo para formar un bucle de sonda. Fijar a un portaobjetos de microscopio.
- Retire el cono y el tobogán y llévelos a la sala limpia, conéctelos al equipo de señalización allí y úselos para probar las cavidades.
Muchas cosas pueden salir mal con este proceso. La tasa de éxito fue de aproximadamente 1%. Después de algunas semanas de práctica, pude producir un cono de unos 900 nm de diámetro. En este ancho, la mayor parte de la luz en la fibra se escapa y viaja a lo largo del exterior de la fibra. Cuando se acerca a una pequeña cavidad resonante, la luz puede acoplarse, lo que le da una señal en su espectrograma. Si una pequeña partícula de hollín de la antorcha de butano se adhiere a la fibra, también se unirá la luz, y la fibra debe ser descartada. La pérdida aceptable en todo el cono, que es 100 veces más delgada que una fibra normal, es de 3 dB.
Ahora a las 4 semanas del proyecto de 5 semanas, tuve dos conos exitosos y un desecho lleno de fibra rota. Montamos el primero y comenzamos a caracterizar las cavidades. Una de las cosas más importantes para verificar es la repetibilidad, por lo que después de revisar media docena de cavidades, las revisamos varias veces. Los datos habían cambiado. Quizás el cono había enganchado un borde en la superficie y había sido dañado. Intercambiamos el otro cono. También tuvo el mismo problema. Ambas velas ahora tenían más pérdidas que antes también. Los revisamos bajo un microscopio. Quizás se habían vuelto un poco polvorientos. Les dimos un lavado rápido con solvente, lo cual es muy arriesgado, ya que el vidrio es increíblemente delgado, débil y probablemente esté pensando en fracturarse. Uno de los conos se rompió, el otro fue restaurado. Intentamos nuevamente, el mismo resultado.
Más tarde resultó que todo el lote de cavidades estaba contaminado con polvo y otros desperdicios que saltaron electrostáticamente a los conos tan pronto como se acercaron. Debido a que eran imposibles de limpiar e imposibles de obtener mediciones consistentes, todo el proyecto fue nulo y sin efecto. Colgué mi bata de laboratorio y no he mirado hacia atrás.