Top Banner
Técnicas y Herramientas para que la Computadora haga más y el Programador menos Lic. Hernán A. Wilkinson
109

Técnicas y herramientas para que la computadora haga más y el programador menos

Jan 16, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Técnicas y herramientas para que la computadora haga más y el programador menos

Técnicas y Herramientas para que la Computadora haga más y el Programador menos

Lic. Hernán A. Wilkinson

Page 2: Técnicas y herramientas para que la computadora haga más y el programador menos
Page 3: Técnicas y herramientas para que la computadora haga más y el programador menos

Gerente de Desarrollo en Mercap

Docente en UBA y UCA

Page 4: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Por qué ese Título?¿Qué significa?

4

Page 5: Técnicas y herramientas para que la computadora haga más y el programador menos

Se nos ocurrieron otros títulos atractivos cómo…

Page 6: Técnicas y herramientas para que la computadora haga más y el programador menos

¡Tips & Tricks de la Programación!

6

Page 7: Técnicas y herramientas para que la computadora haga más y el programador menos

¡El futuro de la programación!

7

Page 8: Técnicas y herramientas para que la computadora haga más y el programador menos

¡La solución a todos sus problemas!

8

Page 9: Técnicas y herramientas para que la computadora haga más y el programador menos

Algo más real…Técnicas y Herramientas…

9

Desarrolladas y mejoradas por Mercap

Page 10: Técnicas y herramientas para que la computadora haga más y el programador menos

En Mercap desarrollamos Productos (dominio financiero)

Tiempo de vida > 15 años Muy importante la calidad Muy importante la funcionalidad diferencial

Page 11: Técnicas y herramientas para que la computadora haga más y el programador menos

XTrade

12700 clases 710800 LOC Smalltalk

Equivale a 3 mill. Java aprox

¿Problemas Principales?

Page 12: Técnicas y herramientas para que la computadora haga más y el programador menos

Nuevos Requerimientos Funcionales Mejoras en el Diseño/Implementación Actual Rotación de Personal

Peter Naur Programming as a Theory Building NO QUEREMOS QUE SEA UN PROBLEMA

Evolución de Código

Page 13: Técnicas y herramientas para que la computadora haga más y el programador menos

No veremos problemas de

Performance

Espacio

Page 14: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué significa que la “Computadora haga más y el programador menos”?

14

Page 15: Técnicas y herramientas para que la computadora haga más y el programador menos

Como programadores…¿no tienen que hacer tareas…?

15

Page 16: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Repetitivas?

16

Page 17: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Tediosas?

17

Page 18: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Tareas que son siempre lo mismo…?

18

Page 19: Técnicas y herramientas para que la computadora haga más y el programador menos

Tareas muy importantes que nunca se hacen por falta de tiempo…

19

Page 20: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Cómo podemos salir de este embrollo?

20

Page 21: Técnicas y herramientas para que la computadora haga más y el programador menos

¡Lograr que la computadora trabaje por nosotros!

Para eso están… para hacer el trabajo “automatizable”

Page 22: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Cómo detectamos qué tareas son?

Page 23: Técnicas y herramientas para que la computadora haga más y el programador menos

Douglas Hofstadter

23

Page 24: Técnicas y herramientas para que la computadora haga más y el programador menos

podemos “salir del sistema”

24

Somos inteligentes porque

“reflexionar” sobre él

Page 25: Técnicas y herramientas para que la computadora haga más y el programador menos

25

Konrad Lorenz (nobel 1973)

Page 26: Técnicas y herramientas para que la computadora haga más y el programador menos

26

En su libro “Los ocho pecados mortales de la humanidad

civilizada”

“si no reflexinamos…”

“viviremos una eterna niñez…”

Page 27: Técnicas y herramientas para que la computadora haga más y el programador menos

27

Alan Kay (Turing Award 2003)

Page 28: Técnicas y herramientas para que la computadora haga más y el programador menos

28

Pero debemos hacerlos con “threshold above normal”

“no reinventar la rueda pinchada”

Page 29: Técnicas y herramientas para que la computadora haga más y el programador menos

29

