SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
IZUMI 1.0
YOUR NEXT SCALA STACK
INTRO
WHO WE ARE
▸ Pavel and Kai
▸ Septimal Mind, an Irish consultancy
▸ Engineer’s productivity is our primary concern
▸ Love Scala and pure FP
▸ Scala contributors
INTRO
WHAT WE DO
▸ We identify productivity issues in SDLC pipeline
▸ We build tools to address these issues
INTRO
WHAT WE USE
‣ We've been using Scala for many years
‣ Bifuctors are beneficial, we've been using Scalactic
‣ We've adopted ZIO since first public alpha
‣ It closed the everlasting question of error encoding
INTRO
OPEN QUESTION
How do we design
complex but extensible
FP applications?
(Hundreds/thousands of components)
INTRO
THE ANSWER
Modularity and modules
INTRO
HOW TO GET THERE?
‣ Dependency Injection
‣ Tagless Final
IZUMI
WE MADE OUR OWN "NANOFRAMEWORK", IZUMI
‣ DIStage: Advanced Dependency Injection
‣ BIO: Tagless Final for Bifunctors and Trifunctors
Also:
‣ LogStage: Zero-Effort Structural logging
‣ etc
BIO
WHAT IS BIO?
‣ A set of typeclasses for Bifunctors and Trifunctors
‣ Like Cats but for F[+_, +_] and F[-_, +_, +_]
‣ Should be incorporated into ZIO Prelude in foreseeable
future
DISTAGE
WHAT IS DISTAGE?
‣ Your regular Dependency Injection library
‣ Supports F[_]
‣ Unique feature: configurable applications
‣ Since 1.0: State-of-the-art compile-time verification
‣ Many features: resources/lifecycles, integration checks, etc
‣ The most advanced DI/Module system available
IZUMI 1.0: DISTAGE
WHAT IS A CONFIGURABLE APP?
‣ An application may run in several "modes"
‣ E.g. Purpose={Test|Prod}, Database={Dummy|Postgres}
‣ Modes can be chosen at application startup
‣ Modes may be combined
‣ The app should choose right component implementations
‣ And block incorrect combinations
IZUMI 1.0: DISTAGE
WHAT IS A CONFIGURABLE APP?
‣ Purpose = Production | Test
‣ Database = Postgres | Oracle | Dummy
‣ We may want to run tests with Postgres database (but never with Oracle)
‣ We want to never run tests with production payment service
‣ We may want to define defaults
‣ Database is not set for Prod run => use Postgres
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
There was no good way to write configurable apps
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
...hard to code, hard to maintain...
...exponential amount of code paths...
...edgecases...
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
‣ It's hard to do it
‣ ... even if you don't have transitive dependencies
‣ ... even if you don't have dependent constraints
‣ It's even harder to provide compile-time guarantees
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
def makeUserRepo(config: Config): IUserRepo[F] = {
config.database match {
case OracleDb =>
if (!config.isProd) {
throw new RuntimeException("Oracle unsupported in test mode!")
} else {
new ProdOracleUserRepo[F]( /*...*/ )
}
case PgDb =>
new ProdPGUserRepo[F]( /*...*/ )
case Unset =>
if (config.isProd) {
throw new RuntimeException("Database is not set for prod mode!")
} else {
new DummyUserRepo[F]()
}
}
}
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
DIStage made it possible
Though it was doing things in runtime...
We thought compile-time solution is impossible...
IZUMI 1.0: DISTAGE
CONFIGURABLE APP: HOW?
DIStage since Izumi 1.0:
strong compile-time guarantees
for
configurable apps
IZUMI 1.0: DISTAGE
CONFIGURABLE APP WITH DISTAGE
class MyAppDefinition[F[+_, +_]: TagKK] extends PluginDef {
make[EnterpriseApp[F]]
make[AccountsService[F]]
make[UsersService[F]]
make[IUserRepo[F]].from[DummyUserRepo[F]].tagged(Mode.Test)
make[IUserRepo[F]].from[ProdPGUserRepo[F]].tagged(Db.Pg)
make[IUserRepo[F]].from[ProdOracleUserRepo[F]].tagged(Mode.Prod, Db.Oracle)
make[IAccountsRepo[F]].from[DummyAccRepo[F]].tagged(Mode.Test)
make[IAccountsRepo[F]].from[ProdPGAccRepo[F]].tagged(Db.Pg)
make[IAccountsRepo[F]].from[ProdOracleAccRepo[F]].tagged(Mode.Prod, Db.Oracle)
make[IPaymentsGateway[F]].from[DummyPayments[F]].tagged(Mode.Test)
make[IPaymentsGateway[F]].from[StripePayments[F]].tagged(Mode.Prod)
}
IZUMI 1.0: DISTAGE
COMPILE-TIME SAFETY
// your main method
object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... }
// in test scope
object WiringTest extends PlanCheck.Main(EnterpriseMain)
IZUMI 1.0: DISTAGE
COMPILE-TIME SAFETY
// your main method
object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... }
// in test scope
object WiringTest extends PlanCheck.Main(EnterpriseMain)
HOW DOES IT WORK?
IZUMI 1.0: DISTAGE
COMPILE-TIME SAFETY
// your main method
object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... }
// in test scope
object WiringTest extends PlanCheck.Main(EnterpriseMain)
HOW DOES IT WORK?
abstract class PluginDef[T](implicit recompilationToken: RecompilationToken[T])
IZUMI 1.0: BIO
BIO TYPECLASSES
IZUMI 1.0: BIO
BIO SUMMONER
import izumi.functional.bio.F
class DummyUserRepo[F[+_, +_]: Monad2]
F.pure(...)

