<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pauls Blog</title><link>https://prule.github.io/pauls-blog/</link><description>Recent content on Pauls Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 03 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://prule.github.io/pauls-blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Sample data</title><link>https://prule.github.io/pauls-blog/post/coding/2026/sample-data/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/sample-data/</guid><description>&lt;h2 id="the-strategic-case-for-programmable-sample-data"&gt;The Strategic Case for Programmable Sample Data&lt;/h2&gt;
&lt;h3 id="i-the-core-thesis"&gt;I. The Core Thesis&lt;/h3&gt;
&lt;p&gt;Manual database entry is a bottleneck that introduces inconsistency. The most effective way to ensure environmental parity and development velocity is to treat &lt;strong&gt;sample data as code&lt;/strong&gt;. By leveraging business services to seed the database with deterministic, UUID-based records, teams create a stable foundation for testing, UI development, and collaborative debugging.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="ii-supporting-arguments"&gt;II. Supporting Arguments&lt;/h3&gt;
&lt;h4 id="1-enforcement-of-business-logic-via-service-seeding"&gt;1. Enforcement of Business Logic via Service Seeding&lt;/h4&gt;
&lt;p&gt;A common mistake is seeding a database via direct SQL scripts. This bypasses the application’s validation rules and side effects.&lt;/p&gt;</description></item><item><title>Completing your GitHub Profile</title><link>https://prule.github.io/pauls-blog/post/coding/2026/github-profile/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/github-profile/</guid><description>&lt;h1 id="completing-your-github-profile"&gt;Completing your GitHub Profile&lt;/h1&gt;
&lt;p&gt;While I&amp;rsquo;m looking for a job I thought I&amp;rsquo;d find out how I could improve my Github profile.
This was the advice I found&amp;hellip;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-fill-in-your-profile--properly"&gt;1. Fill in your profile — properly&lt;/h2&gt;
&lt;p&gt;Most developers leave half the sidebar blank. Don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bio:&lt;/strong&gt; Don&amp;rsquo;t just write your job title. &amp;ldquo;Senior Software Developer&amp;rdquo; tells nobody anything. &amp;ldquo;Senior Software Developer — Kotlin, Spring Boot, clean architecture&amp;rdquo; tells a recruiter immediately whether to keep reading.&lt;/p&gt;</description></item><item><title>Diary 2026-05</title><link>https://prule.github.io/pauls-blog/post/diary/2026/2026-05/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/diary/2026/2026-05/</guid><description>&lt;h1 id="may-2026"&gt;May 2026&lt;/h1&gt;
&lt;p&gt;Things I&amp;rsquo;m seeing/reading/watching/listening to in May 2026&amp;hellip;&lt;/p&gt;
&lt;h2 id="podcasts"&gt;Podcasts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/au/podcast/stepchange/id1791682745?i=1000763763593" target="_blank" rel="noopener"&gt;Stepchange - The grid&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Stop Serving PNG: Switch to WebP</title><link>https://prule.github.io/pauls-blog/post/coding/2026/webp/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/webp/</guid><description>&lt;h1 id="stop-serving-png-switch-to-webp-and-cut-your-image-sizes-by-80"&gt;Stop Serving PNG: Switch to WebP and Cut Your Image Sizes by 80%&lt;/h1&gt;
&lt;p&gt;WebP is the modern image format your website should already be using. Google&amp;rsquo;s &lt;code&gt;cwebp&lt;/code&gt; tool converts your existing PNG and JPEG files to WebP in seconds — and the results speak for themselves: a 1,434 × 1,522 PNG at 371 KB becomes a 74 KB WebP file. That&amp;rsquo;s an &lt;strong&gt;80% reduction&lt;/strong&gt; with no visible quality loss.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-bottom-line"&gt;The Bottom Line&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Use WebP for all web images.&lt;/strong&gt; Install &lt;code&gt;cwebp&lt;/code&gt;, run one command per image, and dramatically reduce page load times without sacrificing quality.&lt;/p&gt;</description></item><item><title>Markdown is for the Web, AsciiDoc is for the Docs (and CVs)</title><link>https://prule.github.io/pauls-blog/post/coding/2026/asciidoc-ftw/</link><pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/asciidoc-ftw/</guid><description>&lt;p&gt;We all love Markdown. It&amp;rsquo;s the lingua franca of the modern developer—the default choice for READMEs, GitHub comments, and even this blog. But recently, I hit a wall with it while trying to polish my CV.&lt;/p&gt;
&lt;p&gt;Markdown is fantastic for &lt;strong&gt;structure&lt;/strong&gt;, but it’s historically weak on &lt;strong&gt;presentation&lt;/strong&gt;, especially when it comes to converting to PDF.&lt;/p&gt;
&lt;h3 id="the-problem-with-markdown-pdfs"&gt;The Problem with Markdown PDFs&lt;/h3&gt;
&lt;p&gt;When you want to convert a Markdown file to a professional-looking PDF, you usually have two choices:&lt;/p&gt;</description></item><item><title>Eliminate PR Noise with ktfmt</title><link>https://prule.github.io/pauls-blog/post/coding/2026/ktfmt/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/ktfmt/</guid><description>&lt;p&gt;Few things are as frustrating during a code review as seeing a 50-line diff, only to realize that 45 of those lines are just re-ordered imports or adjusted indentation. This is &amp;ldquo;PR noise&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In the Kotlin world, &lt;strong&gt;ktfmt&lt;/strong&gt; is one of the best tools to solve this. Developed by Meta, it&amp;rsquo;s a deterministic formatter that ensures every developer on your team produces the exact same output, regardless of their individual IDE settings.&lt;/p&gt;</description></item><item><title>AI-Assisted Engineering: From Implementation to Specification</title><link>https://prule.github.io/pauls-blog/post/coding/2026/ai-coding/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/ai-coding/</guid><description>&lt;p&gt;The more I use AI to assist with coding, the more I realize that &lt;strong&gt;context is the primary currency of effective assistance.&lt;/strong&gt; The quality of the output is directly proportional to the quality of information available to the assistant.&lt;/p&gt;
&lt;p&gt;This realization has fundamentally changed how I work. I’ve started treating ADRs (Architecture Decision Records) and design documents not as &amp;ldquo;after-the-fact&amp;rdquo; documentation, but as essential inputs to be versioned in Git alongside the code. Goodbye Confluence; hello documentation-as-code.&lt;/p&gt;</description></item><item><title>Hugo Simple Beauty Theme</title><link>https://prule.github.io/pauls-blog/post/coding/2026/hugo-simple-beauty-theme/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/hugo-simple-beauty-theme/</guid><description>&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Github&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 &lt;a href="https://github.com/prule/hugo-simple-beauty" target="_blank" rel="noopener"&gt;https://github.com/prule/hugo-simple-beauty&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h1 id="hugo-simple-beauty-theme"&gt;Hugo Simple Beauty Theme&lt;/h1&gt;
&lt;p&gt;A minimalist, clean, and highly readable Hugo theme designed for personal blogs, book summaries, and technical writing.&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;h3 id="-design--ui"&gt;🎨 Design &amp;amp; UI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Minimalist Aesthetic&lt;/strong&gt;: Focuses on typography and whitespace for an editorial feel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System-based Dark Mode&lt;/strong&gt;: Automatically respects OS preferences with a dedicated manual toggle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Responsive&lt;/strong&gt;: Fully optimized for mobile, tablet, and desktop.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Typography&lt;/strong&gt;: Uses the modern &lt;strong&gt;Inter&lt;/strong&gt; font for UI and the elegant &lt;strong&gt;Lora&lt;/strong&gt; serif for long-form reading.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smooth Interaction&lt;/strong&gt;: Built-in smooth scrolling and subtle transitions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-technical-features"&gt;🛠 Technical Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Adaptive Syntax Highlighting&lt;/strong&gt;: Custom-themed code blocks that adjust colors for light and dark modes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Related Writing&lt;/strong&gt;: Built-in engine suggests related posts based on tags and categories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reading Time&lt;/strong&gt;: Automatically calculates and displays the estimated reading time for each post.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO Optimized&lt;/strong&gt;: Pre-configured with Open Graph, Twitter Cards, and Canonical URLs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back to Top&lt;/strong&gt;: A smart floating button that appears as you scroll.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-shortcodes"&gt;🧩 Shortcodes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Notice/Callouts&lt;/strong&gt;: Beautiful styled boxes for &lt;code&gt;info&lt;/code&gt; or &lt;code&gt;warning&lt;/code&gt; messages.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; notice type=&amp;#34;info&amp;#34; title=&amp;#34;Pro Tip&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Your content here...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; /notice &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;renders as&lt;/p&gt;</description></item><item><title>Diary 2026-04</title><link>https://prule.github.io/pauls-blog/post/diary/2026/2026-04/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/diary/2026/2026-04/</guid><description>&lt;h1 id="april-2026"&gt;April 2026&lt;/h1&gt;
&lt;p&gt;Things I&amp;rsquo;m seeing/reading/watching/listening to in April 2026&amp;hellip;&lt;/p&gt;
&lt;h2 id="lg-channels"&gt;LG Channels&lt;/h2&gt;
&lt;p&gt;Apparently LG TVs are supposed to come with an LG Channels app which provides 100s of free streaming channels&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=MB5A5wZ7gtY" target="_blank" rel="noopener"&gt;LG Channels&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My TV is just a little too old (2017) and it doesn&amp;rsquo;t seem to have it. There are other options though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=n6IbKNq1hoo" target="_blank" rel="noopener"&gt;Plex&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=w3byN8e8QuA" target="_blank" rel="noopener"&gt;Tubi&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="podcasts"&gt;Podcasts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/au/podcast/tech-lead-journal/id1523421550?i=1000762391704" target="_blank" rel="noopener"&gt;Tech lead journal #255 Stop Vibe Coding: Spec-Driven Development with The BMad Method - Brian Madison&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/au/podcast/the-pragmatic-engineer/id1769051199?i=1000760299204" target="_blank" rel="noopener"&gt;The Pragmatic Engineer - DHH&amp;rsquo;s new way of writing code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/au/podcast/founders/id1141877104?i=1000762241588" target="_blank" rel="noopener"&gt;Founders - Arnold Schwarzenegger&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/au/podcast/acquired/id1050462261?i=1000761027849" target="_blank" rel="noopener"&gt;Acquired - Ferrari&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="ai"&gt;AI&lt;/h2&gt;
&lt;p&gt;Lots of AI SDLC tools popping up:&lt;/p&gt;</description></item><item><title>Creating and releasing an application</title><link>https://prule.github.io/pauls-blog/post/coding/2026/creating-an-application/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/creating-an-application/</guid><description>&lt;h2 id="creating-and-releasing-an-application"&gt;Creating and releasing an application&lt;/h2&gt;
&lt;p&gt;I love sim racing, so I thought it would be an interesting exercise to create an application that makes use of Assetto Corsa Competizione (ACC) telemetry.&lt;/p&gt;
&lt;p&gt;The basic operation is this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client sends a registration message to ACC&lt;/li&gt;
&lt;li&gt;ACC replies and starts sending telemetry messages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is all done over UDP.&lt;/p&gt;
&lt;h2 id="acc-messages"&gt;ACC messages&lt;/h2&gt;
&lt;p&gt;The first step was to create a library that could parse the message byte streams. There is a little bit of documentation in the way of some C# code and a &lt;code&gt;ServerAdminHandbook.pdf&lt;/code&gt; that can be found in the ACC installation.&lt;/p&gt;</description></item><item><title>Leave planner 1.1.0</title><link>https://prule.github.io/pauls-blog/post/coding/2026/leave-planner-1_1_0/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/leave-planner-1_1_0/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://prule.github.io/leave-planner/" target="_blank" rel="noopener"&gt;Leave Planner&lt;/a&gt;
 helps you track your leave balance and plan future holidays with ease.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="announcing-leave-planner-v110-work-from-home-tracking--more"&gt;Announcing Leave Planner v1.1.0: Work From Home Tracking &amp;amp; More!&lt;/h1&gt;
