<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>caiocdcs | blog</title>
    <subtitle>Technical writing about programming, software development, and the tools that make our work better</subtitle>
    <link rel="self" type="application/atom+xml" href="https://caiocdcs.github.io/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://caiocdcs.github.io"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-03T00:00:00+00:00</updated>
    <id>https://caiocdcs.github.io/atom.xml</id>
    <entry xml:lang="en">
        <title>A Year Using AI to Code</title>
        <published>2026-01-03T00:00:00+00:00</published>
        <updated>2026-01-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://caiocdcs.github.io/blog/my-ai-journey/"/>
        <id>https://caiocdcs.github.io/blog/my-ai-journey/</id>
        
        <content type="html" xml:base="https://caiocdcs.github.io/blog/my-ai-journey/">&lt;p&gt;Last year started using AI tools more seriously. Thought it&#x27;d be another productivity fad that would fade away. It didn&#x27;t.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;early-2025&quot;&gt;Early 2025&lt;&#x2F;h2&gt;
&lt;p&gt;Beginning of 2025 mostly ignored the autocomplete stuff. Partly didn&#x27;t want another subscription, partly stubborn, and partly didn&#x27;t want to train myself to just accept whatever suggestions popped up. Tried some local alternatives but they were either way too noisy or just wrong most of the time.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually started using Copilot at work. It was decent for mechanical stuff - renaming fields across files, that kind of thing. Still had to review everything but cut down on the grind.&lt;&#x2F;p&gt;
&lt;p&gt;Then came MCP and started using Copilot more at work, learning about agents, MCPs, LLMs. Built a few toy ones. Interesting for a bit. One boring thing was learning how much prompts matter and how the world now depends on markdown files trying to guide AI agents to do things right. Love markdown so at least we don&#x27;t have a new language to learn for this.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;agents&quot;&gt;Agents&lt;&#x2F;h2&gt;
&lt;p&gt;Mid-year got access to Claude Code and that changed things. With Copilot was mostly in control, asking for help with side tasks; with an agent this changed. Could ask for more and type less but at the end still have to review code and sometimes it&#x27;s really bad code.&lt;&#x2F;p&gt;
&lt;p&gt;After so many years feel like my way of programming changed. Before spent time thinking and structuring how to code, trying to avoid clutter and keep the principles learned - KISS, SOLID. Tried many approaches: full TDD with red-green, starting with diagrams or class structures first. Nowadays have a mix that works but with an agent had to rethink this process.&lt;&#x2F;p&gt;
&lt;p&gt;Whenever want to use an agent, usually for boring tasks, need to spend time writing the first prompt. This is one of the main reasons AI sometimes makes programming boring - instead of writing structured code, writing prose hoping the AI gets it. No compiler for prompts, no type checker, just vibes. So many ways a prompt can go wrong.&lt;&#x2F;p&gt;
&lt;p&gt;Example - asked it to add tests and refactor something. It added tests but the wrong kind, just mocks testing that mocks got called, not actual behavior. The refactor added helper functions that looked clean but didn&#x27;t simplify anything. Ended up deleting most of it and rewriting the tests myself.&lt;&#x2F;p&gt;
&lt;p&gt;This happened multiple times. Agents produce plausible code but not necessarily maintainable code.&lt;&#x2F;p&gt;
&lt;p&gt;Also there&#x27;s setup fatigue. End up with style guidelines, project docs, how to run tests, commit format, all in markdown for the agent. Like having project notes but weird writing documents to tell a machine how to write code. Then preferences change and now maintaining those docs too. This will always be a work in progress because our way of coding is mutable and we&#x27;re always improving.&lt;&#x2F;p&gt;
&lt;p&gt;After finishing setup was using agents all the time - small modifications, tests, refactoring, learning. This part is good. The barrier to try new languages, frameworks, OS concepts dropped a lot. Can experiment with stuff that would&#x27;ve sat on the TODO list forever.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;october-burnout&quot;&gt;October Burnout&lt;&#x2F;h2&gt;
&lt;p&gt;Around October everything was AI. Work, commuting, feeds, blogs, conversations. Only escape was my wife - she works in arts and is not the most tech person, and that was honestly a breath of fresh air. Was helping with some AI discovery stuff and got overwhelmed.&lt;&#x2F;p&gt;
&lt;p&gt;Just stopped at some point. No model news, no takes, no comparisons. Focused on other things.&lt;&#x2F;p&gt;
&lt;p&gt;Got into self-hosting during that break and really liked it. Used AI to learn Proxmox faster (already knew Linux but Proxmox has quirks), built some small tools - tracking media, importing recipes to Mealie, random glue scripts. Nothing fancy but satisfying.&lt;&#x2F;p&gt;
&lt;p&gt;During the break saw many developers going from ignoring AI to being excited and starting to do cool stuff with it. And as new models launched at the end of the year they were even better.&lt;&#x2F;p&gt;
&lt;p&gt;This is where AI works well - lowers barrier to experimentation. Can try things that would&#x27;ve been postponed indefinitely. But try to treat it like a study partner, not copy-paste machine. If don&#x27;t understand what it generated, slow down.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-works-now&quot;&gt;What Works Now&lt;&#x2F;h2&gt;
&lt;p&gt;Past the hype. Here&#x27;s what stuck:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Code reviews&lt;&#x2F;strong&gt; - catches mechanical stuff like &quot;this path returns without releasing a resource&quot;. Not deep insights but helpful on tired days. Don&#x27;t want AI writing and AI reviewing but as extra eyes for boring checks? Works.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Learning&lt;&#x2F;strong&gt; - when in unfamiliar territory helps get unstuck. Gives starting points and vocabulary to ask better questions.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Test scaffolding&lt;&#x2F;strong&gt; - if know what to test, generates decent boilerplate. If let it decide what matters, get useless tests. So write the test cases, it handles setup code.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Scripts&lt;&#x2F;strong&gt; - quick one-offs, migrations, boring automation. Usually verbose but beats starting from scratch.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-bothers-me&quot;&gt;What Bothers Me&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Tech debt&lt;&#x2F;strong&gt; - great at &quot;make it work&quot;, bad at &quot;make it maintainable&quot;. Ship code that looks plausible, then six months later debugging abstractions that exist because they sounded good in prose. Can produce code faster means producing debt faster too.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;&#x2F;strong&gt; - running way more generated code now. More dependencies, more scripts. Containers help but not enough. &lt;a href=&quot;https:&#x2F;&#x2F;simonwillison.net&#x2F;2026&#x2F;Jan&#x2F;9&#x2F;sprites-dev&#x2F;&quot;&gt;Simon Willison writes about this&lt;&#x2F;a&gt; - need better local sandboxing.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Garbage code&lt;&#x2F;strong&gt; - barrier to shipping basically zero. Idea to deployed code very fast. Sounds great until realize it means garbage everywhere. Not code that breaks immediately - code that barely works, gets merged, then nobody understands why it exists later. More code being written faster doesn&#x27;t mean better software, sometimes just means more mess to clean up.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Niche areas&lt;&#x2F;strong&gt; - really specific domains in math, science, biology are still hard. Think this will improve but needs more data and experts guiding the process. Not an expert here though.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Real time info&lt;&#x2F;strong&gt; - AI getting better at searching internet but internet has a lot of bad information. Models present questionable info with confident tone. Now double-check more, especially security stuff or anything that looks too clean.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The prompt problem&lt;&#x2F;strong&gt; - when an agent fails it&#x27;s hard to debug. Don&#x27;t get a stack trace, get &quot;I interpreted your sentence differently&quot;. Sometimes fastest fix is stop prompting and start coding.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The data thing&lt;&#x2F;strong&gt; - why moving off GitHub. Microsoft trained Copilot on public repos (mine included, no permission) and now sells it back. Use AI tools but the &quot;take everyone&#x27;s code, ask later&quot; approach is annoying.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jobs&quot;&gt;Jobs&lt;&#x2F;h2&gt;
&lt;p&gt;Don&#x27;t know where this goes. Don&#x27;t want to be &quot;AI supervisor&quot; reviewing diffs all day. Like programming because like solving problems and building systems, not reading generated code.&lt;&#x2F;p&gt;
&lt;p&gt;Feel like jobs will change but don&#x27;t know to where. Hope it&#x27;s a place where can still code and not only write prompts and review diffs as most directors and VPs are leaning towards.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;now&quot;&gt;Now&lt;&#x2F;h2&gt;
&lt;p&gt;Still using AI, trying to be intentional. Reviews, learning, test boilerplate, scripts, everyday tasks - not just basics anymore, using it for more of the day-to-day coding work.&lt;&#x2F;p&gt;
&lt;p&gt;The shift isn&#x27;t &quot;AI writes my code now&quot;. It&#x27;s using it for more everyday stuff and spending more time reviewing. Balance went from writing most code myself to guiding and reviewing generated code, deciding what to keep, fix, or rewrite. And as models get better at general tasks, find myself relying on it more. Each new release handles more complex stuff and makes fewer obvious mistakes, so the trust increases even if the concerns don&#x27;t go away.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;This post ended up long and there&#x27;s nothing really new here - just random thoughts about the journey and things read and learned last year. The AI trend will continue this year and the burden to keep updated with the market and environment is real.&lt;&#x2F;p&gt;
&lt;p&gt;For now using AI for boring stuff - test boilerplate, documentation, scripts - and increasingly for everyday coding tasks. The balance shifted. Not writing all the core logic myself anymore, more reviewing what it generates and deciding what&#x27;s worth keeping. And as models keep getting better at handling general tasks, find myself using it more. Each release handles more complex stuff with fewer mistakes, so reliance increases even if concerns remain.&lt;&#x2F;p&gt;
&lt;p&gt;When writing prompts feels like a chore instead of programming, that&#x27;s the signal to close the chat and write code.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why I Like Garbage Collection</title>
        <published>2025-10-11T00:00:00+00:00</published>
        <updated>2025-10-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://caiocdcs.github.io/blog/gc/"/>
        <id>https://caiocdcs.github.io/blog/gc/</id>
        
        <content type="html" xml:base="https://caiocdcs.github.io/blog/gc/">&lt;p&gt;Coming from a Java background, I only started experimenting with Rust for personal projects last year, and now I&#x27;m exploring Zig. To understand what garbage collection really offers, I implemented the same problem in all three languages: Java (with GC), Rust (ownership), and Zig (manual memory management). The experience taught me why GC has survived since the 1960s, and why it still matters.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-gc-actually-solves&quot;&gt;What GC Actually Solves&lt;&#x2F;h2&gt;
