<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>CodeBlueprint</title><link>https://sysdev.me/</link><atom:link href="https://sysdev.me/feed_rss_created.xml" rel="self" type="application/rss+xml" /> <language>en</language> <pubDate>Wed, 25 Mar 2026 03:56:36 -0000</pubDate> <lastBuildDate>Wed, 25 Mar 2026 03:56:36 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.17.7</generator> <image> <url>None</url> <title>CodeBlueprint</title> <link>https://sysdev.me/</link> </image> <item> <title>Vibe Coding experiment</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/vibe-coding-experiment.png&#34; target=&#34;_blank&#34;&gt; &lt;...</description> <link>https://sysdev.me/2026/03/25/vibe-coding-experiment/</link> <pubDate>Wed, 25 Mar 2026 09:56:06 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2026/03/25/vibe-coding-experiment/</guid> </item> <item> <title>Making GenAI code review actually useful</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/consensus-review.jpg&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/consensus-review.jpg&#34; alt=&#34;&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;figcaption&gt; Alamedin Gorge is one of my favorite places for a short weekend walk. &lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;I ran a single Claude reviewer agent against an approximately 1000-line C++ change last month (yes, it&#39;s too big for a normal workflow, but we are in the GenAI era and norms are different)—some pretty important video pipeline updates, but nothing exotic. The review came back with 14 findings. Three were real. The rest included a phantom race condition in code that runs on a single thread, two style nitpicks elevated to High severity, and a complaint about missing error handling on a function that already returns &lt;code&gt;std::expected&lt;/code&gt;. The signal-to-noise ratio was bad enough that I almost closed the tab.&lt;/p&gt; &lt;p&gt;This is the dirty secret of GenAI-assisted code review. The models are good enough to spot real issues, sometimes ones a tired human would miss. But they also hallucinate problems with enough confidence to waste your time, and the false positives are not random. They cluster around the same blind spots every run because they come from the same weights, the same training distribution, the same biases baked into one model family.&lt;/p&gt; &lt;p&gt;I wrote about the false positive problem briefly in my earlier piece on development processes in the GenAI era[^1], but I didn&#39;t have a concrete solution at the time. Now I do, and it&#39;s been running in my workflow for a few weeks. The short version: stop asking one agent. Ask three, and only keep what two of them agree on.&lt;/p&gt;</description> <link>https://sysdev.me/2026/02/19/making-genai-code-review-actually-useful/</link> <pubDate>Thu, 19 Feb 2026 12:17:00 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2026/02/19/making-genai-code-review-actually-useful/</guid> </item> <item> <title>IPO Season and the Death of Software Engineering (Again)</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/song-kol-camp.JPG&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/song-kol-camp.JPG&#34; alt=&#34;&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;figcaption&gt; Our Perseids campsite at Song Kol. No cell signal, no Blind, no LinkedIn panic. &lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;I check Blind the way some people check horoscopes: every morning, expecting drama, occasionally finding truth. The Economist I read for the opposite reason, it&#39;s calm, structured, backed by actual data. These two don&#39;t usually agree on much. But over the past couple of months, they&#39;ve converged on the same narrative, and that&#39;s when I start paying attention.&lt;/p&gt; &lt;h2&gt;December 2025: the quiet IPO prep&lt;/h2&gt; &lt;p&gt;Most people missed the December signal. No press conference, no earnings call. Just a Schumpeter column in The Economist[^1] noting that SpaceX, OpenAI, and Anthropic are all circling public listings. Anthropic hired Wilson Sonsini, the firm that took Google and LinkedIn public. Valuation tripled in six months to $183 billion[^2]. Revenue reportedly went up ninefold in a year[^3].&lt;/p&gt;</description> <link>https://sysdev.me/2026/02/12/ipo-season-and-the-death-of-software-engineering-again/</link> <pubDate>Tue, 17 Feb 2026 16:31:32 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2026/02/12/ipo-season-and-the-death-of-software-engineering-again/</guid> </item> <item> <title>Development processes in the GenAI era</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/gen-ai-processes/genai-era.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/gen-ai-processes/genai-era.png&#34; alt=&#34;&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;The current debate around GenAI and C++ is a good illustration of the real problem. Many engineers report that models are worse than juniors. Others report dramatic speedups on the same language and problem space. Both observations are correct.&lt;/p&gt; &lt;p&gt;The difference is not the model. It is the absence or presence of the state.&lt;/p&gt; &lt;p&gt;Most GenAI usage today is stateless. A model is dropped into an editor with a partial view of the codebase, no durable memory, no record of prior decisions, no history of failed attempts, and no awareness of long-running context. In that mode, the model behaves exactly like an amnesic junior engineer. It repeats mistakes, ignores constraints, and proposes changes without understanding downstream consequences.&lt;/p&gt; &lt;p&gt;When engineers conclude that “AI is not there yet for C++”, they are often reacting to this stateless setup.&lt;/p&gt; &lt;p&gt;At the same time, GenAI does not elevate engineering skill. It does not turn a junior into a senior. What it does is amplify the level at which an engineer already operates. A senior engineer using GenAI effectively becomes a faster senior, and a junior becomes a faster junior. Judgment is not transferred, and the gap does not close automatically.&lt;/p&gt; &lt;p&gt;These two facts are tightly coupled. In stateless, unstructured usage, GenAI amplifies noise. In a stateful, constrained workflow with explicit ownership and review, it amplifies competence.&lt;/p&gt; &lt;p&gt;This is why reported productivity gains vary so widely. Claims of 200–300% speedup are achievable, but only locally and only within the bounds of the user’s existing competence. Drafting, exploration, task decomposition, and mechanical transformation accelerate sharply. End-to-end throughput increases are lower because planning, integration, validation, and responsibility remain human-bound.&lt;/p&gt; &lt;p&gt;The question, then, is not whether GenAI is “good enough”. The question is what kind of system you embed it into.&lt;/p&gt; &lt;p&gt;!!! note Everything I&#39;ll explain below is &lt;strong&gt;only&lt;/strong&gt; applicable to the &lt;strong&gt;Stateful GenAI&lt;/strong&gt; setup. &lt;/p&gt;</description> <link>https://sysdev.me/2026/01/14/development-processes-in-the-genai-era/</link> <pubDate>Tue, 13 Jan 2026 17:22:13 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2026/01/14/development-processes-in-the-genai-era/</guid> </item> <item> <title>Today I learned... git shallow</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/git-shallow.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/git-shallow.png&#34; alt=&#34;&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;Sometimes you need to understand why something exists, and instead, you’re staring at a mystery. It feels like magic for a moment. But there is no magic in IT. There is always a reason, and usually it’s painfully concrete.&lt;/p&gt; &lt;p&gt;Today I learned that if &lt;code&gt;git blame&lt;/code&gt; suddenly claims I wrote the entire million-line project, it might be lying 🙂&lt;/p&gt; &lt;p&gt;I ran into a situation where my local &lt;code&gt;git blame&lt;/code&gt; attributed every line to a single recent commit, while GitLab showed the correct historical authors. At first glance, it looked like history had been rewritten, which is odd and incorrect.&lt;/p&gt;</description> <link>https://sysdev.me/2025/12/31/today-i-learned-git-shallow/</link> <pubDate>Wed, 31 Dec 2025 21:24:55 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/12/31/today-i-learned-git-shallow/</guid> </item> <item> <title>Dealing with ThreadSanitizer Fails on Startup</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/pi_crab.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/pi_crab.png&#34; alt=&#34;&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;Usually, you need just a few lines to initialize TSan in your project: you compile with the sanitizer flags, run the tests, and get a clear report of which threads touched which memory locations. On a modern Linux system, that simple expectation can fail in a very non-obvious way.&lt;/p&gt; &lt;p&gt;&lt;code&gt;FATAL: ThreadSanitizer: unexpected memory mapping 0x...&lt;/code&gt;&lt;/p&gt; &lt;p&gt;In my case, I attached TSan to a not-so-young C++ codebase and immediately encountered a fatal runtime error from the sanitizer, long before any of the project&#39;s code executed. No race report, no helpful stack trace, just a hard abort complaining about an &#34;unexpected memory mapping.&#34;&lt;/p&gt; &lt;p&gt;If you can upgrade your toolchain to LLVM 18.1 or newer, this problem effectively disappears, because newer TSan builds know how to recover from the incompatible memory layout. Suppose you are pinned to an older LLVM (by CI images, production constraints, or corporate distro policy). In that case, you are in the same situation I was: you have to understand what the sanitizer is trying to do with the address space, and work around the failure mode yourself.&lt;/p&gt;</description> <link>https://sysdev.me/2025/12/05/dealing-with-threadsanitizer-fails-on-startup/</link> <pubDate>Thu, 04 Dec 2025 20:29:06 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/12/05/dealing-with-threadsanitizer-fails-on-startup/</guid> </item> <item> <title>Cross-Compiling Rust for Raspberry Pi</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/pi_crab.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/pi_crab.png&#34; alt=&#34;&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;I just started a new embedded pet project on the Raspberry Pi, and I expect it&#39;ll be a pretty big one, so I&#39;ve been thinking about the technology from the beginning. The overall goal is to create a glass-to-glass video pipeline example. Let&#39;s see how it&#39;s going. For now, I&#39;m using a USB &lt;code&gt;V4L2&lt;/code&gt; camera while waiting for the native Pi modules to arrive, but it&#39;s enough to sketch the capture loop and start testing the build pipeline. The application itself is minimal—open &lt;code&gt;/dev/video0&lt;/code&gt;, request &lt;code&gt;YUYV&lt;/code&gt; at 1280x720, set up &lt;code&gt;MMAP&lt;/code&gt; buffers, and iterate over frames—but the real challenge occurs when &lt;code&gt;v4l&lt;/code&gt; triggers &lt;code&gt;bindgen&lt;/code&gt;, and the build must cross-compile cleanly for &lt;code&gt;aarch64&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;The language choice immediately becomes part of the equation right away. Go is my favorite and, usually, is not considered as an option by many embedded developers. But it&#39;s a good choice for small embedded utilities because its cross-compilation story is nearly effortless. Need an ARM binary? One command and you have it!&lt;/p&gt; &lt;p&gt;&lt;code&gt;GOOS=linux GOARCH=arm64 go build&lt;/code&gt;&lt;/p&gt;</description> <link>https://sysdev.me/2025/11/27/cross-compiling-rust-for-raspberry-pi/</link> <pubDate>Fri, 28 Nov 2025 09:50:40 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/11/27/cross-compiling-rust-for-raspberry-pi/</guid> </item> <item> <title>What Actually Drove the Tech Layoffs</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/chon-aryk-hills.jpeg&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/chon-aryk-hills.jpeg&#34; alt=&#34;&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;figcaption&gt; A 10-minute ride and you have such a view from Chon Aryk hills. &lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;I truly enjoy reading Blind and Levels. There is so much internal drama, messy details, and unexpected insights that you almost do not need reality shows anymore. And if you ever feel bored, you can always drop a mildly toxic comment into a thread and watch the whole thing ignite. It fits the overall style of Blind a little too well, but that is part of the fun. And considering that mix of casual toxicity and surprisingly rational takes you see there, you would expect people to look at layoffs with a bit more perspective. But when the topic comes up, the conversation usually drifts to the same explanation. People blame AI. People say their jobs vanished because a model wrote some code. And while I understand the frustration, the logic never sits right with me. Nobody complained during the hiring boom of 2020 and 2021, when companies doubled their headcount like it was nothing. That part gets forgotten. Now that the correction is here, many want a simple villain. AI fits the story, but it does not fit the data.&lt;/p&gt;</description> <link>https://sysdev.me/2025/11/20/what-actually-drove-the-tech-layoffs/</link> <pubDate>Mon, 17 Nov 2025 20:38:06 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/11/20/what-actually-drove-the-tech-layoffs/</guid> </item> <item> <title>Identifying Video Streams Using RTP Header Extensions</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/Birch-Grove.jpeg&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/Birch-Grove.jpeg&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;figcaption&gt; Birch Grove near Bishkek. The grove is incredibly popular in the autumn. &lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;When a system manages dozens of cameras or edge devices, packets alone don’t tell you much. An IP and port might change, SSRCs can roll over, and NATs tend to shuffle everything just enough to break simple assumptions. Yet every media packet still needs a clear identity — not for transport, but for logic. &lt;/p&gt; &lt;p&gt;There are many ways to attach that identity: control channels, per-session negotiation, external registries. But the most simple one is already part of RTP itself — the header extension defined by &lt;a href=&#34;https://www.rfc-editor.org/rfc/rfc8285&#34;&gt;RFC 8285&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;How it works&lt;/h2&gt; &lt;p&gt;RTP was designed to be extensible. After the fixed header and payload, packets can carry short metadata blocks called &lt;em&gt;header extensions&lt;/em&gt;. Each extension has a small numeric ID and a URI describing its purpose. &lt;/p&gt;</description> <link>https://sysdev.me/2025/11/09/identifying-video-streams-using-rtp-header-extensions/</link> <pubDate>Sun, 09 Nov 2025 15:34:26 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/11/09/identifying-video-streams-using-rtp-header-extensions/</guid> </item> <item> <title>Multilingual benchmarking project =&gt; Bazel for advanced engineering</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/molly-tash-rabat.jpeg&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/molly-tash-rabat.jpeg&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;figcaption&gt; In her one year, Molly saw many more exciting places than I did until I was about 28. She does pretty well :-D &lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;When working on performance experiments across C++ and Go, you obviously need a multilingual project structure. There were two paths forward: create separate build systems under a shared repository, or consolidate everything under a single, coherent framework. Bazel made that decision easy.&lt;/p&gt; &lt;p&gt;Using Bazel to unify builds isn’t just convenient—it should be the default choice for any serious engineering effort that involves multiple languages. It eliminates the friction of managing isolated tools, brings deterministic builds, and handles dependencies, benchmarking, and cross-language coordination with minimal ceremony.&lt;/p&gt; &lt;p&gt;Here’s why Bazel makes sense for performance-critical, multilingual projects like this one—no fragile tooling, no redundant setups, just clean integration that scales.&lt;/p&gt;</description> <link>https://sysdev.me/2025/08/01/multilingual-benchmarking-project--bazel-for-advanced-engineering/</link> <pubDate>Fri, 01 Aug 2025 12:24:49 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/08/01/multilingual-benchmarking-project--bazel-for-advanced-engineering/</guid> </item> <item> <title>TIL: how to debug randomly hanging Python applications</title> <description>&lt;p&gt;Usually, if a Python-based application hangs, you either read logs or grab one of the PBD-based solutions, attaching to the application, and uses the Python ...&lt;/p&gt;</description> <link>https://sysdev.me/2022/06/29/til-how-to-debug-randomly-hanging-python-applications/</link> <pubDate>Sat, 21 Jun 2025 18:28:22 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2022/06/29/til-how-to-debug-randomly-hanging-python-applications/</guid> </item> <item> <title>AI, Software Engineering, and the Evolution of Code Generation</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/mountains.jpeg&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/mountains.jpeg&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;figcaption&gt; From a weekend trip to a nearby gorge. Why is it here? Because I love the mountains of Kyrgyzstan! &lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;Mark Zuckerberg recently made a bold statement: AI will soon take over the work of mid-level engineers &lt;a href=&#34;https://www.forbes.com/sites/quickerbettertech/2025/01/26/business-tech-news-zuckerberg-says-ai-will-replace-mid-level-engineers-soon&#34;&gt;(Forbes)&lt;/a&gt;. While this may sound like another tech CEO hyping AI, my latest experience with OpenAI’s o3-mini-high model suggests he might not be too far off.&lt;/p&gt; &lt;p&gt;Thanks to DeepSeek, OpenAI was compelled to make o3-mini-high available in a regular ChatGPT subscription instead of locking it behind a steep $200 paywall. I would never pay original $200 for a model, but since I already have the regular ChatGPT subscription, it was an obvious choice to try it out. With this in mind, I decided to experiment: Could o3-mini-high generate a functional Go codebase for my &lt;a href=&#34;https://github.com/astavonin/gfsm&#34;&gt;GFSM library&lt;/a&gt;?&lt;/p&gt; &lt;h2&gt;The experiment&lt;/h2&gt; &lt;p&gt;For context, &lt;a href=&#34;https://github.com/astavonin/gfsm&#34;&gt;GFSM&lt;/a&gt; is my Go Finite State Machine library, and I needed a new generator to extract and save state machines in formats like &lt;a href=&#34;https://plantuml.com&#34;&gt;PlantUML&lt;/a&gt; and &lt;a href=&#34;https://mermaid.js.org&#34;&gt;Mermaid&lt;/a&gt;. Writing such a generator requires a solid understanding of Go’s &lt;a href=&#34;https://pkg.go.dev/go/ast&#34;&gt;Abstract Syntax Tree (AST) package&lt;/a&gt;, something I hadn’t used in years.&lt;/p&gt;</description> <link>https://sysdev.me/2025/02/05/ai-software-engineering-and-the-evolution-of-code-generation/</link> <pubDate>Sat, 21 Jun 2025 12:22:59 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/02/05/ai-software-engineering-and-the-evolution-of-code-generation/</guid> </item> <item> <title>Bazel and Rust: A Perfect Match for Scalable Development</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/rust_and_bazel.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/rust_and_bazel.png&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;Bazel never fails to impress, and its support for Rust demonstrates its versatility and commitment to modern development. Two distinct dependency management modes—Cargo—based and pure Bazel—allow developers to tailor workflows to their projects&#39; needs. This adaptability is particularly valuable for integrating Rust applications into monorepos or scaling complex systems. I decided to explore how Bazel supports Rust, including managing dependencies, migrating from &lt;code&gt;Cargo.toml&lt;/code&gt; to &lt;code&gt;BUILD.bazel&lt;/code&gt;, and streamlining integration testing.&lt;/p&gt; &lt;h2&gt;Harnessing Cargo-Based Dependency Management&lt;/h2&gt; &lt;p&gt;Bazel’s ability to integrate with Cargo, Rust’s native package manager, is a standout feature. This approach preserves compatibility with the Rust ecosystem while allowing projects to benefit from Bazel’s powerful build features. By using &lt;a href=&#34;https://bazelbuild.github.io/rules_rust/&#34;&gt;rules_rust&lt;/a&gt;, a Bazel module can seamlessly import dependencies defined in &lt;code&gt;Cargo.toml&lt;/code&gt; and &lt;code&gt;Cargo.lock&lt;/code&gt; into its build graph.&lt;/p&gt;</description> <link>https://sysdev.me/2024/12/29/bazel-and-rust-a-perfect-match-for-scalable-development/</link> <pubDate>Sat, 21 Jun 2025 12:22:59 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2024/12/29/bazel-and-rust-a-perfect-match-for-scalable-development/</guid> </item> <item> <title>Fixing C++ lacks switches on strings</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/birch-grove-fog.jpeg&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/birch-grove-fog.jpeg&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;figcaption&gt; Birch Grove is just 40 minutes from Bishkek. Although I was concerned about the strong, foggy weather, it was an amazing opportunity for photography! &lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;C++ is a powerful language, and I genuinely love it, but sometimes, even in modern versions, it lacks some surprisingly simple features. One such missing feature is switch on &lt;code&gt;std::string&lt;/code&gt;. You’d think that by now, we could use a switch statement on strings just like we do with integers or enums—after all, Go has it! But no, C++ keeps us on our toes.&lt;/p&gt; &lt;p&gt;Why Doesn’t C++ Support switch on strings? Because &#34;you only pay for what you use,&#34; which is the standard C++ mantra. The switch statement in C++ relies on integral types. Under the hood, it works by converting the case values into jump table indices for efficient execution. But &lt;code&gt;std::string&lt;/code&gt; (or even &lt;code&gt;std::string_view&lt;/code&gt;) is not an integral type—it’s a more complex data structure. That’s why you can’t simply do:&lt;/p&gt; &lt;p&gt;&lt;code&gt;cpp switch (msg-&amp;gt;get_value&amp;lt;std::string&amp;gt;()) { // Nope, not possible :-( case &#34;topology&#34;: // Handle network topology break; case &#34;broadcast&#34;: // Handle network broadcast break; }&lt;/code&gt;&lt;/p&gt;</description> <link>https://sysdev.me/2025/02/17/fixing-c-lacks-switches-on-strings/</link> <pubDate>Sat, 21 Jun 2025 12:22:59 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/02/17/fixing-c-lacks-switches-on-strings/</guid> </item> <item> <title>Functional Programming style in C++</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/Teskey-Torpok_Pass.jpg&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/Teskey-Torpok_Pass.jpg&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;figcaption&gt; Teskey-Torpok Pass is a lovely pass leading you to Song-Kol Lake, Naryn region. &lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;I’ve been on a bit of a Leetcode streak lately, poking at problems from companies I secretly admire. To keep things interesting (and to avoid nodding off in front of the screen), I challenged myself to solve the same task three ways: good old C++, its shiny modern C++20 cousin, and Elixir. It turns out that staring at a problem through a functional programming lens is like putting on X-ray specs—you see the same lines of code, but suddenly, there’s a weird beauty in that filter chain.&amp;lt;&lt;/p&gt; &lt;p&gt;My first pass was as traditional as it gets—a simple C++ class with an array and a loop. No magic here, just pushing timestamps and scanning them one by one. The implementation is pretty naive, but considering the constraints provided by the &lt;a href=&#34;https://leetcode.com/problems/design-hit-counter&#34;&gt;Design a hit counter&lt;/a&gt; challenge, even an unscalable approach is acceptable. So, we will push all new timestamps into the ~~&lt;code&gt;std::queue&lt;/code&gt;~~ &lt;code&gt;std::vector&lt;/code&gt; and then simply count.&lt;/p&gt;</description> <link>https://sysdev.me/2025/06/21/functional-programming-style-in-c/</link> <pubDate>Sat, 21 Jun 2025 12:22:59 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/06/21/functional-programming-style-in-c/</guid> </item> <item> <title>How to compile C++ in 2025. Bazel or CMake?</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/cpp_bazel_and_cmake.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/cpp_bazel_and_cmake.png&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;Today, we’re examining two modern build systems for C++: &lt;a href=&#34;https://cmake.org&#34;&gt;CMake&lt;/a&gt;, the industry favorite, and &lt;a href=&#34;https://bazel.build&#34;&gt;Bazel&lt;/a&gt;, a powerful alternative. While CMake is often the default choice, I believe that approach warrants a bit more scrutiny—after all, we’re focusing on modern tools here (yep, not counting Make, right?). To explore this, I’ve created a practical demo project showcasing how both systems manage a real-world scenario.&lt;/p&gt; &lt;p&gt;Using the &lt;a href=&#34;https://github.com/astavonin/maelstrom-challenges&#34;&gt;maelstrom-challenges&lt;/a&gt; project as a starting point, I’ve extracted a C++ library called &lt;a href=&#34;https://github.com/astavonin/maelstrom-node&#34;&gt;maelstrom-node&lt;/a&gt;. This library has been set up to work seamlessly with both &lt;strong&gt;Bazel&lt;/strong&gt; and &lt;strong&gt;CMake&lt;/strong&gt;, giving us a hands-on comparison of their approaches, strengths, and quirks.&lt;/p&gt; &lt;h2&gt;The Project Structure&lt;/h2&gt; &lt;p&gt;Here’s what the final directory layout for maelstrom-node looks like:&lt;/p&gt;</description> <link>https://sysdev.me/2025/01/20/how-to-compile-c-in-2025-bazel-or-cmake/</link> <pubDate>Sat, 21 Jun 2025 12:22:59 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/01/20/how-to-compile-c-in-2025-bazel-or-cmake/</guid> </item> <item> <title>Minimal CI for Go library with GitHub actions</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/actions_and_go.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/actions_and_go.png&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;Continuous Integration (CI) has become an essential part of modern software development, and for good reason. It ensures code quality, speeds up development, and catches potential issues early. However, you can get started without an elaborate CI setup. Even a minimal CI setup can significantly improve your workflow. Here&#39;s why every project should have at least minimal CI and how to implement it effectively using GitHub Actions.&lt;/p&gt; &lt;h2&gt;What Constitutes Minimal CI?&lt;/h2&gt; &lt;p&gt;For a project to benefit from CI without excessive complexity, it should include the following essential components:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Project Compilation:&lt;/strong&gt; Verify that the codebase is always in a buildable state.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Unit Test Execution:&lt;/strong&gt; Ensure the core functionality works as expected.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Static Code Analysis:&lt;/strong&gt; Catch bugs and enforce coding standards before they become an issue.&lt;/li&gt; &lt;/ol&gt;</description> <link>https://sysdev.me/2024/12/05/minimal-ci-for-go-library-with-github-actions/</link> <pubDate>Sat, 21 Jun 2025 12:22:59 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2024/12/05/minimal-ci-for-go-library-with-github-actions/</guid> </item> <item> <title>Managing Multi-Language Projects with Bazel</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/cpp-bazel.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/cpp-bazel.png&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;In today’s software development landscape, it’s rare to encounter a project built with just one programming language or platform. Modern applications often require integrating multiple technologies to meet diverse requirements. This complexity is both a challenge and an opportunity, demanding robust tools to manage dependencies, builds, and integrations seamlessly. Bazel, a powerful build system, is one such tool that has proven invaluable for multi-language projects.&lt;/p&gt; &lt;p&gt;Recently, I decided to extend my &lt;a href=&#34;https://github.com/astavonin/maelstrom-challenges&#34;&gt;Maelstrom challenges&lt;/a&gt; with a C++-based test to explore how Bazel can simplify managing multi-language dependencies and streamline development workflows.&lt;/p&gt; &lt;h2&gt;Why Bazel for Multi-Language Projects?&lt;/h2&gt; &lt;p&gt;Bazel’s design philosophy emphasizes performance and scalability, making it an excellent choice for projects that involve multiple languages. With its support for Bazel modules, adding dependencies is as simple as declaring them in a MODULE.bazel file. For example, integrating the popular logging library spdlog is straightforward:&lt;/p&gt;</description> <link>https://sysdev.me/2025/01/14/managing-multi-language-projects-with-bazel/</link> <pubDate>Sat, 21 Jun 2025 12:22:59 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2025/01/14/managing-multi-language-projects-with-bazel/</guid> </item> <item> <title>Returning to Rust: A Journey Through Tooling, Performance</title> <description>&lt;p&gt;&lt;a href=&#34;https://github.com/astavonin/maelstrom-challenges&#34;&gt;When I started tackling&lt;/a&gt; the &lt;a href=&#34;https://github.com/jepsen-io/maelstrom/tree/main&#34;&gt;Maelstrom challenges&lt;/a&gt;, my initial thought was to use C++. It’s a language I know inside out, and its performance is hard to beat. However, as I contemplated setting up the project, I realized I couldn’t justify fighting with the C++ pipeline for free. Crafting a proper CMake or Bazel configuration might be worthwhile for large-scale projects or when compensated, but for personal experiments? It’s an unnecessary headache.&lt;/p&gt; &lt;h2&gt;Why Go is My Default Choice&lt;/h2&gt; &lt;p&gt;For most non-performance critical scenarios, Go is my default, no-brainer choice. It has a clean build system, excellent tooling, and a developer experience that doesn’t make me dread the setup process. Go’s simplicity allows me (and &lt;strong&gt;any&lt;/strong&gt; level team) to focus on solving the problem rather than wrestling with the environment. Yet, this time, I decided to take a different path.&lt;/p&gt;</description> <link>https://sysdev.me/2024/12/10/returning-to-rust-a-journey-through-tooling-performance/</link> <pubDate>Sat, 21 Jun 2025 12:22:59 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2024/12/10/returning-to-rust-a-journey-through-tooling-performance/</guid> </item> <item> <title>GFSM: A Simple and Fast Finite State Machine for Go</title> <description>&lt;figure style=&#34;float: left; width: 300px; margin: 0 1em 1em 0;&#34; markdown&gt; &lt;a href=&#34;https://sysdev.me/img/fsm.png&#34; target=&#34;_blank&#34;&gt; &lt;img src=&#34;https://sysdev.me/img/fsm.png&#34; alt=&#34;caption&#34; width=&#34;250&#34;&gt; &lt;/a&gt; &lt;/figure&gt; &lt;p&gt;Design patterns are not widely used in Go, as they can often lead to unnecessary complexity in the codebase. However, the Finite State Machine (FSM) is an exception that proves to be incredibly useful. When I set out to design &lt;a href=&#34;https://github.com/astavonin/gfsm&#34;&gt;GFSM&lt;/a&gt;, I aimed to create a fast and straightforward FSM implementation for Go.&lt;/p&gt; &lt;p&gt;I initially sought a quick and straightforward FSM solution for Go, but I couldn&#39;t find anything that met my needs. Drawing inspiration from the speed-focused and minimalistic principles of C++ while remaining true to Go&#39;s idioms, I developed &lt;a href=&#34;https://github.com/astavonin/gfsm&#34;&gt;GFSM&lt;/a&gt; to fill this gap. The outcome is GFSM—a library that distinguishes itself from alternatives like &lt;a href=&#34;https://github.com/looplab/fsm&#34;&gt;looplab/fsm&lt;/a&gt; by prioritizing speed and simplicity.&lt;/p&gt; &lt;p&gt;Whether orchestrating microservices, handling distributed systems, or designing embedded systems, &lt;a href=&#34;https://github.com/astavonin/gfsm&#34;&gt;GFSM&lt;/a&gt; brings the reliability and efficiency needed to keep things running smoothly.&lt;/p&gt;</description> <link>https://sysdev.me/2024/11/25/gfsm-a-simple-and-fast-finite-state-machine-for-go/</link> <pubDate>Fri, 20 Jun 2025 18:39:42 +0000</pubDate> <source url="https://sysdev.me/feed_rss_created.xml">CodeBlueprint</source><guid isPermaLink="true">https://sysdev.me/2024/11/25/gfsm-a-simple-and-fast-finite-state-machine-for-go/</guid> </item> </channel> </rss>