SlideShare a Scribd company logo
LET THE TYPE SYSTEM
BE YOUR FRIEND
ABOUT ME
👤 Wiktor Toporek
💼 PHP → Frontend → Node.js
👍 Functional programming
❤ Elm
🐦 Twitter: @vViktorPL
function sum(elements) {
  return elements.reduce((a, b) => a + b, 0)
}
function sum(elements) {
  return elements.reduce((a, b) => a + b, 0)
}
function sum(elements) {
  return elements.reduce((a, b) => a + b, 0)
}
function sum(elements) {
  return elements.reduce((a, b) => a + b, 0)
}
function sum(elements) {
  return elements.reduce((a, b) => a + b, 0)
}
HOW TO DEAL WITH IT?
HOW TO DEAL WITH IT?
1. TRUST DEVELOPERS
HOW TO DEAL WITH IT?
1. TRUST DEVELOPERS
2. TRY TO DEFEND
function sum(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.some(
    element => typeof element !== 'number'
  )) {
    throw 'All elements should be a number'
  }
  return elements.reduce((a, b) => a + b, 0)
}
function sum(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.some(
    element => typeof element !== 'number'
  )) {
    throw 'All elements should be a number'
  }
  return elements.reduce((a, b) => a + b, 0)
}
function sum(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.some(
    element => typeof element !== 'number'
  )) {
    throw 'All elements should be a number'
  }
  return elements.reduce((a, b) => a + b, 0)
}
✅ Function won’t be used improperly
function sum(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.some(
    element => typeof element !== 'number'
  )) {
    throw 'All elements should be a number'
  }
  return elements.reduce((a, b) => a + b, 0)
}
✅ Function won’t be used improperly
✅ Exception will hint a dev
function sum(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.some(
    element => typeof element !== 'number'
  )) {
    throw 'All elements should be a number'
  }
  return elements.reduce((a, b) => a + b, 0)
}
✅ Function won’t be used improperly
✅ Exception will hint a dev
👎 Problem won’t show until runtime
function sum(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.some(
    element => typeof element !== 'number'
  )) {
    throw 'All elements should be a number'
  }
  return elements.reduce((a, b) => a + b, 0)
}
✅ Function won’t be used improperly
✅ Exception will hint a dev
👎 Problem won’t show until runtime
👎 Extra code obfuscates the essence
function sum(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.some(
    element => typeof element !== 'number'
  )) {
    throw 'All elements should be a number'
  }
  return elements.reduce((a, b) => a + b, 0)
}
✅ Function won’t be used improperly
✅ Exception will hint a dev
👎 Problem won’t show until runtime
👎 Extra code obfuscates the essence
👎 Many edge-cases to consider
function sum(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.some(
    element => typeof element !== 'number'
  )) {
    throw 'All elements should be a number'
  }
  return elements.reduce((a, b) => a + b, 0)
}
✅ Function won’t be used improperly
✅ Exception will hint a dev
👎 Problem won’t show until runtime
👎 Extra code obfuscates the essence
👎 Many edge-cases to consider
👎 More tests to write
function avg(elements) {
  return sum(elements) / elements.length
}
function avg(elements) {
  if (elements.length === 0) {
    throw 'Cannot calculate average for empty array'
  }
  return sum(elements) / elements.length
}
function avg(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.length === 0) {
    throw 'Cannot calculate average for empty array'
  }
  return sum(elements) / elements.length
}
function avg(elements) {
  if (!Array.isArray(elements)) {
    throw 'Elements argument should be an array'
  }
  if (elements.length === 0) {
    throw 'Cannot calculate average for empty array'
  }
  return sum(elements) / elements.length
}
👎 Redundant validation
HOW TO DEAL WITH IT?
HOW TO DEAL WITH IT?
1. TRUST DEVELOPERS
HOW TO DEAL WITH IT?
1. TRUST DEVELOPERS
2. TRY TO DEFEND
HOW TO DEAL WITH IT?
1. TRUST DEVELOPERS
2. TRY TO DEFEND
3. EMPLOY A BODY GUARD
function sum(elements: number[]) {
  return elements.reduce((a, b) => a + b, 0);
}
function avg(elements: number[]) {
  if (elements.length === 0) {
    throw Error('Cannot calculate average for empty array');
  }
  return sum(elements) / elements.length;
}
avg(['x', 'y']); // compile error
sum(['x', 'y']); // compile error
avg([1, 2]); // ok
sum([1, 2]); // ok
function sum(elements: number[]) {
  return elements.reduce((a, b) => a + b, 0); 
}
function avg(elements: [number, ...number[]]) {
  return sum(elements) / elements.length;
}
avg([]);     // compile error
avg([1]);    // ok
avg([1, 2]); // ok
function sum(elements: number[]) {
  return elements.reduce((a, b) => a + b, 0); 
}
function avg(elements: [number, ...number[]]) {
  return sum(elements) / elements.length;
}
avg([]);     // compile error
avg([1]);    // ok
avg([1, 2]); // ok
type NonEmptyArray<T> = [T, ...T[]]
function sum(elements: number[]) {
  return elements.reduce((a, b) => a + b, 0); 
}
function avg(elements: [number, ...number[]]) {
  return sum(elements) / elements.length;
}
avg([]);     // compile error
avg([1]);    // ok
avg([1, 2]); // ok
type NonEmptyArray<T> = [T, ...T[]]
function avg(elements: NonEmptyArray<number>) {
  return sum(elements) / elements.length;
}
avg([]);     // compile error
avg([1]);    // ok
avg([1, 2]); // ok
HOWEVER…
HOWEVER…
let x: any = 'foo'
console.log(x.anythingIsPossible())
HOWEVER…
ANY
let x: any = 'foo'
console.log(x.anythingIsPossible())
HOWEVER…
ANY
let x: any = 'foo'
console.log(x.anythingIsPossible())
ANY
BACKEND
BACKEND
[{
  "_id": {
    "$oid": "5968dd23fc13ae04d9000001"
  },
  "product_name": "sildenafil citrate",
  "supplier": "Wisozk Inc",
  "quantity": 261,
  "unit_cost": "$10.47"
}, {
  "_id": {
    "$oid": "5968dd23fc13ae04d9000002"
  },
  "product_name": "Mountain Juniperus ashei",
  "supplier": "Keebler-Hilpert",
  "quantity": 292,
  "unit_cost": "$8.74"
}, {
  "_id": {
    "$oid": "5968dd23fc13ae04d9000003"
  },
  "product_name": "Dextromathorphan HBr",
  "supplier": "Schmitt-Weissnat",
  "quantity": 211,
BACKEND
[{
  "_id": {
    "$oid": "5968dd23fc13ae04d9000001"
  },
  "product_name": "sildenafil citrate",
  "supplier": "Wisozk Inc",
  "quantity": 261,
  "unit_cost": "$10.47"
}, {
  "_id": {
    "$oid": "5968dd23fc13ae04d9000002"
  },
  "product_name": "Mountain Juniperus ashei",
  "supplier": "Keebler-Hilpert",
  "quantity": 292,
  "unit_cost": "$8.74"
}, {
  "_id": {
    "$oid": "5968dd23fc13ae04d9000003"
  },
  "product_name": "Dextromathorphan HBr",
  "supplier": "Schmitt-Weissnat",
  "quantity": 211,
ANY
ANY
UNKNOWN
ANY vs UNKNOWN
let value: any;
let value1: unknown = value;   // OK
let value2: any = value;       // OK
let value3: boolean = value;   // OK
let value4: number = value;    // OK
let value5: string = value;    // OK
let value6: object = value;    // OK
let value7: any[] = value;     // OK
let value8: Function = value;  // OK
ANY vs UNKNOWN
let value: any;
let value1: unknown = value;   // OK
let value2: any = value;       // OK
let value3: boolean = value;   // OK
let value4: number = value;    // OK
let value5: string = value;    // OK
let value6: object = value;    // OK
let value7: any[] = value;     // OK
let value8: Function = value;  // OK
let value: unknown;
let value1: unknown = value;   // OK
let value2: any = value;       // OK
let value3: boolean = value;   // Error
let value4: number = value;    // Error
let value5: string = value;    // Error
let value6: object = value;    // Error
let value7: any[] = value;     // Error
let value8: Function = value;  // Error
ANY vs UNKNOWN
const value = JSON.parse('123')
console.log(value.toUpperCase())
ANY vs UNKNOWN
const value: unknown = JSON.parse('123')
console.log(value.toUpperCase())
ANY vs UNKNOWN
const value: unknown = JSON.parse('123')
console.log(value.toUpperCase())
ANY vs UNKNOWN
const value: unknown = JSON.parse('123')
if (typeof value === 'string') {
  console.log(value.toUpperCase())
}
ANY vs UNKNOWN
VALIDATION
VALIDATION
VALIDATION - DECODERS
DECODERS
DECODERS
VALIDATION
DECODERS
VALIDATION +
DECODERS
VALIDATION
OPTIMAL
STRUCTURE
EXTRACTION
+
VALIDATION - DECODERS
VALIDATION - DECODERS
VALIDATION - DECODERS
ARCHITECTURE
ARCHITECTURE
🗿

STATICALLY TYPED APPLICATION
ARCHITECTURE
🗿

STATICALLY TYPED APPLICATION
😈 BACKEND
ARCHITECTURE
🗿

STATICALLY TYPED APPLICATION
😈 BACKEND
😈 USER INPUT
ARCHITECTURE
🗿

STATICALLY TYPED APPLICATION
😈 BACKEND
😈 USER INPUT
🛂

VALIDATE
ARCHITECTURE
🗿

STATICALLY TYPED APPLICATION
😈 BACKEND
😈 USER INPUT
🛂

VALIDATE
🏷

TAG TYPE
ARCHITECTURE
🗿

STATICALLY TYPED APPLICATION
😈 BACKEND
😈 USER INPUT
🛂

VALIDATE
🏷

TAG TYPE
ARCHITECTURE
🗿

STATICALLY TYPED APPLICATION
😈 BACKEND
😈 USER INPUT
🛂

VALIDATE
🏷

TAG TYPE
{
ARCHITECTURE
🗿

STATICALLY TYPED APPLICATION
😈 BACKEND
😈 USER INPUT
🛂

VALIDATE
🏷

TAG TYPE
{Decoder
STATE OPTIMISATION
EXAMPLE 1
ARRAY | UNDEFINED
type Author = {
  name: string,
  books?: Book[],
}
type Book = {
  title: string,
}
render() {
  const author = this.props.author
  return (
    <div>
      <p>{author.name}</p>
      <ul>
        {author.books && author.books.map(
  ({ title }) => <li>{title}</li>
)}
      </ul>
    </div>
  )
}
ARRAY | UNDEFINED
type Author = {
  name: string,
  books: Book[],
}
type Book = {
  title: string,
}
render() {
  const author = this.props.author
  return (
    <div>
      <p>{author.name}</p>
      <ul>
        {author.books.map(
  ({ title }) => <li>{title}</li>
)}
      </ul>
    </div>
  )
}
EXAMPLE 2
SURVEY
type Survey = {
  questions: Question[],
}
type Question = {
  prompt: string,
  response?: string,
}
type Survey = {
  questions: Question[],
  currentIndex: number,
}
type Question = {
  prompt: string,
  response?: string,
}
REQUIREMENT: QUESTIONS NAVIGATION (FORWARD/BACK)
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?' },
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: 0,
}
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?' },
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: 0,
}
✅
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: 1,
}
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: 1,
}
✅
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?', response: 'Frontend' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: 1,
}
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?', response: 'Frontend' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: 1,
}
✅
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?', response: 'Frontend' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: 999,
}
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?', response: 'Frontend' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: 999,
}
❌
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?', response: 'Frontend' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: -1,
}
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?', response: 'Frontend' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentIndex: -1,
}
❌
type Survey = {
  questions: Question[],
  currentQuestion: Question,
}
type Question = {
  prompt: string,
  response?: string,
}
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?' },
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentQuestion: this.questions[0],
}
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?' },
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentQuestion: this.questions[0],
}
✅
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?' },
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentQuestion: { prompt: 'No elo' },
}
{
  questions: [
    { prompt: 'Lubisz Uszanowanko?' },
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
  currentQuestion: { prompt: 'No elo' },
}
❌
{
  questions: [],
  currentQuestion: { prompt: 'No elo' },
}
NEW REQUIREMENT: AT LEAST ONE QUESTION
{
  questions: [],
  currentQuestion: { prompt: 'No elo' },
}
ZIP LIST
type Survey = {
  previous: Question[],
  currentQuestion: Question,
  remaining: Question[]
}
type Question = {
  prompt: string,
  response?: string,
}
{
  previous: [],
  currentQuestion: { prompt: 'Lubisz Uszanowanko?' },
  remaining: [
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
}
{
  previous: [],
  currentQuestion: { prompt: 'Lubisz Uszanowanko?' },
  remaining: [
    { prompt: 'Czym się zajmujesz?' },
    { prompt: 'Nutella z masłem czy bez?' },
  ],
}
✅
{
  previous: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' }
  ],
  currentQuestion: { prompt: 'Czym się zajmujesz?' },
  remaining: [
    { prompt: 'Nutella z masłem czy bez?' },
  ],
}
{
  previous: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' }
  ],
  currentQuestion: { prompt: 'Czym się zajmujesz?' },
  remaining: [
    { prompt: 'Nutella z masłem czy bez?' },
  ],
}
✅
{
  previous: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?', response: 'Frontend' },
  ],
  currentQuestion: { prompt: 'Nutella z masłem czy bez?' },
  remaining: [],
}
{
  previous: [
    { prompt: 'Lubisz Uszanowanko?', response: 'Tak' },
    { prompt: 'Czym się zajmujesz?', response: 'Frontend' },
  ],
  currentQuestion: { prompt: 'Nutella z masłem czy bez?' },
  remaining: [],
}
✅
„
„
— Richard Feldman
MAKE IMPOSSIBLE STATES
IMPOSSIBLE
https://www.youtube.com/watch?v=IcgmSRJHu_8
SUMMARY
SUMMARY
YOUR EFFORT
SUMMARY
YOUR EFFORT
SUMMARY
🗿 Static types 1st, edge-cases 2nd
YOUR EFFORT
SUMMARY
🗿 Static types 1st, edge-cases 2nd
🛂 Validate data before you let it in
YOUR EFFORT
SUMMARY
🗿 Static types 1st, edge-cases 2nd
🛂 Validate data before you let it in
👌 Turn the validated data to optimal type
YOUR EFFORT
SUMMARY
🗿 Static types 1st, edge-cases 2nd
🛂 Validate data before you let it in
👌 Turn the validated data to optimal type
❓ Try "unknown" instead of "any"
YOUR EFFORT
SUMMARY
🗿 Static types 1st, edge-cases 2nd
🛂 Validate data before you let it in
👌 Turn the validated data to optimal type
❓ Try "unknown" instead of "any"
❌ Avoid undefined/null if you can
YOUR EFFORT
SUMMARY
🗿 Static types 1st, edge-cases 2nd
🛂 Validate data before you let it in
👌 Turn the validated data to optimal type
❓ Try "unknown" instead of "any"
❌ Avoid undefined/null if you can
💡 Take some inspiration from statically typed languages like Elm or Haskell
WHAT YOU GET IN
RETURN?
SUMMARY
WHAT YOU GET IN RETURN?
LESS TEST TO WRITE
SUMMARY
WHAT YOU GET IN RETURN?
LESS TEST TO WRITE
SUMMARY
WHAT YOU GET IN RETURN?
APP WILL IDENTIFY PROBLEMS NOT ON IT’S SIDE
SUMMARY
WHAT YOU GET IN RETURN?
APP WILL IDENTIFY PROBLEMS NOT ON IT’S SIDE
SUMMARY
WHAT YOU GET IN RETURN?
MORE CONFIDENCE
SUMMARY
WHAT YOU GET IN RETURN?
MORE CONFIDENCE
LINKS
• https://fsharpforfunandprofit.com/posts/designing-with-types-making-illegal-states-unrepresentable/
• https://guide.elm-lang.org/effects/json.html#json-decoders
• https://www.youtube.com/watch?v=IcgmSRJHu_8
• https://stackoverflow.com/questions/40794368/what-is-an-opaque-type-in-elm-and-why-is-it-valuable
• https://basarat.gitbooks.io/typescript/docs/tips/nominalTyping.html
• https://www.youtube.com/watch?v=WnTw0z7rD3E
🔗
BOOK RECOMMENDATIONS
📚
BOOK RECOMMENDATIONS
📚
BOOK RECOMMENDATIONS
📚
BOOK RECOMMENDATIONS
📚
THANK YOU

