Upload
edmondo-porcu
View
549
Download
0
Embed Size (px)
Citation preview
Scala: come recuperare la programmazione funzionale e
perché
Edmondo PorcuUniversità di Cagliari,
10/05/2013
Agenda
1. Introduzione - 10 minuti
2. Scala tutorial e demo – 40 minuti
3. Suggerimenti per gli interessati – 10 minuti
4. Extra: uno sguardo al mercato del lavoro per gli interessati: NoSQL, Hadoop, FP
L’espressività di un linguaggio
* http://en.wikipedia.org/wiki/Halstead_complexity_measures
- Un concetto molto discusso
- Definizione da Wikipedia (http://en.wikipedia.org/wiki/Expressive_power):- Ampiezza delle idee che si possono esprimere tramite un
linguaggio- In pratica, quando si parla di linguaggi di programmazione, molto
spesso ci si riferisce a «practical expressivity» => brevità e leggibilità
Definizione più semplice ed intuitiva: la difficoltà nell’esprimere un concetto in un certo linguaggio
Halstead complexity measure (1977)
* http://en.wikipedia.org/wiki/Halstead_complexity_measures
N(bugs) proporzionale a N(righe di codice)
Un linguaggio più espressivo è sempre degno di interesse
Un possibile confrontoUtilizzando LOC/commit su 7,5 milion progetti/mese open source
- 52 linguaggi differenti, ma i risultati hanno senso?
- I linguaggi ad alto livello sono più espressivi (Python [#27] , Ruby[#34]) dei linguaggi a basso livello ( C[#50], C++ [#45], Java[#44] )
- I linguaggi funzionali sono i più espressivi: Haskell [#10], Erlang[#22], F# [#21], Clojure[#7], Scala[#18]
Scala!
Source: Martin Odersky at presentation DEVOXX http://en.wikipedia.org/wiki/Devoxx12
La storia di• Nel 1999 Odersky divenne professore all’Ecole Polytechnique Federale de
Lausanne, concentrando la sua ricerca sul miglioramento di linguaggi FP e OO • Progetto Scala inizia nel 2001, prima versione rilasciata nel 2003
• Prima versione del compilatore scritto in Java
• Nella versione 2.0.0 il compilatore era già scritto in Scala
• Attuale versione 2.10.1 (Marzo 2013)
• Dal 2011, Odersky diventa Chairman di una società dedicata a fornire supporto commerciale per Scala: Typesafe
• Ottiene oltre 20$ m di finanziamento. Headquarters nella Silicon Valley
Martin Odersky
• Autore di un linguaggio funzionale chiamato Pizza, nel 1995, che compilava in java bytecode• Pizza divenne quello che oggi sono i Java generics
• Nel 1997 su richiesta della Sun Microsystems Odersky si occupa del compilatore Java 1.1
• Odersky fu responsabile di Javac dalla versione Java 1.1 all’1.4
InfoQ surveyWhat is the next language on the
JVM?• 27 Nov 2012
• Scala il più votato
http://www.infoq.com/research/next-jvm-language?utm_source=infoqEmail&utm_medium=WeeklyNL_ResearchContent&utm_campaign=050713news
James Gosling
Rod Johnson
Inventore del Java
Inventore del framework di maggior successo per Java (Spring framework)
«Se oggi dovessi scegliere un altro linguaggio al di fuori del Java, sarebbe Scala»
«Vorrei un linguaggio con cui fare delle cose interessanti in maniera semplice, non un linguaggio per fare solo delle cose semplici»
«Oramai programmo solo in Scala»
Martin Odersky
Perchè Scala?
La scalabilità della programmazione funzionale
Senza rinunciare alla programmazione ad oggetti
Sulla JVM (Interoperabile con Java)
Con strumenti di sviluppo maturi (Eclipse)
Migliorato e progettato da un’università
Perchè Scala?• OP + FP sulla JVM• Strongly typed• Type inference• Parametri di default & optional types• Lambda functions• Collezioni funzionali• Interfacce (traits) con metodi concreti• Covariance/contravariance/invariance• Tipi astratti• Pattern matching• Implicits• Parallelismo
Una storia già vista?• Spring Framework 2.0 Dependency Injection fu così di
successo da diventare parte di JEE5
• Idem per Hibernate, le cui idee sono diventate parti dello standard JPA
• Le idee di Scala saranno integrate dal Java?– Type inference parziale in Java 7– Java8 conterrà Lambda expressions ed un miglior supporto per
parallelismo...– http://openjdk.java.net/projects/jdk8/features– Java 9 puramente OO ( non ci saranno più i tipi primitivi )
• JDK 8 previsto non prima di Settembre 2013 !
INDOVINA CHI?
Joshua BlochEx Chief Java Architect di Google
Autore di Effective Java (arrivato alla seconda versione)
L’unica guida a scrivere un buon Java
public class Person { private String lastName; private String firstName; public Person() { } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; }}
In Java...
Una parola sull’immutabilità
- 13esimo suggerimento nel libro Item 13 of Effective Java, 2° edition, la bibbia del Java
“Immutable objects have a very compelling list of positive qualities. Without question, they are among the simplest and most robust kinds of classes you can possibly build. When you create immutable classes, entire categories of problems simply disappear”
- In realtà, già nel 2003 Brian Goletz lo suggeriva:http://www.ibm.com/developerworks/java/library/j-jtp02183/index.html
La nostra persona in bello stile
public class Person { public final String lastName; public final String firstName; public final DateTime dateOfBirth; public Person(String lastName, String firstName, DateTime dateOfBirth) { this.lastName = lastName; this.firstName = firstName; this.dateOfBirth = dateOfBirth; }}
public Person() { } public Person(String lastName){ this.lastName=lastName; } public Person(String firstName){ this.firstName=firstName; }
In Java...
Construttori multipli
• Fonte di errore
• Quale dei 18 construttori bisogna usare nelle classi derivate?
• Come gestire gli errori di inizializzazione ?
• Joshua Bloch: preferite factory methods/builder (Item 1: Static Factory Method)
Factory methods !
• Proprietà immutabili => unico costruttore con tutti i parametri
• Si può renderlo privato, obbligando a passare per factory methods
• Gestione delle eccezioni semplice e pulita!
V1 factory methods private Person(String lastName, String firstName, DateTime dateOfBirth) { this.lastName = lastName; this.firstName = firstName; this.dateOfBirth = dateOfBirth; }
public static Person newPerson(String lastName, String firstName, DateTime dateOfBirth) { return new Person(lastName,firstName,dateOfBirth); }
public static Person justBorn(String lastName, String firstName) { return new Person(lastName,firstName,DateTime.now()); }
V2 factory methodspublic static Person newPerson(String lastName, String firstName, DateTime dateOfBirth) throws IllegalArgumentException{ if(lastName==null) throw new IllegalArgumentException("Invalid person data", new NullPointerException("LastName can't be null")); if(firstName==null) throw new IllegalArgumentException("Invalid person data", new NullPointerException("FirstName can't be null")); if(dateOfBirth==null) throw new IllegalArgumentException("Invalid person data", new NullPointerException("DateOfBirth can't be null")); return new Person(lastName,firstName,dateOfBirth); }
Joshua Bloch: Throw exceptions appropriate to the abstraction (Item 61).
In Scala• L’immutabilità è incoraggiata tramite una keyword: val
• Un solo costruttore per classe è possibile, tutti gli altri sono obbligati a chiamarlo
• Esistono parametri con valori di default– Molte volte i construttori multipli sono stati creati per questo
motivo
• I singleton sono implementati tramite “object”, quidi non esistono metodi statici.
• In un solo file sorgente si possono definire più classi/object
• Un object con lo stesso nome della classe si chiama ”companion object” ha i suoi stessi access rights
In Scala
class ScalaPerson private(val lastName:String, val firstName:String, val dateOfBirth:DateTime) {}
object ScalaPerson { def apply(lastName:String, firstName:String, dateOfBirth:DateTime = DateTime.now()) = new ScalaPerson(lastName,firstName,dateOfBirth)}
Construttore privato
Companion object
Proprietà immutabile e argomento del costruttore
Valore di default
PS: non scrivete codice così. Fate un test sui parametri e ritornate Either[IllegalArgumentException,ScalaPerson]. O meglio ancora Validation[IllegalArgumentException, ScalaPerson]
Case classes• Classi con solo proprietà immutabili• Keyword case• Hashcode and equals generati
automaticamente– Item 11 di Effective Java
• Inheritance deprecated! – Difficile non rompere il contratto se si
eredità delle classi
Funzioni: oggetti in Scalascala> val a: Int => Int = i => i * 2
a: Int => Int = <function1>
scala> val a: Function1[Int,Int] = i => i * 2
a: Int => Int = <function1>
Collezioni funzionali
• Mutabili ed immutabili– Classi differenti che implementano una parte
di tratti in comune– Mai più l’orrore di Java.util.List (Optional add )
• Un punto di forza di Scala:– filter– map– flatMap– partition– groupBy– 115 funzioni disponibili su List
Trait: interfacce estese
• Le interfacce si chiamano trait
• Non solo metodi astratti , ma anche metodi concreti
• Niente più gerarchia:– MyInterface– MyAbstractClass (implementazione standard di
MyInterface)– MyClass1
• Permettono il “cake pattern” : costruire oggetti complessi “mixando” più traits
Covarianza/Controvarianza/Invarianza
- A[B] è covariante in B se, per C<B A[C] < A[B] (in Scala si esprime con il +)
- A[B] è controvariante in B se, per C>B A[C] < A[B] (in scala si esprime con il -)
- Invarianza: A[B] < A[C] B=C
In Java:public static void main(String []args) throws Exception{ Person persons[] = new Person[2]; Object[] personsAsObject = persons; personsAsObject[0] = new Cat(); }
Neanche un warning!!Exception in thread "main" java.lang.ArrayStoreException: Cat at Person.main(Person.java:41) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
!
Covarianza/Controvarianza/Invarianza
In Scala:def main(args:Array[String]) { val array = Array.empty[Person] val castedArray:Array[Object] = array }
error: type mismatch;found : Array[Person]required: Array[Object]Note: Person <: Object, but class Array is invariant in type T.You may wish to investigate a wildcard type such as `_ <: Object`. (SLS 3.2.10)val castedArray:Array[Object] = array
Covarianza/Controvarianza/Invarianza
• Correttamente implementata nelle collection (ex. List[+A] )
• E nelle FunctionN. Quiz: Perchè?
Covarianza/Controvarianza/Invarianza
trait Function1[-T1, +R] extends AnyRef { def apply(v1: T1): R}
Pattern matching• Uno switch sophisticato, compreso sulla classe
dell’oggetto• Esempio: Option[T] può essere Some o None.
– Obbliga a gestire il caso in cui un valore non sia specificato, usatelo senza pietà!
def printMark(mark:Option[String]) = { val result = mark match { case Some(value) => "You obtained " + value case None => "You failed the exam" } println(result) }
Implicits
• Metodi, argomenti o oggettin automaticamente risolti dal compilatore.
• Utilissimi per:– Automaticamente convertire da A a B– Implementare DSL– Ad-Hoc polymorphism
• Esempi:– Semigroup typeclass– Specs2 testing– Future tasks scheduling
Parallelismo• Tre astrazioni chiave:
– Parallel collection
– Futures• Estendono e migliorano i java.util.concurrent.Future• Molto più flessibili
– Actors• Paradigma di calcolo parallelo basato su message-
passing• Scalabile su un numero elevato di processori e/o
server
E i lati negativi?
• Più difficile da imparare
• Type system complesso– Turing complete– Ho fatto crushare il compilatore diverse
volte
• Non vorrete più tornare indietro!
Come continuare...• Scala-lang website
• Functional programming principles in Scala – Corso gratuito online
• Twitter Scala school
• Scala wiki at Stackoverflow:
• Scala for Java Refugees
• Libri:– Tantissimi, nell’ordine suggerisco:
• Scala for the impatient• Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine• Programming in Scala, 2° edition• Functional programming in Scala (attualmente solo in Early Access Program)
Come continuare (2) – Il sottoscritto• Training seguiti:
– Advanced Scala by Typesafe– Typeful Scala: Exploit the power of types
• 4 libri letti su Scala
• Scala silver badge @ Stackoverflow
• Membro attivo delle più importanti mailing list
• Seguitemi su twitter @edmondo1984
• Ma seguite soprattutto i guru: Viktor Klang, Miles Sabin, Eric Torreborre, Jonas Boner, Martin Odersky, Daniel Sobral, Heiko Seeberger, Tony Morris, Paul Philips
Typesafe• Supporto commerciale per lo sviluppo
in Scala
• 2 Open-source frameworks
• Sono un cliente soddisfatto
Akka
Applicazioni parallele basate sul message-passing=> La visione di Scala del parallelismo: no locks, no shared data
Play! Framework• LinkedIn è basato su Play!, così come
il sito di the Guardian
• Ruby on Rails con un linguaggio funzionale
• Probabilmente il web framework più moderno in circolazione
Uno sguardo al mondo del lavoro
- Capirlo richiede sforzo (arghhhh!)
- Uno sforzo che dovrete fare per tutta la vostra carriera
- Siete tra i meglio posizionati al mondo per trovare lavoro nella società del futuro
Technology adoption lifecycle
http://en.wikipedia.org/wiki/Technology_adoption_lifecycle
Everett Rogers poi trasformerà questa teoria in Diffusion of Innovation
Non sempre va così bene...Alcune tecnologie non superanno la fase di early adopting”: c’è un baratro, in inglese “chasm”
http://en.wikipedia.org/wiki/Crossing_the_Chasm (Geoffrey Moore)
Capite quali tecnologie salteranno il baratro
Imparate a padroneggiarle prima degli altri
Vendetevi, siete richiesti!
Seguite le scelte degli altri in ritardo (late adopters)
Sarete in competizione con chi ha sistematicamente più esperienza di voi
nelle tecnologie richieste
Sarete solo della manodopera qualificata
Come si fa?• Interessarsi a chi usa la tecnologia,
come e perchè
• Leggere, leggere, leggere e poi leggere
• Su riviste non tecniche, ma “business”
Esempi di letture utili
• McKinsey, Deloitte, Accenture, tutte le società di consulenza– Pubblicazioni trimestrali disponibili
gratuitamente online
• ITBusinessEdge
• Giornali economici in generale
Trend #1: NoSQL
• Basi di dati non relazionali = NO JOIN
• Varie tipologie:– Key/Value (Amazon SimpleDB)– Column Oriented (Cassandra)– Document oriented (MongoDB)– Graph oriented (Neo4J)
• Scalabilità orizzontale e high-availability– Il design è stato fatto pensando che il modo naturale di
utilizzare il database sia per cluster– I.e. Oramai un solo nodo non è sufficiente a contenere tutti
i dati
Trend #1: NOSQL
DB Offerte su Indeed.com
MongoDB 2812
Cassandra 1728
Neo4J 103
CouchDB 382
Dati estratti il 4 maggio 2013
Trend #2: Data scientist
• Sapere utilizzare tecnologie adatte a processare parallelamente una grande quantità di dati
• Alcune università iniziano ad offrire master in “Data scientist” o perlomeno corsi– http://analytics.ncsu.edu/?page_id=1799– https://www.coursera.org/course/datasci
• Secondo McKinsey,da qua al 2018 mancheranno sul mercato del lavoro 190.000 data scientist!– Pensate quanto varranno quelli che ci saranno
• Hadoop è la regina delle tecnologie:– MapReduce paper presentato da Jeff Dean di Google nel 2004
http://static.usenix.org/event/osdi04/tech/full_papers/dean/dean.pdf– Hadoop è l’implementazione di maggior successo
Esempi...Keyword Fonte Offerte di lavoro
Data Scientist Indeed.com 88777
Hadoop Indeed.com 5898
Data Scientist Careers.stackoverflow.com 412
Hadoop Careers.stackoverflow.com 60
Trend #3: FPIBM DeveloperWorks:
Functional thinking: Why functional programming is on the rise
Date: 29 Jan 2013
Summary: Java™ developers should learn functional paradigms now, even if they have no immediate plans to move to a functional language such as Scala or Clojure. Over time, all mainstream languages will become more functional; Neal Ford explores the reasons why in this installment.
FP job offer on LinkedIn
Java/Scala Web DeveloperShazam Entertainment - London, United Kingdom (London, Regno Unito)
Extract from LinkedIn post offer:
-The willingness to learn Functional Programming paradigms (even better if you already enjoy FP).
-You should love both working in teams – even when you produce individual works, it will be as part of the larger Shazam team.
-A good understanding of MVC architecture, how this applies to the web, as well as experience implementing websites using any of the current frameworks in the Java and Scala ecosphere (though experience with Play! Framework is a bonus).
- The ability to pick up additional tasks outside of the core skill sets of Java and Scala in order to meet the teams commitments (we love flexible people who like learning).