<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mukuoso]]></title><description><![CDATA[A technology blog focused on Android development, competitive programming, 42 Luanda experiences and crazy personal projects.]]></description><link>https://blog.rmarcos.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 04:27:03 GMT</lastBuildDate><atom:link href="https://blog.rmarcos.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Android Fundamentals: RGB Color Mixer]]></title><description><![CDATA[Introduction
Hi again, dear readers!
In the last post we had a brief introduction to Jetpack Compose, and before that a brief introduction to Android app components. In today's article, we'll build a ]]></description><link>https://blog.rmarcos.dev/android-fundamentals-rgb-color-mixer</link><guid isPermaLink="true">https://blog.rmarcos.dev/android-fundamentals-rgb-color-mixer</guid><category><![CDATA[Android]]></category><category><![CDATA[android app development]]></category><category><![CDATA[Android Studio]]></category><category><![CDATA[android apps]]></category><category><![CDATA[Kotlin]]></category><category><![CDATA[Jetpack Compose]]></category><category><![CDATA[jetpack compose  UI components]]></category><category><![CDATA[jetpack compose layouts and modifiers]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[beginner]]></category><dc:creator><![CDATA[Rafael Marcos]]></dc:creator><pubDate>Wed, 22 Jul 2026 14:47:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/697b6bcf5656f70c5ac1be47/13137e24-c9f9-4416-b380-8f935fd2eb76.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1>
<p>Hi again, dear readers!</p>
<p>In the <a href="https://blog.rmarcos.dev/android-fundamentals-jetpack-compose">last post</a> we had a brief introduction to Jetpack Compose, and <a href="https://blog.rmarcos.dev/android-fundamentals-app-components">before that</a> a brief introduction to Android app components. In today's article, we'll build a color mixer app as our first project to have a brief introduction to Android app development.</p>
<p>In this article I'll document my walkthrough and my decisions, I encourage you, dear readers, to explore different approaches for the project and feedback, all suggestions are welcome.</p>
<h1>Project Description</h1>
<p>We'll build a color mixer, we'll have three text fields that will accept hexadecimal values for red, green and blue channels respectively. It'll also contain a preview of the resulting color and a label of the color's hex code. This should look like the image below:</p>
<p><img src="https://github.com/Tesla-J/rgb-color-mixer/raw/main/screenshots/Screenshot_20260712_162343.png" alt="RGB Color Mixer" /></p>
<p>Of course, the app must validate inputs and shouldn't crash. To run the app, I'll use a real device because my potato would burn if I try to run the emulator, but <a href="https://developer.android.com/studio/run/emulator">here</a> you'll find a guide to configure the emulator in your machine.</p>
<h2>Setting Up Your First Project</h2>
<p><a href="https://developer.android.com/studio">Download Android Studio</a>, run it and create a new project. From the options, keep "Empty Activity" selected and press <em>Next</em>.</p>
<img src="https://cdn.hashnode.com/uploads/covers/697b6bcf5656f70c5ac1be47/0bedc1c7-1e6d-4ef2-be48-bb0b2dd52c75.png" alt="Android Studio New Project Templates" style="display:block;margin:0 auto" />

<p>Rename "My Application" to "RGB Color Mixer", you can change other details, but be careful when changing <strong>Minimum SDK</strong>, the older, the better for compatibility with older devices. I'm using <strong>Minimum SDK 24</strong> to support more devices. Then press <em>Finish</em>, let Gradle finish the sync and you're all done.</p>
<img src="https://cdn.hashnode.com/uploads/covers/697b6bcf5656f70c5ac1be47/b706f1b4-1530-4e42-8018-ac6c3b33e1b3.png" alt="Android Studio Project Details" style="display:block;margin:0 auto" />

<p>Along the projects, we'll explore the project structure when needed, we can ignore it for now.</p>
<h2>Source Code</h2>
<p>The default source code has two parts, the Activity declaration and the composable functions.</p>
<p>The default main activity is literally named as <code>MainActivity</code>. All Activities must be a subclass of the <code>Activity</code> class, as we can observe from the source code below, we have <code>ComponentActivity</code>, which is also a subclass of the <code>Activity class</code>. If the syntax looks confusing, check for <a href="https://kotlinlang.org/docs/lambdas.html#passing-trailing-lambdas">trailing lambdas</a>.</p>
<pre><code class="language-Kotlin">class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            RGBColorMixerTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -&gt;
                    Greeting(
                        name = "Android",
                        modifier = Modifier.padding(innerPadding)
                    )
                }
            }
        }
    }
}
</code></pre>
<p>The function <code>setContent</code> is responsible for setting up the layout. Inside of it there are other function calls, let's focus on the <code>Greeting</code> function, that is declared as below by default.</p>
<pre><code class="language-kotlin">@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        modifier = modifier
    )
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    RGBColorMixerTheme {
        Greeting("Android")
    }
}
</code></pre>
<p>We can notice the annotation <code>@Composable</code>, this indicates that it is a <strong>composable</strong>, There is also a second annotation, the <code>@Preview</code>.</p>
<h1>Development Process</h1>
<h2>Auxiliary Functions</h2>
<p>Before paying attention to the UI, I first created functions that would help me handle user input, validate it, properly convert it to <code>Color</code> class, and use the color to update the preview.</p>
<p>The <code>private val HEX_DIGITS = "0123456789ABCDEF"</code> variable was declared to help to validate hex values and convert their string representation to integer.</p>
<p>The function <code>isValidChannel</code> validates the user input by checking the size and the characters it contains.</p>
<pre><code class="language-Kotlin">private fun isValidChannel(channel: String): Boolean{
    var isValid = true
    if (channel.length !in 1..2)
        return false
    channel.forEach { isValid = isValid &amp;&amp; HEX_DIGITS.contains(it.uppercase()) }
    return isValid
}
</code></pre>
<p>To convert hexadecimal strings to <code>Int</code>, I declared an <a href="https://kotlinlang.org/docs/extensions.html#extension-functions">extension function</a> for <code>String</code> class. This is just an adaptation of the famous <code>atoi</code> function (C programmers will recognize it), which converts strings to integers.</p>
<pre><code class="language-Kotlin">private fun String.toColorChannel(): Int{
    var value = 0

    if (!isValidChannel(this))
        return value
    this.forEach {
        value = value.shl(4)
        value += HEX_DIGITS.indexOf(it.uppercase())
    }
    return value
}
</code></pre>
<p>Finally, to get a <code>Color</code> object, I create the <code>getColor</code> function. This used bitwise operations to create a valid <code>Int</code> representation of a color, that follows the <code>0xAARRGGBB</code> hexadecimal pattern. <a href="https://developer.android.com/reference/android/graphics/Color">Here</a> you'll find the API reference for more details.</p>
<pre><code class="language-Kotlin">private fun getColor(red: String, green: String, blue: String): Color {
    return Color(0xff.shl(8)
        .or(red.toColorChannel())
        .shl(8)
        .or(green.toColorChannel())
        .shl(8)
        or(blue.toColorChannel())
    )
}
</code></pre>
<h2>Resources</h2>
<p>Resources are files and static content that our code uses, such as images, strings, etc. Always externalize resources, so that we can maintain them separately. Also provide alternative resources, at runtime Android uses the appropriate resource based on current configuration — images for different screen sizes, for example.</p>
<p>Resources are located at <code>app/src/main/res/</code> folder, there are different folders for different resources in it. For this project I focused on the <code>values/</code> folder, <code>strings.xml</code> to be more accurate.</p>
<p>This file is dedicated to string resources, instead of using string literals inside your code, just set a string resource and use <code>stringResource</code> to get it inside your code. For example, let's say we have the following string resource:</p>
<pre><code class="language-XML">&lt;resources&gt;
    &lt;string name="app_name"&gt;RGB Color Mixer&lt;/string&gt;
    ...
