scala in the enterprise - qcon€¦ · #4 scala adoption lesser acquainted teams consequences,...
TRANSCRIPT
![Page 1: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/1.jpg)
SCALA in the Enterprise
Getting FuNkEd Up with the JVM
Peter Pilgrim Scala and Java EE
Independent contractor
@peter_pilgrim
![Page 2: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/2.jpg)
Xenonique @peter_pilgrim 2
![Page 3: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/3.jpg)
Xenonique @peter_pilgrim 3
Agenda • Technical Focus • Adoption of Scala • Best Practice • Magnet Compass
![Page 4: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/4.jpg)
Xenonique @peter_pilgrim
Creative Commons 3.0Attribution-NonCommercial-NoDerivs 3.0 UK: England & Wales (CC BY-NC-ND 3.0 UK) https://creativecommons.org/licenses/by-nc-nd/3.0// • Attribute — you must always attribute the source • Share — copy and redistribute the material in any
medium or format • No Deriv— remix, transform, and build upon the
material, but you cannot distribute modified The licensor cannot revoke these freedoms as long as you follow the license terms.
4
![Page 5: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/5.jpg)
Xenonique @peter_pilgrim
About Me• Java Champion • Java EE and Scala developer independent
contractor • Digital / Finance / E-commerce • Working on the JVM since 1998
5
![Page 6: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/6.jpg)
Xenonique @peter_pilgrim
About Me
6
![Page 7: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/7.jpg)
Xenonique @peter_pilgrim 7
![Page 8: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/8.jpg)
Xenonique @peter_pilgrim 8
![Page 9: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/9.jpg)
Xenonique @peter_pilgrim 9
![Page 10: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/10.jpg)
Xenonique @peter_pilgrim 10
#1 Unlearn “Learn a new language, people!” Expand your horizons
Dianne Marsh Netflix Director, Engineering Tools http://diannemarsh.com/
![Page 11: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/11.jpg)
Xenonique @peter_pilgrim 11
![Page 12: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/12.jpg)
Xenonique @peter_pilgrim
Scala Test #1
import collection.mutable.Stack import org.scalatest._ class StackSpec extends FlatSpec with Matchers { /* ... */
}
12
![Page 13: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/13.jpg)
Xenonique @peter_pilgrim
Scala Test #2
class StackSpec extends FlatSpec with Matchers { "A Stack" should "pop values in last-in-first-out order" in { val stack = new Stack[Int] stack.push(1) stack.push(2) stack.pop() should be (2) stack.pop() should be (1) } /* ... */ }
13
![Page 14: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/14.jpg)
Xenonique @peter_pilgrim
Scala Test #3
class StackSpec extends FlatSpec with Matchers { /* ... */ it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[Int] a [NoSuchElementException] should be thrownBy {
emptyStack.pop() } } }
14
![Page 15: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/15.jpg)
Xenonique @peter_pilgrim
How to avoid null pointers in Scala Programming?
val greeting1: Option[String] = Some(”QCL15") val greeting2: Option[String] = None
15
![Page 16: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/16.jpg)
Xenonique @peter_pilgrim
Pattern Matching
def checker(p : Option[String]): String = { p match { case Some(v) => v case _ => "Unexpected" } } checker(greeting1) // "Hello QCL15" checker(greeting2) // "Unexpected"
16
![Page 17: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/17.jpg)
Xenonique @peter_pilgrim
Scala’s generic immutable list collection type
val list: List[Int] = List(1,2,3,4) list.foreach { x => println(x) } // 1,2,3,4
17
![Page 18: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/18.jpg)
Xenonique @peter_pilgrim
Scala’s option behaves like collection type #2
greeting1.foreach { x => println(s"Work: ${x}" ) } // Work: Hello QCL15
greeting2.foreach { x => println(s"Work: ${x}" ) } // *** nothing happens ***
18
![Page 19: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/19.jpg)
Xenonique @peter_pilgrim 19
#2 Unlearn More “If you only ever learn one thing in Scala, learn the Collection classes” Dick Wall Former JavaPosse Podcaster http://scalawags.com/
![Page 20: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/20.jpg)
Xenonique @peter_pilgrim 20
![Page 21: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/21.jpg)
Xenonique @peter_pilgrim
Jump To Intermediate Level
class DigitalMicroService( warehouseClient: warehouseClient,
applicationClient: ApplicationClient ) extends Logging with PricingFactor { def startApplication(productName: String, params: Map[String, String]): Future[AppId] = { applicationClient.startApplication( productName, params) } // ... }
21
![Page 22: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/22.jpg)
Xenonique @peter_pilgrim
Async Service Methodsclass DigitalMicroService( // ... def submit(applicationId: String): Future[Boolean] = { val future: Future[Boolean] = for { result <- applicationClient.submit(applicationId) } yield { result } future recover { case e: DuplicateSubmissionException => logger.info("Application already submitted: " + e); true } } }
22
![Page 23: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/23.jpg)
Xenonique @peter_pilgrim
Testing With Specifications #1
class ApplicationClientSpec extends Specification with Mocking with Futuristic with WsClient {
val applicationClient = new ApplicationClient("/service", ws) "start application" should { "return the AppId" in { /* . . . */ } } }
23
![Page 24: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/24.jpg)
Xenonique @peter_pilgrim
Testing With Specifications #2
"start application" should { "return the AppId" in { val responseBodyContent = """{"id": "777"}""" setUpGlobalResponse( "/service/application", 200, responseBodyContent) response.body returns responseBodyContent /* . . . */ } }
24
![Page 25: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/25.jpg)
Xenonique @peter_pilgrim
Testing With Specifications #2
"start application" should { /* ... */ mockRequestHolder.post( Matchers.eq( """{"productName":"digital-service","params":{}}""" ))(any[Writeable[String]], any[ContentTypeOf[String]]) returns Future.successful(response) val responseBody = await(applicationClient.startApplication( ”digital-service", Map())) responseBody must_== AppId("777") } }
25
![Page 26: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/26.jpg)
Xenonique @peter_pilgrim 26
![Page 27: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/27.jpg)
Xenonique @peter_pilgrim 27
So a does a modern Digital Engineer learn a new language?
![Page 28: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/28.jpg)
Xenonique @peter_pilgrim 28
The answer is Yes. Perhaps learn several languages and DSLs. Puppet, SBT, Grunt etc
![Page 29: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/29.jpg)
Xenonique @peter_pilgrim 29
![Page 30: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/30.jpg)
Xenonique @peter_pilgrim 30
#2 DailyWork2014 GOV.UK • Develop Scala applications • Play Framework, RESTful Services, MongoDB • Cucumber testing: acceptance & functional • Collaborative design, pairing and reviews • SCRUM, Sometimes Kanban • Physical storyboards, retros, planning • Heavy dose of UX / User Centric • Government Digital Service
![Page 31: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/31.jpg)
Xenonique @peter_pilgrim 31
![Page 32: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/32.jpg)
Xenonique @peter_pilgrim 32
#4 Scala Adoption
Highly competent & talented teams Motivation is key Developers drives the decision to learn Scala; already self-organising
![Page 33: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/33.jpg)
Xenonique @peter_pilgrim 33
#4 Scala Adoption
Somewhat confident and enthusiastic development talented teams Delivery is key Large responsibility for the end product; mixed Java and Scala
![Page 34: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/34.jpg)
Xenonique @peter_pilgrim 34
#4 Scala Adoption
Time sensitive teams Time change is key “We like everything you say about Scala, however we can’t do this now.” Wait for the early adopters to finish.
![Page 35: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/35.jpg)
Xenonique @peter_pilgrim 35
#4 Scala Adoption
Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology and the unknown-unknowns. “How does X [Scala] help the business going forward?”
![Page 36: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/36.jpg)
Xenonique @peter_pilgrim 36
![Page 37: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/37.jpg)
Xenonique @peter_pilgrim 37
Functional Programming is here
![Page 38: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/38.jpg)
Xenonique @peter_pilgrim 38
Whether Scala or Java or something entirely alternative
![Page 39: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/39.jpg)
Xenonique @peter_pilgrim 39
All that matters is your attitude to programming in general
![Page 40: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/40.jpg)
Xenonique @peter_pilgrim 40
Let’s look at Java SE 8
![Page 41: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/41.jpg)
Xenonique @peter_pilgrim 41
![Page 42: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/42.jpg)
Xenonique @peter_pilgrim 42
#5 Java SE 8
Very respectful to computer science Lambdas ó Alonzo Church
λ - Calculus (1930)
Lambda expressions
![Page 43: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/43.jpg)
Xenonique @peter_pilgrim 43
#5 Java SE 8
Function Interfaces Lambda expressions Streams Default interface methods Predicates, Filters, Suppliers, Combiners, Collectors, Reducers, Utilities
![Page 44: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/44.jpg)
Xenonique @peter_pilgrim 44
#5 Java SE 8
The Great Closures Debate 2007 > anonymous inner classes Parallel Streams; Fork Join; CompletableFuture
![Page 45: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/45.jpg)
Xenonique @peter_pilgrim 45
#5 Java SE 8 The majority of application programming state of the art (before modularity comes along).
Filter. Map. Reduce. 2015 Processing data over Java Collections and Streams
![Page 46: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/46.jpg)
Xenonique @peter_pilgrim
Lambdas Java SE 8
Function<Double,Double> double= x -> x + x Function<Double,Double> square = x -> x * x Predicate<String> qconFilter = (x: String) -> x.contains("qcon”)
46
![Page 47: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/47.jpg)
Xenonique @peter_pilgrim
Lambdas Java SE 8
// However there is no equivalent to Scala Function<Double,Double, Double> f1 = (x + 2) * (y -3 )
// Instead you still define Java interface interface Multiple<T,U,R> { R apply(T t, U u ); } Multiple<Double,Double,Double> f1 = (x + 2) * (y - 3 ) 47
![Page 48: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/48.jpg)
Xenonique @peter_pilgrim
Lambdas Java SE 8
Arrays.asList( "Adventure","Romance","QCON London","science") .stream() .map( s -> s.toLowerCase()) .filter(qconFilter) .forEach( e -> System.out.println(e) ) List<String> list = Arrays.asList( "Adventure","Romance","QCON London","science") list.stream() .map(String::toLowerCase) .filter(qconFilter) .forEach( System::out::println )
48
![Page 49: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/49.jpg)
Xenonique @peter_pilgrim
Design pattern #1 Replace Factory Interface with Lambdaclass TradeFileRetriever { Function<Void,JSch> factory = () -> new JSch();
void setFactory(
Function<Void,JschSession> factory) return this.factory = factory; }
// jsch = this.factory.apply(); }
49
![Page 50: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/50.jpg)
Xenonique @peter_pilgrim
Lambda Factory #2– Mock Out Hard Hat Frameworks
import com.jcraft.jsch.* JSch mockJsch = mock(Jsch.class) Session mockSession = mockSession(Session.class) TradeFileRetriever retriever = new TradeFileRetriever(); retriever.setFactory( () -> mockJsch ) when(mockJsch.getSession()).thenReturn( mockSession ) 50
![Page 51: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/51.jpg)
Xenonique @peter_pilgrim
Lambda Flatmap – I just want to process only trade Detailsclass TradeRecord {
List<String,TradeDetail> tradeDetailMap = new TreeMap<>();
// ... } List<TradeRecord> tradeRecords = retrieveSome(); tradeRecords.stream() .flatMap( t -> t.getTradeDetails().entrySet().stream()) .filter( s -> s.getKey().startsWith("ASIA") ) .forEach( s -> System.out.printf("%s -> %s", s.getKey(), s.getValue() ));
51
![Page 52: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/52.jpg)
Xenonique @peter_pilgrim
Lambda Flatmap – Emergency Request Positions with Hsbc
IntSummaryStatistics hsbcFundSummary = tradeRecords.stream()
.flatMap( t -> t.getTradeDetails().entrySet().stream()) .filter( s -> s.getValue().getCurrency().equals("GBP")) .filter( s.getValue().getCounterparty().equals("HSBC")) .collect(
Collectors.summarizingInt( s -> s.getValue().getQuantity()));
52
![Page 53: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/53.jpg)
Xenonique @peter_pilgrim 53
![Page 54: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/54.jpg)
Xenonique @peter_pilgrim 54
#6 Functional Patterns for Object Oriented People
![Page 55: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/55.jpg)
Xenonique @peter_pilgrim
Prefer First-Class Functions over Functors
// Java Classic class Comparator<TradeDetail,TradeDetail> { public int compare(TradeDetail p1,
TradeDetail p2) { return p1.getCurrency().compareTo( p2.getCurrency());
}
55
![Page 56: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/56.jpg)
Xenonique @peter_pilgrim
Prefer First-Class Functions over Functors
// Scala val currencyComparator = (p1:TradeDetail,p2:TradeDetail) => p1.currency.compareTo(p2.currency)
trades.sortWith( currencyComparator )
56
![Page 57: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/57.jpg)
Xenonique @peter_pilgrim
Prefer Internal Iterators over External Interators
static int summation( List<Products> products) { int sum = 0; for (Product e: products) { sum += e.getPrice(); } return sum;
} // Java
57
![Page 58: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/58.jpg)
Xenonique @peter_pilgrim
Prefer Internal Iterator over External Means
// Scala: internal iteration products.map( x => x.price ).sum products.foldLeft(0) ( _.price + _.price ) // Soft (closure) white! var sum = 0 products.foreach { e => sum = sum + e.price }
58
![Page 59: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/59.jpg)
Xenonique @peter_pilgrim
Prefer Functions over the Command Pattern
// Java interface Command { void execute(Item item) } class Ingest implements Command { ... } class Compress implements Command { ... } class Enrich implements Command { ... }
59
![Page 60: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/60.jpg)
Xenonique @peter_pilgrim
Prefer Functions over the Command Pattern
// Scala val ingest = (item: Item) => { ... } val compress = (item: Item) => { ... } val enrich = (item: Item) => { ... } val items: List[Item] = ... items.map { x => ingest(x); compress(x); enrich(x); x }
60
![Page 61: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/61.jpg)
Xenonique @peter_pilgrim
Prefer Functions over the Command Pattern
// Scala : NB the order of composition! val evenBetter = enrich compose compress compose ingest val items: List[Item] = ... items.map { x => evenBetter(x); x }
61
![Page 62: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/62.jpg)
Xenonique @peter_pilgrim
Wherever you Can: Filter, Map and Reduce
val items: List[Item] = ... val discountShoppingCartPrice = items .filter( item => item.price > 25.0) .map( item => item.nominal ) .reduce( (total, price ) => total + price * 0.90 )
62
![Page 63: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/63.jpg)
Xenonique @peter_pilgrim
Function Builders
def discounter(percent: Double): (Double) => Double = { require( percent >= 0.0 && percent <= 100.0 )
(price: Double) => price - ( price * percent / 100.0)
}
63
![Page 64: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/64.jpg)
Xenonique @peter_pilgrim
Function Builders
val tenPercenter = discounter(10) val twentyPercenter = discounter(20) val finalCartPrice = if (customer.loyaltyPoints >= 3000 ) gardenItemPrices map tenPercenter sum +
foodItemsPrices map twentyPercenter sum else ( gardenItemPrices ::: foodItemPrices ) sum
64
![Page 65: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/65.jpg)
Xenonique @peter_pilgrim
replace conditional logic with Partially Applied Functions
abstract class Item { val nominal: Double } case class GardenItem(val nominal:Double) extends Item case class EnergyItem(val nominal:Double) extends Item val gardenTaxCode: PartialFunction[Any, Int] = { case i: GardenItem => i.nominal * 0.025 } val energyTaxCode: PartialFunction[Any, Int] = { case i: EnergyItem => i.nominal * 0.015 }
65
![Page 66: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/66.jpg)
Xenonique @peter_pilgrim
replace conditional logic with Partially Applied Functions
gardenTaxCode.isDefinedAt( GardenItem(100)) gardenTaxCode.isDefinedAt( "What is this?")) val items = List( GardenItem(12.34), EnergyItem(73.99)) val gardenTax = items collect gardenTaxCode
66
![Page 67: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/67.jpg)
Xenonique @peter_pilgrim
Lean on to Tail Recursive Functions
def summation(xs: List[Int]): Int = { xs match { case x :: tail => x + summation(tail) case Nil => 0 } }
67
![Page 68: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/68.jpg)
Xenonique @peter_pilgrim
Lean on to Tail Recursive Functions
def summation(xs: List[Int]): Int = { @tailrec def sum0(xs: List[Int], acc: Int): Int = { xs match { case x :: tail => sum0(tail, acc + x) case Nil => acc } } sum0(xs, 0) }
68
![Page 69: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/69.jpg)
Xenonique @peter_pilgrim 69
![Page 70: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/70.jpg)
Xenonique @peter_pilgrim 70
Let’s Come Up For Air!
![Page 71: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/71.jpg)
Xenonique @peter_pilgrim 71
![Page 72: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/72.jpg)
Xenonique @peter_pilgrim 72
#7 Adventures?
Please extend your inspiration to Recursive functions (Tail Rec) Focused mutability Futures and Promises Control Flow Domain Specific Languages
![Page 73: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/73.jpg)
Xenonique @peter_pilgrim 73
![Page 74: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/74.jpg)
Xenonique @peter_pilgrim 74
#Conclusion(1)
Scala in the Enterprise: *Done* How far do you want to go (FP)? Java SE 8 changes everything Everyone is learning.
![Page 75: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/75.jpg)
Xenonique @peter_pilgrim 75
#Conclusion(2)
Avoid over reliance on type inference Break code down Less is more; Einstein’s Simple Spectrum of abilities, talent Avoid silos if possible
![Page 76: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/76.jpg)
Xenonique @peter_pilgrim 76
#Conclusion(3)
Java has lots of frameworks, utilities Scala has some great tools: ScalaTest, IDE support Developers work harder Conciseness, readability, maintainability
![Page 77: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/77.jpg)
Xenonique @peter_pilgrim 77
![Page 78: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/78.jpg)
Xenonique @peter_pilgrim 78
#Conclusion(4)
The Future of Scala Macros, Modularisation Compiler performance, Push to FP Integration with Java Lambdas Who knows really when or next? “Always a Left Field contender, there will be” Yodaspeak
![Page 79: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/79.jpg)
Xenonique @peter_pilgrim 79
#It Yours!
Get yourselves FuNkEd Up with the JVM
![Page 80: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/80.jpg)
Xenonique @peter_pilgrim 80
May 2014
![Page 81: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/81.jpg)
Xenonique @peter_pilgrim 81
@peter_pilgrim
uk.linkedin.com/in/peterpilgrim
2000/
![Page 82: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/82.jpg)
Xenonique @peter_pilgrim
List of Creative Commons (2.0) photography attributions
https://flic.kr/p/dhf3FQ https://www.flickr.com/photos/epsos/ epSos.de Big Beautiful Face Statue in Tenerife https://flic.kr/p/Pp93n https://www.flickr.com/photos/spacesuitcatalyst/ William A. Clark Follow Measurement Measure twice, cut once. https://flic.kr/p/opvVsg https://www.flickr.com/photos/gregbeatty/ Greg Beatty Follow Three Pillars Nikon D800 16-35MM F4.0 https://flic.kr/p/81dXuT https://www.flickr.com/photos/froboy/ Avi Schwab Follow Equipment used for measuring planes of crystals
82
![Page 83: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/83.jpg)
Xenonique @peter_pilgrim
List of Creative Commons (2.0) photography attributions
https://flic.kr/p/ayqvZp https://www.flickr.com/photos/throughpaintedeyes/ Ryan Seyeau Follow 1000 Faces of Canada # 0084 - Zombie Walk - Explore! Shot during the annual Zombie Walk in Ottawa. https://flic.kr/p/8XY4tr https://www.flickr.com/photos/creative_stock/ Creativity 103 electronic circuit board https://flic.kr/p/8Y2625 https://www.flickr.com/photos/creative_stock/ Creativity 103 computer motherboard tracks https://flic.kr/p/2QHt7Q https://www.flickr.com/photos/rosefirerising/ rosefirerising Follow Pierre Curie, Piezo-Electroscope
83
![Page 84: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/84.jpg)
Xenonique @peter_pilgrim
List of Creative Commons (2.0) photography attributions
https://www.flickr.com/photos/code_martial/ https://flic.kr/p/7jmU5n Tahir Hashmi Follow Developer Death 10 Programmers and a UX Designer died all of a sudden in a war room situation. They were apparently working too hard. https://www.flickr.com/photos/8268882@N06/ https://flic.kr/p/duwd1M Peter Pilgrim IMG_1481 European JUG leaders meeting in Devoxx 2013 https://www.flickr.com/photos/unicefethiopia/ https://flic.kr/p/dv4ooi UNICEF Ethiopia Follow Hamer mother and child South Omo Zone, SNNPR Hamer mother and child South Omo Zone, SNNPR. ©UNICEF Ethiopia/2005/Getachew
84
![Page 85: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/85.jpg)
Xenonique @peter_pilgrim
List of Creative Commons (2.0) photography attributions
https://www.flickr.com/photos/15216811@N06/ https://flic.kr/p/baULpM N i c o l a Follow Tree - IMG_1242 https://flic.kr/p/dwCQ7t https://www.flickr.com/photos/90585146@N08/ marsmetn tallahassee Follow IDA .. Integro-Differential Analyzer (Sept., 1952) ...item 2.. Richard Dreyfuss: Technology Has 'Killed Time' -- "In geopolitics, the removal of time is fatal." -- "And you will give up, the protection of Republican Democracy." (July 19 2010) ... https://flic.kr/p/6ZDbiZ https://www.flickr.com/photos/ingmar/ Ingmar Zahorsky Follow Traffic Jam Accidents are common on the narrow streets going through the mountains of Nepal. When such an accident occurs, traffic is often halted for up to 3-4 hours. https://flic.kr/p/FAskC https://www.flickr.com/photos/mari1008/ mari_1008 Follow traffic jam -B Date: April,2th Address: Jiangshu Rd,Shanghai,China. Around 8:30 AM today, A little accident on YuYuan Rd and JiangSu Rd caused traffic jam.
85
![Page 86: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/86.jpg)
Xenonique @peter_pilgrim
List of Creative Commons (2.0) photography attributions
https://flic.kr/p/bpss6D https://www.flickr.com/photos/76029035@N02/ Victor1558 Follow Creative_Photoshop_HD_Wallpapers_laba.ws https://flic.kr/p/mLxu3m https://www.flickr.com/photos/astrangelyisolatedplace/ astrangelyisolatedplace Follow Office test #1. Setup fully functional. A rare 1200 no longer in production. Test run soundtracked by the only #vinyl in the office; The Sesame Street Soundtrack - a surprise present by @idinesh #technics #turntable #1200 #ocdv1 via Instagram ift.tt/1hpeUEU https://flic.kr/p/gLPhEk https://www.flickr.com/photos/stevecorey/ Steve Corey Follow Treasure Hunt, a short story (5 images)
86
![Page 87: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/87.jpg)
Xenonique @peter_pilgrim
List of Creative Commons (2.0) photography attributions
https://flic.kr/p/4JcerK https://www.flickr.com/photos/16949884@N00/ Bömmel Follow Ice Crystal Ice is nice https://flic.kr/p/dSsXiZ https://www.flickr.com/photos/jeremyhall/ Jeremy Hall Follow Called to Serve (suit and tie) https://flic.kr/p/3enERy https://www.flickr.com/photos/paolocampioni/ Paolo Campioni Follow scala Scendo (stair case spiral)
87
![Page 88: SCALA in the Enterprise - QCon€¦ · #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology](https://reader033.vdocuments.us/reader033/viewer/2022050306/5f6e453090d1087d837ef1ac/html5/thumbnails/88.jpg)
Xenonique @peter_pilgrim
List of Creative Commons (2.0) photography attributions
https://flic.kr/p/m62gmK https://www.flickr.com/photos/lata/ -p Follow Abstraction I. From my platycerium. (Guide: Voronoi diagram) https://flic.kr/p/9F7Nnn https://www.flickr.com/photos/followtheseinstructions/ Follow these instructions The end ; Assignment: This time your assignment is to find or compose a scene that conveys the essence of the end. https://flic.kr/p/6WSFR4 https://www.flickr.com/photos/62337512@N00/ anthony kelly Follow big ben big ben and underground sign https://flic.kr/p/w7qef https://www.flickr.com/photos/cobalt/ cobalt123 Follow All We are Saying... (Thought for a New Year) Peace Pasta from Annie's, with peas, of course. Give Peace A Chance
88