Slide 1

Slide 1 text

V erliebt in Clo jure V erliebt in Clo jure Jens Bendisposto @jbendisposto [email protected]

Slide 2

Slide 2 text

Über mich • Heinrich Heine Universität • Leidenschaftlicher Softwareentwickler • rheinjug • Clojure Meetup Düsseldorf • Lambda Meetup Düsseldorf • EntwickelBar Unconference (nächste Ausgabe: 26.5)

Slide 3

Slide 3 text

Viel wichtiger: Clojure ist ... • funktional • dynamisch typisiert • auf der JVM gehostet • ein Lisp Dialekt

Slide 4

Slide 4 text

Geschichte von Clojure • Öffentliches Release: Okt. 2007 • Aktuelle Version 1.9 • Development: 1.10.0-alpha4 • Extrem seriöse Entwicklung • Nicht "der neuste heisse Scheiss" • Gedacht für professionelle Softwareentwicklung in Unternehmen • Trotzdem nicht langweilig! Rich Hickey

Slide 5

Slide 5 text

Bild: Stack Overflow

Slide 6

Slide 6 text

Bild: Stack Overflow

Slide 7

Slide 7 text

– Neal Ford “People ask me what projects I would choose Clojure for. The answer is: the nastiest, hardest, toughest kinds of projects possible. Because it's those projects where you need the ability to mold your language towards your problem, not vice versa”

Slide 8

Slide 8 text

Clojure ist keine Silberkugel CC 2.0, https://www.flickr.com/photos/moneymetals/31403416393

Slide 9

Slide 9 text

Clojure ist keine Silberkugel CC 2.0, https://www.flickr.com/photos/moneymetals/31403416393 Mir egal, ich liebe Clojure trotzdem!

Slide 10

Slide 10 text

Agenda* • Funktionen höherer Ordnung (HOF) • Datenzentrierung und Simplicity • Die JVM als Host • Clojure-Syntax * "Make the plan, execute the plan, expect the plan to go off the rails . . . Throw away the plan." 
 (Leonard Snart aka. Captain Cold)

Slide 11

Slide 11 text

Higher Order Function Nichts Besonderes! Nur Funktionen, die andere Funktionen als Parameter akzeptieren oder zurückgeben

Slide 12

Slide 12 text

filter b r b r y g map b r b r y g reduce "brbryg" Die drei Amigos ...

Slide 13

Slide 13 text

Was bitte ist denn falsch an der guten, alten for Schleife?

Slide 14

Slide 14 text

Übung Gegeben eine Collection ns von Zahlen • Berechne die Summe • der Quadrate • der ersten k • geraden Zahlen, • die grösser sind als 5 ns = [10,11,12,17,14,2,20,12], k = 4 840 ns = [10,11,12,17,14,2,20,12], k = 8 984 Inspririert durch Venkat Subramaniam * Falls es weniger als k passende Zahlen gibt, nimm alle

Slide 15

Slide 15 text

Beweisstück A public static int compute(List ns, int k) { int result = 0; int found = 0; for (int i = 0; (i < ns.size() && found < k); i++) { int v = ns.get(i); if (v > 5 && v % 2 == 0) { result += v * v; found++; } } return result; } Ist das Programm korrekt?

Slide 16

Slide 16 text

http://www.sideshowcollectors.com/forums/marvel-action-figures/176882-spectulation- hot-toys-mms-spider-homecoming-vulture-collectible-figure-20.html

Slide 17

Slide 17 text