&lt;/resources&gt;
</code></pre>
<p>To access it, we can call <code>stringResource(R.string.app_name)</code> to access the string resource. Every string resource has an <code>Int</code> ID generated inside of project's <code>R</code> class. In this example <code>R.string.app_name</code> is the resource ID. </p>
<h2>Declaring The UI</h2>
<p>I first removed 'Greeting' and 'GreetingPreview' declarations and calls, then created a composable to get the user input as follows:</p>
<pre><code class="language-Kotlin">@Composable
fun ColorTextField(
    modifier: Modifier = Modifier,
    color:String = "",
    isValidColor: Boolean = true,
    label: Int,
    placeholder: Int,
    onValueChange: (String) -&gt; Unit = {},
){
    TextField(
        modifier = modifier.padding(4.dp),
        value = color,
        onValueChange = onValueChange,
        isError = !isValidColor,
        supportingText = {
            if (!isValidColor)
                Text(
                    text = stringResource(R.string.invalid_color),
                    color = MaterialTheme.colorScheme.error
                )
        },
        trailingIcon = {
            if (!isValidColor)
                Icon(
                    imageVector = Icons.Filled.Warning,
                    contentDescription = stringResource(R.string.error_icon),
                    tint = MaterialTheme.colorScheme.error
                )
        },
        singleLine = true,
        label = {
            Text(stringResource(label))
        },
        placeholder = {
            Text(stringResource(placeholder))
        }
    )
}
</code></pre>
<p>The <code>TextField</code> composable is brought by Jetpack Compose, other default composables used in the project are <code>Button</code> and <code>Text</code>, there are many others, but we'll explore them along future projects. To avoid repetition, I declared a customized <code>TextField</code> to reuse common details through <code>ColorTextField</code> composable.</p>
<p>It's worth noting that <code>value</code> and <code>onValueChange</code> must be set in <code>TextField</code>. <code>value</code> is the current <code>TextField</code> content while <code>onValueChange</code> is a lambda function that will be executed every time <code>value</code> changes. As Jetpack Compose uses a declarative approach and composables can only be updated through recomposition, <code>remember</code> API  and <code>MutableState&lt;T&gt;</code> objects should be used to trigger it.</p>
<p>To preview a color, the <code>Surface</code> composable was used, its height was defined to 1/3 of the screen height.</p>
<p>Modifiers allow us to augment or decorate composables. It's a best practice to have all our composable functions to accept a <code>modifier</code> parameter and pass that parameter to the first child that emits UI.</p>
<pre><code class="language-Kotlin">@Composable
private fun ColorPreview(
    modifier: Modifier = Modifier,
    color: Color,
    label: @Composable () -&gt; Unit = {}
){
    Column(
        modifier = modifier.fillMaxSize().padding(4.dp),
        horizontalAlignment = Alignment.CenterHorizontally,
    ){
        val screenHeight = LocalConfiguration.current.screenHeightDp.dp
        Surface(
            modifier = Modifier.fillMaxWidth().height(screenHeight / 3),
            color = color
        ){}
        label()
    }
}
</code></pre>
<p>If you noticed, the code has two interesting composables: <code>Column</code> and <code>Row</code>. Including <code>Box</code> composable, they form the layout composables, making easier to design our UI.</p>
<p><code>Column</code> organizes UI elements vertically, <code>Row</code> horizontally, and <code>Box</code> stacks elements one above other.</p>
<p>To put things together, I declared the <code>ColorMixerUI</code> composable as follows:</p>
<pre><code class="language-Kotlin">@Preview
@Composable
fun ColorMixerUI(
    modifier: Modifier = Modifier,
){
    var red by rememberSaveable { mutableStateOf("") }
    var green by rememberSaveable { mutableStateOf("") }
    var blue by rememberSaveable { mutableStateOf("") }
    var isValidRed by rememberSaveable { mutableStateOf(true) }
    var isValidGreen by rememberSaveable { mutableStateOf(true) }
    var isValidBlue by rememberSaveable { mutableStateOf(true) }

    Column(
        modifier = modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.SpaceEvenly
    ) {
        Row(
            modifier = Modifier.fillMaxWidth().padding(4.dp),
            horizontalArrangement = Arrangement.SpaceEvenly
        ) {
            ColorTextField(
                modifier = Modifier.weight(1f),
                color = red,
                isValidColor = isValidRed,
                label = R.string.red,
                placeholder = R.string.input_red
            ){
                if (it.length &lt; 3 ) {
                    red = it.uppercase()
                    isValidRed = isValidChannel(it)
                }
            }
            ColorTextField(
                modifier = Modifier.weight(1f),
                color = green,
                isValidColor = isValidGreen,
                label = R.string.green,
                placeholder = R.string.input_green
            ){
                if (it.length &lt; 3 ) {
                    green = it.uppercase()
                    isValidGreen = isValidChannel(it)
                }
            }
            ColorTextField(
                modifier = Modifier.weight(1f),
                color = blue,
                isValidColor = isValidBlue,
                label = R.string.blue,
                placeholder = R.string.input_blue
            ){
                if (it.length &lt; 3 ) {
                    blue = it.uppercase()
                    isValidBlue = isValidChannel(it)
                }
            }
        }
        ColorPreview(
            modifier = Modifier,
            color = getColor(red, green, blue),
        ){
            Text(
                modifier = Modifier
                    .padding(8.dp),
                text = "#${getColorString(red, green, blue).uppercase()}",
                fontSize = 24.sp,
                textAlign = TextAlign.Center,
            )
        }
        Button(
            modifier = Modifier.padding(vertical = 8.dp),
            onClick = {
                red = ""
                green = ""
                blue = ""
            }
        ) {
            Text(stringResource(R.string.reset))
        }
    }
}
</code></pre>
<h2>Handling State</h2>
<p>Ignoring my questionable UI design decisions, let's focus on this part of <code>ColorMixerUI</code>:</p>
<pre><code class="language-Kotlin">    var red by rememberSaveable { mutableStateOf("") }
    var green by rememberSaveable { mutableStateOf("") }
    var blue by rememberSaveable { mutableStateOf("") }
    var isValidRed by rememberSaveable { mutableStateOf(true) }
    var isValidGreen by rememberSaveable { mutableStateOf(true) }
    var isValidBlue by rememberSaveable { mutableStateOf(true) }
