SlideShare a Scribd company logo
1 of 70
La Influencia de Java en 
Nuestra Manera de Pensar 
Hernán Wilkinson 
Twitter: @HernanWilkinson 
Blog: objectmodels.blogspot.com 
www.10pines.com 
agile software development & services
The world “we live” in … ?
The world “we live” in … ?
The world “we live” in … ?
The world “we live” in … ?
Bret Victor - Thinking the unthinkable
Language <-> Thinking
What we can not talk about… 
we can not think about 
(or it is difficult...)
Do not Insist on English
Aimara: Pasado y Futuro 
(nayra) (qhipa)
What is the relationship with 
Programming Languages? 
(K. Iverson: “Notation as a tool of thought” 
1979 ACM Turing Award)
If a programming 
language does not 
allow me to “TALK” 
(write) about certain 
things 
… 
Then I can not THINK 
about certain 
solutions
Let’s see 
List<Customer> selectedCustomers = new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add (customer); 
return selectedCustomers;
Let’s see 
List<Customer> selectedCustomers = new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add (customer); 
return selectedCustomers; 
List<Account> selectedAccounts = new ArrayList<Account> (); 
for (Account account: accounts) 
if (account.isOverdraw()) 
selectedAccounts.add(account); 
return selectedAccount;
Let’s see 
List<Customer> selectedCustomers = new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add (customer); 
return selectedCustomers; 
List<Account> selectedAccounts = new ArrayList<Account> (); 
for (Account account: accounts) 
if (account.isOverdraw()) 
selectedAccounts.add(account); 
return selectedAccount; 
What is the problem?
We have repeated code! 
List<Customer> selectedCustomers = new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add (customer); 
return selectedCustomers; 
List<Account> selectedAccounts = new ArrayList<Account> (); 
for (Account account: accounts) 
if (account.isOverdraw()) 
selectedAccounts.add(account); 
return selectedAccount;
Code != Text
How do we remove it?
Technique: 
1. “Contextualize-Copy” the repeated 
code to some “place” 
2. Parameterize what changes 
3. NAME IT!!! 
4. Use it :-)
Copy the repeated code to some place 
List<Customer> selectedCustomers = 
new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add(customer); 
return selectedCustomers; 
class Collection<T> { 
public Collection<T> <<NAME>> (?) { 
List<T> selected = new ArrayList<T> (); 
for (T anObject: this ) 
if ( ) 
selected.add (anObject); 
return selected: } 
this 
List<Account> selectedAccounts = new 
ArrayList<Account> (); 
for (Account account: accounts) 
if (account.isOverdraw()) 
selectedAccounts.add(account); 
return selectedAccount;
Parameterize what changes 
List<Customer> selectedCustomers = new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add (customer); 
return selectedCustomers; 
List<Account> selectedAccounts = new ArrayList<Account> (); 
for (Account account: accounts) 
if (account.isOverdraw()) 
selectedAccounts.add(account); 
return selectedAccount; 
How do we do it?
An object that represents “code”
Copy the repeated code to some place 
List<Customer> selectedCustomers = 
new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add(customer); 
return selectedCustomers; 
class Collection<T> { 
public Collection<T> <<NAME>> (Closure aClosure) { 
List<T> selected = new ArrayList<T> (); 
for (T anObject: this ) 
if ( ) 
selected.add (anObject); 
return selected: } 
this 
List<Account> selectedAccounts = new 
ArrayList<Account> (); 
for (Account account: accounts) 
if (account.isOverdraw()) 
selectedAccounts.add(account); 
return selectedAccount; 
aClosure.execute(anObject)
class Collection<T> { 
public Collection<T> select (Closure aClosure) { 
List<T> selected = new ArrayList<T> (); 
for (T anObject: this ) 
if ( ) 
selected.add (anObject); 
return selected: } 
self 
NAME IT! 
List<Customer> selectedCustomers = 
new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add(customer); 
return selectedCustomers; 
List<Account> selectedAccounts = new 
ArrayList<Account> (); 
for (Account account: accounts) 
if (account.isOverdraw()) 
selectedAccounts.add(account); 
return selectedAccount; 
aClosure.execute(anObject) 
The most difficult 
part because it 
means that we 
understood the 
repeated code 
meaning
List<Customer> selectedCustomers = new ArrayList<Customer> (); 
for (Customer customer: customers) 
if (customer.nameStarsWith(“H”)) 
selectedCustomers.add (customer); 
return selectedCustomers; 
cutomers.select( customer -> customer.nameStartsWith(“H”) ) 
accounts.select( account -> account.isOverdraw() ) 
List<Account> selectedAccounts = new ArrayList<Account> (); 
for (Account account: accounts) 
if (account.isOverdraw()) 
selectedAccounts.add(account); 
return selectedAccount;
Why not an Anonymous Class? 
1. Sintax: 
cutomers.select( customer -> customber.nameStartsWith(“H”) ) 
customers.select( new Condition<Customer> () { 
public boolean value (Customer aCustomer) { 
return aCustomer.nameStartsWith(“H”); }}); 
Which one reads better? 
2. Binding problems…
What did we gain? 
1. Few words  Simplicity, Easier to 
understand, read, remember, etc. 
Less bugs! 
2. We created a new “abstraction”: 
select (filter in Java 8) 
3. … and we removed duplicated 
code!!
Now… let’s do some reflection 
1. Why didn’t we see the 
“duplicated code”? 
2. Why didn’t we came 
with a solution?
Why didn’t we see the “duplicated 
code” 
1. Because we are use to that code (is 
the programming language the 
problem or us?) 
2. Because there is no “concept” to 
remove it
Why didn’t we came with a solution? 
1. Because the programming language 
does not provide us with a 
“concept” to think about a solution!
Try { 
… do something 
fail() 
} catch (Exception e) { 
assertTrue (…. ) } 
self 
TDD: Test for exceptions 
should: [ do something ] 
raise: Exception 
withExceptionDo: [ :e | self assert: …. ] (Smallalk)
…and much much 
more…. 
Imagine how your 
designs would be if 
you could use closures 
You can create your own control flow 
“sintax” 
Further reading: LAMBDA The Ultimate…
Meta-Conclusion 
Object = ¿Data + Code?
Meta-Conclusion 
Object = ¿Data + Code? 
If you think so, you don´t understand OO yet
Mete-Conclusion 
Data is an Object 
Code is an Object 
An Object is a “superior” 
concept that unifies data and 
code
Hamming / Closure 
If there are certain objects that can not be 
created in some languages … 
… and given the solutions provided by some 
programming languages… 
The statement: “There are design solutions 
that are unthinkable in some 
programming languages” 
¿Does it surprise you?
Java 8 
Lambda != Closure 
Examples: 
aList.forEach( ... ) 
aList.stream().filter( ... ) 
aList.stream().map( ... ) 
etc
What is the problem?
No If!
Now… let’s do some reflection 
1. Why didn’t we see the 
“polymorphic message”? 
2. Why didn’t we came 
with a right solution?
Why did we not see the 
“polymorphic message”? 
 Because 'if' as a reserved word is a 
“primitive construction”, there is 
nothing behind it 
 Therefore it does not make us think 
in polymorphism
If as a message
A programming language is its 
creator's state of knowledge
timeToRun
timeToRun
timeToRun
How do we “generalize” it?
timeToRun 
LambdaHelper??
timeToRun
Extending a Language!
How can we add specific behavior to 
an object? 
Let's see an example
Now… let’s do some reflection 
1. What are the solutions 
we lack due to limited 
meta programming? 
2. What do we loose if we 
do not have a meta-circular 
language?
How do we learn a new word?
Do we: 
1. Stop our brain 
2. “edit" a new definition in our 
dictionary 
3. “Compile” the new definition 
4. Restart our brain?
NO!! 
Why do we have to do it with our 
programs?
Can our programs “change while 
running”? 
Can our programs “learn” as we learn?
Yes, they can!... If they are 
METACIRCULAR 
Apply 
Eval
Let’s see a problem: 
Can you make a proxy “learn” about its 
proxee as it is used?
If we don’t have meta-circular 
languages, then we can not think 
about solutions that are natural in 
our daily lives!!
Let’s think again… 
Are these concepts new?
Lisp 
John McCarthy 
Alan Kay 
“We must know our history 
if we don’t want to reinvent 
… not only the tire, but a 
a flat tire”
And more… 
Classes are modules 
Static is not OO 
Misleading words: 
this 
extends 
Unnecessary implementation complexity 
filter, map, etc.
Conclusions 
 Do not accept languages without 
Closures 
 Do not accept languages without 
good meta-programming 
 Create your own extensions! 
 Liberate yourself from the 
programming language
Conclusions 
 Learn other programming 
languages 
Lisp/Scheme 
 Smalltalk 
Forth and more... 
 Learn our history
"The Humble Programmer” 
E. Dijkstra 
“The tools we are trying to use and the 
language or notation we are using to 
express or record our thoughts, are the 
major factors determining what we can 
think or express at all!"
Alan Kay 
"Java and C++ make you think that 
the new ideas are like the old 
ones. Java is the most distressing 
thing to hit computing since MS-DOS.“
Questions?
Muchas gracias! 
agile software development & services 
info@10pines.com 
www.10Pines.com 
twitter: @10Pines 
Argentina 
Tel.: +54 (11) 6091-3125 
Alem 693, 5B 
(1001) Buenos Aires

More Related Content

Viewers also liked

Encadenamiento de refactorings para generar cambios Agiles de Diseño
Encadenamiento de refactorings para generar cambios Agiles de DiseñoEncadenamiento de refactorings para generar cambios Agiles de Diseño
Encadenamiento de refactorings para generar cambios Agiles de DiseñoHernan Wilkinson
 
Refactoring a Company - 2nd Presentation
Refactoring a Company - 2nd PresentationRefactoring a Company - 2nd Presentation
Refactoring a Company - 2nd PresentationHernan Wilkinson
 
The ten commandments of TDD
The ten commandments of TDDThe ten commandments of TDD
The ten commandments of TDDHernan Wilkinson
 
Arithmetic with measures on dynamically typed object oriented languages
Arithmetic with measures on dynamically typed object oriented languagesArithmetic with measures on dynamically typed object oriented languages
Arithmetic with measures on dynamically typed object oriented languagesHernan Wilkinson
 
Objects: The Misunderstood Paradigm
Objects: The Misunderstood ParadigmObjects: The Misunderstood Paradigm
Objects: The Misunderstood ParadigmHernan Wilkinson
 
Confianza+Participación+Transparencia= Refactorizando la empresa
Confianza+Participación+Transparencia= Refactorizando la empresaConfianza+Participación+Transparencia= Refactorizando la empresa
Confianza+Participación+Transparencia= Refactorizando la empresaHernan Wilkinson
 
Como hacer tdd y no morir en el intento
Como hacer tdd y no morir en el intentoComo hacer tdd y no morir en el intento
Como hacer tdd y no morir en el intentoHernan Wilkinson
 
A new object oriented model of the gregorian calendar
A new object oriented model of the gregorian calendarA new object oriented model of the gregorian calendar
A new object oriented model of the gregorian calendarHernan Wilkinson
 
Growing an open participative horizontal and based on trust company
Growing an open participative horizontal and based on trust companyGrowing an open participative horizontal and based on trust company
Growing an open participative horizontal and based on trust companyHernan Wilkinson
 
Augmenting Smalltalk Syntax
Augmenting Smalltalk SyntaxAugmenting Smalltalk Syntax
Augmenting Smalltalk SyntaxHernan Wilkinson
 
Obejct Oriented SCM - OOSCM
Obejct Oriented SCM - OOSCMObejct Oriented SCM - OOSCM
Obejct Oriented SCM - OOSCMHernan Wilkinson
 
Facilitadores asombrosos: logrando mejores conversaciones e interacciones
Facilitadores asombrosos: logrando mejores conversaciones e interaccionesFacilitadores asombrosos: logrando mejores conversaciones e interacciones
Facilitadores asombrosos: logrando mejores conversaciones e interaccionesJuliana Betancur
 
Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...Hernan Wilkinson
 
Como escribir buenos tests al hacer TDD
Como escribir buenos tests al hacer TDDComo escribir buenos tests al hacer TDD
Como escribir buenos tests al hacer TDDHernan Wilkinson
 
Desarrollando sistemas con metodologías y técnicas agiles
Desarrollando sistemas con metodologías y técnicas agilesDesarrollando sistemas con metodologías y técnicas agiles
Desarrollando sistemas con metodologías y técnicas agilesHernan Wilkinson
 
Introducción a Agile y Scrum
Introducción a Agile y ScrumIntroducción a Agile y Scrum
Introducción a Agile y ScrumJohnny Ordóñez
 
Los diez mandamientos de TDD
Los diez mandamientos de TDDLos diez mandamientos de TDD
Los diez mandamientos de TDDHernan Wilkinson
 

Viewers also liked (20)

Tdd on the rocks
Tdd on the rocks Tdd on the rocks
Tdd on the rocks
 
Tdd con Angular y jasmine
Tdd con Angular y jasmineTdd con Angular y jasmine
Tdd con Angular y jasmine
 
Encadenamiento de refactorings para generar cambios Agiles de Diseño
Encadenamiento de refactorings para generar cambios Agiles de DiseñoEncadenamiento de refactorings para generar cambios Agiles de Diseño
Encadenamiento de refactorings para generar cambios Agiles de Diseño
 
Refactoring a Company - 2nd Presentation
Refactoring a Company - 2nd PresentationRefactoring a Company - 2nd Presentation
Refactoring a Company - 2nd Presentation
 
The ten commandments of TDD
The ten commandments of TDDThe ten commandments of TDD
The ten commandments of TDD
 
Arithmetic with measures on dynamically typed object oriented languages
Arithmetic with measures on dynamically typed object oriented languagesArithmetic with measures on dynamically typed object oriented languages
Arithmetic with measures on dynamically typed object oriented languages
 
Objects: The Misunderstood Paradigm
Objects: The Misunderstood ParadigmObjects: The Misunderstood Paradigm
Objects: The Misunderstood Paradigm
 
Confianza+Participación+Transparencia= Refactorizando la empresa
Confianza+Participación+Transparencia= Refactorizando la empresaConfianza+Participación+Transparencia= Refactorizando la empresa
Confianza+Participación+Transparencia= Refactorizando la empresa
 
Como hacer tdd y no morir en el intento
Como hacer tdd y no morir en el intentoComo hacer tdd y no morir en el intento
Como hacer tdd y no morir en el intento
 
A new object oriented model of the gregorian calendar
A new object oriented model of the gregorian calendarA new object oriented model of the gregorian calendar
A new object oriented model of the gregorian calendar
 
Growing an open participative horizontal and based on trust company
Growing an open participative horizontal and based on trust companyGrowing an open participative horizontal and based on trust company
Growing an open participative horizontal and based on trust company
 
Augmenting Smalltalk Syntax
Augmenting Smalltalk SyntaxAugmenting Smalltalk Syntax
Augmenting Smalltalk Syntax
 
Obejct Oriented SCM - OOSCM
Obejct Oriented SCM - OOSCMObejct Oriented SCM - OOSCM
Obejct Oriented SCM - OOSCM
 
Facilitadores asombrosos: logrando mejores conversaciones e interacciones
Facilitadores asombrosos: logrando mejores conversaciones e interaccionesFacilitadores asombrosos: logrando mejores conversaciones e interacciones
Facilitadores asombrosos: logrando mejores conversaciones e interacciones
 
Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...
 
Metaprogramacion
MetaprogramacionMetaprogramacion
Metaprogramacion
 
Como escribir buenos tests al hacer TDD
Como escribir buenos tests al hacer TDDComo escribir buenos tests al hacer TDD
Como escribir buenos tests al hacer TDD
 
Desarrollando sistemas con metodologías y técnicas agiles
Desarrollando sistemas con metodologías y técnicas agilesDesarrollando sistemas con metodologías y técnicas agiles
Desarrollando sistemas con metodologías y técnicas agiles
 
Introducción a Agile y Scrum
Introducción a Agile y ScrumIntroducción a Agile y Scrum
Introducción a Agile y Scrum
 
Los diez mandamientos de TDD
Los diez mandamientos de TDDLos diez mandamientos de TDD
Los diez mandamientos de TDD
 

Similar to Cómo Java afecta nuestros Diseños

Avoiding to Reinvent the flat tire
Avoiding to Reinvent the flat tireAvoiding to Reinvent the flat tire
Avoiding to Reinvent the flat tireHernan Wilkinson
 
The Technical Debt of Programming Languages
The Technical Debt of Programming LanguagesThe Technical Debt of Programming Languages
The Technical Debt of Programming LanguagesHernan Wilkinson
 
Types Working for You, Not Against You
Types Working for You, Not Against YouTypes Working for You, Not Against You
Types Working for You, Not Against YouC4Media
 
lec_4_data_structures_and_algorithm_analysis.ppt
lec_4_data_structures_and_algorithm_analysis.pptlec_4_data_structures_and_algorithm_analysis.ppt
lec_4_data_structures_and_algorithm_analysis.pptSourabhPal46
 
lec_4_data_structures_and_algorithm_analysis.ppt
lec_4_data_structures_and_algorithm_analysis.pptlec_4_data_structures_and_algorithm_analysis.ppt
lec_4_data_structures_and_algorithm_analysis.pptMard Geer
 
Beyond the Style Guides
Beyond the Style GuidesBeyond the Style Guides
Beyond the Style GuidesMosky Liu
 
Dsm as theory building
Dsm as theory buildingDsm as theory building
Dsm as theory buildingClarkTony
 
Data Structures- Part1 overview and review
Data Structures- Part1 overview and reviewData Structures- Part1 overview and review
Data Structures- Part1 overview and reviewAbdullah Al-hazmy
 
Beyond JavaScript Frameworks: Writing Reliable Web Apps With Elm - Erik Wende...
Beyond JavaScript Frameworks: Writing Reliable Web Apps With Elm - Erik Wende...Beyond JavaScript Frameworks: Writing Reliable Web Apps With Elm - Erik Wende...
Beyond JavaScript Frameworks: Writing Reliable Web Apps With Elm - Erik Wende...Codemotion
 
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...Codemotion
 
Tools for the Toolmakers
Tools for the ToolmakersTools for the Toolmakers
Tools for the ToolmakersCaleb Callaway
 
The Ring programming language version 1.10 book - Part 100 of 212
The Ring programming language version 1.10 book - Part 100 of 212The Ring programming language version 1.10 book - Part 100 of 212
The Ring programming language version 1.10 book - Part 100 of 212Mahmoud Samir Fayed
 
Text classification-php-v4
Text classification-php-v4Text classification-php-v4
Text classification-php-v4Glenn De Backer
 
C++programing
C++programingC++programing
C++programingrmvvr143
 
CLR Exception Handing And Memory Management
CLR Exception Handing And Memory ManagementCLR Exception Handing And Memory Management
CLR Exception Handing And Memory ManagementShiny Zhu
 

Similar to Cómo Java afecta nuestros Diseños (20)

Avoiding to Reinvent the flat tire
Avoiding to Reinvent the flat tireAvoiding to Reinvent the flat tire
Avoiding to Reinvent the flat tire
 
The Technical Debt of Programming Languages
The Technical Debt of Programming LanguagesThe Technical Debt of Programming Languages
The Technical Debt of Programming Languages
 
Types Working for You, Not Against You
Types Working for You, Not Against YouTypes Working for You, Not Against You
Types Working for You, Not Against You
 
lec_4_data_structures_and_algorithm_analysis.ppt
lec_4_data_structures_and_algorithm_analysis.pptlec_4_data_structures_and_algorithm_analysis.ppt
lec_4_data_structures_and_algorithm_analysis.ppt
 
lec_4_data_structures_and_algorithm_analysis.ppt
lec_4_data_structures_and_algorithm_analysis.pptlec_4_data_structures_and_algorithm_analysis.ppt
lec_4_data_structures_and_algorithm_analysis.ppt
 
Beyond the Style Guides
Beyond the Style GuidesBeyond the Style Guides
Beyond the Style Guides
 
Dsm as theory building
Dsm as theory buildingDsm as theory building
Dsm as theory building
 
BDD Primer
BDD PrimerBDD Primer
BDD Primer
 
Deck 6-456 (1)
Deck 6-456 (1)Deck 6-456 (1)
Deck 6-456 (1)
 
Data Structures- Part1 overview and review
Data Structures- Part1 overview and reviewData Structures- Part1 overview and review
Data Structures- Part1 overview and review
 
Beyond JavaScript Frameworks: Writing Reliable Web Apps With Elm - Erik Wende...
Beyond JavaScript Frameworks: Writing Reliable Web Apps With Elm - Erik Wende...Beyond JavaScript Frameworks: Writing Reliable Web Apps With Elm - Erik Wende...
Beyond JavaScript Frameworks: Writing Reliable Web Apps With Elm - Erik Wende...
 
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
 
Tools for the Toolmakers
Tools for the ToolmakersTools for the Toolmakers
Tools for the Toolmakers
 
Legacy is Good
Legacy is GoodLegacy is Good
Legacy is Good
 
The Ring programming language version 1.10 book - Part 100 of 212
The Ring programming language version 1.10 book - Part 100 of 212The Ring programming language version 1.10 book - Part 100 of 212
The Ring programming language version 1.10 book - Part 100 of 212
 
Oo ps exam answer2
Oo ps exam answer2Oo ps exam answer2
Oo ps exam answer2
 
Text classification-php-v4
Text classification-php-v4Text classification-php-v4
Text classification-php-v4
 
C++programing
C++programingC++programing
C++programing
 
C++programing
C++programingC++programing
C++programing
 
CLR Exception Handing And Memory Management
CLR Exception Handing And Memory ManagementCLR Exception Handing And Memory Management
CLR Exception Handing And Memory Management
 

More from Hernan Wilkinson

Hacia una síntesis de diseño a partir de entender qué es modelar con software
Hacia una síntesis de diseño a partir de entender qué es modelar con softwareHacia una síntesis de diseño a partir de entender qué es modelar con software
Hacia una síntesis de diseño a partir de entender qué es modelar con softwareHernan Wilkinson
 
Live Typing - California Smalltalkers
Live Typing - California SmalltalkersLive Typing - California Smalltalkers
Live Typing - California SmalltalkersHernan Wilkinson
 
Buenos Aires vs. (London vs. Chicago) Agiles 2020
Buenos Aires vs. (London vs. Chicago) Agiles 2020Buenos Aires vs. (London vs. Chicago) Agiles 2020
Buenos Aires vs. (London vs. Chicago) Agiles 2020Hernan Wilkinson
 
LiveTyping - Anotación automática de tipos para lenguajes dinámicos
LiveTyping - Anotación automática de tipos para lenguajes dinámicosLiveTyping - Anotación automática de tipos para lenguajes dinámicos
LiveTyping - Anotación automática de tipos para lenguajes dinámicosHernan Wilkinson
 
LiveTyping: Update and What is next
LiveTyping: Update and What is nextLiveTyping: Update and What is next
LiveTyping: Update and What is nextHernan Wilkinson
 
Cuis smalltalk past present and future
Cuis smalltalk past present and futureCuis smalltalk past present and future
Cuis smalltalk past present and futureHernan Wilkinson
 
Live Typing - Automatic Type Annotation that improves the Programming eXperie...
Live Typing- Automatic Type Annotation that improves the Programming eXperie...Live Typing- Automatic Type Annotation that improves the Programming eXperie...
Live Typing - Automatic Type Annotation that improves the Programming eXperie...Hernan Wilkinson
 
El Desarrollo de Software como debería Ser - PyConAr 2018
El Desarrollo de Software como debería Ser - PyConAr 2018El Desarrollo de Software como debería Ser - PyConAr 2018
El Desarrollo de Software como debería Ser - PyConAr 2018Hernan Wilkinson
 
Lessons Learned Implementing Refactorings
Lessons Learned Implementing RefactoringsLessons Learned Implementing Refactorings
Lessons Learned Implementing RefactoringsHernan Wilkinson
 
El Desarrollo de Software como debería Ser - Nerdear.la 2018
El Desarrollo de Software como debería Ser - Nerdear.la 2018El Desarrollo de Software como debería Ser - Nerdear.la 2018
El Desarrollo de Software como debería Ser - Nerdear.la 2018Hernan Wilkinson
 
El Desarrollo de Software como debería Ser
El Desarrollo de Software como debería SerEl Desarrollo de Software como debería Ser
El Desarrollo de Software como debería SerHernan Wilkinson
 
Go/Ruby/Java: What's next?
Go/Ruby/Java: What's next?Go/Ruby/Java: What's next?
Go/Ruby/Java: What's next?Hernan Wilkinson
 
Exceptions: Why, When, How and Where!
Exceptions: Why, When, How and Where!Exceptions: Why, When, How and Where!
Exceptions: Why, When, How and Where!Hernan Wilkinson
 

More from Hernan Wilkinson (17)

Hacia una síntesis de diseño a partir de entender qué es modelar con software
Hacia una síntesis de diseño a partir de entender qué es modelar con softwareHacia una síntesis de diseño a partir de entender qué es modelar con software
Hacia una síntesis de diseño a partir de entender qué es modelar con software
 
Live Typing - California Smalltalkers
Live Typing - California SmalltalkersLive Typing - California Smalltalkers
Live Typing - California Smalltalkers
 
Buenos Aires vs. (London vs. Chicago) Agiles 2020
Buenos Aires vs. (London vs. Chicago) Agiles 2020Buenos Aires vs. (London vs. Chicago) Agiles 2020
Buenos Aires vs. (London vs. Chicago) Agiles 2020
 
LiveTyping - Anotación automática de tipos para lenguajes dinámicos
LiveTyping - Anotación automática de tipos para lenguajes dinámicosLiveTyping - Anotación automática de tipos para lenguajes dinámicos
LiveTyping - Anotación automática de tipos para lenguajes dinámicos
 
LiveTyping: Update and What is next
LiveTyping: Update and What is nextLiveTyping: Update and What is next
LiveTyping: Update and What is next
 
Cuis smalltalk past present and future
Cuis smalltalk past present and futureCuis smalltalk past present and future
Cuis smalltalk past present and future
 
Live Typing - Automatic Type Annotation that improves the Programming eXperie...
Live Typing- Automatic Type Annotation that improves the Programming eXperie...Live Typing- Automatic Type Annotation that improves the Programming eXperie...
Live Typing - Automatic Type Annotation that improves the Programming eXperie...
 
El Desarrollo de Software como debería Ser - PyConAr 2018
El Desarrollo de Software como debería Ser - PyConAr 2018El Desarrollo de Software como debería Ser - PyConAr 2018
El Desarrollo de Software como debería Ser - PyConAr 2018
 
Lessons Learned Implementing Refactorings
Lessons Learned Implementing RefactoringsLessons Learned Implementing Refactorings
Lessons Learned Implementing Refactorings
 
Dynamic Type Information
Dynamic Type InformationDynamic Type Information
Dynamic Type Information
 
El Desarrollo de Software como debería Ser - Nerdear.la 2018
El Desarrollo de Software como debería Ser - Nerdear.la 2018El Desarrollo de Software como debería Ser - Nerdear.la 2018
El Desarrollo de Software como debería Ser - Nerdear.la 2018
 
El Desarrollo de Software como debería Ser
El Desarrollo de Software como debería SerEl Desarrollo de Software como debería Ser
El Desarrollo de Software como debería Ser
 
TDD & Refactoring
TDD & RefactoringTDD & Refactoring
TDD & Refactoring
 
Go/Ruby/Java: What's next?
Go/Ruby/Java: What's next?Go/Ruby/Java: What's next?
Go/Ruby/Java: What's next?
 
Exceptions: Why, When, How and Where!
Exceptions: Why, When, How and Where!Exceptions: Why, When, How and Where!
Exceptions: Why, When, How and Where!
 
CuisUniversity
CuisUniversityCuisUniversity
CuisUniversity
 
Oop is not Dead
Oop is not DeadOop is not Dead
Oop is not Dead
 

Recently uploaded

Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number SystemsJheuzeDellosa
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Intelisync
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyFrank van der Linden
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...aditisharan08
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 

Recently uploaded (20)

Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number Systems
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Exploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the ProcessExploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the Process
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The Ugly
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 

Cómo Java afecta nuestros Diseños