F.fail(...)

F.fromEither(...)
Error2[F].fail(...)
See also: https://www.youtube.com/watch?v=ZdGK1uedAE0&t=580s
IZUMI 1.0: BIO
BIO SYNTAX
import izumi.functional.bio.{F, Error2}
// IDE auto imports
def launchMissiles[F[+_, +_]: Error2](target: Target) =
for {
_ <- F.unless(storage.hasMissiles)(F.fail(AmmoDepleted))
_ <- loadMissile(launcher, storage)
_ <- fireMissile(launcher)
.catchAll(_ => emergencyStop)
_ <- F.unless(target.isAnnihilated)(launchMissiles(target))
} yield res
import cats.syntax.all._
import cats.effect.syntax.all._
import monix.catnap.syntax._
IZUMI 1.0: BIO
COMPATIBILITY
import izumi.functional.bio.catz._
def http4sServer[F[+_, +_]: Async2: Fork2: UnsafeRun2] = {
BlazeServerBuilder[F[Throwable, ?]](ec)
.bindHttp(8080)
.withSslContext(sslContext)
.resource
}
ConcurrentEffect[F[Throwable, ?]]
MonadError[F[Throwable, ?], Throwable]
IZUMI 1.0: SUMMARY
CONCLUSION
‣ BIO provides a great set of TF abstractions
‣ DIStage is great for global/static contexts
‣ and ZIO's reader is perfect for local/dynamic contexts
‣ Izumi 1.0+ZIO is the most productive Scala stack
‣ And battle-tested
‣ There is no excuse not to use DIStage anymore
‣ Consider it for your next Scala project
Thank you!
https://github.com/7mind/izumi
https://github.com/7mind/distage-example
https://twitter.com/shirshovp
https://twitter.com/kai_nyasha

Mais conteúdo relacionado

Mais procurados

Functional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldFunctional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldJorge Vásquez
 
Be Smart, Constrain Your Types to Free Your Brain!
Be Smart, Constrain Your Types to Free Your Brain!Be Smart, Constrain Your Types to Free Your Brain!
Be Smart, Constrain Your Types to Free Your Brain!Jorge Vásquez
 
Functor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadFunctor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadOliver Daff
 
Peeking inside the engine of ZIO SQL.pdf
Peeking inside the engine of ZIO SQL.pdfPeeking inside the engine of ZIO SQL.pdf
Peeking inside the engine of ZIO SQL.pdfJaroslavRegec1
 
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...Philip Schwarz
 
Boost your productivity with Scala tooling!
Boost your productivity  with Scala tooling!Boost your productivity  with Scala tooling!
Boost your productivity with Scala tooling!MeriamLachkar1
 
