<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Shai Almog on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/author/shai-almog/</link><description>Articles written by Shai Almog on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 03 Aug 2026 15:46:30 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/author/shai-almog/index.xml" rel="self" type="application/rss+xml"/><item><title>The Codename One JavaScript Port Is Now Free and Open Source</title><link>https://foojayio.github.io/website/today/the-codename-one-javascript-port-is-now-free-and-open-source/</link><pubDate>Mon, 03 Aug 2026 15:46:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-codename-one-javascript-port-is-now-free-and-open-source/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/javascript-free-open-source.jpg" alt="The Codename One JavaScript Port Is Now Free and Open Source" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The Codename One JavaScript port is now open source and available on every plan, including Free. You can also build the JavaScript target locally without a Codename One account.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Own Your Pixels: Native Fidelity on Your Schedule</title><link>https://foojayio.github.io/website/today/own-your-pixels-native-fidelity-on-your-schedule/</link><pubDate>Fri, 24 Jul 2026 15:45:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/own-your-pixels-native-fidelity-on-your-schedule/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/pixel-perfect-is-a-test.jpg" alt="Own Your Pixels: Native Fidelity on Your Schedule" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;An iOS or Android update can change a screen you shipped without you changing a line of code. If your app builds its UI from UIKit, SwiftUI, Compose, or Material widgets, Apple or Google owns those widget implementations. Codename One does something different. It statically links our lightweight component implementation into your native app. The UI you test is the UI your users keep after the next OS update. An update can still break a platform API or permission contract, but it cannot swap our button implementation for a new one.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>How We Beat HotSpot Performance (By Cheating, But Not Like That)</title><link>https://foojayio.github.io/website/today/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/</link><pubDate>Fri, 17 Jul 2026 17:24:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/beating-hotspot-performance.jpg" alt="How We Beat HotSpot Performance (By Cheating, But Not Like That)" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;No, we didn&amp;rsquo;t cheat in the benchmark. At least I hope we didn&amp;rsquo;t. Every optimization in this story was gated on bit identical output checksums against HotSpot, and the harness refuses to print a ratio when a checksum differs. If anything, this post is about how good HotSpot actually is. We tilted the table in our favor in every way we could, we hand tuned C code, and we still only beat it on some benchmarks. Getting there was a genuine struggle. If you want to understand the nuts and bolts of what your Java code costs, and the tradeoffs each runtime picks, I hope this is a good read.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>More Surfaces, Same Deal: Cars, Sensors, Commerce, Video And Builds</title><link>https://foojayio.github.io/website/today/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/</link><pubDate>Fri, 10 Jul 2026 18:17:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/one-codebase-more-surfaces.jpg" alt="More Surfaces, Same Deal: Cars, Sensors, Commerce, Video And Builds" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Last week&amp;rsquo;s release post was about funding open source without the bait and switch. This week&amp;rsquo;s release tests that idea again, because two of the new features touch paid infrastructure directly: Commerce and versioned builds.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Funding Open Source Without The Bait And Switch: Analytics, Native Maps, TV And More</title><link>https://foojayio.github.io/website/today/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/</link><pubDate>Sun, 05 Jul 2026 13:41:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/funding-open-source-without-the-bait-and-switch.jpg" alt="Funding Open Source Without The Bait And Switch" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Years ago I wrote a piece called &lt;a href="https://debugagent.com/open-source-bait-and-switch" target="_blank" rel="noopener noreferrer"&gt;Open Source Bait and Switch&lt;/a&gt;
. The short version: a project is released as open source while it has no business model, a community forms around it, and then the bill comes due. The project either rots into abandonware because nobody can afford to maintain it, or it sprouts a home-grown &amp;ldquo;source available&amp;rdquo; license that quietly takes back the freedoms it was given on. You have watched this happen. So have I.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Native Linux, Apple Watch, A Game Builder And Crash Protection</title><link>https://foojayio.github.io/website/today/native-linux-apple-watch-a-game-builder-and-crash-protection/</link><pubDate>Fri, 26 Jun 2026 18:43:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-linux-apple-watch-a-game-builder-and-crash-protection/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/native-linux-apple-watch-game-builder-crash-protection.jpg" alt="Native Linux, Apple Watch, A Game Builder And Crash Protection" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;This week brings a native Linux desktop port, an Apple Watch and Wear OS port, a visual Game Builder with a high-level gaming API, and a new crash-protection system, with a tutorial following each one over the coming days. There is also a large piece of work that you mostly should not have noticed: we rebuilt the build cloud, and that rebuild caused a few failed builds along the way. More on that below.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>We Will Not Sabotage Your Code</title><link>https://foojayio.github.io/website/today/we-will-not-sabotage-your-code/</link><pubDate>Sat, 20 Jun 2026 15:37:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/we-will-not-sabotage-your-code/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/we-will-not-sabotage-your-code.jpg" alt="We Will Not Sabotage Your Code" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This is a very low bar. I am genuinely saddened that I need to write it down at all, because until last week it seemed too obvious to say out loud.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Last week the &lt;a href="https://arstechnica.com/security/2026/05/fed-up-with-vibe-coders-dev-sneaks-data-nuking-prompt-injection-into-their-code/" target="_blank" rel="noopener noreferrer"&gt;news broke&lt;/a&gt;
 of an open source developer doing something I find reprehensible. The short version: fed up with &amp;ldquo;vibe coders,&amp;rdquo; he embedded a hidden prompt aimed at AI agents inside his framework, with instructions designed to destroy data on the machines of people who used it.&lt;/p&gt;</description></item><item><title>Native Java Win32, 3D Gaming, Printing and Wallet</title><link>https://foojayio.github.io/website/today/native-java-win32-3d-gaming-printing-and-wallet/</link><pubDate>Fri, 19 Jun 2026 15:45:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-java-win32-3d-gaming-printing-and-wallet/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/weekly.jpg" alt="Native Java Win32, 3D Gaming, Printing and Wallet" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This week we&amp;rsquo;re introducing native Windows support (no JVM!), a 3D graphics API, a gaming API, support for Apple Wallet, printing and more in what is probably our biggest update ever&amp;hellip; But that&amp;rsquo;s not the thing that excites me the most.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>OpenAPI, ORM, SVG and Lottie</title><link>https://foojayio.github.io/website/today/openapi-orm-svg-and-lottie/</link><pubDate>Thu, 18 Jun 2026 00:52:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/openapi-orm-svg-and-lottie/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/build-time-codegen.jpg" alt="OpenAPI, ORM, SVG and Lottie" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This is the third follow-up to &lt;a href="https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/" target="_blank" rel="noopener noreferrer"&gt;Friday&amp;rsquo;s release post&lt;/a&gt;
. Saturday&amp;rsquo;s was about how you iterate; yesterday&amp;rsquo;s was about new platform APIs in the core; today&amp;rsquo;s is about a run of pieces that change how you write the structural parts of an app.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Mac Native Builds, Live Protocols, And Open Issues Under 350</title><link>https://foojayio.github.io/website/today/mac-native-builds-live-protocols-and-open-issues-under-350/</link><pubDate>Wed, 17 Jun 2026 15:03:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/mac-native-builds-live-protocols-and-open-issues-under-350/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/weekly.jpg" alt="Mac Native Builds, Live Protocols, And Open Issues Under 350" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Our focus was all over the place this week with work that targeted many different directions: desktop, monetization, communication, media, and more. This fits with our roadmap of one platform that delivers the promise Java never delivered: WORA for Everything Everywhere.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>AI, OAuth, And Other Platform APIs In The Core</title><link>https://foojayio.github.io/website/today/codename-one-ai-oauth-and-other-platform-apis-in-the-core/</link><pubDate>Mon, 15 Jun 2026 09:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/codename-one-ai-oauth-and-other-platform-apis-in-the-core/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/platform-apis-in-the-core.jpg" alt="AI, OAuth, And Other Platform APIs In The Core" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This is the second follow-up to &lt;a href="https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/" target="_blank" rel="noopener noreferrer"&gt;Friday&amp;rsquo;s release post&lt;/a&gt;
. It covers the platform APIs that moved into the framework core this release. There are two headline pieces (AI / LLM and the modern OAuth / OIDC stack), and two smaller pieces (WiFi / connectivity and share-sheet result callbacks). This continues the direction the previous release set when we moved NFC, biometrics, and cryptography into the framework core. The full background on that earlier set is in &lt;a href="https://www.codenameone.com/blog/nfc-crypto-biometrics-and-build-cloud/" target="_blank" rel="noopener noreferrer"&gt;NFC, Crypto, Biometrics, And A New Build Cloud&lt;/a&gt;
.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>On-Device Debugging And JUnit 5</title><link>https://foojayio.github.io/website/today/on-device-debugging-and-junit-5/</link><pubDate>Fri, 12 Jun 2026 08:49:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/on-device-debugging-and-junit-5/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/developer-workflow-debug-and-junit.jpg" alt="On-Device Debugging And JUnit 5" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This is the first follow-up to &lt;a href="https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/" target="_blank" rel="noopener noreferrer"&gt;Friday&amp;rsquo;s release post&lt;/a&gt;
 and it covers the two changes from this release that affect how you iterate on a Codename One app rather than what the app itself does. On-device debugging that treats Java as Java on a real iPhone or a real Android device, and standard JUnit 5 against the JavaSE simulator. The first is the one we have been wanting for a long time, and is the one that takes the most explaining, so most of the post is about it.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Metal Default, A New Build Cloud, And A New Format</title><link>https://foojayio.github.io/website/today/metal-default-a-new-build-cloud-and-a-new-format/</link><pubDate>Mon, 08 Jun 2026 09:47:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/metal-default-a-new-build-cloud-and-a-new-format/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format.jpg" alt="Metal Default, A New Build Cloud, And A New Format" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This week&amp;rsquo;s release post looks different on purpose. The Friday omnibus has been getting longer and longer, and that has been working against us in two ways. SEO ignores 5,000 word pages that cover twelve unrelated topics, so the actual material gets buried instead of indexed against the queries that should find it. And when a single release post covers ten things, it becomes hard to point a colleague at &amp;ldquo;that one Codename One change from a few weeks ago&amp;rdquo; without scrolling for ten minutes.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>NFC, Crypto, Biometrics, And A New Build Cloud</title><link>https://foojayio.github.io/website/today/nfc-crypto-biometrics-and-a-new-build-cloud/</link><pubDate>Wed, 03 Jun 2026 08:37:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/nfc-crypto-biometrics-and-a-new-build-cloud/</guid><description>&lt;p&gt;Last week was about defaults. This week is about device APIs moving into the framework core, a small simulator change that revolutionizes Bluetooth development, and a preview of the new Build Cloud UI we would love your feedback on. There is a handful of other things in here too &amp;mdash; and the Metal default flip I trailed &lt;a href="https://www.codenameone.com/blog/skills-java17-and-theme-accents/" target="_blank" rel="noopener noreferrer"&gt;last week&lt;/a&gt;
 is in a different state than I expected, which is worth a word at the end.&lt;/p&gt;</description></item><item><title>Skills, Java 17, And Theme Accents with Codename One</title><link>https://foojayio.github.io/website/today/skills-java-17-and-theme-accents-with-codename-one/</link><pubDate>Wed, 27 May 2026 09:32:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/skills-java-17-and-theme-accents-with-codename-one/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/skills-java17-and-theme-accents.jpg" alt="Skills, Java 17, And Theme Accents" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Last week was about Metal and the Skin Designer. This week the headline items are about what a brand new project looks like when you generate it: the default JDK is Java 17, and every generated project ships with an &lt;code&gt;AGENTS.md&lt;/code&gt; authoring skill that lets any modern AI agent work on the project intelligently. There are also some other things worth covering: a runtime accent palette on the new native themes, three Metal follow-ups (one of which introduces a new matrix-correct translate API), the JDK 11+ String API gap closed, and iOS push permission that no longer fires at app launch.&lt;/p&gt;</description></item><item><title>Metal and Skins</title><link>https://foojayio.github.io/website/today/metal-and-skins/</link><pubDate>Thu, 21 May 2026 08:59:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/metal-and-skins/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/metal-and-skins.jpg" alt="Metal and Skins" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This post has a lot to cover. Before we get to any of it I want to take on the uncomfortable subject first: quality. Two incidents from the past two weeks deserve a public explanation, one was a bug that fits into our normal iteration loop and one was a serious mistake on my part. Both deserve the kind of explanation I would want if I were on the other side of the import.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Liquid Glass, Material 3, And A Lot Of Plumbing</title><link>https://foojayio.github.io/website/today/liquid-glass-material-3-and-a-lot-of-plumbing/</link><pubDate>Mon, 11 May 2026 09:10:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/liquid-glass-material-3-and-a-lot-of-plumbing/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes.jpg" alt="Header Image" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;It has been one of those weeks where the diff is bigger than the headline. The headline is short &amp;mdash; Codename One now ships modern native themes: an iOS &amp;ldquo;liquid glass&amp;rdquo; look and an Android Material 3 look, bundled into the iOS and Android ports, on by default in the Playground, and selectable from a brand new menu in the simulator. The diff behind that headline is several thousand lines across the platform ports, the simulator, the GUI plumbing, and a small army of screenshot tests.&lt;/p&gt;</description></item><item><title>Extending Java APIs - Add Missing Features Without the Hassle</title><link>https://foojayio.github.io/website/today/extending-java-apis-add-missing-features-without-the-hassle/</link><pubDate>Fri, 07 Mar 2025 12:03:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/extending-java-apis-add-missing-features-without-the-hassle/</guid><description>&lt;p&gt;The Java API is vast. That&amp;rsquo;s great, but sometimes a missing method or capability can be frustrating. With Manifold, developers can solve this problem without having to wait for Java to add a feature in a later version. Even more importantly, Manifold provides many such extensions out of the box, making Java better for developers. In this post, we will discuss the extension capability. It lets us change classes in the Java API in a compatible way without risk. If Java adds these APIs later then we can seamlessly switch to them.&lt;/p&gt;</description></item><item><title>Front End Debugging Part 3: Networking</title><link>https://foojayio.github.io/website/today/front-end-debugging-part-3-networking/</link><pubDate>Thu, 27 Feb 2025 16:34:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/front-end-debugging-part-3-networking/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#network-debugging-powerhouse"&gt;&lt;strong&gt;Network Debugging Powerhouse&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#reissuing-and-modifying-requests"&gt;&lt;strong&gt;Re-Issuing and Modifying Requests&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#curl-and-postman"&gt;cURL and Postman&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#throttling-and-debugging-race-conditions"&gt;&lt;strong&gt;Throttling and Debugging Race Conditions&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-throttling-matters"&gt;Why Throttling Matters:&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use"&gt;How to Use&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#managing-state-with-storage-tools"&gt;&lt;strong&gt;Managing State with Storage Tools&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#challenges-of-state-management"&gt;Challenges of State Management&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#analyzing-request-and-response-headers"&gt;&lt;strong&gt;Analyzing Request and Response Headers&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-in-incognito-mode-limitations-and-best-practices"&gt;&lt;strong&gt;Debugging in Incognito Mode: Limitations and Best Practices&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#connecting-the-frontend-to-the-database"&gt;&lt;strong&gt;Connecting the Front-End to the Database&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debugging network communication issues is a critical skill for any front-end developer. While tools like &lt;a href="https://debugagent.com/wireshark-tcpdump-a-debugging-power-couple" target="_blank" rel="noopener noreferrer"&gt;Wireshark&lt;/a&gt;
 provide low-level insight into network traffic, modern browsers like Chrome and Firefox offer developer tools with powerful features tailored for web development. In this post we will discuss using browser-based tools to debug network communication issues effectively. This is a far better approach than using Wireshark for the vast majority of simple cases.&lt;/p&gt;</description></item><item><title>Front End Debugging Part 2: Console.log() to the Max</title><link>https://foojayio.github.io/website/today/front-end-debugging-part-2-console-log-to-the-max/</link><pubDate>Tue, 03 Dec 2024 16:28:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/front-end-debugging-part-2-console-log-to-the-max/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-frontend-logging-vs-backend-logging"&gt;&lt;strong&gt;Understanding Front-End Logging vs. Back-End Logging&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#leveraging-console-log-levels"&gt;&lt;strong&gt;Leveraging Console Log Levels&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#customizing-console-output-with-css"&gt;&lt;strong&gt;Customizing Console Output with CSS&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#stack-tracing-with-consoletrace"&gt;&lt;strong&gt;Stack Tracing with console.trace()&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#assertions-for-designbycontract"&gt;&lt;strong&gt;Assertions for Design-by-Contract&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#printing-tables-for-clearer-data-visualization"&gt;&lt;strong&gt;Printing Tables for Clearer Data Visualization&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#copying-objects-to-the-clipboard"&gt;&lt;strong&gt;Copying Objects to the Clipboard&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#inspecting-with-consoledir-and-dirxml"&gt;&lt;strong&gt;Inspecting with console.dir() and dirxml()&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#counting-function-calls"&gt;&lt;strong&gt;Counting Function Calls&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#organizing-logs-with-groups"&gt;&lt;strong&gt;Organizing Logs with Groups&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#chromespecific-debugging-features"&gt;&lt;strong&gt;Chrome-Specific Debugging Features&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;&lt;strong&gt;Final Word&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/front-end-debugging-part-1-not-just-console-log/"&gt;my previous article&lt;/a&gt;