More Related Content

What's hot

Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!
Brendan Eich
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
greenwop
 
​"Delegates, Delegates everywhere" Владимир Миронов
​"Delegates, Delegates everywhere" Владимир Миронов​"Delegates, Delegates everywhere" Владимир Миронов
​"Delegates, Delegates everywhere" Владимир Миронов
AvitoTech
 
Swift internals
Swift internalsSwift internals
Swift internals
Jung Kim
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Fabio Collini
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in Scala
Wiem Zine Elabidine
 
"Kotlin и rx в android" Дмитрий Воронин (Avito)
"Kotlin и rx в android" Дмитрий Воронин  (Avito)"Kotlin и rx в android" Дмитрий Воронин  (Avito)
"Kotlin и rx в android" Дмитрий Воронин (Avito)
AvitoTech
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftGiordano Scalzo
 
Groovy grails types, operators, objects
Groovy grails types, operators, objectsGroovy grails types, operators, objects
Groovy grails types, operators, objects
Husain Dalal
 
Pure Future
Pure FuturePure Future
Pure Future
Wiem Zine Elabidine
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
Domenic Denicola
 
ZIO Queue
ZIO QueueZIO Queue
Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"
Fwdays
 
RESTful API using scalaz (3)
RESTful API using scalaz (3)RESTful API using scalaz (3)
RESTful API using scalaz (3)
Yeshwanth Kumar
 
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
Fabio Collini
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meetMario Fusco
 