Capabilities for Resources and Effects
Capabilities for Resources and EffectsCapabilities for Resources and Effects
Capabilities for Resources and EffectsMartin Odersky
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)Armando Daniel
 
Grails Connecting to MySQL
Grails Connecting to MySQLGrails Connecting to MySQL
Grails Connecting to MySQLashishkirpan
 
ZIO-Direct - Functional Scala 2022
ZIO-Direct - Functional Scala 2022ZIO-Direct - Functional Scala 2022
ZIO-Direct - Functional Scala 2022Alexander Ioffe
 
Grails object relational mapping: GORM
Grails object relational mapping: GORMGrails object relational mapping: GORM
Grails object relational mapping: GORMSaurabh Dixit
 
Py.test
Py.testPy.test
Py.testsoasme
 
Trees In The Database - Advanced data structures
Trees In The Database - Advanced data structuresTrees In The Database - Advanced data structures
Trees In The Database - Advanced data structuresLorenzo Alberton
 

Mais procurados (20)

Optional in Java 8
Optional in Java 8Optional in Java 8
Optional in Java 8
 
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldFunctional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorld
 
Be Smart, Constrain Your Types to Free Your Brain!
Be Smart, Constrain Your Types to Free Your Brain!Be Smart, Constrain Your Types to Free Your Brain!
Be Smart, Constrain Your Types to Free Your Brain!
 
Functor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadFunctor, Apply, Applicative And Monad
Functor, Apply, Applicative And Monad
 
Peeking inside the engine of ZIO SQL.pdf
Peeking inside the engine of ZIO SQL.pdfPeeking inside the engine of ZIO SQL.pdf
Peeking inside the engine of ZIO SQL.pdf
 
ZIO Queue
ZIO QueueZIO Queue
ZIO Queue
 
Introduction to java 8 stream api
Introduction to java 8 stream apiIntroduction to java 8 stream api
Introduction to java 8 stream api
 
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
 
Boost your productivity with Scala tooling!
Boost your productivity  with Scala tooling!Boost your productivity  with Scala tooling!
Boost your productivity with Scala tooling!
 
Applicative style programming
Applicative style programmingApplicative style programming
Applicative style programming
 
Capabilities for Resources and Effects
Capabilities for Resources and EffectsCapabilities for Resources and Effects
Capabilities for Resources and Effects
 
Java Class Loader
Java Class LoaderJava Class Loader
Java Class Loader
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)
 
Grails Connecting to MySQL
Grails Connecting to MySQLGrails Connecting to MySQL
Grails Connecting to MySQL
 
ZIO-Direct - Functional Scala 2022
ZIO-Direct - Functional Scala 2022ZIO-Direct - Functional Scala 2022
ZIO-Direct - Functional Scala 2022
 
Grails object relational mapping: GORM
Grails object relational mapping: GORMGrails object relational mapping: GORM
Grails object relational mapping: GORM
 
Py.test
Py.testPy.test
Py.test
 
GraphQL
GraphQLGraphQL
GraphQL
 
Clean coding-practices
Clean coding-practicesClean coding-practices
Clean coding-practices
 
Trees In The Database - Advanced data structures
Trees In The Database - Advanced data structuresTrees In The Database - Advanced data structures
Trees In The Database - Advanced data structures
 

Semelhante a Izumi 1.0: Your Next Scala Stack

Scala, Functional Programming and Team Productivity
Scala, Functional Programming and Team ProductivityScala, Functional Programming and Team Productivity
Scala, Functional Programming and Team Productivity7mind
 
Bci for Beginners
Bci for BeginnersBci for Beginners
Bci for BeginnersIainLewis
 
How to Architect and Develop Cloud Native Applications
How to Architect and Develop Cloud Native ApplicationsHow to Architect and Develop Cloud Native Applications
How to Architect and Develop Cloud Native ApplicationsSufyaan Kazi
 
Extending uBuild and uDeploy with Plugins
Extending uBuild and uDeploy with PluginsExtending uBuild and uDeploy with Plugins
Extending uBuild and uDeploy with PluginsIBM UrbanCode Products
 
