This document discusses why and how to share code across platforms using Kotlin Multiplatform. It notes that sharing code can increase productivity by reducing duplicated code and bugs, while allowing apps to share features and business logic. However, performance may decrease and innovation could slow if too much code is shared. Kotlin Multiplatform allows writing code once that can run natively on multiple platforms, while each platform still gets optimized binaries and access to native APIs. It provides optional code sharing without limiting developers to a subset of platforms or requiring shared UIs.
Build software like a bag of marbles, not a castle of LEGO®Hannes Lowette
If you have ever played with LEGO®, you will know that adding, removing or changing features of a completed castle isn’t as easy as it seems. You will have to deconstruct large parts to get to where you want to be, to build it all up again afterwards. Unfortunately, our software is often built the same way. Wouldn’t it be better if our software behaved like a bag of marbles? So you can just add, remove or replace them at will?
Most of us have taken different approaches to building software: a big monolith, a collection of services, a bus architecture, etc. But whatever your large scale architecture is, at the granular level (a single service or host), you will probably still end up with tightly couple code. Adding functionality means making changes to every layer, service or component involved. It gets even harder if you want to enable or disable features for certain deployments: you’ll need to wrap code in feature flags, write custom DB migration scripts, etc. There has to be a better way!
So what if you think of functionality as loose feature assemblies? We can construct our code in such a way that adding a feature is as simple as adding the assembly to your deployment, and removing it is done by just deleting the file. We would open the door for so many scenarios!
In this talk, I will explain how to tackle the following parts of your application to achieve this goal: WebAPI, Entity Framework, Onion Architecture, IoC and database migrations. And most of all, when you would want to do this. Because… ‘it depends’.
Isomorphism: the Holy Grail of code reuse. Is Kotlin up to the task? What do we even mean when we say isomorphism? We walk through the current state of the art with Kotlin, showcasing Kotlin's capabilities to run on targets such as iOS, Android, Web, and Server platforms. As well, we'll cover other approaches and platforms that promise similar code reuse. We'll take a detour and look at Kotlin/Native, comparing and contrasting it's approach. Along the way, we'll also explore some application architectures that make the most of shared code modules. In the end, we make an informed decision: is isomorphic Kotlin wired or tired?
How to build a tool for operating Flink on KubernetesAndreaMedeghini
Operating Flink on Kubernetes can be challenging. Which products are available? Do we need to build our own tool? Which tool do we need? How do we build it? This presentation provides some ideas how to build a Flink Operator and it contains a link to a proof of concept available on GitHub
Build software like a bag of marbles, not a castle of LEGO®Hannes Lowette
If you have ever played with LEGO®, you will know that adding, removing or changing features of a completed castle isn’t as easy as it seems. You will have to deconstruct large parts to get to where you want to be, to build it all up again afterwards. Unfortunately, our software is often built the same way. Wouldn’t it be better if our software behaved like a bag of marbles? So you can just add, remove or replace them at will?
Most of us have taken different approaches to building software: a big monolith, a collection of services, a bus architecture, etc. But whatever your large scale architecture is, at the granular level (a single service or host), you will probably still end up with tightly couple code. Adding functionality means making changes to every layer, service or component involved. It gets even harder if you want to enable or disable features for certain deployments: you’ll need to wrap code in feature flags, write custom DB migration scripts, etc. There has to be a better way!
So what if you think of functionality as loose feature assemblies? We can construct our code in such a way that adding a feature is as simple as adding the assembly to your deployment, and removing it is done by just deleting the file. We would open the door for so many scenarios!
In this talk, I will explain how to tackle the following parts of your application to achieve this goal: WebAPI, Entity Framework, Onion Architecture, IoC and database migrations. And most of all, when you would want to do this. Because… ‘it depends’.
Isomorphism: the Holy Grail of code reuse. Is Kotlin up to the task? What do we even mean when we say isomorphism? We walk through the current state of the art with Kotlin, showcasing Kotlin's capabilities to run on targets such as iOS, Android, Web, and Server platforms. As well, we'll cover other approaches and platforms that promise similar code reuse. We'll take a detour and look at Kotlin/Native, comparing and contrasting it's approach. Along the way, we'll also explore some application architectures that make the most of shared code modules. In the end, we make an informed decision: is isomorphic Kotlin wired or tired?
How to build a tool for operating Flink on KubernetesAndreaMedeghini
Operating Flink on Kubernetes can be challenging. Which products are available? Do we need to build our own tool? Which tool do we need? How do we build it? This presentation provides some ideas how to build a Flink Operator and it contains a link to a proof of concept available on GitHub
In this session, I walked through both Az CLI 2.0 and Az PowerShell modules and explained the differences to help the audience choose the right tool for their job.
Jenkins-Koji plugin presentation on Python & Ruby devel group @ BrnoVaclav Tunka
How can you easily set clean-room production environment called Koji via Kojak. How to orchestrate Koji from Jenkins CI - run Jenkins nightly builds as you are used to and let the plugin handle communication and release process in Koji!
The Beam Vision for Portability: "Write once run anywhere"Knoldus Inc.
This session is all about knowing a modern way to define and execute data processing pipelines with Apache Beam, an open-source unified programming model. we will talk about the Apache Beam vision and the benefits of the Beam Portability framework. The Beam Portability framework achieves the vision that a developer can use their favourite programming language with their preferred execution backend.
Building a Language Server for Eclipse MicroProfileYK Chang
Language Server Protocol enables language features to be built for editors in a common and reusable manner. Eclipse MicroProfile seeks to optimize enterprise Java for microservices architecture. The newly created incubator project, Eclipse LSP4MP, attempts to build a language server for MicroProfile APIs to enable developers to easily build cloud-native applications using Eclipse MicroProfile.
In this session, we will provide an introduction to the project, share the latest progress, and discuss what's next. We will share about the journey to build this first language server for Eclipse MicroProfile and lessons accrued along the way. We invite you to join us, share your feedback, and work together to build out Eclipse LSP4MP!
This was a talk delivered at EclipseCon 2020.
Yes, I want to build with Eclipse MicroProfile. Then, do I have to do everything from scratch? Are there tools out there to make my life easier to code MicroProfile-based applications? We will review what's out there, talk about what's coming, and show them in action.
This was a talk delivered as part of J4K.io 2020.
Phoenix web framework is awesome. Backed by the beauty and productive Elixir and performance and realibility of Erlang VM. This presentation is for Singapore Elixir Meetup in March 2016
Guided overview of software frameworks qt frameworkBenjamin Cottrell
I walk through details of the Qt framework, explaining what it is, and how it's beneficial, and what drawbacks there are. With this information, developers can make an informed decision about choosing the Qt Framework.
Better Swift from the Foundation up #tryswiftnyc17 09-06Carl Brown
Highlights of some useful Swift coding patterns and ways to avoid common sources of bugs and performance issues. These lessons learned are based on examination of Swift CoreLibs Foundation and other Open Source Swift libraries and projects, as he has contributed to helping bring Swift to the Server.
Native App Development for iOS, Android, and Windows with Visual StudioXamarin
With a single solution in Visual Studio, build native cross-platform apps for iOS, Android, and Windows all in C#.
James Montemagno, Developer Evangelist at Xamarin, as he shows you how Xamarin and Visual Studio 2013 give you the best environment for developing native cross-platform apps.
Slides from Houston Xamarin C# Developers Group in Houston Texas on December 16th 2013:
PCL Deep Dive: With a single solution in Visual Studio, build native cross-platform apps for iOS, Android, and Windows all in C#. Dive into platform specific code with Service Locators (IoC) an PCL support
In this session, I walked through both Az CLI 2.0 and Az PowerShell modules and explained the differences to help the audience choose the right tool for their job.
Jenkins-Koji plugin presentation on Python & Ruby devel group @ BrnoVaclav Tunka
How can you easily set clean-room production environment called Koji via Kojak. How to orchestrate Koji from Jenkins CI - run Jenkins nightly builds as you are used to and let the plugin handle communication and release process in Koji!
The Beam Vision for Portability: "Write once run anywhere"Knoldus Inc.
This session is all about knowing a modern way to define and execute data processing pipelines with Apache Beam, an open-source unified programming model. we will talk about the Apache Beam vision and the benefits of the Beam Portability framework. The Beam Portability framework achieves the vision that a developer can use their favourite programming language with their preferred execution backend.
Building a Language Server for Eclipse MicroProfileYK Chang
Language Server Protocol enables language features to be built for editors in a common and reusable manner. Eclipse MicroProfile seeks to optimize enterprise Java for microservices architecture. The newly created incubator project, Eclipse LSP4MP, attempts to build a language server for MicroProfile APIs to enable developers to easily build cloud-native applications using Eclipse MicroProfile.
In this session, we will provide an introduction to the project, share the latest progress, and discuss what's next. We will share about the journey to build this first language server for Eclipse MicroProfile and lessons accrued along the way. We invite you to join us, share your feedback, and work together to build out Eclipse LSP4MP!
This was a talk delivered at EclipseCon 2020.
Yes, I want to build with Eclipse MicroProfile. Then, do I have to do everything from scratch? Are there tools out there to make my life easier to code MicroProfile-based applications? We will review what's out there, talk about what's coming, and show them in action.
This was a talk delivered as part of J4K.io 2020.
Phoenix web framework is awesome. Backed by the beauty and productive Elixir and performance and realibility of Erlang VM. This presentation is for Singapore Elixir Meetup in March 2016
Guided overview of software frameworks qt frameworkBenjamin Cottrell
I walk through details of the Qt framework, explaining what it is, and how it's beneficial, and what drawbacks there are. With this information, developers can make an informed decision about choosing the Qt Framework.
Better Swift from the Foundation up #tryswiftnyc17 09-06Carl Brown
Highlights of some useful Swift coding patterns and ways to avoid common sources of bugs and performance issues. These lessons learned are based on examination of Swift CoreLibs Foundation and other Open Source Swift libraries and projects, as he has contributed to helping bring Swift to the Server.
Native App Development for iOS, Android, and Windows with Visual StudioXamarin
With a single solution in Visual Studio, build native cross-platform apps for iOS, Android, and Windows all in C#.
James Montemagno, Developer Evangelist at Xamarin, as he shows you how Xamarin and Visual Studio 2013 give you the best environment for developing native cross-platform apps.
Slides from Houston Xamarin C# Developers Group in Houston Texas on December 16th 2013:
PCL Deep Dive: With a single solution in Visual Studio, build native cross-platform apps for iOS, Android, and Windows all in C#. Dive into platform specific code with Service Locators (IoC) an PCL support
Cross Platform Development in C# (DDDNorth 2013)ross.dargan
Shows how to separate code to allow for maximum code reuse across iOS, Android, Windows Phone, Windows Store, WPF, and silverlight applications.
Code can be found here: https://github.com/rossdargan/Talks
C# everywhere: Xamarin and cross platform developmentGill Cleeren
C# is hotter than ever. Using Xamarin, we can use C# to not only build our apps on Windows Phone but also on iOS and Android. The magic that sits between are PCLs (Portable Class Libraries) that we can re-use on all these platforms. The goal is of course achieving the highest level of code sharing and re-using.
In this talk, we'll see how we can share code between Windows Phone, iOS and Android to build a cross-platform app using Xamarin. You'll also see how much of the marketing fluff is real: do we really get a lower time-to-market when sharing code and is this approach really cheaper than building 3 apps separately? Come to this talk and learn all about it
Future of Kotlin - How agile can language development be?Andrey Breslav
A successful project usually grows, and Kotlin is no exception. We are adding new targets (JavaScript and Native) and new computation models (coroutines). This talk is about our vision of the future of Kotlin as a language and a ecosystem.
We'll talk strategy: what we think our industry needs at large and how we are going to fit Kotlin into this picture. We'll talk tactics: how we deal with legacy and compatibility issues, and whether there will ever be Kotlin 2.0. We'll talk operations: can we do “continuous delivery” for language features? Or, more generally, how agile can language development be?
https://mixitconf.org/en/2017/the-future-of-kotlin-how-agile-can-language-development-be-
stackconf 2020 | Replace your Docker based Containers with Cri-o Kata Contain...NETWAYS
They provide the workload isolation and security advantages of VMs. but at the same time maintain the speed of deployment and usability of containers.by using kata containers, instead of namespace, small virtual machines are created on the kernel and be strongly isolated. The technology of Kata Containers is based on KVM hypervisor. That’s why the level of isolation is equivalent to typical hypervisors. This session will focus on a live production phase when choosing kata instead of docker, and why they are preferable
Although containers provides software-level isolation of resources, the kernel needs to be shared. That’s why the isolation level in terms of security is not so high when compared with hypervisors.This learns to shift from Docker as the de facto standard to Kata containers and learn how to obtain higherl level of security
Android development changed significantly in 2017 (Kotlin, Architecture Components and much more). Some of the most tricky and debatable questions now are: how to start a scalable project from scratch? How to decide which technology/library to use?
The HERE WeGo App team has worked for years to define a sophisticated release and development process, with a high level of automation that allowed to quickly followup on user issues and actively develop features. But legacy code and a large framework made it difficult to move even faster.
Lessons learned? We will discuss how to start over with all the learnings on a greenfield project.
Technologies that will be covered: Kotlin, Jenkins, JobDsl, Architecture Components, GraphQL, gRPC and more.
Italian Alt.Net Conference MonoTouch SessionChris Hardy
Thanks to Geoff Norton and Miguel De Icaza for the basis of most of the slides. My MonoTouch session from the 5th UGIAlt.Net Conference in Milan on 23rd January 2010.
Titanium: Native Mobile Apps with Javascript Leonardo Farias
In this talk, Leonardo Farias will give an introduction to Appcelerator’s Titanium. Titanium allows you to create native, hybrid, or mobile web apps across all platforms from a single JavaScript code base. The content of this talk will focus on what is Titanium, and how to start using it.
Radu vunvulea building and testing windows 8 metro style applications using ...Radu Vunvulea
In this session you will discover how you can develop applications that use components written in different programming language (C++, C# and JavaScript). A brief introduction in WinRT Components and testing tools will also be presented.
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
Securing your Kubernetes cluster_ a step-by-step guide to success !KatiaHIMEUR1
Today, after several years of existence, an extremely active community and an ultra-dynamic ecosystem, Kubernetes has established itself as the de facto standard in container orchestration. Thanks to a wide range of managed services, it has never been so easy to set up a ready-to-use Kubernetes cluster.
However, this ease of use means that the subject of security in Kubernetes is often left for later, or even neglected. This exposes companies to significant risks.
In this talk, I'll show you step-by-step how to secure your Kubernetes cluster for greater peace of mind and reliability.
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf91mobiles
91mobiles recently conducted a Smart TV Buyer Insights Survey in which we asked over 3,000 respondents about the TV they own, aspects they look at on a new TV, and their TV buying preferences.
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...James Anderson
Effective Application Security in Software Delivery lifecycle using Deployment Firewall and DBOM
The modern software delivery process (or the CI/CD process) includes many tools, distributed teams, open-source code, and cloud platforms. Constant focus on speed to release software to market, along with the traditional slow and manual security checks has caused gaps in continuous security as an important piece in the software supply chain. Today organizations feel more susceptible to external and internal cyber threats due to the vast attack surface in their applications supply chain and the lack of end-to-end governance and risk management.
The software team must secure its software delivery process to avoid vulnerability and security breaches. This needs to be achieved with existing tool chains and without extensive rework of the delivery processes. This talk will present strategies and techniques for providing visibility into the true risk of the existing vulnerabilities, preventing the introduction of security issues in the software, resolving vulnerabilities in production environments quickly, and capturing the deployment bill of materials (DBOM).
Speakers:
Bob Boule
Robert Boule is a technology enthusiast with PASSION for technology and making things work along with a knack for helping others understand how things work. He comes with around 20 years of solution engineering experience in application security, software continuous delivery, and SaaS platforms. He is known for his dynamic presentations in CI/CD and application security integrated in software delivery lifecycle.
Gopinath Rebala
Gopinath Rebala is the CTO of OpsMx, where he has overall responsibility for the machine learning and data processing architectures for Secure Software Delivery. Gopi also has a strong connection with our customers, leading design and architecture for strategic implementations. Gopi is a frequent speaker and well-known leader in continuous delivery and integrating security into software delivery.
Generating a custom Ruby SDK for your web service or Rails API using Smithyg2nightmarescribd
Have you ever wanted a Ruby client API to communicate with your web service? Smithy is a protocol-agnostic language for defining services and SDKs. Smithy Ruby is an implementation of Smithy that generates a Ruby SDK using a Smithy model. In this talk, we will explore Smithy and Smithy Ruby to learn how to generate custom feature-rich SDKs that can communicate with any web service, such as a Rails JSON API.
Connector Corner: Automate dynamic content and events by pushing a buttonDianaGray10
Here is something new! In our next Connector Corner webinar, we will demonstrate how you can use a single workflow to:
Create a campaign using Mailchimp with merge tags/fields
Send an interactive Slack channel message (using buttons)
Have the message received by managers and peers along with a test email for review
But there’s more:
In a second workflow supporting the same use case, you’ll see:
Your campaign sent to target colleagues for approval
If the “Approve” button is clicked, a Jira/Zendesk ticket is created for the marketing design team
But—if the “Reject” button is pushed, colleagues will be alerted via Slack message
Join us to learn more about this new, human-in-the-loop capability, brought to you by Integration Service connectors.
And...
Speakers:
Akshay Agnihotri, Product Manager
Charlie Greenberg, Host
7. Why share code?
• DRY
• same code/logic for different platforms
• productivity, features, less bugs, more platforms
8. Why share code?
• crossplatform in the past
• networking library in C
• Windows Mobile
• Windows
• Android
• Linux
9. Why share code?
• sharing entire components
• JVM servers can share business logic with Android apps
• All client apps share similar logic and features
12. Why NOT share code?
• Performance
• Slower innovation
• shared UI
• All or nothing
• Vendor lock-in
• Future
• Bugs/lack of features
13. Why use Kotlin Multiplatform?
• modern, industrial language
• similar to swift, easy for java devs to learn
• great tooling, ecosystem and community
• open-source
• write once, run native everywhere
14. Why use Kotlin Multiplatform?
• doesn’t limit you to subset of all platforms
• native access to entire platform API from Kotlin
• each platform get native, optimized binary
• fix bug once, for all platforms
• interoperability
• optional sharing
16. Why not other solutions?
• Flutter, React Native, Xamarin
• not same usecase
• sharing UI - risky
• new language, new tools, new libs
• accessing platform APIs is hard, bridges
• frameworks
17.
18. Why not other solutions?
“Anything that requires you to make large decisions and
potentially large rewrites, perform large retrainings and
rehirings, or anything that has to share UI or doesn’t work well
with a native platform is, well, very risky.” - Kevin Galligan,
Touchlab
35. Kotlin/Native
• iOS, Linux, Windows, MacOS, WebAssembly...
• build full apps or libs
• access to native platform APIs
• interoperable with C/ObjC(/Swift)
• Kotlin can call C/ObjC/Swift and vice-versa
• Kotlin can extend ObjC/Swift classes and vice-versa
36. Concurrency is hard
• languages/runtimes allow unsafe concurrency
• tools - locks & volatile
• no warnings
• deadlocks
• entire burden on devs
• no guaranties of safety
• bugs leak into production
37. Saner concurrency
• new, stricter memory model
• ARC with cycle collector
• 2 simple rules
• Immutable state can be shared among threads
• Mutable data belongs to one thread
• compiler and runtime check the rules
• thread-safe code
38. Saner concurrency
+GC per thread, no suspends
+shared reference counter with swift
-no global mutable state
-new concepts, patterns, practices
-coroutines
39. Saner concurrency
• Any.freeze()
• passing mutable data by detaching
• No manual concurrency management
• Workers
• Atomics - AtomicRef/Int/Long/...
• “Stranger threads” (link in resources)
40. Saner concurrency
• work in progress
• multithreaded coroutines
• similar rules for JVM
• relaxed memory model
41.
42. Status
• beta but relatively stable
• low-risk
• production
• large projects - wait for release
• smaller projects - maybe
• part of a project - yesterday
What is Kotlin mutliplatform?
One of the goals for Kotlin is being able to compile to and run on all platforms.
3 compiler backends - Kotlin/JVM, Kotlin/JS, Kotlin/Native -
This, together with tools that facilitate efficient code sharing and projects targeting multiple platforms - KMP
We'll talk more about multiplatform, but first - WHY
DRY principle, avoid code duplication
no need to write same code/logic for different platforms
better productivity, more features, less bugs, reach more platforms
Crossplatform in native world
IKEv2 lib - windows & windows mobile, android, Linux
With rise of VMs and new languages, no common code could serve all platforms
Given proper architecture, sharing entire components can be relatively easy
JVM servers can share business logic with Android apps
All client apps share similar logic and features
Spotify client apps -
while frontend/UI differs from platform to platform
features and logic behind are mostly identical
it's easy to see how sharing code across platforms can be really benefitial for various usecases
Mobile platforms share a lot in common
Android & IOS apps tend to look similar, share identical features, same usacases,
platforms have same capabilities and similar limitation
app arhitectures are very similar
if youre using some layered arhitecture like Clean arhitecure, your app might look like this
Domain layer (business logic) is usually great candidate for sharing as it doesn't depend on frameworks and platform
Data layer - works with identical data across platforms
performance tend to suffer,VM, interpreters, script languages
inovation slows down as advancements on one platform cant be used in shared solutions
UI is limited to shared features, not as good as native
enitire app must be written in given framework
changing framework requires entire app rewrite
will that framework even exist in 5-10 years?
if we run into an issue or framework lacks needed feature, project goes back to starting point
modern, industrial language
similar to swift, easy for java devs to learn
top tooling, great ecosystem and community
write once, run native everywhere
doesn’t limit you to subset of all platforms
native access to entire platform API from Kotlin
each platform get native, optimized binary
fix bug once, for all platforms
interoperability
pick what you want to share,
no need to decide on porting entire app
pick easily shareable compoment, give it a try
even if you don't want to continue using it, you have perfectly fine Android code
low risk
easy to adopt - easy to convince management - they care about risk
sharing UI - risky - doesn't feel like native
Flutter/ReactNative
App using Flutter is Flutter app, app using RN is RN app, app using KMP is just an app - you can add KMP library/module without affecting app structure/framework. You can add two, three. You can add KMP lib to Flutter or RN app.
- new language, new tools, new libs
- issues are localized in KMP
- framework vs library
optional sharing - pick your adventure
who's using or supporting KMP
coroutines - great asynchronous programing
ktor - Ktor is a framework for building asynchronous servers and clients
you can build web servers with it and it also offers multiplatform network client you can use in your applications
with ktor, you can write all your networking code once in common code and use that on all platforms
serialization - offers reflection-less serialization of kotlin classes to JSON and binary formats
uses a compiler plugin to generate code needed for serialization
supports all platform - common code
SQLDelight - DB library. SQLDelight generates typesafe APIs from your SQL statements. It compile-time verifies your schema, statements, and migrations and provides IDE features like autocomplete and refactoring which make writing and maintaining SQL simple.
Multiplatform library, write all your DB code once in common code and use on all platforms
okio - modern I/O library, okhttp
okhttp - esential HTTP library for andoird devs, some people may know it as retrofit, which builds upon it. Rewriten in Kotlin, we might get multiplatform release in the future
Touchlab - active in K/N developement, stately - concurrency in K/N,
IDEA community edition - free
Ultimate edition
new project templates
KMP templates - clone/fork from github
write build script yourself
target - target is a part of the build that is responsible for building, testing, and packaging a complete piece of software for one of the platforms
current state of dependencies
what if we wanted to add a server to the picture?
we can improve -
Android & iOS are both clients are we'll probably need some client-specific code that we wont need on server - clients sourceSet
Android & server both run on JVM - maybe we can put some common dependencies and utilities in jvm sourceSet
we added jvm target, with “server”sourceSet
-> concurrency
Traditionally languages allow (and promote) inherently unsafe concurrency
Straighforward code is thread-unsafe by default
Languages/runtime offer tools for handling concurrency
However these tools haven't changed much since time of C - volatile & locks (synchronized)
Languages do nothing to prevent or warn about issues, they are hard to detect
Developers must find potential issues and implement safety themselves using given tools
Overuse of misuse of concurrency tools lead to deadlocks
Entire burden on devs
There is no practically no guaranties of thread-safe code, testing just can’t reproduce some concurrency bugs and debugging doesn't help much
Often these bugs leak into production
In order to address this issue, Kotlin creators indroduced Saner concurrency
Automatic Reference Counting
freeze converts mutable state into immutable state,
also all it's references, recursively
Data can be manually detached from thread and passed to another one (memory leak)
there's no synchronized/volatile, there's no need for them
workers are threads that can execute tasks, execution returns future with task result
atomic - way to bypass restrictions of memory model - they can be shared across threads although they hold mutable data