Think Code AB Blog https://www.thinkcode.se/blog Thoughts and opinions from Think Code AB AI Coding Assistant: More Observations from a Practitioner https://www.thinkcode.se/blog/2026/03/17/ai-coding-assistant-more-observations-from-a-practitioner In February, I wrote about my early experience using an AI assistant for Test-Driven Development, TDD. This is a follow-up. It may become a series, we'll see. A lot has happened in the six weeks since that post, and I have more to say.

]]>
Tue, 17 Mar 2026 00:00:00 +0000 https://www.thinkcode.se/blog/2026/03/17/ai-coding-assistant-more-observations-from-a-practitioner Thomas Sundberg
Boring tech is good tech https://www.thinkcode.se/blog/2026/03/11/boring-tech-is-good-tech New frameworks appear every week. New languages get hyped every month. Right now, in early 2026, everything has to involve AI in some way or another. It is tempting to chase the latest trend. But I have found that the most reliable way to deliver value is to use technology that has been around long enough to be considered boring.

]]>
Wed, 11 Mar 2026 00:00:00 +0000 https://www.thinkcode.se/blog/2026/03/11/boring-tech-is-good-tech Thomas Sundberg
Testing a web application with Playwright https://www.thinkcode.se/blog/2026/03/01/testing-a-web-application-with-playwright Testing web applications can be painful. Browsers are slow, tests are flaky, and setting up the right driver version is a chore. Playwright is a browser automation library from Microsoft that takes away some of that pain. It manages browser downloads for you, waits for elements automatically, and comes with built-in assertions that make your tests more reliable.

In this post, we will build a small web application that lists products and then write two tests for it using Playwright for Java. You will need basic Java knowledge to follow along. All the code you need is included.

]]>
Sun, 01 Mar 2026 00:00:00 +0000 https://www.thinkcode.se/blog/2026/03/01/testing-a-web-application-with-playwright Thomas Sundberg
Why I still blog in 2026 https://www.thinkcode.se/blog/2026/02/25/why-i-still-blog-in-2026 It is 2026 and I still have a blog. Not because it is cool. Not because it is trendy. Blogging stopped being fashionable years ago. I keep writing because it is one of the best ways I know to actually learn things.

]]>
Wed, 25 Feb 2026 00:00:00 +0000 https://www.thinkcode.se/blog/2026/02/25/why-i-still-blog-in-2026 Thomas Sundberg
TDD with an AI assistant, my perspective as a beginning practitioner https://www.thinkcode.se/blog/2026/02/16/tdd-with-an-ai-assistant-my-perspective-as-a-beginning-practitioner

I have been practising Test-Driven Development for more than 25 years. The red-green-refactor cycle is second nature.

I have of course heard a lot about AI tools and LLMs over the last couple of years. The times I have tried them, I have not been impressed. Their proposals didn't compile. They seemed to solve the wrong problem. This was probably because they lacked the context of the project I'm working on. Honestly, a lot of what I have seen has been rubbish.

Not too long ago I saw a thread on LinkedIn where some people who I know really know what they are doing discussed their experience with AI assistants and specifically Claude Code. I decided to give it a try.

]]>
Mon, 16 Feb 2026 00:00:00 +0000 https://www.thinkcode.se/blog/2026/02/16/tdd-with-an-ai-assistant-my-perspective-as-a-beginning-practitioner Thomas Sundberg
Compare time with AssertJ https://www.thinkcode.se/blog/2020/04/30/compare-time-with-assertj

AssertJ is a great assertion framework for Java. It is in my opinion much better than any of the available alternatives. Two areas where AssertJ shines are verifying collections and verifying exceptions. It is also extendable, so you can implement custom assertions for your domain objects.

The way to assert something is done using the method assertThat(). A typical example looks like this:

assertThat(actual).isEqualTo(expected);

isEqualTo() is overloaded and can be used for a lot of comparisons.

]]>
Thu, 30 Apr 2020 00:00:00 +0000 https://www.thinkcode.se/blog/2020/04/30/compare-time-with-assertj Thomas Sundberg
Context switching in git https://www.thinkcode.se/blog/2020/03/11/context-switching-in-git

It happens that you are working on something and realize that you have to change context. Something urgent popped up and you need to get it into production as soon as possible. However, you have uncommitted changes that doesn't work properly. What do you do now? You can't commit your current changes. They are not done and should not end up in production. And you are smart so you avoid branching. Your current changes are on master and should be on master.

]]>
Wed, 11 Mar 2020 00:00:00 +0000 https://www.thinkcode.se/blog/2020/03/11/context-switching-in-git Thomas Sundberg
Delegating writing unit tests https://www.thinkcode.se/blog/2020/02/27/delegating-writing-unit-tests

Some time ago I attended a meeting where a developer told us that

The development is done. Wrote som unit tests yesterday. They are not done. I delegated writing them to a colleague.

A statement like that makes me very sad. It also upsets me.

]]>
Thu, 27 Feb 2020 00:00:00 +0000 https://www.thinkcode.se/blog/2020/02/27/delegating-writing-unit-tests Thomas Sundberg
Setting execution permission from git https://www.thinkcode.se/blog/2020/01/31/setting-execution-permission-from-git

The execution flag must be set on a file for it to be possible to be executed as a script on a Linux system.

]]>
Fri, 31 Jan 2020 00:00:00 +0000 https://www.thinkcode.se/blog/2020/01/31/setting-execution-permission-from-git Thomas Sundberg
Jenkins configuration as code https://www.thinkcode.se/blog/2019/12/23/jenkins-configuration-as-code

Configuring Jenkins is not as easy as one might imagine or want. There are some 1500 plugins available. Selecting the proper plugins and then configuring them is a daunting task.

Jenkins configuration as code doesn't solve the selection problem. But it does solve the problem of having a repeatable setup of Jenkins. The setup is version controlled and thus traceable.

Here is an example where I use this this tool chain:

  • Jenkins
  • Docker
  • Java
  • Maven
  • Git

A working example is available at GitHub.

]]>
Mon, 23 Dec 2019 00:00:00 +0000 https://www.thinkcode.se/blog/2019/12/23/jenkins-configuration-as-code Thomas Sundberg