SOA Knowledge Kit, Developer Productivity and Performance Comparison Analysis
SOA Knowledge Kit, Developer Productivity  and Performance Comparison AnalysisSOA Knowledge Kit, Developer Productivity  and Performance Comparison Analysis
SOA Knowledge Kit, Developer Productivity and Performance Comparison AnalysisClever Moe
 
Maximize the power of OSGi in AEM
Maximize the power of OSGi in AEM Maximize the power of OSGi in AEM
Maximize the power of OSGi in AEM ICF CIRCUIT
 
Mobile UI Testing using Appium and Docker
Mobile UI Testing using Appium and DockerMobile UI Testing using Appium and Docker
Mobile UI Testing using Appium and DockerMoataz Nabil
 
Automating load testing with CI integration slideshare
Automating load testing with CI integration slideshareAutomating load testing with CI integration slideshare
Automating load testing with CI integration slideshareJohn Emmitt
 
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdfFujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdfKommaneni Sreenivasulu
 
Pwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakPwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakAbraham Aranguren
 
How to kill test flake in appium
How to kill test flake in appiumHow to kill test flake in appium
How to kill test flake in appiumGaurav Singh
 
How to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slatherHow to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slatherallanh0526
 
The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOCCarl Lu
 
Getting started with appium
Getting started with appiumGetting started with appium
Getting started with appiumPratik Patel
 
Java EE Microservices
Java EE MicroservicesJava EE Microservices
Java EE Microservicesjclingan
 
DS, BP, EJB, CDI, WTF!? - Graham Charters
DS, BP, EJB, CDI, WTF!? - Graham ChartersDS, BP, EJB, CDI, WTF!? - Graham Charters
DS, BP, EJB, CDI, WTF!? - Graham Chartersmfrancis
 

Semelhante a Izumi 1.0: Your Next Scala Stack (20)

Scala, Functional Programming and Team Productivity
Scala, Functional Programming and Team ProductivityScala, Functional Programming and Team Productivity
Scala, Functional Programming and Team Productivity
 
Bci for Beginners
Bci for BeginnersBci for Beginners
Bci for Beginners
 
How to Architect and Develop Cloud Native Applications
How to Architect and Develop Cloud Native ApplicationsHow to Architect and Develop Cloud Native Applications
How to Architect and Develop Cloud Native Applications
 
Codename one
Codename oneCodename one
Codename one
 
Extending uBuild and uDeploy with Plugins
Extending uBuild and uDeploy with PluginsExtending uBuild and uDeploy with Plugins
Extending uBuild and uDeploy with Plugins
 
SOA Knowledge Kit, Developer Productivity and Performance Comparison Analysis
SOA Knowledge Kit, Developer Productivity  and Performance Comparison AnalysisSOA Knowledge Kit, Developer Productivity  and Performance Comparison Analysis
SOA Knowledge Kit, Developer Productivity and Performance Comparison Analysis
 
Maximize the power of OSGi in AEM
Maximize the power of OSGi in AEM Maximize the power of OSGi in AEM
Maximize the power of OSGi in AEM
 
What's new in p2 (2009)?
What's new in p2 (2009)?What's new in p2 (2009)?
What's new in p2 (2009)?
 
Mobile UI Testing using Appium and Docker
Mobile UI Testing using Appium and DockerMobile UI Testing using Appium and Docker
Mobile UI Testing using Appium and Docker
 
Automating load testing with CI integration slideshare
Automating load testing with CI integration slideshareAutomating load testing with CI integration slideshare
Automating load testing with CI integration slideshare
 
Homestead demo
Homestead demoHomestead demo
Homestead demo
 
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdfFujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
Fujitsu Services _Large Scale EBS 12.2 Upgrade Licking the Wounds_Mike_Salt.pdf
 
Mike_Salt.pdf
Mike_Salt.pdfMike_Salt.pdf
Mike_Salt.pdf
 
Pwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakPwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreak
 
How to kill test flake in appium
How to kill test flake in appiumHow to kill test flake in appium
How to kill test flake in appium
 
How to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slatherHow to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slather
 
The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOC
 
Getting started with appium
Getting started with appiumGetting started with appium
Getting started with appium
 