, I talked about why &lt;code&gt;Console.log()&lt;/code&gt; isn&amp;rsquo;t the most effective debugging tool. In this installment, we will do a bit of an about-face and discuss the ways in which &lt;code&gt;Console.log()&lt;/code&gt; is fantastic. Let&amp;rsquo;s break down some essential concepts and practices that can make your debugging life much easier and more productive.&lt;/p&gt;</description></item><item><title>strace Revisited: Simple is Beautiful</title><link>https://foojayio.github.io/website/today/strace-revisited-simple-is-beautiful/</link><pubDate>Tue, 26 Nov 2024 14:58:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/strace-revisited-simple-is-beautiful/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-strace-and-its-origins"&gt;Understanding strace and its Origins&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-look-back-strace-and-dtrace"&gt;&lt;strong&gt;A Look Back: strace and dtrace&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#originating-from-sun-microsystems"&gt;&lt;strong&gt;Originating from Sun Microsystems&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#technical-functioning-of-strace"&gt;Technical Functioning of strace&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-role-of-ptrace-in-strace"&gt;&lt;strong&gt;The Role of ptrace in strace&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#comparing-with-dtrace"&gt;&lt;strong&gt;Comparing with DTrace&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#practical-usage-and-advantages"&gt;Practical Usage and Advantages&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#ease-of-use-and-accessibility"&gt;&lt;strong&gt;Ease of Use and Accessibility&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#favored-in-linux-environments"&gt;&lt;strong&gt;Favored in Linux Environments&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#strace-in-action-a-closer-look-at-system-calls"&gt;strace in Action: A Closer Look at System Calls&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#basic-usage-and-output-analysis"&gt;&lt;strong&gt;Basic Usage and Output Analysis&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#interpreting-system-calls-for-debugging"&gt;&lt;strong&gt;Interpreting System Calls for Debugging&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#advanced-features-and-tips"&gt;Advanced Features and Tips&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#filtering-system-calls-for-efficiency"&gt;&lt;strong&gt;Filtering System Calls for Efficiency&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#exploring-a-variety-of-system-calls"&gt;&lt;strong&gt;Exploring a Variety of System Calls&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#strace-and-java-a-special-case"&gt;strace and Java: A Special Case&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#strace-with-the-jvm"&gt;&lt;strong&gt;strace with the JVM&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#allocations-and-threading-in-java"&gt;&lt;strong&gt;Allocations and Threading in Java&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-0-in-the-realm-of-system-debugging-particularly-on-linux-platforms-strace-stands-out-as-a-powerful-and-indispensable-tool-its-simplicity-and-efficacy-make-it-the-go-to-solution-for-diagnosing-and-understanding-system-level-operations-especially-when-working-with-servers-and-containers"&gt;In the realm of system debugging, particularly on Linux platforms, strace stands out as a powerful and indispensable tool. Its simplicity and efficacy make it the go-to solution for diagnosing and understanding system-level operations, especially when working with servers and containers.&lt;/h3&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll delve into the nuances of strace, from its history and technical functioning to practical applications and advanced features. Whether you&amp;rsquo;re a seasoned developer or just starting out, this exploration will enhance your diagnostic toolkit and provide deeper insights into the workings of Linux systems.&lt;/p&gt;</description></item><item><title>Front End Debugging Part 1: Not just Console Log</title><link>https://foojayio.github.io/website/today/front-end-debugging-part-1-not-just-console-log/</link><pubDate>Tue, 05 Nov 2024 14:01:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/front-end-debugging-part-1-not-just-console-log/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#instant-debugging-with-the-raw-debugger-endraw-keyword"&gt;&lt;strong&gt;Instant Debugging with the&lt;/strong&gt; &lt;code&gt;debugger&lt;/code&gt; Keyword&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#triggering-debugging-from-the-console"&gt;&lt;strong&gt;Triggering Debugging from the Console&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#dom-breakpoints-monitoring-dom-changes"&gt;&lt;strong&gt;DOM Breakpoints: Monitoring DOM Changes&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#xhr-breakpoints-uncovering-hidden-network-calls"&gt;&lt;strong&gt;XHR Breakpoints: Uncovering Hidden Network Calls&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#simulating-environments-for-debugging"&gt;&lt;strong&gt;Simulating Environments for Debugging&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-layout-and-style-issues"&gt;&lt;strong&gt;Debugging Layout and Style Issues&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;As a Java developer, most of my focus is on the backend side of debugging. Front-end debugging poses different challenges and has sophisticated tools of its own. Unfortunately, print-based debugging has become the norm in front-end. To be fair, it makes more sense there as the cycles are different and the problem is always a single user problem. But even if you choose to use &lt;code&gt;Console.log&lt;/code&gt;, there&amp;rsquo;s a lot of nuance to pick up there.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>The Art of Full Stack Debugging</title><link>https://foojayio.github.io/website/today/the-art-of-full-stack-debugging/</link><pubDate>Fri, 25 Oct 2024 07:24:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-art-of-full-stack-debugging/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#full-stack-development-a-shifting-definition"&gt;Full Stack Development, A Shifting Definition&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-full-stack-debugging-approach"&gt;The Full Stack Debugging Approach&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#frontend-debugging-tools-and-techniques"&gt;Frontend Debugging: Tools and Techniques&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#it-isnt-just-consolelog"&gt;It isn&amp;rsquo;t &amp;ldquo;Just Console.log&amp;rdquo;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-power-of-developer-tools"&gt;The Power of Developer Tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tackling-code-obfuscation"&gt;Tackling Code Obfuscation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-across-layers"&gt;Debugging Across Layers&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#isolating-issues-across-the-stack"&gt;Isolating Issues Across the Stack&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-importance-of-systemlevel-debugging"&gt;The Importance of System-Level Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#embracing-complexity"&gt;Embracing Complexity&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-0-full-stack-development-is-often-likened-to-an-intricate-balancing-act-where-developers-are-expected-to-juggle-multiple-responsibilities-across-the-frontend-backend-database-and-beyond-as-the-definition-of-full-stack-development-continues-to-evolve-so-too-does-the-approach-to-debugging"&gt;Full stack development is often likened to an intricate balancing act, where developers are expected to juggle multiple responsibilities across the frontend, backend, database, and beyond. As the definition of full stack development continues to evolve, so too does the approach to debugging.&lt;/h3&gt;
&lt;p&gt;Full stack debugging is an essential skill for developers, as it involves tracking issues through multiple layers of an application, often navigating domains where one&amp;rsquo;s knowledge may only be cursory. In this blog post I aim to explore the nuances of full stack debugging, offering practical tips and insights for developers navigating the complex web of modern software development.&lt;/p&gt;</description></item><item><title>Unleashing the Power of Git Bisect</title><link>https://foojayio.github.io/website/today/unleashing-the-power-of-git-bisect/</link><pubDate>Tue, 08 Oct 2024 08:15:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/unleashing-the-power-of-git-bisect/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-essence-of-debugging-with-git"&gt;The Essence of Debugging with Git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#setting-the-stage-for-debugging"&gt;Setting the Stage for Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#initiating-bisect-mode"&gt;Initiating Bisect Mode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#marking-the-known-good-revision"&gt;Marking the Known Good Revision&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#marking-the-known-bad-revision"&gt;Marking the Known Bad Revision&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#bisecting-to-find-the-culprit"&gt;Bisecting to Find the Culprit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#expected-output"&gt;Expected Output&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#reset-and-analysis"&gt;Reset and Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#advanced-usage-and-tips"&gt;Advanced Usage and Tips&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#script-automation-for-precision-and-efficiency"&gt;Script Automation for Precision and Efficiency&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-flaky-tests-with-strategy"&gt;Handling Flaky Tests with Strategy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#skipping-commits-with-care"&gt;Skipping Commits with Care&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#unraveling-a-regression-mystery"&gt;Unraveling a Regression Mystery&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We don&amp;rsquo;t usually think of Git as a debugging tool. Surprisingly, Git shines not just as a version control system but also as a potent debugging ally when dealing with the tricky matter of regressions.&lt;/p&gt;</description></item><item><title>Debugging Kubernetes - Troubleshooting Guide</title><link>https://foojayio.github.io/website/today/debugging-kubernetes-troubleshooting-guide/</link><pubDate>Mon, 26 Aug 2024 16:45:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-kubernetes-troubleshooting-guide/</guid><description>&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#identifying-configuration-issues"&gt;Identifying Configuration Issues&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#common-causes-and-solutions"&gt;Common Causes and Solutions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#detailed-investigation-steps"&gt;Detailed Investigation Steps&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#dealing-with-image-pull-errors"&gt;Dealing with Image Pull Errors&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#troubleshooting-steps"&gt;Troubleshooting Steps&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-node-issues"&gt;Handling Node Issues&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#preventive-measures"&gt;Preventive Measures&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#managing-missing-configuration-keys-or-secrets"&gt;Managing Missing Configuration Keys or Secrets&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#utilizing-buildg-for-interactive-debugging"&gt;Utilizing Buildg for Interactive Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;As Kubernetes continues to revolutionize the way we manage and deploy applications, understanding its intricacies becomes essential for developers and operations teams alike. If you don&amp;rsquo;t have a dedicated DevOps team you probably shouldn&amp;rsquo;t be working with Kubernetes.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Failure is Required: Understanding Fail-Safe &amp; Fail-Fast Strategies</title><link>https://foojayio.github.io/website/today/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/</link><pubDate>Tue, 30 Jul 2024 08:08:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#failfast"&gt;Fail-Fast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#failsafe"&gt;Fail-Safe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#choosing-between-failfast-and-failsafe"&gt;Choosing Between Fail-Fast and Fail-Safe&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#balancing-both"&gt;Balancing Both&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#consistent-layer-behavior"&gt;Consistent Layer Behavior&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#retrys-are-not-failsafe"&gt;Retry&amp;rsquo;s Are not Fail-Safe&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#redefining-failure"&gt;Redefining Failure&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#data-corruption"&gt;Data Corruption&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#dont-fix-the-bug"&gt;Don&amp;rsquo;t Fix the Bug&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-failure"&gt;Debugging Failure&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#avoiding-cascading-failure"&gt;Avoiding Cascading Failure&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#hybrid-in-production"&gt;Hybrid in Production&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Failures in software systems are inevitable. How these failures are handled can significantly impact system performance, reliability, and the business&amp;rsquo;s bottom line.&lt;/p&gt;
&lt;p&gt;In this article, I want to discuss the upside of failure. Why you should seek failure, why failure is good and why avoiding failure can reduce the reliability of your application. We will start with the discussion of fail-fast vs. fail-safe, this will take us to the second discussion about failures in general.&lt;/p&gt;</description></item><item><title>Mastering Serverless Debugging</title><link>https://foojayio.github.io/website/today/mastering-serverless-debugging/</link><pubDate>Mon, 29 Jul 2024 10:14:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/mastering-serverless-debugging/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction-to-serverless-computing"&gt;Introduction to Serverless Computing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#challenges-of-serverless-debugging"&gt;Challenges of Serverless Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#disconnected-environments"&gt;Disconnected Environments&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#lack-of-standardization"&gt;Lack of Standardization&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#limited-debugging-tools"&gt;Limited Debugging Tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#concurrency-and-scale"&gt;Concurrency and Scale&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#effective-strategies-for-serverless-debugging"&gt;Effective Strategies for Serverless Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#local-debugging-with-ide-remote-capabilities"&gt;Local Debugging with IDE Remote Capabilities&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-feature-flags-for-debugging"&gt;Using Feature Flags for Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#staged-rollouts-and-canary-deployments"&gt;Staged Rollouts and Canary Deployments&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#comprehensive-logging"&gt;Comprehensive Logging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#embracing-idempotency"&gt;Embracing Idempotency&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-a-lambda-application-locally-with-aws-sam"&gt;Debugging a Lambda Application Locally with AWS SAM&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#setting-up-the-local-environment"&gt;Setting Up the Local Environment&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#running-the-hello-world-application-locally"&gt;Running the Hello World Application Locally&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#configuring-remote-debugging"&gt;Configuring Remote Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-debugger-timeouts"&gt;Handling Debugger Timeouts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Serverless computing has emerged as a transformative approach to deploying and managing applications. The theory is that by abstracting away the underlying infrastructure, developers can focus solely on writing code.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Wireshark &amp; tcpdump: A Debugging Power Couple</title><link>https://foojayio.github.io/website/today/wireshark-tcpdump-a-debugging-power-couple/</link><pubDate>Mon, 08 Jul 2024 14:51:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/wireshark-tcpdump-a-debugging-power-couple/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction-to-wireshark"&gt;Introduction to Wireshark&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#browser-network-monitors"&gt;Browser Network Monitors&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#installation-and-getting-started"&gt;Installation and Getting Started&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#navigating-through-noise-with-filters"&gt;Navigating Through Noise with Filters&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#deep-dive-into-data-analysis"&gt;Deep Dive into Data Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#beyond-basic-usage"&gt;Beyond Basic Usage&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-basics-of-https-encryption"&gt;The Basics of HTTPS Encryption&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#methods-for-decrypting-https-in-wireshark"&gt;Methods for Decrypting HTTPS in Wireshark&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#premaster-secret-key-logging"&gt;&lt;strong&gt;Pre-Master Secret Key Logging&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-a-proxy"&gt;&lt;strong&gt;Using a Proxy&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#integrating-tcpdump-with-wireshark-for-enhanced-network-analysis"&gt;Integrating tcpdump with Wireshark for Enhanced Network Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-role-of-tcpdump-in-network-troubleshooting"&gt;The Role of tcpdump in Network Troubleshooting&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#key-scenarios-for-tcpdump-usage"&gt;Key Scenarios for tcpdump Usage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-tcpdump-effectively"&gt;Using tcpdump Effectively&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#challenges-and-considerations"&gt;Challenges and Considerations&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wireshark, the free open-source packet sniffer and network protocol analyzer, has cemented itself as an indispensable tool in network troubleshooting, analysis, and security (on both sides).&lt;/p&gt;</description></item><item><title>Why is Kubernetes Debugging so Problematic?</title><link>https://foojayio.github.io/website/today/why-is-kubernetes-debugging-so-problematic/</link><pubDate>Thu, 20 Jun 2024 06:37:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-is-kubernetes-debugging-so-problematic/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-immutable-nature-of-containers"&gt;The Immutable Nature of Containers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-limitations-of-raw-kubectl-exec-endraw-"&gt;The Limitations of &lt;code&gt;kubectl exec&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#avoiding-direct-modifications"&gt;Avoiding Direct Modifications&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-ephemeral-containers"&gt;Enter Ephemeral Containers&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#using-raw-kubectl-debug-endraw-"&gt;Using &lt;code&gt;kubectl debug&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#practical-application-of-ephemeral-containers"&gt;Practical Application of Ephemeral Containers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#security-considerations"&gt;Security Considerations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#interlude-the-role-of-observability"&gt;Interlude: The Role of Observability&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#command-line-debugging"&gt;Command Line Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#connecting-a-standard-ide-for-remote-debugging"&gt;Connecting a Standard IDE for Remote Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Debugging application issues in a Kubernetes cluster can often feel like navigating a labyrinth. Containers are ephemeral by design, intended to be immutable once deployed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This presents a unique challenge when something goes wrong and we need to dig into the issue. Before diving into the debugging tools and techniques, it&amp;rsquo;s essential to grasp the core problem: why modifying container instances directly is a bad idea.&lt;/p&gt;</description></item><item><title>Debugging Kubernetes Part 1: An Introduction</title><link>https://foojayio.github.io/website/today/debugging-kubernetes-part-1-an-introduction/</link><pubDate>Wed, 05 Jun 2024 06:12:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-kubernetes-part-1-an-introduction/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction-to-kubernetes-and-distributed-systems"&gt;Introduction to Kubernetes and Distributed Systems&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-evolution-of-deployment-technologies"&gt;The Evolution of Deployment Technologies&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-virtualization"&gt;Enter Virtualization&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#rise-of-containers"&gt;Rise of Containers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#rise-of-orchestration"&gt;Rise of Orchestration&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-kubernetes"&gt;Enter Kubernetes&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-kubernetes-stands-out"&gt;Why Kubernetes Stands Out&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#kubernetes-for-developers"&gt;Kubernetes For Developers&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#kubernetes-basics-in-practice"&gt;Kubernetes Basics In Practice&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While debugging in an IDE or using simple command line tools is relatively straightforward, the real challenge lies in production debugging. Modern production environments have enabled sophisticated self-healing deployments, yet they have also made troubleshooting more complex. Kubernetes (aka k8s) is probably the most well known orchestration production environment. To effectively teach debugging in Kubernetes, it&amp;rsquo;s essential to first introduce its fundamental principles.&lt;/p&gt;</description></item><item><title>Software Testing as a Debugging Tool</title><link>https://foojayio.github.io/website/today/software-testing-as-a-debugging-tool/</link><pubDate>Wed, 15 May 2024 07:43:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/software-testing-as-a-debugging-tool/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-intersection-of-debugging-and-testing"&gt;The Intersection of Debugging and Testing&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#unit-tests"&gt;Unit Tests&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#integration-tests"&gt;Integration Tests&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#coverage"&gt;Coverage&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-debugfix-cycle"&gt;The Debug-Fix Cycle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#composing-tests-with-debuggers"&gt;Composing Tests with Debuggers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#testdriven-development"&gt;Test-Driven Development&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debugging is not just about identifying errors&amp;mdash;it&amp;rsquo;s about instituting a reliable process for ensuring software health and longevity. In this post we discuss the role of software testing in debugging, including foundational concepts and how they converge to improve software quality.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/yap509UZz6M?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;As a side note, if you like the content of this and the other posts in this series check out my &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;Debugging book&lt;/a&gt;
 that covers &lt;strong&gt;t&lt;/strong&gt; his subject. If you have friends that are learning to code I&amp;rsquo;d appreciate a reference to my &lt;a href="https://www.amazon.com/Java-Basics-Practical-Introduction-Full-Stack-ebook/dp/B0CCPGZ8W1/" target="_blank" rel="noopener noreferrer"&gt;Java Basics book.&lt;/a&gt;
 If you want to get back to Java after a while check out my &lt;a href="https://www.amazon.com/Java-21-Explore-cutting-edge-features/dp/9355513925/" target="_blank" rel="noopener noreferrer"&gt;Java 8 to 21 book&lt;/a&gt;
