06 marzo 2016

Calcula la media aritmética

Parece una pregunta muy sencilla: ¿Puedes escribir un programa que calcule la media aritmética de una lista de números? La respuesta también puede ser sencilla, simplemente iterando sobre la lista y sumando los números para al final dividirlos por la cuenta. Por ejemplo, en Java:

La respuesta, aunque sencilla, no es del todo correcta. Imagínate, por ejemplo, que tu función recibe una lista vacía, o incluso sin inicializar. Tu código fallaría espectacularmente. Cuando escribes una función, por simple que sea (me atrevería a decir especialmente si es una función muy simple, pues será más probable que la reutilicemos en otras partes del código), nunca confíes en los parámetros de entrada de la función. Una versión algo más robusta sería:

Pero aún no es del todo correcta. ¿Puedes adivinar por qué? En este caso, el problema es mucho más sutil. Imagínate que la lista es muy larga; no, mejor aún, muy muy muy larga. ¿Qué pasaría con la variable sum? ¡Un desbordamiento de enteros! Una manera muy sencilla de solucionar el este problema es cambiando el tipo de la variable a double:

¿Me creerías si te digo que la función aún se puede mejorar más? Si tienes un conocimiento decente de estructuras de datos, sabrás que es muy probable que List.size() es algo que merece la pena copiar en memoria o, aún mejor, evitarlo completamente usando un foreach:

A partir de aquí, aunque se pueden seguir mejorando más elementos de la función, dichas mejoras empiezan a ser debatibles y dependientes de detalles relacionados con la implementación (por ejemplo, dividiendo el resultado de la suma incrementalmente en lugar de sólo al final).

La lección que espero transmitir con esta entrada es que incluso "algoritmos" relativamente sencillos como la media aritmética pueden dar mucho juego cuando uno se para a pensar en las diferentes optimizaciones aplicables.

29 febrero 2016

Buscando trabajo en EEUU: Microsoft I

Antes de que pueda contar el final de la historia con Tesla Motors de mi última entrada, debería empezar a contar mis experiencias entrevistando con Microsoft porque ocurrieron simultáneamente y al final todo confluye; ¡como en las películas de Tarantino!

Igual que hice con Zappos, me decidí por echar el currículum en Microsoft sin conocer a nadie ni saber mucho de la empresa. Igualmente, no me esperaba mucho pero recibí una agradable sorpresa en forma de correspondencia electrónica unas pocas semanas más tarde. Como es habitual, el primer paso fue una entrevista telefónica de carácter técnico. Es posible que su estrategia haya cambiado desde entonces, pero cuando me entrevistaron a mí no era para un rol o equipo específico. A parte de verificar tus conocimientos técnicos (por enésima vez, ¡no mientas en tu currículum!), la primera entrevista sirve para identificar para qué rol en particular tus cualidades hacen de ti un buen candidato.

Representación artística de las solicitudes para cada puesto de trabajo público en Microsoft.

Puede que haya dicho antes que las entrevistas telefónicas son generalmente muy repetitivas y muy similares entre ellas; en este caso merece la pena enfatizar eso de nuevo porque todas las preguntas que me hicieron fueron, literalmente, de libro. Si uno busca "preguntas para entrevistas de trabajo", seguramente 10 de los 15 primeros resultados se correspondan con preguntas idénticas o casi idénticas a las que te pueden hacer en la entrevista telefónica con Microsoft. ¿Lo peor de todo? Los que hacen las preguntas no tienen conocimientos técnicos y ni siquiera son empleados de Microsoft. Siguen un guión y poco más. Imagino que, salvo por los candidatos recomendados internamente por empleados, los cientos si no miles de candidatos que echan currículum a palo son filtrados por una de las agencias de trabajo con las que Microsoft tiene contrato.

Así me imagino yo que deben ser las condiciones de trabajo de los que hacen la primera entrevista telefónica.

