Skip to content

2025

#301: Introducing LangChain for AI Applications

There is a lot going on in the AI space. New tools and models show up in short succession, while other AI services suddenly change their behaviour and deliver poorer results. Whatever we use today is probably outdated in a few months. In such a fast-changing place it is a pain to develop software.

Over the next few weeks we explore LangChain, a tool that allows us to use an abstraction over the different products we could use. While we need to learn yet another tool, we gain the benefit of swapping out parts of our solution while the rest of our application can stay the same. Let us see how that works.

#300: Learning Python in the Age of AI?

As AI tools grow in popularity and AI agents for code generation become more common, the question naturally arises: Should we even bother learning Python anymore? Or is it a waste of time when the machine can generate the application for us?

The more I think about it, the harder it gets to find a satisfying answer. Many of the cherished reasons of the past will disappear. Others no longer matter that much when we can change large parts of code in an instant. Let us explore the main points I came up with that we should consider.

#299: A Minimalistic FAQ Bot

A few weeks back I stumbled upon a course on Python chatbots by John Bura. I am still impressed by how little it takes to create a FAQ bot that answers your questions without burning resources with an LLM. Let us see how this minimalistic bot works.

#296: Lint & Format Code With Ruff

When we work on larger Python projects, inconsistent formatting and lingering lint errors can break our flow. We may use tools like Black, isort, and Flake8 to keep code clean, but running each in sequence feels slow and an extra burden that we soon will skip. Luckily for us, there is a tool named Ruff by the same team that wrote uv. Let us see how Ruff can help us to get more consistent Python code.

#295: A Simple Strategy to Tackle Errors

Sometimes all you want to do is a quick update of a Python package and you run into a learning opportunity. I had this experience many times, and while that is frustrating at the time, it usually ends up with me better understanding the tools I use. Let us take a failed update of MkDocs as an example on what to do if we run into an error after updating a package.

#294: Callable Classes in Python

In Python, everything is an object - including functions. That flexibility goes both ways: not only can functions behave like objects, but objects can behave like functions. The mechanism that unlocks this duality is the special (or "dunder") method __call__. By defining __call__ in a class, we make it possible to invoke it with parentheses, just like an ordinary function, while still retaining all the advantages of stateful objects.