Joven hacker sonriendo

Retos Técnicos

Esta etapa que vamos a comenzar ahora es una etapa que ocurrirá durante el resto del proceso de selección, es decir, es paralela a las demás etapas del proceso (entrevistas, exámenes, pruebas psicotécnicas, etc), y por ende entre más avance desde ahora en ella, mayor es la probabilidad que cuando finalicen las demás etapas usted ya tenga finalizado el proceso y pueda ser evaluado antes que los demás participantes.

Esta etapa también es una especie de salvavidas en el proceso de selección, pues usted puede no estar graduado, no tener experiencia, o que el resultado de su examen de conocimiento actual sea bajo, pero fue capaz de finalizar esta etapa, usted evidenciará que tiene la competencia más valiosa: aprender de cosas nuevas sobre la marcha y aplicarlas para resolver problemas reales. Esto, con la calidad humana, tiene mayor peso que todo lo demás.

1. Objetivos

En esta etapa se busca que usted evidencie mediante ejercicios prácticos sus competencias técnicas en problemas parecidos a los que enfrentará en FLUID, y con las cuales podrá solucionar de forma efectiva problemas de nuestros clientes en el ámbito de la seguridad. También demuestra que usted será un compañero valioso para enriquecer a los miembros actuales del equipo de trabajo.

Los retos técnicos se dividen en dos categorías, retos de hacking y retos de programación. Con los primeros usted demuestra su habilidad y astucia para sobrepasar controles de seguridad, con los segundos usted demuestra que está en capacidad de rápidamente entender un programa, comprender un lenguaje, y por ende le será más fácil auditar código fuente y encontrar vulnerabilidades.

Para los retos de programación usted puede utilizar la plataforma Codeabbey. Para los retos de hacking usted puede utilizar cualquier sitio indexado por Wechall (no aplica la resolución de retos tipo adivinanzas o juegos mentales, solo retos que impliquen destreza técnica).

El envío de soluciones se deberá realizar a través de nuestro repositorio Git, en el cual FLUID realiza sus procesos de selección y formación de personal. La filosofia es fomentar el aprendizaje a partir de la solución activa de problemas y desestimular el aprendizaje pasivo.

El repositorio contiene las soluciones a retos computacionales publicos construidos en el contexto anterior. Al hacer los retos publicos buscamos los siguientes objetivos:

  1. Fomentar la solución de retos no resueltos,

  2. Si el reto esta resuelto, fomentar la solución del reto de otra forma,

  3. Si el reto esta resuelto, hacer evidente la similitud de la nueva solución.

  4. Darle vida a las soluciones financiadas por FLUID,

  5. Permitir a terceros visualizar los entregables de nuestro equipo.

Los efectos colaterales de esta decisión permiten a FLUID:

  1. Utilizar la infraestructura de GitLab para analizar la calidad y velocidad del desarrollo de las personas en formación,

  2. Desde etapas tempranas familiarizar a potenciales talentos con las herramientas (git, asciidoc, python, gherkin, etc) y conceptos (automatización, pruebas de unidad, integración continua, "linting") que utilizarán en su labor diaria en FLUID,

  3. Hacer visible a la comunidad y al equipo los resultados propios (presión de pares).

2. Requerimientos previos

  1. Registrarse en GitLab usando su correo electronico personal y creando el ID de GitLab que más le guste.

  2. Unirte a nuestro canal de Slack, en donde encontrará personal de FLUID y otros candidatos actualmente en esta etapa, quienes podrán guiarlo con soluciones a dudas puntuales o inconvenientes que le surjan.

  3. Solicitarnos el permiso de acceso al repositorio vía Slack presentándote a los demás con el siguiente mensaje:

He leído y entendido toda la documentación de los retos técnicos, acepto las condiciones y por ende solicito acceso al repo Git con mi usuario [nombreDeUsuario] en gitlab

3. Instrucciones

  1. Identifique 40 retos que tienen solución en Internet pero no en nuestro repositorio (también denominados OTHERS),

  2. Resuelva 10 retos de programación que no tienen solución, ni en nuestro repositorio ni identificada (punto 1),

  3. Resuelva 10 retos de hacking que no tienen solución, ni en nuestro repositorio ni identificada (punto 1).

4. Repositorio