&lt;p&gt;The trivial correctness of GC is worth the hassles, in most cases. You don&#x27;t have to worry about allocators or deallocators; things just work, without restriction. And it&#x27;s usually fast enough if you pay attention to your object usage patterns.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s the same pattern in each language - creating a list of objects:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;java&quot; class=&quot;language-java &quot;&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&amp;#x2F;&amp;#x2F; Java: just allocate and use
List&amp;lt;String&amp;gt; items = new ArrayList&amp;lt;&amp;gt;();
items.add(&amp;quot;hello&amp;quot;);
&amp;#x2F;&amp;#x2F; memory cleaned up automatically when unreachable
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&amp;#x2F;&amp;#x2F; Rust: ownership tracks cleanup
let mut items = Vec::new();
items.push(&amp;quot;hello&amp;quot;.to_string());
&amp;#x2F;&amp;#x2F; dropped automatically when out of scope
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;zig&quot; class=&quot;language-zig &quot;&gt;&lt;code class=&quot;language-zig&quot; data-lang=&quot;zig&quot;&gt;&amp;#x2F;&amp;#x2F; Zig: explicit allocation and deallocation
var list = std.ArrayList([]const u8){};
defer list.deinit(allocator); &amp;#x2F;&amp;#x2F; must remember to clean up
try list.append(allocator, &amp;quot;hello&amp;quot;);