Después de responder a las poco originales preguntas con respuestas que, a este punto, yo tenía prácticamente memorizadas, la entrevista terminó con el típico ya te llamaremos. Unos pocos días más tarde, me llevé otra agradable sorpresa cuando me ofrecieron ir a una entrevista in situ; paquete completo incluido: todos los gastos pagados para el vuelo, estancia en hotel, y coche de alquiler. Por lo visto, había respondido muy bien a todas las preguntas (aunque no tiene mucho mérito cuando prácticamente recité las respuestas de memoria), pero había destacado especialmente en las preguntas relacionadas a las pruebas de software así que mi segunda entrevista estaría enfocada a ese rol en particular. Cuando uno entrevista con Microsoft, después de la primera entrevista telefónica, prácticamente toda la correspondencia se hace a través de un coordinador de reclutamiento. Es evidente que constantemente entrevistan a candidatos porque todo el proceso fue muy agradable, sin nada de estrés, y me mantuvieron completamente informado a cada paso.

Contaré como fue la entrevista in situ en la próxima entrada.

03 mayo 2014

Buscando trabajo en EEUU: Tesla Motors IV


Como dije en mi última entrada, el ingeniero jefe me introdujo brevemente a la posición y por qué me habían elegido a mí. Una vez hecho eso, dio comienzo a la parte técnica de la entrevista con preguntas sobre el lenguaje de programación C. La pregunta en sí no era muy complicada, más bien consistía en un ejercicio de implementación aunque tenía un pequeño truco. La pregunta la formuló de la siguiente manera:

Escribe una función que reciba un sólo byte como parámetro y devuelva el mismo byte pero con cada uno de sus bits invertidos de posición, es decir, que el primer bit aparezca en última posición, el segundo en penúltima, etc.

Pensé, ¡menos mal! Por fin una pregunta sencilla de entender y podré resolver sin problemas. Nada que ver con las preguntas de los canallas en Amazon, en las que el entrevistador se tiraba 40 minutos formulándola y me daban 20 para responderla. No tenía ni idea de la mala jugada que me iban a pasar los nervios... Normalmente, no tengo ningún problema enfrentándome a todo tipo de problemas bajo presión, pero Tesla era esa empresa que me podría ofrecer el trabajo con el que siempre había soñado (o eso creía entonces). A medida que escribía código en la pizarra, notaba como el nudo de la corbata se hacía más y más pequeño. Me atragantaba, tartamudeaba y decía cosas sin sentido. El ingeniero jefe, que como ya he dicho en repetidas ocasiones era un tipo de aspecto muy amigable, me repetía que me calmase con una sonrisa. ¡Un mal entrevistador me podría haber lanzado por la borda fácilmente!

Casi habría preferido vérmelas con un grupo de piratas que pasar un minuto más atragantándome.

Hasta tal punto decía cosas sin sentido, que el entrevistador me llegó a preguntar cuál era la diferencia entre a & 0x05 y a && 0x05! Después de implementar la solución, me preguntó si era óptima y le dije que por supuesto que no. No tenía ni idea de que estaba buscando una solución óptima, pensé que sólo quería ver mi capacidad para implementar la solución al problema, fallo mío por no preguntar. Cuando me pidió que buscase una solución más óptima al problema, después de balbucear unos minutos, le dije que mandaría todo a tomar por saco y lo pondría todo en un switch bien gordo para que el compilador se las viese con el asunto. Pero, según él, había otra solución más eficiente...

¿Más eficiente? Pensé que me estaría poniendo una trampa como ya hicieron algunos entrevistadores en Zappos, así que le insistí que un switch bien compilado es sólo una instrucción de salto. ¡Nada más eficiente que eso! Pero no, él insistía en que había otra solución mejor... Le dije que la única manera de hacerlo mejor, a costa de un mayor uso de memoria, sería con algún tipo de estructura de datos cargada en RAM, tipo hashtable o similar. Viendo que me acercaba a la idea pero que no llegaría nunca a la solución que él buscaba, me acabé rindiendo. Según él, la solución más eficiente era crear un array cuyos índices se correspondían con el byte buscado y cuyos valores eran el byte invertido. A decir verdad, esa era la solución más elegante de todas, pero todavía dudo que sea más eficiente que mis otras proposiciones dependiendo de las circunstancias.

