SlideShare a Scribd company logo
1 of 64
Download to read offline
Poniendo
by @andres_viedma
en producción
A palos
MAD · NOV 24-25 · 2017
Andrés ViedmaAndrés Viedma
@andres_viedma@andres_viedma
01 KOTLIN
Null safety
fun printStringLength(maybeString: String?) {
// maybeString.length would not compile
if (maybeString != null) {
// maybeString cannot be null now, it's a String
println(maybeString.length)
} else {
println("<empty>")
}
}
”My billion dollars mistake”
Tony Hoare
fun printStringLength1(maybeString: String?) {
maybeString?.let { s -> println(s) }
}
fun printStringLengthOrEmpty(maybeString: String?) {
println(maybeString?.length ?: "<empty>")
}
Null safety
A small immutable Kotlin class
data class TokenInfo(
val tokenType: String = “auth”,
val identity: String
val expiration: Int? = null
)
Constructor with Properties
class TokenInfo(
val tokenType: String,
val identity: String
(…)
)
public final class TokenInfo {
private final String tokenType;
private final String identity;
(…)
public TokenInfo(
String tokenType,
String identity,
(…)) {
this.tokenType = tokenType;
this.identity = identity;
(…)
}
public final String getTokenType() {
return tokenType;
}
public final String getIdentity() {
return identity;
}
}
Getters and Setters
class TokenInfo(
val tokenType: String,
val identity: String
(…)
)
public final class TokenInfo {
private final String tokenType;
private final String identity;
(…)
public TokenInfo(
String tokenType,
String identity,
(…)) {
this.tokenType = tokenType;
this.identity = identity;
(…)
}
public final String getTokenType() {
return tokenType;
}
public final String getIdentity() {
return identity;
}
}
Named arguments and optional values
class TokenInfo(
val tokenType: String = "auth",
val identity: String,
val expiration: Int? = null
)
val token = TokenInfo(identity = "xxx")
Immutable classes with
optional fields?
Constructors with lots of
parameters
Builder object
Data classes
data class TokenInfo(
val tokenType: String,
val identity: String
(…)
)
public final class TokenInfo {
(…)
public String toString() { (…) }
public int hashCode() { (…) }
public boolean equals(Object var1) { (…) }
public final TokenInfoId copy(String tokenType,
String identity) {
(…)
}
public final String component1() { (…) }
public final String component2() { (…) }
}
Immutability
made easier
Collections improvements
List<Person> persons = Arrays.asList(
new Person("Sansa", "Stark"),
new Person("Jon", "Snow"));
List<String> personNames = persons.stream()
.map(p -> p.getName() + " " + p.getSurname())
.collect(Collectors.toList());
val persons = listOf(
Person("Sansa", "Stark"),
Person("Jon", "Snow"))
val personNames = persons
.map { p -> "${p.name} ${p.surname}" }
Extension functions
Collections improvements
List<Integer> result = list.stream()
.flatMap(o -> o.isPresent() ?
Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
val result = list.filter { it != null }
List<Integer> result = list.stream()
.flatMap(o → o.map(Stream::of)
.orElseGet(Stream::empty))
.collect(Collectors.toList());
List<Integer> result = list.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
String Interpolation
List<Person> persons = Arrays.asList(
new Person("Sansa", "Stark"),
new Person("Jon", "Snow"));
List<String> personNames = persons.stream()
.map(p -> p.getName() + " " + p.getSurname())
.collect(Collectors.toList());
val persons = listOf(
Person("Sansa", "Stark"),
Person("Jon", "Snow"))
val personNames = persons
.map { p -> "${p.name} ${p.surname}" }
Type Inference
val persons = listOf(
Person("Sansa", "Stark"),
Person("Jon", "Snow"))
val personNames = persons
.map { p -> "${p.name} ${p.surname}" }
List<Person> persons = Arrays.asList(
new Person("Sansa", "Stark"),
new Person("Jon", "Snow"));
List<String> personNames = persons.stream()
.map(p -> p.getName() + " " + p.getSurname())
.collect(Collectors.toList());
Gotcha! Now the idea is trapped inside your head
Gotcha! Now the idea is trapped inside your head
Gotcha! Now the idea is trapped inside your head
02 LET'S DO IT!
Tell the team!
The conformist
Tell the team!
The conformist The idealist
Tell the team!
The conformist The idealist The responsible
Tell the team!
The conformist The idealist The responsible
AGGG ROOO RAGGAGGG ROOO RAGG
ROOOOOOOGHH!ROOOOOOOGHH!
What about the rest of the company?
Option 1...
Option 2: Talk to them
●
Can affect development time
●
Misunderstandings can increase bug rate
●
Service responsibility is not fixed
Not just YOUR team
Learning cost
●
Learning curve very smooth
●
On doubt, use Java style and methods
●
Not a real paradigm change
●
Same libraries and concepts
Learning cost ® BUT...
●
Good documentation
●
Short library
●
Is there a general interest in Kotlin in the company?
Kotlin community
Android devs pushing for a change
Learning cost ® BUT... (2)
●
It's production!
●
New technology, may have bugs
●
Adds code “behind the courtains”
●
Any weird behaviour affecting memory, garbage collection...
Can affect Performance
●
Same Java VM
●
You can see compiled bytecode
●
Decompile problematic code to Java and tune it
●
Start a component in Java and then convert it to Kotlin
Can affect Performance ® BUT...
●
Extension functions are just a trick, no overhead
●
Null checks are a small runtime overhead
●
Platform and base libraries are the sane
●
Kotlin library overhead not important for backend
Can affect Performance ® BUT... (2)
●
Increased build time
●
Find equivalent tools
●
Adaptation to those tools
Tooling problems
●
Same IDE: IntelliJ, Eclipse...
●
Same build tools: Maven, Gradle...
●
In a microservices architecture build time not so critical
Seconds?
Tooling problems ® BUT...
●
What if Kotlin stops being “cool”?
●
What if nobody uses it anymore?
●
What if it just dissapears?
Supported / created by Jetbrains
Long-term vision
Long-term vision ® BUT...
03 10 MONTHS
LATER...
●
Development time basically the same
●
Code Reviews more interesting!
●
Our Java platform was 100% compatible
Learning cost?
●
Rest of the company?
4 teams doing services in Kotlin
Kotlin now official in the company for Android
Learning cost?
final vs. open
Some Java libraries rely on
dinamically creating subclasses
●
Interceptors and other injection “black magic”
Spring, Guice…
●
Mocks: Mockito, Spock
Compiler plugins
●
All-open: Make classes open
Shortcut: Spring
●
No-args: Create a no-args constructor
Shortcut: JPA
Beware!: only by annotations
Compiler plugins ® All-open not enough
●
@Transactional problem (if no class annotation)
Explicit open class and methods
●
Mocks?
Mockito 2.1.0 “inline mocks”: “incubating”
Kotlin-runner library: explicit packages
Compiler plugins ® No-args not enough
●
Object Mapper libraries
Explicit no-args constructor
●
Spock tests
Named parameters don’t work from Java / Groovy
const val ONE = 1 // MyObject(1) NO OBJECTS ALLOWED
// Translated to: public static final
class Constants {
companion object {
const val TWO = 2 // MyObject(2) NO OBJECTS ALLOWED
// Translated to: inlined
val THREE = MyObject(3) // Translated to private static
// + Companion class with getter
@JvmField val FOUR = MyObject(4) // Translated to public static final
}
}
Constants: too many options?
https://blog.egorand.me/where-do-i-put-my-constants-in-kotlin/
val description: String (type after identifier)
val description: String (type after identifier)
Can affect Performance?
●
Eclipse with Kotlin and Groovy tests just don’t work
●
Eclipse incremental compilation a bit slow
●
Some crashes when updating IntelliJ plugin
●
Incremental build disabled by default in some versions
Maven+Gradle
●
Checkstyle, Findbugs…
Tooling problems?
●
Eclipse with Kotlin and Groovy tests just don’t work
●
Eclipse incremental compilation a bit slow
●
Some crashes when updating IntelliJ plugin
●
Incremental build disabled by default in some versions
Maven+Gradle
●
Checkstyle, Findbugs…
Tooling problems?
04 Beyond
the basics
Functional features
fun processPersonName(person: Person?, processor: (String) -> Boolean) =
processor(
when(person) {
null -> "null"
is AnonymousPerson -> "anonymous"
else -> when {
person.isBoss -> "a boss"
else -> "the simple ${person.name}"
}
}
)
●
Not 100% functional
●
Higher kind types
●
Typeclasses
●
Proposal (KEEP) in discussion to add them, by @raulraja
●
Kategory library - http://kategory.io/
Functional paradigm?
Black magic
companion { [constants: USER_ID, PRODUCTS, OK_RESULT...) }
val storeCatalogStub = Stub<StoreCatalog> {
getProductsForUserId(USER_ID) <= PRODUCTS
}
val storeMock = Mock<ProductStore>()
val purchaseHistoryMock: PurchaseHistory = Mock()
fun `Purchase correct product available in the store`() {
given("A valid user") {
userService.isValidUser(USER_ID) <= true
} `when`("The user tries to do the purchase") {
purchaseOperation.perform(USER_ID, PRODUCT_ID)
} then("Product is purchased") {
1 * storeMock.purchaseProduct(USER_ID, PRODUCT_ID, null.not()) <= OK_RESULT
} and("Operation is logged") {
(1..any) * purchaseHistoryMock.logProductPurchased(USER_ID, PRODUCT_ID, any())
} and("No more interactions") {
0 * any
}
}
Black magic
companion { [constants: USER_ID, PRODUCTS, OK_RESULT...) }
val storeCatalogStub = Stub<StoreCatalog> {
getProductsForUserId(USER_ID) <= PRODUCTS
}
val storeMock = Mock<ProductStore>()
val purchaseHistoryMock: PurchaseHistory = Mock()
fun `Purchase correct product available in the store`() {
given("A valid user") {
userService.isValidUser(USER_ID) <= true
} `when`("The user tries to do the purchase") {
purchaseOperation.perform(USER_ID, PRODUCT_ID)
} then("Product is purchased") {
1 * storeMock.purchaseProduct(USER_ID, PRODUCT_ID, null.not()) <= OK_RESULT
} and("Operation is logged") {
(1..any) * purchaseHistoryMock.logProductPurchased(USER_ID, PRODUCT_ID, any())
} and("No more interactions") {
0 * any
}
}
Lambda param after
parenthesis
Code generation
(compiler plugin)
Black magic
companion { [constants: USER_ID, PRODUCTS, OK_RESULT...) }
val storeCatalogStub = Stub<StoreCatalog> {
getProductsForUserId(USER_ID) <= PRODUCTS
}
val storeMock = Mock<ProductStore>()
val purchaseHistoryMock: PurchaseHistory = Mock()
fun `Purchase correct product available in the store`() {
given("A valid user") {
userService.isValidUser(USER_ID) <= true
} `when`("The user tries to do the purchase") {
purchaseOperation.perform(USER_ID, PRODUCT_ID)
} then("Product is purchased") {
1 * storeMock.purchaseProduct(USER_ID, PRODUCT_ID, null.not()) <= OK_RESULT
} and("Operation is logged") {
(1..any) * purchaseHistoryMock.logProductPurchased(USER_ID, PRODUCT_ID, any())
} and("No more interactions") {
0 * any
}
}
Operator overloading
Reified generics
Extension functions
https://github.com/Koxalen
More...
●
Coroutines
●
Type aliases
●
Sealed classes
●
Delegated properties
●
Inline functions
Android
●
Anko library
●
Consider performance and limits
7k methods (65k methods limit): 10%
380 KB
Compilation slower
Multi-platform
●
Javascript
Kotlin wrapper for ReactJS
●
Native
Kotlin plugin for CLion
Kotlin/Native iOS support
Not only the JVM!
KotlinConf app fully made with Kotlin
SO WHAT???05
Yay or Nay?
●
Controlled risk, but… worth it?
●
What’s the benefit?
Mostly syntatic sugar
Productivity really improved???
Yay or Nay?
●
Controlled risk, but… worth it?
●
What’s the benefit?
Mostly syntatic sugar
Productivity really improved???
How about thinking about PEOPLE
instead of PRODUCTS?
It’s all about LEARNING
and MOTIVATION
Questions?
Andrés Viedma · @andres_viedma

More Related Content

What's hot

ADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersBartosz Kosarzycki
 
Kotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsKotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsBartosz Kosarzycki
 
Little Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinLittle Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinKai Koenig
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersBartosz Kosarzycki
 
Kotlin hands on - MorningTech ekito 2017
Kotlin hands on - MorningTech ekito 2017Kotlin hands on - MorningTech ekito 2017
Kotlin hands on - MorningTech ekito 2017Arnaud Giuliani
 
Kotlin boost yourproductivity
Kotlin boost yourproductivityKotlin boost yourproductivity
Kotlin boost yourproductivitynklmish
 
Kotlin for Android Developers - 3
Kotlin for Android Developers - 3Kotlin for Android Developers - 3
Kotlin for Android Developers - 3Mohamed Nabil, MSc.
 
Introduction to Koltin for Android Part I
Introduction to Koltin for Android Part I Introduction to Koltin for Android Part I
Introduction to Koltin for Android Part I Atif AbbAsi
 
Taking Kotlin to production, Seriously
Taking Kotlin to production, SeriouslyTaking Kotlin to production, Seriously
Taking Kotlin to production, SeriouslyHaim Yadid
 
Kotlin: Challenges in JVM language design
Kotlin: Challenges in JVM language designKotlin: Challenges in JVM language design
Kotlin: Challenges in JVM language designAndrey Breslav
 
Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Andrey Breslav
 
A quick and fast intro to Kotlin
A quick and fast intro to Kotlin A quick and fast intro to Kotlin
A quick and fast intro to Kotlin XPeppers
 
AST Transformations
AST TransformationsAST Transformations
AST TransformationsHamletDRC
 
Kotlin for Android Developers - 1
Kotlin for Android Developers - 1Kotlin for Android Developers - 1
Kotlin for Android Developers - 1Mohamed Nabil, MSc.
 
C# Starter L02-Classes and Objects
C# Starter L02-Classes and ObjectsC# Starter L02-Classes and Objects
C# Starter L02-Classes and ObjectsMohammad Shaker
 
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
 

What's hot (19)

ADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developers
 
Kotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsKotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projects
 
Little Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinLittle Helpers for Android Development with Kotlin
Little Helpers for Android Development with Kotlin
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developers
 
Kotlin hands on - MorningTech ekito 2017
Kotlin hands on - MorningTech ekito 2017Kotlin hands on - MorningTech ekito 2017
Kotlin hands on - MorningTech ekito 2017
 
Kotlin boost yourproductivity
Kotlin boost yourproductivityKotlin boost yourproductivity
Kotlin boost yourproductivity
 
Kotlin
KotlinKotlin
Kotlin
 
Kotlin for Android Developers - 3
Kotlin for Android Developers - 3Kotlin for Android Developers - 3
Kotlin for Android Developers - 3
 
Introduction to Koltin for Android Part I
Introduction to Koltin for Android Part I Introduction to Koltin for Android Part I
Introduction to Koltin for Android Part I
 
Taking Kotlin to production, Seriously
Taking Kotlin to production, SeriouslyTaking Kotlin to production, Seriously
Taking Kotlin to production, Seriously
 
Kotlin: Challenges in JVM language design
Kotlin: Challenges in JVM language designKotlin: Challenges in JVM language design
Kotlin: Challenges in JVM language design
 
Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011
 
A quick and fast intro to Kotlin
A quick and fast intro to Kotlin A quick and fast intro to Kotlin
A quick and fast intro to Kotlin
 
AST Transformations
AST TransformationsAST Transformations
AST Transformations
 
Kotlin for Android Developers - 1
Kotlin for Android Developers - 1Kotlin for Android Developers - 1
Kotlin for Android Developers - 1
 
Return of c++
Return of c++Return of c++
Return of c++
 
Kotlin Overview
Kotlin OverviewKotlin Overview
Kotlin Overview
 
C# Starter L02-Classes and Objects
C# Starter L02-Classes and ObjectsC# Starter L02-Classes and Objects
C# Starter L02-Classes and Objects
 
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
 

Similar to Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)