&lt;p&gt;This update brings a feature to help you manage your work life better, along with some under-the-hood improvements.&lt;/p&gt;
&lt;h2 id="-work-from-home-wfh-tracking"&gt;🏠 Work From Home (WFH) Tracking&lt;/h2&gt;
&lt;p&gt;With the rise of hybrid work, keeping track of the days you work from home is more important than ever, especially for tax purposes. Leave Planner now allows you to easily log your WFH days.&lt;/p&gt;</description></item><item><title>Introduction to F1</title><link>https://prule.github.io/pauls-blog/post/simracing/2026/f1intro/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/simracing/2026/f1intro/</guid><description>&lt;h2 id="netflix"&gt;Netflix&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.netflix.com/au/title/80204890" target="_blank" rel="noopener"&gt;Drive to Survive&lt;/a&gt;
 is a great introduction to F1, where you can get to know something of the drivers and teams.
But you won&amp;rsquo;t learn much about the sport itself.&lt;/p&gt;
&lt;p&gt;&lt;img src="netflix-drive-to-survive.webp" alt="Drive to survive"&gt;&lt;/p&gt;
&lt;h2 id="podcasts"&gt;Podcasts&lt;/h2&gt;
&lt;p&gt;One of the best ways to catch up on a lot of information is via the &lt;a href="https://podcasts.apple.com/au/podcast/shift-f1-a-formula-1-podcast/id1091772717" target="_blank" rel="noopener"&gt;Shift-F1&lt;/a&gt;
 podcast. Every year at the beginning of the season they publish a Primer in which they&amp;rsquo;ll &amp;ldquo;explain how F1 works and who everybody is, all while assuming no prior knowledge of racing&amp;rdquo;. See the 2026 season primer &lt;a href="https://podcasts.apple.com/au/podcast/shift-f1-a-formula-1-podcast/id1091772717?i=1000751972438" target="_blank" rel="noopener"&gt;here&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Leave planner application</title><link>https://prule.github.io/pauls-blog/post/coding/2026/leave-planner/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/leave-planner/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Ever wanted to know how much leave you&amp;rsquo;ll have in the future and easily visualise your balance over time? Sure, some leave systems have some kind of future leave calculator, but none that I&amp;rsquo;ve seen make it easy or intuitive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Application available here, on github pages: &lt;a href="https://prule.github.io/leave-planner/" target="_blank" rel="noopener"&gt;https://prule.github.io/leave-planner/&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="the-spreadsheet-prototype"&gt;The spreadsheet prototype&lt;/h2&gt;
