Java to Scala: Why & How

3,305
-1

Published on

Updated notes on why and how we've moved from doing development in java to doing in scala.

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

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

No notes for slide
  • \n
  • \n
  • the guardian web site, started ~ 1996, refreshed to current design/platform ~2006+\n > 50m unique visitors a month. \nwe also print a newspaper\n\n
  • nb: counts of based on wc of non-test code\nimplemented with assistance of our friends from ThoughtWorks (disclosure: I used to work for them)\n
  • nb: counts of based on wc of non-test code\nimplemented with assistance of our friends from ThoughtWorks (disclosure: I used to work for them)\n
  • nb: counts of based on wc of non-test code\nimplemented with assistance of our friends from ThoughtWorks (disclosure: I used to work for them)\n
  • nb: counts of based on wc of non-test code\nimplemented with assistance of our friends from ThoughtWorks (disclosure: I used to work for them)\n
  • nb: counts of based on wc of non-test code\nimplemented with assistance of our friends from ThoughtWorks (disclosure: I used to work for them)\n
  • \n
  • a week is a long time in politics... two weeks is a very long time on the internet\naccidental problems: property converters, repositories, strategies, platform transaction managers, why isn’t this a bean etc etc etc\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • ... that gives us improved speed for change without binning our runtime platform?\n
  • erm, that Third Way didn’t really work\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Doesn’t just save typing - soon you start writing code like a dynamic language, with the compiler double-checking\n
  • \n
  • \n
  • \n
  • excited that as other media orgs look to restrict access to content, we look to open access and engage with the rest of the web\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Can understand this - prob becuase using java for years\nEvery language has funky bits\nWorking thru a scala tutorial won’t teach you everything about scala!\n\n\n
  • \n\n
  • Sometimes need to be a bit careful about precedence (use brackets) and where you put line breaks.\nObvious opportunity to misuse!\n
  • Sometimes need to be a bit careful about precedence (use brackets) and where you put line breaks.\n
  • For Java folk, think of this as neat syntax for an anonymous inner class\n
  • Sorry this is two slides.\n
  • Often used to “pimp” libraries\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Java to Scala: Why & How

    1. 1. HOW WE MOVED FROM JAVA TO SCALA Graham Tackley guardian.co.uk @tackers
    2. 2. mo stlyHOW WE MOVED FROM JAVA^TO SCALA Graham Tackley guardian.co.uk @tackers
    3. 3. History• Java shop since 2006• guardian.co.uk: java + spring + velocity + hibernate + oracle
    4. 4. History• Java shop since 2006• guardian.co.uk: java + spring + velocity + hibernate + oracle• ~100k lines production java code
    5. 5. History• Java shop since 2006• guardian.co.uk: java + spring + velocity + hibernate + oracle• ~100k lines production java code• ~45k lines in velocity templates
    6. 6. History• Java shop since 2006• guardian.co.uk: java + spring + velocity + hibernate + oracle• ~100k lines production java code• ~45k lines in velocity templates• ... and ~35k xml
    7. 7. The Reality• This code base still lives!• We can still enhance and improve• We still release (at least) every two weeks
    8. 8. The Reality• This code base still lives!• We can still enhance and improve• We still release (at least) every two weeks BUT
    9. 9. The Java “BUT”• Want to innovate faster• Lots of code in current solution...• ... takes a while to do what should be simple things ...• ... and often solving a problem once or twice removed from the actual problem
    10. 10. We tried analternative...
    11. 11. Python + Django• Easy to learn• Great web-focused framework, so most things we wanted were out of the box• Really good documentation & web support
    12. 12. Python + Django• Easy to learn• Great web-focused framework, so most things we wanted were out of the box• Really good documentation & web support BUT
    13. 13. The Python “BUT”
    14. 14. The Python “BUT”• Had to throw away years of java experience
    15. 15. The Python “BUT”• Had to throw away years of java experience• Dev environment totally different (virtualenv, testing, ci, packaging...)
    16. 16. The Python “BUT”• Had to throw away years of java experience• Dev environment totally different (virtualenv, testing, ci, packaging...)• Runtime behaviour totally different (mod_wsgi, pgbouncer...)
    17. 17. The Python “BUT”• Had to throw away years of java experience• Dev environment totally different (virtualenv, testing, ci, packaging...)• Runtime behaviour totally different (mod_wsgi, pgbouncer...)• Diagnostic tools totally different (stats capture, heap dumps, stack dumps, logging...)
    18. 18. The Python “BUT”• Had to throw away years of java experience• Dev environment totally different (virtualenv, testing, ci, packaging...)• Runtime behaviour totally different (mod_wsgi, pgbouncer...)• Diagnostic tools totally different (stats capture, heap dumps, stack dumps, logging...)• More moving parts (e.g. redis where we’d use singletons on the jvm)
    19. 19. The Python “BUT”• We lost as much (if not more) time operationally as we saved in development time• For us, switching platform simply did not make sense
    20. 20. Is there a Third Way?
    21. 21. Is there a Third Way?
    22. 22. Is there a Third Way?
    23. 23. Is there a Third Way?Scala is a statically typed, compiled language running on the jvm that “feels” like a dynamic language.
    24. 24. What’s so good about Scala?
    25. 25. Same tools, libs, deployment & runtime characteristics as Java• We still use IntelliJ (with the scala plugin)• It’s just bytecode• All the experience of running jvm in production still applies• Can still use java libraries
    26. 26. Mixed Scala-Java Projects Work• Scala compiler can parse java, so can have one project containing both java & scala...• ... with bi-directional dependencies• We use this extensively to get the benefits of scala without big bang porting
    27. 27. Much less verbose =>
    28. 28. Type inferenceArrayList<String> myList = new ArrayList<String>(); =>val myList = new ArrayList[String]
    29. 29. Console / REPL• Encourages ipython / irb attitude• Awesome for experimentation and exploration
    30. 30. Powerful collections library
    31. 31. Our First Scala Project: Content API
    32. 32. Content API• Provide API to access all of our website content• Limited beta released early 2009• Started implementation of final version late 2009• Live May 2010: http://content.guardianapis.com
    33. 33. 2009 2010 2011Nov • Started implementation • java + guice + guice servlets + apache solr • 3-4 java devs
    34. 34. 2009 2010 2011Nov • A few people had played with scala • No production scala code
    35. 35. 2009 2010 2011 Jan • Integration tests with ScalaTest • maven-scala-plugin
    36. 36. 2009 2010 2011 Jan
    37. 37. 2009 2010 2011 Jan A fair bit of our test code was java-without- semicolons as we learnt about Scala...
    38. 38. 2009 2010 2011 Jan A fair bit of our test code was java-without- semicolons as we learnt about Scala...
    39. 39. 2009 2010 2011 Feb ... despite that we loved it so much that after a month we decided to convert the whole app to Scala java + guice + guice servlets + apache solr
    40. 40. 2009 2010 2011 Feb ... despite that we loved it so much that after a month we decided to convert the whole app to Scala scala + guice + guice servlets + apache solr
    41. 41. 2009 2010 2011 May Live!
    42. 42. 2009 2010 2011 Jul Switched from maven to simple-build-tool Mainly for incremental compilation
    43. 43. 2009 2010 2011 Jul scala + guice + guice servlets + apache solr
    44. 44. 2009 2010 2011 Jul scala + lift + apache solr 5k loc => 3.5k (mostly due to writing better scala)
    45. 45. 2009 2010 2011 Today • Scala used by default on all new jvm-based projects • Still do some (externally-hosted) new things in python • Team of 20 ex-java devs all audibly groan when working on java rather than scala
    46. 46. The Scala “BUT”?
    47. 47. The Scala “BUT”?But, isn’t Scala really complex?
    48. 48. The Scala “BUT”? This example taken from Cay Horstmannhttp://weblogs.java.net/blog/cayhorstmann/archive/2011/10/05/javaone-2011- day-3
    49. 49. The Four ScalaFeatures That Scare Java Developers...
    50. 50. The Four ScalaFeatures That Scare Java Developers... ... can all be explained in one slide each
    51. 51. Symbolic method namesclass Complex(real: Double, imag: Double) { def +(other: Complex) = ....}
    52. 52. Infix & Postfix Operations• obj.op(x) can be written obj op x• obj.op can be written obj op
    53. 53. Infix & Postfix Operations• obj.op(x) can be written obj op x• obj.op can be written obj op So given: val a = new Complex(1, 3) val b = new Complex(3, 4) Can write: a.+(b) as a+b
    54. 54. Higher order functionsscala> def apply(f: Int => Int, v: Int) = f(v)apply: (f: Int => Int, v: Int)Intscala> apply(i => i * 2, 7)res1: Int = 14
    55. 55. Higher order functionsscala> def apply(f: Int => Int, v: Int) = f(v)apply: (f: Int => Int, v: Int)Intscala> apply(i => i * 2, 7)res1: Int = 14scala> apply(_ * 2, 7)res2: Int = 14
    56. 56. Higher order functions (ii)// Java Integer run(Callable<Integer> fn) throws Exception {  return fn.call(); } Integer processInt(final Integer i) throws Exception {  return run(new Callable<Integer>() {  public Integer call() throws Exception {  return i + 1;         }     });}
    57. 57. Higher order functions (ii)// Java Integer run(Callable<Integer> fn) throws Exception {  return fn.call(); } Integer processInt(final Integer i) throws Exception {  return run(new Callable<Integer>() {  public Integer call() throws Exception {  return i + 1;         }     });}// Scaladef run(f: => Int) = fdef processInt(i: Int) = run(i + 1)
    58. 58. Implicit Conversion• given an in-scope declaration implicit def conv(a: A): B• “conv” will be called whenever you have an A and need a B• or you call a method on an instance of A that doesn’t exist on A but does on B
    59. 59. Writing Good Scala
    60. 60. Writing Good Scala• Express your Intent. Simply.
    61. 61. Writing Good Scala• Express your Intent. Simply.• The pram is full of toys. Use only to achieve the above.
    62. 62. Demo
    63. 63. Summary• Smooth migration path from Java• Take it easy, and don’t fear java-without- semicolons in the early days• You’ll lose if you stay there though!• Incrementally embrace Scala features to increase readability• Expect to keep learning
    64. 64. • http://content.guardianapis.com• http://www.guardian.co.uk/open-platform• http://github.com/guardian/open-platform- content-api-scala-client graham.tackley@guardian.co.uk ■ @tackers
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×