&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Debugging Using JMX Revisited</title><link>https://foojayio.github.io/website/today/debugging-using-jmx-revisited/</link><pubDate>Thu, 18 Apr 2024 13:02:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-using-jmx-revisited/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-need-for-advanced-management-tools-in-development"&gt;The Need for Advanced Management Tools in Development&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction-to-jmx-java-management-extensions"&gt;Introduction to JMX (Java Management Extensions)&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-mbeans"&gt;&lt;strong&gt;Understanding MBeans&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#spring-and-management-beans"&gt;Spring and Management Beans&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tooling-for-jmx-management"&gt;Tooling for JMX Management&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#getting-started-with-jmxterm"&gt;Getting Started with JMXTerm&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#leveraging-jmx-in-debugging-and-management"&gt;Leveraging JMX in Debugging and Management&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#exposing-mbeans-in-spring-boot"&gt;Exposing MBeans in Spring Boot&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-spring-boot-jmx-support"&gt;Understanding Spring Boot JMX Support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#expose-an-mbean-in-spring-boot"&gt;Expose an MBean in Spring Boot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#example-exposing-a-simple-configuration-mbean"&gt;Example: Exposing a Simple Configuration MBean&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debugging effectively requires a nuanced approach, similar to using tongs that tightly grip the problem from both sides.&lt;/p&gt;</description></item><item><title>Debugging Streams with Peek</title><link>https://foojayio.github.io/website/today/debugging-streams-with-peek/</link><pubDate>Fri, 05 Apr 2024 08:05:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-streams-with-peek/</guid><description>&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-java-streams"&gt;Understanding Java Streams&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-simple-stream-example"&gt;A Simple Stream Example&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#what-is-the-raw-peek-endraw-method"&gt;What is the &lt;code&gt;peek()&lt;/code&gt; Method?&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#debugging-with-raw-peek-endraw-"&gt;Debugging with &lt;code&gt;peek()&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#uncovering-common-bugs-with-raw-peek-endraw-"&gt;Uncovering Common Bugs with &lt;code&gt;peek()&lt;/code&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#filtering-issues"&gt;Filtering Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#large-data-sets"&gt;Large Data Sets&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#addressing-side-effects"&gt;&lt;strong&gt;Addressing Side Effects&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#limitations-and-pitfalls"&gt;Limitations and Pitfalls&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#potential-for-misuse-in-production-code"&gt;Potential for Misuse in Production Code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#performance-overhead"&gt;Performance Overhead&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#side-effects-and-functional-purity"&gt;Side Effects and Functional Purity&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-right-tool-for-the-job"&gt;The Right Tool for the Job&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#navigating-the-pitfalls"&gt;Navigating the Pitfalls&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-thoughts"&gt;Final Thoughts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I blogged about &lt;a href="https://debugagent.com/debugging-streams-and-collections" target="_blank" rel="noopener noreferrer"&gt;Java Stream debugging&lt;/a&gt;
 in the past but I skipped an important method that&amp;rsquo;s worthy of a post of its own: peek.&lt;/p&gt;</description></item><item><title>DTrace Revisited: Advanced Debugging Techniques</title><link>https://foojayio.github.io/website/today/dtrace-revisited-advanced-debugging-techniques/</link><pubDate>Tue, 13 Feb 2024 07:46:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/dtrace-revisited-advanced-debugging-techniques/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#dtrace-overview"&gt;DTrace Overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#understanding-dtraces-capabilities"&gt;Understanding DTrace&amp;rsquo;s Capabilities&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#system-monitoring-and-analysis"&gt;System Monitoring and Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#process-and-performance-analysis"&gt;Process and Performance Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#customizability-and-flexibility"&gt;Customizability and Flexibility&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#real-world-applications"&gt;Real-World Applications&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#performance-and-compatibility-of-dtrace"&gt;Performance and Compatibility of DTrace&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#cross-platform-compatibility"&gt;&lt;strong&gt;Cross-Platform Compatibility&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#compatibility-challenges-on-macos"&gt;&lt;strong&gt;Compatibility Challenges on MacOS&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#customizability-and-flexibility-of-dtrace"&gt;Customizability and Flexibility of DTrace&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#adaptability-to-various-scenarios"&gt;&lt;strong&gt;Adaptability to Various Scenarios&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#examples-of-customizable-probes"&gt;&lt;strong&gt;Examples of Customizable Probes&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#real-world-applications-of-dtrace"&gt;Real-World Applications of DTrace&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#final-words"&gt;Final Words&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When we think of debugging, we think of breakpoints in IDEs, stepping over, inspecting variables, etc.&lt;/p&gt;
&lt;p&gt;However, there are instances where stepping outside the conventional confines of an IDE becomes essential to track and resolve complex issues. This is where tools like DTrace come into play, offering a more nuanced and powerful approach to debugging than traditional methods.&lt;/p&gt;</description></item><item><title>Building gdocweb with Java 21, Spring Boot 3.x and Beyond</title><link>https://foojayio.github.io/website/today/building-gdocweb-with-java-21-spring-boot-3-x-and-beyond/</link><pubDate>Tue, 30 Jan 2024 12:40:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-gdocweb-with-java-21-spring-boot-3-x-and-beyond/</guid><description>&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#introducing-gdocweb"&gt;Introducing gdocweb&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#java-21-and-spring-boot-3x-innovation-and-maturity"&gt;Java 21 and Spring Boot 3.x: Innovation and Maturity&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#graalvm-native-image-for-efficiency"&gt;GraalVM Native Image for Efficiency&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#implementing-graalvm"&gt;Implementing GraalVM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#facing-the-production-challenges"&gt;Facing the Production Challenges&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-decision-to-move-on"&gt;The Decision to Move On&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#deployment-vps-and-docker-compose"&gt;Deployment: VPS and Docker Compose&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#avoiding-raw-vps-deployment"&gt;Avoiding Raw VPS Deployment&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#steering-clear-of-managed-containers-orchestration"&gt;Steering Clear of Managed Containers &amp;amp; Orchestration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-choice-of-docker-compose"&gt;The Choice of Docker Compose&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#front-end-thymeleaf-over-modern-alternatives"&gt;Front-End: Thymeleaf Over Modern Alternatives&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#react-modern-but-not-a-one-size-fits-all-solution"&gt;React: Modern but Not a One-Size-Fits-All Solution&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-appeal-of-thymeleaf"&gt;The Appeal of Thymeleaf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#considering-htmx-for-dynamic-functionality"&gt;Considering HTMX for Dynamic Functionality&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Starting a new project is always a mix of excitement and tough decisions, especially when you&amp;rsquo;re stitching together familiar tools like Google Docs with powerhouses like GitHub Pages.&lt;/p&gt;</description></item><item><title>When Should we Move to Microservices?</title><link>https://foojayio.github.io/website/today/when-should-we-move-to-microservices/</link><pubDate>Thu, 28 Dec 2023 14:08:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-should-we-move-to-microservices/</guid><description>&lt;p&gt;&lt;strong&gt;Sometime ago I wrote about &lt;a href="https://debugagent.com/is-it-time-to-go-back-to-the-monolith" target="_blank" rel="noopener noreferrer"&gt;modular Monoliths and the value of modern Monolithic architecture&lt;/a&gt;
. One of the more interesting discussions that came out of that post (and &lt;a href="https://www.youtube.com/watch?v=NWu7AJJlLM8" target="_blank" rel="noopener noreferrer"&gt;video&lt;/a&gt;
) is the inverse discussion: when is it right to still pick Microservices?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like any design choice, the answer is subjective and depends on many things. But there are still general rules of thumb and global metrics we can use.&lt;/p&gt;
&lt;p&gt;Before we get into these problems, we need to understand what it means to have a Microservice architecture. Then we can gauge the benefit and price of having such an architecture.&lt;/p&gt;</description></item><item><title>The Theory of Debugging</title><link>https://foojayio.github.io/website/today/the-theory-of-debugging/</link><pubDate>Mon, 04 Dec 2023 09:18:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-theory-of-debugging/</guid><description>&lt;p&gt;&lt;strong&gt;In the landscape of software development, bugs are an inevitable part of the journey, and debugging, albeit frustrating at times, is an integral part of the process. There&amp;rsquo;s no escaping this truth, and the sooner we embrace it, the sooner we can master the art of debugging.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the next few posts in this series, I will explain the little-known &amp;ldquo;theory&amp;rdquo; behind debugging. We all know the practice of debugging (to some degree) but there is also a theoretical underpinning that most of us never learned in University (I sure as hell didn&amp;rsquo;t). Understanding this theory will help you apply a more methodical approach to problem resolution and will improve your understanding of your code.&lt;/p&gt;</description></item><item><title>Everything Bad in Java is Good for You</title><link>https://foojayio.github.io/website/today/everything-bad-in-java-is-good-for-you/</link><pubDate>Tue, 31 Oct 2023 09:28:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/everything-bad-in-java-is-good-for-you/</guid><description>&lt;p&gt;Everything Bad is Good for You is a &lt;a href="https://en.wikipedia.org/wiki/Everything_Bad_Is_Good_for_You" target="_blank" rel="noopener noreferrer"&gt;pop culture book&lt;/a&gt;
 that points out that some things we assume are bad (like TV) have tremendous benefits to our well-being. I love the premise of disrupting the conventional narrative and was reminded of that constantly when debating some of the more controversial features and problems in Java. It&amp;rsquo;s a feature, not a bug&amp;hellip;&lt;/p&gt;
&lt;p&gt;One of my favorite things about Java is its tendency to move slowly and deliberately. It doesn&amp;rsquo;t give us what we want right away. The Java team understands the requirements and looks at the other implementations, then learns from them.&lt;/p&gt;</description></item><item><title>Not a Single Trace</title><link>https://foojayio.github.io/website/today/not-a-single-trace/</link><pubDate>Fri, 20 Oct 2023 07:06:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/not-a-single-trace/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-limiting-factor"&gt;The Limiting Factor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#strength-in-numbers"&gt;Strength in Numbers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#example"&gt;Example&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#magical-apis"&gt;Magical APIs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your team celebrates a success story where a trace identified a pesky latency issue in your application&amp;rsquo;s authentication service. A fix was swiftly implemented, and we all celebrated a quick win in the next team meeting. But the celebrations are short-lived. Just days later, user complaints surged about a related payment gateway timeout. It turns out that the fix we made did improve performance at one point but created a situation in which key information was never cached. Other parts in the software react badly to the fix and we need to revert the whole thing.&lt;/p&gt;</description></item><item><title>Debugging Tips and Tricks: A Comprehensive Guide</title><link>https://foojayio.github.io/website/today/debugging-tips-and-tricks-a-comprehensive-guide/</link><pubDate>Mon, 09 Oct 2023 07:12:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-tips-and-tricks-a-comprehensive-guide/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#rubber-ducking-the-art-of-talking-it-out"&gt;&lt;strong&gt;Rubber Ducking: The Art of Talking it Out&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#moving-the-goalposts-redefining-the-bug"&gt;&lt;strong&gt;Moving the Goalposts: Redefining the Bug&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-evolution-of-a-bug"&gt;The Evolution of a Bug&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-process-of-redefinition"&gt;The Process of Redefinition&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#flipping-the-direction-multiple-angles-of-attack"&gt;&lt;strong&gt;Flipping the Direction: Multiple Angles of Attack&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-linear-approach-to-debugging"&gt;The Linear Approach to Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#disruptive-environments-exposing-hidden-bugs"&gt;&lt;strong&gt;Disruptive Environments: Exposing Hidden Bugs&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#leveraging-debugging-extensions-and-tools"&gt;&lt;strong&gt;Leveraging Debugging Extensions and Tools&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#disconnect-and-reconnect-the-power-of-a-fresh-mindset"&gt;&lt;strong&gt;Disconnect and Reconnect: The Power of a Fresh Mindset&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#embrace-the-challenge-finding-joy-in-debugging"&gt;&lt;strong&gt;Embrace the Challenge: Finding Joy in Debugging&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#strategies-to-embrace-the-debugging-challenge"&gt;Strategies to Embrace the Debugging Challenge&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#use-a-process"&gt;&lt;strong&gt;Use a Process&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debugging is an integral part of software development.&lt;/p&gt;</description></item><item><title>The Systemic Process of Debugging</title><link>https://foojayio.github.io/website/today/the-systemic-process-of-debugging/</link><pubDate>Thu, 28 Sep 2023 07:06:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-systemic-process-of-debugging/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-importance-of-issue-tracking"&gt;The Importance of Issue Tracking&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#avoiding-parallel-work-on-the-same-bug"&gt;Avoiding Parallel Work on the Same Bug&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-value-of-issue-over-pull-requests"&gt;The Value of Issue Over Pull Requests&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#communication-issue-tracker-vs-ephemeral-channels"&gt;Communication: Issue Tracker vs. Ephemeral Channels&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-we-sometimes-avoid-the-issue-tracker"&gt;Why We Sometimes Avoid the Issue Tracker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-role-of-daily-meetings"&gt;The Role of Daily Meetings&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-role-of-testing-in-debugging"&gt;The Role of Testing in Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#starting-with-unit-tests"&gt;Starting with Unit Tests&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#unit-tests-vs-integration-tests"&gt;Unit Tests vs. Integration Tests&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Debugging is an integral part of software development. However, as projects grow in size and complexity, the process of debugging requires more structure and collaboration. This process is probably something you already do as this process is deeply ingrained into most teams.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Eliminating Bugs Using the Tong Motion Approach</title><link>https://foojayio.github.io/website/today/eliminating-bugs-using-the-tong-motion-approach/</link><pubDate>Fri, 22 Sep 2023 14:53:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/eliminating-bugs-using-the-tong-motion-approach/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-the-process-of-elimination-in-debugging"&gt;Understanding the Process of Elimination in Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-basics"&gt;The Basics&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-external-tools"&gt;Using External Tools&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-power-of-unit-tests-in-debugging"&gt;The Power of Unit Tests in Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#benefits-of-mocking-frameworks"&gt;Benefits of Mocking Frameworks&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-challenges-with-flaky-issues"&gt;The Challenges with Flaky Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-concept-of-the-tong-motion"&gt;The Concept of the &amp;lsquo;Tong Motion&amp;rsquo;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#applying-the-tong-motion-to-debugging"&gt;Applying the Tong Motion to Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#an-illustrative-case-debugging-a-server-performance-issue"&gt;An Illustrative Case: Debugging a Server Performance Issue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#wrapping-up"&gt;Wrapping Up&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Software debugging can often feel like a never-ending maze. Just when you think you&amp;rsquo;re on the right track, you hit a dead-end. But, by employing the age-old technique of the process of elimination, and using the analogy of the &amp;lsquo;Tong Motion,&amp;rsquo; we can navigate this maze more effectively.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>The Evolution of Bugs</title><link>https://foojayio.github.io/website/today/the-evolution-of-bugs/</link><pubDate>Tue, 12 Sep 2023 03:34:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-evolution-of-bugs/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#memory-management-the-past-and-the-present"&gt;Memory Management: The Past and The Present&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-classic-challenges-memory-leaks-and-corruption"&gt;The Classic Challenges: Memory Leaks and Corruption&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-garbage-collection-a-mixed-blessing"&gt;Enter Garbage Collection: A Mixed Blessing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#memory-profiling-the-contemporary-solution"&gt;Memory Profiling: The Contemporary Solution&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#concurrency-a-double-edged-sword"&gt;Concurrency: A Double-Edged Sword&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-bright-side-predictable-threading"&gt;The Bright Side: Predictable Threading&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-murky-waters-multi-container-concurrency"&gt;The Murky Waters: Multi-Container Concurrency&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#reproducing-the-elusive-threading-bugs"&gt;Reproducing The Elusive: Threading Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#race-conditions-the-ever-present-ghost"&gt;Race Conditions: The Ever-Present Ghost&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-pervasiveness-of-state-bugs"&gt;The Pervasiveness of State Bugs&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-are-state-bugs"&gt;What Are State Bugs?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#from-simple-variables-to-complex-data-structures"&gt;From Simple Variables to Complex Data Structures&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#interactions-and-events-where-timing-matters"&gt;Interactions and Events: Where Timing Matters&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#persistence-when-bugs-linger"&gt;Persistence: When Bugs Linger&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#concurrency-compounds-state-issues"&gt;Concurrency Compounds State Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools-and-strategies-to-combat-state-bugs"&gt;Tools and Strategies to Combat State Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#exceptions-the-noisy-neighbor"&gt;Exceptions: The Noisy Neighbor&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-are-exceptions"&gt;What Are Exceptions?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-informative-nature-of-exceptions"&gt;The Informative Nature of Exceptions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#causes-of-exceptions"&gt;Causes of Exceptions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-exceptions-a-delicate-balance"&gt;Handling Exceptions: A Delicate Balance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#proactive-prevention"&gt;Proactive Prevention&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#faults-beyond-the-surface"&gt;Faults: Beyond the Surface&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-constitutes-a-fault"&gt;What Constitutes a Fault?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#origins-of-faults"&gt;Origins of Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#detecting-and-isolating-faults"&gt;Detecting and Isolating Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#addressing-faults"&gt;Addressing Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-value-of-learning-from-faults"&gt;The Value of Learning from Faults&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#thread-bugs-unraveling-the-knot"&gt;Thread Bugs: Unraveling the Knot&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-glimpse-into-thread-bugs"&gt;A Glimpse into Thread Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-common-culprits-behind-thread-bugs"&gt;The Common Culprits Behind Thread Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#diagnosing-the-tangle"&gt;Diagnosing the Tangle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#untangling-the-knot"&gt;Untangling the Knot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#race-conditions-always-a-step-ahead"&gt;Race Conditions: Always a Step Ahead&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-exactly-is-a-race-condition"&gt;What Exactly is a Race Condition?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-are-race-conditions-so-tricky"&gt;Why are Race Conditions so Tricky?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#guarding-against-the-unpredictable"&gt;Guarding Against the Unpredictable&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#testing-for-races"&gt;Testing for Races&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#performance-pitfalls-monitor-contention-and-resource-starvation"&gt;Performance Pitfalls: Monitor Contention and Resource Starvation&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#monitor-contention-a-bottleneck-in-disguise"&gt;Monitor Contention: A Bottleneck in Disguise&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-its-problematic"&gt;Why It&amp;rsquo;s Problematic&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#mitigation-strategies"&gt;Mitigation Strategies&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#resource-starvation-the-silent-performance-killer"&gt;Resource Starvation: The Silent Performance Killer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-impact"&gt;The Impact&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#solutions-to-counteract-starvation"&gt;Solutions to Counteract Starvation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-bigger-picture"&gt;The Bigger Picture&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Programming, regardless of the era, has been riddled with bugs that vary in nature but often remain consistent in their basic problems. Whether we&amp;rsquo;re talking about mobile, desktop, server, or different operating systems and languages, bugs have always been a constant challenge. Here&amp;rsquo;s a dive into the nature of these bugs and how we can tackle them effectively.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>It's 2AM Do you Know What Your Code is Doing?</title><link>https://foojayio.github.io/website/today/its-2am-do-you-know-what-your-code-is-doing/</link><pubDate>Fri, 01 Sep 2023 06:53:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/its-2am-do-you-know-what-your-code-is-doing/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#observability-isnt-pillars"&gt;Observability isn&amp;rsquo;t Pillars&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tracing-and-opentelemetry"&gt;Tracing and OpenTelemetry&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#background-developer-observability"&gt;Background Developer Observability&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enough-exposition"&gt;Enough Exposition&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-does-this-help-at-2am"&gt;How Does This Help at 2AM?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once we press the merge button, that code is no longer our responsibility. If it performs sub-optimally or has a bug, it is now the problem of the DevOps team, the SRE, etc. Unfortunately, those teams work with a different toolset. If my code uses up too much RAM, they will increase RAM. When the code runs slower, they will increase CPU. In case the code crashes, they will increase concurrent instances.&lt;/p&gt;</description></item><item><title>Debugging as a Process of Isolating Assumptions</title><link>https://foojayio.github.io/website/today/debugging-as-a-process-of-isolating-assumptions/</link><pubDate>Wed, 23 Aug 2023 08:16:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-as-a-process-of-isolating-assumptions/</guid><description>&lt;p&gt;&lt;strong&gt;Debugging is an integral part of any software development process.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s a systematic hunt for bugs and mistakes that may be hidden in the intricate lines of your code.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Much like a hunter and its prey, it requires a precise method and a set of specific tools.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s delve deeper into the fascinating process of isolating assumptions to effectively debug your code.&lt;/strong&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Qw6coM798AE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;Before I proceed with this week&amp;rsquo;s post if you have friends who are learning to code&amp;hellip; I &lt;a href="https://www.amazon.com/Java-Basics-Practical-Introduction-Full-Stack-ebook/dp/B0CCPGZ8W1/" target="_blank" rel="noopener noreferrer"&gt;published a new book for Java beginners&lt;/a&gt;
 with no prior knowledge (for learning programming from scratch). Each chapter also has an accompanying video and I think there&amp;rsquo;s no book quite like it for beginners. I would appreciate spreading the word on this.&lt;/p&gt;</description></item><item><title>Is OpenJDK Just a Drop-In Replacement?</title><link>https://foojayio.github.io/website/today/is-openjdk-just-a-drop-in-replacement/</link><pubDate>Fri, 18 Aug 2023 07:58:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/is-openjdk-just-a-drop-in-replacement/</guid><description>&lt;p&gt;&lt;strong&gt;I don&amp;rsquo;t know anyone who is still using the Oracle JDK. It has been my recommendation for quite a while to just switch to an OpenJDK distribution as they are roughly drop-in replacements for Oracle&amp;rsquo;s official JDK. I&amp;rsquo;ve repeated that advice quite frequently but I guess I glossed over a lot of details that might be insignificant for hackers but can become a pretty big deal in an enterprise setting.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Can't Reproduce a Bug?</title><link>https://foojayio.github.io/website/today/cant-reproduce-a-bug/</link><pubDate>Mon, 14 Aug 2023 07:09:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/cant-reproduce-a-bug/</guid><description>&lt;p&gt;The phrase &amp;ldquo;it works on my machine&amp;rdquo; can be a source of amusement, but it also represents a prevailing attitude in the world of development - an attitude that often forces users to prove bugs before we&amp;rsquo;re willing to investigate them. But in reality, we need to take responsibility and chase the issue, regardless of where it takes us.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/qGasKz-YsiU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;h2 id="h2-0-a-two-pronged-approach-to-bug-solving"&gt;A Two-Pronged Approach to Bug Solving&lt;/h2&gt;
