<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
        <title>Think Code AB Blog</title>
        <link>https://www.thinkcode.se/blog</link>
        <description>Thoughts and opinions from Think Code AB</description>
        <item>
            <title>Migrating from Spark to Javalin: You Can't Strangle a Web Framework</title>
            <link>https://www.thinkcode.se/blog/2026/08/21/migrating-from-spark-to-javalin-you-cant-strangle-a-web-framework</link>
            <description><![CDATA[<p>
    Changing a web framework must be done the same way you would change an aircraft engine midair.
    You do it prudently, in small, safe steps all the way. You test everything so no
    surprise surface when you do the switch.
</p>

<p>
    I moved <a href="https://www.logeze.com">LogEze</a> to Javalin. It is a product I have built since 2014, and it ran
    on the Spark Java web framework until recently. The cutover was one environment variable. I flipped it and
    everything
    switched from Spark to Javalin at once.
    Most of the work was in the preparations. Two weeks of them were hands-on work, abstracting Spark away from the core
    of the app far enough that a parallel Javalin implementation could be built alongside it and switched on safely. The
    rest started a lot earlier, with spikes to settle on the replacement and a shared super class that every controller
    already ran through, in place more than two years before I needed it.
</p>

]]></description>
            <pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/08/21/migrating-from-spark-to-javalin-you-cant-strangle-a-web-framework</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>A Revival for Test First, If We Don't Waste It</title>
            <link>https://www.thinkcode.se/blog/2026/07/01/a-revival-for-test-first-if-we-dont-waste-it</link>
            <description><![CDATA[<p>
    Using a coding assistant might turn out to be the best thing that has happened to Test-Driven Development (TDD) so far.
    This is the seventh post in my series about coding with an assistant.
</p>

<p>
    For more than twenty years the objection to TDD was always some version of the same thing. No time. Too much typing.
    We will add the tests later. The assistant removes that objection. It types the test for you in seconds and
    it does not get bored doing it. On top of that, the path of least resistance with an assistant now runs
    straight through the test. I made that case in
    <a href="/blog/2026/06/24/fitness-functions-for-an-ai-coding-assistant">Fitness Functions for an AI Coding
        Assistant</a>. To get useful work out of the assistant you have to tell it what done looks like, and a
    description of done that a machine can check is a test. TDD stops being the disciplined choice and becomes the
    efficient one.
</p>

]]></description>
            <pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/07/01/a-revival-for-test-first-if-we-dont-waste-it</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>Fitness Functions for an AI Coding Assistant</title>
            <link>https://www.thinkcode.se/blog/2026/06/24/fitness-functions-for-an-ai-coding-assistant</link>
            <description><![CDATA[<p>
    This is the sixth post in my series about working with an AI coding assistant. The earlier posts covered
    getting started, observations, rules, results, and communication. This one is about the gap between a rule the
    assistant might follow and a constraint it cannot get around.
</p>

]]></description>
            <pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/06/24/fitness-functions-for-an-ai-coding-assistant</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>Pipe Suggestions Straight to the Clipboard</title>
            <link>https://www.thinkcode.se/blog/2026/06/15/pipe-suggestions-straight-to-the-clipboard</link>
            <description><![CDATA[<p>
    My AI assistant suggests commit messages. For a while I copied each one out of the terminal by hand,
    selecting the text with the mouse and pasting it into my git client. It works, but selecting text in the
    terminal drags the line breaks along with it. The terminal wraps the text to fit its width, and those
    wraps come through as real line breaks in whatever you paste into. Then you have to clean them out.
</p>

]]></description>
            <pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/06/15/pipe-suggestions-straight-to-the-clipboard</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>If You Can't Finish Your Sentence, Neither Can Your AI</title>
            <link>https://www.thinkcode.se/blog/2026/05/03/if-you-cant-finish-your-sentence-neither-can-your-ai</link>
            <description><![CDATA[<p>
    This is the fifth post in my series about working with an AI coding assistant. The earlier posts covered
    getting started, observations, rules, and practical results. This one is about something I keep coming
    back to: communication.
</p>

]]></description>
            <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/05/03/if-you-cant-finish-your-sentence-neither-can-your-ai</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>An AI Coding Assistant as a Force Multiplier</title>
            <link>https://www.thinkcode.se/blog/2026/04/23/an-ai-coding-assistant-as-a-force-multiplier</link>
            <description><![CDATA[<p>
    This is the fourth post in my series about working with an AI coding assistant. The rules from the
    previous post are in place. Now I want to talk about the results.
</p>

]]></description>
            <pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/04/23/an-ai-coding-assistant-as-a-force-multiplier</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>Spell It Out: Rules for an AI Coding Assistant</title>
            <link>https://www.thinkcode.se/blog/2026/04/20/spell-it-out-rules-for-an-ai-coding-assistant</link>
            <description><![CDATA[<p>
    This is the third post in my series about working with an AI coding assistant. The first two covered
    getting started and early observations. This one is about what happened when I started writing down the rules.
</p>

]]></description>
            <pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/04/20/spell-it-out-rules-for-an-ai-coding-assistant</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>Fast and accurate: testing the same contract two ways</title>
            <link>https://www.thinkcode.se/blog/2026/04/10/fast-and-accurate-testing-the-same-contract-two-ways</link>
            <description><![CDATA[<p>
    A Javalin-based REST server for a Gold Mine game, demonstrating a test architecture
    that runs the same tests both in-memory and over the network.
</p>

]]></description>
            <pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/04/10/fast-and-accurate-testing-the-same-contract-two-ways</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>Two kinds of developers</title>
            <link>https://www.thinkcode.se/blog/2026/04/08/two-kinds-of-developers</link>
            <description><![CDATA[<p>
    I have worked with a lot of developers over the years. Over the years, I have noticed a pattern. Some developers
    light up when they talk about the internals of a programming language. A new feature in the type system, a clever
    way to handle concurrency, an elegant pattern they discovered. The technology itself is what drives them.
</p>

<p>
    Other developers are different. They care less about how the language works under the hood. What gets them going is
    the customer's problem. They want to understand what hurts and build something that makes
    the pain go away. The programming language is a tool. A means to an end.
</p>

]]></description>
            <pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/04/08/two-kinds-of-developers</guid>
            <author>Thomas Sundberg</author>
        </item>
        <item>
            <title>Testing in 2026: more relevant than ever</title>
            <link>https://www.thinkcode.se/blog/2026/03/22/testing-in-2026-more-relevant-than-ever</link>
            <description><![CDATA[<p> Coding assistants generate code faster than ever. A feature that used to take a day can be roughed out in hours.
    The typing is nearly free. </p>

<p> You might wonder why you should still bother with tests. If the assistant can produce code that fast, surely it
    gets it right. That misses the point entirely. Tests were never about catching typos. They are about defining what
    the software should do and making sure it keeps doing it. </p>

]]></description>
            <pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate>
            <guid>https://www.thinkcode.se/blog/2026/03/22/testing-in-2026-more-relevant-than-ever</guid>
            <author>Thomas Sundberg</author>
        </item>
    </channel>
</rss>