SlideShare a Scribd company logo
1 of 57
Download to read offline
in PracticeScala
@patforna
patric.fornasier@springer.com
3 years later…
Context
Context
Pat
Springer
Software
Engineer
Technical
Principal
10+ years
Academic
Publisher
Pretty Large
Springer
Link
Strategic
95 % Online
Revenue
66 % Total
Revenue
9 Mio items
2TB XML
Re-built
3 years ago
Content
Delivery
Platform
52 Mio
PageViews / Month
99.9%
Availability
Scala NoSql
Co-Sourced
Team
TW
Ex-TW
Springer
Global
CD
SpringerLink
Timeline
Start
development
Cycling
Trip
Re-joined
Product -> platform
Paying back tech debt
Today
04/11 04/12 08/13 04/14
Inception
05/12 09/12
Bookfair
Release
RD
Live
User migration,
enhancements
Link
Live
Smart
Books
Live
Enhancements
Looking back: why scala?
• Increase productivity
• Be more attractive employer
• Team decision
Looking back: good vs bad
Good
• Functional programming
• Terse syntax
• JVM ecosystem
• Gentle learning curve
• DSL friendly syntax
• Motivated team
Bad
• Tool support
• Compilation times
• Language complexity #moreRope
Fast-forward
Fast-forward (Aug 2013)
• 2.5 years into project
• 1.5 years of weekly live releases
• 100k LOC
• >10k commits
• >90 committers
Fast-forward (Aug 2013)
• 2.5 years into project
• 1.5 years of weekly live releases
• 100k LOC
• >10k commits
• >90 committers
not all related to Scala - to be fair
• Poor feedback loops
• Lots of accidental complexity
Trend (2 years)
LOC
~ 100k
Trend (2 years)
build time
LOC
Trend (2 years)
build time
LOC
• 1:34 min src/main
• 6:44 min src/test
• 8:18 min total
What did we do?
What did we do
• Reduced build time
• Improved feedback loops
• Reduced accidental complexity
Build time
• Reduced size of codebase (broke off vertical slices, pulled out APIs, pulled out libraries,
removed unused features, removed low-value tests, etc.)
• Reduced usage of certain language features (esp. traits and implicits)
Trend (Dec 2013)
LOC
Trend (Dec 2013)
build time
# traits
LOC
unable to compile on	

13” macbook
Trend (Dec 2013)
build time
# traits
LOC
unable to compile on	

