Download pptx - Scala in practice

Transcript
Page 1: Scala in practice

Scala In Practice:A Case Study

Tomer GabelJuly 2013

Page 2: Scala in practice

H’ors D’oeuvres

Page 3: Scala in practice

Some context

circa 2011:

• Startup with limited budget• Cloud hosted, Linux based• Complex POC-grade codebase

– Lots of Java code– Serving paying customers

Page 4: Scala in practice

Strategy 101

Evolve codebase

Refactor and

extend

Supplant with new architectu

re

Complete rewrite

Amount of work involved

Page 5: Scala in practice

Data points

• Complete system rewrite impractical– Too much code– Business continuity a priority– Cannot afford product stagnation

• Team comfortable with Java platform

• … but want a better language

Page 6: Scala in practice

Why Scala?

• JVM-targeted, statically typed• Success stories (Twitter,

Foursquare, LinkedIn)• Active community• Good (not perfect) tool

ecosystem• Reasonable learning curve

Page 7: Scala in practice

Alternatives

• Dynamic• LISP dialect

• Dynamic• Java-like

syntax• Script-oriented• Static• Java-like

syntax• In its infancy

Page 8: Scala in practice

Scala in a nutshell

• Pervasive type inference

Page 9: Scala in practice

Scala in a nutshell

• Type aliases, closures, first class functions and comprehensions Output:

Page 10: Scala in practice

Scala in a nutshell

• Imperative with functional-style constructs

Page 11: Scala in practice

Scala in a nutshell

• Traits: static mixins

Page 12: Scala in practice

Scala in a nutshell

• Pattern matching FTW!

Page 13: Scala in practice

Scala in a nutshell

• Other goodies– Option wrappers (no more NPEs!)– Powerful collection framework– Implicit conversions– Concurrent, immutable maps

(HAMT)– Built in actors

Page 14: Scala in practice

Main course

Page 15: Scala in practice

Caveat emptor

• Scala is bleeding edge• You will get cut

– Learning curve– Rough edges– Partial/outdated documentation

• It’s well worth it, if you’re prepared!

Page 16: Scala in practice

Focal points

• Learning curve• Tooling• In production

Page 17: Scala in practice

Learning curve

• Risks:– Functional constructs need getting

used to– Few best practices:

• Coding conventions• Patterns• “Dangerous” features

Page 18: Scala in practice

Learning curve

• Mitigations:– Relatively familiar syntax– Seamless Java integration

• Evolve your codebase to include Scala• Reuse existing components and

libraries– Lots of wow moments!

Page 19: Scala in practice

Lessons learned

“New techniques are easy to explain. Old techniques are hard to maintain.” - an old Vulcan proverb

• Encourage experimentation• Encourage rapid iteration• Document and share new

techniques

Page 20: Scala in practice

Lessons learned

• Get a good grasp of the basics:– Functions and closures– Option wrappers– Pattern matching– Traits, traits and traits

• Each of these is immensely powerful

• Together, they make ponies!

Page 21: Scala in practice

Lessons learned

• Avoid wacky syntax!– Some common Scala libraries have

atrocious syntax (scalaz)– Does this make sense to you?

val p2c = ((_: Int) * (_: Int)).curriedsome(5) <*> (some(3) <*> p2c.pure[Option]) should equal(Some(15))

Page 22: Scala in practice

Lessons learned

• Promote functional constructs:– Intent over implementation–Massive code savings– Immutability, correct code by

design• Mentor junior developers!

Page 23: Scala in practice

Lessons learned

• Don’t go overboard– Use implicits sparingly– Avoid tuple overload

• x._1._2 * x._2 orElse x._3 == yuck• Use case classes and/or partial

functions instead– Path-dependent types are scary!

Page 24: Scala in practice

Focal points

• Learning curve• Tooling• In production

Page 25: Scala in practice

IDE Support

• Eclipse support via TypeSafe’s own ScalaIDE

• IntelliJ IDEA support via plugin

Page 26: Scala in practice

IDE support

• Loads better than a year or two ago– Mostly just works– ... but not up to Java standards yet

• Don’t skimp on dev hardware!• Take your time

– Assign a “go-to guy” (or gal)– Participate! (file bugs, track

commits)

Page 27: Scala in practice

IDE support

• Wonky debugging– Java debuggers work…– … with some caveats

• Step into synthetic stack frames• Do not step over closures

– TypeSafe are focusing on debugging

– JetBrains will likely follow

Page 28: Scala in practice

IDE support

• Expect the unexpected–Error analysis/highlighting

• May highlight correct code• May miss errors (worse!)

–Generally works correctly–The situation is improving daily

Page 29: Scala in practice

Build tools

• Native Scala build tool is sbt– Ivy2 (-> Maven repositories)– Scala syntax– Very powerful, steep learning curve

• Stay away from ant• Maven works well• … so do Buildr and Gradle

Page 30: Scala in practice

Compiler nasties

• Different compiler, different edge-cases– Scary compiler errors with 2.10.x– Much less of an issue since 2.10.2

• Slow compilation– sbt helps. A lot– IDEA “external compiler” helps too

Page 31: Scala in practice

Library ecosystem

• Surprisingly mature landscape!

Testing: Specs2 ScalaTest

ORM: Slick Squeryl

Web: Play! Lift Scalara

Concurrency:

Akka Finagle

Page 32: Scala in practice

Library ecosystem

• Use your favorite Java libraries natively!– Yes, this includes Spring, Guice and

Hibernate• Usually with no interop pain

– Options can help a lot– Callbacks may need a little work

Page 33: Scala in practice

Focal points

• Learning curve• Tooling• In production

Page 34: Scala in practice

GC considerations

• Lots of generated classes– Higher PermGen utilization– Increase -XX:MaxPermSize

• Lots of intermediate objects– High eden space churn (normally

OK)– Tune with –XX:NewRatio

Page 35: Scala in practice

Other considerations

• Scala compiler emits lots of synthetic code–Deep call graph– Intermediate stack frames

• Default stack often too small– -Xss=2m should do

Page 36: Scala in practice

Error analysis

• Scala stack traces look different– Lots of intermediate frames– … and delegations– … and unusual symbols

• You get used to it very quickly• Takipi’s Stackifier can help

Page 37: Scala in practice

Dessert

Page 38: Scala in practice

1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96 101 106 111 116 121 1260K

20000K

40000K

60000K

80000K

100000K

120000K

140000K

160000K

180000K

200000K

Codebase Evolution

ScalaJava

Weeks

KLO

CCodebase evolution

Page 39: Scala in practice

Conclusion

• I would recommend Scala for:– Startups willing to take the plunge– Small teams of senior developers– Large enterprises with tech

advisory/leadership teams• But not (yet) for:

– Contractors– Traditional enterprises

Page 40: Scala in practice

Questions?… answers may be forthcoming

Page 41: Scala in practice

Afterword

• newBrandAnalytics for allowing the use of the company name and R&D evidence

• Typesafe and the amazing Scala community for making Scala what it is

• … and SmileTemplate.com for the PowerPoint template

• Get in touch!– [email protected]– http://www.tomergabel.com