lunes, 5 de abril de 2021

Cómo usan la AI en los procesos de selección

 ¿Qué es la contratación con AI?

La contratación con IA es la práctica de integrar la inteligencia artificial, como el aprendizaje automático o los algoritmos predictivos, en las partes de la contratación que requieren mucho tiempo o recursos. 

Hay una variedad de herramientas de contratación de IA que evalúan la idoneidad de un candidato para un puesto. Esencialmente, estas herramientas utilizan algoritmos para entender los puntos de datos de las respuestas, incluyendo: 

  • Análisis de expresiones faciales, lenguaje corporal y gestos
  • Análisis de sentimientos de voz y texto
  • Capacidad real para realizar el trabajo
  • Ajuste cultural y personalidad 

Pero no es esa la razón por la que los reclutadores utilizan la IA. Los reclutadores y los equipos de talento quieren utilizar la IA para automatizar el proceso de contratación y hacerlo más rápido, menos costoso y más fácil de gestionar grandes volúmenes de candidatos.


Por qué la IA para la contratación

La IA, o inteligencia artificial, puede ser una poderosa herramienta para impulsar la eficiencia en la contratación. Al reducir el tiempo dedicado a la selección, las pruebas de habilidades y las entrevistas, los equipos de RRHH y de Talento pueden centrarse en las formas de atraer, incorporar y retener a los empleados.


A medida que la tecnología de IA se hace más accesible, todas las industrias están utilizando la IA para reducir o eliminar las actividades que consumen tiempo. El mundo de la contratación no es diferente.

Diagrama que muestra el tiempo medio dedicado a cada etapa del proceso de contratación

Los equipos de adquisición de talento están desplegando herramientas de contratación de IA para superar los aspectos que más tiempo consumen en el proceso de contratación. La selección de candidatos previa a la contratación sigue siendo la mayor pérdida de recursos de los reclutadores. El número de candidatos por solicitud abierta ha aumentado, y encontrar candidatos de calidad se ha convertido en un reto.

Cómo utilizan los reclutadores la IA

Hay tres formas principales en que los reclutadores utilizan la IA en el proceso de contratación:

  • Búsqueda: encontrar y conectar con el talento rápidamente
  • Selección: obtener rápidamente los mejores candidatos
  • Entrevistas: facilitar la contratación a distancia y ahorrar tiempo

Búsqueda de candidatos

Las herramientas basadas en la IA para la búsqueda de candidatos ayudan a los reclutadores a encontrar y conectar con el talento más rápidamente. Algunas herramientas se centran en la búsqueda de perfiles en bolsas de trabajo o bases de datos internas para cubrir un puesto vacante. Otras ayudan a maximizar los esfuerzos de marketing y a conectar con los candidatos en tiempo real. Y hay chatbots de IA que pueden interactuar con un candidato para determinar qué papel específico será el más adecuado y mostrarles cómo aplicar a través del sitio de trabajo. 

Algunos ejemplos de herramientas de contratación de IA son:

Hiretual
Los clientes utilizan Hiretual para buscar en más de 40 plataformas y más de 700 millones de perfiles profesionales y contratar de manera eficiente con la colaboración del equipo, gestionar la reserva de talento, personalizar el compromiso del candidato y redescubrir candidatos en su ATS/CRM.
Appcast
Appcast utiliza el análisis predictivo, los datos en tiempo real y las ofertas programáticas para maximizar los resultados de contratación.
Shapr
No se limita a la búsqueda de candidatos, Shapr es una especie de Tinder para las relaciones profesionales. El algoritmo de aprendizaje automático sugiere 15 personas relevantes para conocer cada día, y se comunica cuando el interés por conectar es mutuo.

Selección de candidatos

Como se ha demostrado, la selección es el aspecto que más tiempo consume en el proceso de contratación. Las herramientas de selección de IA tienen como objetivo obtener rápidamente información de las solicitudes para acelerar este paso.

Las herramientas de selección de IA varían en su enfoque, desde el análisis de los currículos hasta las evaluaciones de comportamiento y habilidades. El rendimiento predictivo basado en pruebas de habilidades tiende a ser una mejor manera de emparejar a los candidatos con los puestos vacantes, ya que una prueba de habilidades indica el conocimiento y la capacidad actuales, frente a la naturaleza histórica de los currículos. En cualquier caso, las herramientas de IA agilizan el proceso y ayudan a seleccionar a los candidatos, no a excluirlos.