Kotlin for Android Development
Kotlin for Android DevelopmentKotlin for Android Development
Kotlin for Android DevelopmentSpeck&Tech
 
Kotlin: A pragmatic language by JetBrains
Kotlin: A pragmatic language by JetBrainsKotlin: A pragmatic language by JetBrains
Kotlin: A pragmatic language by JetBrainsJigar Gosar
 
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016STX Next
 
What’s new in Kotlin?
What’s new in Kotlin?What’s new in Kotlin?
What’s new in Kotlin?Squareboat
 
Kotlin, smarter development for the jvm
Kotlin, smarter development for the jvmKotlin, smarter development for the jvm
Kotlin, smarter development for the jvmArnaud Giuliani
 
Type Driven Development @ Confitura 2014
Type Driven Development @ Confitura 2014Type Driven Development @ Confitura 2014
Type Driven Development @ Confitura 2014Maciek Próchniak
 
.NET Foundation, Future of .NET and C#
.NET Foundation, Future of .NET and C#.NET Foundation, Future of .NET and C#
.NET Foundation, Future of .NET and C#Bertrand Le Roy
 
Kotlin 101 for Java Developers
Kotlin 101 for Java DevelopersKotlin 101 for Java Developers
Kotlin 101 for Java DevelopersChristoph Pickl
 