Mi solución al problema a los ojos del ingeniero jefe, evidentemente ineficiente.

Bueno, no pasa nada. Seguro que la siguiente entrevista me va mejor, pensé. Era el turno del ingeniero senior. Según me dijo, le ficharon en Tesla como empleado treinta y algo. Un tipo alto, de avanzada edad, que hablaba muuuuuy despacio. Me hizo varias preguntas sobre la implementación del proyecto que les había presentado poco más de una hora antes. Puso un par de objeciones y generalmente insistió en el porqué de mis decisiones de diseño más que en la implementación en sí. La entrevista no duró mucho y no fue mal aunque tampoco diría que fue bien. ¡Siguiente!

Era el turno de un ingeniero de hardware. Con desdén, me preguntó si realmente no sabía mucho de circuitos. Entonces me preguntó si sabía lo que era VHDL; había oído hablar de ello pero en realidad no tenía ni idea. Entonces me dijo que había visto a pocos candidatos que no venían de una universidad con mucho renombre, mencionó Standford, MIT, Berkeley, Princeton... Dijo que viniendo de una universidad con menos nombre reduciría mis posibilidades. ¡Maldito elitista! También me preguntó cómo me fue la entrevista con el anterior ingeniero, porque a veces le tenía que tirar de la lengua para saber qué estaba pensando. Me comentó que las oficinas de SpaceX estaban a tiro de piedra (probablemente una de las únicas compañía que elegiría para trabajar antes que Tesla Motors). Para cuando se pasó el tiempo de la entrevista, no me había hecho ninguna pregunta relevante.

En mi penúltima entrevista, me las vería con el más joven de todos los entrevistadores. Al parecer, tenía conocimientos más cercanos a mi área de especialidad, concretamente estadística y modelos matemáticos. Fue una de las entrevistas más entretenidas que recuerdo. Hablamos de distribuciones, márgenes de error, defectos de fábrica y métodos para reconocerlos y mitigarlos, y un sin fin de temas interesantísimos. En cierto punto, me estaba intentando ilustrar cómo los gigantescos brazos robóticos ponen el parabrisas a los coches en la fábrica, con sus brazos completamente estirados y caminando como un robot, y no pude evitar soltar una carcajada. Afortunadamente él también pensó que la situación era cómica.

Así son los robots que ponen los parabrisas en las fábricas.

Mi último entrevistador sería el vicepresidente de ingeniería; en otras palabras, un pez bastante gordo. Para mi gran sorpresa, me hizo una pregunta de programación puramente técnica. Me pidió que escribiese un método en C que tomase 2 strings como argumentos y devolviese 1 string cuyos caracteres fueran el resultado de los caracteres de los 2 argumentos intercalados. Por ejemplo, si la función recibía "abcd" y "1234", tendría que devolver "a1b2c3d4". ¡Pan comido! Estaba cansado pero mucho menos nervioso que al comenzar las entrevistas, pero lo solucioné perfectamente en cuestión de un par de minutos. El hombre parecía bastante impresionado, y me dijo: "Lo has solucionado muy rápido... ¿Has hecho esta pregunta antes?". En ese momento se me hizo un nudo en la garganta. Me paré a pensar, ya había hecho bastantes entrevistas, y también había practicado muchas preguntas por mi cuenta, pero no, nunca había hecho esa pregunta. Casi deseé que la respuesta fuera afirmativa, puesto que no quería que dudase de mi honestidad. Como quedaba tiempo de sobra, decidió hacerme OTRA pregunta. ¡Vaya premio! Aunque, a decir verdad, la segunda pregunta era mucho más interesante:

En un lago hay un hombre en una barca con una piedra de tamaño grande, pero suficientemente pequeña para que el hombre pueda levantarla y lanzarla al agua. ¿Cuando la piedra se hunde, el nivel de agua en el lago sube, baja, o se queda igual?