El repositorio donde usted debe enviar sus soluciones es el siguiente: https://gitlab.com/autonomicmind/training/. Por favor lea atentamente las siguientes pautas para trabajar en este repositorio Git:

  • Contenido: Utilizar espacios en vez de tabuladores. Parametrice su editor de texto favorito para que le facilite esta tarea.

  • Programas: Para las soluciones a retos que correspondan a código fuente debe utilizarse la extensión y guias de estilo propias del lenguaje. Adicionalmente utilizar los linters correspondientes en la configuración estandar más estricta posible.

  • Integración continua (CI / CD): Es importante mencionar que el formato es reforzado mediante scripts que se encuentran en el repositorio, y que se encuentran disponibles para que usted los utilice y mejore. Del mismo modo estos scripts son utilizados en el proceso de integración continua para verificar su estricto cumplimiento antes de recibir satisfactoriamente las soluciones enviadas por usted. Puede ver todas las bitacoras de compilación historicas y de otros participantes aquí.

  • Estructura del repositorio: Los soluciones a los retos se almacenan en la carpeta llamada challenges. En esta carpeta se debe manejar la siguiente estructura:

  • El nombramiento de todos los archivos y directorios, a excepción de sus archivos, debe realizarse en minuscula, sin caracteres especiales y en caso excepcional de requerir espacios usar - (guion) como sustituto.

  • Archivos Especiales: En algunas carpetas de la estructura se encuentran algunos archivos especiales de control:

    • LINK.txt: Contiene la URL al enunciado del reto en la plataforma correspondiente (Ejemplo). Este archivo solo debe contener una linea y visitar el enlace debe generar la respuesta 200 (sin redirección).

    • DATA.txt: Contiene los casos de prueba con los cuales se han verificado los retos. En muchos casos provienen del sitio original, pero durante el desarrollo se crear otros que pueden ser necesarios. Este archivo solo debe contener casos de prueba que sea inmediatamente procesables por cualquier archivo de solución.

    • OTHERS.txt: Contiene los enlaces (uno por linea) a las soluciones a dicho reto que se encuentran en Internet y que no deben leerse ni utilizarse como referencia para resolver el reto. Este archivo permite que un script automatico realice el analisis de similitud con los retos enviados por los candidatos.

    • LANG.txt: Este archivo solo existe para algunos sitios de retos, especialmente para sitios de retos de programación. Cuando existe indica los lenguajes de programación que pueden ser usados para resolver retos de las subcarpetas donde se encuentra el archivo. Si contiene multiples lenguajes significa que debe utilizarse de forma secuencial (round robin) cada lenguaje para construir más soluciones de dicha subcarpeta.

5. Versionamiento

Todos los archivos relacionados con la resolución de retos, se deben almacenar en este repositorio GIT en la estructura de retos indicada.  
 
Se espera que por cada reto usted realice un commit que agrupe los cambios correspondientes a la solución y que gradualmente usted realice merge requests a la rama master del repositorio en cuestión para solicitar la inclusión de sus soluciones. Los merge request pendientes de revisión y aprobación, asi como todos los realizados en el pasado pueden verse en el enlace indicado.  
 
Para cada merge request que usted envíe, se realiza un proceso de integración continua que verifica de forma automatica el cumplimiento de algunas de las reglas indicadas en este documento. Solo cuando el proceso de integración pasa sin errores (en verde), su merge request es integrado al repositorio. Los resultados de la integración pueden verse siempre en GitLab-CI.

6. Local Builds:

El GitLab Runner es una herramienta que realiza la integración continua del repositorio cada vez que se introduce un cambio. La herramienta se ejecuta automaticamente en la plataforma de GitLab, pero es posible correr integraciones locales con el fin de identificar errores antes de hacer commits o merge requests al repositorio. Para esto, se debe instalar el GitLab Runner en el equipo, de la siguiente manera:

  • En Sistemas Operativos Linux:

    1. Instalar curl,

      sudo apt-get update
      sudo apt-get install curl
    2. Instalar Docker, escogiendo la versión correspondiente a la distribución de Linux,

    3. Añadir el repositorio oficial de GitLab,

      curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
    4. Instalar el Runner,

      sudo apt-get install gitlab-runner
    5. Ir al directorio donde se encuentra clonado el repositorio de training,

      cd ~/example/training
    6. Revisar que se está trabajando sobre la rama correspondiente al talento,

      git branch
    7. Si no es así, cambiar a la rama del talento,

      git checkout rama_talento
    8. Luego, ejecutar la integración con los siguientes comandos,

      gitlab-ci-multi-runner exec docker precommit_job
      gitlab-ci-multi-runner exec docker scons_job
    9. Si la integración fue exitosa, añadir los cambios, hacer commit y subir los archivos a la rama del talento (si no fue exitosa, corregir el error y ejecutar los dos comandos anteriores),

      git add .
      git commit -m "Ejemplo"
      git push origin rama_talento
    10. Por último, hacer merge request a la rama master. Un ejemplo de un merge request.

  • En Sistemas Operativos Windows: La forma de ejecutar la integración desde Docker no se encuentra todavía disponible para Windows y, al basarse la integración en Linux, esto hace que el proceso en Windows sea más complicado. Se sugiere instalar un software de virtualización (VMware, Virtualbox) y crear una máquina virtual basada en una distribución de Linux (e.g. Ubuntu, o la de su preferencia) y aplicar el proceso descrito anteriormente para Sistemas Operativos Linux.

