Si una empresa patrocina una competencia en HackerRank, ¿significa que está dispuesta a contratar a los mejores programadores de esa competencia?

24 de octubre de 2016

Escribí la respuesta debajo de la línea horizontal el 27 de julio de 2016. Hoy es el 24 de octubre de 2016. En este momento, he ganado una nueva perspectiva, que pensé que debía agregar a mi respuesta.

Desde la última vez, me topé con Codility, otro sitio web que presenta desafíos de codificación, y Codility ha llegado como un soplo de aire fresco, cuando lo comparo con HackerRank.

Es la forma en que debe hacerse. Los problemas y los resultados de la prueba se describen de manera elaborada y clara. Y se le da tiempo suficiente para resolverlos.

Dicho esto, incluso después de resolver más de 40 problemas y desafíos en este momento en Codility, así como en el Proyecto Euler, mantengo dos opiniones que concluí anteriormente:

  1. Si bien hacer estos desafíos ciertamente ha mejorado mis habilidades para resolver problemas y pensar en ellos de una manera nueva, repetidamente me confieso la honesta admisión de que no han mejorado mi capacidad para construir software en general.

    Los problemas presentados son puramente de naturaleza funcional y no representan desafíos de la vida real del software de escritura. El mundo real no es puramente funcional, y nuestro código, para una medida muy pequeña, está restringido a operaciones puramente computacionales.

    El software real tiene un código que abre y cierra los identificadores y archivos de la base de datos, dibuja interfaces de usuario, lee bytes de un socket, realiza operaciones de E / S, requiere un conocimiento profundo y la lectura de manuales de los marcos que utilizamos para saber cómo gestione y deseche mejor los costosos recursos, realice y deseche las asignaciones de memoria, los matices más finos de los marcos y las bibliotecas en uso; el código del mundo real realiza llamadas a puntos finales de servicios externos, trata con excepciones, hace referencia a bibliotecas externas y trata la complejidad asociada (infierno de DLL) y mucho más.

    En el mundo real, para construir algo útil, confiamos en el conocimiento íntimo del comportamiento peculiar de las bibliotecas y los marcos que utilizamos, en diversas circunstancias. Una gran mayoría de nuestro código tiene efectos secundarios.

  2. Aunque ciertamente disfruto resolviendo estos problemas, son una medida terrible de la capacidad de empleo de un programador en la construcción de software del mundo real. No solo eso, son una medida severa en el sentido de que un análisis adecuado de tales desafíos se puede dividir en requerir conocimiento en tres frentes:
    1. Habilidades de comprensión del lenguaje, es decir, comprender claramente lo que se pregunta. Esta es una habilidad útil, pero el grado en que un candidato se desempeña en este aspecto es una función de su propia facultad de comprensión y, lo que es más importante, de las habilidades de escritura del presentador del problema;
    2. Identificación del algoritmo que se aplicará al problema. Problemas como estos se disfrazan de alegorías o metáforas. Uno debe escanear a través de su propio catálogo de algoritmos y elegir uno para aplicar para resolver el problema en cuestión.
    3. Conocimiento del dominio. La mayoría de los problemas requieren, además del conocimiento del algoritmo, cierto conocimiento del dominio en el que están disfrazados. Por ejemplo, para un problema que dice: “Dada una serie de enteros positivos y negativos, descubra todos los tripletes que pueden formar los lados de un triángulo”. El problema no solo requiere conocimiento de estructuras de datos y algoritmos de recorrido, sino también conocimiento de propiedades matemáticas de un triangulo. Otro problema sería: “Dada una matriz de una estructura, cada una de las cuales contiene un punto que indica el centro de un círculo, y también dado el radio del círculo, encuentra todos los pares de círculos que se cruzan entre sí”.

Por lo tanto, si bien estos desafíos son útiles como un ejercicio mental para mejorar uno mismo, incluso después de hacer muchos de ellos varias veces, sentí ganas de volver a construir software real.

Si tuviera que hacer una analogía, seleccionar un candidato basado en la rapidez y la forma correcta en que puede resolver uno de estos problemas es similar a casarse con una persona porque van al gimnasio y hacen ejercicio regularmente. Si bien es bueno tener un cónyuge que vaya al gimnasio, lo que significa que será visualmente atractivo y saludable (tal vez), deja todo un juicio sobre todas las demás jerarquías, quizás más importantes, en las que uno debe colocar al candidato para que sea considerado un cónyuge meritorio.

Debo concluir con la aclaración de que no soy un empleado de Codility ni de ninguna manera asociado con ellos, aparte de haber resuelto algunas docenas de problemas de su sitio web para mi propia práctica. De ninguna manera me han pagado para escribir esto.


