<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Software Engineering on Vasileios Chroniadis blog</title><link>https://chronvas.github.io/tags/software-engineering/</link><description>Recent content in Software Engineering on Vasileios Chroniadis blog</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 16 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://chronvas.github.io/tags/software-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>From Android-Dependent to Platform-Agnostic - The 3 Modern Android Library Categories</title><link>https://chronvas.github.io/posts/2026-7-16-from-android-dependent-to-platform-agnostic-the-3-modern-android-library-categories/</link><pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate><guid>https://chronvas.github.io/posts/2026-7-16-from-android-dependent-to-platform-agnostic-the-3-modern-android-library-categories/</guid><description>&lt;p&gt;Over the past decade of building Android libraries, I’ve realized they differ not just by what they do, but by &lt;strong&gt;how tightly they’re coupled to the Android OS&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://chronvas.github.io/img/android-to-kmp.png"&gt;&lt;img src="https://chronvas.github.io/img/android-to-kmp.png"&gt;&lt;/a
&lt;/figure&gt;
&lt;p&gt;When designing or choosing a library today, understanding this level of coupling is crucial. Historically, libraries fell into two buckets. Thanks to &lt;strong&gt;Kotlin Multiplatform (&lt;a href="https://kotlinlang.org/multiplatform/"&gt;KMP&lt;/a&gt;)&lt;/strong&gt;, we now have a clear third category.&lt;/p&gt;
&lt;p&gt;Through my own experience, I’ve found it helpful to group these libraries into three main categories, ranked from &amp;lsquo;deeply Android&amp;rsquo; to &amp;lsquo;completely platform-agnostic.&lt;/p&gt;</description></item><item><title>A simple software principle</title><link>https://chronvas.github.io/posts/2023-11-13-a-simple-software-principle/</link><pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate><guid>https://chronvas.github.io/posts/2023-11-13-a-simple-software-principle/</guid><description>&lt;p&gt;&lt;em&gt;Prefer language tools, if they exist, rather than relying on assumptions.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://chronvas.github.io/img/workshop.png"&gt;&lt;img src="https://chronvas.github.io/img/workshop.png"&gt;&lt;/a
&lt;/figure&gt;
&lt;p&gt;Assume you are working on a project that consumes a third-party SDK that provides you with a simple list of fruits. Your application’s task is to take these fruits and make juice with them. You name the juice that you make with the name of the 1st fruit you get from this list.&lt;/p&gt;
&lt;p&gt;Your application looks like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;import fruitery.SDK
import fruitery.SDK.Fruit
fun main(args: Array&amp;lt;String&amp;gt;) {
val sdk = SDK()
val fruits = sdk.getFruits()
val juice = makeJuice(fruits)
}
private fun makeJuice(fruits: List&amp;lt;Fruit&amp;gt;) =
Juice(
name = fruits.first().name,
content = squash(fruits)
)
}
private data class Juice(val name: String, val content: String)
private fun squash(fruits: List&amp;lt;Fruit&amp;gt;) = /* squash the fruits */
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Do you see a problem with that? If not, look closer. More specifically “fruits.first()”. Kotlin docs state clearly that it can throw, but there is no compilation error. It is therefore up to you to decide if you build your app to defend against this possibility or not. Some other languages don’t tell you that.&lt;/p&gt;</description></item></channel></rss>