&amp;#x2F;&amp;#x2F; zig 0.15.1 you need to use the same allocator for all allocations and to deallocate
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It&#x27;s a heavyweight solution, in terms of engineering, to a heavyweight problem. But GC isn&#x27;t magic - you can still get OutOfMemoryErrors if you keep appending data without releasing references. And in Java, you still need to pay attention to GC configuration, even though modern GCs are much more powerful than they used to be and for each new version they continue to improve.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-gc-excels-cycles&quot;&gt;Where GC Excels: Cycles&lt;&#x2F;h2&gt;
&lt;p&gt;This is where GC really shines, and where alternatives struggle most. When you have complicated, potentially cyclic referencing where links are picked up and dropped all the time - exactly where you&#x27;re most likely to have memory leaks with manual or scope-based deallocation.&lt;&#x2F;p&gt;
&lt;p&gt;In Zig, I had to explicitly track allocations and think carefully about when to call &lt;code&gt;allocator.free()&lt;&#x2F;code&gt;. With complex data structures, it&#x27;s easy to leak memory if you lose track of a pointer:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;zig&quot; class=&quot;language-zig &quot;&gt;&lt;code class=&quot;language-zig&quot; data-lang=&quot;zig&quot;&gt;&amp;#x2F;&amp;#x2F; Zig: manual cycle handling
const Node = struct {
    data: i32,
    next: ?*Node,
};

