<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog on Yonatan Karp-Rudin</title><link>https://yonatankarp.com/blog/</link><description>Recent content in Blog on Yonatan Karp-Rudin</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 11 Jun 2026 00:00:00 +0100</lastBuildDate><atom:link href="https://yonatankarp.com/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>I Stopped Being My AI Agent's Memory: Building a Self-Compiling Second Brain</title><link>https://yonatankarp.com/blog/self-compiling-second-brain/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/self-compiling-second-brain/</guid><description>&lt;p&gt;If there&amp;rsquo;s one thing all the AI coding agents I&amp;rsquo;ve worked with have in common, it&amp;rsquo;s amnesia. I could spend a day teaching it how the code works, what the pitfalls are, why some decisions were made. The session ends, and all of it is gone. The next day I open a new session and start explaining from the beginning like nothing happened, wasting valuable time on a tool that was supposed to save me time.&lt;/p&gt;</description></item><item><title>XKCD: From Tile to Picture - Seeing the Full Image</title><link>https://yonatankarp.com/blog/xkcd-from-tile-to-picture/</link><pubDate>Wed, 26 Jun 2024 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/xkcd-from-tile-to-picture/</guid><description>&lt;p&gt;If there&amp;rsquo;s one thing I can say about myself, it&amp;rsquo;s that I love challenges related to software programming. They don&amp;rsquo;t need to be meaningful or even useful, but I enjoy the challenge. That&amp;rsquo;s why when I saw this message on my LinkedIn, I had to take on the challenge!&lt;/p&gt;</description></item><item><title>How to Fix Misconfigurations in RedisTemplate</title><link>https://yonatankarp.com/blog/fix-misconfigurations-redistemplate/</link><pubDate>Wed, 05 Jun 2024 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/fix-misconfigurations-redistemplate/</guid><description>&lt;p&gt;Our story begins with a colleague and me trying to debug an issue with our project for a few hours. We needed to fetch a value from Redis storage, but whenever the service ran, the fetched value was &lt;code&gt;null&lt;/code&gt;. Despite our efforts, we couldn&amp;rsquo;t find a solution on the internet, and to make matters worse, our code was actually covered by tests that had all passed!&lt;/p&gt;</description></item><item><title>Design Patterns - Prototype</title><link>https://yonatankarp.com/blog/design-patterns-prototype/</link><pubDate>Mon, 20 Nov 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/design-patterns-prototype/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The Prototype design pattern creates new objects by cloning a prototypical instance, allowing you to modify the copy without creating an object from scratch. This pattern is useful when object creation is expensive or when classes to instantiate are specified at runtime.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Design Patterns - Builder</title><link>https://yonatankarp.com/blog/design-patterns-builder/</link><pubDate>Fri, 03 Nov 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/design-patterns-builder/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Separate the construction of a complex object from its representation so that the same construction process can create different representations.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Design Patterns - Abstract Factory</title><link>https://yonatankarp.com/blog/design-patterns-abstract-factory/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/design-patterns-abstract-factory/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;TL;DR: Abstract Factory pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes. This pattern is useful when the system needs to be independent of how its products are created, composed, and represented, and when there are multiple families of products that need to be used together.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Design Patterns - Factory</title><link>https://yonatankarp.com/blog/design-patterns-factory/</link><pubDate>Tue, 24 Oct 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/design-patterns-factory/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Factory pattern provides a static method encapsulated in a class to hide implementation logic, allowing client code to focus on usage rather than object initialization. It simplifies object creation, promotes loose coupling, and supports easy switching between object types without modifying existing code.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Our Errors, Your Gain: A System Design Cautionary Tale</title><link>https://yonatankarp.com/blog/our-errors-your-gain-a-system-design-cautionary-tale/</link><pubDate>Mon, 23 Oct 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/our-errors-your-gain-a-system-design-cautionary-tale/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; This article shares my experience with a temporary solution that turned into a long-term issue. I discuss the evolution of a service and how it improved its performance by over 450% in a few hours. The story highlights the importance of addressing temporary solutions and constantly evaluating system design to optimize performance.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Observability in Action: How to Use OpenTelemetry</title><link>https://yonatankarp.com/blog/observability-in-action-opentelemetry/</link><pubDate>Tue, 17 Oct 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/observability-in-action-opentelemetry/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;ll dive into the steps for adding observability to your codebase using OpenTelemtry. Initially, we&amp;rsquo;ll develop a library that retrieves data from a remote API. Following that, we&amp;rsquo;ll construct a service using this library to fetch and save this data in a database.&lt;/p&gt;</description></item><item><title>[Interview Questions] Concurrency vs. Parallelism: Decoding the Simultaneous Illusion</title><link>https://yonatankarp.com/blog/interview-questions-concurrency-parallelism/</link><pubDate>Sat, 11 Mar 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/interview-questions-concurrency-parallelism/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;TL;DR - What are the differences between concurrent and parallel programming?&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Real-Life Problem Solving: Lessons from My Engineering Principles</title><link>https://yonatankarp.com/blog/real-life-problem-solving-engineering-principles/</link><pubDate>Sun, 05 Mar 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/real-life-problem-solving-engineering-principles/</guid><description>&lt;p&gt;My employer announced a few months ago that any employee who works for three years or more is entitled to a sabbatical. This sabbatical is a fully paid one-month vacation of your choice. Since my wife and I had accumulated a significant number of vacation days, we decided to embark on a two-month trip to Asia, a destination we had long desired to visit. In this post, I will describe step by step how I applied methods from my day-to-day work as a software engineer to solve real-life problems.&lt;/p&gt;</description></item><item><title>How To Build Your Domain Gateway With OpenAPI</title><link>https://yonatankarp.com/blog/build-domain-gateway-openapi/</link><pubDate>Wed, 14 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/build-domain-gateway-openapi/</guid><description>&lt;div class="editors-note"&gt;&#10;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; This article explains what a domain gateway is, how to build one, and why you would want it.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="what-is-a-domain-gateway"&gt;What is a Domain Gateway?&lt;/h2&gt;&#10;&lt;p&gt;A domain gateway is a private case of the API gateway pattern. The website &lt;a href="https://java-design-patterns.com/patterns/microservices-api-gateway/"&gt;java-design-patterns&lt;/a&gt; defines the gateway pattern as follows:&lt;/p&gt;</description></item><item><title>How to Use OpenAPI to Build a Robust RESTful API</title><link>https://yonatankarp.com/blog/openapi-robust-restful-api/</link><pubDate>Sun, 04 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/openapi-robust-restful-api/</guid><description>&lt;div class="editors-note"&gt;&#10;&lt;p&gt;&lt;strong&gt;Editor&amp;rsquo;s Note:&lt;/strong&gt; This post was originally written by me and published on SumUp&amp;rsquo;s blog. However, a lot has changed since then. I am no longer working for SumUp, OpenAPI has released two major versions, Spring Boot has had a major release, and even Gradle has had multiple major releases. Not only that, but my writing skills have improved dramatically since then, and over time, I have found some small mistakes in the original article. Since the original article is one of my most successful, I decided to rewrite it and publish an updated version.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="restful-api-the-ugly-part"&gt;RESTful API: The Ugly Part&lt;/h3&gt;&#10;&lt;p&gt;As a backend engineer, I have developed numerous REST APIs during my career. One of the most annoying issues I faced repeatedly was the lack of smooth integration between the backend and clients. Typos in URLs, inconsistent casing in JSON (camel case vs. snake case), passing values of the wrong type (e.g., string instead of an integer), and other similar mistakes have happened to me multiple times.&lt;/p&gt;</description></item><item><title>Create a Custom Spring Boot App Banner</title><link>https://yonatankarp.com/blog/custom-spring-boot-banner/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/custom-spring-boot-banner/</guid><description>&lt;p&gt;Today, I&amp;rsquo;d like to share a fun feature of Spring with you. It&amp;rsquo;s not new or crucial, but it&amp;rsquo;s definitely enjoyable!&lt;/p&gt;</description></item><item><title>How does HashMap work in Java?</title><link>https://yonatankarp.com/blog/how-hashmap-works-java/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/how-hashmap-works-java/</guid><description>&lt;p&gt;As an interviewer, I often ask the question about how HashMap works in Java. It helps me assess a candidate&amp;rsquo;s understanding of data structures, JVM internals, and their problem-solving approach. I&amp;rsquo;ve encountered many candidates, including juniors, mid-levels, and seniors, who couldn&amp;rsquo;t answer this question correctly. So, I decided to share the answer with everyone.&lt;/p&gt;</description></item><item><title>How to Break Your HashMap in Less Than a Minute</title><link>https://yonatankarp.com/blog/break-hashmap-less-than-a-minute/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/break-hashmap-less-than-a-minute/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Never use mutable objects as keys in your HashMap!&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>How to inject multiple implementations in the Spring Framework</title><link>https://yonatankarp.com/blog/inject-multiple-implementations-spring/</link><pubDate>Fri, 11 Feb 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/inject-multiple-implementations-spring/</guid><description>&lt;div class="editors-note"&gt;&#10;&lt;p&gt;&lt;strong&gt;Editor&amp;rsquo;s Note:&lt;/strong&gt; This post was updated to add a section on controlling the order in which Spring injects beans into a &lt;code&gt;List&lt;/code&gt;, using the &lt;code&gt;@Order&lt;/code&gt; annotation and the &lt;code&gt;Ordered&lt;/code&gt; interface.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Recently, I had a discussion with one of my colleagues during a code review. We talked about a hidden gem in Spring (as well as other frameworks like Micronaut) that could simplify our code.&lt;/p&gt;</description></item><item><title>4 Reasons Why Amazon Keyspaces is Problematic!</title><link>https://yonatankarp.com/blog/amazon-keyspaces-problematic/</link><pubDate>Thu, 30 Dec 2021 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/amazon-keyspaces-problematic/</guid><description>&lt;p&gt;Around a year ago, my team and I were tasked with building a high-performance system capable of handling a large volume of requests. After careful consideration, we chose Cassandra as our database.&lt;/p&gt;</description></item><item><title>Build your own Twitter Bot with Kotlin</title><link>https://yonatankarp.com/blog/build-twitter-bot-kotlin/</link><pubDate>Wed, 15 Dec 2021 00:00:00 +0100</pubDate><guid>https://yonatankarp.com/blog/build-twitter-bot-kotlin/</guid><description>&lt;p&gt;I read an excellent article by &lt;a href="https://medium.com/u/f864d52751a7"&gt;Martin Erlic&lt;/a&gt; called &amp;ldquo;How To Make a Scary Russian Twitter Bot With Java&amp;rdquo; and I wanted to update it using Kotlin.&lt;/p&gt;</description></item></channel></rss>