</code></pre>
<p>That is the use of the <code>remember</code> API and <code>MutableState&lt;T&gt;</code> to trigger recomposition and update the app's UI state. <code>rememberSaveable</code> is the variant of <code>remember</code> that survives configuration changes (eg: screen rotation).</p>
<h1>Final Words</h1>
<p>This project is a brief introduction to Android development, you now have an idea on how to put things together and build basic UIs. Check the references for more details, the project repository is also there.</p>
<p>See you in the next post, happy coding!</p>
<h1>References</h1>
<p><a href="https://github.com/Tesla-J/rgb-color-mixer">RGB Color Mixer Repository</a></p>
<p><a href="https://developer.android.com/compose">Jetpack Compose UI App Development Toolkit</a></p>
<p><a href="https://developer.android.com/reference/androidx/activity/ComponentActivity">ComponentActivity API Reference</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/mental-model">Thinking In Compose</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/text/user-input?textfield=state-based">TextField</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/text/display-text">Text</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/components/button">Button</a></p>
<p><a href="https://hey-agrawal.medium.com/surface-in-jetpack-compose-c0712d38b994">Surface In Jetpack Compose</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/modifiers">Compose Modifiers</a></p>
<p><a href="https://developer.android.com/guide/topics/resources/providing-resources">App Resources Overview</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/layouts/basics">Compose Layout Basics</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/state">State and Jetpack Compose</a></p>
<p>EOF</p>
]]></content:encoded></item><item><title><![CDATA[Android Fundamentals: Jetpack Compose]]></title><description><![CDATA[Introduction
Hi, dear readers! I'm posting this article before the one related with the project because I realised it would be better to give a short introduction to new concepts before the real proje]]></description><link>https://blog.rmarcos.dev/android-fundamentals-jetpack-compose</link><guid isPermaLink="true">https://blog.rmarcos.dev/android-fundamentals-jetpack-compose</guid><category><![CDATA[Jetpack Compose]]></category><category><![CDATA[Android]]></category><category><![CDATA[android app development]]></category><category><![CDATA[Kotlin]]></category><category><![CDATA[ #JetpackCompose ]]></category><dc:creator><![CDATA[Rafael Marcos]]></dc:creator><pubDate>Wed, 22 Jul 2026 04:39:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/697b6bcf5656f70c5ac1be47/24a72bd8-b3b6-4bf9-a8ee-c8a1417de49a.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1>
<p>Hi, dear readers! I'm posting this article before the one related with the project because I realised it would be better to give a short introduction to new concepts before the real project.</p>
<p>That said, let's have a small introduction to <strong>Jetpack Compose</strong>.</p>
<h1>Jetpack Compose</h1>
<p><em>Jetpack Compose</em> is a modern toolkit to develop Android apps' UI. Compared to the old <a href="https://developer.android.com/develop/ui/views/layout/declaring-layout">Views</a> approach that uses XML, this is a lot easier and a less verbose way to create UIs and their functionalities.</p>
<p>Visual elements are created by using special functions called <strong>composable functions</strong>. These functions not just declare how an element looks, they also declare how it behaves. They increase code reusability and testing.</p>
<p>For a function to be considered a composable, it must be annotated by the <code>@Composable</code> annotation, and composable functions can only be called if the <code>@Composable</code> context exists somewhere up in the call stack.</p>
<p>There is also the <code>@Preview</code> annotation, as the name tells us, its purpose is to allow us to see a preview of the composable, but there is a restriction for functions with arguments: they must have default values.</p>
<h1>State Management</h1>
<p>A state is a value that can change anytime in the app. Composition is the description of the UI built by Jetpack Compose when it executes composables, taking the form of a tree of UI elements. This represents a state of the UI, and the only way to update it is to run the composables again due to the declarative nature of Jetpack Compose.</p>
<p>The first time a composable is executed it's called <em>initial composition</em>. When a state changes for a composable and it needs to be rebuilt, we call it <em>recomposition</em>.</p>
<p>Composables can use the <code>remember</code> API to store mutable or immutable objects in memory. The value is stored during the initial composition, and restored during recomposition.</p>
<p><code>mutableStateOf</code> creates an observable <code>MutableState&lt;T&gt;</code>, which is an observable type. The <code>MutableState&lt;T&gt;</code> interface contains a <code>value: T</code> field that schedules recomposition for all composables that read it when the value changes.</p>
<h1>Final Words</h1>
<p>In this article, we had a brief introduction to Jetpack Compose. This is enough to get started on Android projects, additional features are better learned in practice.</p>
<p>See you in the next article, happy coding.</p>
<h1>References</h1>
<p><a href="https://developer.android.com/compose">Jetpack Compose UI App Development Toolkit</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/mental-model">Thinking In Compose</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/state">State And Jetpack Compose</a></p>
<p><a href="https://developer.android.com/develop/ui/compose/lifecycle">Lifecycle Of Composables</a></p>
<p>EOF</p>
]]></content:encoded></item><item><title><![CDATA[Android Fundamentals: App Components]]></title><description><![CDATA[Introduction
Hi, it's been a while.
I know I promised I'd focus on projects instead of theory, but I promise to not be extensive and just give a small introduction to key components in Android apps.
A]]></description><link>https://blog.rmarcos.dev/android-fundamentals-app-components</link><guid isPermaLink="true">https://blog.rmarcos.dev/android-fundamentals-app-components</guid><category><![CDATA[Android]]></category><category><![CDATA[Kotlin]]></category><category><![CDATA[android development]]></category><category><![CDATA[Mobile apps]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Rafael Marcos]]></dc:creator><pubDate>Tue, 14 Jul 2026 02:09:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/697b6bcf5656f70c5ac1be47/99ab8751-e8cf-497c-88d4-406df57f04dd.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1>
<p>Hi, it's been a while.
I know I promised I'd focus on projects instead of theory, but I promise to not be extensive and just give a small introduction to key components in Android apps.</p>
<h1>Android Applications</h1>
<p>To build apps for Android systems, you need the tools in the Android SDK (Software Development Kit) that compile your source code to the <code>.apk</code> (Android Package) or <code>.aab</code> (Android App Bundle) formats. Android apps are written mainly in Java, Kotlin and C++.</p>
<p>The main difference between an <code>.apk</code> and an <code>.aab</code> is that the first one contains all resources needed by the Android application at runtime, while the second one has the contents of an Android project, including metadata. <code>.apk</code> files are used by the Android system to install apps, while the <code>.aab</code> is a publishing format, from which an <code>.apk</code> can be generated for the specific device requesting installation — from Google Play, for example.</p>
<p>Android is a multi-user system, where each application runs as a different user in a sandbox, with each application isolated from the others. Of course there are means to allow communication between apps, but this must be explicitly declared. Each app runs in its own process, but it's also possible to make apps share the same process, but, again, this must be declared explicitly.</p>
<h1>App Components</h1>
<p>An Android app can be built upon four main components: Activities, Services, Broadcast Receivers, and Content Providers.</p>
<p>Each component serves its own purpose, and they all can be an entry point for Android apps. Apps can expose their own components for others to use.</p>
<h2>Activity</h2>
<p>This component represents a single screen that the user directly interacts with when opening the app. An app can have multiple activities forming a cohesive flow. For example, a banking app might first bring you to the login screen, then the balance screen and then the transfer screen, etc, where each screen can be specified by an Activity.</p>
<p>This is the most common component in Android apps; you can do a lot with only this component.</p>
<h2>Service</h2>
<p>This component is more suitable for background long-term tasks like file downloading, audio playback, data sync, etc. Services can be started by other apps' components, an activity, for example, and they do not provide a user interface. There are two types of services: <em>Started</em> and <em>Bound</em>.</p>
<p><em>Started Services</em> run in the background until they finish their task. The user may or may not be aware of the service execution, and this impacts how the Android system manages memory. Audio playback is an example of a service that the user notices, so only in really necessary cases the Android system would kill it to reclaim memory, while background data sync the user would not even notice.</p>
<p><em>Bound Services</em> expose an API for inter-process communication. When an app binds to a service, the Android system prioritizes it at the same level as the app the user is interacting with.</p>
<h2>Broadcast Receiver</h2>
<p>This component allows your app to respond to events outside user interactions, even when not running. Imagine you want your app to perform an action when the device is turned on, when the battery is low, etc.</p>
<p>They are commonly used as a gateway for other components; they are intended to do as little work as possible. Apps can also send events through <em>Intents</em> to trigger other apps' Broadcast Receivers.</p>
<h2>Content Provider</h2>
<p>This component allows other apps to access another app's private data, following the rules the app states. For example, an app that allows you to choose a profile picture from your gallery can access the pictures from the gallery app's content provider.</p>
<p>Content Providers are often mistaken for database abstractions, but they are actually a URI-based interface for sharing data across apps. This data can be from a database, internal storage, files, network, etc.</p>
<h2>Intents</h2>
<p>Android apps cannot interact directly because the Android system architecture isolates them. This is where Intents come into play.</p>
<p>Intents act like messengers between the components, and are delivered by the system to their targets.</p>
<p>Intents can be <em>explicit</em> (specify a component) or <em>implicit</em> (specify a type of component). For example, a note-taking app can use an explicit intent to open the screen to show a specific note's content, and an implicit intent when you click the share button to allow you to choose which app you'd like to use to share your notes.</p>
<h1>Final Words</h1>
<p>In this article, we gave a brief introduction to Android app components. I also wanted to introduce Jetpack Compose here, but this is more suitable for the next article (spoiler: It's a project).</p>
<p>Thanks for your attention, see you in the next article.</p>
<h1>References</h1>
<p><a href="https://developer.android.com/guide/components/fundamentals">Application fundamentals</a></p>
<p><a href="https://developer.android.com/guide/components/activities/intro-activities">Introduction to Activities</a></p>
<p><a href="https://developer.android.com/develop/background-work/services">Services Overview</a></p>
<p><a href="https://developer.android.com/develop/background-work/background-tasks/broadcasts">Broadcasts Overview</a></p>
<p><a href="https://developer.android.com/guide/topics/providers/content-providers">Content Providers</a></p>
<p><a href="https://developer.android.com/guide/components/intents-filters">Intents And Intent Filters</a></p>
<p>EOF</p>
]]></content:encoded></item><item><title><![CDATA[Android Fundamentals: The Series]]></title><description><![CDATA[Introduction
It's been so long since my first article, but I'm committing to posting more regularly.
This article introduces the Android Development Fundamentals series, a documentation of my path as ]]></description><link>https://blog.rmarcos.dev/android-fundamentals-the-series</link><guid isPermaLink="true">https://blog.rmarcos.dev/android-fundamentals-the-series</guid><category><![CDATA[Android]]></category><category><![CDATA[android app development]]></category><category><![CDATA[Android Studio]]></category><category><![CDATA[android apps]]></category><category><![CDATA[android development]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[Kotlin]]></category><dc:creator><![CDATA[Rafael Marcos]]></dc:creator><pubDate>Thu, 28 May 2026 12:36:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/697b6bcf5656f70c5ac1be47/f0b4b170-b762-410f-85a8-f1ac0b6fecc8.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1>
<p>It's been so long since my first article, but I'm committing to posting more regularly.</p>
<p>This article introduces the <strong>Android Development Fundamentals</strong> series, a documentation of my path as an Android developer. I hope this series also helps beginners like me to understand the fundamentals without feeling overwhelmed by the information available, especially from the updates that drastically change the way things are done.</p>
<h1>Who This Series Is For</h1>
<p>This series is for beginners in Android Development, not for beginners in programming, so at least the basics of Kotlin are necessary.</p>
<p>I don't plan to write articles introducing Kotlin (yet), so if you don't know Kotlin, I recommend learning it on your own from a course, book, etc. The <a href="https://kotlinlang.org/docs/getting-started.html">official documentation</a> is a good starting point. Come back when you learn what a <strong>class</strong>, <strong>data class</strong>, <strong>lambda</strong> and <strong>higher-order function</strong>, <strong>List</strong>, <strong>MutableList</strong> are.</p>
<h1>Topics and Methodology</h1>
<p>First I'll cover the Android system architecture and the main components of apps. Then we'll introduce Jetpack Compose, its basic composables and modifiers, recomposition concept, navigation, tests, API requests, storage... you know, the fundamentals you probably saw in a roadmap before landing here.</p>
<p>For each article, I want to be more practical, so I'll give just enough theory at the start of the articles, then we'll build a small project from that and integrate the rest of the theory in a more natural way. Practicing, committing mistakes, and solving them is more efficient, so let me warn you that you're going to find errors not mentioned in the articles during your implementations. I encourage you to read the error messages, search for them to understand what is going on and solve them.</p>
<p>The source code of all projects will be available on my GitHub, so feel free to explore it. The link to the repository and my references will be at the end of my articles.</p>
<h1>Asking Questions</h1>
<p>If something is confusing or not clear in the article, feel free to ask, but first, I recommend you try to find it by yourself. This is an important skill for developers, especially in the AI era. Sometimes we ask questions that already have answers and can be found with a quick Google. Beginners tend to do that because they don't even know about that, so I want to make sure you develop this skill early.</p>
<p>I'm not saying you cannot ask questions and try to solve everything alone, I'm just saying that you should at least check if someone else had the same problem (99% of the cases the answer is yes). I recommend reading <a href="https://stackoverflow.com/help/how-to-ask">this article</a> for better understanding.</p>
<p>AI is also a great tool, but be careful when using it. AI commits mistakes in a confident way — the more you know about the topic, the more you can spot the lies — so at least complement the answer with parallel research.</p>
<h1>Final Words</h1>
<p>I hope this series helps you learn Android development, and I will do my best to write clear, concise articles and readable code.</p>
<p>See you in the next article, subscribe and tell me in the comments why you chose to learn Android Development in the first place.</p>
<p>EOF</p>
]]></content:encoded></item><item><title><![CDATA[Hello World: My Journey From The First Line Of Code And Future Plans]]></title><description><![CDATA[Curiosity is important for programmers, but without consistency and focus, you'll end up wasting time or achieving below-average results. This is my first time blogging, a step I’ve contemplated for years. Now, I’ve finally found the courage to share...]]></description><link>https://blog.rmarcos.dev/hello-world-my-journey-from-the-first-line-of-code-and-future-plans</link><guid isPermaLink="true">https://blog.rmarcos.dev/hello-world-my-journey-from-the-first-line-of-code-and-future-plans</guid><category><![CDATA[programming]]></category><category><![CDATA[#programming journey]]></category><category><![CDATA[Biography]]></category><category><![CDATA[Career]]></category><dc:creator><![CDATA[Rafael Marcos]]></dc:creator><pubDate>Sun, 01 Feb 2026 02:52:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/g5jpH62pwes/upload/07a03a56d60cd822e16c36ba9810d833.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Curiosity is important for programmers, but without consistency and focus, you'll end up wasting time or achieving below-average results. This is my first time blogging, a step I’ve contemplated for years. Now, I’ve finally found the courage to share my learnings and document my experiences, including some interesting projects.</p>
<p>From the title, you might think I'm a senior developer or someone with extensive market experience, but I’m still on my journey. This first article explores my path in the programming world and the lessons I’ve learned over the past decade since writing my first line of code at 14. Take your coffee and join me as I share my story and insights. What has your journey been like?</p>
<h1 id="heading-what-brought-me-here">What Brought Me Here?</h1>
<h2 id="heading-natural-curiosity">Natural Curiosity?</h2>
<p>Like any child, I was curious. Period. I had a passion for science and inventions. After cartoons, I’d spend all day watching documentaries about animals, biology, chemistry, history, technology, the cosmos, etc. I know, it sounds nerdy, but those were my interests. I also loved to do experiments at home, observing bugs (once I was late to class because I stopped on the way to watch a spider eat). Who never messed up the electrical installation due to an electrical experiment? Please, tell me I was a normal kid.</p>
<p>Now, as an adult, I see that I have lost part of this genuine thirst for knowledge. I’m trying to recover at least part of it, but responsibilities require time and energy, and both are scarce. Maybe I just finished the learning process every child goes through, I don’t know, but I miss watching “Cosmos: A Spacetime Odyssey”.</p>
<h2 id="heading-sci-fi">Sci-Fi?</h2>
<p>I LOVED Sci-Fi, especially those with hackers and scientists who make spaceships and robots. I always dreamed of being like those characters, inventing anti-gravity, jetpacks, time machines, portals, flying cars… Sci-Fi stuff.</p>
<p><a target="_blank" href="https://www.imdb.com/title/tt3560060/">CSI Cyber</a> and <a target="_blank" href="https://www.imdb.com/title/tt3514324/?ref_=fn_t_1">Scorpion</a> were my favorite series in my teenage years; unfortunately, they were canceled. Yes, I didn’t mention <a target="_blank" href="https://www.imdb.com/title/tt4158110/?ref_=fn_i_1">Mr. Robot</a> because after entering high school, I was more into anime, so… sorry, I’m ashamed to admit that I never finished the first season, but I know its reputation.</p>
<h2 id="heading-informatics-course">Informatics Course?</h2>
<p>In my 11s, a friend convinced me to attend an informatics course. It was free (except for the registration fee). I asked my dad, and I started the course. There, I learned the basics of Microsoft Office, and PowerPoint was my favorite module.</p>
<p>Before that, I only remember playing games on my father’s laptop at the same age and on my brother’s computer when I was 9. I remember that my father’s computer suffered from high memory usage because I opened and minimized the games for days. Dozens of processes for each game were still open, and I thought that "suspend the computer" meant "turn off."</p>
<p>Anyway, unfortunately, I missed the day we were to learn how to use the internet, but it made no difference. After getting the certificate, I asked my aunt for a computer (thank God I didn’t ask for a PS3), and after months of waiting, I got my own notebook. Windows 8 was different from what I was used to in the informatics course, but I adapted quickly.</p>
<p>I used it for playing games, recording videos, and creative work (painting, video editing, and music creation). I used my computer a few times per month only for these purposes, as we had no internet at home at that time (at least no Wi-Fi).</p>
<h1 id="heading-first-steps">First Steps</h1>
<h2 id="heading-how-to-become-a-hacker">“How to become a hacker“</h2>
<p>I spent most of my mom’s mobile data searching about this. I read many tutorials, especially from <a target="_blank" href="https://www.wikihow.com">WikiHow</a>. When I got my first smartphone in 2014, I installed an app that compiled many tutorials. I learned some concepts of cybersecurity, hacker slang, command prompt, HTML, and some basic batch scripts. I didn’t want to use ready-to-use tools because I read that real hackers should be able to create their own tools, and being a script kiddie was shameful, as you’d be limited by your tools.</p>
<p>In the journey to become a true hacker, I discovered programming languages. Python caught my attention because it was described as “easy to learn, but powerful.” I didn’t know what that meant, but it sounded cool.</p>
<h2 id="heading-print-hello-world">print “Hello World“</h2>
<p>My first “Hello World” came to life in 2016, in a Python interpreter for Android. I used that app and an offline tutorial from <a target="_blank" href="https://python.org.br/">Python Brasil</a> to learn the basics. “What about your computer?” you may be asking. It is still in good condition, thanks for asking (if you did).</p>
<p>I was coding on my phone because I didn’t have constant access to the internet. I could download the Python interpreter for Windows months later at my classmate’s house. After receiving a modem from my sister-in-law (for mobile data), I could explore a little more.</p>
<h2 id="heading-some-meaningful-projects">Some meaningful projects</h2>
<p>From what I can remember, I tried to make games in Python with <a target="_blank" href="https://www.pygame.org/docs/">Pygame</a>, but I struggled to animate the characters from the frame images. I made a single-level game that didn’t look like a real game because it didn’t have collectibles or enemies, but it was a good enough copy of Super Mario. I was creating a second level, but the frame animation frustrated me, so I abandoned this project (my graveyard is full of them).</p>
<p>I also remember playing with sockets and file I/O. I made some trashy GUI projects and tried to create a file editor, but it was just a script that read everything from STDIO and then wrote it to a file specified at initialization.</p>
<p>Playing with sockets was the most fun part; I even made a RAT where the client was on my phone running in the Python interpreter app.</p>
<h1 id="heading-high-school">High School</h1>
<h2 id="heading-the-deception">The deception</h2>
<p>In 2017, I entered high school with high expectations about the content. I thought we’d learn how to program from the first day or even disassemble computers, but I was surprised by the focus on theory. I already knew the history of computers from the informatics lessons I had since the 7th grade, but I didn't even imagine there were other numerical systems beyond decimal and binary, or the concept of algorithms and the different areas in technology. It was disappointing at the time, but now I know how useful this knowledge is.</p>
<h2 id="heading-learning-c-and-visualg-before-everyone">Learning C and VisuAlg before everyone</h2>
<p>In the first year, the teacher told us which languages we’d learn each year. At that time, school ran from February to November/December. C was planned to be taught in the second year, but I learned it in the first year from the book the teacher recommended: <a target="_blank" href="https://www.amazon.com.br/Linguagem-C-Lu%C3%ADs-Damas/dp/8521615191">Linguagem C - Luis Damas</a>. Don’t worry about looking for it if you don’t speak Portuguese.</p>
<p>I liked learning C more than Python. I felt like all my doubts were being answered. In Python, you have a high level of abstraction, and many concepts are hidden, while in C, you are forced to know the basics. That’s why I recommend C for beginners. I finished the book, but in high school, we only reached the topic of vectors and matrices. Not even pointers were mentioned, only variables, loops, vectors, and matrices concepts.</p>
<p><a target="_blank" href="https://visualg.com.br/">VisuAlg</a> was introduced in the middle of the first year. It was a pseudocode language like <a target="_blank" href="https://portugol.dev/">Portugol</a>. VisuAlg is based on Pascal syntax, not so different from C.</p>
<h2 id="heading-c-html-css-javascript-php-and-mysql">C#, HTML, CSS, JavaScript, PHP and MySQL</h2>
<p>In the middle of the second year, I had a brief introduction to C# due to school lessons, but it was so quick that I didn’t even bother to learn it, and there were new concepts that seemed too complex to me.</p>
<p>I updated my HTML knowledge to HTML5 and learned the basics of CSS and JavaScript from Gustavo Guanabara's lessons (the teacher of all programmers… at least the ones who speak Portuguese). At school, we were introduced to PHP and used DreamWeaver (even at that time, it was too old for senior developers). The drag and drop wasn’t my style, so I learned the language basics from one of my downloaded PDFs and did all school exercises manually.</p>
<p>I also learned MySQL (also from teacher Guanabara). At that time, I thought I was born to be a backend developer; creating interfaces wasn’t my vibe, which is why I delegated this task to someone else in the final project.</p>
<h2 id="heading-my-story-with-assembly">My story with Assembly</h2>
<p>After learning C, I developed a liking for raw languages and the control they provided, so I tried some Assembly. I didn’t get very far because the complexity was too high for my level, but I learned how to read a string from STDIN, convert strings to integers, perform basic operations (addition, subtraction, multiplication, and division), convert the result to a string, and print it on STDOUT.</p>
<p>I even dared to try to create an operating system, but the materials were beyond my comprehension, and the tutorial I followed on keyboard events and printing text on the screen. I loved doing that, and maybe one day I’ll do it again. If you are interested, take a look at <a target="_blank" href="https://github.com/Tesla-J/Zenity-OS">ZenityOS</a>.</p>
<h2 id="heading-survivor-projects">Survivor projects</h2>
<p>From the projects I made in high school, these two are the ones I cared enough to save on GitHub:</p>
<p><a target="_blank" href="https://github.com/Tesla-J/Electrosfera">Electrosfera</a>: This project simulates a power company, and the main goal was to implement CRUD operations. I used obsolete code and even hid the warnings because I was doing it under pressure and applying the <a target="_blank" href="https://extremegohorse.com/">Extreme Go Horse</a> methodology.</p>
<p><a target="_blank" href="https://github.com/Tesla-J/asclepio-site">Asclepio Site</a>: This was the final project. It was developed to allow parents to check their son's grades online. Many of them don’t have time on Saturdays to attend the meetings that happen twice a year, so being able to do it online, along with a summary of the behavior, was proposed as a solution.</p>
<h1 id="heading-college">College</h1>
<h2 id="heading-java-loved-by-some-and-hated-by-everyone">Java: Loved by some and hated by everyone</h2>
<p>In 2021, during the first semester, I reviewed everything I learned in high school. From the second semester, we started using Java. I studied it in advance after finishing high school because I was interested in Android development. I don't know why everyone hates Java online; it is a great language. <a target="_blank" href="https://github.com/Tesla-J/t-come">This</a> is one of the projects I made in Java in college. It's nothing fancy or usable, but it was enough to get approved.</p>
<p>In the second year, we did a web project in Java. At first, I tried to do it manually using <a target="_blank" href="https://www.oracle.com/java/technologies/jspt.html">JSP</a>, but it wasn’t working, so I tried Spring Boot. From that day on, I changed my mind about frameworks, as I could focus more on functionalities.</p>
<h2 id="heading-kotlin">Kotlin</h2>
<p>Kotlin was getting popular; it became the new standard for Android development. When I had to do a project with Spring Boot, I had the idea to test the interoperability between Java and Kotlin. First, I tried to do it on Eclipse, but I was getting errors. Then I discovered IntelliJ IDEA from JetBrains, and I fell in love with that IDE. I don't use anything else but IntelliJ for Java/Kotlin projects.</p>
<p><a target="_blank" href="https://github.com/Tesla-J/the-syndicate">This</a> is the project, by the way. It’s a platform to sell organs on the Deep Web (of course it's not real). My partner and I didn’t finish all the functionalities. We also wanted to access it via TOR and put it online during the defense, but it didn’t work.</p>
<h2 id="heading-php-again">PHP again?</h2>
<p>In college, I had two subjects related to web development. We had to use pure PHP at first. I used the opportunity to learn Docker and MongoDB. Docker was intuitive, but MongoDB was a nightmare. The documentation stated one thing, and it didn’t work. It took me too much time to figure out how to use it from non-official resources. In <a target="_blank" href="https://github.com/Tesla-J/otaku-oo">this</a> project, I made a forum about animes (or it was supposed to be, I didn’t finish), and in <a target="_blank" href="https://github.com/Tesla-J/data-euro">this one</a>, it was supposed to be a website to check Euro 24 competition information. I enjoyed doing the UI too much, so I neglected the backend, especially the last one where I decided to learn <a target="_blank" href="https://tailwindcss.com/">TailwindCSS.</a></p>
<p>In the other subject, we had to use a PHP framework. I chose Laravel, but I couldn’t finish the project, unfortunately. I was having problems during the development process, and I was so exhausted by all of it that my productivity multiplied by absolute zero. Fortunately, I got a good grade to pass, thanks to the teacher!</p>
<h2 id="heading-data-structures-amp-algorithm-and-competitive-programming">Data Structures &amp; Algorithm and Competitive Programming</h2>
<p>During the lockdown in 2020, I read somewhere that the fundamentals of Data Structures &amp; Algorithms are essential for any programmer. I was studying Java, so I learned the basic data structures, how to build them, and their pros and cons.</p>
<p>I should have learned it deeply because the next year I was about to discover competitive programming. For those who don’t know what it is, you probably know <a target="_blank" href="https://leetcode.com/problemset/">Leetcode</a> (I expect, this is the most famous platform). There, you solve programming problems, and your solution is heavily tested and ranked according to performance. Of course, there is a time limit in which your solution must return the answer!</p>
<p>From my experience, Leetcode isn’t the main choice among competitive programmers. It’s more for those who want to practice for tech interviews at Big Techs like Amazon, Google, and Meta. <a target="_blank" href="https://codeforces.com/">Codeforces</a>, <a target="_blank" href="https://vjudge.net/">Vjudge</a>, and <a target="_blank" href="https://atcoder.jp/">Atcoder</a> are the ones I see the most, but there are dozens or even hundreds of them, but the principle is the same: solve problems in the most efficient way quickly.</p>
<p>In college, I had the opportunity to participate in the regionals of <a target="_blank" href="https://icpc.global/">ICPC</a>, where each university is represented by at most three teams with three members each. I also heard about <a target="_blank" href="https://ioinformatics.org/">IOI</a> and others, but I couldn’t participate, so I didn’t care about them. Unfortunately, in my three participations, my team couldn’t qualify… that’s sad, but it happens. Now I sometimes participate in Codeforces weekly contests, and seldom in Leetcode weekly or biweekly contests. I noticed a small improvement in my abilities; maybe one day I will get into the top 100, 10, or even first place.</p>
<p>Competitive programming was a game changer in my life as a programmer. I still have a lot to improve, but my problem-solving skills increased a lot. I recommend this practice at least as a hobby. You don’t need to participate in weekly contests; not everyone has time for that. You can do a virtual participation (do past contests) or just solve individual exercises. In Codeforces and Atcoder, you can see the editorial if you get stuck and don’t know how to solve a problem (not in the middle of the contest, obviously), but on Leetcode, you can only see the solutions after submitting one that gets accepted. But don’t worry, YouTube is full of solutions for Leetcode problems.</p>
<h1 id="heading-getting-my-first-car-in-two-months-as-a-freelancer">Getting My First Car In Two Months As A Freelancer</h1>
<p>I wish it were that easy :’).</p>
<p>During the lockdown, I decided to try freelancing. I had just turned 18 and wanted to make some money (and upgrade my computer). I chose platforms that supported Payoneer because PayPal wasn’t an option due to its limitations in my country. Almost no payment service supported transactions in my country, which was frustrating.</p>
<p>I first tried Workana. It has an approval process for new freelancers. I waited for weeks for an answer. I could have paid for a faster review, but I didn’t want to (I was broke anyway). I logged out and never returned, so I don’t know whether I got approved or not. <a target="_blank" href="https://www.fiverr.com/users/rafaelmarcos19">Fiverr</a> and <a target="_blank" href="https://www.upwork.com/freelancers/~01e3c18defcdbc0280">Upwork</a> gave me the best results, especially Fiverr.</p>
<p>I admit I wasn't even at a Junior level at that time, but I was confident I could do basic jobs (probably that was the reason Workana was taking so long to review my profile). I created all these accounts in 2021, but I only decided to be more serious in 2024, when I got my first clients.</p>
<p>On Fiverr, I did some basic Java tasks. My clients were all college students, and they were paying me to do their homework. From these jobs, I learned more about <a target="_blank" href="https://www.geeksforgeeks.org/system-design/solid-principle-in-programming-understand-with-real-life-examples/">SOLID</a> principles and design patterns, and I increased my skills in software engineering. Their teachers provided a source code that the students had to modify to meet the project requirements. The project I enjoyed the most was the HTML validator. I got excited when I heard about it because, in my Data Structure &amp; Algorithms studies, I had already seen something related when I read the chapter about stacks. Of course, I struggled with the GUI, but it worked perfectly.</p>
<p>After some time, I decided to move to Android app modifications. I got one client and was able to meet his expectations. My smartphone was stolen, and my computer couldn’t handle the emulator without running out of memory. My mother wouldn’t let me test on her device (I took it sometimes when she wasn’t aware, but not enough time to study). I had to rely on <a target="_blank" href="https://waydro.id/">Waydroid</a> to test the apps. The RAM usage was slightly better, but the virtual device was rebooting constantly, and sometimes bugs happened in the system.</p>
<p>Working on Fiverr was challenging, but Upwork was worse (my fault). I got two jobs there. The first was a bug fix for an Android app; the client was trying to modify the UI from another thread that was listening for socket communication. The second and last one was to build a quiz creator website to play in an Android app with the possibility of exporting to PDF. I shouldn’t have accepted that job. I promised an unrealistic deadline, couldn’t finish the project, and even ignored the client for days… until he canceled the job and my account was locked. I only got the courage to try to unlock my account one year later, but at least I learned that lying just to get a client doesn’t work; that’s not professional.</p>
<h1 id="heading-the-answer-to-the-ultimate-question-of-life-the-universe-and-everything">“The Answer to the Ultimate Question of Life, the Universe, and Everything“</h1>
<p>In 2023, I started my admission process at <a target="_blank" href="https://42luanda.com/">42 Luanda</a>, one of the campuses of the 42 Network. You don’t know what it is? Let me introduce you to the best programming school in the world.</p>
<p>In a few words, 42 is a programming school founded by (checking notes) Xavier Niel, Nicolas Sadirac, Kwame Yamgnane, and Florian Bucher in 2013 in Paris. It differs from traditional institutions because you don’t have teachers; you learn from your peers. It’s open 24/7 and it’s free forever. There, you have all the infrastructure you might need to learn programming, and the assurance that after finishing the mandatory part of their curriculum, you’ll have an almost 100% chance of getting a job. That’s almost 100% because some students start their own companies. They are the most inclusive institution you may find, and the content you learn is the same on all campuses. Ok, I don’t want to explain here something you can check on <a target="_blank" href="https://42.fr/en/homepage/">their website</a>.</p>
<p>During the lockdown (ok, this is the last time), I found out about the school from Fabio Akita, but a campus would open only 3 years later (the inauguration plans were delayed thanks to COVID). The admission process was long and challenging, especially the piscine (the last step). They want to make sure you really want it and can adapt to their methodology. It doesn’t matter if you are a senior software engineer or a computer scientist; this is not a guarantee you will get approved. Other factors matter, and the requirements to pass are still a secret.</p>
<p>In June 2025, I started my journey as a 42 student, and I must say that I’ve learned more in these few months than in years. Each project focuses on a single fundamental topic. Besides programming, you also have projects about system administration, networks, and games. Half of the projects are made in C, and the other half in C++ (some PHP for system administration projects, but there are at most two). The new curriculum is in Python, but it was implemented in December 2025, so not all were transitioned to the new common core (this is how the cursus is called).</p>
<p>After the common core, there is a mandatory internship, and then you have the choice to do a specialization. They are internationally recognized specializations; in Europe, they are at the same level as a Master's degree. I want to do a specialization, but I don’t know what to choose because they are all interesting. Maybe I’ll follow my dream to be a hacker and specialize in cybersecurity, or maybe in blockchain technology, or even mobile. I can do more than one specialization; maybe I’ll do those three aforementioned.</p>
<h1 id="heading-2026-and-beyond">2026 And Beyond</h1>
<p>First of all, I need to tackle the biggest problem in my life, the main reason why my skills haven't been sharp all these years: procrastination. Procrastination isn't laziness; it's a defense mechanism. To develop discipline and be consistent in practice, I first need to defeat my demons.</p>
<p>I started this blog not just to post about my experiences at 42, but also as a way to document my knowledge and share it with others. It's said that teaching is the best way to learn, and visualizing progress more clearly is also a good motivation.</p>
<p>42 Luanda projects, personal experiments, freelancing, competitive programming, Data Structures &amp; Algorithms, Android development... these are all topics I'm willing to talk about. I hope you enjoy my content and give your feedback; this way, I can improve the quality of my content and bring topics you're more interested in.</p>
<p>Happy coding, see you next time.</p>
<p>EOF</p>
]]></content:encoded></item></channel></rss>