7. Recomendaciones

La clave para cumplir los 3 objetivos enunciados es primero crear 40 archivos OTHERS.txt en carpetas de retos que no lo tengan. Luego buscar retos que no tengan solución ni en OTHERS.txt ni en el repositorio, y trabajar en resolver el reto en la respectiva plataforma. Para retos de lenguajes de programación, una solución es válida si no ha sido resuelta en el lenguaje que usted pretende solucionarlo. Una sugerencia es seleccionar un lenguaje no muy usado y resolver los retos en dicho lenguaje.

Apreciamos que envíe los 40+10+10 archivos a medida que avances en los retos, que para cada conjunto de archivos de un reto se tenga un commit separado, y finalmente que esto se haga en el menor tiempo posible. Este proceso de cualquier forma le ayudará a que su perfil en Internet como hacker y como programador mejore, por ende no solo será un mecanismo de aprendizaje, sino que su reputación mejorará también.

Una vez tenga acceso al repositorio, antes de enviar un Merge Request, por favor lea los siguientes requisitos.

8. Informes de avance

Apreciaremos mucho que nos informe de sus avances mínimo 1 vez cada semana, utilizando el siguiente formulario >>. Al diligenciar el anterior formulario ,por favor tenga en cuenta lo siguiente: . En el campo “Relación”, escoger la opción “Selección”, dado que estas reportando tu avance en medio del proceso de selección . Tenga en cuenta su posición en el ranking y su puntaje antes de comenzar el entrenamiento, pues necesitará estos datos al momento de registrar los campos "Ranking Mundial Inicial", "Ranking Colombia Inicial" y "Puntaje/Páginas Inicial" . Los puntajes o posiciones en el ranking finales puede obtenerlos de la siguiente forma:

  • En Codeabbey (Para retos de programación):

Ranking mundial
Ranking Colombia
  • En Wechall (Para retos de hacking):

Ranking en Wechall

9. Fin de la etapa

Esta etapa finaliza cuando usted haya completado los objetivos anteriormente mencionados y nos envíe vía e-mail los 40+10+10 archivos referentes a las soluciones realizadas por usted.

Por favor tenga en cuenta que durante esta etapa la continuidad es fundamental ya que de no haber movimiento en 14 días calendario, se dará por terminado el proceso de selección. Usted puede volver a presentarse, sin embargo deberá comenzar desde la primera etapa nuevamente.

  • Entiendase movimiento como push al repositorio git.

10. Preguntas

11. Propiedad Intelectual

  • Los derechos patrimoniales sobre el contenido de este repositorio se encuentran definidos en el archivo COPYRIGHT.

  • La licencia y privilegios que tienen los usuarios de este repositorio se encuentran definidos en el archivo LICENSE.

  • Realizar un merge request al mismo implica la cesión de derechos patrimoniales. Por ende la información aqui contenida puede ser usada por el propietario (FLUID) para cualquier fin comercial, siempre preservando los derechos morales de sus autores.

Plagio

La idea de tener las soluciones disponibles para su visualización propone un reto para el plagio, ¿cómo mostrarle al mundo las soluciones y evitar el plagio? El plagio no es un problema técnico, es un problema moral de atribuirse lo que no fue realizado por uno mismo como propio.  
 
Para evitar el plagio precisamente buscamos la visibilidad y la declaración explicita de autoría de cada algoritmo en un lugar centralizado, de esta forma queda evidencia clara de la atribución y puede ser sometido a escrutinio publico el acto de plagio.  
 
Es decir, el modelo actual propuesto, evita el plagio a partir de la transparencia total. No hay que hacer nada mas, cada merge request es una declaración de autoria y la ubicación de la solución en el lugar donde facilite el calculo de similaridad le hace a un humano encontrar el plagio.  
 
De todas formas FLUID trabaja activamente en aplicar tecnicas de detección de similitud algoritmica sobre todo el código que sea enviado. En particular usando:

De no desear continuar en el proceso de selección, por favor indicarnos vía e-mail que deseas retirarte del mismo y no vas a realizar la etapa de retos informáticos.