const node = try allocator.create(Node);
node.* = .{ .data = 42, .next = null };
&amp;#x2F;&amp;#x2F; ... later, you must remember:
allocator.destroy(node);
&amp;#x2F;&amp;#x2F; If nodes reference each other, you need to carefully manage cleanup order
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Rust&#x27;s ownership system famously struggles with cycles too. Anyone who&#x27;s tried to write a linked list in Rust knows about &quot;Learning Rust With Entirely Too Many Linked Lists&quot; - it&#x27;s practically a rite of passage. You need &lt;code&gt;Rc&amp;lt;RefCell&amp;lt;&amp;gt;&amp;gt;&lt;&#x2F;code&gt; to create cycles:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&amp;#x2F;&amp;#x2F; Rust: cycles require reference counting
use std::rc::Rc;
use std::cell::RefCell;

struct Node {
    data: i32,
    next: Option&amp;lt;Rc&amp;lt;RefCell&amp;lt;Node&amp;gt;&amp;gt;&amp;gt;,
}

let node = Rc::new(RefCell::new(Node { data: 42, next: None }));
&amp;#x2F;&amp;#x2F; complex ownership, potential cycles still leak without careful weak references
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;java&quot; class=&quot;language-java &quot;&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&amp;#x2F;&amp;#x2F; Java: cycles handled automatically
class Node {
    int data;
    Node next;
}

Node node = new Node();
node.data = 42;
&amp;#x2F;&amp;#x2F; even if nodes form cycles, GC handles cleanup
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With reference counting approaches like Swift&#x27;s ARC or Rust&#x27;s &lt;code&gt;Rc&lt;&#x2F;code&gt;, you have to think it through super-carefully to avoid leaks. With GC? You hardly have to think at all. The GC tracks reachability from root objects, not individual references, so cycles get cleaned up automatically when the whole structure becomes unreachable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-gc-doesn-t-solve&quot;&gt;What GC Doesn&#x27;t Solve&lt;&#x2F;h2&gt;
&lt;p&gt;I learned this the hard way. We had a Java class that processed many large files, and somewhere in the processing pipeline, we weren&#x27;t closing some of the files properly. The GC handled the memory just fine, but we were leaking file handles. The problem only showed up during peak periods when we processed hundreds of files - suddenly, we couldn&#x27;t open any more files.&lt;&#x2F;p&gt;
&lt;p&gt;We had to review the code and restructure everything to use try-with-resources, making sure every file was explicitly closed. The GC gave us memory safety, but it didn&#x27;t save us from resource leaks.&lt;&#x2F;p&gt;
&lt;p&gt;This is where Rust&#x27;s RAII shines. When a &lt;code&gt;File&lt;&#x2F;code&gt; goes out of scope, it&#x27;s automatically closed:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&amp;#x2F;&amp;#x2F; Rust: file closed automatically
{
    let file = File::open(&amp;quot;data.txt&amp;quot;)?;
    &amp;#x2F;&amp;#x2F; use file...
} &amp;#x2F;&amp;#x2F; file closed here automatically
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;java&quot; class=&quot;language-java &quot;&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&amp;#x2F;&amp;#x2F; Java: must explicitly close
try (var file = new FileReader(&amp;quot;data.txt&amp;quot;)) {
    &amp;#x2F;&amp;#x2F; use file...
} &amp;#x2F;&amp;#x2F; file closed by try-with-resources
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;zig&quot; class=&quot;language-zig &quot;&gt;&lt;code class=&quot;language-zig&quot; data-lang=&quot;zig&quot;&gt;&amp;#x2F;&amp;#x2F; Zig: defer schedules cleanup
const file = try std.fs.cwd().openFile(&amp;quot;data.txt&amp;quot;, .{});
defer file.close(); &amp;#x2F;&amp;#x2F; you write the cleanup
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Zig takes a different approach - it gives you &lt;code&gt;defer&lt;&#x2F;code&gt; to schedule cleanup code, but you&#x27;re still responsible for thinking about it. GC languages require explicit resource management with try-with-resources or similar patterns. You get mental freedom from memory management, but you still need discipline for everything else.&lt;&#x2F;p&gt;
&lt;p&gt;Coming from Java to Rust and then Zig, I found each step required more explicit thinking about resources. In Java, I barely thought about memory. In Rust, the compiler forces you to think about ownership. In Zig, you&#x27;re on your own - the flexibility is liberating, but the responsibility is real.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s a psychological shift that happens along this journey. With Java, I trusted the GC to handle everything. Moving to Rust and then Zig, I had to let go of that trust and take control. At first it felt like a burden. Now? I kind of enjoy the power. There&#x27;s something satisfying about knowing exactly what your program is doing with memory, about having that level of control.&lt;&#x2F;p&gt;
&lt;p&gt;The overhead is real: more memory usage, runtime tracking costs, and read&#x2F;write barriers on every pointer access. But GC completely eliminates an entire class of bugs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-it-still-matters&quot;&gt;Why It Still Matters&lt;&#x2F;h2&gt;
&lt;p&gt;Garbage collection goes back to the 1960s with LISP. Interestingly, memory was too limited back then to use reference counting, which adds an extra counter to every object. Java was originally designed for severely memory-constrained environments like set-top boxes.&lt;&#x2F;p&gt;
&lt;p&gt;We have millions of times more memory now, even on single board computers. Increasing RAM and CPU cores make GC overhead less problematic. Modern machines can absorb the memory overhead and background collection work more easily. The overhead that mattered then matters less now.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-takeaway&quot;&gt;The Takeaway&lt;&#x2F;h2&gt;
&lt;p&gt;GC isn&#x27;t a mistake. It&#x27;s the only solution that is at once fully comprehensive and trivially easy for memory management. You don&#x27;t always want GC because sometimes control is important, but it&#x27;s a very good idea for general use.&lt;&#x2F;p&gt;
&lt;p&gt;The real limitation isn&#x27;t that GC exists - it&#x27;s that having solved the most ubiquitous resource problem, we sometimes forget we still need good ways to solve the other resource problems.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;McCarthy, John (1960). &quot;Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I.&quot; &lt;em&gt;Communications of the ACM&lt;&#x2F;em&gt;, 3(4), 184-195.&lt;br &#x2F;&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;367177.367199&quot;&gt;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;367177.367199&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Klabnik, Steve and Nichols, Carol (2023). &lt;em&gt;The Rust Programming Language&lt;&#x2F;em&gt;, 2nd Edition. No Starch Press.&lt;br &#x2F;&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;&quot;&gt;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Patterson, Andrew (2022). &quot;Zig: A programming language designed for robustness, optimality, and clarity.&quot;&lt;br &#x2F;&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;ziglang.org&#x2F;documentation&#x2F;&quot;&gt;https:&#x2F;&#x2F;ziglang.org&#x2F;documentation&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Jones, Richard, Hosking, Antony, and Moss, Eliot (2011). &lt;em&gt;The Garbage Collection Handbook: The Art of Automatic Memory Management&lt;&#x2F;em&gt;. Chapman &amp;amp; Hall&#x2F;CRC. ISBN: 978-1420082791&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hello World</title>
        <published>2025-09-30T00:00:00+00:00</published>
        <updated>2025-09-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://caiocdcs.github.io/blog/hello-world/"/>
        <id>https://caiocdcs.github.io/blog/hello-world/</id>
        
        <content type="html" xml:base="https://caiocdcs.github.io/blog/hello-world/">&lt;h2 id=&quot;why-i-m-writing&quot;&gt;Why I&#x27;m Writing&lt;&#x2F;h2&gt;