Algunos ejemplos de herramientas de selección de IA son

Tiene una funcionalidad de análisis de currículos dentro de su sistema de seguimiento de candidatos, así como formularios de solicitud flexibles para ayudar a seleccionar a los candidatos.
El software de selección de candidatos de Ideal ofrece una selección automática de currículos para preseleccionar a los candidatos.
Evaluaciones de habilidades basadas en la IA que le permiten evaluar a escala y dedicar más tiempo a los candidatos de alto rendimiento. Califica y clasifica instantáneamente a los candidatos según las habilidades relacionadas con el trabajo.

Entrevistas a candidatos

Las herramientas de IA se utilizan en las entrevistas en dos escenarios clave. En el primer caso, empresas como Unilever, Google y Facebook han empezado a utilizar la IA para evaluar las entrevistas en vídeo, utilizando el análisis de la voz y la expresión facial para evaluar los rasgos de personalidad. Aunque esto puede ayudar a reducir el tiempo y la atención que requieren los reclutadores para revisar la respuesta grabada de cada candidato, hay algunas grandes banderas rojas con el uso del reconocimiento facial para seleccionar a los candidatos - más sobre esto en un minuto. 

La segunda forma de utilizar una herramienta de IA con una entrevista de vídeo pregrabada es analizar el contenido de la respuesta. Por ejemplo, en una prueba de habilidades se puede pedir a un candidato que escriba un ejemplo de entrada de blog sobre un tema relevante para el sector de la empresa. A continuación, en una entrevista de vídeo pregrabada, la herramienta pregunta por qué el candidato ha elegido el tema sobre el que ha escrito. La parte del vídeo puede utilizarse para dar más contexto a la prueba de habilidades del candidato y ayudar a que éste destaque más allá de su respuesta inicial.

Algunos ejemplos de entrevistas a candidatos con IA son

HireVue
Plataforma de entrevistas digitales. HireVue utiliza la IA en sus entrevistas para analizar el estilo de trabajo y la capacidad cognitiva. 
Utiliza el chat y un bot de llamadas telefónicas para seleccionar a los candidatos por teléfono, y luego los invita a realizar entrevistas en vídeo con reconocimiento facial.
Utiliza un chatbot para realizar entrevistas de texto a los candidatos.


Bibliografía

lunes, 1 de marzo de 2021

Opinion Black Mirror Entire History of you

 Entre todos los episodios que nos ha ofrecido la distópica antología de Black Mirror, "The Entire History of You" (Temporada 1, Episodio 3) se alza como uno de los más perturbadores y emocionalmente crudos. Es una historia que resuena profundamente porque, a diferencia de otras entregas con tecnologías más lejanas, su premisa se siente inquietantemente cercana a nuestra realidad actual de sobreexposición y registro digital.

El episodio nos sumerge en un futuro no tan distante donde la mayoría de las personas tienen un implante cerebral llamado "Grain" (o "Grano"). Este pequeño dispositivo, alojado detrás de la oreja, graba absolutamente todo lo que el individuo ve y oye, creando una memoria perfecta e infalible. Estas grabaciones pueden ser "revividas" en la mente del usuario o proyectadas en pantallas para que otros las vean. El titular "Opinion: Black Mirror: Entire History of You" apenas araña la superficie de la complejidad y el horror que este episodio desata.


El Cuento de Liam y Ffion: La Desintegración de la Confianza

La trama sigue a Liam Foxwell, un abogado, y su esposa Ffion. Durante una cena, Liam se obsesiona con la interacción de Ffion con un conocido, Jonas. Su inseguridad y los celos lo llevan a usar su Grain para repasar cada microexpresión, cada palabra, cada risa, buscando pruebas de una infidelidad. Lo que comienza como una simple sospecha se convierte en una obsesión autodestructiva que, impulsada por la capacidad de revivir cada instante con total claridad, desmantela su matrimonio y su vida.

La belleza (y el terror) del episodio radica en cómo expone las fallas de la naturaleza humana cuando se le da una herramienta que elimina las "ventajas" del olvido.

Temas Clave: El Peligro de la Memoria Perfecta

