<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Unskilled</title>
    <link>https://unskilled.blog/</link>
    <description>Recent content on Unskilled</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 07 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://unskilled.blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Are we augmented by AI yet?</title>
      <link>https://unskilled.blog/posts/are-we-augmented-by-ai-yet/</link>
      <pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/are-we-augmented-by-ai-yet/</guid>
      <description>&lt;p&gt;An update about AI-assisted coding was long overdue. Here is my fresh take about&#xA;it (until it changes again in 6 months). Actually, I started writing this in&#xA;January, but couldn&amp;rsquo;t get it right, came back to it multiple times. Things are&#xA;going so fast these days.&lt;/p&gt;&#xA;&lt;p&gt;I’ve been doing software engineering for the past 15 years, and code has been&#xA;part of my life for 25. I’ve seen enough shifts, hype cycles, abstractions,&#xA;and &amp;ldquo;this changes everything&amp;rdquo; moments to be cautious when a new one arrives.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Are we replaced by AI yet?</title>
      <link>https://unskilled.blog/posts/are-we-replaced-by-ai-yet/</link>
      <pubDate>Thu, 14 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/are-we-replaced-by-ai-yet/</guid>
      <description>&lt;p&gt;Sociologist Hartmut Rosa argues that modernitity isn&amp;rsquo;t just about going faster: it&amp;rsquo;s about acceleration. We accelerate on three fronts:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;technology,&lt;/li&gt;&#xA;&lt;li&gt;way of life,&lt;/li&gt;&#xA;&lt;li&gt;tempo of social change, driven by external economic and cultural forces.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;LLM coding hits the technical acceleration pedal hard. But here&amp;rsquo;s the paradox: as speed rises, understanding falls.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How much is a billion, really?</title>
      <link>https://unskilled.blog/shorts/how-much-is-a-billion-really/</link>
      <pubDate>Wed, 05 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/shorts/how-much-is-a-billion-really/</guid>
      <description>&lt;p&gt;This might sound like a dumb question in many countries, so let me explain. In most of Europe, a billion is not a billion. The word “billion” in French or German, or “billòn” in Spanish is a number called “trillion” in the US. That’s something Europeans just get used to. When you read billion in English, it means “milliard” in French. But why’s that?&lt;/p&gt;&#xA;&lt;p&gt;This is because of &lt;a href=&#34;https://en.wikipedia.org/wiki/Long_and_short_scales&#34;&gt;long and short scales&lt;/a&gt;, which are the names of these two power of ten naming systems - Europe and half of Africa are using large scale naming, aka Chuquet’s scale, and the US, Russia, the Middle East and the other half of Africa are using short scale naming.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On CAA and CNAME records</title>
      <link>https://unskilled.blog/shorts/on-caa-and-cname-records/</link>
      <pubDate>Sat, 14 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/shorts/on-caa-and-cname-records/</guid>
      <description>&lt;p&gt;This is something I knew but never realized all the implications of: CAA lookups&#xA;are not only about CAA records. They also involve CNAME records.&lt;/p&gt;&#xA;&lt;p&gt;First, a quick recap: CAA DNS records are used to specify which Certificate&#xA;Authorities (CAs) are allowed to issue certificates for a domain. For example,&#xA;specifying &lt;code&gt;letsencrypt.org&lt;/code&gt; in a CAA record means that only Let&amp;rsquo;s Encrypt is&#xA;allowed to issue certificates for that domain, and that other CAs should refuse&#xA;to do so.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using copy with strings</title>
      <link>https://unskilled.blog/shorts/using-copy-with-strings/</link>
      <pubDate>Sun, 18 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/shorts/using-copy-with-strings/</guid>
      <description>&lt;p&gt;The Go &lt;code&gt;copy&lt;/code&gt; built-in copies things from a source slice to a destination slice.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;copy&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;dst&lt;span style=&#34;color:#eceff4&#34;&gt;,&lt;/span&gt; src &lt;span style=&#34;color:#eceff4&#34;&gt;[]&lt;/span&gt;Type&lt;span style=&#34;color:#eceff4&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is not using generics, but &lt;code&gt;Type&lt;/code&gt; here serves the same purpose. Or does it?&lt;/p&gt;&#xA;&lt;p&gt;Not exactly! &lt;code&gt;string&lt;/code&gt; is a little-known exception:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;As a special case, [copy] also will copy bytes from a string to a slice of bytes.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Next time you need to work with strings while reusing a work buffer, &lt;code&gt;copy&lt;/code&gt; might just be the perfect candidate to avoid ugly for rune loops.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Splittable and unsplittable functions</title>
      <link>https://unskilled.blog/shorts/splittable-and-unsplittable-functions/</link>
      <pubDate>Tue, 13 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/shorts/splittable-and-unsplittable-functions/</guid>
      <description>&lt;p&gt;As I described in &lt;em&gt;&lt;a href=&#34;https://unskilled.blog/posts/preemption-in-go-an-introduction/&#34;&gt;Preemption in Go: an introduction&lt;/a&gt;&lt;/em&gt;, function prologues contain a stack bound check, which triggers a stack growth on failure. The stack guard can be poisoned with a specific value by the runtime to force a goroutine to enter the stack growth algorithm, which can detect the poisoning and give the runtime a chance to preempt the goroutine at a safe-point.&lt;/p&gt;&#xA;&lt;p&gt;However, there are ways to avoid preemption when needed. One of them is to use proc pinning, &lt;a href=&#34;https://unskilled.blog/posts/lets-dive-a-tour-of-sync.pool-internals/&#34;&gt;as &lt;code&gt;sync.Pool&lt;/code&gt; does&lt;/a&gt;, but that&amp;rsquo;s a bit heavy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding shorts</title>
      <link>https://unskilled.blog/shorts/adding-shorts/</link>
      <pubDate>Wed, 31 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/shorts/adding-shorts/</guid>
      <description>&lt;p&gt;I use this blog to write about things that interest me, and hopefully friends, colleagues and strangers on the internet.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, I don&amp;rsquo;t write as much as I would like to. Writing big, in-depth posts takes a lot of time and effort, and time is something I don&amp;rsquo;t have much of, having a full-time job, freelance activities, side projects, and a family to take care of. Or maybe I&amp;rsquo;m just lazy, don&amp;rsquo;t judge me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sūtor, nē supra crepidam</title>
      <link>https://unskilled.blog/shorts/s%C5%ABtor-n%C4%93-supra-crepidam/</link>
      <pubDate>Wed, 31 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/shorts/s%C5%ABtor-n%C4%93-supra-crepidam/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Sūtor, nē supra crepidam&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;This latin expression means &amp;ldquo;let not the shoemaker go beyond shoes&amp;rdquo;, and is the root of the word &lt;em&gt;ultracrepidarian&lt;/em&gt;, which describes someone that ignored this advice, giving opinions or advice on matters outside of their knowledge.&lt;/p&gt;&#xA;&lt;p&gt;But how can we know what we don&amp;rsquo;t know? &lt;em&gt;&amp;ldquo;For I was conscious that I knew practically nothing&amp;hellip;&amp;rdquo;&lt;/em&gt; allegedly said Socrates. The Dunning-Kruger effect cognitive bias shows that people with limited competence in a particular area tend to overestimate their skills, while experts in that area tend to underestimate their skills.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Brandolini&#39;s Law in the GPT Era</title>
      <link>https://unskilled.blog/posts/brandolinis-law-in-the-gpt-era/</link>
      <pubDate>Sun, 28 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/brandolinis-law-in-the-gpt-era/</guid>
      <description>&lt;p&gt;I went from not knowing what GPT meant to using such models daily in just a couple years, and I am not even an &amp;ldquo;AI engineer&amp;rdquo;. After nearly 15 years paying the rent doing software engineering, I am stuck in an abusive love-hate relationship with generative AI - shouldn&amp;rsquo;t I have known better?&lt;/p&gt;&#xA;&lt;p&gt;When I test models, I ask them tricky and complex questions, such as &amp;ldquo;list 10 things about golang preemption that no one knows about&amp;rdquo;. I tried this one on Claude 3.5 a few weeks ago, and it almost got me, although I consider myself as pretty knowledgeable about Go-related niche stuff. It came up with an obscure mechanism that I had never heard of, with a nice chart on the side. It was so well explained and believable that I ended up digging the source code to check if it was true. Of course, it wasn&amp;rsquo;t.&lt;/p&gt;</description>
    </item>
    <item>
      <title>noCopy convention</title>
      <link>https://unskilled.blog/posts/nocopy-convention/</link>
      <pubDate>Sun, 28 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/nocopy-convention/</guid>
      <description>&lt;p&gt;In this post I briefly explain what is the noCopy convention in Go, and when/how to use it. This is nothing new, it dates back from 2016, but I think it is worth mentioning, as it is kind of a hack and the reasoning behind it is not that obvious.&lt;/p&gt;&#xA;&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;The noCopy convention is a way to tell linters that a structure should not be copied. End of the blog post. The rest of it is uninteresting details. Stop right there. You have been warned.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Coroutines in Go</title>
      <link>https://unskilled.blog/posts/coroutines-in-go/</link>
      <pubDate>Sat, 27 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/coroutines-in-go/</guid>
      <description>&lt;p&gt;Approximately a year ago, &lt;a href=&#34;https://research.swtch.com/coro&#34;&gt;rsc wrote about coroutines&lt;/a&gt;, and more specifically why we&amp;rsquo;d need them in Go, what should the API look like, and how they could be implemented. I was pretty skeptical about that post, but I think I&amp;rsquo;ve come around after seeing them used in the shiny new &lt;code&gt;iter&lt;/code&gt; package.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I&amp;rsquo;ll cover the current implementation of coroutines in Go, and their use in the &lt;code&gt;iter&lt;/code&gt; package.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Preemption in Go: an introduction</title>
      <link>https://unskilled.blog/posts/preemption-in-go-an-introduction/</link>
      <pubDate>Sun, 09 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/preemption-in-go-an-introduction/</guid>
      <description>&lt;p&gt;In my post about &lt;a href=&#34;https://unskilled.blog/posts/lets-dive-a-tour-of-sync.pool-internals/&#34;&gt;the &lt;code&gt;sync.Pool&lt;/code&gt; internals&lt;/a&gt;, I briefly touched on preemption, but I didn&amp;rsquo;t explain what it really is about. Let&amp;rsquo;s fix that.&lt;/p&gt;&#xA;&lt;p&gt;If you are in France, like me, you just completed your income tax declaration. If the go runtime is the tax administration, cpu-time is money, and preemption would be a letter of reminder. Or a bailiff banging on your door if you&amp;rsquo;ve been naughty.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-preemption&#34;&gt;What is preemption?&lt;/h2&gt;&#xA;&lt;p&gt;Preemption is one of the ways the go runtime ensures fairness. It distributes the time between all goroutines, so that no goroutine can take all the cpu resources and starve the others. Not only other goroutines could starve, but scheduling could also be delayed, so this could derail into serious problems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why am I doing it?</title>
      <link>https://unskilled.blog/posts/why-am-i-doing-it/</link>
      <pubDate>Sat, 03 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/why-am-i-doing-it/</guid>
      <description>&lt;p&gt;Why are so many of us staring at screens for hours, reading and writing code? What is the motivation behind it? I am not sure there is an universal answer to this question. Do we like solving problems? Do we like the feeling of creating something? Or do we like the feeling of being in control? That sounds like the beginning of a therapy session.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deconstructing Go&#39;s magical defer</title>
      <link>https://unskilled.blog/posts/deconstructing-gos-magical-defer/</link>
      <pubDate>Thu, 28 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/deconstructing-gos-magical-defer/</guid>
      <description>&lt;p&gt;This post is targetted at Go beginners, but can serve as a good refresher to more experienced gophers.&lt;/p&gt;&#xA;&lt;p&gt;When starting out, &lt;code&gt;defer&lt;/code&gt; feels magical, doesn&amp;rsquo;t it? Guess what: it&amp;rsquo;s not. In this blog post, we will let go of the magic to have a basic understanding of what is happening under the hood when using the &lt;code&gt;defer&lt;/code&gt; statement.&lt;/p&gt;</description>
    </item>
    <item>
      <title>This is your brain on false sharing</title>
      <link>https://unskilled.blog/posts/this-is-your-brain-on-false-sharing/</link>
      <pubDate>Tue, 05 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/this-is-your-brain-on-false-sharing/</guid>
      <description>&lt;p&gt;In this post, I make the case for being aware of false sharing situations in go. While &lt;a href=&#34;https://unskilled.blog/posts/lets-dive-a-tour-of-sync.pool-internals/&#34;&gt;diving into the &lt;code&gt;sync.Pool&lt;/code&gt; internals&lt;/a&gt;, I stumbled upon some structure padding, which I had never considered as very useful performance-wise. Here, we&amp;rsquo;ll have a succinct refresher about false sharing, a few examples with benchmarks, and try to draw conclusions from it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;refresher&#34;&gt;Refresher&lt;/h2&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re familiar with false sharing, skip to the next section. If you need more clarification on it, keep reading!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Let&#39;s dive: a tour of sync.Pool internals</title>
      <link>https://unskilled.blog/posts/lets-dive-a-tour-of-sync.pool-internals/</link>
      <pubDate>Sat, 25 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/lets-dive-a-tour-of-sync.pool-internals/</guid>
      <description>&lt;p&gt;In this post we will uncover what makes sync.Pool so damn good. You will get practical insights on how and when to use it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;code&gt;Pool&lt;/code&gt; implemention of the &lt;code&gt;sync&lt;/code&gt; package of Go&amp;rsquo;s standard library is a valuable asset to leverage. Deeply integrated with the runtime, it is an efficient way to lower allocations and relieve the garbage collector.&lt;/p&gt;&#xA;&lt;h2 id=&#34;general-usage&#34;&gt;General usage&lt;/h2&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start by looking at the general lifecycle of items. When creating a new Pool, you give it a &lt;code&gt;New func() any&lt;/code&gt;, that is responsible for allocating items. Consider the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bounds checking in Go</title>
      <link>https://unskilled.blog/posts/bounds-checking-in-go/</link>
      <pubDate>Wed, 15 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/bounds-checking-in-go/</guid>
      <description>&lt;p&gt;When accessing an element in a slice, you might go past its length. This is a typical off-by-one error, and fortunately there is a safeguard for this: &lt;strong&gt;bounds checking&lt;/strong&gt;. It protects you from buffer overflow attacks and tells you there&amp;rsquo;s something wrong with your code - so thank you, bounds checking. Before accessing the element, the index is compared with the slice&amp;rsquo;s length to make sure it is &lt;em&gt;within bounds&lt;/em&gt;. If it is not, &lt;code&gt;runtime.panicIndex()&lt;/code&gt; is called!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generics in Go: functional programming is finally here</title>
      <link>https://unskilled.blog/posts/generics-in-go-functional-programming-is-finally-here/</link>
      <pubDate>Thu, 02 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/posts/generics-in-go-functional-programming-is-finally-here/</guid>
      <description>&lt;p&gt;Go 1.18 introduces generics as part of the language. This post describes how to use it and look at how it enables functional programming.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://unskilled.blog/about/</link>
      <pubDate>Fri, 26 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://unskilled.blog/about/</guid>
      <description>&lt;p&gt;Welcome to my personal blog. I am a software engineer living in France, and I worked in the entertainment industry for 11 years before joining &lt;a href=&#34;https://www.botify.com/&#34;&gt;botify.com&lt;/a&gt; to passionately work with Go and genuinely nice and smart people. My work there is mostly about building systems to manage traffic and render webpages at scale, and I love it.&lt;/p&gt;&#xA;&lt;p&gt;Did you spot an error? Awesome. Just want to say hi? Please do at &lt;a href=&#34;mailto:hello@unskilled.blog&#34;&gt;hello@unskilled.blog&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
