<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Christian Krudewig</title><link>https://krudewig.dev/en/</link><description>Recent content on Christian Krudewig</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 18 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://krudewig.dev/en/index.xml" rel="self" type="application/rss+xml"/><item><title>Coding agent in a box</title><link>https://krudewig.dev/en/post/2026-10-18-coding-agent-in-a-box/</link><pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2026-10-18-coding-agent-in-a-box/</guid><description>&lt;p&gt;&lt;strong&gt;Coding agents have changed how we build software, but they&amp;rsquo;ve also created new risks. This post describes a response to the one that worries me most: an agent compromising the systems I have access to, or leaking sensitive information.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Shaping Engineers in the Age of AI</title><link>https://krudewig.dev/en/post/2026-09-16-shaping-engineers-in-the-age-of-ai/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2026-09-16-shaping-engineers-in-the-age-of-ai/</guid><description>&lt;p&gt;&lt;strong&gt;This is the story of how AI coding agents changed the informal way we teach engineering on the job, and what we can do to keep turning juniors into seniors.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Designing HTTP APIs for slow operations</title><link>https://krudewig.dev/en/post/2026-06-11-async-jobs-api-patterns/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2026-06-11-async-jobs-api-patterns/</guid><description>&lt;p&gt;We got used to having everything on the Web, and so many backend operations became HTTP APIs.&#10;That&amp;rsquo;s also the case in the areas of AI and optimization, because it gives an easy-to-understand interface for clients that can be used without having to learn new technologies.&#10;There&amp;rsquo;s a problem, however: Some of these operations are &lt;em&gt;very&lt;/em&gt; slow, and at times systems become a brittle mess of regular timeout hits, latency optimizations, and support issues.&lt;/p&gt;</description></item><item><title>Services</title><link>https://krudewig.dev/en/services/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/services/</guid><description/></item><item><title>Ingress Nginx retires: it's time for Kubernetes Gateway API</title><link>https://krudewig.dev/en/post/2026-02-09-gateway-api/</link><pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2026-02-09-gateway-api/</guid><description>&lt;p&gt;The Ingress Nginx controller is &lt;a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/"&gt;retiring next month&lt;/a&gt;, in March 2026.&#10;What comes next? I think it should be the Kubernetes Gateway API - and in this post I will explain why.&lt;/p&gt;</description></item><item><title>Self-Contained Teams: How to Keep a DevOps Culture in a Growing Organization</title><link>https://krudewig.dev/en/post/2026-01-22-self-contained-teams/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2026-01-22-self-contained-teams/</guid><description>&lt;p&gt;When projects take longer despite your organization gaining more expertise, when developers share frustration about &amp;ldquo;process hindering progress&amp;rdquo;, the problem may not be the people or the technology. It may be time to look at team boundaries.&lt;/p&gt;</description></item><item><title>Analyzing One Year of Solar &amp; Heat Pump Data</title><link>https://krudewig.dev/en/post/2026-01-06-pv-evaluation/</link><pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2026-01-06-pv-evaluation/</guid><description>&lt;p&gt;It is now 1.5 years since we replaced our gas boiler with a heat pump and installed a solar panel system.&#10;We had heard a lot of horror stories about misconfigured heat pumps and the excessive costs that they may cause,&#10;so I invested into detailed planning and a custom &lt;a href="https://krudewig.dev/en/post/2024-06-01-Simulating-home-solar-installation/"&gt;simulation of the photovoltaic system&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Storing evaluation data for AI projects</title><link>https://krudewig.dev/en/post/2025-12-13-Ways-to-store-testing-data/</link><pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2025-12-13-Ways-to-store-testing-data/</guid><description>&lt;p&gt;When building ML systems, test and evaluation datasets are as critical as the code itself. But where should you store them? The answer depends on size, sensitivity, and how often they change.&lt;/p&gt;</description></item><item><title>Simulating Home Solar with Python</title><link>https://krudewig.dev/en/post/2024-06-01-Simulating-home-solar-installation/</link><pubDate>Sat, 01 Jun 2024 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2024-06-01-Simulating-home-solar-installation/</guid><description>&lt;p&gt;&lt;strong&gt;Ever wondered if a solar installation would pay off? I&amp;rsquo;ll show you how to find out with Python.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;When we had ordered a new heat pump as replacement for the old gas boiler,&#10;we assumed that a solar installation would also be a good idea.&#10;Not only because we could make a little contribution to the rise of renewables,&#10;but with the additional electricity demand it was likely to pay off financially, too.&lt;/p&gt;</description></item><item><title>Python packaging unboxed</title><link>https://krudewig.dev/en/post/2024-02-23-python-packaging-from-imports-to-docker/</link><pubDate>Fri, 23 Feb 2024 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2024-02-23-python-packaging-from-imports-to-docker/</guid><description>&lt;p&gt;&lt;strong&gt;Python packaging has a reputation for being confusing. With tools like setuptools, pip, poetry, flit, pdm, and twine, it&amp;rsquo;s easy to get lost. This post demystifies the packaging workflow from the import system to Docker deployments.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>About</title><link>https://krudewig.dev/en/about/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/about/</guid><description>&lt;h2 id="about-me"&gt;About me&lt;/h2&gt;&#10;&lt;p&gt;From economics through operations research to software and AI engineering, I&amp;rsquo;ve always focused on solving real-world problems with technology. I&amp;rsquo;ve built and scaled machine learning systems, designed robust software, and transformed high-maintenance systems into simpler, more dependable solutions. My passion lies in exploring new tools and methods, but I always prioritize functionality, reliability, and tangible impact:&lt;/p&gt;</description></item><item><title>Python 3.11 thirty percent faster indeed</title><link>https://krudewig.dev/en/post/2022-11-10-python-311/</link><pubDate>Thu, 10 Nov 2022 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2022-11-10-python-311/</guid><description>&lt;p&gt;&lt;strong&gt;Two weeks back the new version 3.11 of Python was released with the promise of a significant speedup.&#10;Let&amp;rsquo;s test it!&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;For fun, I&amp;rsquo;m maintaining a &lt;a href="https://github.com/chr1st1ank/speeding-up-python"&gt;small benchmarking project&lt;/a&gt;.&#10;There, a couple of computational tasks are solved with Python and with different speedup methods&#10;such as Cython, Numba and C extensions written in C++ or Rust. Main purpose for me was to figure&#10;out which method has the greatest effect and how good the user experience is.&lt;/p&gt;</description></item><item><title>Locating memory leaks in a Python service – Part 2: C-Extensions</title><link>https://krudewig.dev/en/post/2022-09-12-locating-memory-leaks-in-services-part2/</link><pubDate>Mon, 12 Sep 2022 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2022-09-12-locating-memory-leaks-in-services-part2/</guid><description>&lt;p&gt;&lt;strong&gt;Building up on last week&amp;rsquo;s issue about diagnosing memory leaks in Python, this blog post will show how to identify memory issues in native extension modules.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;From [the first posting]({% post_url 2022-09-04-locating-memory-leaks-in-services-part1 %})&#10;we have the tools to clearly diagnose a memory leak in pure Python. So let&amp;rsquo;s proceed to the next level and add some native code to the picture.&#10;It is one of the strengths of Python how easy it can be extended with compiled code e.g. in C, by so called &amp;ldquo;extension modules&amp;rdquo;. This is a key factor which made Python the first choice for data science: The heavy number crunching can be done by optimized routines and the program logic is written in the high-level Python language.&lt;/p&gt;</description></item><item><title>Locating memory leaks in a Python service – Part 1: Pure Python</title><link>https://krudewig.dev/en/post/2022-09-04-locating-memory-leaks-in-services-part1/</link><pubDate>Sun, 04 Sep 2022 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2022-09-04-locating-memory-leaks-in-services-part1/</guid><description>&lt;p&gt;&lt;strong&gt;Even in a garbage-collected language like Python it is possible to create applications with memory leaks. This means that the program keeps memory reserved vor variables which are no longer needed. So the memory could be freed, but it isn&amp;rsquo;t. Especially in long-running applications this can lead to a huge memory consumption over time, up to a point where the hardware limit is reached.&#10;In a series of two blog posts I&amp;rsquo;ll show how to debug such memory issues in a Python web service.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Testing a Flink Stateful Function Service</title><link>https://krudewig.dev/en/post/2022-04-15-testing-a-flink-stateful-function-service/</link><pubDate>Fri, 15 Apr 2022 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2022-04-15-testing-a-flink-stateful-function-service/</guid><description>&lt;p&gt;&lt;strong&gt;With &lt;a href="https://nightlies.apache.org/flink/flink-statefun-docs-master/"&gt;Flink Statefun&lt;/a&gt; a powerful, polyglot data streaming framework has entered the real-time data processing landscape. It allows to break down a streaming pipeline into individual microservices which can each take care of one or more tasks. This post is about how to test these services individually without executing the whole pipeline.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Machine Learning Models Light as a Feather with ONNX</title><link>https://krudewig.dev/en/post/2021-09-09-Machine-Learning-Models-Light-as-a-Feather/</link><pubDate>Thu, 09 Sep 2021 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2021-09-09-Machine-Learning-Models-Light-as-a-Feather/</guid><description>&lt;p&gt;&lt;strong&gt;Have you ever faced the challenge to create a fast and lightweight web service out of your machine learning model? In this case you are maybe annoyed by the overhead introduced by all the machine learning dependencies from the training environment that you also need to carry over to the production environment. This post tests an approach which claims to make it possible to leave most of this behind and share the blank model in a way that it can even be used across multiple programming languages.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Envoy sidecar configuration generator</title><link>https://krudewig.dev/en/post/2021-05-06-Envoy-sidecar-configuration-generator/</link><pubDate>Thu, 06 May 2021 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2021-05-06-Envoy-sidecar-configuration-generator/</guid><description>&lt;p&gt;&lt;strong&gt;This post contains a configuration file generator for an envoy reverse proxy with all the bells and whistles. If you are looking for a working base configuration with the most important features of Envoy as sidecar proxy, this is the place to get one.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>The Throughput Paradox – Why a Machine Learning API Needs Load Shedding</title><link>https://krudewig.dev/en/post/2021-05-02-throughput-paradox/</link><pubDate>Sun, 02 May 2021 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2021-05-02-throughput-paradox/</guid><description>&lt;p&gt;&lt;strong&gt;Especially compute-intensive services like a machine learning inference API can heavily suffer from queueing effects.&lt;/strong&gt;&#10;&lt;strong&gt;I will demonstrate this with response time measurements of small demo service and show how to deal with this using load-shedding&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Getting Started with an Envoy Sidecar Proxy in 5 Minutes</title><link>https://krudewig.dev/en/post/2021-04-18-envoy-in-5-minutes/</link><pubDate>Sun, 18 Apr 2021 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2021-04-18-envoy-in-5-minutes/</guid><description>&lt;p&gt;&lt;strong&gt;This post shows the basic setup of &lt;a href="https://www.envoyproxy.io"&gt;Envoy&lt;/a&gt; as a reverse proxy in a sidecar container. It will show a typical setup of a small web API accompanied by an Envoy as sidecar which does nothing else than just forwarding requests to the backend. That&amp;rsquo;s the right starting point for adding more features and experimenting with the setup.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Multicluster Application Monitoring with Prometheus</title><link>https://krudewig.dev/en/post/2021-02-22-Multicluster-Monitoring-with-Prometheus/</link><pubDate>Mon, 22 Feb 2021 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2021-02-22-Multicluster-Monitoring-with-Prometheus/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://prometheus.io/"&gt;Prometheus&lt;/a&gt; is a popular choice for application monitoring. It is easy to set up and can be deployed alongside the applications inside a Kubernetes cluster. However, when you cannot run your main Prometheus instance within the same cluster it becomes a bit more tricky. At work we recently set up Prometheus monitoring for a web service which is deployed to independent kubernetes clusters in different regions. The official documentation is a bit sparce on this topic. In this post I will show what I learned about combining the metrics of applications running in separate Kubernetes clusters.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Hosting a Blog the GitOps Way</title><link>https://krudewig.dev/en/post/2020-12-01-Hosting-a-Blog-the-GitOps-Way/</link><pubDate>Tue, 01 Dec 2020 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/post/2020-12-01-Hosting-a-Blog-the-GitOps-Way/</guid><description>&lt;p&gt;&lt;strong&gt;Thanks to static site generators, a blog can easily be driven and controlled by markdown files in a git repository. This way, it is not necessary to set up a content management system including a database ever worrying to end up hosting yet another hacked Wordpress instance. Instead one can focus on the content and publish by simply pushing to the main branch.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Contact</title><link>https://krudewig.dev/en/contact/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/contact/</guid><description>&lt;p&gt;Let&amp;rsquo;s talk about your project, or just exchange ideas. Pick the option that works best for you.&lt;/p&gt;&#10;&lt;h2 id="book-a-meeting"&gt;Book a meeting&lt;/h2&gt;&#10;&#10;&#10;&#10;&lt;div class="calendly-consent" id="calendly-1792363575031556556" data-url="https://calendly.com/calendly-fl-krudewig-online/erstkontakt"&gt;&#10; &lt;div class="calendly-consent-box"&gt;&#10; &lt;p class="calendly-consent-text"&gt;&#10; To book a meeting, the external service &lt;strong&gt;Calendly&lt;/strong&gt; (Calendly LLC, USA) will be loaded. Your data will be transmitted to Calendly. For more information, see our&#10; &lt;a href="https://krudewig.dev/en/datenschutz/"&gt;privacy policy&lt;/a&gt;.&#10; &lt;/p&gt;&#10; &lt;button type="button" class="btn btn-primary calendly-consent-btn"&gt;&#10; Load Calendly and book a meeting&#10; &lt;/button&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Legal Notice</title><link>https://krudewig.dev/en/impressum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/impressum/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;The German version is legally binding.&lt;/strong&gt; — &lt;a href="https://krudewig.dev/de/impressum/"&gt;Impressum (Deutsch)&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="information-pursuant-to--5-ddg"&gt;Information pursuant to § 5 DDG&lt;/h2&gt;&#10;&lt;p&gt;Christian Krudewig&lt;br&gt;&#10;Marienstraße 49&lt;br&gt;&#10;53773 Hennef&lt;br&gt;&#10;Germany&lt;/p&gt;&#10;&lt;h2 id="contact"&gt;Contact&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:contact@krudewig.dev"&gt;contact@krudewig.dev&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Book a meeting:&lt;/strong&gt; &lt;a href="https://krudewig.dev/en/contact/"&gt;Online appointment via Calendly&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;VAT ID:&lt;/strong&gt; DE463655358&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Privacy Policy</title><link>https://krudewig.dev/en/datenschutz/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krudewig.dev/en/datenschutz/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;This is only a translation. The German version is legally binding:&lt;/strong&gt; &lt;a href="https://krudewig.dev/de/datenschutz/"&gt;Datenschutzerklärung (Deutsch)&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="1-controller"&gt;1. Controller&lt;/h2&gt;&#10;&lt;p&gt;The controller responsible for data processing on this website is:&lt;/p&gt;&#10;&lt;p&gt;Christian Krudewig&lt;br&gt;&#10;Marienstraße 49&lt;br&gt;&#10;53773 Hennef&lt;br&gt;&#10;Germany&lt;/p&gt;</description></item></channel></rss>