Introducción

Recientemente estuve participando en entrevistas para distintas compañías, les comparto un parte del conocimiento que he adquirido en esta práctica, consejos que pueden ser para los distintos niveles, desde una persona Jr hasta un puesto Sr.

Las entrevistas y su objetivo

  • Desde mi punto de vista, la entrevista es el espacio para que te evalúen y tu evalúes a la compañía, esto es en 2 vías todo el tiempo y es recomendable tenerlo en mente.
  • Ellos buscarán al mejor candidato, van a generar un perfil, tendrán ciertas expectativas de lo que necesita el proyecto, el equipo, harán la mayor cantidad de preguntas y se espera que tengan un proceso definido que pueda ayudar a completar este paso.
  • Mi recomendación es que hagas una investigación de la compañía y te respondas preguntas como:

    • ¿Entiendo lo que esta descrito en el perfil de la vacante? ¿Es lo que estoy buscando? ¿Hago una sinergia/un match entre quién soy el día de hoy y como me quiero desarrollar a futuro?
    • ¿Qué se de la empresa? De su cultura, de sus valores....
    • ¿Cómo va a ser este proyecto? ¿Qué tecnologías usan? ¿Qué tan grande o tan pequeño es el equipo? Voy a hablar mas de ello en el siguiente punto
    • ¿Cómo sería trabajar con ellos? ¿Cuáles son sus expectativas, su forma de trabajo?

Estas y muchas otras preguntas pueden realizarse durante distintos momentos de la entrevista, la idea es que te ayude a tomar la mejor decisión posible.

Pensar en tu objetivo

  • Qué busco? No morir de hambre teniendo un trabajo....
  • Pero... La idea de definir si quieres ser un FrontEnd developer, backend, tester, en un futuro trabajar como PM, dueño de producto (product owner), especialista en base de datos, seguridad, redes, en algún momento ser arquitecto... "Si uno no tiene un destino, cualquier puerto es bueno", que también es válido no tener todas las respuestas y aprender que es lo que te gusta y que no, pero haz esa decisión tuya, no que alguien más lo tome por ti.
  • Regresando al punto, por que sería importante saber si es un equipo pequeño o uno grande?

    • También esto depende de tus objetivos, un equipo muy grande puede hablar de la estabilidad de la empresa, pero también de una posible burocracia y cierto nivel de complejidad para generar cambios.
    • Un equipo pequeño, te permite estar involucrado en diferentes niveles de la toma de decisiones, trabajar con arquitectos, CEOs, dueños de los productos, la comunicación "debería" ser mas sencilla, pero también puede existir una mayor carga de trabajo o cierta fragilidad si es una startup.
  • En esto tal vez puede ayudar respondiendo, ¿Qué me hace feliz? O.... ¿De qué forma no estaría satisfecho?... También va de la mano con las responsabilidades

    • No será lo mismo para alguien soltero, recién egresado, que para alguien con familia..
    • La idea de que entre menos responsabilidades tengas, te ayuda a poder jugar, apostar, equivocarte, con una menor cantidad de riesgo, apostar por la compañía pequeña que te ofrece crecer junto a ellos.
    • Tal vez aventurarte en tu propia hazaña, crear un par de productos propios desde 0, páginas, apps, participar como freelancer, hackathons, etc
    • Este tipo de experiencia, puede tener mucho valor para ciertas compañías, te dará una mejor visión de las diferentes etapas del desarrollo y te puede ayudar a elegir hacia donde dirigirte.

Ahora a la práctica

Habilidades necesarias y de mucho valor para las compañías

  • Inglés y habilidades de comunicación.
  • Bases sólidas de ciencias computacionales.
  • Resolución de problemas

1) Inglés y Comunicación

  • Te van a preguntar tu nivel, mi recomendación es manejarlo por niveles; Básico, intermedio, avanzado (básico-intermedio, intermedio-avanzado).
  • Te van hacer preguntas en inglés y evaluar como respondes, muletillas (mmmm, ahhhhh), el tus expresiones, como lo explicas, si buscas aclarar dudas o no, etc.

Si necesitas fortalecer este punto, hay un par de cosas que han funcionado para mí (te invito a buscar mas alternativas)

  • Ver series en idioma inglés con los subtítulos en inglés → Relación oído, vista, entendimiento.
  • Podcast en inglés → Entendimiento de diferentes tópicos.
  • Lee diversos artículos y/o libros en inglés → Puede ser de cualquier tema, algunas recomendaciones pueden ser de la revista wired, temas de actualidad, etc.
  • Videos en youtube, activa la generación automática de subtítulos y sigue la conversación.