Scala best practices
Scala best practicesScala best practices
Scala best practices
Alexander Zaidel
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
scalaconfjp
 
Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6
Ignacio Martín
 

What's hot (19)

Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 
​"Delegates, Delegates everywhere" Владимир Миронов
​"Delegates, Delegates everywhere" Владимир Миронов​"Delegates, Delegates everywhere" Владимир Миронов
​"Delegates, Delegates everywhere" Владимир Миронов
 
Swift internals
Swift internalsSwift internals
Swift internals
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in Scala
 
"Kotlin и rx в android" Дмитрий Воронин (Avito)
"Kotlin и rx в android" Дмитрий Воронин  (Avito)"Kotlin и rx в android" Дмитрий Воронин  (Avito)
"Kotlin и rx в android" Дмитрий Воронин (Avito)
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in Swift
 
Groovy grails types, operators, objects
Groovy grails types, operators, objectsGroovy grails types, operators, objects
Groovy grails types, operators, objects
 
Pure Future
Pure FuturePure Future
Pure Future
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
 
ZIO Queue
ZIO QueueZIO Queue
ZIO Queue
 
Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"
 
RESTful API using scalaz (3)
RESTful API using scalaz (3)RESTful API using scalaz (3)
RESTful API using scalaz (3)
 
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meet
 