7 Sins of Java fixed in Kotlin
7 Sins of Java fixed in Kotlin7 Sins of Java fixed in Kotlin
7 Sins of Java fixed in KotlinLuca Guadagnini
 
Kotlin / Android Update
Kotlin / Android UpdateKotlin / Android Update
Kotlin / Android UpdateGarth Gilmour
 
Kotlin coroutines and spring framework
Kotlin coroutines and spring frameworkKotlin coroutines and spring framework
Kotlin coroutines and spring frameworkSunghyouk Bae
 
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
TMPA-2015: Kotlin: From Null Dereference to Smart CastsTMPA-2015: Kotlin: From Null Dereference to Smart Casts
TMPA-2015: Kotlin: From Null Dereference to Smart CastsIosif Itkin
 
Coding for Android on steroids with Kotlin
Coding for Android on steroids with KotlinCoding for Android on steroids with Kotlin
Coding for Android on steroids with KotlinKai Koenig
 
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdfAndrey Breslav
 
A Sceptical Guide to Functional Programming
A Sceptical Guide to Functional ProgrammingA Sceptical Guide to Functional Programming
A Sceptical Guide to Functional ProgrammingGarth Gilmour
 

Similar to Poniendo Kotlin en producción a palos (Kotlin in production, the hard way) (20)

