Desarrollador

Ejercicio técnico (PHP)

<?php
/**
* Create a function that cuts a sentence in an specified length, adding 3 dots at the end.
* The sentence should be cut on a final whole word, if the sentence is composed on only 1 word with no spaces, then at the final character.
* If there are dots in the sentence before the specified lenght then the cut should be at the first dot encountered.
*/
$arrayTests = [
    [
        'value' => 'Design patterns were introduced to the software community in Design Patterns, by Erich Gamma, Richard Heleo. Design patterns were introduced to the software community in month.',
        'expected' => 'Design patterns were introduced to the software community in Design Patterns, by Erich Gamma,...'
    ],
    [
        'value' => 'Design patterns were introduced to the software community in Design Patterns by Erich Gamma Richard heleo Design patterns were introduced to the software community in Design Patterns by Erich Gamma Richard Heleo',
        'expected' => 'Design patterns were introduced to the software community in Design Patterns by Erich Gamma...'
    ],
    [
        'value' => 'kjdshfjkdlshfljksdhfjiweryhwjkelnrkmsdnfsdk.jfklñsdfñklsdjhfajñksdhfñkjad.shfñjkawehruiññjshdfjkash.dfkñjhasdfjkñdhsafjkñasdhf',
        'expected' => 'kjdshfjkdlshfljksdhfjiweryhwjkelnrkmsdnfsdk...'
    ],
    [
        'value' => 'kjdshfjkdlshfljksdhfjiweryhwjkelnrkmsdnfsdkjfklñsdfñklsdjhfajñksdhfñkjadshfñjkawehruiññjshdfjkashdfkñjhasdfjkñdhsafjkñasdhf',
        'expected' => 'kjdshfjkdlshfljksdhfjiweryhwjkelnrkmsdnfsdkjfklñsdfñklsdjhfajñksdhfñkjadshfñjkawehruiññjshdfjkash...'
    ]
];
foreach ($arrayTests as $test) {
    $result = limitString($test['value'], 100);
    $output = "Expected: {$test['expected']}" . PHP_EOL . "Actual: {$result}";
    if ($result === $test['expected']) {
        $output = "OK.";
    }
    echo $output . PHP_EOL;
}
function limitString(string $string, int $limit): string
{
    return '';
}

Posibles preguntas técnicas

Estas preguntas son orientativas para las entrevistas a realizar. No son necesariamente obligatorias de hacer, así que siéntete libre de elegir las que sientas que se adaptan mejor al candidato/a.

Buenas prácticas

Que es un patrón de diseño? Que tipos de patrón de diseño existen? Podrías poner algún ejemplo?

Hay dos tipos de patrón de diseño: de software y de arquitectura. Los patrones de diseños de software son aquellos patrones usados dentro del propio código, como un singleton, una factoría o la inyección de dependencias. Los patrones de diseño de arquitectura son aquellos patrones usados en la organización del código dentro de una aplicación, como el patrón MVC, Arquitectura Hexagonal o patrón de evento-bus.

¿Qué es un singleton? ¿Cuándo se usa?
¿Qué buenas prácticas de Clean Code conoces?
¿Qué recaudos con respecto a la seguridad tomarías?
¿Puedes explicarme los principios SOLID?
¿Qué son las cláusulas de guarda?

PHP

¿Qué es un Trait en PHP, cuándo lo usarías y cuándo no? ¿Qué opinión tienes al respecto?
¿Qué diferencia hay entre == y ===?
¿Cuál es la diferencia entre un método public, private y protected?
Cual es la diferencia entre sesión y cookies en PHP?
Que implica la palabra final a la hora de declarar una clase?
Cuales son las diferencias entre abstract class e interface?
Cuales son las diferencias entre una abstract class y un abstract method?
Cuales son las diferencias entre constantes y variables?
¿Cómo funciona la inyección de dependencias?
¿Qué es un namespace?
¿Conoces algún estándar PSR? ¿Cuales?

Symfony

¿Qué son las anotaciones? ¿Para qué se usan?
¿Qué es un serializer?
¿Qué formatos existen para las rutas de Symfony? ¿Tú qué formato prefieres? ¿Por qué? (yaml, xml, php/annotations)

Preguntas fáciles para Junior

¿Cuál es la diferencia entre un for y un foreach?
Cuando creas una función, ¿Qué son los parámetros?

MySQL/MariaDB

Cual es la diferencia entre PRIMARY KEY y UNIQUE KEY?
¿Para qué sirve un índice en MySQL?
Que es la injección SQL? Podrías dar un ejemplo?
¿Para qué funciona EXPLAIN en MySQL?
Cual es la diferencia entre DROP TABLE y TRUNCATE TABLE?

Composer, Git,…  

Que es composer? Cual es la diferencia entre composer install y composer update?
¿Para qué se usa el comando cherry-pick?
¿Cómo cambias de rama en git por consola?
¿Cómo haces push a una rama desde la consola?
¿Sabes que hace el comando git stash?
¿Cómo resuelves conflictos en git?
¿Cómo arreglas un error en un commit que ya fue pusheado?