&lt;p&gt;Solving bugs requires a two-pronged approach. Initially, we want to replicate the environment where the issue is occurring; it could be something specific to the user&amp;rsquo;s machine. Alternatively, we may need to resort to remote debugging or use logs from the user&amp;rsquo;s machine, asking them to perform certain actions on our behalf.&lt;/p&gt;</description></item><item><title>Building for Failure: Best Practices for Easy Production Debugging</title><link>https://foojayio.github.io/website/today/building-for-failure-best-practices-for-easy-production-debugging/</link><pubDate>Fri, 21 Jul 2023 15:29:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-for-failure-best-practices-for-easy-production-debugging/</guid><description>&lt;p&gt;&lt;strong&gt;Before going into the content of this post, check out&lt;/strong&gt; &lt;a href="https://www.amazon.com/Java-21-Explore-cutting-edge-features-ebook/dp/B0C9WW8PFL/" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;my new book&lt;/strong&gt;&lt;/a&gt;
 &lt;strong&gt;which launched last week!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quite a few years ago I was maintaining a database-driven system and ran into a weird production bug.&lt;/p&gt;
&lt;p&gt;The column I was reading from had a null value, but this wasn&amp;rsquo;t allowed in the code and there was no place where that value could have been null.&lt;/p&gt;
&lt;p&gt;The database was corrupt in a bad way and we didn&amp;rsquo;t have anything to go on.&lt;/p&gt;</description></item><item><title>GraphQL, JavaScript, Preprocessor, SQL and more in Manifold</title><link>https://foojayio.github.io/website/today/graphql-javascript-preprocessor-sql-and-more-in-manifold/</link><pubDate>Mon, 17 Jul 2023 12:42:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/graphql-javascript-preprocessor-sql-and-more-in-manifold/</guid><description>&lt;p&gt;We reached the final installment of our Manifold series but not the end of its remarkable capabilities.&lt;/p&gt;
&lt;p&gt;Throughout this series, we have delved into various aspects of Manifold, highlighting its unique features and showcasing how it enhances Java development.&lt;/p&gt;
&lt;p&gt;In this article, we will cover some of the remaining features of Manifold, including its support for GraphQL, integration with JavaScript, and the utilization of a preprocessor.&lt;/p&gt;
&lt;p&gt;By summarizing these features and reflecting on the knowledge gained throughout the series, I hope to demonstrate the power and versatility of Manifold.&lt;/p&gt;</description></item><item><title>How to Share Your Work With a Video or Podcast</title><link>https://foojayio.github.io/website/today/how-to-share-your-work-with-a-video-or-podcast/</link><pubDate>Fri, 14 Jul 2023 09:22:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-share-your-work-with-a-video-or-podcast/</guid><description>&lt;p&gt;Season 2 of the &lt;a href="https://foojayio.github.io/website/today/category/podcast/"&gt;Foojay Podcast&lt;/a&gt;
 has come to an end. Since September of &amp;lsquo;22, 22 episodes where published here on Foojay.&lt;/p&gt;
&lt;p&gt;In this article, we want to share some of the experiences of creating such podcasts, but also more generally, how you can share your work in a video with a small (or bigger) budget&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-audio"&gt;Audio&lt;/h2&gt;
&lt;p&gt;There is one fundamental rule for the audio: &amp;ldquo;Garbage in = Garbage out.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Yes, you can apply many filters and effects in a later phase, but you can&amp;rsquo;t make a bad recording sound good. &lt;strong&gt;You need a clear and good recording as a starting point&lt;/strong&gt;!&lt;/p&gt;</description></item><item><title>Understanding Security Vulnerabilities: Preventing Attacks</title><link>https://foojayio.github.io/website/today/understanding-security-vulnerabilities-a-first-step-in-preventing-attacks/</link><pubDate>Thu, 06 Jul 2023 12:49:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/understanding-security-vulnerabilities-a-first-step-in-preventing-attacks/</guid><description>&lt;p&gt;When I was a teenager, our local telephone company introduced a new service - the premium phone calls (AKA 1-900 numbers).&lt;/p&gt;
&lt;p&gt;The fun part was that we discovered a workaround to these charges by dialing the sequential local numbers which these 1-900 numbers would redirect to.&lt;/p&gt;
&lt;p&gt;If the &amp;ldquo;support number&amp;rdquo; for the 1-900 was 555-555 we would dial every number between 555-455 and 555-655 until we hit the jackpot&amp;hellip;&lt;/p&gt;
&lt;p&gt;Hours were spent dialing these numbers, leading us to make numerous calls for free. This attack is still prevalent today, and it&amp;rsquo;s called Insecure Direct Object References (IDOR).&lt;/p&gt;</description></item><item><title>Manifold vs. Lombok: Enhancing Java with Property Support</title><link>https://foojayio.github.io/website/today/manifold-vs-lombok-enhancing-java-with-property-support/</link><pubDate>Mon, 19 Jun 2023 18:04:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/manifold-vs-lombok-enhancing-java-with-property-support/</guid><description>&lt;p&gt;Today, we&amp;rsquo;ll explore an intriguing aspect of Manifold: its property support.&lt;/p&gt;
&lt;p&gt;In comparison, we&amp;rsquo;ll also examine Lombok, a popular library that offers similar features.&lt;/p&gt;
&lt;p&gt;By analyzing the differences between these two projects, we can gain insight into their core philosophies and advantages.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s dive in and discover how Manifold&amp;rsquo;s property support stands out.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/z-9jSMq_Yk8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;As always, you can find the code examples and additional resources for this post on my &lt;a href="https://github.com/shai-almog/java-book/" target="_blank" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Operator Overloading in Java</title><link>https://foojayio.github.io/website/today/operator-overloading-in-java/</link><pubDate>Sat, 10 Jun 2023 12:19:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/operator-overloading-in-java/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;ll delve into the fascinating world of operator overloading in Java.&lt;/p&gt;
&lt;p&gt;Although Java doesn&amp;rsquo;t natively support operator overloading, we&amp;rsquo;ll discover how Manifold can extend Java with that functionality.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll explore its benefits, limitations, and use cases, particularly in scientific and mathematical code.&lt;/p&gt;
&lt;p&gt;We will also explore three powerful features provided by Manifold that enhance the default Java type safety while enabling impressive programming techniques.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll discuss unit expressions, type-safe reflection coding, and fixing methods like equals during compilation.&lt;/p&gt;</description></item><item><title>Java String Templates Today</title><link>https://foojayio.github.io/website/today/java-string-templates-today/</link><pubDate>Fri, 02 Jun 2023 16:28:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-string-templates-today/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/revolutionize-json-parsing-in-java-with-manifold/"&gt;our last article&lt;/a&gt;
, we introduced you to the &lt;a href="http://manifold.systems/" target="_blank" rel="noopener noreferrer"&gt;Manifold&lt;/a&gt;
 project and how it offers a revolutionary set of language extensions for Java, including the ability to parse and process JSON files seamlessly in Java.&lt;/p&gt;
&lt;p&gt;Today, we will take a look at another exciting feature of the Manifold project: &lt;strong&gt;string templates&lt;/strong&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ite6a5y50yQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;But before we get to that, some of the feedback I got from the previous post was that I was unclear about Manifold. Manifold is a combination of an IDE plugin and plugins to Maven or Gradle.&lt;/p&gt;</description></item><item><title>Revolutionize JSON Parsing in Java with Manifold</title><link>https://foojayio.github.io/website/today/revolutionize-json-parsing-in-java-with-manifold/</link><pubDate>Fri, 26 May 2023 17:39:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/revolutionize-json-parsing-in-java-with-manifold/</guid><description>&lt;p&gt;Java developers have often envied JavaScript for its ease of parsing JSON.&lt;/p&gt;
&lt;p&gt;Although Java offers more robustness, it tends to involve more work and boilerplate code.&lt;/p&gt;
&lt;p&gt;Thanks to the Manifold project, Java now has the potential to outshine JavaScript in parsing and processing JSON files.&lt;/p&gt;
&lt;p&gt;Manifold is a revolutionary set of language extensions for Java that completely changes the way we handle JSON (and much more&amp;hellip;).&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/AoBnGZ7q6rk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;h2 id="h2-0-getting-started-with-manifold"&gt;Getting Started with Manifold&lt;/h2&gt;
&lt;p&gt;The code for this tutorial can be found on my &lt;a href="https://github.com/shai-almog/java-book/" target="_blank" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt;
. Manifold is relatively young but already vast in its capabilities. You can learn more about the project on their website and Slack channel.&lt;/p&gt;</description></item><item><title>Logging Best Practices Revisited</title><link>https://foojayio.github.io/website/today/logging-best-practices-revisited/</link><pubDate>Mon, 15 May 2023 13:07:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/logging-best-practices-revisited/</guid><description>&lt;p&gt;As I write this my interview on &lt;a href="https://www.youtube.com/@devcentral" target="_blank" rel="noopener noreferrer"&gt;DevCentral&lt;/a&gt;
 &lt;a href="https://www.linkedin.com/events/7062528143797952513/comments/" target="_blank" rel="noopener noreferrer"&gt;hasn&amp;rsquo;t started yet&lt;/a&gt;
 so if you subscribe to my blog or &lt;a href="https://www.youtube.com/@debugagent" target="_blank" rel="noopener noreferrer"&gt;follow&lt;/a&gt;
 &lt;a href="https://twitter.com/debugagent" target="_blank" rel="noopener noreferrer"&gt;me&lt;/a&gt;
 &lt;a href="https://www.linkedin.com/in/shai-almog-81a42/" target="_blank" rel="noopener noreferrer"&gt;on&lt;/a&gt;
 &lt;a href="https://mastodon.social/@debugagent" target="_blank" rel="noopener noreferrer"&gt;socials&lt;/a&gt;
 you might be able to catch it live. If not the recording should appear right here:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/CFL--dAX3FQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;Either way, this isn&amp;rsquo;t the first time I wrote about or talked about logging and the common pitfalls we see when logging in production or debugging. I covered this extensively in &lt;a href="https://talktotheduck.dev/logging-best-practices-mdc-ingestion-and-scale" target="_blank" rel="noopener noreferrer"&gt;the old blog&lt;/a&gt;
. I also &lt;a href="https://www.youtube.com/watch?v=53qCLRFcBSs" target="_blank" rel="noopener noreferrer"&gt;did a video&lt;/a&gt;
 covering these ideas. But my ideas somewhat evolved around some of the concepts I discussed.&lt;/p&gt;</description></item><item><title>Spring Boot Debugging with Aspect-Oriented Programming (AOP)</title><link>https://foojayio.github.io/website/today/spring-boot-debugging-with-aspect-oriented-programming-aop/</link><pubDate>Fri, 05 May 2023 08:19:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-debugging-with-aspect-oriented-programming-aop/</guid><description>&lt;p&gt;Aspect-Oriented Programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns.&lt;/p&gt;
&lt;p&gt;In simple terms, it helps you keep your code clean, modular, and easy to maintain.&lt;/p&gt;
&lt;p&gt;We can leverage AOP to debug Spring Boot applications more effectively and seamlessly.&lt;/p&gt;
&lt;p&gt;In this post, we will explore how to use AOP to debug a Spring Boot application effectively.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6kxpkcEqssw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;h2 id="h2-0-aop-concepts"&gt;AOP Concepts&lt;/h2&gt;
&lt;p&gt;Before diving into debugging with AOP, it is essential to understand the core concepts. AOP lets us write code that executes before or after a method. It includes the following common terms:&lt;/p&gt;</description></item><item><title>Relearning Java Thread Primitives</title><link>https://foojayio.github.io/website/today/relearning-java-thread-primitives/</link><pubDate>Tue, 25 Apr 2023 05:26:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/relearning-java-thread-primitives/</guid><description>&lt;p&gt;I&amp;rsquo;ve coded in Java since the first beta, even back then threads were at the top of my list of favorite features.&lt;/p&gt;
&lt;p&gt;Java was the first language to introduce thread support in the language itself, it was a controversial decision back then.&lt;/p&gt;
&lt;p&gt;In the past decade, every language raced to include async/await and &lt;a href="https://github.com/awaitility/awaitility" target="_blank" rel="noopener noreferrer"&gt;even Java had some third-party support for that&lt;/a&gt;
&amp;hellip;&lt;/p&gt;
&lt;p&gt;But Java zigged instead of zagging and introduced the far superior &lt;a href="https://www.youtube.com/watch?v=4mf24mzm0ks" target="_blank" rel="noopener noreferrer"&gt;virtual threads (project Loom)&lt;/a&gt;
. This article isn&amp;rsquo;t about that.&lt;/p&gt;</description></item><item><title>Boldness in Refactoring!</title><link>https://foojayio.github.io/website/today/boldness-in-refactoring/</link><pubDate>Fri, 14 Apr 2023 08:09:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/boldness-in-refactoring/</guid><description>&lt;p&gt;The old engineering adage: &amp;ldquo;don&amp;rsquo;t touch it, it works&amp;rdquo;. Is terrible. Don&amp;rsquo;t listen to it. It might be OK at a small scale but as time goes by the bit rot spreads through your code and servers polluting everything.&lt;/p&gt;
&lt;p&gt;Large swaths of your system become &amp;ldquo;no-man&amp;rsquo;s-land&amp;rdquo;. As you&amp;rsquo;re developing a new system, you must always &amp;ldquo;touch it&amp;rdquo; and make sure we hire engineers who aren&amp;rsquo;t afraid to do so.&lt;/p&gt;
&lt;p&gt;Yes, I get it. I said that sentence frequently in the past. I understand the motivation. Management doesn&amp;rsquo;t care about the bit rot in our future. They care about the here and now. Why are you wasting time on this feature?&lt;/p&gt;</description></item><item><title>DevOps For Developers: Continuous Integration, GitHub Actions</title><link>https://foojayio.github.io/website/today/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/</link><pubDate>Tue, 04 Apr 2023 07:35:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/</guid><description>&lt;p&gt;I first ran into the concept of Continuous Integration (CI) when the Mozilla project launched.&lt;/p&gt;
&lt;p&gt;It included a rudimentary build server as part of the process and this was revolutionary at the time.&lt;/p&gt;
&lt;p&gt;I was maintaining a C++ project that took 2 hours to build and link.&lt;/p&gt;
&lt;p&gt;We rarely went through a clean build which created compounding problems as bad code was committed into the project.&lt;/p&gt;
&lt;p&gt;A lot has changed since those old days.&lt;/p&gt;</description></item><item><title>Watch Area and Renderers</title><link>https://foojayio.github.io/website/today/watch-area-and-renderers/</link><pubDate>Sat, 25 Mar 2023 07:25:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/watch-area-and-renderers/</guid><description>&lt;p&gt;This is it. The &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;debugging book is live&lt;/a&gt;
. I would really appreciate reviews and feedback!&lt;/p&gt;
&lt;p&gt;I also finished recording and editing the &lt;a href="https://course.debugagent.com/" target="_blank" rel="noopener noreferrer"&gt;entire course&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;There are 50 total videos which total in 7 hours&amp;hellip; I also recorded additional videos for the two other free courses &lt;a href="https://www.youtube.com/watch?v=1Bum2gYETUQ&amp;amp;amp;list=PL8GhfcywW9YMucwRw2IbpeCp1FBMEgsmk" target="_blank" rel="noopener noreferrer"&gt;for beginners&lt;/a&gt;
 and for &lt;a href="https://www.youtube.com/watch?v=3oNT_VRrfqE&amp;amp;amp;list=PL8GhfcywW9YNuNHrG0FAg5xiprfYcYyuL" target="_blank" rel="noopener noreferrer"&gt;modern Java&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;So keep an eye on those!&lt;/p&gt;