Scala best practices
Scala best practicesScala best practices
Scala best practices
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
 
Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6
 

Similar to Let the type system be your friend

Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)
Scott Wlaschin
 
Functional Core, Reactive Shell
Functional Core, Reactive ShellFunctional Core, Reactive Shell
Functional Core, Reactive Shell
Giovanni Lodi
 
ITT 2015 - Saul Mora - Object Oriented Function Programming
ITT 2015 - Saul Mora - Object Oriented Function ProgrammingITT 2015 - Saul Mora - Object Oriented Function Programming
ITT 2015 - Saul Mora - Object Oriented Function Programming
Istanbul Tech Talks
 
Max Koretskyi "Why are Angular and React so fast?"
Max Koretskyi "Why are Angular and React so fast?"Max Koretskyi "Why are Angular and React so fast?"
Max Koretskyi "Why are Angular and React so fast?"
Fwdays
 
Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?UFPA
 
Scalapeno18 - Thinking Less with Scala
Scalapeno18 - Thinking Less with ScalaScalapeno18 - Thinking Less with Scala
Scalapeno18 - Thinking Less with Scala
Daniel Sebban
 
Cluj.py Meetup: Extending Python in C
Cluj.py Meetup: Extending Python in CCluj.py Meetup: Extending Python in C
Cluj.py Meetup: Extending Python in C
Steffen Wenz
 
