Your SlideShare is downloading. ×

Scala: come recuperare la programmazione funzionale e perché

502

Published on

Scala: come recuperare la programmazione funzionale e perché

Scala: come recuperare la programmazione funzionale e perché

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
502
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
15
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Scala: come recuperare laprogrammazione funzionale eperchéEdmondo PorcuUniversità di Cagliari, 10/05/2013
  • 2. Agenda1. Introduzione - 10 minuti2. Scala tutorial e demo – 40 minuti3. Suggerimenti per gli interessati – 10 minuti4. Extra: uno sguardo al mercato del lavoro pergli interessati: NoSQL, Hadoop, FP
  • 3. Functional programming oggiAncora dinicchiaPer quanto?
  • 4. Functional programming oggiUn pesocrescenteUna crescitastabile
  • 5. 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 unlinguaggio- In pratica, quando si parla di linguaggi di programmazione, moltospesso ci si riferisce a «practical expressivity» => brevità eleggibilitàDefinizione più semplice ed intuitiva:la difficoltà nell’esprimere un concetto in un certo linguaggio
  • 6. Halstead complexity measure (1977)* http://en.wikipedia.org/wiki/Halstead_complexity_measuresN(bugs) proporzionale a N(righe di codice)Un linguaggio più espressivo è sempre degno diinteresse
  • 7. 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 bassolivello ( C[#50], C++ [#45], Java[#44] )- I linguaggi funzionali sono i più espressivi: Haskell [#10], Erlang[#22], F#[#21], Clojure[#7], Scala[#18]
  • 8. Functional ProgrammingScalabile
  • 9. Scala?
  • 10. Scala!Source: Martin Odersky at presentation DEVOXX http://en.wikipedia.org/wiki/Devoxx12
  • 11. Scala su careers.stackoverflow.com35%22%20%19%4%Offerte di lavoroJavaPythonC++C#Scala
  • 12. La storia di• Nel 1999 Odersky divenne professore all’Ecole Polytechnique Federale deLausanne, 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à dedicataa fornire supporto commerciale per Scala: Typesafe• Ottiene oltre 20$ m di finanziamento. Headquarters nellaSilicon Valley
  • 13. Martin Odersky• Autore di un linguaggio funzionale chiamato Pizza, nel1995, che compilava in java bytecode• Pizza divenne quello che oggi sono i Java generics• Nel 1997 su richiesta della Sun Microsystems Odersky sioccupa del compilatore Java 1.1• Odersky fu responsabile di Javac dalla versione Java 1.1all’1.4
  • 14. InfoQ surveyWhat is the next language on the JVM?• 27 Nov 2012• Scala il più votatohttp://www.infoq.com/research/next-jvm-language?utm_source=infoqEmail&utm_medium=WeeklyNL_ResearchContent&utm_campaign=050713news
  • 15. INDOVINA CHI....
  • 16. James GoslingRod JohnsonInventore del JavaInventore del framework di maggior successo per Java(Spring framework)«Se oggi dovessi scegliere un altrolinguaggio al di fuori del Java, sarebbeScala»«Vorrei un linguaggio con cui fare delle coseinteressanti in maniera semplice, non unlinguaggio per fare solo delle cose semplici»«Oramai programmo solo in Scala»Martin Odersky
  • 17. Perchè Scala?La scalabilità della programmazione funzionaleSenza rinunciare alla programmazione ad oggettiSulla JVM (Interoperabile con Java)Con strumenti di sviluppo maturi (Eclipse)Migliorato e progettato da un’università
  • 18. 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
  • 19. Una storia già vista?• Spring Framework 2.0 Dependency Injection fu così disuccesso da diventare parte di JEE5• Idem per Hibernate, le cui idee sono diventate parti dellostandard JPA• Le idee di Scala saranno integrate dal Java?– Type inference parziale in Java 7– Java8 conterrà Lambda expressions ed un miglior supporto perparallelismo...– 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 !
  • 20. SCALA TUTORIAL & DEMO
  • 21. • Shell interattiva• Con il vostro classpath• Per prototipare/testareREAD PRINT EVAL LOOP
  • 22. INDOVINA CHI?Joshua BlochEx Chief Java Architect diGoogleAutore di Effective Java(arrivato alla secondaversione)L’unica guida a scrivereun buon Java
  • 23. 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...
  • 24. Una parola sull’immutabilità- 13esimo suggerimento nel libro Item 13 ofEffective Java, 2° edition, la bibbia del Java“Immutable objects have a very compelling list ofpositive qualities. Without question, they are amongthe simplest and most robust kinds of classes you canpossibly build. When you create immutableclasses, entire categories of problems simplydisappear”- In realtà, già nel 2003 Brian Goletz lo suggeriva:http://www.ibm.com/developerworks/java/library/j-jtp02183/index.html
  • 25. La nostra persona in bello stilepublic 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;}}
  • 26. public Person() {}public Person(String lastName){this.lastName=lastName;}public Person(String firstName){this.firstName=firstName;}In Java...
  • 27. Construttori multipli• Fonte di errore• Quale dei 18 construttori bisogna usare nelleclassi derivate?• Come gestire gli errori di inizializzazione ?• Joshua Bloch: preferite factory methods/builder(Item 1: Static Factory Method)
  • 28. Factory methods !• Proprietà immutabili => unico costruttorecon tutti i parametri• Si può renderlo privato, obbligando apassare per factory methods• Gestione delle eccezioni semplice e pulita!
  • 29. V1 factory methodsprivate 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());}
  • 30. V2 factory methodspublic static Person newPerson(String lastName, String firstName, DateTime dateOfBirth)throws IllegalArgumentException{if(lastName==null)throw new IllegalArgumentException("Invalid person data", newNullPointerException("LastName cant be null"));if(firstName==null)throw new IllegalArgumentException("Invalid person data", newNullPointerException("FirstName cant be null"));if(dateOfBirth==null)throw new IllegalArgumentException("Invalid person data", newNullPointerException("DateOfBirth cant be null"));return new Person(lastName,firstName,dateOfBirth);}Joshua Bloch: Throw exceptions appropriate tothe abstraction (Item 61).
  • 31. In Scala• L’immutabilità è incoraggiata tramite una keyword: val• Un solo costruttore per classe è possibile, tutti gli altri sono obbligatia 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 esistonometodi statici.• In un solo file sorgente si possono definire più classi/object• Un object con lo stesso nome della classe si chiama ”companionobject” ha i suoi stessi access rights
  • 32. In Scalaclass ScalaPerson private(val lastName:String, val firstName:String, val dateOfBirth:DateTime) {}object ScalaPerson {def apply(lastName:String, firstName:String, dateOfBirth:DateTime = DateTime.now()) = newScalaPerson(lastName,firstName,dateOfBirth)}Construttore privatoCompanion objectProprietà immutabile e argomento delcostruttoreValore di defaultPS: non scrivete codice così. Fate un test sui parametri e ritornateEither[IllegalArgumentException,ScalaPerson]. O meglio ancoraValidation[IllegalArgumentException, ScalaPerson]
  • 33. Case classes• Classi con solo proprietà immutabili• Keyword case• Hashcode and equals generatiautomaticamente– Item 11 di Effective Java• Inheritance deprecated!– Difficile non rompere il contratto se si ereditàdelle classi
  • 34. Funzioni: oggetti in Scalascala> val a: Int => Int = i => i * 2a: Int => Int = <function1>scala> val a: Function1[Int,Int] = i => i * 2a: Int => Int = <function1>
  • 35. Collezioni funzionali• Mutabili ed immutabili– Classi differenti che implementano una parte ditratti 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
  • 36. Trait: interfacce estese• Le interfacce si chiamano trait• Non solo metodi astratti , ma anche metodi concreti• Niente più gerarchia:– MyInterface– MyAbstractClass (implementazione standard diMyInterface)– MyClass1• Permettono il “cake pattern” : costruire oggetticomplessi “mixando” più traits
  • 37. 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
  • 38. 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: Catat Person.main(Person.java:41)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)atsun.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
  • 39. 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] = arrayCovarianza/Controvarianza/Invarianza
  • 40. • Correttamente implementata nellecollection (ex. List[+A] )• E nelle FunctionN. Quiz: Perchè?Covarianza/Controvarianza/Invarianzatrait Function1[-T1, +R] extends AnyRef {def apply(v1: T1): R}
  • 41. 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, usatelosenza pietà!def printMark(mark:Option[String]) = {val result = mark match {case Some(value) => "You obtained " + valuecase None => "You failed the exam"}println(result)}
  • 42. Implicits• Metodi, argomenti o oggettin automaticamenterisolti dal compilatore.• Utilissimi per:– Automaticamente convertire da A a B– Implementare DSL– Ad-Hoc polymorphism• Esempi:– Semigroup typeclass– Specs2 testing– Future tasks scheduling
  • 43. 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
  • 44. 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!
  • 45. SUGGERIMENTI PER GLIINTERESSATI
  • 46. 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)
  • 47. 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, EricTorreborre, Jonas Boner, Martin Odersky, DanielSobral, Heiko Seeberger, Tony Morris, Paul Philips
  • 48. Typesafe• Supporto commerciale per lo sviluppo inScala• 2 Open-source frameworks• Sono un cliente soddisfatto 
  • 49. AkkaApplicazioni parallele basate sul message-passing=> La visione di Scala del parallelismo: no locks, no shared data
  • 50. Play! Framework• LinkedIn è basato su Play!, così come ilsito di the Guardian• Ruby on Rails con un linguaggiofunzionale• Probabilmente il web framework piùmoderno in circolazione
  • 51. UNO SGUARDO AL MONDODEL LAVORO
  • 52. Uno sguardo al mondo del lavoro- Capirlo richiede sforzo (arghhhh!)- Uno sforzo che dovrete fare per tutta lavostra carriera - Siete tra i meglio posizionati al mondo pertrovare lavoro nella società del futuro 
  • 53. Technology adoption lifecyclehttp://en.wikipedia.org/wiki/Technology_adoption_lifecycleEverett Rogers poi trasformerà questa teoria in Diffusion of Innovation
  • 54. Non sempre va così bene...Alcune tecnologie non superanno la fase di earlyadopting”: c’è un baratro, in inglese “chasm”http://en.wikipedia.org/wiki/Crossing_the_Chasm (Geoffrey Moore)
  • 55. Capite quali tecnologie salteranno ilbaratroImparate a padroneggiarle primadegli altriVendetevi, siete richiesti!
  • 56. Seguite le scelte degli altri in ritardo (lateadopters)Sarete in competizione con chi hasistematicamente più esperienza di voi nelletecnologie richiesteSarete solo della manodopera qualificata
  • 57. Come si fa?• Interessarsi a chi usa la tecnologia, comee perchè• Leggere, leggere, leggere e poi leggere• Su riviste non tecniche, ma “business”
  • 58. Esempi di letture utili• McKinsey, Deloitte, Accenture, tutte lesocietà di consulenza– Pubblicazioni trimestrali disponibiligratuitamente online• ITBusinessEdge• Giornali economici in generale
  • 59. 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 diutilizzare il database sia per cluster– I.e. Oramai un solo nodo non è sufficiente a contenere tuttii dati
  • 60. Trend #1: NOSQLDB Offerte suIndeed.comMongoDB 2812Cassandra 1728Neo4J 103CouchDB 382Dati estratti il4 maggio2013
  • 61. Trend #2: Data scientist• Sapere utilizzare tecnologie adatte a processare parallelamente unagrande quantità di dati• Alcune università iniziano ad offrire master in “Data scientist” operlomeno corsi– http://analytics.ncsu.edu/?page_id=1799– https://www.coursera.org/course/datasci• Secondo McKinsey,da qua al 2018 mancheranno sul mercato dellavoro 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 2004http://static.usenix.org/event/osdi04/tech/full_papers/dean/dean.pdf– Hadoop è l’implementazione di maggior successo
  • 62. Esempi...Keyword Fonte Offerte di lavoroData Scientist Indeed.com 88777Hadoop Indeed.com 5898Data Scientist Careers.stackoverflow.com 412Hadoop Careers.stackoverflow.com 60
  • 63. Trend #3: FPIBM DeveloperWorks:Functional thinking: Why functional programming ison the riseDate: 29 Jan 2013Summary: Java™ developers should learn functionalparadigms now, even if they have no immediate plans tomove to a functional language such as Scala or Clojure.Over time, all mainstream languages will become morefunctional; Neal Ford explores the reasons why in thisinstallment.
  • 64. FP job offer on LinkedInJava/Scala Web DeveloperShazam Entertainment - London, United Kingdom(London, Regno Unito)Extract from LinkedIn post offer:-The willingness to learn Functional Programming paradigms (even betterif you already enjoy FP).-You should love both working in teams – even when you produceindividual works, it will be as part of the larger Shazam team.-A good understanding of MVC architecture, how this applies to theweb, as well as experience implementing websites using any of thecurrent frameworks in the Java and Scala ecosphere (though experiencewith Play! Framework is a bonus).- The ability to pick up additional tasks outside of the core skill sets ofJava and Scala in order to meet the teams commitments (we love flexiblepeople who like learning).
  • 65. Domande?
  • 66. Grazie per l’attenzione!

×