Kotlin for Android Development
Kotlin for Android DevelopmentKotlin for Android Development
Kotlin for Android Development
 
Why Kotlin is your next language?
Why Kotlin is your next language? Why Kotlin is your next language?
Why Kotlin is your next language?
 
Clojure Small Intro
Clojure Small IntroClojure Small Intro
Clojure Small Intro
 
Kotlin: A pragmatic language by JetBrains
Kotlin: A pragmatic language by JetBrainsKotlin: A pragmatic language by JetBrains
Kotlin: A pragmatic language by JetBrains
 
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
 
What’s new in Kotlin?
What’s new in Kotlin?What’s new in Kotlin?
What’s new in Kotlin?
 
Kotlin, smarter development for the jvm
Kotlin, smarter development for the jvmKotlin, smarter development for the jvm
Kotlin, smarter development for the jvm
 
Type Driven Development @ Confitura 2014
Type Driven Development @ Confitura 2014Type Driven Development @ Confitura 2014
Type Driven Development @ Confitura 2014
 
.NET Foundation, Future of .NET and C#
.NET Foundation, Future of .NET and C#.NET Foundation, Future of .NET and C#
.NET Foundation, Future of .NET and C#
 
Kotlin 101 for Java Developers
Kotlin 101 for Java DevelopersKotlin 101 for Java Developers
Kotlin 101 for Java Developers
 
