diff --git a/data/case-studies/_case-study.example.yaml b/data/case-studies/_case-study.example.yaml new file mode 100644 index 00000000000..f2f285c7442 --- /dev/null +++ b/data/case-studies/_case-study.example.yaml @@ -0,0 +1,73 @@ +# CaseItem (data contract for a single case study entry) +# +# Required fields: +# - id: string — unique identifier of the case +# - description: string — markdown-enabled text (supports **bold** and [links](https://example.com)) +# - type: string — one of: multiplatform | server-side +# +# Optional fields: +# - logo: list (0–2) of image paths (strings) +# Use up to two logos. Paths can be absolute (starting with "/") or full URLs. +# +# - signature: object — author or source of the quote +# line1: string — supports markdown (e.g., **Name Surname**, Role) +# line2: string — plain text +# +# - destination: string — either internal or external +# internal: the card points to an internal MDX page (see pageContentPath) +# external: the card points to an external resource (see externalUrl) +# +# - externalLink: string — external link for the card (used when destination: external) +# +# - externalLinkText: string — text for the external link (used when destination: external) +# +# - platforms: list of strings — platform tags shown on the card +# Examples: android, ios, desktop, frontend, backend, compose-multiplatform +# +# - media: object — media block for the card +# type: youtube | image +# When type: youtube +# url: string — YouTube link +# When type: image +# path: string — image path relative to /public/ directory +# +# - featuredOnMainPage: boolean — mark this case to be highlighted on the main page +# +# - slug: string — optional URL segment for the internal case page; if omitted, id is used +# Use a single URL segment (no slashes, no section prefix). +# +# - pageContentPath: string — path to the detailed case content in MDX (used when destination: internal) + +items: + - id: CompanyName # required: unique identifier + type: server-side # required: multiplatform | server-side + description: > # required: markdown-supported text + **Case description** supporting [links](https://example.com) and emphasis. + logo: # optional: list of 0–2 image paths (strings) + - /images/case-studies/google.svg + - /images/case-studies/google.svg + signature: # optional + line1: "**Name Surname**" + line2: "Position at Company or note" + destination: external # optional: internal | external + externalLink: https://example.com/full-story # optional + externalLinkText: Read the full story # optional + platforms: # optional + - android + - ios + - desktop + - frontend + - backend + - compose-multiplatform + media: # optional + type: youtube # required: youtube | image + url: https://youtu.be/o14wGByBRAQ?si=TmqJBtfZw2F8-IEw&t=7 + # when type: image + # type: image + # path: ./images/case-studies/google.svg + featuredOnMainPage: false # optional: mark case as selected for the main page + slug: example-slug # optional: if not set, id will be used + # Specify one of the two fields (not both): + pageContentPath: ./data/case-studies/_case-study.example/index.mdx # path to MDX file with page content + # OR + internalLink: https://kotlinlang.org/lp/server-side/case-studies/example-slug/ # direct link to existing page diff --git a/data/case-studies/_case-study.example/index.mdx b/data/case-studies/_case-study.example/index.mdx new file mode 100644 index 00000000000..f471fe5db82 --- /dev/null +++ b/data/case-studies/_case-study.example/index.mdx @@ -0,0 +1,25 @@ +--- +id: unique-id-derived-from-company +company: CompanyName +industry: Some service +size: 3000+ +country: USA, San Francisco +--- + +# CompanyName: Kotlin for backend at scale + +Description + +## Context + +- Items +- Reasons +- Results + +> Cites, emphasis, links + +![Image](/images/case-studies/google_logo.svg) + +## Outcomes + +CTA, links, etc. \ No newline at end of file diff --git a/data/case-studies/case-studies.yml b/data/case-studies/case-studies.yml new file mode 100644 index 00000000000..960344ad820 --- /dev/null +++ b/data/case-studies/case-studies.yml @@ -0,0 +1,531 @@ +items: + #------------------------------------------------------------------------ + - id: bilibili + type: multiplatform + description: >- + BiliBili (China version) has adopted Kotlin Multiplatform and Compose Multiplatform for the Instant + Message feature. + platforms: + - android + - ios + - compose-multiplatform + media: + type: image + path: /images/case-studies/bilibili-card-preview.jpg + #------------------------------------------------------------------------ + - id: google-workspace + type: multiplatform + description: >- + Jason Parachoniak Multiplatform Lead in Google Workspace “We consider Kotlin Multiplatform validated in + our Google Docs experiment. And what I mean by this is we consider the experiment a success, and we're + going to go ahead and move Kotlin Multiplatform to the entire Google Workspace ecosystem. So we're going + to proceed with this transition. We're actually very happy with it.” + logo: + - /images/case-studies/google-logo.svg + platforms: + - android + - ios + #------------------------------------------------------------------------ + - id: mcdonalds-umain + type: multiplatform + description: >- + Varsha Singh Project Manager, McDonald’s app at Umain “After a successful initial test with the + payments feature, we expanded Kotlin Multiplatform to our entire McDonald's application. With KMP, we + saw fewer crashes and better performance across both platforms after the launch. We transitioned from a + separate Android and iOS team to a more unified mobile team.” + platforms: + - android + - ios + destination: external + externalLink: https://www.youtube.com/watch?v=uCkYZ-PvCmw + externalLinkText: Watch the full video + media: + type: youtube + url: https://www.youtube.com/watch?v=uCkYZ-PvCmw + #------------------------------------------------------------------------ + - id: x + type: multiplatform + description: >- + Eric Denman Software Engineer at X “Starting from this small of a team, it was a huge speed win for us + to be able to use Kotlin Multiplatform and write all of that logic once in one place… When you write a + bug—not that I ever do that—you only have to fix it in one place.” + platforms: + - android + - ios + #------------------------------------------------------------------------ + - id: duolingo + type: multiplatform + description: >- + John Rodriguez The client platform team “One exciting trend for us is that the more that we use Kotlin + Multiplatform internally, the more we find ourselves speeding up in terms of shipping. It turns out after + you learn something, you get really good at it. … Now there's a lot more confidence behind it and we're + building up that knowledge.” + platforms: + - android + - ios + #------------------------------------------------------------------------ + - id: meetup + type: multiplatform + description: >- + Meetup achieved the simultaneous release of new features by utilizing KMP to share application logic. + Now, iOS engineers contribute to the shared Kotlin code just as actively as Android engineers, enhancing + team productivity and strengthening collaboration between teams. + platforms: + - android + - ios + destination: external + externalLink: https://www.youtube.com/watch?v=GtJBS7B3eyM + media: + type: youtube + url: https://www.youtube.com/watch?v=GtJBS7B3eyM + #------------------------------------------------------------------------ + - id: bolt + type: multiplatform + description: >- + Toomas Römer VP of Engineering at Bolt “At Bolt, we develop and support multiple mobile apps that + empower millions of users on a daily basis. We started small by revamping the chat reconnect feature. + Seeing the success, we then moved the entire chat engine to Kotlin Multiplatform. We can build features + across platforms without team expansion or performance hits.” + platforms: + - android + - ios + destination: external + externalLink: https://www.youtube.com/watch?v=Qu3jZX8RyFk + media: + type: youtube + url: https://www.youtube.com/watch?v=Qu3jZX8RyFk + #------------------------------------------------------------------------ + - id: philips + type: multiplatform + description: >- + Jeroen Brosens Software Architect at Philips “We consolidated all our business logic into shared code, + which means we can now develop once and deploy more. Before KMP adoption, we had an often heard saying, it + works differently on iOS, but it has been a while since we heard that one.” + platforms: + - android + - ios + destination: external + externalLink: https://www.youtube.com/watch?v=Qu3jZX8RyFk + media: + type: youtube + url: https://www.youtube.com/watch?v=Qu3jZX8RyFk + #------------------------------------------------------------------------ + - id: posten-bring + type: multiplatform + description: >- + Posten Bring, a 377-year-old norwegian national postal service, unified complex business logic across + dozens of frontend and backend applications using KMP. By establishing a single source of truth, they + reduced coordination time and minimized errors. + platforms: + - backend + - frontend + destination: external + externalLink: https://2024.javazone.no/program/a1d9aeac-ffc3-4b1d-ba08-a0568f415a02 + #------------------------------------------------------------------------ + - id: careem + type: multiplatform + description: >- + Careem, a vehicle-for-hire company, adopted KMP while migrating their Android app to Kotlin. This move + allowed them to reuse their business logic between mobile platforms and saved a significant amount of time + in delivering their iOS app. + platforms: + - android + - ios + destination: external + externalLink: https://www.youtube.com/watch?v=DcO9psUh4LI + media: + type: youtube + url: https://www.youtube.com/watch?v=DcO9psUh4LI + #------------------------------------------------------------------------ + - id: wrike + type: multiplatform + description: >- + Alex Askerov Mobile Tech Lead at Wrike Wrike adopted Compose Multiplatform early, with CMP-powered + features in production since its beta state. Today, our production apps feature Calendars, Boards, + Dashboards, Charts, Timesheet Approvals and more – all done with CMP. It’s helping us deliver consistent, + high-quality experiences across platforms while streamlining our development process. With the iOS version + now reaching stability, we’re excited to see this technology mature and look forward to expanding its + implementation. + platforms: + - android + - ios + - compose-multiplatform + destination: external + externalLink: https://www.youtube.com/watch?v=jhBmom8z3Qg + #------------------------------------------------------------------------ + - id: feres + type: multiplatform + description: >- + Feres, a taxi app with 1M+ downloads, shares 100% of its business logic using KMP, and more than 90% of + UI is shared with Compose Multiplatform. + platforms: + - android + - ios + - compose-multiplatform + #------------------------------------------------------------------------ + - id: bitkey-by-block + type: multiplatform + description: >- + Bitkey by Block shares 95% of its mobile codebase with Kotlin Multiplatform, ensuring consistency in its + open-source Bitcoin wallet. By migrating to Compose Multiplatform, the team unified UI development and + improved feature parity across Android and iOS. + platforms: + - android + - ios + - compose-multiplatform + destination: external + externalLink: https://engineering.block.xyz/blog/how-bitkey-uses-cross-platform-development + #------------------------------------------------------------------------ + - id: wallhub + type: multiplatform + description: >- + WallHub, a wallpaper app, utilizes KMP to share business logic, response models, routes, and analytics + across platforms, creating a unified source of truth and minimizing development friction. The app features + a 100% Compose Multiplatform UI, delivering a consistent design and user experience across all supported + platforms. + platforms: + - android + - ios + - compose-multiplatform + #------------------------------------------------------------------------ + - id: music-work + type: multiplatform + description: >- + Music Work uses Compose Multiplatform for 100% of its UI across all supported platforms. Its architecture + also shares business logic, data models, and analytics via KMP. This approach has reduced development and + maintenance costs by 30%, while significantly accelerating our deployment cycles. + platforms: + - android + - ios + - frontend + - desktop + - compose-multiplatform + #------------------------------------------------------------------------ + - id: physics-wallah + type: multiplatform + description: >- + Suresh Maidaragi Mobile Platform Lead Engineer at Physics Wallah Around 20% of our Physics Wallah App, + which has more than 10M downloads on Google Play – including one of our largest features, Pitara – is + built using Kotlin Multiplatform and Compose Multiplatform, sharing both UI and business logic across + Android and iOS platforms. The rest of the app uses a combination of Jetpack Compose and XML. This shift + has streamlined our development process and allowed us to unify Android and iOS engineers into a single + Mobile team. We’ve also built our new Acadfly and Parent apps from the ground up using Compose + Multiplatform. It is now our core mobile technology for building all new features and products from + scratch. + platforms: + - android + - ios + - compose-multiplatform + #------------------------------------------------------------------------ + - id: fast-and-fit + type: multiplatform + description: >- + By sharing over 90% of the Fast&Fit codebase, including the entire UI, through KMP and Compose + Multiplatform, the team ships synchronized features across platforms, trims maintenance overhead, and + focuses on adding innovative wellness tools + platforms: + - android + - ios + - compose-multiplatform + #------------------------------------------------------------------------ + - id: balary + type: multiplatform + description: >- + Balary is built using KMP and Compose Multiplatform, sharing most of the UI across Android and iOS. For + platform-specific needs like MapLibre maps and video playback, we use expect/actual declarations to + integrate native Android XML views and iOS UIKit views. + platforms: + - android + - ios + - compose-multiplatform + #------------------------------------------------------------------------ + - id: markaz + type: multiplatform + description: >- + Kashif Mehmood Mobile Engineering Lead at Markaz Markaz is Pakistan’s second-largest e-commerce platform, + with over 5 million downloads and 1,000,000+ active users. It has consistently ranked in the top 10 on + Google Play and top 15 on the Apple App Store. The app includes 100+ screens and is fully built with + Compose Multiplatform, combining a shared UI with native integrations like camera, QR scanning, payments, + native navigation, and analytics. The app is fully optimized to run on low-end devices and slow networks, + making it accessible to people living in remote areas with olders devices. The app size remains under 10MB + on Android and 137MB on iOS. + platforms: + - android + - ios + - compose-multiplatform + #------------------------------------------------------------------------ + - id: forbes + type: multiplatform + description: >- + By sharing over 80% of logic across iOS and Android, Forbes now rolls out new features simultaneously on + both platforms, keeping the flexibility to customize features based on the specific platform. This allows + the team to innovate and respond to market needs faster. + platforms: + - android + - ios + destination: external + externalLink: https://www.forbes.com/sites/forbes-engineering/2023/11/13/forbes-mobile-app-shifts-to-kotlin-multiplatform/ + #------------------------------------------------------------------------ + - id: netflix + type: multiplatform + description: >- + Netflix uses KMP to share logic for their mobile studio apps, reducing duplication and enabling faster, + more reliable development. This approach helps deliver high-quality features efficiently in the fast-paced + world of TV and movie production. + platforms: + - android + - ios + destination: external + externalLink: https://netflixtechblog.com/netflix-android-and-ios-studio-apps-kotlin-multiplatform-d6d4d8d25d23 + #------------------------------------------------------------------------ + - id: 9gag + type: multiplatform + description: >- + 9GAG opted for KMP after trying both Flutter and React Native. They gradually adopted the technology and + now ship features faster, while providing a consistent experience to their users. + platforms: + - android + - ios + destination: external + externalLink: https://raymondctc.medium.com/adopting-kotlin-multiplatform-mobile-kmm-on-9gag-app-dfe526d9ce04 + #------------------------------------------------------------------------ + - id: baidu + type: multiplatform + description: >- + Baidu uses KMP in their Wonder App to unify the data layer and business logic across iOS and Android, + enabling a single Kotlin codebase for both platforms. This ensures consistent user experiences, reduces + maintenance costs, and significantly improves productivity. + platforms: + - android + - ios + - compose-multiplatform + destination: external + externalLink: https://kotlinlang.org/lp/multiplatform/case-studies/baidu/ + #------------------------------------------------------------------------ + - id: instabee + type: multiplatform + description: >- + Johannes Svensson Android Developer at Instabee Compose Multiplatform really simplified adding support for + iOS. The level of shared code, without adding complexity, is staggering. It really streamlines app + development and enables us to innovate and iterate at an insane speed. + platforms: + - android + - ios + - compose-multiplatform + destination: external + externalLink: https://www.youtube.com/watch?v=HNFi7dw_mp8 + media: + type: youtube + url: https://www.youtube.com/watch?v=HNFi7dw_mp8 + #------------------------------------------------------------------------ + - id: autodesk + type: multiplatform + description: >- + Autodesk uses KMP to unify offline synchronization logic and data models across iOS, Android, and + Windows. This shared codebase simplifies development, enabling feature reuse across platforms and + improving collaboration. + platforms: + - android + - ios + - desktop + destination: external + externalLink: https://kotlinlang.org/lp/multiplatform/case-studies/autodesk + #------------------------------------------------------------------------ + - id: cash-app + type: multiplatform + description: >- + Cash App gradually transitioned from shared JavaScript to KMP in 2018. This move streamlined + collaboration between Android and iOS engineering teams and successfully addressed code-sharing issues + previously encountered with JavaScript. + platforms: + - android + - ios + destination: external + externalLink: https://kotlinlang.org/lp/multiplatform/case-studies/cash-app + #------------------------------------------------------------------------ + - id: quizlet + type: multiplatform + description: >- + KMP drives global learning platform Quizlet's web and mobile apps, which boast a combined 100 million + active installs. By transitioning their shared code from JavaScript to Kotlin, they significantly improved + the performance of both their Android and iOS applications + platforms: + - android + - ios + - frontend + destination: external + externalLink: https://quizlet.com/blog/shared-code-kotlin-multiplatform + #------------------------------------------------------------------------ + - id: kuaishou + type: multiplatform + description: >- + Kuaishou, China's pioneering short video platform, has been using KMP for two years, significantly cutting + costs in developing new features for both Android and iOS apps, as well as maintaining existing features. + platforms: + - android + - ios + destination: external + externalLink: https://medium.com/@xiang.j9501/case-studies-kuaiying-kotlin-multiplatform-mobile-268e325f8610 + #------------------------------------------------------------------------ + - id: worldline + type: multiplatform + description: >- + Worldline embraced KMP to revamp their Eroski app. Transitioning from Java and Objective-C, the team + smoothly migrated all app's screens. Their efforts led to a high-quality app with over 99% crash-free + users among 800,000 active users. + platforms: + - android + - ios + destination: external + externalLink: https://blog.worldline.tech/2022/01/26/kotlin_multiplatform.html + #------------------------------------------------------------------------ + - id: down-dog + type: multiplatform + description: >- + Down Dog uses a "maximum shared Kotlin" strategy for their application, which brings a studio-like yoga + experience to mobile devices. They share various helpers between clients and servers, and most of the + client code with KMP. Their team managed to significantly increase the app's development speed by keeping + native-only views. + platforms: + - android + - ios + - frontend + - backend + destination: external + externalLink: https://kotlinlang.org/lp/multiplatform/case-studies/down-dog + #------------------------------------------------------------------------ + - id: touchlab + type: multiplatform + description: >- + Touchlab works with organizations adopting and scaling KMP. From startups to multinationals with tens of + millions of MAU, Touchlab’s services accelerate and de-risk implementing KMP in production. They are also + trusted open-source contributors, building crucial tools used widely in production apps. + platforms: + - android + - ios + - frontend + - desktop + destination: external + externalLink: https://touchlab.co/ + #------------------------------------------------------------------------ + - id: unflow + type: multiplatform + description: >- + Unflow allows development teams to create screens, flows, and features without a single line of code. + Using KMP to build their mobile SDK saved the team two months of development time and allowed them to + deliver an exceptionally high-quality product without compromising on performance or native capabilities + platforms: + - android + - ios + destination: external + externalLink: https://www.unflow.com/post/kotlin-multiplatform-mobile + #------------------------------------------------------------------------ + - id: vmware + type: multiplatform + description: >- + VMware uses KMP in various modules to enable different use cases in a consistent, cross-platform way right + across their Workspace ONE productivity app portfolio. + platforms: + - android + - ios + destination: external + externalLink: https://medium.com/vmware-end-user-computing/adopting-a-cross-platform-strategy-for-mobile-apps-59495ffa23b0 + #------------------------------------------------------------------------ + - id: mirego + type: multiplatform + description: >- + Mirego uses KMP to run the same business logic on the web, iOS (iPhone and iPad), tvOS, Android (device + and TV), and Amazon Fire TV. Mirego works with clients to design and develop new digital products. + platforms: + - android + - ios + - frontend + destination: external + externalLink: https://kotlinlang.org/lp/multiplatform/case-studies/mirego + #------------------------------------------------------------------------ + - id: fastwork + type: multiplatform + description: >- + Fastwork uses KMP for their domain and data layers to help them share their business logic and API + service between iOS and Android platforms. Fastwork offers all-in-one business administration and + management software to help users meet business needs, anytime, anywhere. + platforms: + - android + - ios + destination: external + externalLink: https://kotlinlang.org/lp/multiplatform/case-studies/fastwork + #------------------------------------------------------------------------ + - id: netvirta + type: multiplatform + description: >- + NetVirta uses KMP to share data, business, and presentation logic between their apps. Their app portfolio + offers an array of solutions, including full-body, foot, and head scanning apps that are used both in + stores and within the customer's home. + platforms: + - android + - ios + destination: external + externalLink: https://kotlinlang.org/lp/multiplatform/case-studies/netvirta + #------------------------------------------------------------------------ + - id: memrise + type: multiplatform + description: >- + Memrise, one of the world's most popular language learning apps, has incrementally migrated the logic of + their iOS, Android, and web apps to KMP. This allows them to avoid duplicating the code in three different + programming languages, while still offering a full offline and native UI experience. + platforms: + - android + - ios + - frontend + destination: external + externalLink: https://engineering.memrise.com/kotlin-multiplatform-memrise-3764b5a4a0db + #------------------------------------------------------------------------ + - id: icerock + type: multiplatform + description: >- + IceRock is an outsourcing company that leverages KMP to develop apps for its clients. Their app portfolio + spans various business requirements, complemented by a substantial collection of open-source KMP libraries + that enhance the KMP development process. + platforms: + - android + - ios + - frontend + - desktop + destination: external + externalLink: https://medium.com/icerock + #------------------------------------------------------------------------ + - id: chalk-com + type: multiplatform + description: >- + In both of Chalk.com's mobile apps, KMP is used for networking, offline caching, and business logic. The + UI for each of the apps is native to the platform, but other than that, almost everything else in their + apps can be shared with KMP. + platforms: + - android + - ios + destination: external + externalLink: https://kotlinlang.org/lp/multiplatform/case-studies/chalk + #------------------------------------------------------------------------ + - id: meituan + type: multiplatform + description: >- + Meituan uses KMP to develop client applications for its restaurant management system, across Android, + iOS, and Windows platforms since 2020. This approach enabled sharing code for data, domain and + presentation layers, improved development efficiency in new features, and ensured smooth user interactions + on low-end devices. + platforms: + - android + - ios + - desktop + - compose-multiplatform + destination: external + externalLink: https://www.bilibili.com/video/BV1es421T71C + #------------------------------------------------------------------------ + - id: Doordash + type: server-side + description: >- + DoorDash ↗ uses Kotlin for all their backend services and infrastructure. Hundreds of engineers work with Kotlin across a massive system spanning multiple repos. + destination: internal + internalLink: https://kotlinlang.org/lp/server-side/case-studies/doordash/ + +#------------------------------------------------------------------------ \ No newline at end of file diff --git a/data/case-studies/doordash/index.mdx b/data/case-studies/doordash/index.mdx new file mode 100644 index 00000000000..0190f3b0e4e --- /dev/null +++ b/data/case-studies/doordash/index.mdx @@ -0,0 +1,60 @@ +--- +id: doordash +company: DoorDash +industry: Food delivery service +size: 3000+ +country: USA, San Francisco +--- + +## [DoorDash ↗](https://en.wikipedia.org/wiki/DoorDash) uses Kotlin for all their backend services and infrastructure. Hundreds of engineers work with Kotlin across a massive system spanning multiple repos. + +Two years ago, they made the bold move to split their existing legacy Python monolith into multiple backend services, which they developed in Kotlin. This upgrade resulted in tremendous improvements: + +* Better software performance. +* Cleaner code. +* Easier code reviews. + +Another great thing about Kotlin is that people coming from Java, Golang, and Python find it really easy to get started. + +![Image](/images/case-studies/doordash/zohaib_quotation.png) + +## About DoorDash + +San Francisco-based on demand logistics platform DoorDash deals with customers who order food, merchants who prepare food for customers, and "Dashers" who deliver the food to the customer's door. + +By the end of November 2020, DoorDash had achieved $1.9 billion in revenue and it's one of the most anticipated IPOs in 2020. + +### "We are serving millions of users every day, delivering their orders with a very intricate, well-knitted solution.Our Kotlin services are handling requests from several complex logistic systems in order to weave together a seamless on-demand food delivery experience for the customers." + +## Why Kotlin? + +DoorDash had a Python monolith system backend that worked satisfactorily but wasn't going to keep up with the projected scaling. So DoorDash started to look into the options available for making a more scalable solution. + +A special internal committee evaluated the choices available, such as Python 3 (with async IO), Java, Golang, and Kotlin in combination with gRPC to see which would best fit the company's needs. The performance achieved with Python wasn't sufficient. Golang performed great but at that time it wasn't suited to complex business logic. The JVM appeared to be the most attractive landscape in terms of libraries, tooling, and frameworks, but almost all the developers were concerned about Java's ceremonial constructs and bloated code. + +Kotlin looked promising with its clean syntax and support for coroutines. It was easy to read, understand, and maintain. Kotlin also allowed developers with existing JVM experience to draw on their existing knowledge while building on top of solid frameworks that were well-documented and battle-tested. + +## Building up in the JVM ecosystem + +The DoorDash software backend now consists of two types of services: "backend for frontend" (BFF) services that act as stateless proxies, and internal services that run on Kotlin and gRPC and are accessible only through BFF. The BFF uses Kotlin either with SpringBoot or Micronaut. In such a system, gRPC servers are capable of writing end-to-end suspendable code without descending into callback hell. This significantly improves performance. + +Kotlin also allowed the team to use the rich Java library ecosystem and build solid services with complete instrumentation and maximum visibility. + +The common backend stack means that developers can write shared libraries for services and the BFF. In DoorDash, Kroto+ is used to generate the coroutine-friendly client and server code. Building on top of Netty, they were able to add libraries like Lettuce (for Redis), R2DBC (for Postgres), and Micrometer (for instrumentation). These libraries provide the foundation for out-of-the-box coroutine reactor extensions. There was some work done to glue them together, including adding interceptors, extension methods, and dependency injection, but the ecosystem quickly reached a stable state. + +### "Writing interoperable code between libraries can get tricky. Thanks to Kotlin's extensions system, we ended up writing additional extensions to weave these constructs together and still write some delightful code." + +## Favourite feature + +### "Nullability and safety is our favorite feature due to the guarantees it can put on the code. Yes, interoperability with Java might still have some nuances, but as long as you have written your code inside Kotlin it's a lifesaver (almost all of our business logic is in Kotlin)." + +Other favourite features at DoorDash: + +* **Extension Functions** is a lifesaver and an answer to utility classes. If used right they make code look simpler and more pleasant to read. +* **Data classes** are something that POJOs or DTOs (Data Transfer Objects) were always missing. Already having the capability to do `copy` and `equals` simplifies daily chores that would have been some IDE-generated junk or a Lombok hack. +* **Function blocks** that look like bodies. This is probably the most heavily used feature in the DoorDash codebase. From caching to instrumentation, it is easy to write nice, well-indented blocks that look like function bodies instead of callback lambdas. +* **Coroutines** are last but not least. At DoorDash there is a deep love of coroutines. Coroutines let you write regular straightforward code and manage the code generation for continuations under the hood. This keeps stack traces simpler for coroutine code, reducing cognitive load. + +## Summary + +With Kotlin, DoorDash was able to achieve its scaling goals and improve overall system performance. Perfect Java compatibility and coroutines were the main reasons behind this transformational success. Kotlin was a good middle ground for people coming from Java, Golang, and Python. It was easy for them to quickly catch up and start writing good, maintainable code in Kotlin. \ No newline at end of file diff --git a/data/schemas/case-studies.json b/data/schemas/case-studies.json new file mode 100644 index 00000000000..ac88523d846 --- /dev/null +++ b/data/schemas/case-studies.json @@ -0,0 +1,112 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CaseStudies", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { "$ref": "#/definitions/CaseItem" } + } + }, + "required": ["items"], + "additionalProperties": false, + "definitions": { + "CaseItem": { + "type": "object", + "properties": { + "id": { "type": "string", "minLength": 1 }, + "type": { "enum": ["multiplatform", "server-side"] }, + "description": { "type": "string", "minLength": 1 }, + "logo": { + "type": "array", + "items": { "type": "string", "minLength": 1 }, + "minItems": 0, + "maxItems": 2 + }, + "signature": { + "type": "object", + "properties": { + "line1": { "type": "string" }, + "line2": { "type": "string" } + }, + "additionalProperties": false, + "required": ["line1", "line2"] + }, + "destination": { "enum": ["internal", "external"] }, + "externalLink": { "type": "string", "format": "uri" }, + "externalLinkText": { "type": "string", "minLength": 1 }, + "platforms": { + "type": "array", + "items": { + "enum": [ + "android", + "ios", + "desktop", + "frontend", + "backend", + "compose-multiplatform" + ] + }, + "uniqueItems": true + }, + "media": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { "const": "youtube" }, + "url": { "type": "string", "format": "uri" } + }, + "required": ["type", "url"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { "const": "image" }, + "path": { "type": "string", "minLength": 1 } + }, + "required": ["type", "path"], + "additionalProperties": false + } + ] + }, + "featuredOnMainPage": { "type": "boolean" }, + "slug": { + "type": "string", + "pattern": "^[^/]+$" + }, + "pageContentPath": { "type": "string", "minLength": 1 }, + "internalLink": { "type": "string", "format": "uri" } + }, + "required": ["id", "type", "description"], + "additionalProperties": false, + "allOf": [ + { + "if": { "properties": { "destination": { "const": "external" } }, "required": ["destination"] }, + "then": { "required": ["externalLink"] } + }, + { + "if": { "properties": { "destination": { "const": "internal" } }, "required": ["destination"] }, + "then": { + "allOf": [ + { + "if": { "properties": { "destination": { "const": "external" } }, "required": ["destination"] }, + "then": { "required": ["externalLink"] } + }, + { + "if": { "properties": { "destination": { "const": "internal" } }, "required": ["destination"] }, + "then": { + "oneOf": [ + { "required": ["pageContentPath"] }, + { "required": ["internalLink"] } + ] + } + } + ] + } + } + ] + } + } +} \ No newline at end of file diff --git a/public/images/case-studies/bilibili-card-preview.jpg b/public/images/case-studies/bilibili-card-preview.jpg new file mode 100644 index 00000000000..507594d4b1e Binary files /dev/null and b/public/images/case-studies/bilibili-card-preview.jpg differ diff --git a/public/images/case-studies/doordash/zohaib_quotation.png b/public/images/case-studies/doordash/zohaib_quotation.png new file mode 100644 index 00000000000..a4ec8e58348 Binary files /dev/null and b/public/images/case-studies/doordash/zohaib_quotation.png differ diff --git a/public/images/case-studies/google-logo.svg b/public/images/case-studies/google-logo.svg new file mode 100644 index 00000000000..d983bb76547 --- /dev/null +++ b/public/images/case-studies/google-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file