viernes, 14 de diciembre de 2007

Microsoft IV - A comer!

La tercera entrevista fue una 'lunch interview' en el edificio 26 con Aaron Holmes. Cómo siempre, hablé con la recepcionista y a los 5 minutos mi entrevistador bajó a recogerme, pero esta vez no me llevó a su oficina sino al restaurante.

El restaurante era tipo buffet, y tenía como distintas secciones: ensaladas, hamburguesas, postres, etc. Yo me decidí por una ensalada (tenían de todo para echarle), y Aaron, como buen americano, se pidió una hamburguesa con patatas fritas =) Después de coger la comida, nos sentamos y empezamos a hablar.

Basicamente me estuvo contando lo que hacían en su grupo. Estaban trabajando en el sistema de actualizaciones de Windows Vista y Windows Seven, y también en el instalador de programas (los archivos .cab y esas historias). Luego me preguntó un poco por mis experiencias trabajando en grupo y por mi último proyecto hasta que acabamos de comer y nos fuimos a la oficina.

Tocaban más 'coding questions'. La primera fue la siguiente:

Escribir una función que dada una lista de nombres (por ejemplo "Peter, Charles, David") y un entero positivo N genere otra lista con el siguiente formato "A gives to B, C gives to D, ...", donde A, B, C y D son personas de la lista inicial. La lista resultante debe cumplir las siguientes reglas:
- Todos dan N veces
- Todas reciben N veces
- Nadie da más de una vez a la misma persona
- Nadie se da a si mismo
- El resultado debe ser aleatorio, es decir, la misma entrada debe producir distintas salidas

La pregunta me resultó un poco rara al principio, pero luego me di cuenta de que no era difícil. Empecé dando una solución que no era aleatoria, y luego empecé a dar ideas para aleatorizarla, hasta que di con la que el entrevistador estaba esperando. Quedó bastante impresionado y me dijo que me quería hacer otra pregunta.

Dada un secuencia de enteros positivos y negativos, encontrar la subsecuencia de suma máxima. Por ejemplo, en [4, 7, -3, 100, -9, 5] la subsecuencia de suma máxima sería [4, 7, -3, 100].

Este problema es todo un clásico. Ya había leido de otra gente a la que se lo habían preguntado y creía saber la solución, así que me puse contento. Sin embargo, resulta que la que creía que era la solución no lo era realmente jaja, así que allí estaba solo ante el peligro. Empecé a buscar posibles soluciones y el entrevistador me fue dando consejos hasta que llegué a la solución correcta, que tiene complejidad O(n) y sólo implica recorrer la lista una vez. Aaron quedó muy satisfecho porque había resuleto el problema muy rápido.

El tiempo de la entrevista se había agotado, así que el entrevistador me acompañó a la entrada. Mi siguiente entrevistador era su jefe, un indio cuyo nombre nunca llegué a entender. Me dijo que esperase allí, que vendría a recogerme en unos minutos. Así que nada, me senté en un sofá a esperar mi cuarta entrevista.

miércoles, 12 de diciembre de 2007

Oferta

Hoy sobre las tres de la tarde me han llamado de nuevo de Microsoft. El grupo de Components Platform ha decidido hacerme una oferta. Dicen que soy muy bueno y tienen muchas ganas de que me una al equipo. Mañana me llamará mi recruiter para darme los detalles de la oferta.

Prueba superada.

domingo, 9 de diciembre de 2007

PL

Esta mañana me dio por ver mis notas finales del semestre y me encontré con esto:

Advanced Topics in Compiler Construction - A+

¿Que qué significa? Matrícula de Honor en PL!!! Jajaja

¡¡¡ GRACIAS AMÉRICA !!!

viernes, 7 de diciembre de 2007

Noticias desde Microsoft

Esta mañana me ha llamado Matt, mi recruiter, para comentarme el resultado de las entrevistas. Me ha dicho que el feedback que han dado todos mis entrevistadores sobre mi es muy muy bueno y que piensan que tengo mucho talento, pero que están todavía tomando una decisión porque creen que encajaría mejor en un grupo distinto de los que me entrevistaron. Seguramente el lunes me llamará el director de ese otro grupo para explicarme en qué están trabajando y para conocerme un poco, pero no hace falta que vaya a Seattle otra vez para volver a hacer entrevistas ya que están muy contentos con mi rendimiento. Yo le dije que perfecto, que no tengo ningún problema y que me llame o me escriba un e-mail con lo que sea.

Pues nada, parece que de momento no son malas noticias. Si no me quisiesen ya me habrían dicho que no, así que creo que todo esto es positivo y me acerca un poco más al puesto de trabajo. La verdad es que los grupos con los que me entrevisté trabajaban en niveles bajos del sistema operativo y a mi siempre me ha gustado hacer cosas a más alto nivel. Parece que se dieron cuenta de esto y ahora me van a mandar al grupo adecuado. ¡A ver que pasa!