Kotlin
KotlinKotlin
Kotlin
 
Kotlin @ Devoxx 2011
Kotlin @ Devoxx 2011Kotlin @ Devoxx 2011
Kotlin @ Devoxx 2011
 
7 Sins of Java fixed in Kotlin
7 Sins of Java fixed in Kotlin7 Sins of Java fixed in Kotlin
7 Sins of Java fixed in Kotlin
 
Kotlin / Android Update
Kotlin / Android UpdateKotlin / Android Update
Kotlin / Android Update
 
Kotlin coroutines and spring framework
Kotlin coroutines and spring frameworkKotlin coroutines and spring framework
Kotlin coroutines and spring framework
 
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
TMPA-2015: Kotlin: From Null Dereference to Smart CastsTMPA-2015: Kotlin: From Null Dereference to Smart Casts
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
 
Coding for Android on steroids with Kotlin
Coding for Android on steroids with KotlinCoding for Android on steroids with Kotlin
Coding for Android on steroids with Kotlin
 
C# Today and Tomorrow
C# Today and TomorrowC# Today and Tomorrow
C# Today and Tomorrow
 
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
 
A Sceptical Guide to Functional Programming
A Sceptical Guide to Functional ProgrammingA Sceptical Guide to Functional Programming
A Sceptical Guide to Functional Programming
 