&lt;p&gt;To scratch my own itch, I started with a google sheet. The principle is simple: Enter your starting balance, and for each month fill in the estimated hours leave accrued. Add in your hours leave taken for the month&amp;hellip; and graph the total leave remaining.&lt;/p&gt;</description></item><item><title>YouTube channel aggregator experiment</title><link>https://prule.github.io/pauls-blog/post/coding/2026/youtube-channel-aggregator/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/youtube-channel-aggregator/</guid><description>&lt;p&gt;While trying to keep up with what&amp;rsquo;s happening in tennis and motorsport, I found myself wondering if the experience could be better. What if I could configure a list of channels, aggregate the videos, tag those videos by looking for keywords in their titles, and then have a convenient way to filter and navigate those.&lt;/p&gt;
&lt;p&gt;This provides me with a feed of relevant content which I can view oldest to newest. Watched videos are marked so they disappear from the feed, allowing me to pick up where I left off.&lt;/p&gt;</description></item><item><title>SDKMAN</title><link>https://prule.github.io/pauls-blog/post/coding/2025/sdkman/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2025/sdkman/</guid><description>&lt;div class="paragraph"&gt;
&lt;p&gt;SDKMAN! lets you install, manage and work with multiple versions of software development kits (SDKs) on most Unix-like systems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This means for example, you can install multiple versions of Java, Kotlin, Scala, Groovy, Gradle, Maven, Grails, Spring Boot, and many more. See the full list as of mid 2024 &lt;a href="sdk-list.txt"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_installation"&gt;Installation&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For installation instructions see the SDKMAN! website &lt;a href="https://sdkman.io/install"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_usage"&gt;Usage&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For common usage demonstration, using JAVA as an example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To find all available versions of Java, run:&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Introduction to JSON5</title><link>https://prule.github.io/pauls-blog/post/coding/2025/json5/</link><pubDate>Thu, 06 Mar 2025 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2025/json5/</guid><description>&lt;div class="paragraph"&gt;
&lt;p&gt;Json5 is a superset of JSON that allows for comments and trailing commas. It’s a popular choice for configuration files due to its readability and flexibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;From the website:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Formally, the JSON5 Data Interchange Format is a superset of JSON (so valid JSON files will always be valid JSON5 files) that expands its syntax to include some productions from ECMAScript 5.1 (ES5). It’s also a subset of ES5, so valid JSON5 files will always be valid ES5.*&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Sharing gradle configuration</title><link>https://prule.github.io/pauls-blog/post/coding/2025/gradle-shared-config/</link><pubDate>Sat, 08 Feb 2025 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2025/gradle-shared-config/</guid><description>&lt;h1 id="sharing-gradle-configuration-between-modules"&gt;Sharing gradle configuration between modules&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Source code for this project is available at &lt;a href="https://github.com/prule/gradle-sample" target="_blank" rel="noopener"&gt;https://github.com/prule/gradle-sample&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When setting up multimodule gradle projects, we often need to share configuration - such as java toolkit version, plugins, junit platform etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;Previously I would have used the &lt;code&gt;allprojects&lt;/code&gt; or &lt;code&gt;subprojects&lt;/code&gt; block to do this, but now we have convention plugins. These are locally defined plugins which contain the configuration we want to share. The submodules can then apply those plugins without needing to copy and paste the configuration - this makes it easy to selectively choose which plugins to apply to which module.&lt;/p&gt;</description></item><item><title>Authoring markdown posts in Hugo</title><link>https://prule.github.io/pauls-blog/post/coding/2026/markdown-for-hugo/</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/markdown-for-hugo/</guid><description>&lt;h2 id="writing-articles-using-markdown"&gt;Writing Articles using Markdown&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The following demonstrates how to create Markdown posts with Hugo.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Dependency upgrades with Renovate</title><link>https://prule.github.io/pauls-blog/post/coding/2025/renovate/</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2025/renovate/</guid><description>&lt;div class="paragraph"&gt;
&lt;p&gt;In modern software development, managing dependencies is a critical yet often overlooked aspect of maintaining healthy codebases. Enter Renovate: an open-source tool that automates dependency updates, making your project maintenance both easier and more secure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_what_is_renovate"&gt;What is Renovate?&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Renovate is an automated dependency management tool that monitors your repository’s dependencies and automatically creates pull requests when updates become available. Think of it as your personal assistant that constantly checks for new versions of the libraries and packages your project uses.&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Week in review 2024-09-22</title><link>https://prule.github.io/pauls-blog/post/coding/2024/week-in-review/2024-09-22/</link><pubDate>Sun, 22 Sep 2024 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2024/week-in-review/2024-09-22/</guid><description>&lt;div class="paragraph"&gt;
&lt;p&gt;Week in review - 2024-09-22&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://lucamezzalira.medium.com/how-to-document-software-architecture-techniques-and-best-practices-2556b1915850" class="bare"&gt;https://lucamezzalira.medium.com/how-to-document-software-architecture-techniques-and-best-practices-2556b1915850&lt;/a&gt;&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How to document software projects using ADRs, RFCs, and more&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description></item><item><title>A Brief Introduction to AsciiDoc</title><link>https://prule.github.io/pauls-blog/post/coding/2024/asciidoc-example/</link><pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2024/asciidoc-example/</guid><description>&lt;div class="paragraph"&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Note&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 The source code for this document is available at &lt;a href="https://github.com/prule/asciidoc-example" target="_blank" rel="noopener"&gt;github&lt;/a&gt;
.
Unfortunately though, GitHub does NOT support includes so you won&amp;rsquo;t see this document rendered properly. Instead, I&amp;rsquo;ve used the Intellij plugin to generate a PDF document which you can see here: &lt;a href="ReadMe.pdf"&gt;ReadMe.pdf&lt;/a&gt;
.
 &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The source code for this document is available at &lt;a href="https://github.com/prule/asciidoc-example"&gt;github&lt;/a&gt;.