Java EE Microservices
Java EE MicroservicesJava EE Microservices
Java EE Microservices
 
DS, BP, EJB, CDI, WTF!? - Graham Charters
DS, BP, EJB, CDI, WTF!? - Graham ChartersDS, BP, EJB, CDI, WTF!? - Graham Charters
DS, BP, EJB, CDI, WTF!? - Graham Charters
 

Último

Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2
 
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT  - Elevating Productivity in Today's Agile EnvironmentHarnessing ChatGPT  - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT - Elevating Productivity in Today's Agile EnvironmentVictorSzoltysek
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyviewmasabamasaba
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in sowetomasabamasaba
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
+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
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 
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
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...masabamasaba
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 

Último (20)

Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT  - Elevating Productivity in Today's Agile EnvironmentHarnessing ChatGPT  - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
+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...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
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...
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 

Izumi 1.0: Your Next Scala Stack

  • 1. IZUMI 1.0 YOUR NEXT SCALA STACK
  • 2. INTRO WHO WE ARE ▸ Pavel and Kai ▸ Septimal Mind, an Irish consultancy ▸ Engineer’s productivity is our primary concern ▸ Love Scala and pure FP ▸ Scala contributors
  • 3. INTRO WHAT WE DO ▸ We identify productivity issues in SDLC pipeline ▸ We build tools to address these issues
  • 4. INTRO WHAT WE USE ‣ We've been using Scala for many years ‣ Bifuctors are beneficial, we've been using Scalactic ‣ We've adopted ZIO since first public alpha ‣ It closed the everlasting question of error encoding
  • 5. INTRO OPEN QUESTION How do we design complex but extensible FP applications? (Hundreds/thousands of components)
  • 7. INTRO HOW TO GET THERE? ‣ Dependency Injection ‣ Tagless Final
  • 8. IZUMI WE MADE OUR OWN "NANOFRAMEWORK", IZUMI ‣ DIStage: Advanced Dependency Injection ‣ BIO: Tagless Final for Bifunctors and Trifunctors Also: ‣ LogStage: Zero-Effort Structural logging ‣ etc
  • 9. BIO WHAT IS BIO? ‣ A set of typeclasses for Bifunctors and Trifunctors ‣ Like Cats but for F[+_, +_] and F[-_, +_, +_] ‣ Should be incorporated into ZIO Prelude in foreseeable future
  • 10. DISTAGE WHAT IS DISTAGE? ‣ Your regular Dependency Injection library ‣ Supports F[_] ‣ Unique feature: configurable applications ‣ Since 1.0: State-of-the-art compile-time verification ‣ Many features: resources/lifecycles, integration checks, etc ‣ The most advanced DI/Module system available
  • 11. IZUMI 1.0: DISTAGE WHAT IS A CONFIGURABLE APP? ‣ An application may run in several "modes" ‣ E.g. Purpose={Test|Prod}, Database={Dummy|Postgres} ‣ Modes can be chosen at application startup ‣ Modes may be combined ‣ The app should choose right component implementations ‣ And block incorrect combinations
  • 12. IZUMI 1.0: DISTAGE WHAT IS A CONFIGURABLE APP? ‣ Purpose = Production | Test ‣ Database = Postgres | Oracle | Dummy ‣ We may want to run tests with Postgres database (but never with Oracle) ‣ We want to never run tests with production payment service ‣ We may want to define defaults ‣ Database is not set for Prod run => use Postgres
  • 13. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? There was no good way to write configurable apps
  • 14. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? ...hard to code, hard to maintain... ...exponential amount of code paths... ...edgecases...
  • 15. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? ‣ It's hard to do it ‣ ... even if you don't have transitive dependencies ‣ ... even if you don't have dependent constraints ‣ It's even harder to provide compile-time guarantees
  • 16. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? def makeUserRepo(config: Config): IUserRepo[F] = { config.database match { case OracleDb => if (!config.isProd) { throw new RuntimeException("Oracle unsupported in test mode!") } else { new ProdOracleUserRepo[F]( /*...*/ ) } case PgDb => new ProdPGUserRepo[F]( /*...*/ ) case Unset => if (config.isProd) { throw new RuntimeException("Database is not set for prod mode!") } else { new DummyUserRepo[F]() } } }
  • 17. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? DIStage made it possible Though it was doing things in runtime... We thought compile-time solution is impossible...
  • 18. IZUMI 1.0: DISTAGE CONFIGURABLE APP: HOW? DIStage since Izumi 1.0: strong compile-time guarantees for configurable apps
  • 19. IZUMI 1.0: DISTAGE CONFIGURABLE APP WITH DISTAGE class MyAppDefinition[F[+_, +_]: TagKK] extends PluginDef { make[EnterpriseApp[F]] make[AccountsService[F]] make[UsersService[F]] make[IUserRepo[F]].from[DummyUserRepo[F]].tagged(Mode.Test) make[IUserRepo[F]].from[ProdPGUserRepo[F]].tagged(Db.Pg) make[IUserRepo[F]].from[ProdOracleUserRepo[F]].tagged(Mode.Prod, Db.Oracle) make[IAccountsRepo[F]].from[DummyAccRepo[F]].tagged(Mode.Test) make[IAccountsRepo[F]].from[ProdPGAccRepo[F]].tagged(Db.Pg) make[IAccountsRepo[F]].from[ProdOracleAccRepo[F]].tagged(Mode.Prod, Db.Oracle) make[IPaymentsGateway[F]].from[DummyPayments[F]].tagged(Mode.Test) make[IPaymentsGateway[F]].from[StripePayments[F]].tagged(Mode.Prod) }
  • 20. IZUMI 1.0: DISTAGE COMPILE-TIME SAFETY // your main method object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... } // in test scope object WiringTest extends PlanCheck.Main(EnterpriseMain)
  • 21. IZUMI 1.0: DISTAGE COMPILE-TIME SAFETY // your main method object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... } // in test scope object WiringTest extends PlanCheck.Main(EnterpriseMain) HOW DOES IT WORK?
  • 22. IZUMI 1.0: DISTAGE COMPILE-TIME SAFETY // your main method object EnterpriseMain extends RoleAppMain.LauncherBIO[zio.IO] { ... } // in test scope object WiringTest extends PlanCheck.Main(EnterpriseMain) HOW DOES IT WORK? abstract class PluginDef[T](implicit recompilationToken: RecompilationToken[T])
  • 23. IZUMI 1.0: BIO BIO TYPECLASSES
  • 24. IZUMI 1.0: BIO BIO SUMMONER import izumi.functional.bio.F class DummyUserRepo[F[+_, +_]: Monad2] F.pure(...)
 F.fail(...)
 F.fromEither(...) Error2[F].fail(...) See also: https://www.youtube.com/watch?v=ZdGK1uedAE0&t=580s
  • 25. IZUMI 1.0: BIO BIO SYNTAX import izumi.functional.bio.{F, Error2} // IDE auto imports def launchMissiles[F[+_, +_]: Error2](target: Target) = for { _ <- F.unless(storage.hasMissiles)(F.fail(AmmoDepleted)) _ <- loadMissile(launcher, storage) _ <- fireMissile(launcher) .catchAll(_ => emergencyStop) _ <- F.unless(target.isAnnihilated)(launchMissiles(target)) } yield res import cats.syntax.all._ import cats.effect.syntax.all._ import monix.catnap.syntax._
  • 26. IZUMI 1.0: BIO COMPATIBILITY import izumi.functional.bio.catz._ def http4sServer[F[+_, +_]: Async2: Fork2: UnsafeRun2] = { BlazeServerBuilder[F[Throwable, ?]](ec) .bindHttp(8080) .withSslContext(sslContext) .resource } ConcurrentEffect[F[Throwable, ?]] MonadError[F[Throwable, ?], Throwable]
  • 27. IZUMI 1.0: SUMMARY CONCLUSION ‣ BIO provides a great set of TF abstractions ‣ DIStage is great for global/static contexts ‣ and ZIO's reader is perfect for local/dynamic contexts ‣ Izumi 1.0+ZIO is the most productive Scala stack ‣ And battle-tested ‣ There is no excuse not to use DIStage anymore ‣ Consider it for your next Scala project