Recently uploaded

How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 

Recently uploaded (20)

How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 

Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)

  • 4.
  • 5. Null safety fun printStringLength(maybeString: String?) { // maybeString.length would not compile if (maybeString != null) { // maybeString cannot be null now, it's a String println(maybeString.length) } else { println("<empty>") } } ”My billion dollars mistake” Tony Hoare
  • 6. fun printStringLength1(maybeString: String?) { maybeString?.let { s -> println(s) } } fun printStringLengthOrEmpty(maybeString: String?) { println(maybeString?.length ?: "<empty>") } Null safety
  • 7. A small immutable Kotlin class data class TokenInfo( val tokenType: String = “auth”, val identity: String val expiration: Int? = null )
  • 8. Constructor with Properties class TokenInfo( val tokenType: String, val identity: String (…) ) public final class TokenInfo { private final String tokenType; private final String identity; (…) public TokenInfo( String tokenType, String identity, (…)) { this.tokenType = tokenType; this.identity = identity; (…) } public final String getTokenType() { return tokenType; } public final String getIdentity() { return identity; } }
  • 9. Getters and Setters class TokenInfo( val tokenType: String, val identity: String (…) ) public final class TokenInfo { private final String tokenType; private final String identity; (…) public TokenInfo( String tokenType, String identity, (…)) { this.tokenType = tokenType; this.identity = identity; (…) } public final String getTokenType() { return tokenType; } public final String getIdentity() { return identity; } }
  • 10. Named arguments and optional values class TokenInfo( val tokenType: String = "auth", val identity: String, val expiration: Int? = null ) val token = TokenInfo(identity = "xxx") Immutable classes with optional fields? Constructors with lots of parameters Builder object
  • 11. Data classes data class TokenInfo( val tokenType: String, val identity: String (…) ) public final class TokenInfo { (…) public String toString() { (…) } public int hashCode() { (…) } public boolean equals(Object var1) { (…) } public final TokenInfoId copy(String tokenType, String identity) { (…) } public final String component1() { (…) } public final String component2() { (…) } } Immutability made easier
  • 12. Collections improvements List<Person> persons = Arrays.asList( new Person("Sansa", "Stark"), new Person("Jon", "Snow")); List<String> personNames = persons.stream() .map(p -> p.getName() + " " + p.getSurname()) .collect(Collectors.toList()); val persons = listOf( Person("Sansa", "Stark"), Person("Jon", "Snow")) val personNames = persons .map { p -> "${p.name} ${p.surname}" } Extension functions
  • 13. Collections improvements List<Integer> result = list.stream() .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) .collect(Collectors.toList()); val result = list.filter { it != null } List<Integer> result = list.stream() .flatMap(o → o.map(Stream::of) .orElseGet(Stream::empty)) .collect(Collectors.toList()); List<Integer> result = list.stream() .flatMap(Optional::stream) .collect(Collectors.toList());
  • 14. String Interpolation List<Person> persons = Arrays.asList( new Person("Sansa", "Stark"), new Person("Jon", "Snow")); List<String> personNames = persons.stream() .map(p -> p.getName() + " " + p.getSurname()) .collect(Collectors.toList()); val persons = listOf( Person("Sansa", "Stark"), Person("Jon", "Snow")) val personNames = persons .map { p -> "${p.name} ${p.surname}" }
  • 15. Type Inference val persons = listOf( Person("Sansa", "Stark"), Person("Jon", "Snow")) val personNames = persons .map { p -> "${p.name} ${p.surname}" } List<Person> persons = Arrays.asList( new Person("Sansa", "Stark"), new Person("Jon", "Snow")); List<String> personNames = persons.stream() .map(p -> p.getName() + " " + p.getSurname()) .collect(Collectors.toList());
  • 16. Gotcha! Now the idea is trapped inside your head
  • 17. Gotcha! Now the idea is trapped inside your head
  • 18. Gotcha! Now the idea is trapped inside your head
  • 19. 02 LET'S DO IT!
  • 20. Tell the team! The conformist
  • 21. Tell the team! The conformist The idealist
  • 22. Tell the team! The conformist The idealist The responsible
  • 23. Tell the team! The conformist The idealist The responsible AGGG ROOO RAGGAGGG ROOO RAGG ROOOOOOOGHH!ROOOOOOOGHH!
  • 24. What about the rest of the company?
  • 26. Option 2: Talk to them
  • 27. ● Can affect development time ● Misunderstandings can increase bug rate ● Service responsibility is not fixed Not just YOUR team Learning cost
  • 28. ● Learning curve very smooth ● On doubt, use Java style and methods ● Not a real paradigm change ● Same libraries and concepts Learning cost ® BUT...
  • 29. ● Good documentation ● Short library ● Is there a general interest in Kotlin in the company? Kotlin community Android devs pushing for a change Learning cost ® BUT... (2)
  • 30. ● It's production! ● New technology, may have bugs ● Adds code “behind the courtains” ● Any weird behaviour affecting memory, garbage collection... Can affect Performance
  • 31. ● Same Java VM ● You can see compiled bytecode ● Decompile problematic code to Java and tune it ● Start a component in Java and then convert it to Kotlin Can affect Performance ® BUT...
  • 32. ● Extension functions are just a trick, no overhead ● Null checks are a small runtime overhead ● Platform and base libraries are the sane ● Kotlin library overhead not important for backend Can affect Performance ® BUT... (2)
  • 33. ● Increased build time ● Find equivalent tools ● Adaptation to those tools Tooling problems
  • 34. ● Same IDE: IntelliJ, Eclipse... ● Same build tools: Maven, Gradle... ● In a microservices architecture build time not so critical Seconds? Tooling problems ® BUT...
  • 35. ● What if Kotlin stops being “cool”? ● What if nobody uses it anymore? ● What if it just dissapears? Supported / created by Jetbrains Long-term vision
  • 38. ● Development time basically the same ● Code Reviews more interesting! ● Our Java platform was 100% compatible Learning cost?
  • 39. ● Rest of the company? 4 teams doing services in Kotlin Kotlin now official in the company for Android Learning cost?
  • 40. final vs. open Some Java libraries rely on dinamically creating subclasses ● Interceptors and other injection “black magic” Spring, Guice… ● Mocks: Mockito, Spock
  • 41. Compiler plugins ● All-open: Make classes open Shortcut: Spring ● No-args: Create a no-args constructor Shortcut: JPA Beware!: only by annotations
  • 42. Compiler plugins ® All-open not enough ● @Transactional problem (if no class annotation) Explicit open class and methods ● Mocks? Mockito 2.1.0 “inline mocks”: “incubating” Kotlin-runner library: explicit packages
  • 43. Compiler plugins ® No-args not enough ● Object Mapper libraries Explicit no-args constructor ● Spock tests Named parameters don’t work from Java / Groovy
  • 44. const val ONE = 1 // MyObject(1) NO OBJECTS ALLOWED // Translated to: public static final class Constants { companion object { const val TWO = 2 // MyObject(2) NO OBJECTS ALLOWED // Translated to: inlined val THREE = MyObject(3) // Translated to private static // + Companion class with getter @JvmField val FOUR = MyObject(4) // Translated to public static final } } Constants: too many options? https://blog.egorand.me/where-do-i-put-my-constants-in-kotlin/
  • 45. val description: String (type after identifier)
  • 46. val description: String (type after identifier)
  • 48. ● Eclipse with Kotlin and Groovy tests just don’t work ● Eclipse incremental compilation a bit slow ● Some crashes when updating IntelliJ plugin ● Incremental build disabled by default in some versions Maven+Gradle ● Checkstyle, Findbugs… Tooling problems?
  • 49. ● Eclipse with Kotlin and Groovy tests just don’t work ● Eclipse incremental compilation a bit slow ● Some crashes when updating IntelliJ plugin ● Incremental build disabled by default in some versions Maven+Gradle ● Checkstyle, Findbugs… Tooling problems?
  • 51. Functional features fun processPersonName(person: Person?, processor: (String) -> Boolean) = processor( when(person) { null -> "null" is AnonymousPerson -> "anonymous" else -> when { person.isBoss -> "a boss" else -> "the simple ${person.name}" } } )
  • 52. ● Not 100% functional ● Higher kind types ● Typeclasses ● Proposal (KEEP) in discussion to add them, by @raulraja ● Kategory library - http://kategory.io/ Functional paradigm?
  • 53. Black magic companion { [constants: USER_ID, PRODUCTS, OK_RESULT...) } val storeCatalogStub = Stub<StoreCatalog> { getProductsForUserId(USER_ID) <= PRODUCTS } val storeMock = Mock<ProductStore>() val purchaseHistoryMock: PurchaseHistory = Mock() fun `Purchase correct product available in the store`() { given("A valid user") { userService.isValidUser(USER_ID) <= true } `when`("The user tries to do the purchase") { purchaseOperation.perform(USER_ID, PRODUCT_ID) } then("Product is purchased") { 1 * storeMock.purchaseProduct(USER_ID, PRODUCT_ID, null.not()) <= OK_RESULT } and("Operation is logged") { (1..any) * purchaseHistoryMock.logProductPurchased(USER_ID, PRODUCT_ID, any()) } and("No more interactions") { 0 * any } }
  • 54. Black magic companion { [constants: USER_ID, PRODUCTS, OK_RESULT...) } val storeCatalogStub = Stub<StoreCatalog> { getProductsForUserId(USER_ID) <= PRODUCTS } val storeMock = Mock<ProductStore>() val purchaseHistoryMock: PurchaseHistory = Mock() fun `Purchase correct product available in the store`() { given("A valid user") { userService.isValidUser(USER_ID) <= true } `when`("The user tries to do the purchase") { purchaseOperation.perform(USER_ID, PRODUCT_ID) } then("Product is purchased") { 1 * storeMock.purchaseProduct(USER_ID, PRODUCT_ID, null.not()) <= OK_RESULT } and("Operation is logged") { (1..any) * purchaseHistoryMock.logProductPurchased(USER_ID, PRODUCT_ID, any()) } and("No more interactions") { 0 * any } } Lambda param after parenthesis Code generation (compiler plugin)
  • 55. Black magic companion { [constants: USER_ID, PRODUCTS, OK_RESULT...) } val storeCatalogStub = Stub<StoreCatalog> { getProductsForUserId(USER_ID) <= PRODUCTS } val storeMock = Mock<ProductStore>() val purchaseHistoryMock: PurchaseHistory = Mock() fun `Purchase correct product available in the store`() { given("A valid user") { userService.isValidUser(USER_ID) <= true } `when`("The user tries to do the purchase") { purchaseOperation.perform(USER_ID, PRODUCT_ID) } then("Product is purchased") { 1 * storeMock.purchaseProduct(USER_ID, PRODUCT_ID, null.not()) <= OK_RESULT } and("Operation is logged") { (1..any) * purchaseHistoryMock.logProductPurchased(USER_ID, PRODUCT_ID, any()) } and("No more interactions") { 0 * any } } Operator overloading Reified generics Extension functions https://github.com/Koxalen
  • 57. Android ● Anko library ● Consider performance and limits 7k methods (65k methods limit): 10% 380 KB Compilation slower
  • 58. Multi-platform ● Javascript Kotlin wrapper for ReactJS ● Native Kotlin plugin for CLion Kotlin/Native iOS support Not only the JVM! KotlinConf app fully made with Kotlin
  • 60. Yay or Nay? ● Controlled risk, but… worth it? ● What’s the benefit? Mostly syntatic sugar Productivity really improved???
  • 61. Yay or Nay? ● Controlled risk, but… worth it? ● What’s the benefit? Mostly syntatic sugar Productivity really improved??? How about thinking about PEOPLE instead of PRODUCTS?
  • 62. It’s all about LEARNING and MOTIVATION
  • 63.