La verdad, no tenía ni idea. La última vez que tomé una clase de física fue al menos 5 años atrás. Por experiencia, la respuesta correcta a ese tipo de preguntas les importa poco. Están más atentos a tu capacidad de razonamiento. Sabiendo eso, razoné, pensé en alto, y le dije diferentes maneras con las que probaría si mi razonamiento era válido o estaba equivocado. Poco después, me dejó esperando al despistado de recursos humanos (otra vez) y me acompañaron al vestíbulo donde me dijeron que ya se pondrían en contacto conmigo en los próximos 7 días.

24 enero 2014

Buscando trabajo en EEUU: Tesla Motors III



Después de recibir el visto bueno tras mi entrevista telefónica con el ingeniero jefe, la misma secretaria asistente de recursos humanos, que me había llamado casi dos semanas atrás, me envió un par de formularios a rellenar para concretar una fecha para la entrevista in situ. Como tal oportunidad no se tiene todos los días, les dejé muy claro que cuanto antes mejor, porque no hay que ser un genio para saber que por cada vacante tienen miles de personas que les envían su currículum.

En menos de dos días, ya habíamos concretado fecha, hotel y vuelo, pero la historia tenía truco. Como parte de la entrevista, tendría que hacer una presentación sobre cualquiera de mis proyectos a todos los miembros del equipo de trabajo, más el ingeniero jefe, más el jefe del ingeniero jefe. En fin, que me acababa de meter en un jardín sin flores.

¡Con lo que me gustan a mí las presentaciones! Licencia CC Wikimedia Commons

Por suerte, como me había graduado de la universidad hacía menos de dos meses, pude utilizar mi proyecto de fin de carrera, para el que tuve que hacer una presentación y escribir un detallado documento sobre su funcionamiento. Aun así, tener que hacer una presentación durante la entrevista de trabajo daba bastante miedito...

Viajar a Palo Alto, California, fue un auténtico placer. El tiempo allí es una maravilla, especialmente comparado con el Medio Oeste de Estados Unidos a finales del invierno, aunque tampoco tanto mejor comparado con algunos puntos de la costa mediterránea. Evidentemente, aunque tenía vagas esperanzas, el coche de alquiler no era un Tesla Model S; en su lugar, me habían reservado un Mishubishi Lancer así que tampoco voy a quejarme. El hotel, aunque muy bonito y bien cuidado, no era ni mucho menos tan lujoso como el hotel que me reservaron para mi entrevista con Amazon. Pero, ¡y eso qué más daba! Bastante preocupado estaba yo intentando prepararme para la presentación y, encima, tal y como me comunicaron unos pocos días antes de la fecha fijada, también tendría una entrevista con cada uno de los espectadores de la presentación. Intentando estar tan preparado como me fuera posible, tuve la desafortunada idea de rebuscar por internet quiénes eran mis entrevistadores. La idea, aunque buena, la describo como desafortunada porque en lugar de ayudarme a prepararme me dejó bastante abrumado. Mis entrevistadores, todos de carácter técnico, tenían perfiles más dignos de trabajar para una agencia espacial que para un fabricante de coches: licenciaturas y másters de universidades mundialmente conocidas como Standford, Berkeley, MIT... Y un sin fin de experiencia previa en compañías de tanto nombre como Apple o Google. En otras palabras, que me esperaba la del pulpo. ¡Pero no todo era negativo! Como ya había descubierto en otras entrevistas para las que tuve que viajar casi de costa a costa en EEUU (Zappos, Amazon...), el huso horario jugaba a mi favor. Como acabé contando ovejitas antes de las diez de la noche, por la mañana estaba mucho más despierto y alerta para las entrevistas. Para la guinda del pastel, de camino a la entrevista y atascado en un tráfico horrible (aunque iba con tiempo de sobra, porque ya me habían avisado del tráfico), mi amiguísimo Phil Collins me dio algo de ánimo por la radio.

Tan pegadiza es la canción que me permitió darme un respiro y dejar de darle vueltas a la cabeza unos minutos

