Lo que todo programador
debe saber
Historia
¿Cuál fue el primer computador eléctrico?
Colossus - 1942
¿Cómo se llama
esta arquitectura?
Arquitectura Von Neumann - 1945
¿Cómo se veía el
código de los
primeros computadores?
B8 22 11 00 FF
01 CA
31 F6
53
8B 5C 24 04
8D 34 48
39 C3
72 EB
C3
¿Cómo se veía el
código en ensamblador?
foo:
movl $OxFF001122, %eax
addl %ecx, %edx
xorl %esi, %esi
push1 %ebx
movl 4{%esp}, %ebx
leal (%eax, %ecx, 2), %esi
cmpl %eax, %ebx
jnae foo
retl
¿Cuáles fueron los primeros lenguajes de alto nivel?
- FORTRAN - 1957 (John Backus)
- ALGOL - 1958
- Copias Isomórficas
de la arquitectura
Von Neumann
¿Por qué debían
ser copias isomórficas?
Desempeño -
"Close to the hardware"
¿Cuál fue el primer lenguaje de programación funcional?
LISP - 1958 (John McCarthy)
LISP - Un lenguaje que un matemático pudiera amar
¿Cómo se llama el primer lenguaje que usó objetos?
Simula - 1967 (Ole-Johan Dahl y Kristen Nygaard)
Simula - Permite una abstracción sobre
el hardware.
Bajo desempeño.
Interés académico.
¿Qué lenguaje popularizó
la programación?
C - 1972 (Dennis Ritchie)
C - Creado para diseñar sistemas operativos
"Close to the hardware"
¿Cuál fue el primer lenguaje orientado por objetos?
Smalltalk - 1972 (Alan Key)
Modelo de Actores - Modelo matemático
para la computación concurrente
- 1973 (Carl Hewitt)
Influído por Smalltalk
"Can Programming Be Liberated from the von Neumann Style?"
John Backus - 1977
Llamado a no usar copias isomórficas del hardware. Alrededor de ese paper se acuñó el término FP
Dado que no era
"Close to the Hardware"
la industria desestimó
la FP como de puro
interés académico
Características de la
FP que la hacían de
"bajo" desempeño
- Garbage Collector
- Dynamic Typing
- Recursion
- etc
Hoy día todas son características estándar
de lenguajes exitosos
¿Qué lenguaje
popularizó la OOP?
C++ - 1983
(Bjarne Stroustrup)
Década de los 90
Backus tenía razón
Dificultad para Programación de GUI's
C++
- Se volvió un estándar
de facto por GUI's - Abstracción sobre el hardware
- "Close to the hardware"
porque se implementó sobre C
¿Cuál fue el primer lenguaje FP exitoso de la industria?
Erlang - 1986
Erlang - Creado para diseñar el SO para Ericsson. Basado en el
modelo de Actores
¿Cuál es el lenguaje
FP por excelencia?
Haskell - 1990
¿Cuál es el primer lenguaje en abiertamente mezclar
la FP y la OOP?
Scala - 2004
El catalizador de la FP
fue la programación
en múltiples núcleos
Hoy en día, todos los lenguajes de programación populares, tienen características de FP
La historia nos muestra que usualmente no hay ideas "superiores" a otras. Unas se complementan a otras.
Sacar lo mejor de
las ideas disponibles
Lenguajes de Programación
¿Cuántos?
Expertos coinciden en ~5
¿Cuáles?
- Diferentes Paradigmas
- Diferentes Sintáxis
- Diferentes Audiencias
¿Cuál es el primero?
El que use en su trabajo
Lenguaje Actual
- Pasado
- Presente
- Futuro
LISP
- FP
- Sintaxis extraña
- Activo
C
- Imperativo
- El padre de los lenguajes
C++
- OOP
- Sin Garbage Collector
- Pionero en muchas ideas
Java
- Lenguaje OOP más usado
- Comunidad muy grande
- JVM
C#
- OOP
- Microsoft
- LINQ
JS
- Lenguaje FP más usado
- Comunidad muy grande
Koitlin
- Lenguaje JVM
- OOP + FP
- Android
Go
- Sistemas embedidos
- Imperativo
- Simplista
Clojure
- Dialecto LISP
- Lenguaje JVM, JS y CLR
Python
- OOP + FP
- Data Science
- Muy usado por Google
Swift
- OOP + FP
- iOS
Groovy
- OOP + FP
- Lenguaje JVM
- Muy cercano a Groovy
Otros
- Scala
- Ruby
- PHP
- etc
¡Aprenda un lenguaje nuevo cada año!
OOP
OOP
- Clases, Objetos, Tipos de Datos
- Encapsulamiento
- Herencia: Interfaces y Clases Abstractas
- Polimorfismo
Frameworks
¡NINGUNO!
Si usted conoce los principios de programación, un FW se aprende rápidamente
Principios de Programación
Principios SOLID
- SRP
- OCP
- LSP
- ICP
- DIP
Single Responsibility
- Una clase debe tener una
sola razón para cambiar - Alta Cohesión
- No abusar de static
Open Close
- Una clase debe estar abierta a la
extensión pero cerrada a la modificación - Agregar funcionalidad sin
romper código ya existente - Patrones de Diseño
Liskov Substitution
- Un método que recibe un parámetro
de tipo T debería funcionar correctamente
con cualquier subtipo de T - No abusar de la herencia
- Preferir substitución
(delegación) sobre herencia
Interface Segregation
- Una clase que implementa una
interface no debería estar forzada
a usar métodos que no necesita - Las interfaces deberían ser pequeñas
- Cada interface representa una "vista"
sobre una característica de un objeto
Dependency Inversion
- Los módulos de alto nivel no deberían
depender de módulos de bajo nivel - Use interfaces en: valores de retorno,
parámetros y atributos
Dependency Injection
- Una clase no debería instanciar un "colaborador"
- Esas dependencias deberían ser inyectadas
- Diferencias en: Constructor, setter y atributo
- NO depende de un FW
Don't Repeat Yourself - DRY
- Evitar la repetición del código
- Evita sistemas inconsistentes
You Aren't Gonna Need It - YAGNI
- Implementar solo lo
que se nos impide - Optimizar recursos
Patrones de Diseño
Los Patrones de Diseño
NO están obsoletos.
La FP NO los reemplaza
Template
- Representa un algoritmo
expresado con métodos abstractos - Implementa un proceso con
pasos que pueden ser especializados - Muy útil en el mundo web
y diferentes usuarios
Factory Method
- Un método que
construye un objeto - Esconde la implementación
de una interface - Versión lite
Command
- Encapsula una acción
para ser ejecutada después - Las expresiones lambda
muestran su poder,
pero no lo reemplazan - Útil para operaciones
de "deshacer"
Strategy
- Modifica el comportamiento
de un método en tiempo de ejecución - Útil para implementar algoritmos resilentes
State
- Modela clases que cambian
su comportamiento según su "estado" - Modelan naturalmente "máquinas de estado"
Builder
- Separar el código de construir
un objeto de sus métodos - Permite construir un
objeto de muchas maneras - Evita listas de parámetros confusas
Decorator
- Agrega funcionalidad a
un método existente sin modificarlo - Varios ejemplos en API's muy usados
Observer
- Establece una relación
1 a muchos entre clases - Desacopla la clase donde ocurre
un "evento" y la clase que
reacciona a este evento - Base de Programación Reactiva
Visitor
- Separa un algoritmo de las clases sobre las que opera
- Muy parecido a Pattern Matching
Singleton
- Permite asegurar que solo se crea
una instancia de una clase - Fácil de abusar...
- ... pero útil en otros casos
- Sepa cuándo usarlo
Pruebas Unitarias
La utilidad de las pruebas unitarias no debería ser discutida ¿por qué no hacemos más de ellas?
Excusas para no usar pruebas unitarias
- No me lo permiten
- Toma el doble del
tiempo escribirlas - Es muy difícil
No deberíamos pedir "permiso", ¡es nuestra responsabilidad escribir código que funcione!
Y no, no toma el doble
de tiempo escribir código con pruebas unitarias,
si no las has escrito entonces llevas la mitad
de lo que deberías hacer
¡Las pruebas unitarias
son en primera instancia para la tranquilidad
del programador!
¡Escribir pruebas
unitarias es una habilidad que se debe practicar!
¡Pedir ayuda está bien!
@Test
public void unStringVacioEsPalindrome() {
assertThat(esPalíndrome(""), is(true));
}
¿Cómo debe verse la prueba unitaria perfecta?
Prueba Unitaria
- Simple
- Expresiva
- Ofrecer un buen
mensaje si falla
Las pruebas unitarias son igual de importantes, o más, que el código que se ejecuta en producción
¡Las pruebas unitarias también son documentación!
TDD
Es un proceso de codificación en que escribimos pruebas unitarias que son ayuden
a "descubrir" el diseño
de nuestra solución
3 pasos para TDD
-
Red - Se escribe una prueba unitaria que falle
-
Green - Se escribe apenas lo necesario
para que la prueba unitaria pase -
Blue - Se refactoriza el código
para hacerlo limpio
Las pruebas se escriben de
menor a mayor complejidad
Ventajas
- El código suele ser más simple
- El diseño del código es mejor
porque se puede probar - Las pruebas ofrecen amplias cobertura
y son excelentes como documentación
¿Todo debería ser TDD?
TDD es una herramienta, úsela a su discreción
Effective Programming
Kill Null
- Nunca use Null para indicar la ausencia de un valor, use otras opciones como Optional
- Nunca inicialice una variable con Null, sólo inicialícela cuando sepa el valor que deba tener. Siempre hay una opción (usualmente involucra crear un método)
- Si es definitivamente imposible, trate de encapsular null detrás de una clase / librería
¿Cuándo está
bien usar null?
- En OOP como un detalle de implementación,
pero este no puede salir del objeto,
p.j. retornarlo en un método
Inmutabilidad
- Un objeto cuyo estado no puede
modificarse una vez creado, es inmutable - Un objeto inmutable se puede compartir tranquilamente entre métodos / hilos
- Así como los miembros deberían
- "Mutability in the inside": la mutabilidad no
es mala per se, pero lo es cuando la compartimos
La suma del costo de
bugs producidos por null
y por compartir objetos mutables debe ser del orden del billón de dólares
Todos los lenguajes populares, tienen
partes peligrosas
Ser un buen programador implica conocer este sub conjunto del lenguaje que permite escribir código seguro y expresivo
Effective <lenguaje/>
- Effective Java
- JavaScript: The Good Parts
- C# in Depth
- etc.
Clean Code
Conjunto de buenas prácticas; la más importante: los métodos deben tener un solo
nivel de abstracción
Hábitos
Hábitos
- Usar Twitter
- Suscribirse a blogs
- Leer un libro cada mes
- Ver conferencias
- Hacer cursos en MOOC's
"No hay ningún problema que sea de alguien más"
"La regla del Boy Scout: has push de código que esté más limpio que como estaba cuando hiciste pull"
Contexto
Hoy en día hay, probablemente, cien millones de
programadores
en el mundo
Y las vacantes de trabajo sobrepasan los programadores disponibles
Y las vacantes de trabajo sobrepasan los programadores disponibles
Por eso, la cantidad de programadores se duplica cada 5 años(*)
La industria está perpetuamente en
estado de "inmadurez" (personas con menos
de 5 años de experiencia)
¿Cuántas personas
han muerto por culpa
de software?
¡Cuando el CEO de Volkswagen testificó por el escándolo de las emisiones, culpó a los desarrolladores!
No está bien que un programador diga "... es que mi jefe me dijo que tenía que hacerlo rápido"
Tenemos que aprender
a decir "NO", que no es
lo mismo que implicar
que siempre esta
bien decir "NO"
El Juramento del Programador
- No escribiré código maligno
- El código que escriba siempre
será el producto de mi mejor esfuerzo - Haré pequeños incrementos frecuentes,
no impediré el progreso de los demás - De manera implacable mejoraré el código
a cada oportunidad, nunca haré el código peor - Constantemente me aseguraré de alguien
pueda reemplazarme y que yo pueda
reemplazar a alguien más - Haré estimados que son honestos en magnitud
y precisión. No haré promesas sin certeza. - Nunca dejaré de aprender
y mejorando mis habilidades
Q&A
Gracias
@gaijinco
Lo que todo programador debe saber
By Carlos Obregón
Lo que todo programador debe saber
Una opinión sobre los conceptos, lenguajes y FW que todo programador, independiente de su área, debería saber
- 2,295