Unfortunately though, GitHub does NOT support includes so you won’t see this document rendered properly. Instead, I’ve used the Intellij plugin to generate a PDF document which you can see here: &lt;a href="ReadMe.pdf"&gt;ReadMe.pdf&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Clean architecture - part 1</title><link>https://prule.github.io/pauls-blog/post/coding/2024/clean-architecture-1/</link><pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2024/clean-architecture-1/</guid><description>&lt;div class="sect1"&gt;
&lt;h2 id="_clean_architecture_part_1"&gt;Clean architecture - part 1&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After porting my template app over to Kotlin, I thought it was time to attempt rewriting from a layered architecture to a ports and adapters/hexagonal architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In the layered version, the usual patterns exist:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The domain models ARE the database entities&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The domain model is compromised, cluttered with persistence concerns and far from clean&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Services implement the business logic, manipulating the domain (database entities) and persisting them via the repositories&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Unfortunately the services usually end up being classes with a bunch of methods&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description></item><item><title>Week in review 2024-08-25</title><link>https://prule.github.io/pauls-blog/post/coding/2024/week-in-review/2024-08-25/</link><pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2024/week-in-review/2024-08-25/</guid><description>&lt;div class="sect2"&gt;
&lt;h3 id="_roadmap_sh"&gt;Roadmap.sh&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://roadmap.sh" class="bare"&gt;https://roadmap.sh&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;roadmap.sh is a community effort to create roadmaps, guides and other educational content to help guide developers in picking up a path and guide their learnings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Roadmaps based on Role or Skill, plus best practice and questions to test your knowledge&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_startdataengineering_com"&gt;StartDataEngineering.com&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://www.startdataengineering.com" class="bare"&gt;https://www.startdataengineering.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An interesting blog with lots of data engineering information&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;What are the types of data quality checks?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to implement data quality checks with greatexpectations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why use Apache Airflow (or any orchestrator)?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description></item><item><title/><link>https://prule.github.io/pauls-blog/page/cv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/cv/</guid><description>&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Senior Software Developer&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Sydney, Australia (open to remote or hybrid)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/paulrule"&gt;linkedin.com/in/paulrule&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://prule.github.io/pauls-blog/"&gt;prule.github.io/pauls-blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;References&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/paulrule/details/recommendations/"&gt;linkedin.com/in/paulrule/details/recommendations&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_summary"&gt;Summary&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Senior Software Developer with 20+ years of experience building robust, maintainable systems on the JVM — primarily Java with Spring Boot, and increasingly Kotlin. Brings a strong emphasis on clean architecture, recognisable patterns, and thoughtful code design: writing software that communicates its intent clearly, encourages reuse, and stays easy to maintain as teams and requirements evolve.&lt;/p&gt;
&lt;/div&gt;</description></item><item><title/><link>https://prule.github.io/pauls-blog/page/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/projects/</guid><description>&lt;h2 id="github"&gt;GitHub&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/prule" target="_blank" rel="noopener"&gt;https://github.com/prule&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/prule/laptime-insights-server" target="_blank" rel="noopener"&gt;Laptime Insights (WIP)&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Current project in progress to show a dashboard for ACC laptimes. Practice clean architecture, integration with sim racing software, kotlin/ktor/exposed/websockets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/prule/data-processing-experiment/tree/latest" target="_blank" rel="noopener"&gt;Data processing experiment&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A coding exercise, design challenge, documentation workout - follows the incremental design and implementation of a configurable data processing pipeline. Each part is in its own branch with its own documentation - be sure to look at the branch &amp;ldquo;latest&amp;rdquo; for the end result.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/prule/rest-hateoas" target="_blank" rel="noopener"&gt;Rest/Hateoas example&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A sample project to demonstrate a rest api with resources containing links to drive the frontend.&lt;/li&gt;
&lt;li&gt;Also see &lt;a href="https://github.com/prule/spring-boot-react-hateoas-template/tree/material-ui-spike" target="_blank" rel="noopener"&gt;https://github.com/prule/spring-boot-react-hateoas-template/tree/material-ui-spike&lt;/a&gt;
 (the main branch is out of date, look at the material-ui-spike branch)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/prule/jsonata-java/tree/bigdecimal-experiment" target="_blank" rel="noopener"&gt;Jsonata-java fork&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Fork of the jsonata-java library to use BigDecimal instead of float in order to solve the binary arithmetic problem (e.g. &lt;a href="https://stackoverflow.com/questions/588004/is-floating-point-math-broken%29" target="_blank" rel="noopener"&gt;https://stackoverflow.com/questions/588004/is-floating-point-math-broken)&lt;/a&gt;