13” macbook
The problem with traits
• Will re-compile on every class the trait is mixed in
• Slows down dev-build cycle
• Will result in byte code bloat
• Will compile *a lot* slower
!
For faster compile times:
• Use pure traits
• Use old-school composition for code re-use
• Use pure functions via imports (e.g. import Foo._)
• If unavoidable, use inheritance for code re-use
Build time
Build time
• 1:34 min src/main
• 6:44 min src/test
• 8:18 min total
Build time
• 1:34 min src/main
• 6:44 min src/test
• 8:18 min total
• 0:24 min src/main
• 3:11 min src/test
• 3:35 min total
Build time (on CI server)
• Incremental compilation on CI
• Only one dedicated CI agent
• Physical build servers
• CPUs with higher clock speed
Build time (on CI server)
• Incremental compilation on CI
• Only one dedicated CI agent
• Physical build servers
• CPUs with higher clock speed
Complexity
Complexity
• There’s still a lot of code in our codebase that is hard to read
• It seems to be very easy to shoot yourself in the foot with Scala
• Scala *is* complex (and that’s why scalac will never be as fast as javac)
Complexity
• There’s still a lot of code in our codebase that is hard to read
• It seems to be very easy to shoot yourself in the foot with Scala
• Scala *is* complex (and that’s why scalac will never be as fast as javac)
Invariant/covariant/contravariant types (T, +T and -T)	
Refined types (new Foo {...})	
Structural types (x: {def y: Int})	
Path dependant types (a.B)	
Specialized types (@specialized)	
Self types (this =>)	
Projection types (A#B)	
Existential types (M[_])	
Type bounds (<:, >:) 	
Type constraints (=:=, <:< and <%<)	
Type members (type T)	
Type aliases (type T = Int)	
Type classes ( (implicit ...) )	
View bounds (<%)	
Higher kinded types (* => *)	
F-Bounded type polymorphism (M[T <: M[T]])
http://nurkiewicz.github.io/talks/2014/scalar/#/16
Not opinionated
For example: http://twitter.github.io/effectivescala/
• Many ways to do the same thing
• Coding conventions help, but only so much
Not opinionated
def foo() = "foo"	
def bar = "bar"	
!
foo	
foo()	
bar	
bar() // won't compile
For example: http://twitter.github.io/effectivescala/
• Many ways to do the same thing
• Coding conventions help, but only so much
Not opinionated
def foo() = "foo"	
def bar = "bar"	
!
foo	
foo()	
bar	
bar() // won't compile
For example: http://twitter.github.io/effectivescala/
• Many ways to do the same thing
• Coding conventions help, but only so much
def baz(x: String) = x	
“x”.charAt(0)	
“x” charAt(0) // won't compile	
“x”.charAt 0 // won't compile	
“x” charAt 0	
baz("x")	
baz “x" // won't compile
Not opinionated
def foo() = "foo"	
def bar = "bar"	
!
foo	
foo()	
bar	
bar() // won't compile
list.foreach { x => println(x) }	
list.foreach ( x => println(x) )	
list.foreach { println(_) }	
list.foreach ( println(_) )	
list foreach { x => println(x) }	
list foreach ( x => println(x) )	
list foreach { println(_) }	
list foreach ( println(_) )
For example: http://twitter.github.io/effectivescala/
• Many ways to do the same thing
• Coding conventions help, but only so much
def baz(x: String) = x	
“x”.charAt(0)	
“x” charAt(0) // won't compile	
“x”.charAt 0 // won't compile	
“x” charAt 0	
baz("x")	
baz “x" // won't compile
Not opinionated
def foo() = "foo"	
def bar = "bar"	
!
foo	
foo()	
bar	
bar() // won't compile
list.foreach { x => println(x) }	
list.foreach ( x => println(x) )	
list.foreach { println(_) }	
list.foreach ( println(_) )	
list foreach { x => println(x) }	
list foreach ( x => println(x) )	
list foreach { println(_) }	
list foreach ( println(_) )
if (foo) "x" else "y"	
	
foo match {	
case true => "x"	
case _ => "y"	
}
For example: http://twitter.github.io/effectivescala/
• Many ways to do the same thing
• Coding conventions help, but only so much
def baz(x: String) = x	
“x”.charAt(0)	
“x” charAt(0) // won't compile	
“x”.charAt 0 // won't compile	
“x” charAt 0	
baz("x")	
baz “x" // won't compile
Surprises
http://dan.bodar.com/2013/12/04/wat-scala/
Surprises
List(1, 2, 3).toSet
http://dan.bodar.com/2013/12/04/wat-scala/
Surprises
List(1, 2, 3).toSet
scala.collection.immutable.Set[Int] = Set(1, 2, 3)
http://dan.bodar.com/2013/12/04/wat-scala/
Surprises
List(1, 2, 3).toSet
scala.collection.immutable.Set[Int] = Set(1, 2, 3)
List(1, 2, 3).toSet()
http://dan.bodar.com/2013/12/04/wat-scala/
Surprises
List(1, 2, 3).toSet
scala.collection.immutable.Set[Int] = Set(1, 2, 3)
List(1, 2, 3).toSet()
Boolean = false
http://dan.bodar.com/2013/12/04/wat-scala/
Implicits
• Can make it very hard to read code
• Tool support is very bad
• Impacts compilation time
• Surprising behaviour (esp. when used with overloaded methods or optional params)
Tooling
def handle(response: HttpResponse, request: HttpRequest)
• Tool support is still very basic
• Makes it hard to continuously refactor (which means people are less likely to do it)
Tooling
def handle(response: HttpResponse, request: HttpRequest)
• Tool support is still very basic
• Makes it hard to continuously refactor (which means people are less likely to do it)
no luck with “change signature”
refactoring support
Trait entanglements
• Makes it difficult to reason about behaviour
Trait entanglements
• Makes it difficult to reason about behaviour
trait A {
def foo = "a"
}
Trait entanglements
• Makes it difficult to reason about behaviour
trait A {
def foo = "a"
}
trait B extends A {
override def foo = "b"
}
Trait entanglements
• Makes it difficult to reason about behaviour
trait A {
def foo = "a"
}
trait B extends A {
override def foo = "b"
}
class C extends A with B
new C().foo
Trait entanglements
• Makes it difficult to reason about behaviour
trait A {
def foo = "a"
}
trait B extends A {
override def foo = "b"
}
class C extends A with B
new C().foo
"b"
Trait entanglements
• Makes it difficult to reason about behaviour
trait A {
def foo = "a"
}
trait B extends A {
override def foo = "b"
}
class C extends A with B
new C().foo
"b"
class D extends B with A
new D().foo
Trait entanglements
• Makes it difficult to reason about behaviour
trait A {
def foo = "a"
}
trait B extends A {
override def foo = "b"
}
class C extends A with B
new C().foo
"b"
class D extends B with A
new D().foo
"b"
Trait entanglements (2)
ArticlePageSteps
WebDriverSupport
AuthorStepsCoverImageSteps
SummarySection
Waiter SectionPageSteps
CommonPageSteps
WebElementSupport
Assertions
Uris TripleEquals
OnHost TripleEqualsSupport
MachineNames
Trait entanglements (3)
ArticlePageSteps_0
WebDriverSupport_1 AuthorSteps_1 CoverImageSteps_1 SummarySection_1Waiter_1 SectionPageSteps_1 CommonPageSteps_1
CommonPageSteps_2 WebElementSupport_2Assertions_2 WebDriverSupport_2Uris_2
WebElementSupport_3 WebDriverSupport_3Uris_3 TripleEquals_3 OnHost_3
OnHost_4 TripleEqualsSupport_4 MachineNames_4
MachineNames_5
Trait entanglements (3)
ArticlePageSteps_0
WebDriverSupport_1 AuthorSteps_1 CoverImageSteps_1 SummarySection_1Waiter_1 SectionPageSteps_1 CommonPageSteps_1
CommonPageSteps_2 WebElementSupport_2Assertions_2 WebDriverSupport_2Uris_2
WebElementSupport_3 WebDriverSupport_3Uris_3 TripleEquals_3 OnHost_3
OnHost_4 TripleEqualsSupport_4 MachineNames_4
MachineNames_5
Trait entanglements (4)
ArticlePageTests_0
ArticlePageSteps_1 AboutSectionSteps_1 SearchResultsPageSteps_1 Uris_1 ArticleTestFixture_1 JavascriptSupport_1 IssuePageSteps_1 CommonAbstractSteps_1 GoogleAnalyticsSteps_1 FakeEntitlementSteps_1 ExportCitationPageSteps_1 FullTextPageSteps_1 OtherActionsSectionSteps_1
WebDriverSupport_2 AuthorSteps_2 CoverImageSteps_2 SummarySection_2Waiter_2 SectionPageSteps_2 CommonPageSteps_2
CommonPageSteps_3 WebElementSupport_3Assertions_3 WebDriverSupport_3Uris_3
WebElementSupport_4 WebDriverSupport_4Uris_4 TripleEquals_4 OnHost_4
OnHost_5 TripleEqualsSupport_5 MachineNames_5
MachineNames_6
Trait entanglements (4)
ArticlePageTests_0
ArticlePageSteps_1 AboutSectionSteps_1 SearchResultsPageSteps_1 Uris_1 ArticleTestFixture_1 JavascriptSupport_1 IssuePageSteps_1 CommonAbstractSteps_1 GoogleAnalyticsSteps_1 FakeEntitlementSteps_1 ExportCitationPageSteps_1 FullTextPageSteps_1 OtherActionsSectionSteps_1
WebDriverSupport_2 AuthorSteps_2 CoverImageSteps_2 SummarySection_2Waiter_2 SectionPageSteps_2 CommonPageSteps_2
CommonPageSteps_3 WebElementSupport_3Assertions_3 WebDriverSupport_3Uris_3
WebElementSupport_4 WebDriverSupport_4Uris_4 TripleEquals_4 OnHost_4
OnHost_5 TripleEqualsSupport_5 MachineNames_5
MachineNames_6
Imagine many more circle here
So, what’s next?
Today
• We’ve delivered successfully using Scala
• Don’t think we’re more productive (pure gut feeling, though)
• We try to stick to the good parts (conventions, functional programming, pattern matching, etc.)
• Complexity, slow compilation and lack of tool support are real problems
The future
• No urgency to move away from Scala or re-write existing systems
• Java 8 is an alternative
• Smaller teams and apps will probably lead to more polyglotism (and less Scala)
Thanks
@patforna
patric.fornasier@springer.com
http://joinit.springer.com

More Related Content

What's hot

Building Efficient and Reliable Crawler System With Sidekiq Enterprise
Building Efficient and Reliable Crawler System With Sidekiq EnterpriseBuilding Efficient and Reliable Crawler System With Sidekiq Enterprise
Building Efficient and Reliable Crawler System With Sidekiq EnterpriseGary Chu
 
Product Managers are from Pluto and UXers are from Uranus
Product Managers are from Pluto and UXers are from UranusProduct Managers are from Pluto and UXers are from Uranus
Product Managers are from Pluto and UXers are from UranusProduct Anonymous
 
Donald Ferguson - Old Programmers Can Learn New Tricks
Donald Ferguson - Old Programmers Can Learn New TricksDonald Ferguson - Old Programmers Can Learn New Tricks
Donald Ferguson - Old Programmers Can Learn New TricksServerlessConf
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and AbstractionsMetosin Oy
 
Extending Ansible - Ansible Benelux meetup - Amsterdam 11-02-2016
Extending Ansible - Ansible Benelux meetup - Amsterdam 11-02-2016Extending Ansible - Ansible Benelux meetup - Amsterdam 11-02-2016
Extending Ansible - Ansible Benelux meetup - Amsterdam 11-02-2016Pavel Chunyayev
 
RubyConf China 2015 - Rails off assets pipeline
RubyConf China 2015 - Rails off assets pipelineRubyConf China 2015 - Rails off assets pipeline
RubyConf China 2015 - Rails off assets pipelineFlorian Dutey
 
Why Enterprises Are Embracing the Cloud
Why Enterprises Are Embracing the CloudWhy Enterprises Are Embracing the Cloud
Why Enterprises Are Embracing the CloudRandy Shoup
 
Devops and Immutable infrastructure - Cloud Expo 2015 NYC
Devops and Immutable infrastructure  - Cloud Expo 2015 NYCDevops and Immutable infrastructure  - Cloud Expo 2015 NYC
Devops and Immutable infrastructure - Cloud Expo 2015 NYCJohn Willis
 
An Introduction to Reactive Application, Reactive Streams, and options for JVM
An Introduction to Reactive Application, Reactive Streams, and options for JVMAn Introduction to Reactive Application, Reactive Streams, and options for JVM
An Introduction to Reactive Application, Reactive Streams, and options for JVMSteve Pember
 
The Netflix API Platform for Server-Side Scripting
The Netflix API Platform for Server-Side ScriptingThe Netflix API Platform for Server-Side Scripting
The Netflix API Platform for Server-Side ScriptingKatharina Probst
 
EXPERTALKS: Jul 2012 - Build using Gradle
EXPERTALKS: Jul 2012 - Build using GradleEXPERTALKS: Jul 2012 - Build using Gradle
EXPERTALKS: Jul 2012 - Build using GradleEXPERTALKS
 
Test Automation for Packaged Systems: Yes, You Can!
Test Automation for Packaged Systems: Yes, You Can!Test Automation for Packaged Systems: Yes, You Can!
Test Automation for Packaged Systems: Yes, You Can!TechWell
 
Ansible benelux meetup - Amsterdam 27-5-2015
Ansible benelux meetup - Amsterdam 27-5-2015Ansible benelux meetup - Amsterdam 27-5-2015
Ansible benelux meetup - Amsterdam 27-5-2015Pavel Chunyayev
 
Lessons from Branch's launch
Lessons from Branch's launchLessons from Branch's launch
Lessons from Branch's launchaflock
 
Taking Gliffy to the Cloud – Moving to Atlassian Connect - Mike Cialowicz
Taking Gliffy to the Cloud – Moving to Atlassian Connect - Mike CialowiczTaking Gliffy to the Cloud – Moving to Atlassian Connect - Mike Cialowicz
Taking Gliffy to the Cloud – Moving to Atlassian Connect - Mike CialowiczAtlassian
 
AWS Summit New York Recap 2016
AWS Summit New York Recap 2016AWS Summit New York Recap 2016
AWS Summit New York Recap 2016CloudHesive
 
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015Pavel Chunyayev
 

What's hot (20)

Building Efficient and Reliable Crawler System With Sidekiq Enterprise
Building Efficient and Reliable Crawler System With Sidekiq EnterpriseBuilding Efficient and Reliable Crawler System With Sidekiq Enterprise
Building Efficient and Reliable Crawler System With Sidekiq Enterprise
 
Product Managers are from Pluto and UXers are from Uranus
Product Managers are from Pluto and UXers are from UranusProduct Managers are from Pluto and UXers are from Uranus
Product Managers are from Pluto and UXers are from Uranus
 
Donald Ferguson - Old Programmers Can Learn New Tricks
Donald Ferguson - Old Programmers Can Learn New TricksDonald Ferguson - Old Programmers Can Learn New Tricks
Donald Ferguson - Old Programmers Can Learn New Tricks
 
Beyond The Rails Way
Beyond The Rails WayBeyond The Rails Way
Beyond The Rails Way
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and Abstractions
 
Evolving the Netflix API
Evolving the Netflix APIEvolving the Netflix API
Evolving the Netflix API
 
Extending Ansible - Ansible Benelux meetup - Amsterdam 11-02-2016
Extending Ansible - Ansible Benelux meetup - Amsterdam 11-02-2016Extending Ansible - Ansible Benelux meetup - Amsterdam 11-02-2016
Extending Ansible - Ansible Benelux meetup - Amsterdam 11-02-2016
 
RubyConf China 2015 - Rails off assets pipeline
RubyConf China 2015 - Rails off assets pipelineRubyConf China 2015 - Rails off assets pipeline
RubyConf China 2015 - Rails off assets pipeline
 
Skype goes agile
Skype goes agileSkype goes agile
Skype goes agile
 
Why Enterprises Are Embracing the Cloud
Why Enterprises Are Embracing the CloudWhy Enterprises Are Embracing the Cloud
Why Enterprises Are Embracing the Cloud
 
Devops and Immutable infrastructure - Cloud Expo 2015 NYC
Devops and Immutable infrastructure  - Cloud Expo 2015 NYCDevops and Immutable infrastructure  - Cloud Expo 2015 NYC
Devops and Immutable infrastructure - Cloud Expo 2015 NYC
 
An Introduction to Reactive Application, Reactive Streams, and options for JVM
An Introduction to Reactive Application, Reactive Streams, and options for JVMAn Introduction to Reactive Application, Reactive Streams, and options for JVM
An Introduction to Reactive Application, Reactive Streams, and options for JVM
 
The Netflix API Platform for Server-Side Scripting
The Netflix API Platform for Server-Side ScriptingThe Netflix API Platform for Server-Side Scripting
The Netflix API Platform for Server-Side Scripting
 
EXPERTALKS: Jul 2012 - Build using Gradle
EXPERTALKS: Jul 2012 - Build using GradleEXPERTALKS: Jul 2012 - Build using Gradle
EXPERTALKS: Jul 2012 - Build using Gradle
 
Test Automation for Packaged Systems: Yes, You Can!
Test Automation for Packaged Systems: Yes, You Can!Test Automation for Packaged Systems: Yes, You Can!
Test Automation for Packaged Systems: Yes, You Can!
 
Ansible benelux meetup - Amsterdam 27-5-2015
Ansible benelux meetup - Amsterdam 27-5-2015Ansible benelux meetup - Amsterdam 27-5-2015
Ansible benelux meetup - Amsterdam 27-5-2015
 
Lessons from Branch's launch
Lessons from Branch's launchLessons from Branch's launch
Lessons from Branch's launch
 
Taking Gliffy to the Cloud – Moving to Atlassian Connect - Mike Cialowicz
Taking Gliffy to the Cloud – Moving to Atlassian Connect - Mike CialowiczTaking Gliffy to the Cloud – Moving to Atlassian Connect - Mike Cialowicz
Taking Gliffy to the Cloud – Moving to Atlassian Connect - Mike Cialowicz
 
AWS Summit New York Recap 2016
AWS Summit New York Recap 2016AWS Summit New York Recap 2016
AWS Summit New York Recap 2016
 
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015
 

Viewers also liked

Презентация 1.25 - Диспетчеризация инженерных систем
Презентация 1.25 - Диспетчеризация инженерных системПрезентация 1.25 - Диспетчеризация инженерных систем
Презентация 1.25 - Диспетчеризация инженерных системИлья Конышев
 
ABC ELP Program - Innovation in government
ABC ELP Program - Innovation in governmentABC ELP Program - Innovation in government
ABC ELP Program - Innovation in governmentAnne-Marie Elias
 
Living Wall - Arabic
Living Wall - ArabicLiving Wall - Arabic
Living Wall - ArabicYousef Taibeh
 
E-acme E-tailer elettronica di consumo
E-acme E-tailer elettronica di consumoE-acme E-tailer elettronica di consumo
E-acme E-tailer elettronica di consumoretailforum
 
Building Out Your Editorial Calendar 4.24.13
Building Out Your Editorial Calendar 4.24.13Building Out Your Editorial Calendar 4.24.13
Building Out Your Editorial Calendar 4.24.13Kapost
 
利用資訊擷取技術之適性化語言輔助學習系統
利用資訊擷取技術之適性化語言輔助學習系統利用資訊擷取技術之適性化語言輔助學習系統
利用資訊擷取技術之適性化語言輔助學習系統bslin
 
HackconEU: Hackathons are for Hackers
HackconEU: Hackathons are for HackersHackconEU: Hackathons are for Hackers
HackconEU: Hackathons are for HackersTim Messerschmidt
 
Energy Matters Summit, Peel Region 6 May 2013
Energy Matters Summit, Peel Region 6 May 2013Energy Matters Summit, Peel Region 6 May 2013
Energy Matters Summit, Peel Region 6 May 2013Rick Huijbregts
 
"Year of the Selfie" [INFOGRAPHIC]
"Year of the Selfie" [INFOGRAPHIC]"Year of the Selfie" [INFOGRAPHIC]
"Year of the Selfie" [INFOGRAPHIC]Unmetric
 
Video Encoding and HTML5 Playback With Native DRM
Video Encoding and HTML5 Playback With Native DRMVideo Encoding and HTML5 Playback With Native DRM
Video Encoding and HTML5 Playback With Native DRMStefan Lederer
 
Piko Farms v. Hawaii Health Department
Piko Farms v. Hawaii Health DepartmentPiko Farms v. Hawaii Health Department
Piko Farms v. Hawaii Health DepartmentHonolulu Civil Beat
 
Guía de capacitación de sst 2-radiación solar
Guía  de  capacitación de sst 2-radiación solarGuía  de  capacitación de sst 2-radiación solar
Guía de capacitación de sst 2-radiación solarGiuliana Tinoco
 
Using eventbrite to manage your event registration
Using eventbrite to manage your event registrationUsing eventbrite to manage your event registration
Using eventbrite to manage your event registrationViqui Dill
 
מתחת לקלמנטיה
מתחת לקלמנטיהמתחת לקלמנטיה
מתחת לקלמנטיהmerkazy
 
欧赛斯品牌网络整合营销外包解决方案
欧赛斯品牌网络整合营销外包解决方案欧赛斯品牌网络整合营销外包解决方案
欧赛斯品牌网络整合营销外包解决方案qoolupeter
 
Čo nás môžu reštaurácie naučiť o online biznise?
Čo nás môžu reštaurácie naučiť o online biznise?Čo nás môžu reštaurácie naučiť o online biznise?
Čo nás môžu reštaurácie naučiť o online biznise?Matej Sucha
 
Cuestionario De Convivencia Pais
Cuestionario De Convivencia PaisCuestionario De Convivencia Pais
Cuestionario De Convivencia Paismgvaamonde
 
The Future Of Social Networks
The Future Of Social NetworksThe Future Of Social Networks
The Future Of Social NetworksCharlene Li
 
Report: Wearable Technology - Ready for Prime Time?
Report: Wearable Technology - Ready for Prime Time?Report: Wearable Technology - Ready for Prime Time?
Report: Wearable Technology - Ready for Prime Time?On Device Research
 
Bolero Crowdfunding Inspiratiesessie Roeselare - 2 juni 2016
Bolero Crowdfunding Inspiratiesessie Roeselare - 2 juni 2016Bolero Crowdfunding Inspiratiesessie Roeselare - 2 juni 2016
Bolero Crowdfunding Inspiratiesessie Roeselare - 2 juni 2016Bolero Crowdfunding
 

Viewers also liked (20)

Презентация 1.25 - Диспетчеризация инженерных систем
Презентация 1.25 - Диспетчеризация инженерных системПрезентация 1.25 - Диспетчеризация инженерных систем
Презентация 1.25 - Диспетчеризация инженерных систем
 
ABC ELP Program - Innovation in government
ABC ELP Program - Innovation in governmentABC ELP Program - Innovation in government
ABC ELP Program - Innovation in government
 
Living Wall - Arabic
Living Wall - ArabicLiving Wall - Arabic
Living Wall - Arabic
 
E-acme E-tailer elettronica di consumo
E-acme E-tailer elettronica di consumoE-acme E-tailer elettronica di consumo
E-acme E-tailer elettronica di consumo
 
Building Out Your Editorial Calendar 4.24.13
Building Out Your Editorial Calendar 4.24.13Building Out Your Editorial Calendar 4.24.13
Building Out Your Editorial Calendar 4.24.13
 
利用資訊擷取技術之適性化語言輔助學習系統
利用資訊擷取技術之適性化語言輔助學習系統利用資訊擷取技術之適性化語言輔助學習系統
利用資訊擷取技術之適性化語言輔助學習系統
 
HackconEU: Hackathons are for Hackers
HackconEU: Hackathons are for HackersHackconEU: Hackathons are for Hackers
HackconEU: Hackathons are for Hackers
 
Energy Matters Summit, Peel Region 6 May 2013
Energy Matters Summit, Peel Region 6 May 2013Energy Matters Summit, Peel Region 6 May 2013
Energy Matters Summit, Peel Region 6 May 2013
 
"Year of the Selfie" [INFOGRAPHIC]
"Year of the Selfie" [INFOGRAPHIC]"Year of the Selfie" [INFOGRAPHIC]
"Year of the Selfie" [INFOGRAPHIC]
 
Video Encoding and HTML5 Playback With Native DRM
Video Encoding and HTML5 Playback With Native DRMVideo Encoding and HTML5 Playback With Native DRM
Video Encoding and HTML5 Playback With Native DRM
 
Piko Farms v. Hawaii Health Department
Piko Farms v. Hawaii Health DepartmentPiko Farms v. Hawaii Health Department
Piko Farms v. Hawaii Health Department
 
Guía de capacitación de sst 2-radiación solar
Guía  de  capacitación de sst 2-radiación solarGuía  de  capacitación de sst 2-radiación solar
Guía de capacitación de sst 2-radiación solar
 
Using eventbrite to manage your event registration
Using eventbrite to manage your event registrationUsing eventbrite to manage your event registration
Using eventbrite to manage your event registration
 
מתחת לקלמנטיה
מתחת לקלמנטיהמתחת לקלמנטיה
מתחת לקלמנטיה
 
欧赛斯品牌网络整合营销外包解决方案
欧赛斯品牌网络整合营销外包解决方案欧赛斯品牌网络整合营销外包解决方案
欧赛斯品牌网络整合营销外包解决方案
 
Čo nás môžu reštaurácie naučiť o online biznise?
Čo nás môžu reštaurácie naučiť o online biznise?Čo nás môžu reštaurácie naučiť o online biznise?
Čo nás môžu reštaurácie naučiť o online biznise?
 
Cuestionario De Convivencia Pais
Cuestionario De Convivencia PaisCuestionario De Convivencia Pais
Cuestionario De Convivencia Pais
 
The Future Of Social Networks
The Future Of Social NetworksThe Future Of Social Networks
The Future Of Social Networks
 
Report: Wearable Technology - Ready for Prime Time?
Report: Wearable Technology - Ready for Prime Time?Report: Wearable Technology - Ready for Prime Time?
Report: Wearable Technology - Ready for Prime Time?
 
Bolero Crowdfunding Inspiratiesessie Roeselare - 2 juni 2016
Bolero Crowdfunding Inspiratiesessie Roeselare - 2 juni 2016Bolero Crowdfunding Inspiratiesessie Roeselare - 2 juni 2016
Bolero Crowdfunding Inspiratiesessie Roeselare - 2 juni 2016
 

Similar to Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Scala Symposium 2014, ThoughtWorks

TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기Heejong Ahn
 
From Ruby to Scala
From Ruby to ScalaFrom Ruby to Scala
From Ruby to Scalatod esking
 
wwc start-launched
wwc start-launchedwwc start-launched
wwc start-launchedMat Schaffer
 
PTW Rails Bootcamp
PTW Rails BootcampPTW Rails Bootcamp
PTW Rails BootcampMat Schaffer
 
Go from a PHP Perspective
Go from a PHP PerspectiveGo from a PHP Perspective
Go from a PHP PerspectiveBarry Jones
 
Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2Henry S
 
Ingo Muschenetz: Titanium Studio Deep Dive
Ingo Muschenetz: Titanium Studio Deep DiveIngo Muschenetz: Titanium Studio Deep Dive
Ingo Muschenetz: Titanium Studio Deep DiveAxway Appcelerator
 
Effective Scala (JavaDay Riga 2013)
Effective Scala (JavaDay Riga 2013)Effective Scala (JavaDay Riga 2013)
Effective Scala (JavaDay Riga 2013)mircodotta
 
Introduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platformIntroduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platformEastBanc Tachnologies
 
The openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageThe openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageNeo4j
 
Unleash your inner console cowboy
Unleash your inner console cowboyUnleash your inner console cowboy
Unleash your inner console cowboyKenneth Geisshirt
 
Strong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationStrong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationDamien Seguy
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web FrameworksJoe Kutner
 
JAZOON'13 - Paul Brauner - A backend developer meets the web: my Dart experience
JAZOON'13 - Paul Brauner - A backend developer meets the web: my Dart experienceJAZOON'13 - Paul Brauner - A backend developer meets the web: my Dart experience
JAZOON'13 - Paul Brauner - A backend developer meets the web: my Dart experiencejazoon13
 
Elegant concurrency
Elegant concurrencyElegant concurrency
Elegant concurrencyMosky Liu
 
Introduction to the rust programming language
Introduction to the rust programming languageIntroduction to the rust programming language
Introduction to the rust programming languageNikolay Denev
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojureAbbas Raza
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011tobiascrawley
 

Similar to Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Scala Symposium 2014, ThoughtWorks (20)

TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
 
From Ruby to Scala
From Ruby to ScalaFrom Ruby to Scala
From Ruby to Scala
 
wwc start-launched
wwc start-launchedwwc start-launched
wwc start-launched
 
PTW Rails Bootcamp
PTW Rails BootcampPTW Rails Bootcamp
PTW Rails Bootcamp
 
Go from a PHP Perspective
Go from a PHP PerspectiveGo from a PHP Perspective
Go from a PHP Perspective
 
Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2
 
Ingo Muschenetz: Titanium Studio Deep Dive
Ingo Muschenetz: Titanium Studio Deep DiveIngo Muschenetz: Titanium Studio Deep Dive
Ingo Muschenetz: Titanium Studio Deep Dive
 
Effective Scala (JavaDay Riga 2013)
Effective Scala (JavaDay Riga 2013)Effective Scala (JavaDay Riga 2013)
Effective Scala (JavaDay Riga 2013)
 
Introduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platformIntroduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platform
 
The openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageThe openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query Language
 
Unleash your inner console cowboy
Unleash your inner console cowboyUnleash your inner console cowboy
Unleash your inner console cowboy
 
Strong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationStrong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisation
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
 
Should i Go there
Should i Go thereShould i Go there
Should i Go there
 
JAZOON'13 - Paul Brauner - A backend developer meets the web: my Dart experience
JAZOON'13 - Paul Brauner - A backend developer meets the web: my Dart experienceJAZOON'13 - Paul Brauner - A backend developer meets the web: my Dart experience
JAZOON'13 - Paul Brauner - A backend developer meets the web: my Dart experience
 
Elegant concurrency
Elegant concurrencyElegant concurrency
Elegant concurrency
 
Introduction to the rust programming language
Introduction to the rust programming languageIntroduction to the rust programming language
Introduction to the rust programming language
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojure
 
What the C?
What the C?What the C?
What the C?
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
 

More from Thoughtworks

Design System as a Product
Design System as a ProductDesign System as a Product
Design System as a ProductThoughtworks
 
Designers, Developers & Dogs
Designers, Developers & DogsDesigners, Developers & Dogs
Designers, Developers & DogsThoughtworks
 
Cloud-first for fast innovation
Cloud-first for fast innovationCloud-first for fast innovation
Cloud-first for fast innovationThoughtworks
 
More impact with flexible teams
More impact with flexible teamsMore impact with flexible teams
More impact with flexible teamsThoughtworks
 
Culture of Innovation
Culture of InnovationCulture of Innovation
Culture of InnovationThoughtworks
 
Developer Experience
Developer ExperienceDeveloper Experience
Developer ExperienceThoughtworks
 
When we design together
When we design togetherWhen we design together
When we design togetherThoughtworks
 
Hardware is hard(er)
Hardware is hard(er)Hardware is hard(er)
Hardware is hard(er)Thoughtworks
 
Customer-centric innovation enabled by cloud
 Customer-centric innovation enabled by cloud Customer-centric innovation enabled by cloud
Customer-centric innovation enabled by cloudThoughtworks
 
Amazon's Culture of Innovation
Amazon's Culture of InnovationAmazon's Culture of Innovation
Amazon's Culture of InnovationThoughtworks
 
When in doubt, go live
When in doubt, go liveWhen in doubt, go live
When in doubt, go liveThoughtworks
 
Don't cross the Rubicon
Don't cross the RubiconDon't cross the Rubicon
Don't cross the RubiconThoughtworks
 
Your test coverage is a lie!
Your test coverage is a lie!Your test coverage is a lie!
Your test coverage is a lie!Thoughtworks
 
Docker container security
Docker container securityDocker container security
Docker container securityThoughtworks
 
Redefining the unit
Redefining the unitRedefining the unit
Redefining the unitThoughtworks
 
Technology Radar Webinar UK - Vol. 22
Technology Radar Webinar UK - Vol. 22Technology Radar Webinar UK - Vol. 22
Technology Radar Webinar UK - Vol. 22Thoughtworks
 
A Tribute to Turing
A Tribute to TuringA Tribute to Turing
A Tribute to TuringThoughtworks
 
Rsa maths worked out
Rsa maths worked outRsa maths worked out
Rsa maths worked outThoughtworks
 

More from Thoughtworks (20)

Design System as a Product
Design System as a ProductDesign System as a Product
Design System as a Product
 
Designers, Developers & Dogs
Designers, Developers & DogsDesigners, Developers & Dogs
Designers, Developers & Dogs
 
Cloud-first for fast innovation
Cloud-first for fast innovationCloud-first for fast innovation
Cloud-first for fast innovation
 
More impact with flexible teams
More impact with flexible teamsMore impact with flexible teams
More impact with flexible teams
 
Culture of Innovation
Culture of InnovationCulture of Innovation
Culture of Innovation
 
Dual-Track Agile
Dual-Track AgileDual-Track Agile
Dual-Track Agile
 
Developer Experience
Developer ExperienceDeveloper Experience
Developer Experience
 
When we design together
When we design togetherWhen we design together
When we design together
 
Hardware is hard(er)
Hardware is hard(er)Hardware is hard(er)
Hardware is hard(er)
 
Customer-centric innovation enabled by cloud
 Customer-centric innovation enabled by cloud Customer-centric innovation enabled by cloud
Customer-centric innovation enabled by cloud
 
Amazon's Culture of Innovation
Amazon's Culture of InnovationAmazon's Culture of Innovation
Amazon's Culture of Innovation
 
When in doubt, go live
When in doubt, go liveWhen in doubt, go live
When in doubt, go live
 
Don't cross the Rubicon
Don't cross the RubiconDon't cross the Rubicon
Don't cross the Rubicon
 
Error handling
Error handlingError handling
Error handling
 
Your test coverage is a lie!
Your test coverage is a lie!Your test coverage is a lie!
Your test coverage is a lie!
 
Docker container security
Docker container securityDocker container security
Docker container security
 
Redefining the unit
Redefining the unitRedefining the unit
Redefining the unit
 
Technology Radar Webinar UK - Vol. 22
Technology Radar Webinar UK - Vol. 22Technology Radar Webinar UK - Vol. 22
Technology Radar Webinar UK - Vol. 22
 
A Tribute to Turing
A Tribute to TuringA Tribute to Turing
A Tribute to Turing
 
Rsa maths worked out
Rsa maths worked outRsa maths worked out
Rsa maths worked out
 

Recently uploaded

Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Nikki Chapple
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsYoss Cohen
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Jeffrey Haguewood
 
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...BookNet Canada
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessWSO2
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
Irene Moetsana-Moeng: Stakeholders in Cybersecurity: Collaborative Defence fo...
Irene Moetsana-Moeng: Stakeholders in Cybersecurity: Collaborative Defence fo...Irene Moetsana-Moeng: Stakeholders in Cybersecurity: Collaborative Defence fo...
Irene Moetsana-Moeng: Stakeholders in Cybersecurity: Collaborative Defence fo...itnewsafrica
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfAarwolf Industries LLC
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Digital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentDigital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentMahmoud Rabie
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 

Recently uploaded (20)

Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platforms
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
 
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with Platformless
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
Irene Moetsana-Moeng: Stakeholders in Cybersecurity: Collaborative Defence fo...
Irene Moetsana-Moeng: Stakeholders in Cybersecurity: Collaborative Defence fo...Irene Moetsana-Moeng: Stakeholders in Cybersecurity: Collaborative Defence fo...
Irene Moetsana-Moeng: Stakeholders in Cybersecurity: Collaborative Defence fo...
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdf
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Digital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentDigital Tools & AI in Career Development
Digital Tools & AI in Career Development
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 

Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Scala Symposium 2014, ThoughtWorks

  • 3. Context Pat Springer Software Engineer Technical Principal 10+ years Academic Publisher Pretty Large Springer Link Strategic 95 % Online Revenue 66 % Total Revenue 9 Mio items 2TB XML Re-built 3 years ago Content Delivery Platform 52 Mio PageViews / Month 99.9% Availability Scala NoSql Co-Sourced Team TW Ex-TW Springer Global CD
  • 5. Timeline Start development Cycling Trip Re-joined Product -> platform Paying back tech debt Today 04/11 04/12 08/13 04/14 Inception 05/12 09/12 Bookfair Release RD Live User migration, enhancements Link Live Smart Books Live Enhancements
  • 6. Looking back: why scala? • Increase productivity • Be more attractive employer • Team decision
  • 7. Looking back: good vs bad Good • Functional programming • Terse syntax • JVM ecosystem • Gentle learning curve • DSL friendly syntax • Motivated team Bad • Tool support • Compilation times • Language complexity #moreRope
  • 9. Fast-forward (Aug 2013) • 2.5 years into project • 1.5 years of weekly live releases • 100k LOC • >10k commits • >90 committers
  • 10. Fast-forward (Aug 2013) • 2.5 years into project • 1.5 years of weekly live releases • 100k LOC • >10k commits • >90 committers not all related to Scala - to be fair • Poor feedback loops • Lots of accidental complexity
  • 13. Trend (2 years) build time LOC • 1:34 min src/main • 6:44 min src/test • 8:18 min total
  • 14. What did we do?
  • 15. What did we do • Reduced build time • Improved feedback loops • Reduced accidental complexity
  • 16. Build time • Reduced size of codebase (broke off vertical slices, pulled out APIs, pulled out libraries, removed unused features, removed low-value tests, etc.) • Reduced usage of certain language features (esp. traits and implicits)
  • 18. Trend (Dec 2013) build time # traits LOC unable to compile on 13” macbook
  • 19. Trend (Dec 2013) build time # traits LOC unable to compile on 13” macbook
  • 20. The problem with traits • Will re-compile on every class the trait is mixed in • Slows down dev-build cycle • Will result in byte code bloat • Will compile *a lot* slower ! For faster compile times: • Use pure traits • Use old-school composition for code re-use • Use pure functions via imports (e.g. import Foo._) • If unavoidable, use inheritance for code re-use
  • 22. Build time • 1:34 min src/main • 6:44 min src/test • 8:18 min total
  • 23. Build time • 1:34 min src/main • 6:44 min src/test • 8:18 min total • 0:24 min src/main • 3:11 min src/test • 3:35 min total
  • 24. Build time (on CI server) • Incremental compilation on CI • Only one dedicated CI agent • Physical build servers • CPUs with higher clock speed
  • 25. Build time (on CI server) • Incremental compilation on CI • Only one dedicated CI agent • Physical build servers • CPUs with higher clock speed
  • 27. Complexity • There’s still a lot of code in our codebase that is hard to read • It seems to be very easy to shoot yourself in the foot with Scala • Scala *is* complex (and that’s why scalac will never be as fast as javac)
  • 28. Complexity • There’s still a lot of code in our codebase that is hard to read • It seems to be very easy to shoot yourself in the foot with Scala • Scala *is* complex (and that’s why scalac will never be as fast as javac) Invariant/covariant/contravariant types (T, +T and -T) Refined types (new Foo {...}) Structural types (x: {def y: Int}) Path dependant types (a.B) Specialized types (@specialized) Self types (this =>) Projection types (A#B) Existential types (M[_]) Type bounds (<:, >:) Type constraints (=:=, <:< and <%<) Type members (type T) Type aliases (type T = Int) Type classes ( (implicit ...) ) View bounds (<%) Higher kinded types (* => *) F-Bounded type polymorphism (M[T <: M[T]]) http://nurkiewicz.github.io/talks/2014/scalar/#/16
  • 29. Not opinionated For example: http://twitter.github.io/effectivescala/ • Many ways to do the same thing • Coding conventions help, but only so much
  • 30. Not opinionated def foo() = "foo" def bar = "bar" ! foo foo() bar bar() // won't compile For example: http://twitter.github.io/effectivescala/ • Many ways to do the same thing • Coding conventions help, but only so much
  • 31. Not opinionated def foo() = "foo" def bar = "bar" ! foo foo() bar bar() // won't compile For example: http://twitter.github.io/effectivescala/ • Many ways to do the same thing • Coding conventions help, but only so much def baz(x: String) = x “x”.charAt(0) “x” charAt(0) // won't compile “x”.charAt 0 // won't compile “x” charAt 0 baz("x") baz “x" // won't compile
  • 32. Not opinionated def foo() = "foo" def bar = "bar" ! foo foo() bar bar() // won't compile list.foreach { x => println(x) } list.foreach ( x => println(x) ) list.foreach { println(_) } list.foreach ( println(_) ) list foreach { x => println(x) } list foreach ( x => println(x) ) list foreach { println(_) } list foreach ( println(_) ) For example: http://twitter.github.io/effectivescala/ • Many ways to do the same thing • Coding conventions help, but only so much def baz(x: String) = x “x”.charAt(0) “x” charAt(0) // won't compile “x”.charAt 0 // won't compile “x” charAt 0 baz("x") baz “x" // won't compile
  • 33. Not opinionated def foo() = "foo" def bar = "bar" ! foo foo() bar bar() // won't compile list.foreach { x => println(x) } list.foreach ( x => println(x) ) list.foreach { println(_) } list.foreach ( println(_) ) list foreach { x => println(x) } list foreach ( x => println(x) ) list foreach { println(_) } list foreach ( println(_) ) if (foo) "x" else "y" foo match { case true => "x" case _ => "y" } For example: http://twitter.github.io/effectivescala/ • Many ways to do the same thing • Coding conventions help, but only so much def baz(x: String) = x “x”.charAt(0) “x” charAt(0) // won't compile “x”.charAt 0 // won't compile “x” charAt 0 baz("x") baz “x" // won't compile
  • 36. Surprises List(1, 2, 3).toSet scala.collection.immutable.Set[Int] = Set(1, 2, 3) http://dan.bodar.com/2013/12/04/wat-scala/
  • 37. Surprises List(1, 2, 3).toSet scala.collection.immutable.Set[Int] = Set(1, 2, 3) List(1, 2, 3).toSet() http://dan.bodar.com/2013/12/04/wat-scala/
  • 38. Surprises List(1, 2, 3).toSet scala.collection.immutable.Set[Int] = Set(1, 2, 3) List(1, 2, 3).toSet() Boolean = false http://dan.bodar.com/2013/12/04/wat-scala/
  • 39. Implicits • Can make it very hard to read code • Tool support is very bad • Impacts compilation time • Surprising behaviour (esp. when used with overloaded methods or optional params)
  • 40. Tooling def handle(response: HttpResponse, request: HttpRequest) • Tool support is still very basic • Makes it hard to continuously refactor (which means people are less likely to do it)
  • 41. Tooling def handle(response: HttpResponse, request: HttpRequest) • Tool support is still very basic • Makes it hard to continuously refactor (which means people are less likely to do it) no luck with “change signature” refactoring support
  • 42. Trait entanglements • Makes it difficult to reason about behaviour
  • 43. Trait entanglements • Makes it difficult to reason about behaviour trait A { def foo = "a" }
  • 44. Trait entanglements • Makes it difficult to reason about behaviour trait A { def foo = "a" } trait B extends A { override def foo = "b" }
  • 45. Trait entanglements • Makes it difficult to reason about behaviour trait A { def foo = "a" } trait B extends A { override def foo = "b" } class C extends A with B new C().foo
  • 46. Trait entanglements • Makes it difficult to reason about behaviour trait A { def foo = "a" } trait B extends A { override def foo = "b" } class C extends A with B new C().foo "b"
  • 47. Trait entanglements • Makes it difficult to reason about behaviour trait A { def foo = "a" } trait B extends A { override def foo = "b" } class C extends A with B new C().foo "b" class D extends B with A new D().foo
  • 48. Trait entanglements • Makes it difficult to reason about behaviour trait A { def foo = "a" } trait B extends A { override def foo = "b" } class C extends A with B new C().foo "b" class D extends B with A new D().foo "b"
  • 49. Trait entanglements (2) ArticlePageSteps WebDriverSupport AuthorStepsCoverImageSteps SummarySection Waiter SectionPageSteps CommonPageSteps WebElementSupport Assertions Uris TripleEquals OnHost TripleEqualsSupport MachineNames
  • 50. Trait entanglements (3) ArticlePageSteps_0 WebDriverSupport_1 AuthorSteps_1 CoverImageSteps_1 SummarySection_1Waiter_1 SectionPageSteps_1 CommonPageSteps_1 CommonPageSteps_2 WebElementSupport_2Assertions_2 WebDriverSupport_2Uris_2 WebElementSupport_3 WebDriverSupport_3Uris_3 TripleEquals_3 OnHost_3 OnHost_4 TripleEqualsSupport_4 MachineNames_4 MachineNames_5
  • 51. Trait entanglements (3) ArticlePageSteps_0 WebDriverSupport_1 AuthorSteps_1 CoverImageSteps_1 SummarySection_1Waiter_1 SectionPageSteps_1 CommonPageSteps_1 CommonPageSteps_2 WebElementSupport_2Assertions_2 WebDriverSupport_2Uris_2 WebElementSupport_3 WebDriverSupport_3Uris_3 TripleEquals_3 OnHost_3 OnHost_4 TripleEqualsSupport_4 MachineNames_4 MachineNames_5
  • 52. Trait entanglements (4) ArticlePageTests_0 ArticlePageSteps_1 AboutSectionSteps_1 SearchResultsPageSteps_1 Uris_1 ArticleTestFixture_1 JavascriptSupport_1 IssuePageSteps_1 CommonAbstractSteps_1 GoogleAnalyticsSteps_1 FakeEntitlementSteps_1 ExportCitationPageSteps_1 FullTextPageSteps_1 OtherActionsSectionSteps_1 WebDriverSupport_2 AuthorSteps_2 CoverImageSteps_2 SummarySection_2Waiter_2 SectionPageSteps_2 CommonPageSteps_2 CommonPageSteps_3 WebElementSupport_3Assertions_3 WebDriverSupport_3Uris_3 WebElementSupport_4 WebDriverSupport_4Uris_4 TripleEquals_4 OnHost_4 OnHost_5 TripleEqualsSupport_5 MachineNames_5 MachineNames_6
  • 53. Trait entanglements (4) ArticlePageTests_0 ArticlePageSteps_1 AboutSectionSteps_1 SearchResultsPageSteps_1 Uris_1 ArticleTestFixture_1 JavascriptSupport_1 IssuePageSteps_1 CommonAbstractSteps_1 GoogleAnalyticsSteps_1 FakeEntitlementSteps_1 ExportCitationPageSteps_1 FullTextPageSteps_1 OtherActionsSectionSteps_1 WebDriverSupport_2 AuthorSteps_2 CoverImageSteps_2 SummarySection_2Waiter_2 SectionPageSteps_2 CommonPageSteps_2 CommonPageSteps_3 WebElementSupport_3Assertions_3 WebDriverSupport_3Uris_3 WebElementSupport_4 WebDriverSupport_4Uris_4 TripleEquals_4 OnHost_4 OnHost_5 TripleEqualsSupport_5 MachineNames_5 MachineNames_6 Imagine many more circle here
  • 55. Today • We’ve delivered successfully using Scala • Don’t think we’re more productive (pure gut feeling, though) • We try to stick to the good parts (conventions, functional programming, pattern matching, etc.) • Complexity, slow compilation and lack of tool support are real problems
  • 56. The future • No urgency to move away from Scala or re-write existing systems • Java 8 is an alternative • Smaller teams and apps will probably lead to more polyglotism (and less Scala)