Conocimiento general

¿Qué métodos RESTful conoces? Explicarlos.
Explica un ataque XSS.
¿Cómo sueles debugear un bug difícil?

Docker

¿Qué es un Dockerfile?
¿Cómo listar todos los contenedores (activos y parados)?
docker ps -a
¿Cómo ejecutar una imagen como un contenedor?
docker run -i -t {image_name} /bin/bash
 
docker run -it {image_name} /bin/bash
¿Con qué comando se borra una imagen de Docker?
docker rmi {image_name}

RegEx

¿Para qué se usa el flag “i”?

Es case insensitive, no toma en cuenta mayúsculas y minúsculas.

¿Para qué se usa el flag “g”?

Es global, encuentra todas las coincidencias, no solo la primera

¿Con qué símbolo escaparías un carácter especial?

Con la barra reversa \

DevOps

General

Qué es una pipeline? Qué debería tener una pipeline a la hora de ser ejecutada?

Una pipeline es un proceso automático que se ejecuta en un repositorio de código. Una pipeline debería tener un proceso de comprobación, asegurando que el código tiene una calidad mínima y no crea nuevos errores dentro de la aplicación, y un proceso de creación de artefacto, para poder desplegar dichos cambios.

Qué diferencias hay entre CI y CD?

CI significa “continuous integration” y CD es “continuous delivery/deployment”. CI implica que la creación de un artefacto de la versión de una aplicación sea creada automáticamente, mientras que CD se basa en la CI y en el artefacto generado para poder desplegar dicha version.

Aun así, “continuous delivery” y “continuous deployment” no es igual. “Continuous delivery” implica que el despliegue este disponible siempre y “continuous deployment” implica que el despliegue de una version esta automatizado.

Cómo se podría hacer un sistema centralizado de logs?

El sistema mas fácil para poder hacer este sistema centralizado es con el stack ELK (Elasticsearch, Logstash y Kibana).

  • Elasticsearch es el servicio que aloja los datos de las métricas
  • Logstash/Fluentbit es el servicio que recibe todas las métricas y le añade metadatos
  • Kibana es el servicio que permite visualizar dichas métricas

Docker

Qué es Docker? Qué es Docker Compose?

Como se puede empezar a crear una imagen desde cero?

Cómo has usado Docker con anterioridad?

IaC/Ansible

Qué implica el concepto Infraestructure as Code (IaC)?

IaC es un concepto en el cual toda la configuración de infraestructura esta depositada en código, el cual se puede repositar.

Qué es Ansible?

Ansible es un sistema de recetas para poder ejecutar, mediante diferentes pasos, procesos automáticos.

Cómo se organiza Ansible?

Ansible se ejecuta a partir de playbooks, los cuales son los que inician el proceso de automatización. A partir de aquí, se pueden importar otros playbooks o se pueden ejecutar roles en especifico, una agrupación de tareas relacionadas entre si.

Por ejemplo, un playbook puede ser crear la infraestructura de una aplicación, pero que implique la ejecución de diferentes roles para instalar diferentes necesidades dentro de la propia infraestructura (Redis, MariaDB,…).

Problemas prácticos (System Design Interview)

Las siguientes preguntas son problemas que tenemos disponibles para preguntar. Todos estos problemas tienen que ir construyéndose en conjunción entre los entrevistadores y los entrevistados.

El stack tecnológico sería Ansible y AWS, en caso de necesitarlo para las preguntas y respuestas.

Disponemos de una aplicación legacy, la cual es un monolito que dispone de una API y de una aplicación front. Poco a poco, queremos crear un nuevo proyecto para modernizar el front. Desde un punto de vista de infraestructura, como plantearías dicho proyecto?

Detalles a tener en cuenta de la nueva aplicación (estos datos no hay que darlos al plantear el problema, si no al recibir las primeras preguntas hechas por el entrevistado):

  • El front nuevo es compilado en HTML
  • El front nuevo esta siendo portado por módulos de aplicación, a través de distintas rutas.

Queremos desplegar una nueva aplicación, un nuevo servicio totalmente nuevo. Dicha aplicación es un pequeño CMS, el cual va a disponer de un contenido que va a ser servido a través de una base de datos MariaDB, y un front y un back servido a través de NodeJS. Desde un punto de vista de infraestructura, como plantearías dicho proyecto?

Detalles a tener en cuenta de la nueva aplicación (estos datos no hay que darlos al plantear el problema, si no al recibir las primeras preguntas hechas por el entrevistado):

  • El back, al ejecutarse, debe ejecutar las migraciones nuevas en la base de datos (el comando es proveído por el desarrollador)
  • El back va a poder subir contenido multimedia, nos gustaría alojarlo dentro de nuestro servicio cloud.
  • El front no puede ser un contenido estático

Detalles a preguntar:

  • Necesitamos una copia de seguridad de los datos