.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="blog"&gt;Blog&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://prule.github.io/pauls-blog/" target="_blank" rel="noopener"&gt;https://prule.github.io/pauls-blog/&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>A Game Plan for Product and Software Development</title><link>https://prule.github.io/pauls-blog/page/software/game-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/game-plan/</guid><description>&lt;h2 id="a-game-plan-for-product-and-software-development"&gt;A Game Plan for Product and Software Development&lt;/h2&gt;
&lt;h3 id="the-premise"&gt;The Premise&lt;/h3&gt;
&lt;p&gt;Most software problems are not technical. A team that consistently delivers working software, adapts to changing requirements, and maintains the capacity to keep improving over time is not doing so because they chose the right framework or the right database. They are doing so because they have internalised a coherent set of practices that compound — each one making the others more effective, and all of them together producing a system that remains comprehensible, changeable, and reliable over its lifetime.&lt;/p&gt;</description></item><item><title>A Pyramid Principle Structure - Software Engineering Excellence</title><link>https://prule.github.io/pauls-blog/page/software/software-engineering-excellence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/software-engineering-excellence/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This attempts to apply the McKinsey Pyramid Principle to these software development thoughts and practices.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/4uooYee" target="_blank" rel="noopener"&gt;The Pyramid Principle&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="software-engineering-excellence--a-pyramid-principle-structure"&gt;Software Engineering Excellence — A Pyramid Principle Structure&lt;/h2&gt;
&lt;p&gt;The McKinsey Pyramid Principle organises thinking from the top down: a single governing idea, supported by a small number of mutually exclusive and collectively exhaustive arguments, each supported by evidence and reasoning. What follows applies that structure to everything covered in this series.&lt;/p&gt;</description></item><item><title>Atomic Habits</title><link>https://prule.github.io/pauls-blog/page/booksummaries/atomic-habits/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/atomic-habits/</guid><description>&lt;h2 id="atomic-habits--summary"&gt;Atomic Habits — Summary&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;By James Clear — Writer, Entrepreneur, and Habits Researcher&lt;/strong&gt;&lt;/p&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/4t563Uz" target="_blank" rel="noopener"&gt;Atomic Habits: Tiny Changes, Remarkable Results&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;You do not rise to the level of your goals. You fall to the level of your systems. Goals are the direction; &lt;strong&gt;habits are the vehicle&lt;/strong&gt;. And habits are not built through motivation, willpower, or dramatic transformation — they are built through tiny, consistent, almost invisible changes that compound over time into remarkable results.&lt;/p&gt;</description></item><item><title>Be Useful</title><link>https://prule.github.io/pauls-blog/page/booksummaries/be-useful/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/be-useful/</guid><description>&lt;h2 id="be-useful-seven-tools-for-life--summary"&gt;Be Useful: Seven Tools for Life — Summary&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;By Arnold Schwarzenegger — Actor, Bodybuilder, Governor&lt;/strong&gt;&lt;/p&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/4mU1RWj" target="_blank" rel="noopener"&gt;Be Useful&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;Arnold&amp;rsquo;s life philosophy distilled into one word: &lt;strong&gt;useful&lt;/strong&gt;. Not famous. Not rich. Not admired. &lt;em&gt;Useful&lt;/em&gt; — to yourself, to the people around you, and to the world. The book is a no-nonsense, deeply personal guide built entirely from Arnold&amp;rsquo;s own journey from a small Austrian village to the pinnacle of three completely different careers.&lt;/p&gt;</description></item><item><title>Breaking Down Problems</title><link>https://prule.github.io/pauls-blog/page/software/breaking-down-problems/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/breaking-down-problems/</guid><description>&lt;h2 id="breaking-down-problems--decomposition-as-a-core-skill"&gt;Breaking Down Problems — Decomposition as a Core Skill&lt;/h2&gt;
&lt;h3 id="why-its-a-skill-not-a-step"&gt;Why It&amp;rsquo;s a Skill, Not a Step&lt;/h3&gt;
&lt;p&gt;Decomposition is often treated as a planning activity — something that happens in a refinement session, produces a list of tickets, and is then considered done. The tickets get handed to developers who implement them. This misses what decomposition actually is.&lt;/p&gt;
&lt;p&gt;Decomposition is a continuous cognitive skill exercised throughout development — in planning, yes, but also when sitting down to write a test, when deciding where a class boundary should be, when a piece of code resists being understood. The developer who can break a problem down well works differently at every level: they write smaller functions, cleaner interfaces, more focused tests, and smaller PRs. The skill compounds across every scale of work.&lt;/p&gt;</description></item><item><title>Clean Architecture</title><link>https://prule.github.io/pauls-blog/page/software/clean-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/clean-architecture/</guid><description>&lt;h2 id="clean-architecture"&gt;Clean Architecture&lt;/h2&gt;
&lt;h3 id="the-core-idea"&gt;The Core Idea&lt;/h3&gt;
&lt;p&gt;Clean Architecture, articulated by Robert C. Martin (Uncle Bob), is a way of organising code so that &lt;strong&gt;business logic is the centre of the system&lt;/strong&gt; and everything else — frameworks, databases, UIs, external services — is a detail that can be swapped out or tested independently.&lt;/p&gt;
&lt;p&gt;The central rule is the &lt;strong&gt;Dependency Rule&lt;/strong&gt;: source code dependencies can only point &lt;em&gt;inward&lt;/em&gt;. Outer layers know about inner layers; inner layers know nothing about outer layers.&lt;/p&gt;</description></item><item><title>Coding Tips — Principles in Practice</title><link>https://prule.github.io/pauls-blog/page/software/coding-tips/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/coding-tips/</guid><description>&lt;h2 id="coding-tips--principles-in-practice"&gt;Coding Tips — Principles in Practice&lt;/h2&gt;
&lt;p&gt;These tips are the everyday expression of everything covered in this series — the micro-decisions that, made consistently, produce code that is comprehensible, maintainable, and a pleasure to work in.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="control-flow"&gt;Control Flow&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Return early to reduce nesting.&lt;/strong&gt;
Every level of nesting is a level of context the reader must hold in working memory. Guard clauses that return or throw early eliminate the nesting that builds up around validation and precondition checks.&lt;/p&gt;</description></item><item><title>Cognitive Load</title><link>https://prule.github.io/pauls-blog/page/software/cognitive-load/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/cognitive-load/</guid><description>&lt;h2 id="cognitive-load--the-hidden-cost-of-complexity"&gt;Cognitive Load — The Hidden Cost of Complexity&lt;/h2&gt;
&lt;h3 id="what-it-is"&gt;What It Is&lt;/h3&gt;
&lt;p&gt;Cognitive load is the amount of mental effort required to hold and process information at any given moment. The concept comes from educational psychology — John Sweller&amp;rsquo;s work in the 1980s on how people learn — but it maps directly onto software development, where the primary activity is understanding complex systems well enough to change them safely.&lt;/p&gt;
&lt;p&gt;Working memory is the bottleneck. Humans can hold roughly four to seven distinct pieces of information in working memory simultaneously. When that limit is exceeded, comprehension degrades, mistakes increase, and progress slows. The developer who can&amp;rsquo;t hold the relevant parts of a system in their head at once starts to make changes based on incomplete understanding — which is where bugs come from and where confidence erodes.&lt;/p&gt;</description></item><item><title>Collaborative Development</title><link>https://prule.github.io/pauls-blog/page/software/pairing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/pairing/</guid><description>&lt;h2 id="collaborative-development--beyond-strict-pair-programming"&gt;Collaborative Development — Beyond Strict Pair Programming&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(updated to include mentoring and teaching)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="the-spectrum-of-collaboration"&gt;The Spectrum of Collaboration&lt;/h3&gt;
&lt;p&gt;Traditional pair programming has a specific form: two people, one keyboard, one screen, switching between driver and navigator roles. The research behind it is solid — it produces fewer defects, spreads knowledge, and keeps both people focused. But the strict form has real costs: it&amp;rsquo;s cognitively intense, it doesn&amp;rsquo;t suit all personality types, and it treats every problem as requiring the same level of collaboration.&lt;/p&gt;</description></item><item><title>Configurable Systems</title><link>https://prule.github.io/pauls-blog/page/software/configurable-systems/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/configurable-systems/</guid><description>&lt;h2 id="configurable-systems-and-the-right-abstraction"&gt;Configurable Systems and the Right Abstraction&lt;/h2&gt;
&lt;h3 id="the-core-idea"&gt;The Core Idea&lt;/h3&gt;
&lt;p&gt;There is a class of problem where the right move is not to write another solution, but to recognise that you&amp;rsquo;ve already written several solutions to the same underlying problem and extract the pattern. Instead of building bespoke code repeatedly, you build a framework that models the &lt;em&gt;shape&lt;/em&gt; of the problem — and then configure it for each specific instance.&lt;/p&gt;
&lt;p&gt;The payoff is significant: new instances of the problem become configuration rather than code. The framework is tested once deeply; each configuration gets a shallow test. Developers working with it operate at the level of the domain concept — star schema, workflow, form, pipeline — rather than the level of implementation detail.&lt;/p&gt;</description></item><item><title>Continuous Integration and Delivery</title><link>https://prule.github.io/pauls-blog/page/software/continuous-integration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/continuous-integration/</guid><description>&lt;h2 id="continuous-integration-and-delivery"&gt;Continuous Integration and Delivery&lt;/h2&gt;
&lt;h3 id="the-problem-with-infrequent-integration"&gt;The Problem with Infrequent Integration&lt;/h3&gt;
&lt;p&gt;Imagine two developers working independently on the same codebase for two weeks. They&amp;rsquo;ve each made hundreds of changes across dozens of files. On day fourteen they attempt to merge. The merge itself might be mechanical — resolving conflicting edits line by line — but the harder problem is behavioural: their changes made assumptions about the system that are no longer true. Tests fail in ways that are hard to diagnose because the surface area of change is enormous. Nobody is sure whether a failure was introduced yesterday or ten days ago.&lt;/p&gt;</description></item><item><title>Decision Making</title><link>https://prule.github.io/pauls-blog/page/software/decision-making/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/decision-making/</guid><description>&lt;h2 id="decision-making-under-uncertainty"&gt;Decision Making Under Uncertainty&lt;/h2&gt;
&lt;h3 id="the-problem-with-deciding-too-early"&gt;The Problem With Deciding Too Early&lt;/h3&gt;
&lt;p&gt;Architecture decisions are made at the worst possible time. At the start of a project — when the key decisions feel most urgent — the team has the least information. The domain isn&amp;rsquo;t fully understood, the usage patterns are hypothetical, the team hasn&amp;rsquo;t discovered the pain points yet. And yet this is precisely when decisions are made that will shape the system for years.&lt;/p&gt;</description></item><item><title>Domain Modelling</title><link>https://prule.github.io/pauls-blog/page/software/domain-modelling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/domain-modelling/</guid><description>&lt;h2 id="domain-modelling-and-rich-domain-models"&gt;Domain Modelling and Rich Domain Models&lt;/h2&gt;
&lt;h3 id="the-core-idea"&gt;The Core Idea&lt;/h3&gt;
&lt;p&gt;Domain modelling is the practice of capturing the concepts, rules, and behaviour of a business problem in code. A &lt;strong&gt;rich domain model&lt;/strong&gt; goes further — it places business logic &lt;em&gt;inside&lt;/em&gt; the domain objects themselves, rather than in surrounding service or use case classes.&lt;/p&gt;
&lt;p&gt;The opposite of a rich domain model is an &lt;strong&gt;anaemic domain model&lt;/strong&gt; — objects that are little more than bags of getters and setters, with all logic extracted into services. Martin Fowler describes the anaemic model as an anti-pattern: it has the structure of OOP without the substance.&lt;/p&gt;</description></item><item><title>Feature Flags and Trunk-Based Development</title><link>https://prule.github.io/pauls-blog/page/software/feature-flags/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/feature-flags/</guid><description>&lt;h2 id="feature-flags-and-trunk-based-development"&gt;Feature Flags and Trunk-Based Development&lt;/h2&gt;
&lt;h3 id="the-problem-they-solve-together"&gt;The Problem They Solve Together&lt;/h3&gt;
&lt;p&gt;Continuous Integration demands frequent integration to mainline. Continuous Delivery demands that mainline is always releasable. These two commitments create an immediate tension: what do you do with a feature that takes two weeks to build? You can&amp;rsquo;t keep it on a branch for two weeks — that defeats CI. But you can&amp;rsquo;t have a half-built feature in production — that defeats CD.&lt;/p&gt;</description></item><item><title>Keeping Dependencies Up to Date with Renovate</title><link>https://prule.github.io/pauls-blog/page/software/updating-dependencies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/updating-dependencies/</guid><description>&lt;h2 id="keeping-dependencies-up-to-date-with-renovate"&gt;Keeping Dependencies Up to Date with Renovate&lt;/h2&gt;
&lt;h3 id="the-problem"&gt;The Problem&lt;/h3&gt;
&lt;p&gt;Every application sits on a foundation of dependencies — libraries, frameworks, build tools, base images. That foundation is not static. Dependencies release updates continuously: new features, performance improvements, bug fixes, and critically, security patches.&lt;/p&gt;
&lt;p&gt;The default human response to this is inertia. Updating dependencies takes time, updates occasionally break things, and there is always something more immediately valuable to work on. So updates get deferred. Weeks become months, months become years, and the gap between what you&amp;rsquo;re running and what&amp;rsquo;s current grows quietly in the background.&lt;/p&gt;</description></item><item><title>Managing Complexity</title><link>https://prule.github.io/pauls-blog/page/software/complexity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/complexity/</guid><description>&lt;h2 id="managing-complexity--keeping-systems-comprehensible"&gt;Managing Complexity — Keeping Systems Comprehensible&lt;/h2&gt;
&lt;h3 id="the-two-kinds-of-complexity"&gt;The Two Kinds of Complexity&lt;/h3&gt;
&lt;p&gt;Fred Brooks introduced the distinction in his 1986 paper &lt;em&gt;No Silver Bullet&lt;/em&gt;. It remains one of the most useful ideas in software engineering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Essential complexity&lt;/strong&gt; is inherent in the problem itself. A tax calculation system is complex because tax law is complex. A trading platform has complex rules because financial markets have complex rules. A healthcare system handles nuanced workflows because healthcare is genuinely nuanced. This complexity cannot be removed — it can only be managed, modelled, and represented as clearly as possible. Fighting essential complexity is fighting the domain.&lt;/p&gt;</description></item><item><title>Mindset: The New Psychology of Success</title><link>https://prule.github.io/pauls-blog/page/booksummaries/mindset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/mindset/</guid><description>&lt;h2 id="mindset-the-new-psychology-of-success"&gt;Mindset: The New Psychology of Success&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;By Carol S. Dweck — Professor of Psychology, Stanford University&lt;/strong&gt;&lt;/p&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/4tEATVa" target="_blank" rel="noopener"&gt;Mindset&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;Every person operates from one of two fundamental beliefs about their own abilities. That belief — which Dweck calls your &lt;strong&gt;mindset&lt;/strong&gt; — quietly governs how you respond to challenges, failure, criticism, and the success of others. It shapes whether you reach your potential or fall short of it, often without you ever realising it&amp;rsquo;s happening.&lt;/p&gt;</description></item><item><title>Modelling Domains in Kotlin With Value Objects</title><link>https://prule.github.io/pauls-blog/page/software/kotlin-value-objects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/kotlin-value-objects/</guid><description>&lt;h2 id="modelling-domains-in-kotlin-with-value-objects"&gt;Modelling Domains in Kotlin With Value Objects&lt;/h2&gt;
&lt;h3 id="the-problem-with-primitives"&gt;The Problem With Primitives&lt;/h3&gt;
&lt;p&gt;Every domain has concepts that primitives can represent but cannot express. An email address is a &lt;code&gt;String&lt;/code&gt;, but not every &lt;code&gt;String&lt;/code&gt; is an email address. An order total is a &lt;code&gt;BigDecimal&lt;/code&gt;, but not every &lt;code&gt;BigDecimal&lt;/code&gt; is a valid order total — it shouldn&amp;rsquo;t be negative, it should have a defined currency, and it shouldn&amp;rsquo;t be mixed with a price in a different currency. A user ID is an &lt;code&gt;Int&lt;/code&gt;, but it shouldn&amp;rsquo;t be added to a product ID, compared to a quantity, or passed where an order ID is expected.&lt;/p&gt;</description></item><item><title>Observability</title><link>https://prule.github.io/pauls-blog/page/software/observability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/observability/</guid><description>&lt;h2 id="observability--understanding-your-system-in-production"&gt;Observability — Understanding Your System in Production&lt;/h2&gt;
&lt;h3 id="why-observability-is-a-design-concern"&gt;Why Observability is a Design Concern&lt;/h3&gt;
&lt;p&gt;Most teams treat observability as something added after the fact — sprinkle some log statements in, wire up a metrics library, declare the system observable. The result is a production system that generates enormous volumes of data while remaining fundamentally opaque when something goes wrong. The logs exist but don&amp;rsquo;t answer the question being asked. The metrics show something is wrong but not where or why. The traces are missing for the one request that caused the incident.&lt;/p&gt;</description></item><item><title>Reading and Understanding Unfamiliar Codebases</title><link>https://prule.github.io/pauls-blog/page/software/reading-code/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/reading-code/</guid><description>&lt;h2 id="reading-and-understanding-unfamiliar-codebases"&gt;Reading and Understanding Unfamiliar Codebases&lt;/h2&gt;
&lt;h3 id="why-its-a-distinct-skill"&gt;Why It&amp;rsquo;s a Distinct Skill&lt;/h3&gt;
&lt;p&gt;Most developer education focuses on writing code. Reading code — particularly large, unfamiliar codebases written by people you&amp;rsquo;ve never met, under constraints you don&amp;rsquo;t know, solving problems you&amp;rsquo;re still discovering — is a different activity that receives almost no explicit attention.&lt;/p&gt;
&lt;p&gt;Yet it is something every developer does constantly. Joining a new team, picking up an open source library to understand its internals, inheriting a system from a team that no longer exists, returning to your own code after six months. The ability to build an accurate mental model of an unfamiliar system quickly is one of the highest-leverage skills a developer can have, and it is largely learned through trial and error rather than through deliberate practice.&lt;/p&gt;</description></item><item><title>References</title><link>https://prule.github.io/pauls-blog/page/references/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/references/</guid><description>&lt;div class="sect1"&gt;
&lt;h2 id="_communication"&gt;Communication&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://medium.com/lessons-from-mckinsey/the-pyramid-principle-f0885dd3c5c7"&gt;The Pyramid Principle&lt;/a&gt;&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Start with the answer first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Group and summarize your supporting arguments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Logically order your supporting ideas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_books"&gt;Books&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://37signals.com/books"&gt;37 Signals&lt;/a&gt;&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Shape Up is for product development teams who struggle to ship.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It Doesn’t Have to Be Crazy at Work - Chaos shouldn’t be the natural state at work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;REWORK is the perfect playbook for anyone who’s ever dreamed of doing it on their own.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;REMOTE - Office not required.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Getting Real - The smarter, faster, easier way to build a successful web application.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description></item><item><title>REST and HATEOAS</title><link>https://prule.github.io/pauls-blog/page/software/rest-hateoas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/rest-hateoas/</guid><description>&lt;h2 id="rest-and-hateoas"&gt;REST and HATEOAS&lt;/h2&gt;
&lt;h3 id="rest-representational-state-transfer"&gt;REST (Representational State Transfer)&lt;/h3&gt;
&lt;p&gt;REST is an architectural style for distributed hypermedia systems, first described by Roy Fielding in his 2000 doctoral dissertation. It&amp;rsquo;s not a protocol or standard, but a set of constraints that, when applied to a web service, produce desirable properties like scalability, simplicity, and modifiability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The six constraints of REST:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Client-Server&lt;/strong&gt; — Concerns are separated between the UI/consumer and the data storage/logic. This allows each to evolve independently.&lt;/p&gt;</description></item><item><title>Rework</title><link>https://prule.github.io/pauls-blog/page/booksummaries/rework/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/rework/</guid><description>&lt;h2 id="rework-by-jason-fried-and-david-heinemeier-hansson-of-37signals"&gt;&lt;a href="https://amzn.to/3Osu2yB" target="_blank" rel="noopener"&gt;REWORK&lt;/a&gt;
 by Jason Fried and David Heinemeier Hansson of 37signals:&lt;/h2&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/3Osu2yB" target="_blank" rel="noopener"&gt;REWORK&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="what-it-is"&gt;What It Is&lt;/h2&gt;
