Geekstammtisch

Mehr oder weniger regelmäßiger Stammtisch rund um Geektum, (Web)development und was immer unsere Gäste an interessanten Dingen zu erzählen haben

https://geekstammtisch.de/

subscribe
share





GST025 - Vom Tellerwäscher zum Lisp-Entwickler


Synopsis: Wir hatten Moritz Heidkamp aus Köln auf unserer Couch zu Gast und sprachen mit ihm über Lisp. Wir haben dabei ganz vorne bei John McCarthy angefangen und uns dann bis in die Gegenwart zu Clojure durchgebissen. Auf dem Weg dorthin lernen wir, wie zersplittert die Lisp-Gemeinde schon immer war und wohl auch immer sein wird. Was daraus für Probleme entstehen, aber vor allem welche Möglichkeiten es eröffnet. Den Abschluss macht ein Rückblick der EuroClojure und einige Buchempfehlungen für Einsteiger.

Intro (00:00:00)
  • Bierüberschuss im Home Office
  • 6th Cologne Web Performance Meetup: http://www.meetup.com/cologne-germany-high-performance-website-optimization-group/events/118740262/
Unser Gast (00:01:15)
  • Moritz Heidkamp, @DerGuteMoritz, http://ceaude.twoticketsplease.de/
  • Softwareentwickler seit 2006
  • wollte ursprünglich mal Deutsch- und Geschichtslehrer werden
  • studiert nun (ein bisschen) Informationsverarbeitung an der Uni Köln (Crossover aus Informatik und Geisteswissenschaften)
  • Gründungsmitglied RuRuG, der Vorläufer der heutigen cologne.rb (http://colognerb.de)
Informatik an den Schulen (00:05:55)
  • Moritz hatte einen guten Informatiklehrer
  • Basti leider nicht :-/
  • Wir fragen uns, ob es Informatik auf Lehramt gibt
  • Weil Informatiklehrer ja oft gar keine Informatiker sind
  • Rasberry Pi: http://www.raspberrypi.org
Von Ruby zu Lisp (00:10:58)
  • Moritz suchte eine Alternative zu Ruby und fand Lisp: http://de.wikipedia.org/wiki/Lisp
  • arbeitet für bevuta IT, wo u.a. Lisp kommerziell eingesetzt wird
  • Moritz macht auch Erlang bei bevuta
Elixir (00:14:23)
  • Elixir (http://elixir-lang.org/): "Elixir is a functional, meta-programming aware language built on top of the Erlang VM"
  • Reia (http://reia-lang.org/): "Reia is a Ruby-like scripting language for the Erlang virtual machine."
  • PeepCode "Meet Elixir" mit José Valim: https://peepcode.com/products/elixir
  • Joe Armstrong über Elixir: http://joearms.github.io/2013/05/31/a-week-with-elixir.html
  • Prolog: http://en.wikipedia.org/wiki/Prolog
  • Basti sieht die Gefahr, das Elixir und Ruby sich zu ähnlich sehen und das zu Verwirrungen führen könnte
  • Elixir macht einen schönen, konsistenten Eindruck
  • Tsung: http://tsung.erlang-projects.org
Lisp, eine Historie (00:25:30)
  • Clojure: http://clojure.org/
  • Joxa (http://joxa.org/), a concurrent distributed Lisp
  • The Concurrent Schemer: http://the-concurrent-schemer.github.io/scm-doc/)
  • The History of Lisp: http://www-formal.stanford.edu/jmc/history/lisp/lisp.html)
  • John McCarthy: http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)
  • Lambda-Kalkül: http://de.wikipedia.org/wiki/Lambda-Kalk%C3%BCl
  • Java: Lambda Expressions: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
  • Listen als Programme: (Operator Operant1 Operant2 ...)
  • S-expression, "symbolic expression": http://en.wikipedia.org/wiki/S-expression
  • M-expression, "meta expression": http://en.wikipedia.org/wiki/M-expression
  • Scheme: http://en.wikipedia.org/wiki/Scheme_(programming_language)
  • Ruby 2.1: Methoden Definitionen geben nun den Methoden Namen als Symbol zurück: http://rkh.im/ruby-2.1
  • Wir sprechen über den semantischen Unterschied von Symbolen und Strings
  • PicoLisp, ein minimalistisches Lisp: http://picolisp.com
  • Clojure hat dagegen ein deutlich reicheres Set an Datenstrukturen
  • Clojure legt viel Wert auf Immutability
  • Common Lisp: http://en.wikipedia.org/wiki/Common_Lisp
  • Emacs: http://www.gnu.org/software/emacs/
  • Es gibt verschiedene Modell Lisp laufen zu lassen: kompiliert, interpretiert, beides :)
  • Stalin, ein Scheme Compiler, "Stalin brutally optimizes.": http://en.wikipedia.org/wiki/Stalin_(scheme_implementation)
  • In akademischen Veröffentlichung wird oft ein Lisp als Beispielsprache verwendet
  • Insgesamt ist es sehr vielfältig, aber dabei (vielleicht) zu vielfältig
  • In der Regel sind die Dialekte nicht untereinander kompatibel
  • Die Lisp-Community neigt dazu, immer wieder neue Dialekte zu schaffen. Bedingt durch die Einfachheit dies zu tun.
  • Keine Konvergenz in Sicht :-)
  • In den 70er gab es bereits einen unüberschaubaren Wildwuchs an Dialekten. Daher die Initiative einen gemeinsamen Standard zu schaffen: Common Lisp, weil Standard Lisp gab es schon ^^
  • Hat bis in die 90er gedauert!
  • Ist jetzt aber ein ANSI-Standard
  • Entwicklung des Standards über Mail, Archiv: ftp://ftp.cs.rochester.edu/pub/archives/lisp-standards/
  • Ergebnis: 2000 Seiten langer Standard, Sprache inkl. Standard Bibliothek
  • Guy Steele hat in Form eines Buches vor Verabschiedung des Standards einfach Tatsachen geschaffen: https://en.wikipedia.org/wiki/Common_Lisp_the_Language
Lisp in der Praxis (00:56:17)
  • Probleme für den realen Einsatz ergeben sich durch die vielen Unterschiede allerdings weniger als man denkt
  • Trotzdem ist es ein Problem, dass sehr viel Energie "verloren" geht: Die tolle Bibliothek A lässt sich dann nicht in Lisp X verwenden
  • Man muss das Rad zwar relativ oft neu erfinden, aber es gibt zumindest einige Implementierung mit einer kleinen Community und Infrastruktur
  • Bei bevuta wird Chicken Scheme (http://www.call-cc.org/) eingesetzt und man kann etwa auf 500 Erweiterungen zugreifen ("Eggs", lassen sich ähnlich wie Rubygems installieren)
  • Insgesamt extremer Gegensatz zu Java: Bis ins letzte spezifizierte Sprache mit definiertem Verhalten
  • Stichwort Java: Clojure versucht den Nachteil von zu wenig Bibliotheken so auszugleichen, dass man auf Java-Bibliotheken zugreifen kann
  • Problem: Das Programmiermodell von Java passt nicht zu dem von Clojure
  • Die Abbildung von Java-Objekten in Clojure und deren Verwendung ist Aufgabe des Entwicklers
  • Für jede Klasse muss im Grunde eine neue Sprache gelernt werden
  • Eine Möglichkeit ist zum Beispiel Attribute aus einem Java-Objekt in eine Clojure-Map zu übertragen
  • Beispiel: Ring (https://github.com/ring-clojure/ring) übersetzt Requests aus Java-Webservern in Clojure-Maps und zurück
  • Lisps versuchen in der Regel alles auf Listen abzubilden, weil dafür gibt es schon alle Operationen
  • Klassen sind hingegen durch die Vorgaben des Entwicklers in ihrer Verwendung eingeschränkt
  • Zwei Kulturen treffen aufeinander, dazu gibt es von Rich Hickey (Clojure) einige gute Talks: https://www.youtube.com/watch?v=rI8tNMsozo0
  • Andere Ansätze/Modelle können/sollten Anregungen für die eigene "Welt" geben (z.B.: Immutability lässt sich auch in anderen Sprachen verwenden)
  • bevuta versucht so viel wie möglich in Scheme zu machen, aber gerade bei Mobilentwicklung ist das leider nicht möglich
    • Theoretisch läuft Clojure zwar auf Android, ist dort aber viel zu langsam
  • Aber: Die Businesslogik kann in Scheme geschrieben werden und wird anschließend nach C kompiliert, um das dann in Objective-C und Java (via JNI) einzubinden
  • Notwendiger Glue-Code ist sehr wenig, vor allem im Fall von Objective-C, JNI ist da anstrengender
  • Auch als Script-Sprache lässt sich Scheme ohne weiteres verwenden
  • Moritz macht alles™ in Emacs (soweit möglich), z.B.: Email, Todo-App. Gibt sogar einen PDF-Reader
  • Man könnte Emacs auch als Shell booten und dann aus Emacs bei Bedarf Shells starten, dabei kollidieren aber Keybindings (vor allem bei ncurses-Anwendungen). Also nicht so toll.
  • Stichwort Emacs als Betriebssystem: Es gab in den 70er- und 80er-Jahren auch Lisp-Maschinen: https://de.wikipedia.org/wiki/Lisp-Maschine
  • Wie die genau funktionieren ist bei uns dünnes Eis ^^
  • Entwicklung wurde dann Ende der 80er eingestellt, weil die Forschungsgelder im Bereich künstliche Intellegenz (vor allem vom Militär) zusammengestrichen wurden
EuroClojure (01:15:55)
  • Moritz war auf der EuroClojure in Berlin: http://euroclojure.com/2013/, ist die europäische Clojure Konferenz (~ 300 Teilnehmer)
  • Ansonsten ist Clojure sehr amerikanisch geprägt
  • Inhalt aber nicht ausschließlich Clojure, 2 Präsentationen über das eigene Lisp ;-)
  • Toy Lisp: https://www.google.com/search?q=toy%20lisp
  • Moritz hat mal eine Liste von Lisp-Implementierungen in Javascript zusammengestellt: Ergebnis 50+
  • Real-World-Clojure-Projekte auf der Konferenz:
    • dailymail.co.uk: Hat ihr uraltes Backend im laufenden Betrieb auf Clojure umgestellt
    • "Internet of Things"-Plattform ist von Rails nach Clojure migriert; Grund für Clojure war, sie haben am meisten in der kürzesten Zeit erreicht (im Vergleich zu anderen Technologien)
  • Clojures Webstack ist bereits sehr ausgereift, u.a. weil viele Ruby-Entwickler zu Clojure gegangen sind und Konzepte mitgenommen haben (Bsp.: Ring ist von Rack inspiriert)
  • Leider keine Aufzeichnung der Talks :-(
  • Besonders Schade um die Keynote:
    • Verhältnis zwischen der perfekten Architektur und der Abwesenheit von Architektur
    • Brasília als Beispiel von perfekt geplanter Stadt und dennoch wenig brauchbar
    • Beispiel von Städteplanung auf Softwareentwicklung
    • Java EE vs. PHP Frickelshop: Beides kann man nicht wirklich benutzen
    • Fazit: Ein gute Mischung von Struktur und Chaos finden
  • Moritz kann die Konferenz empfehlen, auch für Leute die sonst kein Clojure machen
  • Clojure ist auch in der Lisp-Community schnell aufgestiegen und gehört mittlerweile zu den Top-3
  • Positive Auswirkungen des Clojure-Hypes auf die Akzeptanz von Lisp konnte Moritz noch nicht feststellen
Getting Started (01:30:41)
  • Clojure hat eine sehr viel freundlichere Community als etwa Common Lisp, vergleichbar mit der von Ruby
  • Moritz selbst bewegt sich vor allem im Chicken Scheme Umfeld und der Entwickler mittlerweile ist auch bei bevuta eingestellt
  • Chicken Scheme hat auch eine angenehme Community in der man auch Einsteigern gerne weiterhilft (ähnlich zu Clojure)
  • Clojure und Chicken sind daher auf jeden Fall die Empfehlung für den Einstieg
  • Das Problem ist allerdings gutes Tutorial-Material zu bekommen:
    • Clojure ist da ganz gut aufgestellt, auch mit Büchern für Einsteiger
    • Die anderen Lisps tun sich damit sehr schwer
    • Ein gutes Buch für Common Lisp ist "Practical Common Lisp" von Peter Seibel (http://www.amazon.de/Practical-Common-Lisp-Peter-Seibel/dp/1590592395)
    • Auch für Common Lisp ist "Land of Lisp" von Conrad Barski (http://www.amazon.de/Land-Lisp-Learn-Program-Game/dp/1593272812/ref=sr_1_1?s=books-intl-de&ie=UTF8&qid=1382353124&sr=1-1&keywords=The+land+of+lisp)
    • Für Scheme sieht es da eher düster aus. Hauptwerk ist "Structure and Interpretation of Computer Programs" (http://www.amazon.de/Structure-Interpretation-Computer-Electrical-Engineering/dp/0262510871/ref=sr_1_1?s=books-intl-de&ie=UTF8&qid=1382353230&sr=1-1&keywords=Structure+and+Interpretation+of+Computer+Programs) was sehr akademisch ist. Weil es das ehemalige Lehrbuch des MIT ist.
    • Von den Vorlesungen (Anfang der 80er) gibt es sogar noch Videoaufzeichnungen
  • Usergroups in Köln:
    • Cologne Clojure: http://www.meetup.com/clojure-cologne (gibt aber auch was anderes als Clojure), Treffen in der Bottmühle
    • Moritz wollte mal eine Gruppe machen für Sprachen die eigentlich keine Rolle spielen , ähnlich der FringeDC von Conrad Barski (gibt es aber auch nicht mehr)


share







 2013-10-21  1h38m