¡Debemos hacerlo conociendo nuestras raíces, nuestra historia!

LISP – ¡50 años!

Para no cometer los mismos errores, para estar por arriba de la media

Page 30: Técnicas y herramientas para que la computadora haga más y el programador menos

Paremos la pelota

¿Qué tareas puedo automatizar?

¿Qué tareas son repetitivas, propensas a error, etc?

Page 31: Técnicas y herramientas para que la computadora haga más y el programador menos

Qué vamos a ver

Testing Automatizado Objetos Auto-Defendibles Automatización de Inspección de Código Automatización de Excepciones a la regla Asegurar Calidad en Puntos Críticos Integrar Código Automáticamente Migrar Datos (objetos) Automáticamente

Page 32: Técnicas y herramientas para que la computadora haga más y el programador menos

Test Driven Development

Page 33: Técnicas y herramientas para que la computadora haga más y el programador menos

Seguro que todos lo conocen…

Page 34: Técnicas y herramientas para que la computadora haga más y el programador menos

¡¡¡16100 Tests!!!

Corren en 7 minutos aprox

Page 35: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Para qué sirve?

Ayuda a tener confianza sobre los cambios a realizar

Delega en la computadora la verificación de lo que estamos haciendo

Los test son especificaciones de cómo debe funcionar el código

Page 36: Técnicas y herramientas para que la computadora haga más y el programador menos

Ayuda a…

Entender el problema a partir de ejemplos concretos

Concentrarse en el problema real Minimizar Acoplamiento

Page 37: Técnicas y herramientas para que la computadora haga más y el programador menos

Vamos a dar unos pasos más…

Page 38: Técnicas y herramientas para que la computadora haga más y el programador menos

38

Objetos Auto Defendibles, Reificación de Código y

Automatización de Inspección de Código

Page 39: Técnicas y herramientas para que la computadora haga más y el programador menos

Transacción de Compra

miCuenta (from) cuentaDelOtro (to)

Page 40: Técnicas y herramientas para que la computadora haga más y el programador menos

Transacción de Venta

miCuenta (to) cuentaDelOtro (from)

Page 41: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Cómo lo representamos?

aTransac

anAccount

anotherAcc

10 pesos

from

to

amount

Page 42: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Cómo sabemos si la transacción es una compra o venta?

¿Cómo sabemos el “tipo”?

Page 43: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Como sabemos el “tipo”?

aTransac

aOwnAcc

aThirdAcc

10 pesos

from

to

amount

aTransacaOwnAcc

aThirdAcc

10 pesos

from

to

amount

Compra Venta

typetype

Page 44: Técnicas y herramientas para que la computadora haga más y el programador menos

44

Solución: ¡Usemos un If!

Page 45: Técnicas y herramientas para que la computadora haga más y el programador menos

Típica implementación usando If

Transaction>>type

(fromAccount isThirdAccount and: [toAccount isOwnAccount ]) ifTrue: [^’Sell'].(fromAccount isOwnAccount and: [toAccount isThirdAccount]) ifTrue: [^’Buy'].

Page 46: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Para qué sirve el “tipo”?

Transacciones

Contador

Impresora

Page 47: Técnicas y herramientas para que la computadora haga más y el programador menos

47

journalEntry

transaction type = ‘Buy’ ifTrue: [ ^self buyJournalEntry ]. transaction type = ‘Sell’ ifTrue: [ ^self sellJournalEntry ].

voucher

transaction type = ‘Buy’ ifTrue: [ ^self buyVoucher]. transaction type = ‘Sell’ ifTrue: [ ^self sellVoucher].

Típico uso del “tipo” con if

Page 48: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué pasa si agregamos otro “tipo”?

Transferencia

Page 49: Técnicas y herramientas para que la computadora haga más y el programador menos

type