What's in Kotlin for us - Alexandre Greschon, MyHeritage
What's in Kotlin for us - Alexandre Greschon, MyHeritageWhat's in Kotlin for us - Alexandre Greschon, MyHeritage
What's in Kotlin for us - Alexandre Greschon, MyHeritage
DroidConTLV
 
JavaScript Functions
JavaScript FunctionsJavaScript Functions
JavaScript Functions
Brian Moschel
 
Declarative Data Modeling in Python
Declarative Data Modeling in PythonDeclarative Data Modeling in Python
Declarative Data Modeling in Python
Joshua Forman
 
Столпы функционального программирования для адептов ООП, Николай Мозговой
Столпы функционального программирования для адептов ООП, Николай МозговойСтолпы функционального программирования для адептов ООП, Николай Мозговой
Столпы функционального программирования для адептов ООП, Николай Мозговой
Sigma Software
 
Oojs 1.1
Oojs 1.1Oojs 1.1
Oojs 1.1
Rodica Dada
 
Thinking in Functions: Functional Programming in Python
Thinking in Functions: Functional Programming in PythonThinking in Functions: Functional Programming in Python
Thinking in Functions: Functional Programming in Python
Anoop Thomas Mathew
 
T3chFest 2016 - The polyglot programmer
T3chFest 2016 - The polyglot programmerT3chFest 2016 - The polyglot programmer
T3chFest 2016 - The polyglot programmer
David Muñoz Díaz
 