Si necesitas mejorar muy muy rápido, busca comunidades, amigos con los que puedas charlar, ahorra un poco de dinero, busca algún tipo de maestro particular, los puedes encontrar desde $150 x clase.

2) Ciencias computacionales

Todos los niveles

  • Conocimiento del lenguaje, sus características.

Java por ejemplo

  • ¿Cómo esta conformada la JVM?

    • Diferencia entre JDK, JRE y JVM
    • ¿Qué es stack, heap, string pool, perGem?
    • ¿En qué parte de la memoria se guardan los estáticos?
    • ¿Qué es el Garbage-Collector?
  • Interfaces, clases abstractas, clases finales.
  • Modificadores de acceso, que es la firma de un método.
  • Collections, diferencia entre List, Sets y Maps, cuando utilizar cada uno y ejemplos
  • Tal vez te pregunten de hilos, aunque no todos los proyectos los utilicen, les encanta pregunta como puedes sincronizar un método, un bloqué de código y los objetos que son seguros en hilos (String Buffer > String Builder, Vectores > Arrays)

JavaScript

  • Actions, DOM, Scopes, Callbacks
  • Patrones o estructuras de programación que sigas....

Bases de datos

  • Saber de la existencia de base de datos relacionales (RMDB) y no-relacionales (No-SQL).
  • Comandos básicos, selects, groups by, having...
  • Joins, left, right, inner, outer
  • Alguna vez te has preguntado ¿Cómo funcionan los indexes? ¿Qué son los procedimientos almacenados y triggers?

Modelos

  • Waterfall vs Agile (Kanban, scrum)
  • ¿Cómo funciona la web? MVC, SOAP, REST, RPCs
  • Monolitos, monolitos modulares, microservicios
  • CICD, pipelines, deploymets

Otro tipo de preguntas

  • ¿Cuál era la materia que mas te gustaba? ¿Qué fe lo que mas te gusto del lugar donde trabajabas?
  • ¿Cuéntame de un proyecto del cual te sientes orgulloso y por qué?
  • ¿Cómo manejas el estrés? Qué haces cuando las cosas no salen como quieres?
  • ¿Me puedes guiar en cómo resuelves un problema (bug/issue)?

Temas básicos-intermedios, intermedios

  • Frameworks, spring, hibernate
  • Patrones de diseño, el singleton, es aburrido, pero estudienlo y hagan la prueba de modo concurrente (seguro aplicandolo con hilos)
  • Servidores, load balancers, web servers.
  • Cache.
  • Resolución de problemas en producción.

Profundizaré en estos temas en otras publicaciones.

Temas avanzados

  • High performance applications.

    • ¿Cómo escalarías una aplicación?
    • CDN, sharding, multi deployment.
  • Sistemas distribuidos

    • 2 phase commit, 3 phase commit.
    • SAGAS, orquestador, coreografo.
    • Lecturas sucias, fantasmas.
  • ¿Cómo determinas la siguiente acción cuando hay cierto tipo de problemas de producción?
  • Guía del equipo, resolución de problemas, conflictos, etc...

Eye_book
Eye_book

3) Resolución de problemas

Las compañías tienen que comprobar que tienes la lógica para resolver problemas, algunos ejemplos para poder evaluar esto es:

  • Pedirte que resuelvas un problema en ese momento compartiendo tu pantalla, utilizando una página donde puedan ver lo que escribas o en alguna plataforma para la resolución de problemas de código.
  • También pueden dejarte un problema y darte un tiempo determinado para poder resolverlo.

Problemas de código

  • Fibonnacci, n factorial, resuelvelos de forma iterativa y recursiva, si lo tienes dominado, agrega un cache (cómo puedo mejorar su desempeño)
  • Algoritmos de busqueda, con que puedas implementar una busqueda binaria será suficiente, pero ten en mente otro tipos de busqueda aunque tengan un peor desempeño, bubble sort, insertion sort, shell sort, etc.

Factorial

/**
 * 5! = 4! * 3! * 2! * 1! 0!
 */
static int factorialRecursive(int num) {
    if(num == 0 || num == 1)
        return 1;

    return num * factorialRecursive(num - 1);
}