(fromAccount isThirdAccount and: [toAccount isOwnAccount ]) ifTrue: [^’Sell'].(fromAccount isOwnAccount and: [toAccount isThirdAccount]) ifTrue: [^’Buy'].(fromAccount isOwnAccount and: [toAccount isOwnAccount ]) ifTrue: [^‘Transfer'].

Agrego el nuevo caso

Típica implementación usando If

Page 50: Técnicas y herramientas para que la computadora haga más y el programador menos

voucher

transaction type = ‘Buy’ ifTrue: [ ^self buyVoucher]. transaction type = ‘Sell’ ifTrue: [ ^self sellVoucher].

50

journalEntry

transaction type = ‘Buy’ ifTrue: [ ^self buyJournalEntry ]. transaction type = ‘Sell’ ifTrue: [ ^self sellJournalEntry ]. transaction type = ‘Transfer’ ifTrue: [ ^self transferJournalEntry ].

¡En algún lugar nos vamos a olvidar de agregar el if!

Típico uso del “nuevo tipo” con if

Page 51: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Cuál es el Problema del if?

La computadora no decide ¡Lo hacemos nosotros! No hay Meta-Información

(información sobre las decisiones de diseño)

Page 52: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué tal si hacemos que los objetos lo resuelvan?

que la computadora haga más…y el programador menos

Page 53: Técnicas y herramientas para que la computadora haga más y el programador menos

Modelemos los Tipos de Transacciones

TransactionType-accepts: aTransaction -canHandle: aTransaction-typeOf: aTransaction

Buy-accepts: aTransaction -canHandle: aTransaction

Sell-accepts: aTransaction -canHandle: aTransaction

Page 54: Técnicas y herramientas para que la computadora haga más y el programador menos

Implementación usando Objetos

Transaction>>type

^TransactionType typeOf: self

Transaction>>type

(fromAccount isThirdAccount and: [toAccount isOwnAccount ]) ifTrue: [^’Sell'].(fromAccount isOwnAccount and: [toAccount isThirdAccount]) ifTrue: [^’Buy'].

Sell>>canHandle: aTrx

^aTrx fromAccount isThirdAccount and: [aTrx toAccount isOwnAccount ]

Buy>>canHandle: aTrx

^aTrx fromAccount isOwnAccount and: [aTrx toAccount isThirdAccount ]

Page 55: Técnicas y herramientas para que la computadora haga más y el programador menos

Usando el “tipo” con Objetos

Buy-accepts: aTransaction -canHandle: aTransaction

Sell-accepts: aTransaction -canHandle: aTransaction

canHandle: aTransaction canHandle: aTransaction

TransactionType-accepts: aTransaction -canHandle: aTransaction-typeOf: aTransaction

typeOf: aTransaction^aSell

^false ^true

Page 56: Técnicas y herramientas para que la computadora haga más y el programador menos

56

journalEntry

^transaction type accept: self

Usando el “tipo” con ObjetosjournalEntry

transaction type = ‘Buy’ ifTrue: [ ^self buyJournalEntry ]. transaction type = ‘Sell’ ifTrue: [ ^self sellJournalEntry ].

visitBuy

^self buyJournalEntry

visitSell

^self sellJournalEntry

Page 57: Técnicas y herramientas para que la computadora haga más y el programador menos

57

Usando el “tipo” con Objetos

journalEntry

aTrx

type^aSell

aSell

accept: selfvisitSell

^aSellJournalEntry voucher

aTrx

type^aSell

aBuy

accept: selfvisitBuy

^aBuyVoucher¡Son Visitors!

Page 58: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué ganamos?

Page 59: Técnicas y herramientas para que la computadora haga más y el programador menos

¡No hay más If!

¡Los tipos no son Strings, son Objetos!

Page 60: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué pasa ahora si agregamos Transferencia?

TransactionType-accepts: aTransaction -canHandle: aTransaction-typeOf: aTransaction

Buy-accepts: aTransaction -canHandle: aTransaction

Sell-accepts: aTransaction -canHandle: aTransaction

Transfer-accepts: aTransaction -canHandle: aTransaction

Page 61: Técnicas y herramientas para que la computadora haga más y el programador menos

61

Agregemos Transferencia

journalEntry

aTrx

type^aTransfer

aTransfer

accept: selfvisitTransfer

^aTransferJournalEntry

journalEntry

aTrx

type^aSell

aTransf

accept: selfvisitTransfer

^aTransferVoucher

¿Nos podemos olvidar de implementar visitTransfer?

Page 62: Técnicas y herramientas para que la computadora haga más y el programador menos

¡NO!

Lo avisa la Revisión Automática de Código

para Visitors

Page 63: Técnicas y herramientas para que la computadora haga más y el programador menos

Tests de Visitors

Page 64: Técnicas y herramientas para que la computadora haga más y el programador menos

Inspecciones Automáticas de Código

Naming conventions: Ortografía, Nombre de módulos, Nombre de Clases, etc.

Diseño: Clases abstractas sin variables de instancia

Arquitectura: Clases de test en aplicaciones de test, mock objects en

aplicaciones de test, inexistencia de referencias desde aplicaciones del modelo a aplicaciones de test, etc.

Implementación: Comentarios de código según convención, categorización de

mensajes, dónde debe estar implementado un mensaje, de dónde se debe enviar un mensaje, etc.

Page 65: Técnicas y herramientas para que la computadora haga más y el programador menos

Inspecciones Automáticas de Código

Implementación de Patrones Correcta implementación de Singleton y Visitor

Ambiente de Desarrollo Que todos estén usando los mismos directorios, los mismos

settings del ambiente, etc. Uso correcto de Frameworks

SUnit: Recursos que no referencien a tests, que los tests hagan assert, recursos no cíclicos, etc.

Dependecy Injection: Que todas las dependencias sean iniciliazadas correctamente

Code Coverage: Definición correcta de los métodos a excluir ETC…

Page 66: Técnicas y herramientas para que la computadora haga más y el programador menos

Inspecciónes automática de Código

Evita errores comúnes Ayuda a mantener consistente el modelo Controla los errores de programadores

nuevos Asegura calidad de

código

Page 67: Técnicas y herramientas para que la computadora haga más y el programador menos

Lo importante

Automatizar la auditoría de todas las desiciones que se tomenDiseño ImplementaciónArquitecturaNomenclaturaUso de otros modelosEtc…

340 chequeos

Page 68: Técnicas y herramientas para que la computadora haga más y el programador menos

Implementación de typeOf:Transaction>>type

^TransactionType typeOf: self

TransactionType >>typeOf: aTransaction

^self subclasses detect: [ :aClass | aClass canHandle: aTransaction ]

Reflexionemos un poco…

Page 69: Técnicas y herramientas para que la computadora haga más y el programador menos

Reflexionemos un poco…typeOf: aTransaction

^self subclasses detect: [ :aClass | aClass canHandle: aTransaction ]

typeOf: aTransaction | posibleTypes | posibleTypes := self subclasses select: [ :aClass | aClass canHandle: aTransaction ]. posibleTypes isEmpty ifTrue: [ self error: ‘Error de programación’ ].

^posibleTypes first

¿Qué pasa si más de un tipo corresponde a la transacción?

¿Qué pasa si ningún tipo corresponde a la transacción?

posibleTypes size >1 ifTrue: [ self error: ‘Error de programación ].

Page 70: Técnicas y herramientas para que la computadora haga más y el programador menos

Self Defense Objects

Los objetos se aseguran de ser utilizados correctamente

Page 71: Técnicas y herramientas para que la computadora haga más y el programador menos

Reflexionemos un poco más…

¿Hay que escribir siempre lo mismo?¿No es el mismo problema?

¿Necesitaremos hacer esto para otros casos?

typeOf: aTransaction | posibleTypes | posibleTypes := self subclasses select: [ :aClass | aClass canHandle: aTransaction ]. posibleTypes isEmpty ifTrue: [ self error: ‘Error de programación’ ]. posibleTypes size >1 ifTrue: [ self error: ‘Error de programación ].

^posibleTypes first for: aTransaction

Page 72: Técnicas y herramientas para que la computadora haga más y el programador menos

¡Reificar el código!typeOf: aTransaction | posibleTypes | posibleTypes := self subclasses select: [ :aClass | aClass canHandle: aTransaction ]. posibleTypes isEmpty ifTrue: [ self error: ‘Error de programación’ ]. posibleTypes size >1 ifTrue: [ self error: ‘Error de programación ].

^posibleTypes first for: aTransaction

SuitableClassSelector-value -for: aSuperClass

Page 73: Técnicas y herramientas para que la computadora haga más y el programador menos

Reflexionemos un poco más…

typeOf: aTransaction ^(SuitableClassSelector for: self) value for: aTransaction

typeOf: aMovie ^(SuitableClassSelector for: self) value for: aMovie

typeOf: aCar

^(SuitableClassSelector for: self) value for: aCar

TransactionType:

MovieType:

CarType:

etc…

Page 74: Técnicas y herramientas para que la computadora haga más y el programador menos

Usando el “tipo” con ObjetosBuy

-accepts: aTransaction -canHandle: aTransaction Sell

-accepts: aTransaction -canHandle: aTransaction

aSuitableClassFinder

value

aTransaction(sell)

canHandle: aTransaction canHandle: aTransaction

^Sell

TransactionType-accepts: aTransaction -canHandle: aTransaction-typeOf: aTransaction

typeOf: aTransaction^aSell

Transfer-accepts: aTransaction -canHandle: aTransaction

canHandle: aTransaction

^false ^true

^false

Page 75: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué logramos?

Creamos una nueva construcción “sintáctica” No puede haber “errores” al agregar nuevos

casos puesto que la computadora se encarga de verificarlo

Son objetos (meta), no texto. Podemos ver: Donde se usa Cuanto casos hay Testearlo una sola vez Etc.

Page 76: Técnicas y herramientas para que la computadora haga más y el programador menos

Recapitulemos

TDD Self Defense Objects Reificación de

Construciones Sintácticas Inspección Automática de

Código

Page 77: Técnicas y herramientas para que la computadora haga más y el programador menos

Automatizar las Excepciones a las Reglas de Validación de

Código

Page 78: Técnicas y herramientas para que la computadora haga más y el programador menos

Falsos Positivos

isEmpty

^self size = 0

Warning: No se debe usar “size = 0” sino “isEmpty”

¡Pero se está implementando “isEmpty”!

Se marca como “error esperado” y se puede seguir usando la herramienta

Page 79: Técnicas y herramientas para que la computadora haga más y el programador menos

Ejemplo (modelo open source)

expectedSmallLintFailures ^Array with: ( MCPExpectedSmallLintFailure unoptimizedToDoFailedClass: self failedMethod: 'initializeConnectors' asSymbol reasonDescription: 'No funciona bien con el #to:do: optimizado, ver comentarios en el metodo' definedBy: 'diegof')

expectedSmallLintFailures ^Array with: ( MCPExpectedSmallLintFailure utilityMethodsFailedClass: self failedMethod: #factorForSameYearFrom:to: reasonDescription: 'Por factorizacion‘ definedBy: 'hernan')

Hay un test que verifica que el usuario es válido!

Page 80: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué ganamos?

Evitar Falsos Positivos constantes que desalientan el uso de la automatización de inspección de código

Se debe asegurar que no haya “errores esperados” que no aplican

Page 81: Técnicas y herramientas para que la computadora haga más y el programador menos

Asegurar Calidad en Puntos Críticos

Page 82: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Cómo?

Asegurar 100% de cobertura de test

Asegurar que no hayan “errores”

Page 83: Técnicas y herramientas para que la computadora haga más y el programador menos

Módulo Estable

Módulo Estable

Depende de Depende de

Módulo Estable Módulo Estable

¡100 % de Cobertura!¡No hay errores!

Módulo No Estable Módulo No Estable

Page 84: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué ganamos?

Test que aseguran que los modulos estables tienen un 100 % de cobertura

No hay errores (detectables automáticamente) Aseguramos calidad para los módulos core Delegar en la computadora dicha verificación

Page 85: Técnicas y herramientas para que la computadora haga más y el programador menos

Integración de Código

Page 86: Técnicas y herramientas para que la computadora haga más y el programador menos

Integración Manual

Page 87: Técnicas y herramientas para que la computadora haga más y el programador menos

¡Integración Automática!

Ejemplo

Page 88: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué ganamos?

Proceso automático No hay posibilidad de errorEs más rápido que hacerlo manualmente

Pasamos de estas varios días integrando a hacerlo en menos de media hora

Page 89: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qué pasa con los refactorings?

ClassA ClassB

m1^ClassA new

Renombra

Error de Integración

Tesis de Diego Tubello para integrar refactorings

automáticamente

Linea Base

Linea A

Linea B

Page 90: Técnicas y herramientas para que la computadora haga más y el programador menos

Migración de Datos

Page 91: Técnicas y herramientas para que la computadora haga más y el programador menos

Versión inicial de Stock

Stock (versión 1)

acindar ‘acindar’name

Page 92: Técnicas y herramientas para que la computadora haga más y el programador menos

Segunda Versión de Stock

Stock (versión 1)

acindar ‘acindar’name

Stock (versión 2)

acindar ‘acindar’name

dollar

issueCurrency

Page 93: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Por qué hay que migrar datos?

¿Por qué cambia el tipo de un campo? ¿Por qué cambia la estructura de una

tabla? ¿Por qué se agregan nuevas tablas?

¡¡POR QUE EVOLUCIONA EL CÓDIGO!! Migrar código y datos!

Page 94: Técnicas y herramientas para que la computadora haga más y el programador menos

Migración de Objetos(en vez de migración de datos)

Page 95: Técnicas y herramientas para que la computadora haga más y el programador menos

No sería bueno una herramienta que…

Nos avise cuando agregamos/sacamos una variable de instancia?

Nos diga cuando cambia una jerarquía? Modifique el código de una nueva

versión? ¿No sería bueno que la computadora se

encarge de resolver este problema?

Page 96: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Para qué?

Única línea de Producto

Page 97: Técnicas y herramientas para que la computadora haga más y el programador menos

¿Qúe ganamos?

Cambio automatizado de versiones Nos permite tener una única línea de

productos Permite que los clientes tengan la última

versión

Page 98: Técnicas y herramientas para que la computadora haga más y el programador menos

98

¡Conclusiones!

Page 99: Técnicas y herramientas para que la computadora haga más y el programador menos

99

Camino recorrido Testing automatizado Código auto defendible Inspecciones automátizadas Reificación de Código Excepciones a la regla Asegurar la calidad de puntos críticos Integración de Código Migración de Objetos

Page 100: Técnicas y herramientas para que la computadora haga más y el programador menos

100

Porque en Mercap tenemos…

¿Por qué lo logramos?

Page 101: Técnicas y herramientas para que la computadora haga más y el programador menos

101

Podemos “Salir del Sistema” y Reflexionar (como dice Hofstadter)

Page 102: Técnicas y herramientas para que la computadora haga más y el programador menos

102

Se generó un ambiente “adulto” gracias al “Feedback”

(como propone Lorenz)

Page 103: Técnicas y herramientas para que la computadora haga más y el programador menos

103

Porque usamos Herramientas

estables, maduras

que permiten hacer Meta-programación(como propone Alan

Kay)

Page 104: Técnicas y herramientas para que la computadora haga más y el programador menos

Ideas de Tesis… Change Model para Objetos Mejor modelo de Migración de Objetos Interfaz de Usuario declarativa …además de las que ya se están haciendo

cómoRefactorings de TraitsSmallLint para TraitsReificación de Meta-Ejecución

Page 105: Técnicas y herramientas para que la computadora haga más y el programador menos

13-15 Noviembre Gratis! M. Oca 745 - UAI

Page 106: Técnicas y herramientas para que la computadora haga más y el programador menos

Queremos agredecer a la competencia de esta charla…

Page 107: Técnicas y herramientas para que la computadora haga más y el programador menos

Una lástima no haber consegido los sponsors…

Page 108: Técnicas y herramientas para que la computadora haga más y el programador menos

108

Preguntas y Comentarios

Email: [email protected]: http://objectmodels.blogspot.com/

Page 109: Técnicas y herramientas para que la computadora haga más y el programador menos

109