Python bootcamp - C4Dlab, University of Nairobi
Python bootcamp - C4Dlab, University of NairobiPython bootcamp - C4Dlab, University of Nairobi
Python bootcamp - C4Dlab, University of Nairobikrmboya
 
Scala on Your Phone
Scala on Your PhoneScala on Your Phone
Scala on Your Phone
Michael Galpin
 
Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in go
Yusuke Kita
 
jQuery - Tips And Tricks
jQuery - Tips And TricksjQuery - Tips And Tricks
jQuery - Tips And Tricks
Lester Lievens
 
25-functions.ppt
25-functions.ppt25-functions.ppt
25-functions.ppt
JyothiAmpally
 
Functional programming basics
Functional programming basicsFunctional programming basics
Functional programming basicsopenbala
 

Similar to Let the type system be your friend (20)

Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)
 
Functional Core, Reactive Shell
Functional Core, Reactive ShellFunctional Core, Reactive Shell
Functional Core, Reactive Shell
 
ITT 2015 - Saul Mora - Object Oriented Function Programming
ITT 2015 - Saul Mora - Object Oriented Function ProgrammingITT 2015 - Saul Mora - Object Oriented Function Programming
ITT 2015 - Saul Mora - Object Oriented Function Programming
 
Max Koretskyi "Why are Angular and React so fast?"
Max Koretskyi "Why are Angular and React so fast?"Max Koretskyi "Why are Angular and React so fast?"
Max Koretskyi "Why are Angular and React so fast?"
 
Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?
 
Scalapeno18 - Thinking Less with Scala
Scalapeno18 - Thinking Less with ScalaScalapeno18 - Thinking Less with Scala
Scalapeno18 - Thinking Less with Scala
 
Cluj.py Meetup: Extending Python in C
Cluj.py Meetup: Extending Python in CCluj.py Meetup: Extending Python in C
Cluj.py Meetup: Extending Python in C
 
What's in Kotlin for us - Alexandre Greschon, MyHeritage
What's in Kotlin for us - Alexandre Greschon, MyHeritageWhat's in Kotlin for us - Alexandre Greschon, MyHeritage
What's in Kotlin for us - Alexandre Greschon, MyHeritage
 
