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?
- Picas y Fijas
- Juego del Ocho
- Buscaminas
- Hacer mosaicos con
fotos personales - Batalla Naval
- Veintiuna
- Conecta 4
- ¡Cualquier juego
- que se te ocurra!
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,362