static int factorialLoop(int num) {
    int result = 1;
    for(int idx = 2; idx <= num; idx++) { //4
        int multiply = idx * result;
        result = multiply;
    }
    return result;
}

Fibonacci

public static void main(String[] args) {
    int limit = 10;
    for(int idx = 0; idx < limit; idx++){
        System.out.print(fibonacciLoop(idx) + ", ");
    }
    System.out.println();
    int[] cache = new int[limit];
    for(int idx = 0; idx < limit; idx++){
        System.out.print(fibonacciRecursive(idx, cache) + ", ");
    }
}
/**
 * 0,1,1,2,3,5
 */
static int fibonacciLoop(int number) {
    if(number == 0 || number == 1)
        return number;
    int previousNumber = 0, currentNumber = 1;
    for(int idx = 1; idx < number; idx++) {
        int sum = currentNumber + previousNumber; //5
        previousNumber = currentNumber;
        currentNumber = sum;
    }
    return currentNumber;
}

static int fibonacciRecursive(int num, int[] cache) { //4, 1, 1
    if(cache[num] != 0){
        return cache[num];
    }
    if(num == 0 || num == 1) {
        return num;
    } else {
        int result = fibonacciRecursive(num - 1, cache) + fibonacciRecursive(num - 2, cache);
        cache[num] = result;
        return result;
    }
}

Binary search

/**
 * [1,2,3,4,5,6,7,8,9,10]
 */
static boolean binarySearch(int[] arr, int num){
    int low = 0;
    int high = arr.length - 1;
    while(low <= high){
        int middle = (low + high) / 2;
        if(num == arr[middle])
            return true;

        if(arr[middle] < num) {
            low = middle + 1;
        } else{
            high = middle - 1;
        }
    }
    return false;
}

static boolean binarySearchRecursive(int[] arr, int num, int low, int high){
    if(low > high)
        return false;
    int middle = (low + high) / 2;
    if(arr[middle] == num)
        return true;

    if(arr[middle] < num){
        low = middle + 1;
    } else {
        high = middle - 1;
    }
    return binarySearchRecursive(arr, num, low, high);
}

static boolean runBinarySearchIteratively(
        int[] sortedArray, int key) {
    int low = 0;
    int high = sortedArray.length - 1;

    while (low <= high) {
        int mid = (low + high) / 2;
        if (sortedArray[mid] < key) {
            low = mid + 1;
        } else if (sortedArray[mid] > key) {
            high = mid - 1;
        } else if (sortedArray[mid] == key) {
            return true;
        }
    }
    return false;
}

Ejemplos específicos

  • Pasar un arreglo strings y contar el número de palabras. A esto le pueden agregar "complejidad" solicitando no hacer distinción entre minúsculas y mayúsculas, así como obtener la palabra que más veces se repita.

    • Aquí la solución es con un map, si quiere ver como resolver este problema, dejen sus comentarios.
  • Manipulación de strings, saber si una palabra es palindrome, contar las vocales.
  • Problemas con arreglos

    • El minimo, máximo, etc.
    • Cómo pasar todos los 0's al final de un arreglo.

Recomendaciones

  • Busquen técnicas de resolución de problemas como sliding window, caches, pivotes, etc.
  • Leer acerca de las notaciones big O, esto les ayudará a entender el desempeño de su solución.
  • Investigar acerca de Dynamic Programming.
  • Práctica en páginas como hacker rank, trata de enfocarte en programas nivel sencillo.

Si están interesados en libros, cursos o recomendaciones, envíenme un mensaje!

Para tener en mente

No te desanimes....... Se que parece un largo camino que recorrer, pero es posible haciendo pequeños avances, una recomendación sería trabajar en un plan de estudio que te permita evaluar que tanto estas avanzando.

  • Los rechazos van a hacer parte del camino, si fallas en alguna entrevista, aprende de ello e identifica nuevas preguntas/problemas para los que no estabas preparado, muy posiblemente te pregunten algo similar en la siguiente entrevista.
  • Recuerda que hay cosas que quedan fuera de ti, como un mensaje fue recibido, la situación emocional de algún entrevistador, pero también aprende a reconocer que pudiste haber hecho mejor en esa entrevista, anota las preguntas que fallaste.

Un proyecto desarrollado con GatsbyJS Starter y Netlify CMS, Hecho con por Stackrole.com. Personalizado por Tavo Leyva