"The Entire History of You" es una masterclass en el análisis de cómo la tecnología, incluso una aparentemente beneficiosa, puede amplificar nuestras peores cualidades:

  • La Tiranía de la Verdad Absoluta: La memoria humana es falible, subjetiva y selectiva. Olvidamos, reinterpretamos y a menudo, de forma inconsciente, nos protegemos de los recuerdos dolorosos. El Grain elimina esta "bendición del olvido". Nos muestra que no todas las verdades son liberadoras; algunas verdades son destructivas. La posibilidad de acceder a cada detalle, cada mentira piadosa, cada momento de debilidad, convierte la vida en un expediente forense implacable.

  • La Erosión de la Confianza y la Privacidad: En una relación, la confianza se construye sobre la base de la fe y la aceptación de la imperfección. El Grain destruye esto al permitir la vigilancia total. La privacidad se anula, no solo para el individuo, sino en la dinámica de pareja, donde no hay lugar para secretos o incluso para las pequeñas concesiones que mantienen la paz. Liam no solo busca la verdad de Ffion; exige que ella comparta sus recuerdos más íntimos, violando su autonomía.

  • La Obsesión y la Paranoia: El episodio ilustra cómo la capacidad de "re-vivir" el pasado puede alimentar la obsesión. Liam se sumerge en un ciclo interminable de reexaminar interacciones, distorsionado por su propia inseguridad y celos. La tecnología, en lugar de traer claridad, lo arrastra a una espiral de paranoia de la que no puede escapar.

  • Las Relaciones Humanas y sus Imperfecciones: La premisa tácita del episodio es que las relaciones humanas, para prosperar, requieren un cierto grado de olvido, perdón y de no saberlo todo. La perfección de la memoria del Grain expone las fisuras y las verdades incómodas que a menudo preferimos que permanezcan enterradas para preservar la armonía o la propia cordura.

Relevancia Actual: ¿Estamos Ya Viviendo en la Era del "Grain"?

Lo más aterrador de "The Entire History of You" es su resonancia con nuestra vida actual. Aunque no tenemos un implante cerebral, vivimos en una era de registro digital masivo:

  • Redes Sociales: Fotos, videos y publicaciones que documentan cada momento de nuestras vidas. Lo que publicamos es solo una fracción de nuestra "historia", pero es una historia permanente y accesible que puede ser revisitada, juzgada y utilizada en nuestra contra.

  • Cámaras por Doquier: Desde cámaras de seguridad hasta dashcams en coches y las cámaras de nuestros propios móviles, cada vez más de nuestra vida pública y privada queda registrada.

  • "Recuerdos" y "On This Day": Las aplicaciones de fotos y redes sociales nos bombardean con "recuerdos" de años atrás, reavivando momentos que quizás habíamos olvidado o que preferiríamos no revivir con tanta claridad.

  • La Cultura de la "Evidencia": En discusiones o disputas, la gente recurre a capturas de pantalla, mensajes de texto o videos como "prueba" irrefutable, eliminando el espacio para la interpretación o el acuerdo mutuo de los hechos.

En mi opinión, "The Entire History of You" es uno de los episodios más brillantes de Black Mirror porque no necesita grandes saltos tecnológicos para aterrorizarnos. Simplemente lleva una tendencia que ya está presente en nuestra sociedad digital a su conclusión lógica y más devastadora. Nos obliga a confrontar la idea de que, a veces, la ignorancia puede ser una dicha, y que la búsqueda implacable de la "verdad" a través de la tecnología puede destruir lo más valioso que tenemos: nuestras relaciones y nuestra paz mental.

Es un recordatorio escalofriante de que no toda la memoria es una bendición, y que hay un valor inherente en la capacidad de olvidar y dejar ir.

JAVA: Ejercicio sobre threads

 El enunciado es: Implementar el modelo del productor / consumidor.

La solución aportada no comprueba el tamaño del buffer, considera que nunca se va a llenar tanto el buffer como para que falle el programa por desbordamiento (supone que los consumidores se encargarán de variar el buffer para que no se llene demasiado). Puede que esto no sea correcto en algunos entornos y sea necesario controlar la inserción de elementos en el buffer.


Buffer.java
package productorconsumidor;

import java.util.LinkedList;

class Buffer {

    private LinkedList<Integer> num = new LinkedList<>();

    synchronized void poner(int i) {
        num.add(i);
        notify();
    }