JavaScript Functions
JavaScript FunctionsJavaScript Functions
JavaScript Functions
 
Declarative Data Modeling in Python
Declarative Data Modeling in PythonDeclarative Data Modeling in Python
Declarative Data Modeling in Python
 
Столпы функционального программирования для адептов ООП, Николай Мозговой
Столпы функционального программирования для адептов ООП, Николай МозговойСтолпы функционального программирования для адептов ООП, Николай Мозговой
Столпы функционального программирования для адептов ООП, Николай Мозговой
 
Oojs 1.1
Oojs 1.1Oojs 1.1
Oojs 1.1
 
Thinking in Functions: Functional Programming in Python
Thinking in Functions: Functional Programming in PythonThinking in Functions: Functional Programming in Python
Thinking in Functions: Functional Programming in Python
 
T3chFest 2016 - The polyglot programmer
T3chFest 2016 - The polyglot programmerT3chFest 2016 - The polyglot programmer
T3chFest 2016 - The polyglot programmer
 
Python bootcamp - C4Dlab, University of Nairobi
Python bootcamp - C4Dlab, University of NairobiPython bootcamp - C4Dlab, University of Nairobi
Python bootcamp - C4Dlab, University of Nairobi
 
Scala on Your Phone
Scala on Your PhoneScala on Your Phone
Scala on Your Phone
 
Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in go
 
jQuery - Tips And Tricks
jQuery - Tips And TricksjQuery - Tips And Tricks
jQuery - Tips And Tricks
 
25-functions.ppt
25-functions.ppt25-functions.ppt
25-functions.ppt
 
Functional programming basics
Functional programming basicsFunctional programming basics
Functional programming basics
 

More from The Software House

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
The Software House
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
The Software House
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
The Software House
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
The Software House
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
The Software House
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
The Software House
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
The Software House
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
The Software House
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
The Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
The Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
The Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
The Software House
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
The Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
The Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
The Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
The Software House
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
The Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
The Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
The Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
The Software House
 

More from The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 

Recently uploaded

AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
Google
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
Ortus Solutions, Corp
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
Game Development with Unity3D (Game Development lecture 3)
Game Development  with Unity3D (Game Development lecture 3)Game Development  with Unity3D (Game Development lecture 3)
Game Development with Unity3D (Game Development lecture 3)
abdulrafaychaudhry
 
AI Genie Review: World’s First Open AI WordPress Website Creator
AI Genie Review: World’s First Open AI WordPress Website CreatorAI Genie Review: World’s First Open AI WordPress Website Creator
AI Genie Review: World’s First Open AI WordPress Website Creator
Google
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
Boni García
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Mind IT Systems
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Enterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptxEnterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptx
QuickwayInfoSystems3
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Text-Summarization-of-Breaking-News-Using-Fine-tuning-BART-Model.pptx
Text-Summarization-of-Breaking-News-Using-Fine-tuning-BART-Model.pptxText-Summarization-of-Breaking-News-Using-Fine-tuning-BART-Model.pptx
Text-Summarization-of-Breaking-News-Using-Fine-tuning-BART-Model.pptx
ShamsuddeenMuhammadA
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 
Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)
abdulrafaychaudhry
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 

Recently uploaded (20)

AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
Game Development with Unity3D (Game Development lecture 3)
Game Development  with Unity3D (Game Development lecture 3)Game Development  with Unity3D (Game Development lecture 3)
Game Development with Unity3D (Game Development lecture 3)
 
AI Genie Review: World’s First Open AI WordPress Website Creator
AI Genie Review: World’s First Open AI WordPress Website CreatorAI Genie Review: World’s First Open AI WordPress Website Creator
AI Genie Review: World’s First Open AI WordPress Website Creator
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Enterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptxEnterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptx
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Text-Summarization-of-Breaking-News-Using-Fine-tuning-BART-Model.pptx
Text-Summarization-of-Breaking-News-Using-Fine-tuning-BART-Model.pptxText-Summarization-of-Breaking-News-Using-Fine-tuning-BART-Model.pptx
Text-Summarization-of-Breaking-News-Using-Fine-tuning-BART-Model.pptx
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 
Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 

Let the type system be your friend