Kommerzielle Softwareentwicklung mit Haskell Ein Erfahrungsbericht Stefan Wehr factis research GmbH, Freiburg im Breisgau 7. Oktober 2011, Hal6 in Leipzig
Viele Fragen Wer sind wir? Wer bin ich? Wie setzen wir Haskell im kommerziellen Umfeld ein? Welche Vorteile haben wir durch Haskell? Mit welchen Problemen kämpfen wir? Welche Verbesserungen wären gut? Was haben wir gelernt? 2
Frage: Wer sind wir? Wer bin ich? Kleine Firma aus Freiburg i. Brsg. Gegründet 2001 Vier feste, etwa sechs freie Mitarbeiter Produktentwicklung im Bereich mobiler und serverbasierter Anwendungen Über mich: Haskell seit 2003 Erfahrung mit Haskell in zahlreichen wissenschaftlichen Projekten 3
Frage: Wie setzen wir Haskell im kommerziellen Umfeld ein? Produkt: Checkpad MED Elektronische Krankenakte auf dem ipad In der Entwicklung seit Anfang 2010 Pilotbetrieb in mehreren Krankenhäusern Substanzieller Teil in Haskell geschrieben 4
Architektur von Checkpad MED Krankenhaus Mobile Gateway Haskell SQL, HL7, DICOM XML, HTTP Protocol Buffers ipads Data Server 5
Aufgaben des Mobile Gateways Anpassung der Daten für das ipad Workflow Synchronisation 6
Architektur des Mobile Gateways XML, HTTP Newswatch Workflow Derivations Sync Protocol Buffers 7
Frage: Welche Vorteile haben wir durch Haskell? Hohe Ausdruckskraft Bibliothek zum bidirektionalen Serialisieren/Deserialisieren Statisches Typsystem DAG-Struktur mit statischer Garantie dass nur gewisse Knotentypen verbunden sind Kontrollierte Seiteneffekte Nebenläufigkeit mit STM Test der Netzwerkkommunikation durch Abstraktion über Netzwerkoperationen siehe nächste Folie Gute Testbarkeit QuickCheck Automatische Korrektheit Haskell Community 8
Nebenläufigkeit mit STM STM: Software Transactional Memory Atomare Ausführung dezidierter Codeblöcke Keine Locks Atomare Blöcke sind komponierbar Zitat: Ich habe noch nie Code geschrieben der (a) so nebenläufig war und (b) weniger Fehler wegen Nebenläufigkeit enthielt. 9
Erfolg mit STM Möglichst kurze Transaktionen do x <- atomically $ do y1 <- readtvar v1 Control.Exception.evaluate x y2 <- readtvar v2 let y1 = expensivecomputation y1 y2 writetvar v1 y1 return y1 Aufteilung des Zustands in TVars Zu grob: hohes Konfliktpotential Zu fein: unbequem, Inkonsistenzen möglich Überwachung wie oft eine Transaktion wiederholt wird 10
Frage: Mit welchen Problemen kämpfen wir? Welche Verbesserungen wären gut? Lazyness Laufzeit-Monitoring Bibliotheken, cabal-install Hohe Einstiegshürde 11
Lazyness Schwierige Balance zwischen lazy und strikt Striktheitsgrad für das Typsystem unsichtbar Striktheitsfragen sind low-level / operationell Ketzerische Fragen: wäre eine strikte Sprache mit Lazyness-Annotation nicht besser? 12
Laufzeit Monitoring Was macht der Server gerade? Warum verursacht eine STM Transaktion so viele Retries? Welche Threads laufen gerade? Welche Konstruktoren werden gerade alloziert?... 13
I have a dream Monitoring für Java GHC Profiler offline funktioniert nicht mit mehren Cores hohe Performanzverluste 14
Bibliotheken, cabal-install Viele Bibliotheken auf Hackage ungeeignet Nicht skalierbar, nicht performant, nicht korrekt Erfahrung nötig welche Bibliotheken geeignet Schreibe Bibliotheken selbst Problematisch für cabal-install: mehrere Version desselben Pakets Ausweg: eigenes hackage Repository Idee: stabile Teilmenge von hackage 15
Einstiegshürde Wenige Programmierer können Haskell Schritt vom Gelegenheitsprogrammierer zum professionellen Haskell Programmierer ist sehr groß Andere Sprache (wie z.b. Scala) bieten einen schrittweisen Einstieg 16
Frage: Was haben wir gelernt? Viele positive Erfahrungen mit Haskell Wichtigste negative Erfahrungen: Hohe Einstiegshürde Unzureichendes Runtime Monitoring 17
Erfahrungen mit Scala Scala Teilprojekte im Rahmen von Checkpad MED: DICOM Zugriff HL7 Zugriff Webapplikation zur Projektzeiterfassung Portierung der Haskell Bibliothek roundtrip nach Scala 18
Vergleich mit Scala Haskell Scala Ausdruckskraft + + Statisches Typsystem + + Kontrollierte Seiteneffekte + - STM +? Testbarkeit + + Automatische Korrektheit ++ + Community +? Lazyness? + Monitoring - + Bibliotheken + ++ Einstieg - + Achtung! Subjektiver Vergleich! 19
Resourcen Im Web: http://www.factisresearch.com, http://www.stefanwehr.de Hackage: http://hackage.haskell.org GHC Profiler: http://www.haskell.org/ghc/docs/latest/html/ users_guide/profiling.html Roundtrip, Bibliothek zum bidirektionalen Serialisieren/Deserialisieren: http://hackage.haskell.org/package/roundtrip HTF, Bibliothek zur Organisation von Unit Tests und QuickCheck Eigentschaften: http://hackage.haskell.org/package/htf STM in Haskell: Tim Harris, Simon Marlow, Simon Peyton-Jones, and Maurice Herlihy. Composable memory transactions. In Proceedings of the 10th ACM SIGPLAN symposium on Principles and practice of parallel programming, PPoPP 05, pages 48 60, New York, NY, USA, 2005. ACM. STM in Scala: http://nbronson.github.com/scala-stm/ David Pollack über Scala und Java (und fortgeschrittene Programmiersprachen im allgemeinen): http://goodstuff.im/scala-use-isless-good-than-java-use-for-at-l 20