A medida que me acercaba a la zona de las oficinas de Tesla Motors, veía más y más coches de la marca por la carretera; cierto es que la vista impresionaba. Una vez llegué a las oficinas, me sentí un poco decepcionado de lo pequeño que era el complejo pero ver tantos coches eléctricos me distrajo bastante de tal decepción. Me dí un par de vueltas por el parking tan sólo para echar un ojo a la cantidad de cochazos por allí aparcados. Apenas 15 minutos antes de la hora fijada para mi entrevista, entré y me presenté a la secretaria, y entonces... esperé. Y luego esperé un poco más. Cinco minutos pasados la supuesta hora de la entrevista, y todavía esperando. Le pedí a la secretaria que llamara al tipo de recursos humanos que se suponía vendría a recogerme, y me dijo que en Tesla no se comunican por teléfono, pero que le mandaría un email inmediatamente. Ya habían pasado 15 minutos después de la hora fijada, y aún nada. Me empecé a poner un poco nervioso. 20, 25 minutos.... Entonces la secretaria decidió no seguir el protocolo y por fin se dignó a llamar al de recursos humanos. "Bajará en 5 minutos", me dijo. Otros 10-15 minutos más tarde, es decir, casi tres cuartos de hora después de la hora acordada, un hombre con pinta de bastante despistado se presentó como la persona a quien estaba esperando, y me pidió que subiera a la sala de reuniones tan rápido como pudiera o no me daría tiempo a hacer la presentación.

Genial, como hacer una presentación ante la presión de una entrevista de trabajo no era suficiente, encima tenía que preocuparme del tiempo. Me llevaron a una sala de reuniones en la que casi todos mis entrevistadores estaban esperando con tecnología bastante anticuada, por lo que no pude conectar mi tableta y tuve que pedir prestado un portátil. La presentación en sí no fue tan mal, aunque estaba tan nervioso que me olvidé de darles una copia de los documentos para que pudieran leerlo mientras hablaba de ello pero creo que, por lo demás, lo hice bastante bien.

Coches de la marca Tesla Motors en el parking del complejo

Después de eso, el despistado de recursos humanos me dio un pequeño paseo por el complejo. Me hubiera encantado pasar más tiempo por la fábrica pero lo que más me impresionó sin duda eran las "oficinas" en sí. Como en Zappos, me contaron que todos los empleados incluyendo el CEO, Elon Musk, tenían su sitio en el mismo espacio abierto aunque, que casualidad, el CEO no estaba allí en ese momento. Recuerdo tener la sensación de estar en un sitio parecido a como pintan Wall Street en las películas, con muchísimo ruido, gente corriendo de un lado para otro, los pocos que parecían estar concentrados en algo tenían auriculares enormes para poder trabajar... Por no haber, no había ni cubículos, eran todo filas gigantes de mesas y cada empleado tenía su silla y su nombre en una placa, nada más.

Entonces, me llevaron a otra sala de reuniones y, como en las entrevistas para otras compañías, me dijeron que pasaría allí el resto del día. Mi primera entrevista era con el ingeniero jefe. Un hombre muy simpático sin mucho aspecto de ingeniero, la verdad. Empezó a hablarme sobre la posición y por qué estaba allí. Al parecer, tuvieron a un becario el verano anterior que había trabajado en una herramienta escrita en Python que se encargaba de compilar y publicar contenido a distintos servidores sobre las pruebas hechas a las baterías de los coches en la línea de producción, para su posterior análisis estadístico. Por lo visto, no tenían a muchos empleados con experiencia con tal lenguaje de programación, y mi currículum les pareció una buena combinación para una posición muy distinta a la que me había presentado varios meses atrás. Para quien no lo sepa, la mayoría de las empresas te dicen que, incluso si no te dan una entrevista para la posición que estabas buscando, se guardarían tu currículum por si encontraban algo en el futuro. Yo siempre pensé que eso lo decían simplemente para levantar la moral de aquellos que no consiguieron una entrevista, pero por lo visto al ingeniero jefe le gustó mi currículum de entre la pila de miles que habían acumulado durante los últimos 6 meses. Vamos, que había conseguido la entrevista completamente de carambola.

A partir de ahí, empezó la parte técnica de las entrevistas. Pero de eso hablaré en una próxima entrada que ésta ya es suficientemente larga.