&lt;p&gt;Rework is a business book that offers unconventional and practical advice for starting and running a successful business. It encourages readers to question traditional workplace practices and focus on simplicity, efficiency, and genuine customer service. The book is broken down into micro-chapters — each between 2–3 pages long and containing a single tip designed to show how the authors have bucked convention.&lt;/p&gt;</description></item><item><title>Shape Up: Stop Running in Circles and Ship Work that Matters</title><link>https://prule.github.io/pauls-blog/page/booksummaries/shapeup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/shapeup/</guid><description>&lt;h2 id="shape-up-stop-running-in-circles-and-ship-work-that-matters--summary"&gt;Shape Up: Stop Running in Circles and Ship Work that Matters — Summary&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;By Ryan Singer — Head of Strategy at Basecamp&lt;/strong&gt;&lt;/p&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Online book&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Basecamp.com &lt;a href="https://basecamp.com/shapeup" target="_blank" rel="noopener"&gt;Shape Up: Stop Running in Circles and Ship Work that Matters&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;Most software teams are trapped in a cycle that feels productive but isn&amp;rsquo;t: endless backlogs, two-week sprints that never quite finish, features that balloon beyond their original scope, and a persistent sense that the team is always busy but never done. Shape Up is Basecamp&amp;rsquo;s answer to this — a &lt;strong&gt;fundamentally different way of thinking about how software gets built&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Team Topologies</title><link>https://prule.github.io/pauls-blog/page/booksummaries/team-topologies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/team-topologies/</guid><description>&lt;h2 id="team-topologies--summary"&gt;Team Topologies — Summary&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;By Matthew Skelton &amp;amp; Manuel Pais&lt;/strong&gt;&lt;/p&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/3QR8qg9" target="_blank" rel="noopener"&gt;Team Topologies&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;Most organisations design their teams around org charts, project needs, or historical accident — and then wonder why their software architecture is a mess and their delivery is slow. Team Topologies argues that &lt;strong&gt;team design is a first-class engineering decision&lt;/strong&gt;, as important as any technical choice you make.&lt;/p&gt;
&lt;p&gt;The book&amp;rsquo;s central claim: &lt;strong&gt;your team structure will become your system architecture&lt;/strong&gt; whether you intend it or not. So you might as well design both deliberately.&lt;/p&gt;</description></item><item><title>Technical Debt</title><link>https://prule.github.io/pauls-blog/page/software/tech-debt/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/tech-debt/</guid><description>&lt;h2 id="technical-debt--thinking-about-it-honestly"&gt;Technical Debt — Thinking About It Honestly&lt;/h2&gt;
&lt;h3 id="the-metaphor-and-its-limits"&gt;The Metaphor and Its Limits&lt;/h3&gt;
&lt;p&gt;Ward Cunningham coined the term &amp;ldquo;technical debt&amp;rdquo; in 1992 to describe a specific situation: shipping code that isn&amp;rsquo;t quite right in order to learn something from real users, with the intention of going back to refactor once that learning has happened. The debt metaphor was deliberate — like financial debt, it accrues interest. The longer you leave the suboptimal code in place, the more every subsequent change that touches it costs.&lt;/p&gt;</description></item><item><title>Technical Documentation — What's Worth Writing Down</title><link>https://prule.github.io/pauls-blog/page/software/tech-docs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/tech-docs/</guid><description>&lt;h2 id="technical-documentation--whats-worth-writing-down"&gt;Technical Documentation — What&amp;rsquo;s Worth Writing Down&lt;/h2&gt;
&lt;h3 id="the-documentation-paradox"&gt;The Documentation Paradox&lt;/h3&gt;
&lt;p&gt;Documentation has a reputation problem in both directions. Teams that write too little leave critical knowledge locked in individuals&amp;rsquo; heads, where it fades and eventually disappears when people move on. Teams that write too much produce documents that are immediately out of date, never read, and actively misleading — giving readers false confidence that they understand something they don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;The failure mode is treating documentation as a uniform activity — either you document everything or you document nothing. The more useful question is: what specific knowledge needs to exist in written form, for whom, and why? Different answers produce radically different kinds of documentation, each with different value and different maintenance costs.&lt;/p&gt;</description></item><item><title>Test-Driven Development</title><link>https://prule.github.io/pauls-blog/page/software/tdd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/tdd/</guid><description>&lt;h2 id="test-driven-development-tdd"&gt;Test-Driven Development (TDD)&lt;/h2&gt;
&lt;h3 id="the-core-idea"&gt;The Core Idea&lt;/h3&gt;
&lt;p&gt;TDD inverts the traditional write-code-then-test workflow. You write a failing test &lt;em&gt;before&lt;/em&gt; writing the implementation, then write the minimum code to make it pass, then clean up. The tests don&amp;rsquo;t just verify correctness after the fact — they drive the design of the code itself.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="the-red-green-refactor-cycle"&gt;The Red-Green-Refactor Cycle&lt;/h3&gt;
&lt;p&gt;This is the heartbeat of TDD. Every small increment of work follows three steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Red&lt;/strong&gt; — Write a test for behaviour that doesn&amp;rsquo;t exist yet. Run it. It must fail. If it passes, either the behaviour already exists or the test is wrong.&lt;/p&gt;</description></item><item><title>The Defining Decade</title><link>https://prule.github.io/pauls-blog/page/booksummaries/the-defining-decade/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/the-defining-decade/</guid><description>&lt;h2 id="the-defining-decade-by-meg-jay-clinical-psychologist"&gt;&lt;a href="https://amzn.to/4tM7OGT" target="_blank" rel="noopener"&gt;The Defining Decade&lt;/a&gt;
 by Meg Jay, Clinical Psychologist&lt;/h2&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/4tM7OGT" target="_blank" rel="noopener"&gt;The Defining Decade&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;Your twenties are the most transformative — and most wasted — decade of your life. Society tells young adults to treat their twenties as a free pass, a consequence-free intermission before &amp;ldquo;real life&amp;rdquo; begins. Meg Jay argues the opposite: &lt;strong&gt;80% of life&amp;rsquo;s most defining moments happen by age 35&lt;/strong&gt;, meaning the twenties are not a waiting room but a launching pad.&lt;/p&gt;</description></item><item><title>The lean startup</title><link>https://prule.github.io/pauls-blog/page/booksummaries/the-lean-startup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/the-lean-startup/</guid><description>&lt;h2 id="the-lean-startup-by-eric-ries-entrepreneur--silicon-valley-pioneer"&gt;&lt;a href="https://amzn.to/426TnBl" target="_blank" rel="noopener"&gt;The Lean Startup&lt;/a&gt;
 by Eric Ries, Entrepreneur &amp;amp; Silicon Valley Pioneer&lt;/h2&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/426TnBl" target="_blank" rel="noopener"&gt;The Lean Startup&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;Most startups fail — not because they build something &lt;em&gt;bad&lt;/em&gt;, but because they build something &lt;em&gt;nobody wants&lt;/em&gt;. Traditional business planning is fiction dressed as strategy. Eric Ries argues that startups need a &lt;strong&gt;scientific approach to innovation&lt;/strong&gt;: test assumptions rapidly, learn from real customers, and adapt before running out of time and money.&lt;/p&gt;</description></item><item><title>The Pyramid Principle</title><link>https://prule.github.io/pauls-blog/page/booksummaries/the-pyramid-principle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/the-pyramid-principle/</guid><description>&lt;h2 id="the-pyramid-principle--summary"&gt;The Pyramid Principle — Summary&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;By Barbara Minto — Former McKinsey Consultant&lt;/strong&gt;&lt;/p&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/4uooYee" target="_blank" rel="noopener"&gt;The Pyramid Principle&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;Most people communicate by leading with their thinking and arriving at their conclusion. They explain the context, walk through the analysis, describe the options, and finally — after the reader has been waiting — deliver the point. Minto argues this is exactly backwards.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Start with the answer. Then explain it.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>The Spirit of the Craft</title><link>https://prule.github.io/pauls-blog/page/software/manifesto/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/manifesto/</guid><description>&lt;h1 id="the-spirit-of-the-craft"&gt;The Spirit of the Craft&lt;/h1&gt;