&lt;h2 id="h2-0-renderers"&gt;Renderers&lt;/h2&gt;
&lt;p&gt;In today&amp;rsquo;s video we discuss one of my favorite obscure IDE features: renderers. Very few people are aware of them. I explained them in the past but I feel I didn&amp;rsquo;t properly explain why they are so much better than any other alternative. This time I think I got the explanation right.&lt;/p&gt;</description></item><item><title>DevOps for Developers - Introduction and Version Control</title><link>https://foojayio.github.io/website/today/devops-for-developers-introduction-version-control/</link><pubDate>Sun, 12 Mar 2023 09:13:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/devops-for-developers-introduction-version-control/</guid><description>&lt;p&gt;I start some of my talks with a joke: back in my day we didn&amp;rsquo;t have monitoring or observability. We&amp;rsquo;d go to the server and give it a kick. Hear the HD spin? It&amp;rsquo;s working!&lt;/p&gt;
&lt;p&gt;We didn&amp;rsquo;t have DevOps. If we were lucky we had some admins and a technician to solve hardware issues. That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;In a small company, we would do all of that ourselves. Today this is no longer practical. The complexity of deployment and scale is so big, it&amp;rsquo;s hard to imagine a growing company without an engineer dedicated to the operations.&lt;/p&gt;</description></item><item><title>Java Serialization Filtering: Prevent 0-day Security Vulnerabilities</title><link>https://foojayio.github.io/website/today/java-serialization-filtering-prevent-0-day-security-vulnerabilities/</link><pubDate>Fri, 03 Mar 2023 16:04:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-serialization-filtering-prevent-0-day-security-vulnerabilities/</guid><description>&lt;p&gt;I&amp;rsquo;ve been a Java developer long enough to remember the excitement when Sun introduced the concept of serialization in the JVM.&lt;/p&gt;
&lt;p&gt;In the world of C, we could just write a struct into a file but this was always problematic. It wasn&amp;rsquo;t portable and had many issues. But for Java we could just write the class and it &amp;ldquo;worked&amp;rdquo;. This was pure magic!&lt;/p&gt;
&lt;p&gt;Java was still mostly in use in the client side and when we thought about security, we had different vulnerabilities in mind. The sandbox occupied most of our security discussions.&lt;/p&gt;</description></item><item><title>Is it Time to go Back to the Monolith?</title><link>https://foojayio.github.io/website/today/is-it-time-to-go-back-to-the-monolith/</link><pubDate>Fri, 03 Mar 2023 15:58:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/is-it-time-to-go-back-to-the-monolith/</guid><description>&lt;p&gt;History repeats itself. Everything old is new again and I&amp;rsquo;ve been around long enough to see ideas discarded, rediscovered and return triumphantly to overtake the fad.&lt;/p&gt;
&lt;p&gt;In recent years SQL has made a tremendous comeback from the dead. We love relational databases all over again. I think the Monolith will have its space odyssey moment again. Microservices and serverless are trends pushed by the cloud vendors, designed to sell us more cloud computing resources.&lt;/p&gt;</description></item><item><title>Foojay Podcast #14: Debugging Tools and Skills for Fun and Profit</title><link>https://foojayio.github.io/website/today/foojay-podcast-14/</link><pubDate>Mon, 20 Feb 2023 08:29:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-14/</guid><description>&lt;p&gt;Let&amp;rsquo;s talk about debugging and observability.&lt;/p&gt;
&lt;p&gt;We work with debugging all the time, but how well do we know this common practice?&lt;/p&gt;
&lt;p&gt;Observability, monitoring, and debugging at scale for your production&amp;hellip;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ozcC3scY0Ig?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-1--odcast-pps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/show/6CpTfgn9LirzJGAtc4ICdQ" target="_blank" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/be/podcast/foojay-io-the-friends-of-openjdk/id1652281304" target="_blank" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;And most others&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-guests"&gt;Guests&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A lot of rubber ducks&lt;/li&gt;
&lt;li&gt;Johannes Bechberger
&lt;ul&gt;
&lt;li&gt;JVM and profiler developer&lt;/li&gt;
&lt;li&gt;Worked on the JDWP protocol and profiling&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parttimenerd" target="_blank" rel="noopener noreferrer"&gt;https://github.com/parttimenerd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/parttimen3rd" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/parttimen3rd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.social/@parttimenerd" target="_blank" rel="noopener noreferrer"&gt;https://mastodon.social/@parttimenerd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mostlynerdless.de/blog/2023/01/19/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/" target="_blank" rel="noopener noreferrer"&gt;AsyncGetStackTrace: A better Stack Trace API for the JVM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mostlynerdless.de/blog/2022/12/27/a-short-primer-on-java-debugging-internals/" target="_blank" rel="noopener noreferrer"&gt;A short primer on Java debugging internals&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Marit van Dijk
&lt;ul&gt;
&lt;li&gt;Developer Advocate at JetBrains&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maritvandijk.com/" target="_blank" rel="noopener noreferrer"&gt;https://maritvandijk.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/MaritvanDijk77" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/MaritvanDijk77&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.social/@maritvandijk" target="_blank" rel="noopener noreferrer"&gt;https://mastodon.social/@maritvandijk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ties van de Ven
&lt;ul&gt;
&lt;li&gt;Software Engineer @ JDriven, Coach @ Jcore&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tiesvandeven.nl/" target="_blank" rel="noopener noreferrer"&gt;https://www.tiesvandeven.nl/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ties_ven" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/ties_ven&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jdriven.com/2017/10/6-steps-to-help-you-debug-your-application/" target="_blank" rel="noopener noreferrer"&gt;6 Steps to help you debug your application&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-2-host"&gt;Host&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Shai Almog
&lt;ul&gt;
&lt;li&gt;Author of &amp;ldquo;&lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;Practical Debugging at Scale&lt;/a&gt;
&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://debugagent.com/" target="_blank" rel="noopener noreferrer"&gt;https://debugagent.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.social/@debugagent" target="_blank" rel="noopener noreferrer"&gt;https://mastodon.social/@debugagent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/debugagent" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/debugagent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-3-producer"&gt;Producer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Frank Delporte
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojay.social/@frankdelporte" target="_blank" rel="noopener noreferrer"&gt;https://foojay.social/@frankdelporte&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/frankdelporte" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/frankdelporte&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-4-content"&gt;Content&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;00'00 Intro and music&lt;/li&gt;
&lt;li&gt;00'24 About the topic of this podcast&lt;/li&gt;
&lt;li&gt;00'58 Introduction of the guests and host&lt;/li&gt;
&lt;li&gt;05'14 Debugging with IntelliJ IDEA and discoverability of tools
&lt;ul&gt;
&lt;li&gt;YouTube: &lt;a href="https://www.youtube.com/watch?v=59RC8gVPlvk&amp;amp;list=PLPZy-hmwOdEUWF85MuwrKV8YVWLmZW4ZA" target="_blank" rel="noopener noreferrer"&gt;Debugger playlist&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;YouTube: &lt;a href="https://www.youtube.com/watch?v=OQcyAtukps4" target="_blank" rel="noopener noreferrer"&gt;Profiling tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;YouTube: &lt;a href="https://www.youtube.com/watch?v=TDpbt4thECc" target="_blank" rel="noopener noreferrer"&gt;Profiling live stream&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;13'27 JDWP protocol
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dzone.com/articles/remote-debugging-java-applications-with-jdwp" target="_blank" rel="noopener noreferrer"&gt;DZone: Remote Debugging Java Applications With JDWP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/psa-the-risks-of-remote-jdwp-debugging/"&gt;Foojay: PSA: The Risks of Remote JDWP Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/a-short-primer-on-java-debugging-internals/"&gt;Foojay: A Short Primer on Java Debugging Internals&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;19'43 Exception breakpoints
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/"&gt;Foojay: Exception Breakpoint that Doesn&amp;rsquo;t Suck and a Real Use Case for Method Breakpoints&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;20'34 External debugging tools
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rubberduckdebugging.com/" target="_blank" rel="noopener noreferrer"&gt;https://rubberduckdebugging.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;26'55 Observability
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://istio.io/latest/about/service-mesh/" target="_blank" rel="noopener noreferrer"&gt;https://istio.io/latest/about/service-mesh/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/en/topics/microservices/what-is-a-service-mesh" target="_blank" rel="noopener noreferrer"&gt;https://www.redhat.com/en/topics/microservices/what-is-a-service-mesh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openjdk.org/jeps/435" target="_blank" rel="noopener noreferrer"&gt;https://openjdk.org/jeps/435&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;37'58 What information should you look for while debugging&lt;/li&gt;
&lt;li&gt;45'46 Be aware of tunnel vision while debugging&lt;/li&gt;
&lt;li&gt;49'33 What to do if you don&amp;rsquo;t know where to search for the bug
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-bisect" target="_blank" rel="noopener noreferrer"&gt;https://git-scm.com/docs/git-bisect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/understand-the-root-cause-of-regressions-with-git-bisect/"&gt;Foojay: External Debugging Tools 2: git bisect&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;57'05 Outro&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>What are you Missing by Debugging in VS Code?</title><link>https://foojayio.github.io/website/today/what-are-you-missing-by-debugging-in-vs-code/</link><pubDate>Fri, 17 Feb 2023 16:20:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-are-you-missing-by-debugging-in-vs-code/</guid><description>&lt;p&gt;In the first chapter of my debugging book, I discuss IDE debugging.&lt;/p&gt;
&lt;p&gt;In that chapter, I mostly talk about IntelliJ/IDEA.&lt;/p&gt;
&lt;p&gt;People often ask me why I didn&amp;rsquo;t write as much about VS Code&amp;hellip;&lt;/p&gt;
&lt;p&gt;The reason is that there isn&amp;rsquo;t much to write about. Its debugger is simpler for better and for worse. It isn&amp;rsquo;t as powerful as other IDEs. I created the following video that covers the content of this post:&lt;/p&gt;</description></item><item><title>Remote Debugging Dangers and Pitfalls</title><link>https://foojayio.github.io/website/today/remote-debugging-dangers-and-pitfalls/</link><pubDate>Fri, 10 Feb 2023 10:14:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/remote-debugging-dangers-and-pitfalls/</guid><description>&lt;p&gt;This is the last part of the debugging series, to learn the rest you&amp;rsquo;ll need to get &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;the book&lt;/a&gt;
 or &lt;a href="https://course.debugagent.com/" target="_blank" rel="noopener noreferrer"&gt;the course&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;One of the most frequently asked questions I receive is: can we do these things in VS Code?&lt;/p&gt;
&lt;p&gt;The answer is unfortunately no. But I elaborate on the debugging capabilities of VS Code in &lt;a href="https://www.youtube.com/watch?v=OBgLeRwjlAc" target="_blank" rel="noopener noreferrer"&gt;this video&lt;/a&gt;
. I&amp;rsquo;ll do a blog post that covers that next week.&lt;/p&gt;
&lt;p&gt;Below is the last video in the series:&lt;/p&gt;</description></item><item><title>Memory Debugging - a Deep Level of Insight</title><link>https://foojayio.github.io/website/today/memory-debugging-a-deep-level-of-insight/</link><pubDate>Fri, 03 Feb 2023 10:08:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/memory-debugging-a-deep-level-of-insight/</guid><description>&lt;p&gt;When I mention memory debugging the first thing that comes to the minds of many developers is the profiler. That isn&amp;rsquo;t wrong but it&amp;rsquo;s still a partial picture. Profilers are amazing at mapping that &amp;ldquo;big picture&amp;rdquo; but when you want to understand the domain, they fall short.&lt;/p&gt;
&lt;p&gt;Modern debuggers let us gain a level of insight into the application that&amp;rsquo;s unrivaled. We can inspect and locate a specific object instance with surgical precision.&lt;/p&gt;</description></item><item><title>Debugging Threads and Asynchronous Code</title><link>https://foojayio.github.io/website/today/debugging-threads-and-asynchronous-code/</link><pubDate>Fri, 03 Feb 2023 10:07:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-threads-and-asynchronous-code/</guid><description>&lt;p&gt;I&amp;rsquo;m doing a community interview in the &lt;a href="https://coderanch.com/f/157/Cloud-Virtualization" target="_blank" rel="noopener noreferrer"&gt;Code Ranch&lt;/a&gt;
 drop by and ask a question to win a free book!&lt;/p&gt;
&lt;p&gt;This week we&amp;rsquo;ll discuss one of the harder problems in programming: threading. For many cases threading issues aren&amp;rsquo;t as difficult to debug. At least not in higher abstractions.&lt;/p&gt;
&lt;p&gt;Asynchronous programming is supposed to simplify the threading model but oftentimes it makes a bad situation worse by detaching us from the core context.&lt;/p&gt;</description></item><item><title>Debugging Streams and Collections</title><link>https://foojayio.github.io/website/today/debugging-streams-and-collections/</link><pubDate>Fri, 13 Jan 2023 14:59:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-streams-and-collections/</guid><description>&lt;p&gt;I will run a book giveaway promotion on the &lt;a href="https://coderanch.com/wiki/660305/Book-Promotions-Schedule" target="_blank" rel="noopener noreferrer"&gt;Code Ranch on January 17th&lt;/a&gt;
. Be sure to be there and let your friends know. It would be great to answer your questions about debugging. I&amp;rsquo;m very excited by this and by the feedback I&amp;rsquo;m getting for &lt;a href="https://course.debugagent.com/" target="_blank" rel="noopener noreferrer"&gt;the course&lt;/a&gt;
 and new videos.&lt;/p&gt;
&lt;p&gt;I also launched a &lt;a href="https://www.youtube.com/playlist?list=PL8GhfcywW9YMucwRw2IbpeCp1FBMEgsmk" target="_blank" rel="noopener noreferrer"&gt;free new Java course for complete beginners&lt;/a&gt;
. No prior knowledge needed. This is probably not the audience for this course. But if you know someone that might be interested I&amp;rsquo;ll appreciate a share. I hope people find it useful and learn a bit about Java. I&amp;rsquo;m working on a cadence of one video per week in this beginner course.&lt;/p&gt;</description></item><item><title>The Massive Hidden Power of Breakpoints</title><link>https://foojayio.github.io/website/today/the-massive-hidden-power-of-breakpoints/</link><pubDate>Fri, 13 Jan 2023 14:58:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-massive-hidden-power-of-breakpoints/</guid><description>&lt;p&gt;It&amp;rsquo;s been a big week. I&amp;rsquo;m currently reviewing the final draft of &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;my upcoming debugging book&lt;/a&gt;
. This is always a sobering, and exciting moment. A moment in which all of a sudden all the months of work become &amp;ldquo;real&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I also recorded 9 videos for youtube bringing up the total videos in the course to 29 (with many more on the way). I&amp;rsquo;m starting two additional free courses &lt;a href="https://www.youtube.com/playlist?list=PL8GhfcywW9YMucwRw2IbpeCp1FBMEgsmk" target="_blank" rel="noopener noreferrer"&gt;one targeted at absolute beginners&lt;/a&gt;
. Another one about modern Java programming which I&amp;rsquo;ll launch really soon. Both will be free on &lt;a href="https://youtube.com/@debugagent" target="_blank" rel="noopener noreferrer"&gt;my youtube channel&lt;/a&gt;
 (obligatory &amp;ldquo;like, subscribe and share&amp;rdquo;).&lt;/p&gt;</description></item><item><title>Debugging Program Control Flow</title><link>https://foojayio.github.io/website/today/debugging-program-control-flow/</link><pubDate>Fri, 23 Dec 2022 07:36:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-program-control-flow/</guid><description>&lt;p&gt;As of now I published the first three videos of &lt;a href="https://course.debugagent.com" target="_blank" rel="noopener noreferrer"&gt;the course&lt;/a&gt;
 and will publish the fourth tomorrow. I plan to publish two videos per week on YouTube to maximize the impact but here I&amp;rsquo;ll only blog one lesson per week to avoid oversaturation. I shot about four hours of video content and still haven&amp;rsquo;t finished the 2nd module out of eight. This course will be very detailed and intensive.&lt;/p&gt;</description></item><item><title>Debug Like a Senior Developer</title><link>https://foojayio.github.io/website/today/debug-like-a-senior-developer/</link><pubDate>Fri, 16 Dec 2022 06:34:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/debug-like-a-senior-developer/</guid><description>&lt;p&gt;My book on debugging is &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;already on preorder&lt;/a&gt;
 and I&amp;rsquo;m super thrilled to announce I&amp;rsquo;m doing a full online course to go along with it.&lt;/p&gt;
&lt;p&gt;The course website isn&amp;rsquo;t ready yet but I already have the full outline and a lot of recorded material. I will try to drop videos at a rate of two per week in the next few months until the full course will be online.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s shaping up to be a very detailed course. I recorded the first module and half of the second module and I&amp;rsquo;m already close to 3 hours of dense recorded material!&lt;/p&gt;</description></item><item><title>SpringOne TLV World Tour Trip Report</title><link>https://foojayio.github.io/website/today/springone-tlv-world-tour-trip-report/</link><pubDate>Fri, 09 Dec 2022 22:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/springone-tlv-world-tour-trip-report/</guid><description>&lt;p&gt;My talk was accepted by SpringOne in San Francisco. I never went to that conference and was really looking forward to it. This year would probably be amazing with the Spring 6.0 and Spring Boot 3.0 releases. So many groundbreaking changes. Unfortunately, my travel budget at Lightrun was cut, and I eventually left. This meant I had to cancel the trip, I would have paid for travel, but San Francisco is both far and prohibitively expensive. I&amp;rsquo;ll have to take a raincheck.&lt;/p&gt;</description></item><item><title>Why I Don't do TDD</title><link>https://foojayio.github.io/website/today/why-i-dont-do-tdd/</link><pubDate>Fri, 02 Dec 2022 08:59:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-i-dont-do-tdd/</guid><description>&lt;p&gt;I recently gave a talk about debugging for the London Java Community. During the Q&amp;amp;A part of the talk, someone asked me about my approach to Test Driven Development. In the past I looked at that practice in a more positive light. Writing lots of tests. How can that be bad?&lt;/p&gt;
&lt;p&gt;But as time moved on, I see it in a different light. I see it as a very limited tool that has very specific use cases. It doesn&amp;rsquo;t fit into the type of projects I build and often hinders the fluid processes it&amp;rsquo;s supposed to promote. But let&amp;rsquo;s backtrack for a second. I really liked &lt;a href="https://buttondown.email/hillelwayne/archive/i-have-complicated-feelings-about-tdd-8403/" target="_blank" rel="noopener noreferrer"&gt;this post&lt;/a&gt;
 that separates the types and problems in TDD. But let&amp;rsquo;s simplify it a bit, let&amp;rsquo;s clarify that every PR should have good coverage. This isn&amp;rsquo;t TDD. It&amp;rsquo;s just good programming.&lt;/p&gt;</description></item><item><title>You’re Doing It Wrong — Recruiting a DevRel</title><link>https://foojayio.github.io/website/today/youre-doing-it-wrong-recruiting-a-devrel/</link><pubDate>Fri, 25 Nov 2022 14:42:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/youre-doing-it-wrong-recruiting-a-devrel/</guid><description>&lt;p&gt;This article was co-written with &lt;a href="https://twitter.com/wesley83" target="_blank" rel="noopener noreferrer"&gt;Wesley Faulkner&lt;/a&gt;
