<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog – Victor Pierre</title><link>https://victorpierre.dev/blog/</link><description>Recent content in Blog on Victor Pierre</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 30 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://victorpierre.dev/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Code Comprehension in the Age of AI</title><link>https://victorpierre.dev/blog/code-comprehension-in-the-age-of-ai/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/code-comprehension-in-the-age-of-ai/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/code-comprehension-in-the-age-of-ai/tower-of-babel_hu_9b2154cea671d6d9.webp 720w, https://victorpierre.dev/blog/code-comprehension-in-the-age-of-ai/tower-of-babel_hu_3fa61db331cb99cc.webp 1280w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/code-comprehension-in-the-age-of-ai/tower-of-babel_hu_614813a99f7e15f0.jpg"
alt="The Tower of Babel by Pieter Bruegel the Elder (1563), a vast spiralling tower under construction, still unfinished at the top."
title="The Tower of Babel by Pieter Bruegel the Elder (1563), a vast spiralling tower under construction, still unfinished at the top." width="1280" height="937"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;The Tower of Babel&lt;/h4&gt;&lt;p&gt;Bruegel&amp;rsquo;s structure built faster than anyone could hold it in their head.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Until recently, understanding code was a byproduct of writing it. To implement a feature, however small, you first had to understand what you were trying to do, then work out how to do it, write the code, make mistakes, and fix them. Every line was written by you, every variable name chosen by you, every alternative carefully considered. You spent so much time thinking through how a feature should work and how it should fit into the existing code that, by the time you were finished, you understood it very well. When a bug was reported, I would instinctively know where to fix it. That&amp;rsquo;s how well I knew the codebases I used to work on.&lt;/p&gt;</description><category>opinion</category></item><item><title>What We Lose When We Build Alone</title><link>https://victorpierre.dev/blog/what-we-lose-when-we-build-alone/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/what-we-lose-when-we-build-alone/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/what-we-lose-when-we-build-alone/school-of-athens_hu_83656c590807cf81.webp 720w, https://victorpierre.dev/blog/what-we-lose-when-we-build-alone/school-of-athens_hu_736c0f29d408917e.webp 1280w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/what-we-lose-when-we-build-alone/school-of-athens_hu_21a2859cfedec5bc.jpg"
alt="The School of Athens by Raphael, depicting philosophers gathered in conversation and debate."
title="The School of Athens by Raphael, depicting philosophers gathered in conversation and debate." width="1280" height="993"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;The School of Athens&lt;/h4&gt;&lt;p&gt;Raphael&amp;rsquo;s fresco of philosophers thinking together, not alone.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Spend any time on LinkedIn and you get the impression that with AI, one person can now do the work of a team. Soon there will be one-person unicorns. Why hire engineers, designers, or product people when a founder with the right prompts can ship it all alone?&lt;/p&gt;</description><category>opinion</category></item><item><title>Aligning Go struct fields to save memory</title><link>https://victorpierre.dev/blog/struct-field-alignment/</link><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/struct-field-alignment/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/struct-field-alignment/composing-case_hu_8562cd28e457d9d4.webp 674w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/struct-field-alignment/composing-case_hu_e9b9e24152330ad3.png"
alt="A printer&amp;#39;s composing case: a wooden tray divided into compartments of different sizes, each holding a sort of movable type. The compositor packs the pieces so no space is wasted."
title="A printer&amp;#39;s composing case: a wooden tray divided into compartments of different sizes, each holding a sort of movable type. The compositor packs the pieces so no space is wasted." width="674" height="666"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;A printer&amp;rsquo;s composing case&lt;/h4&gt;&lt;p&gt;each sort of movable type packed so no space is wasted.&lt;/p&gt;</description><category>technical</category></item><item><title>Building a Personal Knowledge System with Obsidian</title><link>https://victorpierre.dev/blog/personal-knowledge-system/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/personal-knowledge-system/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/personal-knowledge-system/mexican-obsidian-blade_hu_f229603ad914b7ff.webp 720w, https://victorpierre.dev/blog/personal-knowledge-system/mexican-obsidian-blade_hu_cf94565413646774.webp 805w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/personal-knowledge-system/mexican-obsidian-blade_hu_20b096e3824e45b6.png"
alt="Aztec obsidian blade - Louis Petich Collection, 13th–16th century"
title="Aztec obsidian blade - Louis Petich Collection, 13th–16th century" width="805" height="310"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;Aztec obsidian blade&lt;/h4&gt;&lt;p&gt;Louis Petich Collection, 13th–16th century.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I tend to &lt;strong&gt;write things down&lt;/strong&gt; a lot. I like to write notes during meetings, as I think through problems, as I need to prepare for a presentation, or a large task, or when I just need to remember something later, that I know I&amp;rsquo;ll forget.&lt;/p&gt;</description><category>opinion</category></item><item><title>Dual-Writes and the Outbox Pattern</title><link>https://victorpierre.dev/blog/transactional-outbox-pattern/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/transactional-outbox-pattern/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/transactional-outbox-pattern/the_great_courier_hu_7f08a32afce6cfc3.webp 720w, https://victorpierre.dev/blog/transactional-outbox-pattern/the_great_courier_hu_edba6a6d1351f763.webp 1226w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/transactional-outbox-pattern/the_great_courier_hu_4a99ad44694b05c4.png"
alt="The Great Courier - Alois Petrak (Czech, 1811–1888)"
title="The Great Courier - Alois Petrak (Czech, 1811–1888)" width="1226" height="1114"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;The Great Courier&lt;/h4&gt;&lt;p&gt;Alois Petrak (Czech, 1811–1888).&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Your daily reconciliation job flags a problem: dozens of orders exist in your database, but no corresponding events ever reached Kafka. The email service never sent confirmations. The inventory service never reserved stock. After some digging, you find the culprit - Kafka had a brief hiccup yesterday and returned errors for a few publish attempts. The database writes succeeded, but without the outbox pattern, those events were simply lost.&lt;/p&gt;</description><category>technical</category></item><item><title>Cooperation Without Dependency</title><link>https://victorpierre.dev/blog/cooperation-without-dependency/</link><pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/cooperation-without-dependency/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/cooperation-without-dependency/Allegory_of_the_1st_partition_of_Poland_crop_hu_81036989c225d0b2.webp 720w, https://victorpierre.dev/blog/cooperation-without-dependency/Allegory_of_the_1st_partition_of_Poland_crop_hu_fcaef8303eb5d7c6.webp 1440w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/cooperation-without-dependency/Allegory_of_the_1st_partition_of_Poland_crop_hu_55c1c28bb62d782b.jpg"
alt="Allegory of the 1st partition of Poland. Engraving of European powers dividing Poland, symbolizing loss of national sovereignty."
title="Allegory of the 1st partition of Poland. Engraving of European powers dividing Poland, symbolizing loss of national sovereignty." width="1440" height="956"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;Allegory of the 1st Partition of Poland&lt;/h4&gt;&lt;p&gt;the European powers carving up a nation.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;The greatest danger in times of turbulence is not the turbulence; it is to act with yesterday&amp;rsquo;s logic.&amp;rdquo;&lt;/p&gt;</description><category>opinion</category></item><item><title>2025 - Retrospective</title><link>https://victorpierre.dev/blog/2025-retrospective/</link><pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/2025-retrospective/</guid><description>&lt;p&gt;As we approach the end of 2025, I want to reflect once again on what I&amp;rsquo;ve experienced and learned this year, as well as my hopes and goals for the next. I&amp;rsquo;m reminded of how fortunate I am to have had the experiences and opportunities I&amp;rsquo;ve had.&lt;/p&gt;
&lt;h2&gt;Personal&lt;span class="hx:absolute hx:-mt-20" id="personal"&gt;&lt;/span&gt;
&lt;a href="#personal" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve revived an old hobby: photography. This is something I&amp;rsquo;ve always enjoyed. I remember when I was 10 or 11, my parents got me an old &lt;a href="https://en.wikipedia.org/wiki/Instamatic"target="_blank" rel="noopener"&gt;Kodak Instamatic 333-X&lt;/a&gt; (I think) camera that was popular in the 60s and 70s. By the 90s, it was being rebranded and promoted as a cheap camera for kids, complete with Disney characters and all. I must still have some of those random pictures at my parents&amp;rsquo; house.&lt;/p&gt;</description><category>opinion</category></item><item><title>Distributed Tracing in Go</title><link>https://victorpierre.dev/blog/distributed-tracing-in-go/</link><pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/distributed-tracing-in-go/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/distributed-tracing-in-go/spinning-by-hand_hu_8e016b4b58bccc6d.webp 720w, https://victorpierre.dev/blog/distributed-tracing-in-go/spinning-by-hand_hu_4b9bf638427bbffc.webp 1440w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/distributed-tracing-in-go/spinning-by-hand_hu_7356a4b838be9c1.png"
alt="An illustration showing the silk throwing by hand. It shows the silk being stretched between two points multiple times, and is used here to represent metaphorically the trace between two points. (THE PENNY MAGAZINE, VOL XII No. 711. 1843)"
title="An illustration showing the silk throwing by hand. It shows the silk being stretched between two points multiple times, and is used here to represent metaphorically the trace between two points. (THE PENNY MAGAZINE, VOL XII No. 711. 1843)" width="1440" height="402"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;Silk-throwing by hand&lt;/h4&gt;&lt;p&gt;the thread traced between two fixed points. (The Penny Magazine, 1843)&lt;/p&gt;</description><category>technical</category></item><item><title>Stacked git branches with git-spice</title><link>https://victorpierre.dev/blog/git-spice/</link><pubDate>Thu, 05 Jun 2025 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/git-spice/</guid><description>&lt;figure&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/git-spice/git-spice-logo_hu_fdb1839405dbe2dd.webp 400w" sizes="(max-width: 768px) calc(100vw - 3rem), 720px"&gt;
&lt;img src="https://victorpierre.dev/blog/git-spice/git-spice-logo_hu_d39f68f01058d4de.png"
alt="A Golang gopher dressed as a worm from the movie/book Dune"
title="A Golang gopher dressed as a worm from the movie/book Dune" width="250"
loading="lazy" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;Ever find yourself working on a feature where the choice is between one massive PR that nobody wants to review, or waiting for each small change to be merged before you can start the next? Some features split naturally into smaller PRs, but keeping those PRs in sync as review feedback comes in is painful.&lt;/p&gt;</description><category>technical</category></item><item><title>2024 - Retrospective</title><link>https://victorpierre.dev/blog/2024-retrospective/</link><pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/2024-retrospective/</guid><description>&lt;p&gt;As 2024 draws to a close, I want to put into words my year-end reflection. It&amp;rsquo;s been an eventful journey filled with opportunities and unexpected changes.&lt;/p&gt;
&lt;h2&gt;Personal: I feel so lucky&lt;span class="hx:absolute hx:-mt-20" id="personal-i-feel-so-lucky"&gt;&lt;/span&gt;
&lt;a href="#personal-i-feel-so-lucky" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Despite worrisome global events, I find myself profoundly grateful for my personal circumstances - I&amp;rsquo;m in good health, I love what I do for a living, and I&amp;rsquo;m always surrounded by better people than me.&lt;/p&gt;</description><category>opinion</category></item><item><title>Reproducible macOS Configurations with Nix</title><link>https://victorpierre.dev/blog/declarative-macos-configurations-with-nix/</link><pubDate>Tue, 09 Jul 2024 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/declarative-macos-configurations-with-nix/</guid><description>&lt;figure&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/declarative-macos-configurations-with-nix/nix-logo_hu_f573f7b2f4980e44.webp 720w, https://victorpierre.dev/blog/declarative-macos-configurations-with-nix/nix-logo_hu_b42be498c11fc927.webp 1440w" sizes="(max-width: 768px) calc(100vw - 3rem), 720px"&gt;
&lt;img src="https://victorpierre.dev/blog/declarative-macos-configurations-with-nix/nix-logo_hu_81b42928ad763dbb.png"
alt="The Nix logo"
title="The Nix logo" width="1440" height="637"
loading="lazy" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;
&lt;/figure&gt;
&lt;h2&gt;What is Nix?&lt;span class="hx:absolute hx:-mt-20" id="what-is-nix"&gt;&lt;/span&gt;
&lt;a href="#what-is-nix" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://nixos.org/"target="_blank" rel="noopener"&gt;Nix&lt;/a&gt; is a package manager &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; for Linux and macOS. Together with nix-darwin, it lets you describe much of your macOS setup in a configuration file. A flake can pin dependencies, making that setup easier to reproduce on another machine.&lt;/p&gt;
&lt;p&gt;A key component of the Nix ecosystem is &lt;a href="https://github.com/NixOS/nixpkgs"target="_blank" rel="noopener"&gt;Nixpkgs&lt;/a&gt;, the default repository of Nix packages, which contains thousands of &lt;a href="https://search.nixos.org/packages"target="_blank" rel="noopener"&gt;searchable&lt;/a&gt; packages that you can easily integrate into your configuration.&lt;/p&gt;</description><category>technical</category></item><item><title>User-centric feature design</title><link>https://victorpierre.dev/blog/user-centric-feature-design/</link><pubDate>Sun, 26 May 2024 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/user-centric-feature-design/</guid><description>&lt;figure&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/user-centric-feature-design/User-Centric_Feature_Design_hu_2dcb2e932453e66e.webp 720w, https://victorpierre.dev/blog/user-centric-feature-design/User-Centric_Feature_Design_hu_84ebd344c2fd0306.webp 1440w" sizes="(max-width: 768px) calc(100vw - 3rem), 720px"&gt;
&lt;img src="https://victorpierre.dev/blog/user-centric-feature-design/User-Centric_Feature_Design_hu_167b1855a5db093f.jpg"
alt="An image of a happy user interacting with a mobile app"
title="An image of a happy user interacting with a mobile app" width="1440" height="755"
loading="lazy" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;Early in my career, I did regular client demos and feedback sessions, and the features that worked best were always the ones designed around the people using them. At larger companies, users are further away and engineers spend more time on implementation, but I&amp;rsquo;ve tried to keep the same user-first habit.&lt;/p&gt;</description><category>technical</category></item><item><title>Resilience and Mental Wellness in Uncertain Times</title><link>https://victorpierre.dev/blog/mental-health/</link><pubDate>Sat, 17 Feb 2024 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/mental-health/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/mental-health/The_Gulf_Stream_hu_4add7ad57bcc01ec.webp 720w, https://victorpierre.dev/blog/mental-health/The_Gulf_Stream_hu_88e5c3b6bd48d120.webp 1440w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/mental-health/The_Gulf_Stream_hu_81183ea9394448ec.png"
alt="The Gulf Stream by Winslow Homer (1899) - A lone stoic Black man on a damaged boat, surrounded by sharks and a swirling waterspout, symbolizing human struggle against nature and the brutal history of empire and slavery."
title="The Gulf Stream by Winslow Homer (1899) - A lone stoic Black man on a damaged boat, surrounded by sharks and a swirling waterspout, symbolizing human struggle against nature and the brutal history of empire and slavery." width="1440" height="878"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;The Gulf Stream&lt;/h4&gt;&lt;p&gt;Winslow Homer, 1899.&lt;/p&gt;</description><category>opinion</category></item><item><title>Hasten Slowly in Software Development</title><link>https://victorpierre.dev/blog/festina-lente/</link><pubDate>Sun, 24 Dec 2023 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/festina-lente/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/festina-lente/festina-lente-dolphin_hu_efa1ddb16236e874.webp 720w, https://victorpierre.dev/blog/festina-lente/festina-lente-dolphin_hu_674140367295f216.webp 750w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/festina-lente/festina-lente-dolphin_hu_bc42b70153a88d6b.jpg"
alt="The emblem of the dolphin and anchor which has been used since Roman times to illustrate festina lente. This example is the printer&amp;#39;s mark of Aldus."
title="The emblem of the dolphin and anchor which has been used since Roman times to illustrate festina lente. This example is the printer&amp;#39;s mark of Aldus." width="750" height="857"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;The dolphin and anchor&lt;/h4&gt;&lt;p&gt;Aldus Manutius&amp;rsquo;s printer&amp;rsquo;s mark for &lt;em&gt;festina lente&lt;/em&gt;.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;According to Suetonius, the Roman emperor Augustus was fond of the maxim &lt;em&gt;Festina Lente&lt;/em&gt;, usually translated as &lt;em&gt;Make Haste Slowly&lt;/em&gt;. It sounds like a contradiction, but the idea is simple: the fastest way to a goal is rarely the hurried one. Rushing creates the mistakes that slow you down.&lt;/p&gt;</description><category>opinion</category></item><item><title>Go Interfaces: Five Best-Practices for Enhanced Code Maintainability</title><link>https://victorpierre.dev/blog/five-go-interfaces-best-practices/</link><pubDate>Wed, 13 Dec 2023 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/five-go-interfaces-best-practices/</guid><description>&lt;figure&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/five-go-interfaces-best-practices/gopher-outline-w_hu_268b5a774955687.webp 500w" sizes="(max-width: 768px) calc(100vw - 3rem), 720px"&gt;
&lt;img src="https://victorpierre.dev/blog/five-go-interfaces-best-practices/gopher-outline-w_hu_f55fa1cb18096ab.png"
alt="The dashed outline of the Go mascot, a blue gopher, representing interfaces in Go"
title="The dashed outline of the Go mascot, a blue gopher, representing interfaces in Go" width="350"
loading="lazy" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;When you&amp;rsquo;re coding in Go, you&amp;rsquo;ll quickly come to appreciate interfaces. An interface in Go is a type that spells out a set of methods. But here&amp;rsquo;s the interesting part: Go does things differently from other languages. Instead of needing an explicit declaration, a type in Go automatically satisfies an interface as long as it has all the required methods.&lt;/p&gt;</description><category>technical</category></item><item><title>Enhancing Data Access with the Decorator Pattern in Go</title><link>https://victorpierre.dev/blog/decorator-pattern-in-go/</link><pubDate>Sun, 03 Dec 2023 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/decorator-pattern-in-go/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/decorator-pattern-in-go/matryoshka_dolls_hu_40317f532a90a79a.webp 720w, https://victorpierre.dev/blog/decorator-pattern-in-go/matryoshka_dolls_hu_698d7f3dee955b5c.webp 1440w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/decorator-pattern-in-go/matryoshka_dolls_hu_53479aa0a4c4f51d.jpg"
alt="Matryoshka Dolls in various sizes"
title="Matryoshka Dolls in various sizes" width="1440" height="950"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;Matryoshka dolls&lt;/h4&gt;&lt;p&gt;each shell wrapping the next.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The decorator pattern lets you add behaviour to an object by wrapping it, without changing the object itself. In Go, it&amp;rsquo;s a clean way to keep things like caching, logging, or metrics out of your core logic.&lt;/p&gt;
&lt;p&gt;Go has no classes or inheritance, so the pattern is built with interfaces: every decorator implements the same interface as the thing it wraps. Below is a small data access layer with stackable behaviours.&lt;/p&gt;</description><category>technical</category></item><item><title>A Beginner's Guide to Semantic Versioning</title><link>https://victorpierre.dev/blog/beginners-guide-semantic-versioning/</link><pubDate>Sun, 09 Jul 2023 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/beginners-guide-semantic-versioning/</guid><description>&lt;figure&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/beginners-guide-semantic-versioning/semver-breakdown_hu_ba063eabc350f703.webp 720w, https://victorpierre.dev/blog/beginners-guide-semantic-versioning/semver-breakdown_hu_4f8e7bcd61b75e97.webp 1440w" sizes="(max-width: 768px) calc(100vw - 3rem), 720px"&gt;
&lt;img src="https://victorpierre.dev/blog/beginners-guide-semantic-versioning/semver-breakdown_hu_fcff0350c45d6e40.jpg"
alt="An image showing the breakdown of each Semantic Version number"
title="An image showing the breakdown of each Semantic Version number" width="1440" height="629"
loading="lazy" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;Semantic Versioning (SemVer) is a small set of rules for choosing version numbers. Many developers find it confusing at first, especially around when to bump which number and what release candidates are for. It helps to start with the problem it solves.&lt;/p&gt;</description><category>technical</category></item><item><title>Understanding Zero Values in Go</title><link>https://victorpierre.dev/blog/zero-values-in-go/</link><pubDate>Thu, 20 Apr 2023 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/zero-values-in-go/</guid><description>&lt;p&gt;In Go, variables of basic types such as &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;float64&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, and others, will have a default value that is assigned by the compiler or runtime when no value is explicitly assigned to it (they are declared but not initialized). This is called a &lt;em&gt;&amp;ldquo;zero value&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This matters because a declared variable always has a value. That value is often useful as-is, but some operations, such as assigning into a nil map, still require initialization.&lt;/p&gt;</description><category>technical</category></item><item><title>Escaping the internet's walled gardens</title><link>https://victorpierre.dev/blog/escaping-internet-walled-gardens/</link><pubDate>Fri, 16 Dec 2022 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/escaping-internet-walled-gardens/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/escaping-internet-walled-gardens/The%20balsam%20garden%20of%20Cairo_hu_571e7775854219.webp 720w, https://victorpierre.dev/blog/escaping-internet-walled-gardens/The%20balsam%20garden%20of%20Cairo_hu_b55fad9b7f262334.webp 1064w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/escaping-internet-walled-gardens/The%20balsam%20garden%20of%20Cairo_hu_fc8cfc5e4b9cb5ac.png"
alt="Medieval (14th century) illustration known as the &amp;#39;The Balsam Garden of Cairo&amp;#39;, showing a walled garden protected by soldiers"
title="Medieval (14th century) illustration known as the &amp;#39;The Balsam Garden of Cairo&amp;#39;, showing a walled garden protected by soldiers" width="1064" height="1556"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;The Balsam Garden of Cairo&lt;/h4&gt;&lt;p&gt;a walled garden under guard. (14th century)&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The internet has changed a lot since its early days. It started as many independent networks and servers connected together, which let information, competition, and new ideas flow freely. Today, a handful of large tech companies control most of it. The result is a set of &amp;ldquo;walled gardens&amp;rdquo;, where users mostly see the content and services those companies choose to offer.&lt;/p&gt;</description><category>opinion</category></item><item><title>How I organize (most of) my Go microservices</title><link>https://victorpierre.dev/blog/my-go-project-organization/</link><pubDate>Sun, 06 Nov 2022 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/my-go-project-organization/</guid><description>&lt;figure&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/my-go-project-organization/gopher_code_structure_hu_7e06ea709b9bf28c.webp 720w, https://victorpierre.dev/blog/my-go-project-organization/gopher_code_structure_hu_521891cc18728ec4.webp 1440w" sizes="(max-width: 768px) calc(100vw - 3rem), 720px"&gt;
&lt;img src="https://victorpierre.dev/blog/my-go-project-organization/gopher_code_structure_hu_75a3b5db81619256.jpg"
alt="An image of a blue Gopher in front of a board planning code organization"
title="An image of a blue Gopher in front of a board planning code organization" width="1440" height="955"
loading="lazy" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;When first learning &lt;em&gt;Go&lt;/em&gt;, my initial instinct was to find a framework that would scaffold the basic folder structure and functionality that would allow me to build my first project. It didn&amp;rsquo;t take long to realize that &lt;em&gt;Go&lt;/em&gt;, thanks to its rich standard library ecosystem, didn&amp;rsquo;t really need a framework, and often the framework works against you. Since then, I&amp;rsquo;ve welcomed many new developers to my team who were used to working with different programming languages. Some of them have been surprised by the lack of a consistent folder structure across different parts of our company&amp;rsquo;s codebase.&lt;/p&gt;</description><category>technical</category></item><item><title>End-to-End tests with Venom</title><link>https://victorpierre.dev/blog/e2e-tests-with-venom/</link><pubDate>Fri, 17 Dec 2021 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/e2e-tests-with-venom/</guid><description>&lt;figure class="plate"&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/e2e-tests-with-venom/snake-glass-beaker_hu_830ae00ebe4ba633.webp 466w" sizes="(max-width: 480px) calc(100vw - 5rem), 388px"&gt;
&lt;img src="https://victorpierre.dev/blog/e2e-tests-with-venom/snake-glass-beaker_hu_e456b16cadf05072.png"
alt="Glass beaker with snake-thread decoration (Roman, Gallia Belgica) - 4th century CE"
title="Glass beaker with snake-thread decoration (Roman, Gallia Belgica) - 4th century CE" width="466" height="536"
loading="eager" fetchpriority="high" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;h4&gt;Glass beaker with snake-thread decoration&lt;/h4&gt;&lt;p&gt;Roman, Gallia Belgica, 4th century CE.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2&gt;What is Venom?&lt;span class="hx:absolute hx:-mt-20" id="what-is-venom"&gt;&lt;/span&gt;
&lt;a href="#what-is-venom" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://github.com/ovh/venom"target="_blank" rel="noopener"&gt;Venom&lt;/a&gt; is an open source tool for writing automated end-to-end and integration tests, published by &lt;a href="https://www.ovhcloud.com"target="_blank" rel="noopener"&gt;OVH&lt;/a&gt;, a French cloud company. It aims to be simple to use. Unlike many end-to-end testing tools, it doesn&amp;rsquo;t require you to write your tests in Python, Java, or JavaScript: you declare test cases in a &lt;code&gt;.yaml&lt;/code&gt; file that looks a lot like a CI job definition. It is written in Go and easy to extend.&lt;/p&gt;</description><category>technical</category></item><item><title>An introduction to Protocol Buffers 3</title><link>https://victorpierre.dev/blog/introduction-to-protobuf/</link><pubDate>Sun, 09 May 2021 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/introduction-to-protobuf/</guid><description>&lt;figure&gt;
&lt;span class="figure-media"&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://victorpierre.dev/blog/introduction-to-protobuf/protobuf-logo_hu_ef7f4b2cba18af69.webp 720w, https://victorpierre.dev/blog/introduction-to-protobuf/protobuf-logo_hu_a9165c7a1f6ff3ad.webp 1134w" sizes="(max-width: 768px) calc(100vw - 3rem), 720px"&gt;
&lt;img src="https://victorpierre.dev/blog/introduction-to-protobuf/protobuf-logo_hu_81991276e5098cf1.jpg"
alt="Protobuf logo"
title="Protobuf logo" width="1134" height="425"
loading="lazy" decoding="async"
/&gt;
&lt;/picture&gt;&lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;A little bit of context first:&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve spent most of my professional life building RESTful APIs. Recently I had to build a gRPC service, and learning protobuf for the first time seemed to be a daunting task. It turns out, Protocol Buffer is very easy to learn, feature-rich, and can speed up development significantly.&lt;/p&gt;
&lt;p&gt;If you are looking into protobuf for the first time, my goal in this post is to give you an initial overview of the Protocol Buffer 3 syntax, structure, data types, and best practices.&lt;/p&gt;</description><category>technical</category></item><item><title>Five useful terminal tools for Developers</title><link>https://victorpierre.dev/blog/five-great-terminal-tools/</link><pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate><guid>https://victorpierre.dev/blog/five-great-terminal-tools/</guid><description>&lt;p&gt;Most of my day happens in a terminal, and over the years a few tools have become part of how I work. Here are five I keep coming back to.&lt;/p&gt;
&lt;h2&gt;Chezmoi&lt;span class="hx:absolute hx:-mt-20" id="chezmoi"&gt;&lt;/span&gt;
&lt;a href="#chezmoi" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;span class="hx:inline-block hx:align-text-bottom hextra-icon"&gt;&lt;svg height=1em fill="currentColor" viewBox="3 3 18 18"&gt;
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
GitHub: &lt;a href="https://github.com/twpayne/chezmoi"target="_blank" rel="noopener"&gt;twpayne/chezmoi&lt;/a&gt;&lt;/p&gt;</description><category>technical</category></item></channel></rss>