Software Architecture
What's a URL? Please Provide Your Email Address! The Complexity of Parsing Structured Identifiers
“Please enter a valid email address.” “Please provide a valid website URL.” If you build web applications, APIs, or user interfaces, you have almost certainly written or reviewed code that displays those two demands. Because every user recognises an email address and …
Syncing Shared Data: The Hidden Traps of Concurrent Mutations and Deletions
When you build an application that displays a collection of items, synchronisation feels deceptively straightforward at first. Your client fetches the current list from an API, your user makes a few edits or removes a row, and you send the updated collection back to the server. If you only test …
Parsing CSV and Delimited Files: The Deceptive Traps of Tabular Text
Every software engineer has, at some point, written a CSV parser in a single line of code. When you receive a comma-separated file, calling line.strip().split(",") feels delightfully clean and efficient. You run a quick test on three rows of mock data, confirm the output matches your …
Parsing and Formatting Numbers: Why Commas and Dots Break Software
At first glance, numbers appear to be the simplest data type in computer science. Unlike natural languages with irregular grammar and complex idioms, numbers feel purely mathematical, universal, and unambiguous. You collect a string of digits from an input field, pass it to your language’s …
Handling Currency Calculations: Why Floats Break Financial Software
When building an application, you inevitably reach a screen where money enters the picture. You need to calculate a 20% VAT rate, split an invoice between team members, or apply a discount code at checkout. You see a price like £19.99 with two neat decimal digits and assume a standard …
Never Roll Your Own Date Maths: The Deceptive Complexity of Time
At some point in every developer’s career, a tempting thought arrives. You need to add seven days to an appointment, schedule a task for tomorrow morning, or calculate the duration between two events. You glance at your standard library, see a hefty date module, and think: “A day is …
Getting Started with Terraform: A Practical Guide to Infrastructure as Code
Just like top terraformers in Minecraft reshape entire landscapes to build incredible worlds, mastering Terraform in software engineering gives you complete control over your digital infrastructure. Instead of manually clicking through cloud management consoles, you define your entire …
MySQL, PostgreSQL, and SQL Server: Choosing the Right Relational Database
If you’ve been building software for any length of time, you’ve almost certainly worked with at least one relational database. There’s a good chance it was MySQL, PostgreSQL, or SQL Server. All three can store rows, run queries, and handle transactions, so it’s tempting to …
Beyond Graphs: An Introduction to Google's Agent Development Kit (ADK)
If you’ve spent any time building agentic systems lately, you’re likely familiar with LangGraph. It’s a powerful framework that treats agents as nodes in a graph, connected by edges that define the flow of execution and state. It’s robust, explicit, and extremely capable …
Streaming State and Tokens in LangGraph
If you’ve been following the earlier posts in this series, you’ll have built graphs that gather data, call tools, and produce structured output. Every one of those examples used .invoke(), which means the caller waits in silence until the entire graph finishes and then receives the …
Why DynamoDB Feels Magical Until You Learn the Trade-Offs
The first time I looked at DynamoDB, it felt like a golden unicorn. It promised fast access, huge scale, and very little operational effort. If you’re already building on AWS, it also feels like the natural choice because it fits so neatly into the rest of the platform. Then the catch becomes …
Using Async Effectively in LangGraph
In Seven Tips for Performant Async Python I focused on plain asyncio. That’s the right place to start, because LangGraph doesn’t replace Python’s event loop or make blocking code magically concurrent. If an async LangGraph node calls a blocking library, the graph still waits. If …











