functional programming for old object oriented developers
DESCRIPTION
TDC2013 - Trilha SCALA - Functional programming for Old Object Oriented DevelopersTRANSCRIPT
Functional Programming for
“Old” Object Oriented Developers
Saturday, July 13, 13
Quem somos nósAlan Vidotti Prando
Mestrando em Engenharia da Computação - IPT/USP.
8 anos de experiência com JAVA, RUBY & SCALA.
SCJP, SCWCD e SCBCD. Jose Renato PequenoGraduado em Tecnologia em Informática - FASP (2005),
Pós graduação em Gerenciamento de Projetos - FGV.
MBA em arquitetura de soluções - FIAP .
Trabalhou como professor ministrando aulas na Universidade Metodista de São Paulo, para os cursos de Análise e Desenvolvimento de Sistemas, Engenharia da Computação com Ênfase em Software e Sistemas de Informação.
Saturday, July 13, 13
Quem somos nós
Saturday, July 13, 13
Roteiro
Saturday, July 13, 13
RoteiroParadigma Programação Imperativa.Contexto Histórico: Lambda Calculus, LISP.Conceitos de Programação FuncionalPor que Programação Funcional?Técnicas e implementações funcionais (em Scala):
Elementos básicos: Lambda, Clousure & Bloco de códigos
Higher-Order FunctionsTail Recursion Currying Pattern Matching.
Misturando paradigmas funcionais e imperativos: Quais são as vantagens? O que o Oderksy propôs ao criar o Scala? É possível de trazer isso para o nosso dia a dia? Conclusão e dúvidas.
Saturday, July 13, 13
IntroduçãoNão importa quão longa é a sua experiência como programador (junior, pleno ou senior), aprender programação funcional é um desafio. Esteja preparado para ser um “junior” novamente.
Livro: Functional Programming in Scala.
Nós gostaríamos que você fizesse uma “pausa” e esqueça o que você sabe sobre programação. Olhem para os exemplos com a menta aberta.
Curso: Functional Programming in Scala. Martin Odersky. COURSERA.
Saturday, July 13, 13
Saturday, July 13, 13
IntroduçãoFrom primitive assembly languages (which were at least a step up from raw machine code) there grew a plethora of high-level programming languages, beginning with FORTRAN in the 1950s. The development of these languages grew so rapidly that by the 1980s they were best characterized by grouping them into families that reflected a common computation model or programming style. Debates over which language or family of languages is best will undoubtedly persist for as long as computers need programmers. Fonte: Conception, Evolution, and Application of
Functional Programming Languages. PAUL HUDAK, Yale University. 1989.
Saturday, July 13, 13
Imperative ProgrammingArquitetura de John Von Neuman
Norteou as linguagens de programação.
Saturday, July 13, 13
Funções Contexto Histórico:
René Descartes - “Penso logo existo!”
Discurso do Método
f ( x ) = x + 1
Saturday, July 13, 13
Contexto Histórico: Lambda Calculus
Na lógica matemática e na ciência da computação, cálculo lambda, também escrito como cálculo-λ é um sistema formal que estuda funções recursivas computáveis, no que se refere a teoria da computabilidade, e fenômenos relacionados, como variáveis ligadas e substituição. Sua principal característica são as entidades que podem ser utilizadas como argumentos e retornadas como valores de outras funções.
Alonzo Church - 1930
Saturday, July 13, 13
Lambda Função Nomeada SomaQuadrados(x,y) = x*x + y * y
SomaQuadrados(5,2) = 5*5 + 2*2 = 29
Função Anônima (x,y) ↦ x*x + y*y
Qualquer função que recebe duas ou mais entradas, pode ser reelaborada em uma função que recebe uma única entrada e tem como saída uma outra função.
x ↦ ( y ↦ x*x + y*y)
Esta transformação é chamada de currying.
Saturday, July 13, 13
Lambda Calculando com Curriyng
( x ↦ ( y ↦ x*x + y*y) ) (5) (2)
= ( y ↦ 5*5 + y*y) (2)
= 5*5 + 2*2 = 29
Saturday, July 13, 13
Contexto Histórico: LISPLisp - List Processing
John McCarty - 1958
Motivação processamento de Listas
Lambda Calculus
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional ProgrammingEm uma função matematica, os coeficientes não mudam.
(a*x + b) + (c*x + d) = (a+c)*x + (b+d)
Saturday, July 13, 13
Functional ProgrammingEm uma função matematica, os coeficientes não mudam.
(a*x + b) + (c*x + d) = (a+c)*x + (b+d)
Já na programação imperativa você pode fazer isso! E isso não é permitido pela lei da matematica!
class Polynomial {double[] doefficient; }Polynomial p = ….;p.coefficient[0] = 42;
Saturday, July 13, 13
Functional ProgrammingEm uma função matematica, os coeficientes não mudam.
(a*x + b) + (c*x + d) = (a+c)*x + (b+d)
Já na programação imperativa você pode fazer isso! E isso não é permitido pela lei da matematica!
class Polynomial {double[] doefficient; }Polynomial p = ….;p.coefficient[0] = 42;
Se você quiser implementar conceitos matemáticos de alto nível seguindo as teorias matematicas, você não poderá utilizar mutações!
Saturday, July 13, 13
Functional ProgrammingExistem duas abordagens da programação funcional: Restrita e Amplo.
Restrita: programar SEM: atribuições (variaveis imutaveis), loops, if-then-else.
Amplo: Foco na função. A linguagem permite construção de programas “elegantes” com foco em funções.
Funções podem ser:
declaradas em qualquer lugar.Passadas como parâmetro para outras funções, bem como retornar como resultado de uma função.Deve haver operadores padrões na linguagem para trabalhar com funções de maneira simples.
Saturday, July 13, 13
Functional ProgrammingPrograms using only pure functions.Functions that have no side effects.Concept of Referential Transparency.
Saturday, July 13, 13
Functional ProgrammingPrograms using only pure functions.Functions that have no side effects.Concept of Referential Transparency.
Evitar mutações. VARIAVEIS IMUTAVEIS! Ter uma maneira poderosa de abstrair e compor funções.
Saturday, July 13, 13
Functional ProgrammingPrograms using only pure functions.Functions that have no side effects.Concept of Referential Transparency.
Programação Funcional: foco nas funções.Programação imperativa: foco no estado.
Evitar mutações. VARIAVEIS IMUTAVEIS! Ter uma maneira poderosa de abstrair e compor funções.
Saturday, July 13, 13
Functional ProgrammingLinguagens restritas:
Pure Lisp, XSLT, Xpath, Xquery, FP
Haskell (sem I/O Mondas ou UnsafePerformIO)
Linguagens amplas:Lisp, Scheme, Racket, Clojure
SML, Ocaml, F#
Haskell (full language)
Scala
Smalltalk, Ruby(!), Javascript(!)
Saturday, July 13, 13
Functional Programming1959 - LISP
1975-77 - ML, FP, Scheme
1978 - Smalltalk
1986 - Standard ML
1990 - Haskell, Erlang
1999 - XSLT
2000 - Ocaml
2003 - Scala, Xquery
2005 - F#
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional ProgrammingParallel Programming:
Execute programs faster on parallel hardware
Concurrent Programming:Manage concurrent execution threads explicity
Saturday, July 13, 13
Functional ProgrammingParallel Programming:
Execute programs faster on parallel hardware
Concurrent Programming:Manage concurrent execution threads explicity
BOTH ARE TO HARD!!!
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
High-Order FunctionsFunções que recebem funções como parâmetros
def funcQ(x : Int) = x * x
def exemploSoma(a: Int, b: Int, f: Int => Int): Int =if (a>b) 0 else f(a) + soma(a+1, b, f)
exemploSoma(1, 10, funcQ)
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion Se você tem uma função recursiva que chama a sí mesma como ultima ação, você consegue reutilizar o stack frame da execução dessa função.Isso se chama TAIL RECURSION.Isso aumenta a eficiência da execução, sendo idêntica a eficiência de um loop.Na definição, Tail Recursion poderia acontecer mesmo se a chamada ocorresse para outra função, não sendo necessário a função ser chamada por ela mesma.
Saturday, July 13, 13
Pattern Matching
So pattern matching helps you decompose and navigate data structures in a very convenient, compact syntax, it enables the compiler to check the logic of your code, at least a little bit.
The act of checking a perceived sequence of tokens for the presence of the constituents of some pattern.
Saturday, July 13, 13
Imperative and Functional Programming
Um anula o outro? Qual é a melhor?Por que Scala?
Saturday, July 13, 13
Imperative and Functional Programming
Têndencia ou realidade?First class functions have slowly been added to mainstream languages. In 1994, support for lambda, filter, map, and reduce was added to Python.
First class functions were also introduced in PHP 5.3, Visual Basic 9, C# 3.0, and C++11.
In Java, anonymous classes can sometimes be used to simulate closures; however, anonymous classes are not always proper replacements to closures because they have more limited capabilities.
Java 8 will support lambda expressions as a replacement for some anonymous classes.
Saturday, July 13, 13
Imperative and Functional Programming
Como propor o uso da linguagem funcional em sua empresa?
Saturday, July 13, 13
Imperative and Functional Programming
Como propor o uso da linguagem funcional em sua empresa?
Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”.
Saturday, July 13, 13
Imperative and Functional Programming
Como propor o uso da linguagem funcional em sua empresa?
Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”.
Jeito ERRADO: “Scala é uma linguagem nova e com conceitos legais! Híbrida, OO e funcional. O código fica bem menos verborrágico. Além de ser divertido passar e receber funções como parâmetro! Vamos utilizar!"
Saturday, July 13, 13
Imperative and Functional Programming
Saturday, July 13, 13
Imperative and Functional Programming
Como propor o uso da linguagem funcional em sua empresa?
Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”.
Jeito CERTO: “Vamos atender mais usuários sem precisar gastar com infraestrutura. Nosso ambiente (JVM), já esta pronto para isso. O sistema vai processar mais vendas e consequentemente lucraremos mais!”
Saturday, July 13, 13
Imperative and Functional Programming
Saturday, July 13, 13
Conclusão
“Sou desenvolvedor JAVA, adoro escrever getters e setters igual um maluco e amo JVM”. Utilize SCALA! “Java é uma porcaria! Odeio a JVM! Fica bem mais rápido e leve (e colorido) com Ruby”. Utilize ERLANG!
SE faz sentido. POR QUE NÃO?
Tire proveito do Hardware!
Faça mais simples!
lembre-se: Manutenabilidade faz parte da QUALIDADE do SOFTWARE. No final das contas o que importa é código lipo, modular e reutilizável. EVITE RETRABALHO!
Saturday, July 13, 13
Books
Saturday, July 13, 13
Perguntas e ContatoALAN VIDOTTI PRANDO
Linkedin: http://www.linkedin.com/in/avprando
Twitter: @alanprando
E-mail: [email protected]
JOSE RENATO PEQUENO
Linkedin: br.linkedin.com/pub/jose-renato-pequeno/28/524/244/
Twitter: @javalittle
E-mail: [email protected]
Saturday, July 13, 13