# Artur Dryomov

Recent content on Artur Dryomov

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Amazon S3 Versioning and Multipart Uploads Can Create Hidden Storage Costs

DevFeed: [Amazon S3 Versioning and Multipart Uploads Can Create Hidden Storage Costs](<https://devfeed.tech/articles/amazon-s3-paper-cuts-29351.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/amazon-s3-paper-cuts/>)

Author: Artur Dryomov

Published: 2026-02-28T00:00:00Z

Content type: opinion

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Amazon S3](<https://devfeed.tech/topics/amazon-s3.md>), [API](<https://devfeed.tech/topics/api.md>), [cloud-infrastructure](<https://devfeed.tech/topics/cloud-infrastructure.md>)

Tags: [amazon](<https://devfeed.tech/tags/amazon.md>), [amazon-s3](<https://devfeed.tech/tags/amazon-s3.md>), [api](<https://devfeed.tech/tags/api.md>), [cli](<https://devfeed.tech/tags/cli.md>), [cost](<https://devfeed.tech/tags/cost.md>), [monitoring](<https://devfeed.tech/tags/monitoring.md>), [reporting](<https://devfeed.tech/tags/reporting.md>), [s3](<https://devfeed.tech/tags/s3.md>), [storage](<https://devfeed.tech/tags/storage.md>), [uploads](<https://devfeed.tech/tags/uploads.md>), [versioning](<https://devfeed.tech/tags/versioning.md>)

### AI overview

This article examines Amazon S3 caveats involving object versioning and multipart uploads. It explains that implicit usage metrics and incomplete uploads can leave data stored indefinitely, creating unexpected storage costs, and discusses expiration and monitoring as preventive measures.

### Source excerpt

Amazon Simple Storage Service became not so simple over time. Not surprising at all -- a lot has happened since 2006. The API reference has more than 100 actions and Amazon itself puts S3 features into a couple dozen of categories. It's a good tool for countless applications -- naturally, it has caveats. Fortunately or not, it's also a product. As such, caveats become problems and problems become unpleasant and surprising bills.

## Reducing Single-Person Dependency Through Documentation and Onboarding

DevFeed: [Reducing Single-Person Dependency Through Documentation and Onboarding](<https://devfeed.tech/articles/the-bus-factor-of-zero-29354.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/bus-factor-of-zero/>)

Author: Artur Dryomov

Published: 2026-01-30T00:00:00Z

Content type: opinion

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Documentation](<https://devfeed.tech/topics/documentation.md>), [Requirements](<https://devfeed.tech/topics/requirements.md>), [Code review](<https://devfeed.tech/topics/code-review.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [GitLab](<https://devfeed.tech/topics/gitlab.md>)

Tags: [bus-factor](<https://devfeed.tech/tags/bus-factor.md>), [collaboration](<https://devfeed.tech/tags/collaboration.md>), [docs](<https://devfeed.tech/tags/docs.md>), [documentation](<https://devfeed.tech/tags/documentation.md>), [github](<https://devfeed.tech/tags/github.md>), [gitlab](<https://devfeed.tech/tags/gitlab.md>), [onboarding](<https://devfeed.tech/tags/onboarding.md>), [requirements](<https://devfeed.tech/tags/requirements.md>), [review](<https://devfeed.tech/tags/review.md>), [source-of-truth](<https://devfeed.tech/tags/source-of-truth.md>)

### AI overview

The article reflects on onboarding a new developer and argues that accessible documentation, product requirements documents, and architectural records can reduce reliance on tribal knowledge and make project history easier to understand.

### Source excerpt

Onboarding new developers to a team is an opportunity for introspection. It's one thing to share tribal knowledge, and another to realize that the mere existence of such knowledge can be counterproductive. Recently, I had an opportunity to onboard a new developer to one of our projects. Fortunately, almost everything went right. In a couple of days, the developer was able to contribute minor changes to the project, within a couple of weeks, major ones. Of course, a good portion of this rapid involvement can be attributed to the developer, but I believe the approaches described below helped a lot.

## Modern Git Features for Branches, Pushes, Diffs, and Restoring Changes

DevFeed: [Modern Git Features for Branches, Pushes, Diffs, and Restoring Changes](<https://devfeed.tech/articles/modern-git-for-modern-times-29365.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/modern-git/>)

Author: Artur Dryomov

Published: 2025-10-17T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Git](<https://devfeed.tech/topics/git.md>)

Tags: [git](<https://devfeed.tech/tags/git.md>)

### AI overview

A tutorial on newer Git workflow features, covering branch switching, automatic upstream tracking when pushing, visualizing moved content in diffs, and restoring changes.

### Source excerpt

Git has been around for a long time -- since April 2005. That's 20 years! Fun fact -- Bazaar and Mercurial were released around the same time as Git. Not so fun facts -- during this time Atlassian removed the Mercurial support from Bitbucket and Canonical retired Bazaar altogether. Meanwhile, GitHub and GitLab are alive and well -- safe to say, Git is here to stay. In fact, we might see Git 3.0 soon -- a new version for the new decade.

## Python, foreign functions and Steam

DevFeed: [Python, foreign functions and Steam](<https://devfeed.tech/articles/python-foreign-functions-and-steam-29371.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/python-foreign-functions-and-steam/>)

Author: Artur Dryomov

Published: 2023-08-01T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Python](<https://devfeed.tech/topics/python.md>), [SDKs](<https://devfeed.tech/topics/sdks.md>), [C](<https://devfeed.tech/topics/c.md>), [C++](<https://devfeed.tech/topics/c-plus-plus.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [macOS](<https://devfeed.tech/topics/macos.md>), [Steam Deck](<https://devfeed.tech/topics/steam-deck.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [c](<https://devfeed.tech/tags/c.md>), [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [linux](<https://devfeed.tech/tags/linux.md>), [macos](<https://devfeed.tech/tags/macos.md>), [python](<https://devfeed.tech/tags/python.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [steam-deck](<https://devfeed.tech/tags/steam-deck.md>)

### AI overview

A tutorial on calling foreign C functions from dynamic libraries in Python, using the Steamworks SDK as an example. It covers linking dynamic libraries, declaring C function signatures, and interacting with Steamworks interfaces from Python.

### Source excerpt

Language ecosystems are not perfect. Sometimes resulting executables are performant but the syntax is horrible, sometimes there is a nice package manager but standard functions are scarce to a fault -- it's all about the compromise. Python is nice to use but the performance might be not great. The latter causes such tools as NumPy to emerge. How does it work? Well, it uses C calls -- essentially borrowing performance improvements from the C ecosystem. In this article, I'll show how to use foreign C functions from dynamic libraries in Python. Calls will be done to the Steamworks SDK which games use to communicate with Steam.

## Music Stats with DuckDB

DevFeed: [Music Stats with DuckDB](<https://devfeed.tech/articles/music-stats-with-duckdb-29367.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/music-stats-with-duckdb/>)

Author: Artur Dryomov

Published: 2023-06-05T00:00:00Z

Content type: article

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [DuckDB](<https://devfeed.tech/topics/duckdb.md>), [data](<https://devfeed.tech/topics/data.md>), [import](<https://devfeed.tech/topics/import.md>), [CSV](<https://devfeed.tech/topics/csv.md>), [JSON](<https://devfeed.tech/topics/json.md>)

Tags: [csv](<https://devfeed.tech/tags/csv.md>), [data](<https://devfeed.tech/tags/data.md>), [duckdb](<https://devfeed.tech/tags/duckdb.md>), [import](<https://devfeed.tech/tags/import.md>), [json](<https://devfeed.tech/tags/json.md>), [music](<https://devfeed.tech/tags/music.md>)

### AI overview

The article describes using DuckDB to combine and analyze music scrobbles from sources including Last.fm and Spotify, working with JSON and CSV data in different formats.

### Source excerpt

Music! Everyone likes music. Well, I certainly hope so. Stats! Well, not everyone likes stats but I certainly do. In this article I'll describe an approach to work with music scrobbles from different sources and in different formats using DuckDB. DuckDB is a perfect match for such ad-hoc scenarios -- it has a minimal footprint, great performance and useful features. Scrobbles I've been using multiple music sources over the past decade. Fortunately, I had a Last.fm account from the beginning. It allowed me to track almost everything I've listened -- resulting in almost 110+ thousands of scrobbles. Unfortunately, I haven't used it all the time.

## Testing Files without Files

DevFeed: [Testing Files without Files](<https://devfeed.tech/articles/testing-files-without-files-29381.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/testing-files-without-files/>)

Author: Artur Dryomov

Published: 2022-02-21T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Filesystems](<https://devfeed.tech/topics/filesystems.md>), [Java](<https://devfeed.tech/topics/java.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [developer](<https://devfeed.tech/tags/developer.md>), [files](<https://devfeed.tech/tags/files.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [java](<https://devfeed.tech/tags/java.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This tutorial explains how to test Java file interactions without relying on physical disk files. It compares Java IO with Java NIO and discusses fake file systems such as JimFS, including their benefits and trade-offs. It also introduces Okio as a portable NIO-style option with Kotlin Multiplatform support.

### Source excerpt

File operations become less and less common. As users, we store more and more data in a vendor storage due to its convenience. I remember the contacts file format but cannot locate one on a local machine -- I have Google Contacts instead. As developers, we use datastores -- from S3 to Hive Metastore. Such datastores are scalable, fault tolerant and cheap. However, even if files and file systems are hidden behind various APIs -- it doesn't eliminate them. In this article I'll show how to use Java fake file systems to test file interactions. It's a fun approach but with its own pros and cons.

## Autonomous GitHub Pull Requests

DevFeed: [Autonomous GitHub Pull Requests](<https://devfeed.tech/articles/autonomous-github-pull-requests-29353.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/auto-github-pull-requests/>)

Author: Artur Dryomov

Published: 2021-03-08T00:00:00Z

Content type: article

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [GitHub](<https://devfeed.tech/topics/github.md>), [pull-requests](<https://devfeed.tech/topics/pull-requests.md>), [Automation](<https://devfeed.tech/topics/automation.md>), [GitHub Actions](<https://devfeed.tech/topics/github-actions.md>), [Code review](<https://devfeed.tech/topics/code-review.md>)

Tags: [automation](<https://devfeed.tech/tags/automation.md>), [code-review](<https://devfeed.tech/tags/code-review.md>), [github](<https://devfeed.tech/tags/github.md>), [github-actions](<https://devfeed.tech/tags/github-actions.md>), [pull-requests](<https://devfeed.tech/tags/pull-requests.md>), [workflow](<https://devfeed.tech/tags/workflow.md>)

### AI overview

This article describes a GitHub-based workflow for automating pull-request management. It covers automatic reviewer assignment, compiler, test, and linter checks, merge attempts based on checks and reviews, and updating other pull requests targeting the same branch.

### Source excerpt

In general, people are lazy. This is our nature -- we want to achieve more by doing less. Developers are on the next step of this urge -- we want to automate similar actions, patterns in human behavior. And what's more repetitive than working on pull requests for each source code change we make? Workflow Over time and multiple iterations I've established the following workflow. Open a PR. Assign reviewers automatically. Refine the PR. Run automatic checks (compiler, tests, linters): on success -- attempt automatic merge; on failure -- push new changes. Receive reviews: on approve -- attempt automatic merge; on decline -- push new changes. Merge the PR. Update PRs targeting the same branch. This approach reduces the manual interaction as much as possible. Developers provide changes and reviews, the automation handles everything else. There is no need to choose people for review, track checks and review statuses, merge and update remaining PRs.

## Kotlin Code Organization

DevFeed: [Kotlin Code Organization](<https://devfeed.tech/articles/kotlin-code-organization-29359.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/kotlin-code-organization/>)

Author: Artur Dryomov

Published: 2020-01-27T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Code](<https://devfeed.tech/topics/code.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [systems](<https://devfeed.tech/topics/systems.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Maven](<https://devfeed.tech/topics/maven.md>), [configuration](<https://devfeed.tech/topics/configuration.md>), [unit tests](<https://devfeed.tech/topics/unit-tests.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [maven](<https://devfeed.tech/tags/maven.md>), [organization](<https://devfeed.tech/tags/organization.md>), [unit-tests](<https://devfeed.tech/tags/unit-tests.md>)

### AI overview

This tutorial explains how to organize Kotlin code using standard directory layouts and source sets. It recommends separating production and test code, grouping files by language and tooling, storing Kotlin files in Kotlin-specific directories, and organizing extension functions by their target class and package.

### Source excerpt

What's the motivation behind organizing the code? Two points come to mind. Help humans. Consistent environments are easier to understand and adapt. Storing the source code in src/ instead of _k_/ makes it easier to find. Help machines. Build systems need hints. The code in main/ should be assembled all the time, while test/ is test-specific and shouldn't make it to a production environment. Sounds empathic. Where do we start?

## On Technical Writing

DevFeed: [On Technical Writing](<https://devfeed.tech/articles/on-technical-writing-29369.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/on-technical-writing/>)

Author: Artur Dryomov

Published: 2019-12-30T00:00:00Z

Content type: opinion

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Code](<https://devfeed.tech/topics/code.md>), [Job](<https://devfeed.tech/topics/job.md>), [Internet](<https://devfeed.tech/topics/internet.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [job](<https://devfeed.tech/tags/job.md>), [opinion](<https://devfeed.tech/tags/opinion.md>), [technical](<https://devfeed.tech/tags/technical.md>), [writing](<https://devfeed.tech/tags/writing.md>)

### AI overview

The author recounts developing a love of reading, beginning to write fiction, publishing stories online, and working for a university newspaper. The piece reflects on seeking feedback, deleting earlier work, treating writing as a job, and ultimately focusing more on coding and career development.

### Source excerpt

Books were the internet for me before the real one became accessible. Authors wrote a thing and I've read it, consuming the information behind the text. First, I've read each book we had at home. Then everything meaningful from a kids' section of the local library. And then I've been introduced into the serious stuff. I think The Hobbit was the beginning. Then The Three Musketeers, The Adventures of Sherlock Holmes... There were no recommendation engines of course so I went through everything, itching to consume experiences left behind by humanity. Sounds like an addiction, right? Well, it kinda was. Nowadays we have different drugs -- news, movies, TV series, games. There is no time for books. Kids certainly don't give a damn about them either. Anyways, we are talking about me, right?

## Kotlin Enum Recipes

DevFeed: [Kotlin Enum Recipes](<https://devfeed.tech/articles/kotlin-enum-recipes-29360.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/kotlin-enum-recipes/>)

Author: Artur Dryomov

Published: 2019-10-08T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [enum](<https://devfeed.tech/topics/enum.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [article](<https://devfeed.tech/tags/article.md>), [enum](<https://devfeed.tech/tags/enum.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>)

### AI overview

A tutorial on practical Kotlin enum patterns, covering declaration naming, comma placement, namespacing, API modeling, Gson and Moshi deserialization, Android resources, templates, and specification-oriented tests.

### Source excerpt

Enumerations, in a form of enum class declarations, got a bad rep on Android. In fact, the official documentation straight out recommends to avoid them. How rude is that? At the same time, Effective Java has a full chapter about enum. The situation reminds me of the trolley problem. Kind of. In this article, I'll distance myself from Android specifics and show useful enum-related snippets. Declaration Naming Use CamelCase, don't be ashamed. I doubt that anyone names sealed class using the UPPERCASE notation.

## Implementing Dark Themes in Android Applications

DevFeed: [Implementing Dark Themes in Android Applications](<https://devfeed.tech/articles/midnight-in-android-themes-29363.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/midnight-in-android-themes/>)

Author: Artur Dryomov

Published: 2019-08-15T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Dark Mode](<https://devfeed.tech/topics/dark-mode.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [color](<https://devfeed.tech/tags/color.md>), [guide](<https://devfeed.tech/tags/guide.md>), [icons](<https://devfeed.tech/tags/icons.md>), [themes](<https://devfeed.tech/tags/themes.md>)

### AI overview

A guide to implementing dark themes in the Juno rider Android application, covering theme switching across Android versions, themed and themeless colors, system bars, and vector icons.

### Source excerpt

Android Q introduces dark themes. Or night mode? No idea. Anyways, it is here and can be helpful with using applications in dark environments or with bringing back that sweet Winamp skins vibe. Implementing dark themes is surprisingly deep and affects the whole application. At times it feels like a redesign. I've tried to collect steps we've made to introduce the dark theme in the Juno rider application and make a (kind of) comprehensive guide. Let's jump in!

## Superior Testing: Managing Production

DevFeed: [Superior Testing: Managing Production](<https://devfeed.tech/articles/superior-testing-managing-production-29378.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/superior-testing-managing-production/>)

Author: Artur Dryomov

Published: 2019-07-30T00:00:00Z

Content type: article

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Monitoring](<https://devfeed.tech/topics/monitoring.md>), [Logging](<https://devfeed.tech/topics/logging.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [logging](<https://devfeed.tech/tags/logging.md>), [logs](<https://devfeed.tech/tags/logs.md>), [memory-leaks](<https://devfeed.tech/tags/memory-leaks.md>), [metrics](<https://devfeed.tech/tags/metrics.md>), [monitoring](<https://devfeed.tech/tags/monitoring.md>), [production](<https://devfeed.tech/tags/production.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This article argues that testing continues in production after deployment, where running the application exposes behavior that controlled environments cannot fully check. It presents monitoring, business and technical analytics, metrics such as memory and thread usage, error rates, and structured logging as ways to understand production behavior and detect issues.

### Source excerpt

The testing process does not magically stop after deploying an artifact. We've only just begun. It is impossible to check everything in a sandboxed environment. From a certain perspective it seems like the whole run time is the testing process. How is it possible to check the correctness without tests? Right -- by running the thing. We do the same in production -- just on a bigger scale and with bigger risks.

## Namespacing in Kotlin

DevFeed: [Namespacing in Kotlin](<https://devfeed.tech/articles/namespacing-in-kotlin-29368.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/namespacing-in-kotlin/>)

Author: Artur Dryomov

Published: 2019-07-29T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Code](<https://devfeed.tech/topics/code.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [architecture](<https://devfeed.tech/tags/architecture.md>), [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [classes](<https://devfeed.tech/tags/classes.md>), [code](<https://devfeed.tech/tags/code.md>), [components](<https://devfeed.tech/tags/components.md>), [development-process](<https://devfeed.tech/tags/development-process.md>), [java](<https://devfeed.tech/tags/java.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [php](<https://devfeed.tech/tags/php.md>), [typescript](<https://devfeed.tech/tags/typescript.md>), [view](<https://devfeed.tech/tags/view.md>), [viewmodel](<https://devfeed.tech/tags/viewmodel.md>)

### AI overview

This article examines how to represent a fractal component structure in Kotlin, focusing on naming and namespace-like organization. It compares several implementation approaches, including their Java representations, compiler behavior, object creation, inheritance, semantics, and generated size.

### Source excerpt

The development process is a research. Find the state machine, organize mutations, wire it for consumers. The process repeats and leads to the meta-research. We investigate scenarios and search for reusable parts. Patterns arise, implementations follow. Ideally, the code resembles a fractal structure. An architecture is said to be fractal if subcomponents are structured in the same way as the whole is. -- André Staltz The Problem Let's say we have a fractal components structure. Each one has a View and a ViewModel.

## Cleaning Up Test Files and Resources

DevFeed: [Cleaning Up Test Files and Resources](<https://devfeed.tech/articles/superior-testing-cleaning-up-29376.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/superior-testing-cleaning-up/>)

Author: Artur Dryomov

Published: 2019-06-06T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Memory Leaks](<https://devfeed.tech/topics/memory-leaks.md>), [Mocking](<https://devfeed.tech/topics/mocking.md>), [Filesystems](<https://devfeed.tech/topics/filesystems.md>), [Java](<https://devfeed.tech/topics/java.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>)

Tags: [files](<https://devfeed.tech/tags/files.md>), [junit](<https://devfeed.tech/tags/junit.md>), [memory-leaks](<https://devfeed.tech/tags/memory-leaks.md>), [mocking](<https://devfeed.tech/tags/mocking.md>), [mockito](<https://devfeed.tech/tags/mockito.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This tutorial explains how cleanup practices can improve tests. It discusses memory leaks and Mockito inline mocking, suggests using stubs that do not track invocations when verification is unnecessary, and recommends creating test files only in temporary directories and deleting them after each run.

### Source excerpt

There is a game called Viscera Cleanup Detail. The task in this game is to... clean things up. Well, it is a bit more exciting since it involves alien invasions, but at the end of the day players become space janitors. It is surprisingly addictive. Cleaning things is useful and helpful in a lot of ways. Developers understand that, but usually there is an additional motivation to keep things in order -- users. Nobody wants a product that breaks because there is not enough memory or wrecks havoc across the file system. The picture is very different with tests -- often they become a second class citizen. It shouldn't be this way.

## Abstracting Kotlin Sealed Classes

DevFeed: [Abstracting Kotlin Sealed Classes](<https://devfeed.tech/articles/abstracting-kotlin-sealed-classes-29349.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/abstracting-kotlin-sealed-classes/>)

Author: Artur Dryomov

Published: 2019-06-04T00:00:00Z

Content type: article

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Polymorphism](<https://devfeed.tech/topics/polymorphism.md>), [Refactoring](<https://devfeed.tech/topics/refactoring.md>), [Java](<https://devfeed.tech/topics/java.md>)

Tags: [bytecode](<https://devfeed.tech/tags/bytecode.md>), [java](<https://devfeed.tech/tags/java.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [models](<https://devfeed.tech/tags/models.md>), [polymorphism](<https://devfeed.tech/tags/polymorphism.md>), [properties](<https://devfeed.tech/tags/properties.md>), [refactoring](<https://devfeed.tech/tags/refactoring.md>), [sealed](<https://devfeed.tech/tags/sealed.md>), [sealed-classes](<https://devfeed.tech/tags/sealed-classes.md>)

### AI overview

This article examines ways to declare common properties in Kotlin sealed class hierarchies. It compares approaches involving type declarations, constructors, and separate Java-rooted abstractions, including their ergonomics and generated bytecode implications.

### Source excerpt

Things tend to be similar. Cars and bikes are different for sure but both have wheels, engines, exhaust systems and so on. Such similarities between models are usually described using basic polymorphism in virtual domain modeling. Kotlin makes this process a bit more pragmatic using sealed class declarations. Specifying type hierarchies using sealed classes is simple, but what about declaring common properties? Fortunately or not there are multiple ways to achieve this -- partially because of the Java baggage. Which one is the best?

## Speeding Up Gradle Test Execution in Android CI Pipelines

DevFeed: [Speeding Up Gradle Test Execution in Android CI Pipelines](<https://devfeed.tech/articles/superior-testing-need-for-speed-29379.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/superior-testing-need-for-speed/>)

Author: Artur Dryomov

Published: 2019-04-30T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [ci](<https://devfeed.tech/topics/ci.md>), [Android](<https://devfeed.tech/topics/android.md>), [cpu](<https://devfeed.tech/topics/cpu.md>)

Tags: [build](<https://devfeed.tech/tags/build.md>), [ci](<https://devfeed.tech/tags/ci.md>), [code](<https://devfeed.tech/tags/code.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [parallel](<https://devfeed.tech/tags/parallel.md>), [pipeline](<https://devfeed.tech/tags/pipeline.md>), [testing](<https://devfeed.tech/tags/testing.md>), [tests](<https://devfeed.tech/tags/tests.md>), [time](<https://devfeed.tech/tags/time.md>)

### AI overview

This tutorial discusses ways to reduce Gradle test execution time without changing source code, including parallel test-class execution, disabling unnecessary reports, and limiting Android variant testing. It reports a reduction from 53 to 41 seconds through parallel execution, with further small savings from the other changes.

### Source excerpt

Everybody wants to have a faster development cycle. Everything should be flawless and straightforward. Nobody wants to have hour-long builds and stuck CI queues. We need results! Now! Or maybe even in the past, preemptively. Guard from the Ruby ecosystem comes to mind, starting tests on file changes, without doing it manually. Talking about tests -- they are a part of the cycle, right? We run them both locally and remotely (as part of a CI pipeline). It takes time and I think we can do better!

## Modern DateTimes on Android

DevFeed: [Modern DateTimes on Android](<https://devfeed.tech/articles/modern-datetimes-on-android-29366.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/modern-times/>)

Author: Artur Dryomov

Published: 2019-04-15T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Java](<https://devfeed.tech/topics/java.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [java](<https://devfeed.tech/tags/java.md>), [joda](<https://devfeed.tech/tags/joda.md>), [threeten](<https://devfeed.tech/tags/threeten.md>), [time](<https://devfeed.tech/tags/time.md>)

### AI overview

This article explains the Java 8 date and time API on Android, including the use of ThreeTenBP and ThreeTenABP while native support remains limited. It recommends migrating from Joda-Time to ThreeTen-based APIs and describes separate dependencies for applications and JVM-based unit tests.

### Source excerpt

Java 8 gave us a great gift -- the java.time package, known as JSR 310 and ThreeTen. The story behind java.time is unique. It was introduced in JEP 150 by an independent developer -- Stephen Colebourne (@jodastephen). Yep, the same person who designed and developed Joda-Time. It was even endorsed by Brian Goetz, the Java Concurrency in Practice author! The result is a great API -- explicit and direct, based on years of Joda-Time experience.

## Superior Testing: Check Your Checks

DevFeed: [Superior Testing: Check Your Checks](<https://devfeed.tech/articles/superior-testing-check-your-checks-29375.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/superior-testing-check-checks/>)

Author: Artur Dryomov

Published: 2019-03-27T00:00:00Z

Content type: opinion

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [async](<https://devfeed.tech/topics/async.md>), [test](<https://devfeed.tech/topics/test.md>), [SDK](<https://devfeed.tech/topics/sdk.md>)

Tags: [async](<https://devfeed.tech/tags/async.md>), [code](<https://devfeed.tech/tags/code.md>), [errors](<https://devfeed.tech/tags/errors.md>), [false-positives](<https://devfeed.tech/tags/false-positives.md>), [mockito](<https://devfeed.tech/tags/mockito.md>), [testing](<https://devfeed.tech/tags/testing.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

The article discusses false positives in software tests, focusing on assertions and Mockito verifications. It explains that checking only a result or an invocation can miss side effects, especially in asynchronous code and UI behavior.

### Source excerpt

False positives. Such an interesting combination of words, isn't it? The nature of false positives is mostly human. We misinterpret conditions, define them wrong, forget about effects -- but the machine obeys. We get what we want but not what we need. This is dangerous. The civilization downfall in various science fiction books is a false positive result. The AI gets instructions to eliminate all threats, humanity becomes the threat, roll the action scene. This is so not new that we got used to it.

## Merge Git Authors

DevFeed: [Merge Git Authors](<https://devfeed.tech/articles/merge-git-authors-29362.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/merge-git-authors/>)

Author: Artur Dryomov

Published: 2019-03-19T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Git](<https://devfeed.tech/topics/git.md>), [git hook](<https://devfeed.tech/topics/git-hook.md>), [bitbucket](<https://devfeed.tech/topics/bitbucket.md>)

Tags: [bitbucket](<https://devfeed.tech/tags/bitbucket.md>), [consistency](<https://devfeed.tech/tags/consistency.md>), [email](<https://devfeed.tech/tags/email.md>), [git](<https://devfeed.tech/tags/git.md>), [git-hook](<https://devfeed.tech/tags/git-hook.md>), [github](<https://devfeed.tech/tags/github.md>), [merge](<https://devfeed.tech/tags/merge.md>)

### AI overview

This article explains how to identify and consolidate inconsistent Git author names and email addresses so repository history accurately reflects contributor identities. It discusses Git commands, display limitations, tool support, and preventive checks using Bitbucket plugins or pre-commit hooks.

### Source excerpt

Stats! Stats are awesome. You can collect them, you can analyze and visualize them, you can boil, grill and fry them... Wait, that's not food, right? git shortlog Let's say we have a Git repository. We want to count commits per author. There is a Git command for that! $ git shortlog --summary --numbered 2 Bender Rodriguez 2 Philip J. Fry 1 Bending Unit 22 1 Turanga Leela There are actually three authors but since names are non-consistent Git makes it look like there are four. It gets worse with emails.

## Superior Testing: Make Fakes not Mocks

DevFeed: [Superior Testing: Make Fakes not Mocks](<https://devfeed.tech/articles/superior-testing-make-fakes-not-mocks-29377.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/superior-testing-make-fakes-not-mocks/>)

Author: Artur Dryomov

Published: 2019-02-28T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Mocking](<https://devfeed.tech/topics/mocking.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [RxJava](<https://devfeed.tech/topics/rxjava.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [mocking](<https://devfeed.tech/tags/mocking.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [testing](<https://devfeed.tech/tags/testing.md>), [tests](<https://devfeed.tech/tags/tests.md>)

### AI overview

The article compares mocking with reusable fakes, or test implementations, in tests for a books repository. It explains that mocking can become bulky and less reusable as code grows, while fakes can reduce repetition and dependency on mocking frameworks. Examples include synchronous and reactive variants, with Kotlin-specific implementation details.

### Source excerpt

After years of writing and reading tests I've discovered that mocking is either overused or underused. Not sure why exactly it happens but striking the right balance seems to be a complicated issue. In this Superior Testing article I'll show how to replace mocking in favor of faking and collect benefits. Mocking Sync Let's say we have a books repository allowing us to get a book based on its ID. The repository depends on the storage. The resulting code is simple enough.

## Filling Android Autofill Gaps

DevFeed: [Filling Android Autofill Gaps](<https://devfeed.tech/articles/filling-android-autofill-gaps-29357.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/filling-android-autofill-gaps/>)

Author: Artur Dryomov

Published: 2019-02-13T00:00:00Z

Content type: article

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [LineageOS](<https://devfeed.tech/topics/lineageos.md>), [passwords](<https://devfeed.tech/topics/passwords.md>), [vendor lock-in](<https://devfeed.tech/topics/vendor-lock-in.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [credentials](<https://devfeed.tech/tags/credentials.md>), [passwords](<https://devfeed.tech/tags/passwords.md>), [vendor-lock-in](<https://devfeed.tech/tags/vendor-lock-in.md>)

### AI overview

The article examines Android credential storage and autofill options, including Android Autofill and Google Smart Lock. It discusses the convenience of password managers and cross-device credential access, while noting security concerns with unencrypted backups and vendor lock-in when credentials are stored on Google's servers.

### Source excerpt

We can have different opinions but should be able to agree on one thing -- we are humans. Well, except ones who like Gerrit and use Dashboard on macOS. Those are clearly aliens (Mulder was right). All humans tend to forget things. Important and useless, smart and dumb, beautiful and ugly -- it does not matter, any thought or information can disappear. Precious credentials for applications we work on are no exception.

## Superior Testing: Stop Stopping

DevFeed: [Superior Testing: Stop Stopping](<https://devfeed.tech/articles/superior-testing-stop-stopping-29380.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/superior-testing-stop-stopping/>)

Author: Artur Dryomov

Published: 2019-01-27T00:00:00Z

Content type: article

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Code](<https://devfeed.tech/topics/code.md>), [Java](<https://devfeed.tech/topics/java.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [code](<https://devfeed.tech/tags/code.md>), [developers](<https://devfeed.tech/tags/developers.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [ide](<https://devfeed.tech/tags/ide.md>), [java](<https://devfeed.tech/tags/java.md>), [junit](<https://devfeed.tech/tags/junit.md>), [maven](<https://devfeed.tech/tags/maven.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

The article argues that developers should write tests despite common objections about time, customer value, or difficult codebases. Drawing on experiences with JUnit, Maven, and an IDE, it presents testing as a source of confidence and as a way developers show empathy toward coworkers.

### Source excerpt

Let's start with confessions. The initial idea to kick-off a series of articles about testing was the shortest article ever. A single phrase. Just do it. I mean, isn't it obvious that testing is awesome and useful? Unfortunately, after talking to dozens of developers I've come to the shocking fact that most of them don't write tests. Our customer doesn't pay for tests. We don't have time. The codebase is impossible to test. I've heard these words over and over again.

## Acceptance Criteria: From Informal Text to Formal Specifications

DevFeed: [Acceptance Criteria: From Informal Text to Formal Specifications](<https://devfeed.tech/articles/acceptance-criteria-bureaucracy-29350.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/acceptance-criteria-bureaucracy/>)

Author: Artur Dryomov

Published: 2019-01-20T00:00:00Z

Content type: opinion

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Agile](<https://devfeed.tech/topics/agile.md>), [Requirements](<https://devfeed.tech/topics/requirements.md>), [Cucumber](<https://devfeed.tech/topics/cucumber.md>), [Specifications](<https://devfeed.tech/topics/specifications.md>)

Tags: [agile](<https://devfeed.tech/tags/agile.md>), [communication](<https://devfeed.tech/tags/communication.md>), [requirements](<https://devfeed.tech/tags/requirements.md>), [specifications](<https://devfeed.tech/tags/specifications.md>)

### AI overview

The article discusses Acceptance Criteria as a communication artifact between business and technical teams. It traces their evolution from informal text and email to formal specifications, highlighting Cucumber's Gherkin syntax as a structured option.

### Source excerpt

Cooperation! It sure sounds better than bureaucracy. A released product is a result of cooperation between the Business and the Tech. There is an obvious issue though. Both sides have different mindsets. The misunderstanding is inevitable. How do we solve this? Well, there are still wars on the planet so apparently humanity wasn't able to find a solution. What about establishing not world peace but a good communication channel? Agile methodologies establish such artifact as Acceptance Criteria (AC). AC is a specification for how the product should work. Sounds good and the motivation is solid, but there is a catch -- there are no explicit requirements. AC can consist of memes and be distributed by birds -- the sky is the limit (literally). Let's take a look at the evolution and trace our path to the bureaucracy nirvana.

## Designing Errors with Kotlin

DevFeed: [Designing Errors with Kotlin](<https://devfeed.tech/articles/designing-errors-with-kotlin-29355.md>)

Original publisher: [Read original article](<https://arturdryomov.dev/posts/designing-errors-with-kotlin/>)

Author: Artur Dryomov

Published: 2018-12-18T00:00:00Z

Content type: tutorial

Language: en

Sources: [Artur Dryomov](<https://devfeed.tech/sources/artur-dryomov.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Error Handling](<https://devfeed.tech/topics/error-handling.md>), [Exception](<https://devfeed.tech/topics/exception.md>), [Java](<https://devfeed.tech/topics/java.md>), [Swift](<https://devfeed.tech/topics/swift.md>)

Tags: [error-handling](<https://devfeed.tech/tags/error-handling.md>), [errors](<https://devfeed.tech/tags/errors.md>), [exception](<https://devfeed.tech/tags/exception.md>), [java](<https://devfeed.tech/tags/java.md>), [jvm](<https://devfeed.tech/tags/jvm.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [languages](<https://devfeed.tech/tags/languages.md>), [swift](<https://devfeed.tech/tags/swift.md>)

### AI overview

An article about designing error handling in Kotlin, using Java and Swift as points of comparison. It discusses checked and unchecked exceptions, documented return-value errors, and Swift's explicit error model.

### Source excerpt

Fun fact -- the area of the Java island is 138 793 km², the Kotlin island occupies 15 km². Of course, it is blatantly incorrect to compare languages based on same-named island areas. At the same time, it brings things in perspective. Java is the cornerstone of the JVM platform. The platform itself overshadows everything it hosts: Groovy, Ceylon, Scala, Clojure and Kotlin. It brings a lot to the table -- error handling is no exception (pun intended).

[Next page](<https://devfeed.tech/sources/artur-dryomov.md?cursor=WyIyMDE4LTEyLTE4VDAwOjAwOjAwKzAwOjAwIiwgIjhlNDFlNzMwLWE1NDItNGJhMi1iYTRjLTM1MjA2ZTkwMTZkZiJd>)