    synchronized int quitar() {
        while (num.size() < 1) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return (int) num.remove();
    }
}

Consumidor.java

package productorconsumidor;

class Consumidor extends Thread {

    private Buffer b;

    Consumidor(Buffer b) {
        this.b = b;
    }

    public void run() {
        while (true) {
            System.out.println("Se quita " + b.quitar() + " desde " + getId());
            try {
                Thread.sleep((long) (Math.random() * 4000 + 1));
            } catch (InterruptedException ex) {  }
        }
    }
}

Productor.java

package productorconsumidor;

class Productor implements Runnable {

    private Buffer b;

    Productor(Buffer b) {
        this.b = b;
    }

    public void run() {
        int i = 0;
        while (true) {
            try {
                Thread.sleep((long) (Math.random() * 1000 + 1));
            } catch (InterruptedException ex) { }        
            System.out.println("Se pone " + i++);
            b.poner(i);
        }
    }
}

ProductorConsumidor.java

package productorconsumidor;


public class ProductorConsumidor {

    public static void main(String[] args) {
        Buffer b = new Buffer();
        new Thread(new Productor(b)).start();
        new Consumidor(b).start();
        new Consumidor(b).start();
        new Consumidor(b).start();
    }
}

Puedes ver todos mis ejercicios de JAVA en este enlace.

lunes, 22 de febrero de 2021

JAVA: Ejercicio sobre serialización

El enunciado es: Realizar un programa que cuente el número de vocales que hay en un fichero de texto. Pasar como argumento al programa el nombre del archivo.



CuentaVocales.java