miércoles, 5 de diciembre de 2007

Microsoft III - Una de puzzles

La segunda entrevista era en el edificio 40 con un tipo llamado Anthony Jones, también del grupo de Core Networking. Llegué al edificio, le dije a la recepcionista que estaba para una entrevista, llamó al entrevistador y en cinco minutos bajó a por mí.

Se trataba de nuevo de un hombre de mediana edad, esta vez americano. Esta vez su despacho se parecía a un despacho, no como en la primera entrevista. Tenía varios libros, cuatro o cinco ordenadores, y varios premios de 'SHIP IT!' que se los dan a todos los empleados que han trabajado en un proyecto cuando este se comercializa.

Tomé asiento y empezamos la entrevista. Las primeras preguntas las de siempre. Luego pasó a preguntarme por el proyecto, en especial por el aspecto del trabajo en equipo: como nos organizábamos, como resolvíamos los desacuerdos, como distribuíamos el trabajo, etc. Le expliqué como lo habíamos hecho a hasta ahora y añadí que uno de los motivos por los que me encantaría trabajar en Microsoft es para conocer como una gran empresa es capaz de organizar a 500 tíos trabajando en lo mismo y que las cosas salgan bien. El entrevistador quedó bastante impresionado cuando escuchó esto, y me dijo que le alegraba oir que pienso que desarrollar un proyecto no es sólo programar como mucha gente cree, sino que implica muchas otras cosas.

Después de esto pasó a una 'coding question'. Era muy facilita. Dadas una cadena principal y una subcadena (menor que la principal), escribir una función que te diga si la subcadena existe dentro de la cadena principal.

De nuevo empecé dibujando un ejemplo y razonando sobre él, mientras le explicaba mis razonamientos. No voy a entrar en detalles de como resolver este problema, ya que es muy muy sencillo. Después de explicarle el algoritmo me dijo que lo codificase en la pizarra. Escribí el código y le hablé de la complejidad y el entrevistador quedó bastante satisfecho.

Parece ser que mi capacidad para escribir algoritmos era suficiente para él, así que dijo que ahora me preguntaría un par de puzzles, es decir, típicos acertijos o preguntas de ingenio. Las que me planteó fueron las siguientes:

PUZZLE 1
Tenemos dos palos, y una cuerda atada entre ellos tal y como muestra el dibujo. La cuerda mide 150 cm (antes había un error, había puesto 175 cm), los palos 100 cm, y la cuerda está colgando a 25 cm del suelo. ¿A qué distancia está un palo del otro?


PUZZLE 2

Tenemos dos cubos, 50 canicas rojas y 50 canicas negras. Distribuir las canicas entre los dos cubos para que, eligiendo un cubo al azar y una canica de ese cubo también al azar tengamos la probabilidad más alta de que esa canica sea roja.


La solución la pondré en unos días para que intentéis resolverlos y pongáis la solución en los comentarios. Yo el 1 lo resolví a la primera y el 2 a la segunda. El entrevistador quedó realmente impresionado y decidió terminar ya la entrevista. Nos quedaban 20 minutos todavía, así que me estuvo explicando como empiezan un proyecto en Microsoft y como se coordinan los tres tipos de empleados: Program Managers, Software Developers y Software Testers. Luego me estuvo contando que llevaba 9 años trabajando en WinSocks, y que ahora estaban trabajando ya en el nuevo Windows, que se llamará Windows Seven. También me dijo que había escrito un libro, pero ya vendía muy pocos ejemplares, y alguna que otra cosilla más. La verdad es que fue una conversación muy interesante.

Después de nuestra pequeña charla, me llevó de nuevo a recepción. La señorita me pidió un taxi al edificio 26 y Anthony se despidió de mi. La siguiente entrevista sería una 'lunch interview', es decir, que primero comería con el entrevistador. Esta vez era con el otro grupo , el de 'Component Platform'. Me monté en el taxi y me dirigí rumbo a la siguiente entrevista mientras pensaba en que nuevas sorpresas me depararía el día.


domingo, 2 de diciembre de 2007

Microsoft II - Desde Turquía con Amor

Tras unos 5 minutos en el taxi, llegué al edificio 10, el de Core Networking. En Microsoft el tema de los edificios es un auténtico caos, ya que están numerados sin seguir ningún tipo de norma, por lo que a lo mejor al lado del edificio 13 está el 38 y cosas así. Por eso es buena idea llevar contigo un mapa si vas en coche o sino coger un taxi, ya que los taxistas a base de estar allí trabajando varios años ya se conocen donde esta cada cosa.

Abrí la puerta del edificio 10 y me encontré con el mostrador de recepción. Me acerqué y le dije a la chica guapa que tenía una entrevista con Sermet Iskin. Buscó su nombre en el ordenador, le llamó y me dijo que esperase un minuto que ahora venía. Mientras esperaba me llamó la atención que justo detrás de recepción hubiese una mesa de ping-pong con dos ingenieros allí jugando. También había varias XBox 360. Parece que allí los empleados no se aburren...

