Cómo sobresalir
en una
entrevista laboral

La Universidad
no es suficiente

Un título no consigue
un puesto de trabajo

Los pénsum de las universidades no
pueden mantenerse vigentes con la velocidad de cambio de industría

El cuerpo docente
no siempre se
mantiene actualizado

¿Soluciones?

¡Autoestudio!

Libros para leer

  • Effective Java 2e
  • Clean Code
  • Hay muchas listas en Internet
  • Hay que leer un libro mensual
    (así sea por medios "alternativos")

Twitter es la mejor herramienta para encontrar información útil

¡Videos por doquier!

  • YouTube
  • Coursera.org
  • virtualjug.com

Considera una certificación

Java SE, Java Web Component Developer,
Java Business Component Developer,
Java Enterprise Architect, Spring, etc.

¡Estar trabajando
no es suficiente!

¿Te parece familiar?

Problemas con el trabajo

  • Usualmente haces el mismo
    tipo de trabajo
  • Las mismas tecnologías
  • Tienes que trabajar usualmente
    más de 8 horas

¿Soluciones?

¡Autoestudio!

¡Es súper importante codificar por fuera del trabajo!

Hay que mejorar
la administración
del tiempo libre!

Personalmente dedico al autoestudio:

  • Lunes a Viernes: 8 pm a 10 pm
  • Sábados o Domingos: al menos uno al mes
  • La hora del almuerzo

¿Ideas para proyectos?

Venir a todos nuestros Meetups

El inglés es la clave

¡Ya no hay que pagar un peso para aprender!

  • Películas en inglés (sin subtítulos)
  • Videos (Coursera, VirtualJUG, YouTube, TED, etc.)
  • Artículos (Twitter)
  • Grupos en Meetup

¡Hay que dedicar al menos 20 horas semanales!

  • Es complementario con el autoestudio
  • Ver películas no se siente como "estudio"
  • ¡Es una actividad que puede involucrar
    a otros miembros de la familia!
  • En al meses 3 meses mejora considerablemente
    la capacidad para entenderlo.

Hay que saber
para quién
quieres trabajar

Haz tu tarea

  • Internet
  • ¿Conoces a alguien?
  • Se nota la motivación

¿En qué no debo fallar en la parte técnica?

POO y Java (conceptos)

Los API se aprenden rápido
Los FW se aprenden rápido
Otros lenguajes (en el mismo paradigma) se aprenden rápido

Ten mucho cuidado de usar los términos que usan los programadores

¿Cómo explicarías
este código?

UtilityClass.foo(2, "bar");

POO se trata de:

  • Objetos
  • Encapsulamiento
  • Herencia
  • Polimorfismo

Objetos / Clases

  • Tipos de Datos
  • Estado / Invariantes / Inmutabilidad
  • Métodos Estáticos / Clases Utilitarias

Encapsulamiento

  • Invariantes
  • Modificadores de acceso
  • Information Hiding

Herencia

  • Reutilización de código
  • Especialización de código
    (Servlet / Generic Servlet
    / HttpServlet / MyServlet)
  • Favorece Composición sobre Herencia
public class Punto {
   private final int x;
   private final int y;
   public Punto(int x, int y) {
      this.x = x;
      this.y = y;
   }
   public int getX() {
      return x;
   }
   public int getY() {
      return y;
   }
}

Hagamos una clase PuntoColoreado

¿Cómo reutilizamos los
métodos de Punto sin herencia?

public class PuntoColoreado {
   private final Punto punto; // composición
   private final Color color;
   public PuntoColoreado(Punto punto, Color color) {
      this.punto = punto;
      this.color = color;
   }
   public int getX() {
      return punto.getX(); // delegación
   }
   public int getY() {
      return punto.getY(); // delegación
   }
   public Color getColor() {
      return color;
   }
}

¿Interfaces,
Clases Abstractas?

  • Método abstracto
  • Clase abstracta
  • Interfaz

¿Cómo se usan?

  • Siempre empiezo con una interface:
    Defino un tipo de dato independiente
    de la implementación de sus métodos
  • Luego uso clases abstractas para
    implementar código común a las
    implementaciones (evita romper DRY!)
  • Las clases concretas extienden de la clase
    abstracta

¿Ejemplos?

  • Servlet (Interface) -> GenericServlet (abstracta) -> HttpServlet (abstracta) -> MyServlet (concreta)
  • List (interface) -> ArrayList (concreta)
                              -> LinkedList (concreta)
  • Set (interface) -> TreeSet (concreta)
                              -> HashSet (concreta)

Polimorfismo

El concepto más fácil
de confundir

El polimorfismo

  • NO es lo mismo que herencia
  • NO es lo mismo que la sobrecarga
    o la sobrescritura de métodos
  • El polimorfismo existe aún en lenguajes
    sin herencia, sobrecarga o sobrescritura!

¿Qué es?

  • Es la característica que permite que
    una referencia a un objeto de tipo T,
    refiera en realidad a una subclase de T

El polimorfismo
en una sola línea:

List<String> datos = new ArrayList<>();

¿Para qué sirve?

public T foo(List<T> datos) {
   // código
}

A foo() no le interesa qué tipo de lista le den, siempre y cuando sea una lista.

El método funciona con un ArrayList o un LinkedList, ¡incluso con implementación que aún no hayan sido inventadas!

Quién llame a foo()
escoge la implementación.

¿Para qué sirve?

public List<T> otroFoo(/* parámetros */) {
   // código
}