package cuentavocales;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CuentaVocales {

    public static void main(String[] args) {
        try {
            String vocales = "aeiou";
            int nvocales = 0;
            FileInputStream is = new FileInputStream(args[0]);
            byte []b = new byte[10];
            while(is.read(b)!=-1) {
                for(byte c: b) {
                    if(vocales.contains(Character.toString((char)c)))
                        nvocales++;
                }
                b = new byte[10];
            }
            is.close();
            System.out.println("Vocales: "+nvocales);
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
}

Puedes ver todos mis ejercicios de JAVA en este enlace.

lunes, 15 de febrero de 2021

JAVA: Ejercicio sobre interfaces

El enunciado es: En el siguiente post se creó una jerarquía de clases de figuras geométricas. Implementar una interfaz que defina un método que devuelva el número de lados. Hacer que las figuras que tengan lados (el círculo no tiene) la implementen.



Main.java

package main;
import figuras.*;

public class Main {
    public static void main(String[] args) {
        Figuras figuras = new Figuras();
        figuras.annade(new Circulo(3.456));
        figuras.annade(new Triangulo(3.456,2.17));
        figuras.annade(new Cuadrado(2.11));
        if(!figuras.annade(new Triangulo(3.12,5.6),7)) {
            System.out.println("Error al borrar");
        }
        figuras.lista();
        figuras.borra(0);
        figuras.borra(33);
        System.out.println("---------------------");
        figuras.lista();
    }
}

Triangulo.java

package figuras;

public class Triangulo extends Figura implements Lados {
    
    private double base;
    private double altura;
    
    public Triangulo(double base, double altura) {
        this.base = base;
        this.altura = altura;
    }

    @Override
    public double calculaArea() {
        return (base*altura)/2;
    }

    @Override
    public int numLados() {
        return 3;
    }
       
}

Lados.java

package figuras;

public interface Lados {
    abstract public int numLados();
}

Figuras.java

package figuras;

import java.util.LinkedList;

public class Figuras {

    // No hay restricción si utilizamos colecciones (ver unidad 9)
    private LinkedList<Figura> lista = new LinkedList<>();
    
    public void annade(Figura f) {
        lista.add(f);
    }
    
    public void borra() {
        lista.removeLast();
    }
    
    public boolean annade(Figura f, int pos) {
        try {
            lista.add(pos, f);
        }
        catch(Exception e) {
            return false;
        }
        return true;
    }
    
    public void borra(int pos) {
        // Si se intenta borrar una que no existe que no haga nada
        try {
            lista.remove(pos);
        } catch(Exception e) {}
    }
    
    public void lista() {
        for(Figura f: lista) {
            System.out.println("Figura: "+f);
            if(f instanceof Lados) {
                Lados l = (Lados)f;
                System.out.println("\tNum lados: "+l.numLados());
            }
        }
    }
}

Figura.java

package figuras;

public abstract class Figura {
    abstract public double calculaArea();
}

Cuadrado.java

package figuras;

public class Cuadrado extends Figura implements Lados{

    private double lado;
    
    public Cuadrado(double lado) {
        this.lado = lado;
    }
    
    @Override
    public double calculaArea() {
        return lado * lado;
    }

    @Override
    public int numLados() {
        return 4;
    }
    
}

Circulo.java

package figuras;


public class Circulo extends Figura {

    private double radio;
    
    public Circulo(double radio) {
        this.radio = radio;
    }
    
    @Override
    public double calculaArea() {
        return Math.PI*radio*radio;
    }
    
}

Puedes ver todos mis ejercicios de JAVA en este enlace.

lunes, 8 de febrero de 2021

JAVA: Ejercicio sobre polimorfismo

El enunciado es: Crear una clase encargada de almacenar figuras geométricas. La clase deberá disponer de métodos que permitan añadir y borrar un elemento por posición, mostrar los elementos por pantalla, etc.



package main;
import figuras.*;

public class Main {
    public static void main(String[] args) {
        Figuras figuras = new Figuras();
        figuras.annade(new Circulo(3.456));
        figuras.annade(new Cuadrado(2.11));
        if(!figuras.annade(new Triangulo(3.12,5.6),7)) {
            System.out.println("Error al borrar");
        }
        figuras.lista();
        figuras.borra(0);
        figuras.borra(33);
        System.out.println("---------------------");
        figuras.lista();
    }
}

Puedes ver todos mis ejercicios de JAVA en este enlace.

lunes, 1 de febrero de 2021

JAVA: Ejercicio sobre Herencia

El enunciado es: Cree una jerarquía de clases que represente el personal de una empresa. Para ello defina una clase abstracta con los atributos y métodos generales de cualquier empleado y varias subclases para distintos tipos de empleados.



Programador.java

package empleados;

public class Programador extends Empleado {
    
    public Programador(String dni) {
        super(dni,20000);
    }
    
    public void programar() {
        System.out.println("Estoy programando");
    }
}

ListaEmpleados.java
 
package empleados;

public class ListaEmpleados {

    private Empleado[] lista;

    public ListaEmpleados() {
        lista = new Empleado[10];
    }

    public boolean add(Empleado e) {
        for (int i=0; i<lista.length; i++) {
            if (lista[i] == null) {
                lista[i] = e;
                return true;
            }
        }
        return false;
    }

    public void remove(int i) {
        if (i < lista.length && i >= 0) {
            lista[i] = null;
        }
    }

    public boolean remove(String dni) {
        for (int i=0; i<lista.length; i++) {
            if (lista[i] != null) {
                if (lista[i].getDNI().compareTo(dni) == 0) {
                    lista[i] = null;
                    return true;
                }
            }
        }
        return false;
    }

    public void listar() {
        for (Empleado elto : lista) {
            if (elto != null) {
                System.out.print(elto.getDNI() + ": ");
                if (elto instanceof Gerente) {
                    System.out.print("gerente (");
                }
                if (elto instanceof Programador) {
                    System.out.print("programador (");
                }
                System.out.println(elto.getSueldo() + ")");
            }
        }
    }
}

Gerente.java

 
package empleados;

public class Gerente extends Empleado {
    
    public Gerente(String dni) {
        super(dni,100000);
    }
    
    public void reunion() {
        System.out.println("Estoy reunido");
    }
}

Empleados.java

 
package empleados;

public class Gerente extends Empleado {
    
    public Gerente(String dni) {
        super(dni,100000);
    }
    
    public void reunion() {
        System.out.println("Estoy reunido");
    }
}

Empleado.java

 
package empleados;

abstract public class Empleado {

    private String DNI;
    private int sueldo;
    
    public Empleado(String dni, int sueldo) {
        DNI = dni;
        this.sueldo = sueldo;
    }

    public String getDNI() {
        return DNI;
    }

    public void setDNI(String DNI) {
        this.DNI = DNI;
    }    

    public int getSueldo() {
        return sueldo;
    }

    public void setSueldo(int sueldo) {
        this.sueldo = sueldo;
    }
    
}

Puedes ver todos mis ejercicios de JAVA en este enlace.