Cash Engineering Principles
In 2022, we set out to capture our current Engineering Principles: how high-performing engineering teams do their best work at Cash. We’re proud of the work we did to record...
Molecule: Build a StateFlow stream using Jetpack Compose
Molecule allows you to write imperative reactive code! This is a game changer!
Synchronize Dependencies with BOM
Keeping multiple dependencies of the same group in sync can be tricky. BOM makes it safe.
Rx to Coroutines Concepts, Part 5: Shared Flows
Sometimes, you need to share a Flow with multiple consumers. Read all about how this works in this post.
Rx to Coroutines Concepts, Part 4: Cold Flows
In this post, everything you could ever need to know and more about how cold Flows work.
The state of managing state (with Compose)
Five years ago the Cash App Android client started splitting our UI rendering and UI presenter responsibilities into distinct types. We had leaned into RxJava heavily in the years prior,...
Rx to Coroutines Concepts, Part 3: Deferred & Channels
In this post, we'll cover the foundations of coroutines communications with Deferred and Channel.
Rx to Coroutines Concepts, Part 2.1: Exceptions
Okay, so there's a bit more to know about structured concurrency. This short-ish addenda covers how exceptions propogate within structured concurrent code.
Rx to Coroutines Concepts, Part 2: Structured Concurrency
Everything you could possibly want to know about structured concurrency is in this post.
Obsolete code is slowing you down
As engineering teams, an important measure of our effectiveness is how quickly we are able to build. If we can realize an idea more quickly, we can do more. While...
Sharp Edges in Kotlin Coroutines Testing Tools
At Cash App, we’re starting to integrate Kotlin coroutines into our app architecture. My coworker Bill, who has taken interest and ownership in this migration, came to me the other...
Gradle dependency license validation
Six years ago we added a screen to the Android Cash App to display the open source libraries we use and their licenses. This screen had to be updated manually,...
Migrating from Burst to TestParameterInjector
Square’s Burst library burst onto the scene in 2014 stemming from general dissatisfaction with JUnit 4’s built-in parameterized runner. It enabled the use of enums to vary input to your...
Rx to Coroutines Concepts, Part 1
The reactive paradigm is powerful, but can also be obscure. Coroutines provide an alternative paradigm that is better in every way.
Great teams merge fast
One of the many things I was constantly amazed about during my first few weeks at Square/Cash App was seeing how fast this team shipped code. All members of the...
AssistedInject is dead, long live AssistedInject!
After ~5 years of existing and ~4 years as an open source project, our AssistedInject library has been deleted. Mourn not, however, for the same functionality is now available directly...
protoc-gen-grpc-gateway-ts - Clean, Idiomatic TypeScript for grpc-gateway
protoc-gen-grpc-gateway-ts is a TypeScript client generator for the grpc-gateway project. It generates idiomatic TypeScript clients that connect the web frontend and golang gRPC backend fronted by grpc-gateway.
Rolling Out Org-Wide Changes
Cash App has grown into a complex engineering organization. Our team of hundreds of engineers deploys dozens of services to AWS multiple times a day. Our teams span several time...
Investigating Crashes with Aardvark
Crashes can be one of the most straightforward types of issues to debug. There are many different categories of crashes that can happen on iOS - everything from bad memory...
Debugging UI Issues with AardvarkReveal
Reports of UI issues can be difficult to debug when the issue is not easily reproducible. Bug reports created through Aardvark include a screenshot of the app at the time...