  • 1. La Influencia de Java en Nuestra Manera de Pensar Hernán Wilkinson Twitter: @HernanWilkinson Blog: objectmodels.blogspot.com www.10pines.com agile software development & services
  • 2. The world “we live” in … ?
  • 3. The world “we live” in … ?
  • 4. The world “we live” in … ?
  • 5. The world “we live” in … ?
  • 6. Bret Victor - Thinking the unthinkable
  • 8. What we can not talk about… we can not think about (or it is difficult...)
  • 9. Do not Insist on English
  • 10. Aimara: Pasado y Futuro (nayra) (qhipa)
  • 11.
  • 12. What is the relationship with Programming Languages? (K. Iverson: “Notation as a tool of thought” 1979 ACM Turing Award)
  • 13. If a programming language does not allow me to “TALK” (write) about certain things … Then I can not THINK about certain solutions
  • 14. Let’s see List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add (customer); return selectedCustomers;
  • 15. Let’s see List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add (customer); return selectedCustomers; List<Account> selectedAccounts = new ArrayList<Account> (); for (Account account: accounts) if (account.isOverdraw()) selectedAccounts.add(account); return selectedAccount;
  • 16. Let’s see List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add (customer); return selectedCustomers; List<Account> selectedAccounts = new ArrayList<Account> (); for (Account account: accounts) if (account.isOverdraw()) selectedAccounts.add(account); return selectedAccount; What is the problem?
  • 17. We have repeated code! List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add (customer); return selectedCustomers; List<Account> selectedAccounts = new ArrayList<Account> (); for (Account account: accounts) if (account.isOverdraw()) selectedAccounts.add(account); return selectedAccount;
  • 19. How do we remove it?
  • 20. Technique: 1. “Contextualize-Copy” the repeated code to some “place” 2. Parameterize what changes 3. NAME IT!!! 4. Use it :-)
  • 21. Copy the repeated code to some place List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add(customer); return selectedCustomers; class Collection<T> { public Collection<T> <<NAME>> (?) { List<T> selected = new ArrayList<T> (); for (T anObject: this ) if ( ) selected.add (anObject); return selected: } this List<Account> selectedAccounts = new ArrayList<Account> (); for (Account account: accounts) if (account.isOverdraw()) selectedAccounts.add(account); return selectedAccount;
  • 22. Parameterize what changes List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add (customer); return selectedCustomers; List<Account> selectedAccounts = new ArrayList<Account> (); for (Account account: accounts) if (account.isOverdraw()) selectedAccounts.add(account); return selectedAccount; How do we do it?
  • 23. An object that represents “code”
  • 24. Copy the repeated code to some place List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add(customer); return selectedCustomers; class Collection<T> { public Collection<T> <<NAME>> (Closure aClosure) { List<T> selected = new ArrayList<T> (); for (T anObject: this ) if ( ) selected.add (anObject); return selected: } this List<Account> selectedAccounts = new ArrayList<Account> (); for (Account account: accounts) if (account.isOverdraw()) selectedAccounts.add(account); return selectedAccount; aClosure.execute(anObject)
  • 25. class Collection<T> { public Collection<T> select (Closure aClosure) { List<T> selected = new ArrayList<T> (); for (T anObject: this ) if ( ) selected.add (anObject); return selected: } self NAME IT! List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add(customer); return selectedCustomers; List<Account> selectedAccounts = new ArrayList<Account> (); for (Account account: accounts) if (account.isOverdraw()) selectedAccounts.add(account); return selectedAccount; aClosure.execute(anObject) The most difficult part because it means that we understood the repeated code meaning
  • 26. List<Customer> selectedCustomers = new ArrayList<Customer> (); for (Customer customer: customers) if (customer.nameStarsWith(“H”)) selectedCustomers.add (customer); return selectedCustomers; cutomers.select( customer -> customer.nameStartsWith(“H”) ) accounts.select( account -> account.isOverdraw() ) List<Account> selectedAccounts = new ArrayList<Account> (); for (Account account: accounts) if (account.isOverdraw()) selectedAccounts.add(account); return selectedAccount;
  • 27. Why not an Anonymous Class? 1. Sintax: cutomers.select( customer -> customber.nameStartsWith(“H”) ) customers.select( new Condition<Customer> () { public boolean value (Customer aCustomer) { return aCustomer.nameStartsWith(“H”); }}); Which one reads better? 2. Binding problems…
  • 28. What did we gain? 1. Few words  Simplicity, Easier to understand, read, remember, etc. Less bugs! 2. We created a new “abstraction”: select (filter in Java 8) 3. … and we removed duplicated code!!
  • 29. Now… let’s do some reflection 1. Why didn’t we see the “duplicated code”? 2. Why didn’t we came with a solution?
  • 30. Why didn’t we see the “duplicated code” 1. Because we are use to that code (is the programming language the problem or us?) 2. Because there is no “concept” to remove it
  • 31. Why didn’t we came with a solution? 1. Because the programming language does not provide us with a “concept” to think about a solution!
  • 32. Try { … do something fail() } catch (Exception e) { assertTrue (…. ) } self TDD: Test for exceptions should: [ do something ] raise: Exception withExceptionDo: [ :e | self assert: …. ] (Smallalk)
  • 33. …and much much more…. Imagine how your designs would be if you could use closures You can create your own control flow “sintax” Further reading: LAMBDA The Ultimate…
  • 34. Meta-Conclusion Object = ¿Data + Code?
  • 35. Meta-Conclusion Object = ¿Data + Code? If you think so, you don´t understand OO yet
  • 36. Mete-Conclusion Data is an Object Code is an Object An Object is a “superior” concept that unifies data and code
  • 37. Hamming / Closure If there are certain objects that can not be created in some languages … … and given the solutions provided by some programming languages… The statement: “There are design solutions that are unthinkable in some programming languages” ¿Does it surprise you?
  • 38. Java 8 Lambda != Closure Examples: aList.forEach( ... ) aList.stream().filter( ... ) aList.stream().map( ... ) etc
  • 39. What is the problem?
  • 41. Now… let’s do some reflection 1. Why didn’t we see the “polymorphic message”? 2. Why didn’t we came with a right solution?
  • 42. Why did we not see the “polymorphic message”?  Because 'if' as a reserved word is a “primitive construction”, there is nothing behind it  Therefore it does not make us think in polymorphism
  • 43. If as a message
  • 44.
  • 45. A programming language is its creator's state of knowledge
  • 49. How do we “generalize” it?
  • 53. How can we add specific behavior to an object? Let's see an example
  • 54. Now… let’s do some reflection 1. What are the solutions we lack due to limited meta programming? 2. What do we loose if we do not have a meta-circular language?
  • 55. How do we learn a new word?
  • 56. Do we: 1. Stop our brain 2. “edit" a new definition in our dictionary 3. “Compile” the new definition 4. Restart our brain?
  • 57. NO!! Why do we have to do it with our programs?
  • 58. Can our programs “change while running”? Can our programs “learn” as we learn?
  • 59. Yes, they can!... If they are METACIRCULAR Apply Eval
  • 60. Let’s see a problem: Can you make a proxy “learn” about its proxee as it is used?
  • 61. If we don’t have meta-circular languages, then we can not think about solutions that are natural in our daily lives!!
  • 62. Let’s think again… Are these concepts new?
  • 63. Lisp John McCarthy Alan Kay “We must know our history if we don’t want to reinvent … not only the tire, but a a flat tire”
  • 64. And more… Classes are modules Static is not OO Misleading words: this extends Unnecessary implementation complexity filter, map, etc.
  • 65. Conclusions  Do not accept languages without Closures  Do not accept languages without good meta-programming  Create your own extensions!  Liberate yourself from the programming language
  • 66. Conclusions  Learn other programming languages Lisp/Scheme  Smalltalk Forth and more...  Learn our history
  • 67. "The Humble Programmer” E. Dijkstra “The tools we are trying to use and the language or notation we are using to express or record our thoughts, are the major factors determining what we can think or express at all!"
  • 68. Alan Kay "Java and C++ make you think that the new ideas are like the old ones. Java is the most distressing thing to hit computing since MS-DOS.“
  • 70. Muchas gracias! agile software development & services info@10pines.com www.10Pines.com twitter: @10Pines Argentina Tel.: +54 (11) 6091-3125 Alem 693, 5B (1001) Buenos Aires