&lt;p&gt;This is my first blog post ever. After over a decade of developing software, I&#x27;ve never had the courage to write about it. I finally decided to take the leap.&lt;&#x2F;p&gt;
&lt;p&gt;Three things drove me to start this blog:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Solidify my understanding&lt;&#x2F;strong&gt;: Writing forces me to truly grasp what I&#x27;m learning&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Give back to the community&lt;&#x2F;strong&gt;: I want to contribute to the same community that taught me so much&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Push my boundaries&lt;&#x2F;strong&gt;: Writing sounds terrifying, but that&#x27;s exactly why I need to do it&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;topics&quot;&gt;Topics&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ll write about:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Programming languages exploration&lt;&#x2F;strong&gt; (currently Zig, but always trying new ones)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Java&lt;&#x2F;strong&gt; (work stuff)&lt;&#x2F;li&gt;
&lt;li&gt;Problems I&#x27;m solving&lt;&#x2F;li&gt;
&lt;li&gt;Tools that work&lt;&#x2F;li&gt;
&lt;li&gt;Things that don&#x27;t work&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;What&#x27;s Next&lt;&#x2F;h2&gt;
&lt;p&gt;Keep learning, keep sharing, keep growing.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading - I hope you&#x27;ll join this journey of continuous discovery and improvement. Happy coding!&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Want to stay updated? Subscribe to the &lt;a href=&quot;&#x2F;rss.xml&quot;&gt;RSS feed&lt;&#x2F;a&gt; or &lt;a href=&quot;&#x2F;atom.xml&quot;&gt;Atom feed&lt;&#x2F;a&gt; to never miss a post.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