.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wesley Faulkner is a first-generation American, public speaker, and podcaster. He is a founding member of the government transparency group Open Austin and a staunch supporter of racial justice, workplace equity, and neurodiversity. His professional experience spans technology from AMD, Atlassian, Dell, IBM, and MongoDB. Wesley currently works as a head of community at SingleStore, and in addition, co-hosts the developer relations-focused podcast Community Pulse and serves on the board for SXSW.&lt;/p&gt;</description></item><item><title>Internal Security: Hardening Internal Systems</title><link>https://foojayio.github.io/website/today/internal-security-hardening-internal-systems/</link><pubDate>Fri, 18 Nov 2022 15:08:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/internal-security-hardening-internal-systems/</guid><description>&lt;p&gt;60% of security breaches are internal to the organization and yet when we think about security we usually think about vulnerabilities, exploits, etc. All the while, 60% of hacks are just from a person just logging into the system and taking whatever the hell they want.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been thinking about this quite a bit recently. I spent a great deal of time researching security-related issues for a chapter of my upcoming book and unfortunately found very little on hardening internal systems.&lt;/p&gt;</description></item><item><title>API Mocking: Essential and Redundant</title><link>https://foojayio.github.io/website/today/api-mocking-essential-and-redundant/</link><pubDate>Fri, 11 Nov 2022 08:13:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/api-mocking-essential-and-redundant/</guid><description>&lt;p&gt;I love contradictions where both states of truth can work at the same time.&lt;/p&gt;
&lt;p&gt;Case in point is this tweet about mocking from the other week:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/api-mocking-essential-and-redundant/Screen-Shot-2022-10-25-at-14.53.38-700x263.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/mcsee1/status/1582762075289374720" target="_blank" rel="noopener noreferrer"&gt;If you use mocks, you are not testing&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My answer was:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/api-mocking-essential-and-redundant/Screen-Shot-2022-10-25-at-14.55.58-700x457.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Mocks help assert limited fixed functionality and they do it FAST.&lt;/p&gt;
&lt;p&gt;Which is what unit tests are about. Mocks are an essential part of a wider quality strategy. Otherwise you will spend your time in integration test churn.&lt;/p&gt;</description></item><item><title>Observability is Cultural</title><link>https://foojayio.github.io/website/today/observability-is-cultural/</link><pubDate>Fri, 04 Nov 2022 15:23:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/observability-is-cultural/</guid><description>&lt;p&gt;I&amp;rsquo;m guilty of applying the word debugging for practically anything.&lt;/p&gt;
&lt;p&gt;My kids&amp;rsquo; legos won&amp;rsquo;t fit, let&amp;rsquo;s debug that.&lt;/p&gt;
&lt;p&gt;Observability is one of the few disciplines that actually warrant that moniker, it is debugging. But traditional debugging doesn&amp;rsquo;t really fit with observability practices. I usually call it &amp;ldquo;precognitive debugging&amp;rdquo;. We need to have a rough idea in advance of what our debugging process will look like for effective observability troubleshooting.&lt;/p&gt;
&lt;p&gt;Note that this doesn&amp;rsquo;t apply to developer observervability which is a special case. That&amp;rsquo;s a more dynamic process that more closely resembles a typical debugging session. This is about more traditional monitoring and observability. Where we need to first instrument the system and add logs, metrics, etc. to cover the information we would need as we will later investigate the issue.&lt;/p&gt;</description></item><item><title>When Breakpoints Don't Break</title><link>https://foojayio.github.io/website/today/when-breakpoints-dont-break/</link><pubDate>Mon, 24 Oct 2022 07:24:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-breakpoints-dont-break/</guid><description>&lt;p&gt;I discussed tracepoints quite a bit in my blog and videos.&lt;/p&gt;
&lt;p&gt;They are wonderful, but I feel the nuance of non-breaking is a bit lost.&lt;/p&gt;
&lt;p&gt;The true power of this amazing tool is hidden due to our debugging habits and our preconceived notions about debugging. It&amp;rsquo;s indeed difficult to make the mental shift required for these tools.&lt;/p&gt;
&lt;p&gt;The payoff for that mental shift is tremendous when dealing with &amp;ldquo;weird&amp;rdquo; bugs. Especially in large systems and with concurrency related issues.&lt;/p&gt;</description></item><item><title>The Reason Java is Still Popular</title><link>https://foojayio.github.io/website/today/the-reason-java-is-still-popular/</link><pubDate>Mon, 10 Oct 2022 16:11:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-reason-java-is-still-popular/</guid><description>&lt;p&gt;A great time to post this, right after the release of Java 19, yes, another &amp;ldquo;my language is better&amp;rdquo; post. No, I didn&amp;rsquo;t want to write it. But sometimes people&amp;rsquo;s &lt;a href="https://medium.com/codex/i-finally-gave-up-on-java-5187947bef1b" target="_blank" rel="noopener noreferrer"&gt;bad projection&lt;/a&gt;
 gets the better of me.&lt;/p&gt;
&lt;p&gt;In this case the post started as a comment and I ended up deciding turn it into a post. This was strengthened with &lt;a href="https://news.ycombinator.com/item?id=32896228" target="_blank" rel="noopener noreferrer"&gt;this post&lt;/a&gt;
 which mostly complains about Quarkus (somewhat unfairly if I might add).&lt;/p&gt;</description></item><item><title>Great Time at JavaZone 2022</title><link>https://foojayio.github.io/website/today/great-time-at-javazone-2022/</link><pubDate>Fri, 23 Sep 2022 07:57:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/great-time-at-javazone-2022/</guid><description>&lt;p&gt;I had a pretty awful travel experience trying to reach Oslo, but it&amp;rsquo;s all worth it for what is possibly my favorite conference: JavaZone.&lt;/p&gt;
&lt;p&gt;I absolutely love this conference. It has everything: Sense of humor, craziness, heavy metal, continuous integration of food and amazing talks with great people.&lt;/p&gt;
&lt;p&gt;This years conference has a fantasy theme which fits into the &amp;ldquo;weirdness&amp;rdquo; of the conference. Notice that when I say &amp;ldquo;weird&amp;rdquo; this is one of the highest complements I can give a conference. I a world of cookie cutter conferences JavaZone is unique in every way. See &lt;a href="https://www.youtube.com/watch?v=rmnaxgwPewY" target="_blank" rel="noopener noreferrer"&gt;this opening scene&lt;/a&gt;
 in the morning of the first day&amp;hellip;&lt;/p&gt;</description></item><item><title>Open Source Bait and Switch</title><link>https://foojayio.github.io/website/today/open-source-bait-and-switch/</link><pubDate>Fri, 16 Sep 2022 07:44:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/open-source-bait-and-switch/</guid><description>&lt;p&gt;I was reading &lt;a href="https://betterprogramming.pub/why-open-source-software-is-better-for-the-world-af1cf9045236" target="_blank" rel="noopener noreferrer"&gt;this article&lt;/a&gt;
 and wanted to post a comment but I felt this warrants a response article.&lt;/p&gt;
&lt;p&gt;First, if you don&amp;rsquo;t know me I&amp;rsquo;ve written a ton of Open Source code. A whole platform and then some. I think the general view expressed in that article and a lot of the fluff I see online is over simplistic and dangerous.&lt;/p&gt;
&lt;h2 id="h2-0-we-need-to-get-paid"&gt;We Need to get Paid&lt;/h2&gt;
&lt;p&gt;Who will pay your salary?&lt;/p&gt;</description></item><item><title>Serverless is the New Timeshare</title><link>https://foojayio.github.io/website/today/serverless-is-the-new-timeshare/</link><pubDate>Fri, 09 Sep 2022 07:53:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/serverless-is-the-new-timeshare/</guid><description>&lt;p&gt;We have a shared amnesia. When I speak to younger developers about past technologies, I often get blank stares. To be fair, some of that is because I&amp;rsquo;m a bit &amp;ldquo;intense&amp;rdquo; or &amp;ldquo;weird&amp;rdquo; but some of that is because. Huh? Really? Did we have that?&lt;/p&gt;
&lt;p&gt;Case in point XA transactions and 2PC (Two Phase Commit). We have a young generation that&amp;rsquo;s completely ignorant of that capability and the fact that this was &amp;ldquo;a thing&amp;rdquo;. Did the requirement for transaction management somehow vanish?&lt;/p&gt;</description></item><item><title>Migrating Monoliths to Microservices in Practice</title><link>https://foojayio.github.io/website/today/migrating-monoliths-to-microservices-in-practice/</link><pubDate>Fri, 02 Sep 2022 14:47:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/migrating-monoliths-to-microservices-in-practice/</guid><description>&lt;p&gt;There have been amazing articles on the subjects of migrating from a monolith to a microservice architecture, e.g., &lt;a href="https://martinfowler.com/articles/break-monolith-into-microservices.html" target="_blank" rel="noopener noreferrer"&gt;this is probably one of the better examples&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The benefits and drawbacks of the architectures should be pretty clear. I want to talk about something else though: the strategy.&lt;/p&gt;
&lt;p&gt;We build monoliths since they are easier to get started with. Microservices usually rise out of necessity when our system is already in production.&lt;/p&gt;</description></item><item><title>External Debugging Tools 3: JMXTerm</title><link>https://foojayio.github.io/website/today/external-debugging-tools-3-jmxterm/</link><pubDate>Fri, 26 Aug 2022 14:52:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/external-debugging-tools-3-jmxterm/</guid><description>&lt;p&gt;When tracking a bug we need to take a two pronged approach. Similar to tongs that wrap the buggy module from both sides and squeezes to find the problematic part. Up until now we discussed tools that are very low level. Some can be used to debug system level services. Today we&amp;rsquo;ll discuss the other side of the stack but still a very advanced management tool. To understand this you need to understand the field we&amp;rsquo;re in.&lt;/p&gt;</description></item><item><title>Bridge the DevOps/Dev Gap without Sacrificing Reliability</title><link>https://foojayio.github.io/website/today/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/</link><pubDate>Fri, 19 Aug 2022 09:16:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/</guid><description>&lt;p&gt;DevOps culture revolutionized our industry. Continuous Delivery and Continuous Integration made six sigma reliability commonplace. 20 years ago we would kick the production servers and listen to the hard drive spin, that was observability. Today&amp;rsquo;s DevOps teams deploy monitoring tools that provide development teams with deep insight into the production environment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;O brave new world That has such people in&amp;rsquo;t!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;mdash; William Shakespeare&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Before DevOps practices were commonplace, production used to fail. A lot. We don&amp;rsquo;t want to go back to the time before DevOps tools were commonplace&amp;hellip;&lt;/p&gt;</description></item><item><title>When Disaster Strikes: Production Troubleshooting</title><link>https://foojayio.github.io/website/today/when-disaster-strikes-production-troubleshooting/</link><pubDate>Fri, 12 Aug 2022 11:03:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-disaster-strikes-production-troubleshooting/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/TomGranot/" target="_blank" rel="noopener noreferrer"&gt;Tom Granot&lt;/a&gt;
 and &lt;a href="https://twitter.com/debugagent/" target="_blank" rel="noopener noreferrer"&gt;myself&lt;/a&gt;
 have had the privilege of &lt;a href="https://twitter.com/vlad_mihalcea" target="_blank" rel="noopener noreferrer"&gt;Vlad Mihalcea&amp;rsquo;s&lt;/a&gt;
 online company for a while now. As a result we decided to &lt;a href="https://go.lightrun.com/production-troubelshooting-masterclass" target="_blank" rel="noopener noreferrer"&gt;do a workshop together&lt;/a&gt;
 talking about a lot of the things we learned in the process. This workshop would be pretty informal ad-hoc, just a bunch of guys chatting and showing off what we can do with tooling.&lt;/p&gt;
&lt;p&gt;In celebration of that I thought I&amp;rsquo;d write about some of the tricks we discussed amongst ourselves in the past to give you a sense of what to expect when joining us for the workshop but also a useful tool in its own right.&lt;/p&gt;</description></item><item><title>External Debugging Tools 1: dtrace and strace</title><link>https://foojayio.github.io/website/today/external-debugging-tools-1-dtrace-and-strace/</link><pubDate>Fri, 05 Aug 2022 13:13:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/external-debugging-tools-1-dtrace-and-strace/</guid><description>&lt;p&gt;Often when debugging, we need to step outside of the comforting embrace of the IDE to reproduce or track an issue.&lt;/p&gt;
&lt;p&gt;In this series, I&amp;rsquo;d like to go over some tools you might find useful for these cases. I&amp;rsquo;ll try to limit myself to tools that are 100% debugging tools and not those that are useful for development testing.&lt;/p&gt;
&lt;p&gt;E.g., tools like &lt;a href="https://curl.se/" target="_blank" rel="noopener noreferrer"&gt;curl&lt;/a&gt;
 or &lt;a href="https://stedolan.github.io/jq/" target="_blank" rel="noopener noreferrer"&gt;jq&lt;/a&gt;
 are remarkably useful. You can/should use them while debugging. But you probably used them while building and testing the feature. So you would already be familiar with them and should have some sense of what they do. I want to focus on tools that you would mostly reach for when debugging. In that sense, tools like &lt;a href="https://sdkman.io/" target="_blank" rel="noopener noreferrer"&gt;SDKMan&lt;/a&gt;
 etc. also make no sense here.&lt;/p&gt;</description></item><item><title>Understand the Root Cause of Regressions with Git Bisect</title><link>https://foojayio.github.io/website/today/understand-the-root-cause-of-regressions-with-git-bisect/</link><pubDate>Fri, 29 Jul 2022 13:18:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/understand-the-root-cause-of-regressions-with-git-bisect/</guid><description>&lt;p&gt;In this series, I cover a lot of magical tools and &lt;a href="https://git-scm.com/docs/git-bisect" target="_blank" rel="noopener noreferrer"&gt;git bisect&lt;/a&gt;
 is probably the best example of such magic.&lt;/p&gt;