El que llame a foo() recibe una lista, simplemente no sabe cuál. ¡No le debe interesar!

foo() es libre de cambiar la implementación y ningún código se ve afectado por la decisión

¿Ejemplos?

  • public static void Collections::sort(List<T> datos)
  • public static List<T> Arrays::asList(T... datos)
  • public void HttpServlet::doGet(HttpRequest request, HttpResponse response)
  • public static Path Paths::get(String path)

Siempre usar
interfaces para

  • Parámetros
  • Valores de retorno
  • Tipos de los atributos
    (usar Inyección de Dependencias)

El polimorfismo permite los patrones de diseño más interesantes:

  • Factory Method
  • Strategy
  • etc.
class Vehículo {
   public void arrancar() {
      System.out.println("RRRRM!");
   }
}

class VehículoModificado extends Vehículo {
   @Override
   public void arrancar() {
      System.out.println("ZASZZ!");
   }
}

Aca NO hay polimorfismo

class ControlRemoto {
   public static void arrancar(Vehículo vehículo) {
      vehículo.arrancar();
   }
}

* * *

ControlRemoto.arrancar(new Vehículo()); // imprime "RRRRM!"
ControlRemoto.arrancar(new VehículoModificado()); // imprime "ZASZZ!"

¿Dónde está el polimorfismo?

Técnicamente existen diferentes tipos de polimorfismo

  • La sobrecarga es un tipo
  • La sobrescritura también
  • Pero en POO cuando se habla de EL polimorfismo, siempre se habla del que hemos visto, técnicamente Polimorfismo de Tipos

¡Utilice código!

  • Hay conceptos que son más fáciles
    de explicar con un ejemplo, después
    de todo los lenguajes de programación
    son ¡lenguajes formales!
  • Pero nunca utilice ejemplos con: Vehículos, Animales, Figuras, etc. (¿acaso usted en su trabajo nunca usa los conceptos que está explicando?)

API de colecciones

Complejidad

  • No hace falta saber los detalles para
    hablar en términos de Complejidad
  • Lo esencial es: O(1) < O(log n) < O (n) < O(n log n) < O(n^2) < O(n^3) < O(a^n)

Interfaces esenciales

  • List
  • Set
  • Map
  • Queue / Deque

List

  • List es una secuencia
  • ArrayList es una lista que utiliza un arreglo
  • LinkedList es una lista encadenada

ArrayList

  • Agregar / Eliminar un elemento al final: O(1)*
  • Agregar / Eliminar un elemento en otra posición diferente: O(n)
  • Conocer el elemento en la posición i-ésima: O(1)
  • Ordenar: O(n log n)
  • Buscar un elemento: O(log n) - debe estar ordenado 

LinkedList

  • Agregar / Eliminar un elemento al final: O(1)
  • Agregar / Eliminar un elemento en otra posición diferente: O(1)
  • Conocer el elemento en la posición i-ésima: O(n)
  • Ordenar: N/A
  • Buscar un elemento: O(n) - debe estar ordenado 

ArrayList vs LinkedList

  • En teoría un LinkedList es mejor cuando la
    colección debe cambiar de tamaño varias veces 
  • En la práctica, para el 99% de los casos es mejor
    usar ArrayList (hay un constructor que permite
    establecer la capacidad inicial, por defecto es 10)

Set

  • Es una colección que no permite
    elementos duplicados.
  • Si intentamos agregar un elemento que ya está presente, la operación es ignorada.
  • TreeSet utiliza un árbol binario de búsqueda.
  • HashSet utiliza una tabla hash.

TreeSet

  • Depende de Comparable o un Comparator
  • Todas las operaciones esenciales toman O(log n)
  • Permite operaciones como first(), last(), ceil(E), floor(E)
  • La colección se va ordenada al ser construida.
  • Buscar un elemento toma O(log n)

HashSet

  • Depende del contrato hashCode() e equals(Object)
  • Todas las operaciones esenciales toman O(1) - algunas O(1)* -
  • Se pierden todas las nociones de ordenamiento.
  • No se pueden ordenar los elementos.
  • Buscar un elemento toma O(1)*

Map

  • Es una asociación de objetos de una clase K llamados llaves y objetos de una clase V llamados valores.
  • TreeMap es equivalente a TreeSet
  • HashMap es equivalente a HashSet

Queue

  • Es una colección de elementos que deben ser procesados en un orden especifico.
  • Priority Queue es una colección en que el siguiente elemento en ser procesado es el "menor"
  • Stack (ArrayDeque<T> - Deque<T>) es una colección en que el siguiente elemento en ser procesado es el último que ingreso.
  • Queue (ArrayDeque<T> - Deque<T>) es una colección en que el siguiente elemento en ser procesado es el primero que ingreso.

Qué es esencial de Java 7?

  • La clase Objects
  • Switch con Strings
  • Try con recursos
  • Multicatch
  • NIO 2 (Path, FileSystem, Files, etc)

Qué es esencial de Java 8?

  • Expresiones Lambda
  • API de Stream
  • API de Tiempo

Qué viene en Java 9?

  • Modularización
  • Value Types
  • Generics para primitivas (?)

Considera estudiar
para un examen de certificación

OCA/OCP Java SE 7
Programmer I & II Study Guide

Fake it 'till
you make it!

Q&A

Thanks!

@gaijinco

Cómo sobresalir en una entrevista laboral

By Carlos Obregón

Cómo sobresalir en una entrevista laboral

  • 2,293