Beweisstück B public static int compute(List ns, int k) { return ns.stream() .filter(x -> x % 2 == 0) // die gerade sind .filter(x -> x > 5) // der Zahlen > 5, .mapToInt(x -> x * x) // Quadrate .limit(k) // der ersten k .sum(); // Berechne die Summe } Wie sieht es mit diesem Code aus?

Slide 18

Slide 18 text

Funktionaler Code • Trennung von Fachlogik und technischem Code • Abstraktion mit Hilfe von Funktionen höherer Ordnung • Geht auch in Java!

Slide 19

Slide 19 text

Datenzentrierung • Beschreiben von Informationen mit Hilfe von generischen unveränderlichen Datenstrukturen • In Clojure ist es idiomatisch eine Map an Stelle von Objekten zu verwenden • Daten werden geholt, transformiert, aggregiert, gespeichert, verschickt, durchsucht, ...

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Datenzentrierung • Überschaubare Anzahl generischer Datenstrukturen • Viele* Funktionen, die auf den Datenstrukturen operieren • Eine meiner Lieblingsfunktionen: frequencies • Für mich funktioniert Datenzentrierung sehr gut * Größenordnung: 100 Funktionen in der Standardbibliothek

Slide 22

Slide 22 text

Simple vs. Easy • Simple vs. easy (Rich Hickey) • Simple ist eine objektive Eigenschaft des Codes • Easy ist ein subjektives Empfinden • Simple vs. familiar (Venkat Subramaniam)

Slide 23

Slide 23 text

Was ist komplex?

Slide 24

Slide 24 text

Was ist komplex?

Slide 25

Slide 25 text

Was ist komplex? vs. Komplexität ist keine Frage der Anzahl sondern der Interaktionen

Slide 26

Slide 26 text

Clojure Slang: Complected

Slide 27

Slide 27 text

Quelle: 9gag

Slide 28

Slide 28 text

Complected Code • Funktionen/Methoden, Klassen, Komponenten, die complected sind, kann man nicht gut ändern • Permanentes Nachdenken über so viel Kontext • In OOP gibt es Prinzipien und Techniken zur Vermeidung von complecting • SOLID, GRASP, HCLC • TDD

Slide 29

Slide 29 text

Picture: Rich Hickey, Simple made easy

Slide 30

Slide 30 text

Picture: Rich Hickey, Simple made easy

Slide 31

Slide 31 text

Picture: The IT Crowd

Slide 32

Slide 32 text

Zustand ist der Wert einer Identität zu einem Zeitpunkt.

Slide 33

Slide 33 text

„Gleich mit jedem Regengusse Ändert sich dein holdes Tal, Ach, und in dem selben Flusse Schwimmst du nicht zum zweitenmal.“
 Johann Wolfgang von Goethe

Slide 34

Slide 34 text

State happens

Slide 35

Slide 35 text

"Zustand ist Top-Fehlerquelle"
 + 
 "Nicht-Triviale Software hat Zustand"
 =
 DOOM?

Slide 36

Slide 36 text

Anforderungen an ein gutes Zeitmodell • Atomare Abfolge von Zuständen, es gibt keine sichtbaren Zwischenzustände • Muss mehrere Zeitlinien (aka Threads) unterstützen • Lock-freie Lesezugriffe

Slide 37

Slide 37 text

Epochales Zeitmodell v1 v2 v3 v4 f g h

Slide 38

Slide 38 text

Implementierungen Semantik Koordiniert? Asynchron? atom CAS ✗ ✗ agent Agent ✗ ✓ ref STM ✓ ✗

Slide 39

Slide 39 text

Eine Instanz: Das Atom v1 v2 v3 f g g Compare and Swap Semantik Achtung: Funktionen mit Seiteneffekten sind problematisch!

Slide 40

Slide 40 text

Nicht beeindruckt?

Slide 41

Slide 41 text

Nebenläufigkeit! • Ein Clojure Atom garantiert, dass es niemals Race Conditions oder Deadlocks gibt • Leser werden nicht blockiert

Slide 42

Slide 42 text

– Neal Ford “Clojure does for concurrency what Java did for memory management”

Slide 43

Slide 43 text

Clojure und Java

Slide 44

Slide 44 text

Designed to be hosted • Kein Versuch die Plattform zu abstrahieren, die Plattform ist Teil der Sprache und der Kultur • Clojure generiert Bytecode für die JVM • Java aufzurufen ist in Clojure trivial

Slide 45

Slide 45 text

Keine Lisp Insel • Wir haben das ganze JVM Ökosystem zur Verfügung • Es ist vollkommen idiomatisch Java aus Clojure aufzurufen • Es gibt hervorragende Clojure Wrapper für Java Bibliothekten • Clojure kann auch erben, Interfaces implementieren, ...

Slide 46

Slide 46 text

“The Clojure user [...] will run crying to Java for help, rather than implementing the feature himself correctly – that is, as a natural part of the entire language [...]. Clojure pisses on everything I’ve ever loved about Lisp [...] Clojure is the False Lisp [...] A Lisp which barfs Java stack traces.” – Stanislav Datskovskiy (http://www.loper-os.org/?p=42)

Slide 47

Slide 47 text

The elephant in the room Es ist ein Lisp

Slide 48

Slide 48 text

Syntax (atomar) Zahlen 42, 3.1415, 1/4 Strings "Hallo JavaLand" Null nil Keywords :firstname, :email Symbols foo, +, play!, kebap-case-name Zeichen \a, \n, \newline, \space reguläre Ausdrücke #"[0-9]{3}" Clojure benutzt Java Klassen (vs. Jython/JRuby)

Slide 49

Slide 49 text

Lists (:a :b :c) (+ 3 4 5) (1, 2, 3) Vectors [1 2 3] [a 20 :b "foo"] Sets #{1, 2, 3} Maps {:firstname "Jens", :lastname "Bendisposto", :mails []} Alles heterogen und schachtelbar! Syntax (zusammengesetzt)

Slide 50

Slide 50 text

println( "Hallo Jax 2018")

Slide 51

Slide 51 text

println ( "Hallo Jax 2018")

Slide 52

Slide 52 text

println ( "Hallo Jax 2018") Listen sind Funktionsaufrufe

Slide 53

Slide 53 text

(def numbers (range 10)) numbers = range(10) // Python A taste of Clojure

Slide 54

Slide 54 text

(defn square [x] (* x x)) (def numbers (range 10)) A taste of Clojure function square(x) { return x*x } // JS

Slide 55

Slide 55 text

(defn square [x] (* x x)) (def squares (map square numbers)) (def numbers (range 10)) A taste of Clojure squares = numbers.map { it * it } //Groovy

Slide 56

Slide 56 text

(defn square [x] (* x x)) (def squares (map square numbers)) (def numbers (range 10)) (println (filter even? squares)) A taste of Clojure print(squares.filter(x=> x % 2 == 0)) // JS

Slide 57

Slide 57 text

Jens, sei mal ehrlich ... • Wie kann man diese Klammern mögen? • Das Ausbalancieren würde mich wahnsinnig machen!

Slide 58

Slide 58 text

Paredit • In Lisp Editoren schreibt man keinen Programmtext • Man manipuliert eine Datenstruktur • Erfordert zwei Tage Gewöhnungszeit* • Danach vermisst man es in Java * mit viel Fluchen

Slide 59

Slide 59 text

Fizz Buzz (defn div? [a b] (= 0 (mod a b))) (defn fizz-buzz-transform [e] (cond (div? e 15) :fizz-buzz (div? e 5) :buzz (div? e 3) :fizz true e)) (defn fizzbuzz [n] (map fizz-buzz-transform (range 1 (inc n))))

Slide 60

Slide 60 text

Keine Zeit ... • Persistent Data-Structures • ClojureScript • Parallele Verarbeitung • Makros • Asynchrone Programmierung (à la CSP/Go) • Polymorphismus • Clojure Specs und Generatives Testen • ...

Slide 61

Slide 61 text

Warum ich Clojure liebe • Ich habe keine Angst mehr vor Nebenläufigkeit • Datenzentrierung finde ich einleuchtend • Die Clojure Bibliothek ist toll • Der interaktive Entwicklungsstil liegt mir • Simplicity passt zu meiner Denkweise • OMG Funktionale Programmierung !!!! • Ich habe keine Angst vor Änderungen • Ich kann Clojure vertrauen

Slide 62

Slide 62 text

Mehr? • Clojure/ClojureScript lernen • https://www.maria.cloud/ • http://www.4clojure.com • http://clojurescriptkoans.com/ • http://clojurekoans.com/ • YouTube: Talks von Rich Hickey und Stuart Halloway • Buch: Clojure for the Brave and True