&lt;p&gt;The hardest part in debugging is knowing the general area of the bug&amp;hellip; and bisect literally shines a light on the specific commit that caused it!&lt;/p&gt;
&lt;p&gt;Before we begin, let&amp;rsquo;s make one thing clear: bisect is a tool for debugging regressions. It does nothing for regular bugs. When we have a regression, we typically know that the issue used to work in a specific release, we would typically have a specific revision where the code worked. We would typically know that it doesn&amp;rsquo;t work in the current version, but which commit along the way causes the failure?&lt;/p&gt;</description></item><item><title>The Cost of Production Blindness</title><link>https://foojayio.github.io/website/today/the-cost-of-production-blindness/</link><pubDate>Fri, 22 Jul 2022 08:11:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-cost-of-production-blindness/</guid><description>&lt;p&gt;When I speak at conferences, I often fall back to the fact that just a couple of decades ago we&amp;rsquo;d observe production by kicking the server.&lt;/p&gt;
&lt;p&gt;This is obviously no longer practical. We can&amp;rsquo;t see our production. It&amp;rsquo;s an amorphous Cloud that we can&amp;rsquo;t touch or feel. A power that we read about but don&amp;rsquo;t fully grasp.&lt;/p&gt;
&lt;p&gt;In this case, we have physical evidence that the Cloud is there.&lt;/p&gt;
&lt;p&gt;A part of this major shift in our industry is a change to our fundamental roles as engineers. DevOps and SRE are roles that didn&amp;rsquo;t exist back then. Yet today, they&amp;rsquo;re often essential for major businesses. They brought with them tremendous advancements to the reliability of production, but they also brought with them a cost: distance.&lt;/p&gt;</description></item><item><title>Debugging Java Collections Framework Issues in Production</title><link>https://foojayio.github.io/website/today/debugging-java-collections-framework-issues-in-production/</link><pubDate>Fri, 15 Jul 2022 08:49:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-java-collections-framework-issues-in-production/</guid><description>&lt;p&gt;The Java Collections Framework was a huge leap forward when it was introduced as part of Java 2 (JDK 1.2).&lt;/p&gt;
&lt;p&gt;Thanks to the included collection classes we finally moved beyond the limits of &lt;code&gt;Vector&lt;/code&gt; and &lt;code&gt;Hashtable&lt;/code&gt; to more mature and generic solutions. With the introduction of streams and functional concepts in Java 8 the framework took everything to the next level.&lt;/p&gt;
&lt;p&gt;One of the core principles underlying the framework is coding to the interface. As such you would use the List interface or a Collection interface instead of the concrete implementation. This is great engineering but it makes debugging the Java Collections far more challenging.&lt;/p&gt;</description></item><item><title>Debugging Gson, Moshi and Jackson JSON Frameworks in Production</title><link>https://foojayio.github.io/website/today/debugging-gson-moshi-and-jackson-json-frameworks-in-production/</link><pubDate>Fri, 08 Jul 2022 07:14:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-gson-moshi-and-jackson-json-frameworks-in-production/</guid><description>&lt;p&gt;Parsing bugs are the gift that keeps on giving in the age of APIs.&lt;/p&gt;
&lt;p&gt;We use a service, it works perfectly in debugging, QA, etc.&lt;/p&gt;
&lt;p&gt;Then some user input that made its way to the web request returns a result we just can&amp;rsquo;t parse.&lt;/p&gt;
&lt;p&gt;Unfortunately, there isn&amp;rsquo;t much we can do at this stage. We need to understand why the failure occurred and how we can workaround it and fix it.&lt;/p&gt;</description></item><item><title>Understand Source Code – Deep into the Codebase, Locally &amp; Production</title><link>https://foojayio.github.io/website/today/understand-source-code-deep-into-the-codebase-locally-and-in-production/</link><pubDate>Fri, 01 Jul 2022 07:17:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/understand-source-code-deep-into-the-codebase-locally-and-in-production/</guid><description>&lt;p&gt;Say you have a new code base to study or picked up an open source project. You might be a seasoned developer for whom this is another project in a packed resume. Alternatively, you might be a junior engineer for whom this is the first &amp;ldquo;real&amp;rdquo; project.&lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t matter!&lt;/p&gt;
&lt;p&gt;With completely new source code repositories, we still know nothing&amp;hellip;&lt;/p&gt;
&lt;p&gt;The seasoned senior might have a leg up in finding some things and recognizing patterns. But none of us can read and truly follow a project with 1M+ lines of code. We look over the docs, which in my experience usually have only passing resemblance to the actual codebase. We segregate and assume about the various modules, but picking them up is hard.&lt;/p&gt;</description></item><item><title>Spring Boot Performance Workshop with Vlad Mihalcea</title><link>https://foojayio.github.io/website/today/spring-boot-performance-workshop-with-vlad-mihalcea/</link><pubDate>Fri, 24 Jun 2022 07:43:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-performance-workshop-with-vlad-mihalcea/</guid><description>&lt;p&gt;A couple of weeks ago, we had a great time hosting the workshop you can see below with Vlad Mihalcea. It was loads of fun and we hope to do this again soon!&lt;/p&gt;
&lt;p&gt;In this workshop, we focused on Spring Boot performance but most importantly on Hibernate performance, which is a common issue in production environments.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s especially hard to track since issues related to data are often hard to perceive when debugging locally. When we have &amp;ldquo;real world&amp;rdquo; data at scale, they suddenly balloon and become major issues.&lt;/p&gt;</description></item><item><title>Debugging jsoup Java Code in Production Using Lightrun</title><link>https://foojayio.github.io/website/today/debugging-jsoup-java-code-in-production-using-lightrun/</link><pubDate>Fri, 17 Jun 2022 09:35:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-jsoup-java-code-in-production-using-lightrun/</guid><description>&lt;p&gt;Scraping websites built for modern browsers is far more challenging than it was a decade ago.&lt;/p&gt;
&lt;p&gt;jsoup is a convenient API that makes scraping websites trivial via DOM traversal, CSS Selectors, JQuery-Like methods and more. But it isn&amp;rsquo;t without its caveat. Every scraping API is a ticking time bomb.&lt;/p&gt;
&lt;p&gt;Real-world HTML is flaky. It changes without notice since it isn&amp;rsquo;t a documented API. When our Java program fails in scraping, we&amp;rsquo;re suddenly stuck with a ticking time bomb.&lt;/p&gt;</description></item><item><title>Remote Debugging and Developer Observability</title><link>https://foojayio.github.io/website/today/remote-debugging-and-developer-observability/</link><pubDate>Fri, 10 Jun 2022 10:12:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/remote-debugging-and-developer-observability/</guid><description>&lt;p&gt;In this post, we&amp;rsquo;ll go over remote debugging. Debugging production with developer observability tools and debugging asynchronous code which presents its own unique challenges!&lt;/p&gt;
&lt;p&gt;This is actually material from four separate videos because I wanted to pool some ideas together into a single blog post and the asynchronous stuff got pulled in. So without further ado, these are the applicable videos&amp;hellip; Read on for the analysis and discussion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 15th:&lt;/p&gt;</description></item><item><title>Debugging the Java Message Service (JMS) API using Lightrun</title><link>https://foojayio.github.io/website/today/debugging-the-java-message-service-jms-api-using-lightrun/</link><pubDate>Fri, 03 Jun 2022 09:26:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-the-java-message-service-jms-api-using-lightrun/</guid><description>&lt;p&gt;The Java Message Service API (JMS) was developed by Sun Microsystems in the days of &lt;a href="https://en.wikipedia.org/wiki/Jakarta_EE" target="_blank" rel="noopener noreferrer"&gt;Java EE&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The JMS API provides us with simple messaging abstractions including Message Producer, Message Consumer, etc. Messaging APIs let us place a message on a &amp;ldquo;queue&amp;rdquo; and consume messages placed into said queue.&lt;/p&gt;
&lt;p&gt;This is immensely useful for high throughput systems &amp;ndash; instead of wasting user time by performing a slow operation in real-time, an enterprise application can send a message. This non-blocking approach enables extremely high throughput, while maintaining reliability at scale.&lt;/p&gt;</description></item><item><title>Memory Debugging and Watch Annotations</title><link>https://foojayio.github.io/website/today/memory-debugging-and-watch-annotations/</link><pubDate>Fri, 27 May 2022 08:04:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/memory-debugging-and-watch-annotations/</guid><description>&lt;p&gt;Before diving into debugging memory issues and the other amazing running process, memory debugging capabilities (which are amazing)&amp;hellip; I want to discuss a point I left open in the &lt;a href="https://talktotheduck.dev/debugging-collections-streams-and-watch-renderers" target="_blank" rel="noopener noreferrer"&gt;last duckling post&lt;/a&gt;
. Back there we discussed customizing the watch renderer. This is super cool!&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s also tedious. Before we continue, if you prefer, I cover most of these subjects in these videos:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 11th:&lt;/p&gt;
&lt;p&gt;Did you know you can see all the objects in memory?&lt;/p&gt;</description></item><item><title>Debugging Deadlocks and Race Conditions</title><link>https://foojayio.github.io/website/today/debugging-deadlocks-and-race-conditions/</link><pubDate>Fri, 20 May 2022 08:08:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-deadlocks-and-race-conditions/</guid><description>&lt;p&gt;Thread debugging has the reputation of being one of the most arduous tasks for developers. I beg to differ.&lt;/p&gt;
&lt;p&gt;Asynchronous debugging is so much worse. It&amp;rsquo;s supposed to solve the problems of threading and to some degree async helps&amp;hellip;&lt;/p&gt;
&lt;p&gt;But it doesn&amp;rsquo;t make debugging simpler. I will get into that in the next post.&lt;/p&gt;
&lt;p&gt;In the last two ducklings, I talked about threading issues:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 13th:&lt;/p&gt;
&lt;p&gt;Debug race conditions and deadlocks easily.&lt;/p&gt;</description></item><item><title>How To Modernize Legacy Code in Production</title><link>https://foojayio.github.io/website/today/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/</link><pubDate>Mon, 09 May 2022 15:58:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/</guid><description>&lt;p&gt;I spent over a decade as a consultant working for dozens of companies in many fields and pursuits. The diversity of each code base is tremendous. This article will try to define general rules for modernizing legacy code that would hopefully apply to all. But it comes from the angle of a Java developer.&lt;/p&gt;
&lt;p&gt;When writing this, my primary focus is on updating an old Java 6 era style J2EE code to the more modern Spring Boot/Jakarta EE code. However, I don&amp;rsquo;t want to go into the code and try to keep this generic. I discuss COBOL and similar legacy systems too. Most of the overarching guidelines should work for migrating any other type of codebase too.&lt;/p&gt;</description></item><item><title>Spring Transaction Debugging in Production with Lightrun</title><link>https://foojayio.github.io/website/today/spring-transaction-debugging-in-production-with-lightrun/</link><pubDate>Fri, 06 May 2022 15:00:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-transaction-debugging-in-production-with-lightrun/</guid><description>&lt;p&gt;Spring makes building a reliable application much easier thanks to its declarative transaction management.&lt;/p&gt;
&lt;p&gt;It also supports programmatic transaction management, but that&amp;rsquo;s not as common.&lt;/p&gt;
&lt;p&gt;In this article, I want to focus on the declarative transaction management angle, since it seems much harder to debug compared to the programmatic approach. This is partially true. We can&amp;rsquo;t put a breakpoint on a transactional annotation.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;m getting ahead of myself!&lt;/p&gt;
&lt;h2 id="h2-0-what-is-spring-s-method-declarative-transaction-management"&gt;What is Spring&amp;rsquo;s Method Declarative Transaction Management?&lt;/h2&gt;
&lt;p&gt;When writing a spring method or class, we can use annotations to declare that a method or a bean (class) is transactional. This annotation lets us tune transactional semantics using attributes. This lets us define behavior such as:&lt;/p&gt;</description></item><item><title>Debugging Collections, Streams, and Watch Renderers</title><link>https://foojayio.github.io/website/today/debugging-collections-streams-and-watch-renderers/</link><pubDate>Fri, 29 Apr 2022 07:54:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-collections-streams-and-watch-renderers/</guid><description>&lt;p&gt;In the last two ducklings, I finished the extensive discussion on breakpoints and switched my focus to the watch area. In it, we have several amazing and lesser known tools that let us build insight into our running application. Being able to tell at a glance if something works correctly is crucial for many applications.&lt;/p&gt;
&lt;p&gt;This is very important for collections and arrays. We can have thousands or millions of elements within a collection. Debugging this is very difficult without some basic tools.&lt;/p&gt;</description></item><item><title>Exception Breakpoint that Doesn't Suck and Other Use Cases</title><link>https://foojayio.github.io/website/today/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/</link><pubDate>Fri, 22 Apr 2022 07:37:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/</guid><description>&lt;p&gt;Two weeks ago, &lt;a href="https://talktotheduck.dev/basics-of-breakpoints-you-might-not-know" target="_blank" rel="noopener noreferrer"&gt;I left this series in a &amp;ldquo;cliffhanger&amp;rdquo;&lt;/a&gt;
 of sorts. Well, as much as a programming blog can leave things in the air&amp;hellip; The big one amongst them is the premise that exception breakpoints don&amp;rsquo;t have to suck. If you used them in the past, you would know that grabbing all exceptions is ridiculous. You end up at a breakpoint every second and it doesn&amp;rsquo;t help.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a solution, and it&amp;rsquo;s discussed in duckling 6 number 7 also covers a lot of interesting ground for us and another cliffhanger on method breakpoints:&lt;/p&gt;</description></item><item><title>Logging Best Practices: MDC, Ingestion, and Scale</title><link>https://foojayio.github.io/website/today/logging-best-practices-mdc-ingestion-and-scale/</link><pubDate>Mon, 11 Apr 2022 12:16:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/logging-best-practices-mdc-ingestion-and-scale/</guid><description>&lt;p&gt;I don&amp;rsquo;t care about religious wars over &amp;ldquo;which logger is the best&amp;rdquo;. They all have their issues. Having said that, the worst logger is probably the one built &amp;ldquo;in-house&amp;rdquo;. So yes, they suck, but re-inventing the wheel is probably far worse.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s discuss making these loggers suck less with proper usage guidelines that range from the obvious to subtle. Hopefully, you can use this post as the basis of your company&amp;rsquo;s standard for logging best practices.&lt;/p&gt;</description></item><item><title>Debugging JAXB Production Issues</title><link>https://foojayio.github.io/website/today/debugging-jaxb-production-issues/</link><pubDate>Mon, 04 Apr 2022 14:13:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-jaxb-production-issues/</guid><description>&lt;p&gt;Java Architecture for XML Binding (AKA JAXB API) is a popular API for marshalling XML data. It&amp;rsquo;s a framework for mapping between XML documents and Java POJOs (Plain Old Java Objects, AKA regular Java classes) almost seamlessly. The API is very easy to use and many frameworks leverage it to provide their XML support. JAXB2.0 has gained popularity both in desktop applications (Java SE) and in application server code (Spring Boot, Java EE/Jakarta EE, Microprofile etc.).&lt;/p&gt;</description></item><item><title>Spring Remote Code Execution Vulnerability</title><link>https://foojayio.github.io/website/today/spring-remote-code-execution-vulnerability/</link><pubDate>Thu, 31 Mar 2022 14:54:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-remote-code-execution-vulnerability/</guid><description>&lt;p&gt;I&amp;rsquo;d like to start by saying that I&amp;rsquo;m not a security expert. I also won&amp;rsquo;t link to the exploit. This is a very fresh take on a new vulnerability but there&amp;rsquo;s &lt;a href="https://blog.sonatype.com/new-0-day-spring-framework-vulnerability-confirmed" target="_blank" rel="noopener noreferrer"&gt;already confirmation from Sonatype&lt;/a&gt;
. The current exploit seems to be limited to Spring on top of Tomcat but it probably can be adapted since the underlying vulnerability seems general enough.&lt;/p&gt;
&lt;p&gt;The vulnerability only impacts Java 9 or newer so if you have an older version you should be safe from this specific exploit.&lt;/p&gt;</description></item><item><title>Debugging Java Equals &amp; Hashcode Performance in Production</title><link>https://foojayio.github.io/website/today/debugging-java-equals-hashcode-performance-in-production/</link><pubDate>Tue, 29 Mar 2022 06:50:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-java-equals-hashcode-performance-in-production/</guid><description>&lt;p&gt;I wrote a lot about the performance metrics of the equals method and hash code in &lt;a href="https://talktotheduck.dev/hashcode-and-equals-debugging-performance" target="_blank" rel="noopener noreferrer"&gt;this article&lt;/a&gt;
. There are many nuances that can lead to performance problems in those methods. The problem is that some of those things can be well hidden.&lt;/p&gt;
&lt;p&gt;To summarize the core problem: the hashcode method is central to the Java Collections API. Specifically, with the performance of hash tables (specifically the Map interface hash table). The same is true with the equals method. If we have anything more complex than a string object or a primitive, the overhead can quickly grow.&lt;/p&gt;</description></item><item><title>Debugging Race Conditions in Production</title><link>https://foojayio.github.io/website/today/debugging-race-conditions-in-production/</link><pubDate>Wed, 23 Mar 2022 07:45:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-race-conditions-in-production/</guid><description>&lt;p&gt;Race conditions can occur when a multithreaded application accesses a shared resource using over one thread. Unless we have guards in place, the result might depend on which thread &amp;ldquo;got there first&amp;rdquo;. This is especially problematic when the state is changed externally.&lt;/p&gt;
&lt;p&gt;A race can cause more than just incorrect behavior. It can enable a security vulnerability when the resource in question can be corrupted in the right way. A good example of race condition vulnerabilities is mangling memory. Let&amp;rsquo;s say we have an admin user name which is restricted and privileged. You can&amp;rsquo;t change your user name to admin because of validation. But you can change it to anything else&amp;hellip;&lt;/p&gt;</description></item><item><title>The Basics of Breakpoints you Might not Know</title><link>https://foojayio.github.io/website/today/the-basics-of-breakpoints-you-might-not-know/</link><pubDate>Thu, 17 Mar 2022 10:41:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-basics-of-breakpoints-you-might-not-know/</guid><description>&lt;p&gt;In episodes 4 and 5 of &amp;ldquo;140 Second Ducklings&amp;rdquo;, I got deeper into the more advanced underpinnings of breakpoints. There&amp;rsquo;s still a lot more to learn to move forward, but even at this stage it&amp;rsquo;s surprising how many things are relatively unknown in the developer community. And I&amp;rsquo;m just getting started&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 5th:&lt;/p&gt;
&lt;p&gt;Did you know you can disable a breakpoint until you hit another breakpoint?&lt;/p&gt;
&lt;p&gt;Do you know what&amp;rsquo;s a tracepoint?&lt;/p&gt;</description></item><item><title>Developer Observability, KoolKits and Reliability</title><link>https://foojayio.github.io/website/today/interview-with-tom-granot-developer-observability-koolkits-and-reliability/</link><pubDate>Wed, 16 Mar 2022 14:01:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/interview-with-tom-granot-developer-observability-koolkits-and-reliability/</guid><description>&lt;p&gt;In preparation for the upcoming &lt;a href="https://www.linkedin.com/events/developerobservabilitymastercla6909167343625482241/about/" target="_blank" rel="noopener noreferrer"&gt;Developer Observability Masterclass&lt;/a&gt;
 we&amp;rsquo;re hosting at Lightrun with &lt;a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer"&gt;Thoughtworks&lt;/a&gt;
, &lt;a href="https://redmonk.com/" target="_blank" rel="noopener noreferrer"&gt;RedMonk&lt;/a&gt;
 and &lt;a href="https://jfrog.com/" target="_blank" rel="noopener noreferrer"&gt;JFrog&lt;/a&gt;
, I sat down for a brief interview with Tom Granot - the Director of Developer Relations at Lightrun.&lt;/p&gt;
&lt;p&gt;Tom will MC the event as he did for the &lt;a href="https://go.lightrun.com/developer-productivity-masterclass" target="_blank" rel="noopener noreferrer"&gt;Developer Productivity Masterclass&lt;/a&gt;
 we ran back in December.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shai:&lt;/strong&gt; Tell us a bit about yourself and your background.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tom:&lt;/strong&gt; Before joining Lightrun, I worked as an SRE at Actyx. This drove home the importance of observability tools - I got a sense of the potential problems and, to some extent, the blindness that developers face in production.&lt;/p&gt;</description></item><item><title>Detect, Track, Verify Security Issues &amp; 0-Days</title><link>https://foojayio.github.io/website/today/detecting-investigating-and-verifying-fixes-for-security-incidents-and-zero-day-issues-using-lightrun/</link><pubDate>Thu, 10 Mar 2022 12:25:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/detecting-investigating-and-verifying-fixes-for-security-incidents-and-zero-day-issues-using-lightrun/</guid><description>&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; You can use &lt;a href="https://lightrun.com/free" target="_blank" rel="noopener noreferrer"&gt;Lightrun for free&lt;/a&gt;
 on your servers.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not a security expert. I&amp;rsquo;d like to think of myself as a security conscious developer, but this is a vast subject with depth and breadth. What I understand is &lt;a href="https://lightrun.com/debugging/remote-debugging/" target="_blank" rel="noopener noreferrer"&gt;Lightrun and Debugging&lt;/a&gt;
. In that capacity, I can show some creative ways you can use it as a security tool. A &amp;ldquo;proper&amp;rdquo; security expert could take this to the next level.&lt;/p&gt;</description></item><item><title>Java Return Value, IntelliJ Jump to Line</title><link>https://foojayio.github.io/website/today/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/</link><pubDate>Wed, 02 Mar 2022 15:33:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/</guid><description>&lt;p&gt;I just published the 3rd episode of the &amp;ldquo;140 Second Duckling&amp;rdquo; tutorial series and I&amp;rsquo;m getting into the rhythm of doing them. I posted the 2nd episode last week and in this post I&amp;rsquo;ll dig deeper into both.&lt;/p&gt;
&lt;p&gt;I tackled a lot of basic stuff about debugging but I picked two big headliners that a surprising amount of developers aren&amp;rsquo;t familiar with. E.g. How many times did you step over a return statement and cursed?&lt;/p&gt;</description></item><item><title>OSS Debugging Toolkits for Kubernetes</title><link>https://foojayio.github.io/website/today/introducing-koolkits-debugging-toolkits-for-kubernetes/</link><pubDate>Mon, 28 Feb 2022 12:27:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-koolkits-debugging-toolkits-for-kubernetes/</guid><description>&lt;p&gt;KoolKits (&lt;strong&gt;K&lt;/strong&gt; ubernetes t&lt;strong&gt;oolkits&lt;/strong&gt;) are highly-opinionated, language-specific, batteries-included debug container images for Kubernetes. In practice, they&amp;rsquo;re what you would&amp;rsquo;ve installed on your production pods if you were stuck during a tough debug session in an unfamiliar shell.&lt;/p&gt;
&lt;p&gt;To briefly give some background, note that these container images are intended for use with the new &lt;a href="https://kubernetes.io/docs/tasks/debug-application-cluster/debug-running-pod/#ephemeral-container" target="_blank" rel="noopener noreferrer"&gt;kubectl debug feature&lt;/a&gt;
, which spins up &lt;a href="https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/" target="_blank" rel="noopener noreferrer"&gt;Ephemeral containers&lt;/a&gt;
 for interactive troubleshooting. A KoolKit will be pulled by kubectl debug, spun up as a container in your pod, and have the ability to access the same process namespace as your original container.&lt;/p&gt;</description></item><item><title>Enter the Cloud Native Dojo: Blackbelt-Level Debugging</title><link>https://foojayio.github.io/website/today/enter-the-cloud-native-dojo-blackbelt-level-debugging/</link><pubDate>Tue, 22 Feb 2022 13:28:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/enter-the-cloud-native-dojo-blackbelt-level-debugging/</guid><description>&lt;p&gt;Debugging is often viewed as an art form or a craft. This is true for most engineering-related troubleshooting processes (e.g., art of motorcycle maintenance). We&amp;rsquo;re usually indoctrinated into the basic moves by a senior developer and are then thrown into the proverbial pool. As a result, even senior engineers sometimes have gaps in their debugging skills. There are very few university courses or books on the subject, so it&amp;rsquo;s really hard to blame them.&lt;/p&gt;</description></item><item><title>What is Debugging in 140 Seconds</title><link>https://foojayio.github.io/website/today/what-is-debugging-in-140-seconds/</link><pubDate>Mon, 14 Feb 2022 12:50:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-is-debugging-in-140-seconds/</guid><description>&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m launching a new twitter video series that will focus on teaching the concepts of debugging (and other concepts) in small video bites.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the first video in the series. I hope to publish a new video every week. It starts with the very basics of debugging and builds up. I think debugging is a powerful tool that even experienced developers don&amp;rsquo;t leverage enough.&lt;/p&gt;