&lt;p&gt;These documents represent a living collection of my thoughts on building software. While they cover varied topics—from architectural patterns to testing strategies—they are unified by a single perspective: &lt;strong&gt;Software is a human-centric endeavor.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;spirit&amp;rdquo; of this collection can be distilled into five core convictions:&lt;/p&gt;
&lt;h3 id="1-the-primary-constraint-is-human-cognition"&gt;1. The Primary Constraint is Human Cognition&lt;/h3&gt;
&lt;p&gt;We build systems that eventually exceed our ability to understand them. Most of our tools—TDD, Clean Architecture, Decomposition—are not about &amp;ldquo;correctness&amp;rdquo; in a vacuum; they are defensive measures against &lt;strong&gt;cognitive load&lt;/strong&gt;. We write code for the reader, not the compiler, because the hardest part of software is keeping the mental model in our heads long enough to change it safely.&lt;/p&gt;</description></item><item><title>Tidy First</title><link>https://prule.github.io/pauls-blog/page/booksummaries/tidy-first/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/booksummaries/tidy-first/</guid><description>&lt;h2 id="tidy-first"&gt;Tidy First?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;By Kent Beck — Creator of Extreme Programming &amp;amp; Pioneer of Test-Driven Development&lt;/strong&gt;&lt;/p&gt;
&lt;div class="notice info"&gt;
 &lt;div class="notice-title"&gt;Amazon Affiliates Link&lt;/div&gt;
 &lt;div class="notice-content"&gt;
 Buy on Amazon &lt;a href="https://amzn.to/4cB4oRJ" target="_blank" rel="noopener"&gt;Tidy First&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="core-thesis"&gt;Core Thesis&lt;/h3&gt;