Unos minutos después llegó mi entrevistador. Era un tipo de unos 30 años, con perilla. Me dio la mano y me dijo que le siguiese al despacho. Me estuvo contando que estaba en ese edificio de forma provisional porque se iba a cambiar a una oficia dentro de una edificio nuevo, pero que todavía lo estaban construyendo. También me contó que era de Turquía, y estuvimos un rato hablando de los extranjeros en los Estados Unidos mientras llegábamos a su despacho.

El despacho era de tamaño normal y se notaba que era provisional, ya que sólo tenía tres ordenadores, alguna foto de su hija y poco más. Me dijo que me sentase y hablamos un poco de lo que él hacía en Microsoft. Estaba trabajando en la capa de SOAP de Windows, es decir, en una API para poder desarrollar servicios web de manera fácil y rápida.

Lo primero fue lo de siempre: ¿Por qué Microsoft? ¿Qué área de la ingenería informática te gusta más? etc. Luego me preguntó por algún proyecto interesante que hubiese hecho últimamente en GRUPO. Muy importante esto de grupo, ya que les interesa muchísimo que seas un buen 'team player'. Le hablé un poco del proyecto que estamos haciendo en Java para Design of Large Programas, un juego de estrategia en tiempo real multijugador, y él estuvo un rato insistiendo en los aspectos del grupo: cómo nos organizábamos, como nos repartíamos el trabajo, que hacíamos cuando no estábamos de acuerdo en algo... Después de eso me pidió que le explicase alguna parte interesante del proyecto. Le expliqué que utilizaba concurrencia, y tras comentarle como sincronizábamos los distintos threads me respondió: "bueno, eso no parece muy difícil o interesante, no?" jajaja Salí del lío diciéndole que efectivamente no lo era, pero sólo quería mostrarle como el proyecto utilizaba un poco de todo: concurrencia, networking... Se lo creyó y me hizo otras preguntas sobre el proyecto tras las que acabó pidiéndome que dibujase en la pizarra un diagrama para explicárselo mejor.

Se ve el tipo no tenía muchas ganas de hacer la entrevista. Me dijo: "tómate tu tiempo y avísame cuando termines" y se puso a hacer cosas en el ordenador. Hice un diagrama simplificado de las clases que formaban el juego y le avisé. Le expliqué como funcionaba todo y él intentó convencerme de que el servidor del juego no hacía falta que almacenase ningún tipo de información, sólo que hiciese broadcasting a todos los clientes de los comandos que ejecutaba cada cliente. Le dije que no, que era necesario que mantuviese información sobre el juego para que se pudiesen hacer trampas entre otras cosas. Quedó satisfecho con la explicación y dijo que ahora tocaba una 'coding question'.

La pregunta era la siguiente: Dada una lista enlazada ordenada, eliminar los elementos duplicados. Me dijo que me lo pensase y se puso otra vez con el ordenador.

Lo primero que hice fue un dibujo del problema. Luego deduje el algoritmo a partir del ejemplo que había dibujado, el cual es bastante sencillo: recorremos la lista y mantenemos una referencia a cada dato 'nuevo' que encontramos. Luego, borramos todos los nodos que nos encontramos hasta llegar a otro 'nuevo'. Cuando esto ocurre, enlazamos la referencia que teníamos con el siguiente nodo nuevo y repetimos el proceso hasta que hemos recorrido toda la lista.

Le dije que ya estaba listo y le expliqué el algoritmo sobre el dibujo. Quedó satisfecho y me dijo que lo codificase. Me preguntó si el puntero a la lista había que pasárselo a la función por copia o por referencia, es decir, si íbamos a eliminar el primer nodo en algún momento. Le dije que sí, pero me dijo que lo pensase mejor y me di cuenta de que de la manera que había escrito el algoritmo el primer nodo nunca se iba a eliminar, porque siempre iba a ser 'nuevo'. Escribí el resto del código sin problema, y cuando acabé me dijo que lo revisase bien. ¿Qué pasaba si el último elemento estaba repetido? Lo revisé y tenía razón: había que acordarse de poner la referencia al siguiente nodo del último elemento nuevo a NULL. Me dijo que no pasaba nada, que ya no quedaba más tiempo y me acompañó de nuevo a la entrada.

Allí me dio la mano, me dijo que estaba encantado de haberme conocido y que ahora me entrevistaría con un tal Anthony también de Core Networking, pero que tenía que ir al edificio 40. La recepcionista me pidió un taxi, me monté en él y marché rumbo a la segunda entrevista.

El comienzo no había sido malo. No estaba teniendo problemas con el inglés, no me había puesto nerviso, y aunque había tenido algunas dificultades durante la entrevista no lo había hecho mal del todo. ¡A ver que pasaba en la siguientes!