&lt;p&gt;See the video here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 1st:&lt;/p&gt;</description></item><item><title>Detect and Fix Memory Leaks in Managed Languages</title><link>https://foojayio.github.io/website/today/debugging-ram-detect-fix-memory-leaks-in-managed-languages-heap-deep-dive-part-2/</link><pubDate>Thu, 10 Feb 2022 08:45:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-ram-detect-fix-memory-leaks-in-managed-languages-heap-deep-dive-part-2/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/debugging-ram-java-garbage-collection-java-heap-deep-dive-part-1/"&gt;previous installment&lt;/a&gt;
, I talked about the Java garbage collector. In this part, I&amp;rsquo;ll discuss the most common memory issue: the memory leak. I focus on managed languages, specifically Java, but I will mention some native code tools which are interesting. A memory leak contributes to heap size, which isn&amp;rsquo;t the most pressing bug in most cases. But when left alone, memory usage can become a problem and, by that point, finding the issue is hard. Unlike a crash dump, where we get a reference to a specific line, a memory leak can remain hidden.&lt;/p&gt;</description></item><item><title>Polyglot Cloud Native Debugging: Beyond Logs/APM</title><link>https://foojayio.github.io/website/today/polyglot-cloud-native-debugging-beyond-apm-and-logging/</link><pubDate>Tue, 18 Jan 2022 07:55:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/polyglot-cloud-native-debugging-beyond-apm-and-logging/</guid><description>&lt;p&gt;&lt;strong&gt;I&amp;rsquo;ve done quite a few conference talks since I became a developer advocate for &lt;a href="https://lightrun.com/" target="_blank" rel="noopener noreferrer"&gt;Lightrun&lt;/a&gt;
. One of my most popular talks has a title similar to the title of this article. In this article I&amp;rsquo;ll try to cover the gist of the talk.&lt;/strong&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cj--cJrYqhQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;h2 id="_cloud_native_applications"&gt;Cloud-Native Applications&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s practically an alphabet soup of terms covering public cloud, hybrid cloud, etc. There&amp;rsquo;s also a lot of overlap between the various terms. The nice thing about this topic is that it applies, regardless. You will run into problems with microservices, architecture and monolithic applications or serverless.&lt;/p&gt;</description></item><item><title>Debugging RAM: Java Garbage Collection - Java Heap Deep Dive (Part 1)</title><link>https://foojayio.github.io/website/today/debugging-ram-java-garbage-collection-java-heap-deep-dive-part-1/</link><pubDate>Tue, 11 Jan 2022 15:36:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-ram-java-garbage-collection-java-heap-deep-dive-part-1/</guid><description>&lt;p&gt;There are many excellent articles on Java Garbage Collection, Java Memory usage and generally Java heap. Unfortunately, they are all over the place. They mix architecture, concepts and problem solving as separate pieces. A lot of the material is out of date or doesn&amp;rsquo;t include pragmatic information for solving problems with the garbage collector. E.g. e.g. pause times, heap space usage etc.&lt;/p&gt;
&lt;p&gt;In this post I won&amp;rsquo;t go into memory leaks. They&amp;rsquo;re important but this is a different subject I would like to discuss in a post on its own.&lt;/p&gt;</description></item><item><title>Hashcode and Equals: Debugging and Performance</title><link>https://foojayio.github.io/website/today/hashcode-and-equals-debugging-performance/</link><pubDate>Fri, 07 Jan 2022 13:31:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/hashcode-and-equals-debugging-performance/</guid><description>&lt;p&gt;A few weeks ago I ran into &lt;a href="https://www.reddit.com/r/java/comments/qi8yu8/hint_to_myself_and_other_poor_souls_dont_use/" target="_blank" rel="noopener noreferrer"&gt;this story on reddit&lt;/a&gt;
 that discusses the problem with using the URL class as a key in a Map. This boils down to a remarkably slow implementation of the hashcode() method in java.net.URL which makes this class unusable in such situations.&lt;/p&gt;
&lt;p&gt;Unfortunately, this is a part of the Java API specification and is no longer fixable without breaking backwards compatibility.&lt;/p&gt;
&lt;p&gt;What we can do is understand the problem with equals and hashcode. How can we avoid such problems in the future?&lt;/p&gt;</description></item><item><title>Fail-Fast Reliable Software Strategy. Debug Failures Effectively</title><link>https://foojayio.github.io/website/today/fail-fast-best-strategy-for-reliable-software/</link><pubDate>Tue, 14 Dec 2021 15:30:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/fail-fast-best-strategy-for-reliable-software/</guid><description>&lt;p&gt;&lt;strong&gt;I love cooking and use my &lt;a href="https://www.thermomix.com/" target="_blank" rel="noopener noreferrer"&gt;Thermomix&lt;/a&gt;
 a lot. If you hadn&amp;rsquo;t heard about that amazing innovation, it&amp;rsquo;s a kitchen robot&amp;hellip; Well, it&amp;rsquo;s a magical super cooking machine. When designing the Thermomix, its designers took the approach of &lt;a href="https://en.wikipedia.org/wiki/Fail-safe" target="_blank" rel="noopener noreferrer"&gt;fail-safe&lt;/a&gt;
 instead of &lt;a href="https://en.wikipedia.org/wiki/Fail-fast" target="_blank" rel="noopener noreferrer"&gt;fail-fast&lt;/a&gt;
. This is a smart choice in this case, but it has its drawbacks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;E.g., my machine tried to recover from a failure which sent it into an infinite recovery loop. I literally couldn&amp;rsquo;t pull out the food from the lid that was sealed shut. But normally, it&amp;rsquo;s one of the most reliable devices I own.&lt;/p&gt;</description></item><item><title>Debugging the Technical Interview: Methods and Cheating</title><link>https://foojayio.github.io/website/today/debugging-the-technical-interview-methods-and-cheating/</link><pubDate>Tue, 07 Dec 2021 09:00:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-the-technical-interview-methods-and-cheating/</guid><description>&lt;p&gt;The headline caught my attention right away &amp;ldquo;&lt;a href="https://levelup.gitconnected.com/i-was-shocked-to-catch-a-candidate-cheating-in-an-online-interview-2441fef0ab4" target="_blank" rel="noopener noreferrer"&gt;I was shocked to catch a candidate cheating in an online interview&lt;/a&gt;
&amp;rdquo;. How do you cheat in an interview? Does &lt;a href="https://en.wikipedia.org/wiki/Cyrano_de_Bergerac_%28play%29" target="_blank" rel="noopener noreferrer"&gt;Cyrano de Bergerac&lt;/a&gt;
 whisper the answer from outside the camera?&lt;/p&gt;
&lt;p&gt;Well, close enough. The candidate was googling answers and copying them into a shared screen, pretending this was his code. Hiding this is lying. That&amp;rsquo;s never OK. But this really reminded me of a tweet I read ages ago which unfortunately I can&amp;rsquo;t find&amp;hellip; It went something like this:&lt;/p&gt;</description></item><item><title>Developer Productivity Masterclass: Interview With Leonid Blouvshtein</title><link>https://foojayio.github.io/website/today/developer-productivity-masterclass-interview-with-leonid-blouvshtein/</link><pubDate>Tue, 30 Nov 2021 09:09:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/developer-productivity-masterclass-interview-with-leonid-blouvshtein/</guid><description>&lt;p&gt;&lt;strong&gt;On December 7th, Lightrun will &lt;a href="https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/" title="host a free master class" target="_blank" rel="noopener noreferrer"&gt;host a free master class&lt;/a&gt;
 with Mykyta Protsenko, Senior Software Engineer at Netflix; Michael Wood, Field CTO, HashiCorp; Ryan Menezez, Software Engineering Manager, Meta; and Leonid Blouvshtein, CTO of Lightrun.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/" target="_blank" rel="noopener noreferrer"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;[&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-50863" src="devprodmaster-700x227.png" alt="" width="700" height="227"&gt;
&lt;p&gt;](&lt;a href="https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/" target="_blank" rel="noopener noreferrer"&gt;https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/&lt;/a&gt;
)&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;I got a chance to grab Leonid and make him sit down for this quick interview&amp;hellip;&lt;/p&gt;
&lt;h3 id="h3-0-q-tell-us-a-bit-about-yourself"&gt;Q: Tell us a bit about yourself?&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve worked in several successful startups while most of my experience is with distributed systems that require high performance. This was after I graduated from the elite 8200 intelligence unit of the IDF.&lt;/p&gt;</description></item><item><title>Book Review: “Effortless Cloud-Native App Development Using Skaffold”</title><link>https://foojayio.github.io/website/today/book-review-effortless-cloud-native-app-development-using-skaffold-2/</link><pubDate>Thu, 25 Nov 2021 12:52:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-effortless-cloud-native-app-development-using-skaffold-2/</guid><description>&lt;p&gt;I&amp;rsquo;m a developer who cares deeply about production. But I&amp;rsquo;m not a devops and unfortunately I&amp;rsquo;m pretty bad at that. That&amp;rsquo;s why when I heard about Skaffold it instantly piqued my interest. Write Kubernetes cloud native apps without well&amp;hellip; Writing Kubernetes native apps&amp;hellip; Sign me up!&lt;/p&gt;
&lt;p&gt;Unfortunately, as we all know. The time to pick up a new technology is when we actually need it and then it&amp;rsquo;s a rush to get something out. Few of us have time to take off from our busy day to study something and learn something new. That&amp;rsquo;s why when &lt;a href="https://twitter.com/iASHeeesh" target="_blank" rel="noopener noreferrer"&gt;Ashish Choudhary&lt;/a&gt;
, the author of the book &amp;ldquo;&lt;strong&gt;Effortless Cloud Native App Development Using Skaffold&lt;/strong&gt; &amp;quot; asked for reviewers in the &lt;a href="https://foojayio.github.io/website/"&gt;foojay.io&lt;/a&gt;
 slack group, I jumped on the opportunity. I can learn something interesting and be productive (this book review).&lt;/p&gt;</description></item><item><title>Customer Miscommunication Leads to Ongoing Nightmare</title><link>https://foojayio.github.io/website/today/production-horrors-customer-miscommunication-leads-to-ongoing-nightmare/</link><pubDate>Tue, 16 Nov 2021 08:28:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/production-horrors-customer-miscommunication-leads-to-ongoing-nightmare/</guid><description>&lt;h3 id="h3-0-production-disasters-are-sometimes-those-pileups-we-can-see-coming-from-miles-away-but-the-train-is-moving-so-fast-we-can-t-possibly-stop-it-this-is-one-of-those-stories-in-it-a-combination-of-bad-communication-missing-skills-immature-technological-choices-created-a-pile-up"&gt;&lt;strong&gt;Production disasters are sometimes those pileups we can see coming from miles away. But the train is moving so fast we can&amp;rsquo;t possibly stop it. This is one of those stories. In it a combination of bad communication, missing skills, immature technological choices created a pile up.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;You can&amp;rsquo;t debug a specification. You must stay vigilant during the development cycle to find conceptual mistakes and reorient the Titanic.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a bit of a different story in the series. When I came up with the concept for production horrors my thoughts were mostly about a single day or a single event that made our production fail. Naturally our mind gravitates towards crashes or issues like the recent Facebook outage. But last time around, I gave the example of problematic caching that led to a billing problem&amp;hellip;&lt;/p&gt;</description></item><item><title>Book Review: Why Programs Fail by Andreas Zeller</title><link>https://foojayio.github.io/website/today/book-review-why-programs-fail/</link><pubDate>Tue, 09 Nov 2021 10:18:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-why-programs-fail/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/book-review-why-programs-fail/wpf3-415x510.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;When I got my new job as developer advocate at Lightrun, one of the first things I asked for was books. Lots of books. Some of them cover my new job and others talk about debugging. I&amp;rsquo;ve been debugging for decades, but I feel like the theory around debugging is a bit vague. My goal was to bolster my terminology used by academics and peers. A secondary goal is to see how others teach ideas related to debugging.&lt;/p&gt;</description></item><item><title>Production Horrors - Handling Disasters: Public Debrief. Handling failures</title><link>https://foojayio.github.io/website/today/production-horrors-handling-disasters-public-debrief/</link><pubDate>Wed, 03 Nov 2021 10:49:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/production-horrors-handling-disasters-public-debrief/</guid><description>&lt;p&gt;&lt;strong&gt;Just in time for Halloween failures in production are scarier than most movie monsters. Here&amp;rsquo;s a personal scary story of a production fail&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Halloween is probably the most appropriate time to start this new series of articles. I &lt;a href="https://foojayio.github.io/website/today/author/shai-almog/"&gt;talk a lot about theory on Foojay&lt;/a&gt;
, but when you&amp;rsquo;re on the front line of a production disaster, it &amp;ldquo;gets real&amp;rdquo; very fast. People often think of production disasters as crashes or sites going down like the recent Facebook downtime. While that&amp;rsquo;s an interesting subject, a lot of these things can go under the radar and hit you like a brick wall.&lt;/p&gt;</description></item><item><title>Debugging Tutorial 1 – Introduction: Conditional Breakpoints &amp; Set Value</title><link>https://foojayio.github.io/website/today/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/</link><pubDate>Wed, 27 Oct 2021 08:03:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/</guid><description>&lt;p&gt;In this series, I&amp;rsquo;ll walk you through the process of debugging applications and finding issues within them. As we debug, we&amp;rsquo;ll cover the techniques important for most developers. I will cover the following debuggers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntelliJ/IDEA &amp;ndash; with Java/Kotlin&lt;/li&gt;
&lt;li&gt;PyCharm &amp;ndash; Python&lt;/li&gt;
&lt;li&gt;VSCode &amp;ndash; for JavaScript&lt;/li&gt;
&lt;li&gt;WebStorm &amp;ndash; for JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These should cover most use cases you&amp;rsquo;ll run into and some things will seem duplicate/redundant so you can just skip to the applicable section if you feel you &amp;ldquo;got the gist&amp;rdquo;.&lt;/p&gt;</description></item><item><title>PSA: The Risks of Remote JDWP Debugging: It's Like a Wide Open Door</title><link>https://foojayio.github.io/website/today/psa-the-risks-of-remote-jdwp-debugging/</link><pubDate>Wed, 20 Oct 2021 08:13:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/psa-the-risks-of-remote-jdwp-debugging/</guid><description>&lt;p&gt;&lt;strong&gt;It isn&amp;rsquo;t so much a security risk as it is a wide open door with everything labeled for anyone to take freely and matches to burn it all down&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I teach or lecture and mention security, I always love the analogy of security as an onion. This is a common cliché yet it&amp;rsquo;s still a powerful analogy for people who are new to the concepts. The equivalent analogy I would pick for remote debugging is like leaving your front door open with all your valuables piled in easy to spot and well labeled boxes. Calling JDWP insecure doesn&amp;rsquo;t make any sense. It wasn&amp;rsquo;t designed to be secure so it isn&amp;rsquo;t&amp;hellip;&lt;/p&gt;</description></item><item><title>Understand Stack Traces and how you can Debug Better With them</title><link>https://foojayio.github.io/website/today/understanding-stack-traces-and-debugging-them-further/</link><pubDate>Tue, 05 Oct 2021 10:57:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/understanding-stack-traces-and-debugging-them-further/</guid><description>&lt;p&gt;Recently a junior developer sent me an obfuscated stack trace and was pretty surprised when I instantly knew the problem and pointed him at the necessary change. To be fair, I had the advantage of being the person who put that bug there in the first place&amp;hellip; But still the ability to glean information from a stack trace, even an obfuscated one, is a serious skill.&lt;/p&gt;
&lt;p&gt;The stack trace in question was a &lt;code&gt;ClassNotFoundException&lt;/code&gt;, that&amp;rsquo;s typically pretty easy and already tells you everything you need to know. The class isn&amp;rsquo;t there. Why it isn&amp;rsquo;t there is really a matter of what we did wrong. In this case, since the project was obfuscated, the bug was that this class wasn&amp;rsquo;t excluded from obfuscation.&lt;/p&gt;</description></item><item><title>Debug Real World Applications using a Systemic Proven Process</title><link>https://foojayio.github.io/website/today/the-debugger-checklist-part-ii/</link><pubDate>Tue, 28 Sep 2021 08:54:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-debugger-checklist-part-ii/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/the-debugger-checklist-part-i/"&gt;Debugger Checklist (Part I)&lt;/a&gt;
, I introduced some of the high level concepts and reviewed some of the common things you can do. In this part, we&amp;rsquo;ll get down to the process. Again, it&amp;rsquo;s important to stress that this is boiled down and concentrated!&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t want to discuss issue trackers, unit testing and proper TDD. I think there are many resources covering all of these. The focus of these posts is the debug process itself which often gets neglected as &amp;ldquo;tools&amp;rdquo;. There&amp;rsquo;s a lot of technique that separates the seasoned developer from a junior. Furthermore, there are many small advancements and changes we can&amp;rsquo;t possibly keep up with. I&amp;rsquo;d like to cover all of those things (some in future posts).&lt;/p&gt;</description></item><item><title>Debugger Checklist: Bug Solving Process</title><link>https://foojayio.github.io/website/today/the-debugger-checklist-part-i/</link><pubDate>Tue, 21 Sep 2021 09:37:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-debugger-checklist-part-i/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/the-debugger-checklist-part-i/Blog-Header-1200x600-px1-700x350.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Win at debugging by following an organized process and leveraging the tools you already have!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a disorganized person by nature. When I follow a process it&amp;rsquo;s by habit and intuition. But when a debugging problem keeps me up at night and gets me to that state of mind where a career of raising sheep in New Zealand seems like an attractive option&amp;hellip; That&amp;rsquo;s when I need to back off and walk through this process in an orderly fashion. This process never fails. When you walk through it, you can track any problem.&lt;/p&gt;</description></item><item><title>8 Debugging Tips for IntelliJ IDEA Users You Never Knew Existed</title><link>https://foojayio.github.io/website/today/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/</link><pubDate>Thu, 09 Sep 2021 07:15:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/</guid><description>&lt;p&gt;As developers, we&amp;rsquo;re all familiar with debuggers. We use debugging tools on a daily basis &amp;ndash; they&amp;rsquo;re an essential part of programming. But let&amp;rsquo;s be honest. Usually, we only use the breakpoint option. If we&amp;rsquo;re feeling frisky, we might use a conditional breakpoint.&lt;/p&gt;
&lt;p&gt;But guess what, the &lt;a href="https://www.jetbrains.com/idea/" title="IntelliJ IDEA" target="_blank" rel="noopener noreferrer"&gt;IntelliJ IDEA&lt;/a&gt;
 debugger has many powerful and cutting-edge features that are useful for debugging more easily and efficiently. To help, we&amp;rsquo;ve compiled a list of tips and tricks from our very own developers here at &lt;a href="https://go.lightrun.com/request-a-demo?utm_source=blog&amp;amp;amp;utm_medium=LR_blog&amp;amp;amp;utm_campaign=eight-debugging-tips-for-intellijidea" title="Lightrun" target="_blank" rel="noopener noreferrer"&gt;Lightrun&lt;/a&gt;
. We hope these tips will help you find and resolve bugs faster.&lt;/p&gt;</description></item></channel></rss>