&lt;p&gt;Before you change the &lt;em&gt;behaviour&lt;/em&gt; of code, should you first tidy its &lt;em&gt;structure&lt;/em&gt;? That&amp;rsquo;s the deceptively simple question at the heart of this book. Kent Beck&amp;rsquo;s answer is nuanced: &lt;strong&gt;sometimes yes, sometimes no, and knowing the difference is the mark of a mature engineer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But the book is really about something deeper — it&amp;rsquo;s a philosophy of software development that connects &lt;strong&gt;code structure, human behaviour, and economic value&lt;/strong&gt; into a unified theory of when and why tidying matters.&lt;/p&gt;</description></item><item><title>Writing Code for the Reader</title><link>https://prule.github.io/pauls-blog/page/software/readable-code/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/page/software/readable-code/</guid><description>&lt;h2 id="writing-code-for-the-reader"&gt;Writing Code for the Reader&lt;/h2&gt;
&lt;h3 id="the-compiler-is-not-your-audience"&gt;The Compiler Is Not Your Audience&lt;/h3&gt;
&lt;p&gt;Code is written once. It is read many times — by the next developer to work in the area, by a colleague reviewing the PR, by you returning to it six months later with the context entirely gone. The compiler will accept almost anything that is syntactically correct. The human reader is far more demanding, and far more important.&lt;/p&gt;</description></item></channel></rss>