27 de julio de 2016

Aconsejaría a las empresas que eviten el uso de dichos sitios web como base para la contratación por tres razones:

  1. He observado algunas anomalías con HackerRank, la última de las cuales fue, en respuesta a un desafío, cuando envié mi código completamente probado que se ejecutó perfectamente en Visual Studio y también se ejecutó correctamente cuando hice clic en el botón Ejecutar en el sitio web de HackerRank. informó que mi código falló en unos 17 casos extraños de pruebas unitarias.

    El problema era que ni la pregunta / desafío mencionaba ninguna expectativa sobre los casos de prueba, ni el código fuente de los casos de prueba estaba disponible.

    Entonces, realmente no sabía cuáles eran los comentarios que el software estaba tratando de darme. En cuanto a la usabilidad, este es un gran error.

    Les hice saber, pero aún no he recibido ninguna respuesta de ellos.

    Tuve este problema en más de una ocasión, es decir, con más de un desafío.

    Como resultado, no pude enviar mi código a ese desafío, lo que, para un posible empleador, significaría que no soy un buen programador, lo que sería falso.

    Hace unos meses, asumí el trivial desafío FizzBuzz, pero no pude enviar mi código con éxito a través del sitio web debido a que informaba un error extraño. Una vez más, mi código se ejecutó perfectamente en Visual Studio y en el sitio web cuando hice clic en el botón Ejecutar con entrada de prueba. El programa produjo la salida correcta.

    Hasta hace unas semanas, el sitio web de HackerRank no le permitía agregar o editar las declaraciones de espacio de nombres en la parte superior (la declaración de using ) si estaba escribiendo código C #.

    Les hice saber eso y parecen haberlo arreglado.

    Otra razón por la que su sitio web tiene una aplicación limitada es que sus desafíos vienen con un código de andamiaje repetitivo, que no puede eliminar. A veces, se interpone en el camino.

    Además, dada la naturaleza simple de los desafíos en el sitio web, sería difícil deducir las habilidades de programación de un candidato en relación con un problema de negocios del mundo real, en cuya implementación, el candidato puede necesitar hacer referencia a bibliotecas externas. Eso es algo que no puede hacer con HackerRank actualmente.

    Aparte de eso, hay muchos otros problemas con el sitio web. Sería cauteloso con dichos sitios web en cuanto a tomar una decisión importante, como dónde poner mi dinero. Si una empresa proclama con orgullo que utiliza estas pruebas para obtener el mejor talento, debe saber con certeza dos cosas sobre ellas:

    1. Automatizan porque quieren deshacerse de la difícil responsabilidad de contratar a la persona adecuada. Es difícil porque para contratar a un buen programador, uno debe ser un excelente programador y no tienen ninguno. Te dirán lo contrario. Te dirán que tienen súper estrellas, pero les falta poco tiempo. ¡Bazofia!
    2. Te escapas de esa compañía.
  2. Hay dos conjuntos de habilidades distintas:
    1. Practicar desafíos de codificación para aclarar entrevistas de trabajo; y
    2. Ser capaz de escribir una aplicación completa y completa por sí mismo.

      Estas son habilidades muy separadas y esta última es más útil para un negocio. El primero tiene poco valor, si es que tiene alguno.

  3. Cuanto más automatice su proceso de reclutamiento, más probabilidades tendrá de contratar monos que hayan aprendido a superar los filtros de software automatizados. Todo lo que uno necesita para obtener un puntaje alto en estos desafíos es asumir muchos de ellos y seguir practicando.

    De hecho, conozco al menos dos compañías que tienen la primera ronda de sus entrevistas automatizadas para algunas preguntas de tipo objetivo en HackerRank.

    Sería un error fundamental de juicio, y uno grande en eso, juzgar las habilidades de programación basadas en “el tiempo que una persona toma para responder todas esas preguntas correctamente”. Irónicamente, las compañías idiotas con gerentes idiotas y reclutadores idiotas hacen exactamente eso.

    Forman sus pruebas de tal manera que tiene que completar muchas preguntas en un lapso de tiempo ridículamente corto, donde las preguntas son del ámbito de algo como, por ejemplo, el enhebrado o los patrones de diseño. Hacerlos honestamente requiere mucho tiempo para pensar, lo cual no está permitido porque el marco de tiempo asignado es ridículamente corto. Esta es una señal roja contra la empresa que delegó su contratación a un proceso tan automatizado. No los mejores programadores pueden hacer la prueba sinceramente en el tiempo asignado.

    La única manera de superar la prueba es hacer trampa, es decir, simplemente hacer clic en este botón o aquel y ver su suerte.

    Yo solo hice eso.

    La primera vez que sinceramente respondí las 20 preguntas dadas en el tiempo asignado de 30 o 45 minutos, olvido el marco de tiempo exacto asignado. Cada pregunta tenía notas en el preludio, que requerían al menos 90 segundos o más de lectura, y si quisieras hacerlas en serio, querrías pasar de 3 a 5 minutos pensando en el asunto o resolviendo las ecuaciones matemáticas planteadas. Obviamente, se me acabó el tiempo antes de poder completarlos. Eso me haría ver como un mal programador, ¿verdad? Solo yo sé que el esquema es idiota y puedo vencer a sus mejores programadores.

    La segunda vez, conociendo este esquema idiota de lo que era, leí las preguntas a la velocidad de la luz, respondí rápidamente algunas de ellas tan rápido como pude, y si no terminaba de responder cada pregunta en, por ejemplo, 60 segundos, Acabo de seleccionar una de las opciones que parecía más probable, que, dado que no podía leer muchas de las preguntas en 60 segundos, todas las respuestas me parecían opciones igualmente probables. Y para algunas preguntas hacia el final, una buena cantidad de ellas, no tuve absolutamente tiempo para leerlas, así que solo hice clic de todas formas. ¿Adivina qué?

    Recibí un correo electrónico felicitándome por mis habilidades estelares.

    Es un montón de tontos. Las buenas compañías se mantienen alejadas de esta mierda.

    Editar:
    Hasta el momento, dos comentaristas no están de acuerdo conmigo y sostienen que estas pruebas unitarias son realmente importantes en las pruebas de casos extremos.

    Para demostrar a todos, especialmente. otros programadores que todavía están programando activamente, ya que estoy seguro de que notarán la discrepancia en este esquema, presento ambos: el problema que no establece otras expectativas que mi código no aborda y mi código.

    Aquí está el problema: resolver biblioteca bien

    Y aquí está mi código: Inicio | .NET Fiddle

    Las primeras líneas en la función Principal que dividen los argumentos y los convierten en enteros son repetitivos que vienen con la asignación.

    Estaría feliz de ser corregido si me falta algo. Sin embargo, si no, pediría a las personas que no están de acuerdo conmigo que señalen los casos extremos que mi código no aborda y que la pregunta deja explícitamente clara de alguna manera.

    Además, también pediría a los comentaristas disidentes que compartan parte de su código reciente.

    Puede echar un vistazo a algunos de mis códigos en los siguientes lugares:

    Id. De desbordamiento de mi pila: User Water Cooler v2
    (También puede juzgar la capacidad de un programador simplemente encuestando la calidad de las preguntas que hace en Stack Overflow. Eso, creo, proporciona una mejor estimación. Usando HackerRank o servicios similares, uno no tiene forma de averiguar cómo se desempeña un programador en un situación del mundo real. No se puede, por ejemplo, determinar qué tan bien un candidato puede tomar un problema comercial presentado en inglés, y eso también con brevedad, y llegar a una representación de modelo de objeto del espacio del problema).

    Repositorio de Github (incompleto): Sathyaish / An-Introduction-to-Rx

    Bitbucket (la mayoría de mis repositorios son privados, este es público porque no tiene código de producción pero debería darle una estimación justa de mis habilidades como desarrollador): Sathyaish / Pluralsight / source / DeferredExecution

    y esto, una utilidad con un bit de código más no trivial, es decir, una aplicación de trabajo completa: WintellectNOW.Report /

    Solicito a los comentaristas disidentes que compartan su código reciente.

    Nota final:
    Mírame resumir mis ideas sobre cómo los medios empleados por las compañías de software para contratar al mejor talento de programación están mal orientados, por lo que la demanda de buenos programadores nunca se sacia.

    Meditaciones sobre la filosofía del desarrollo de software – 1

Meditaciones sobre la filosofía del desarrollo de software – 2

Meditaciones sobre la filosofía del desarrollo de software – 3

Meditaciones sobre la filosofía del desarrollo de software – 4

Meditaciones sobre la filosofía del desarrollo de software – 5

Dado que HackerRank es una plataforma de reclutamiento en su mayoría, creo que es muy poco probable que las empresas patrocinen concursos sin una intención de contratación seria 🙂

En cuanto a la visa, esto varía de una compañía a otra. Algunas compañías lo patrocinarán, otras ni siquiera hablarán con usted una vez que se den cuenta de que está fuera de EE. UU. Y que necesita una visa (me pasó a mí).