Andrew Cairns
@acairns.co.uk
Using metaphors and analogies to explain Software Engineering in fun ways: https://youtube.com/@metaphoricallyspeaking
Staff Software Engineer. Passionate about DDD, CQRS, Event Sourcing and Distributed Systems.
Kayaking, too.
Staff Software Engineer. Passionate about DDD, CQRS, Event Sourcing and Distributed Systems.
Kayaking, too.
My little hobby channel just turned 2 years old and my most successful video just reached 100k views.
I've also just started working with my first brand!
Best thing - it's all fun. No stress. No pressure. Just pure enjoyment.
I've also just started working with my first brand!
Best thing - it's all fun. No stress. No pressure. Just pure enjoyment.
September 5, 2025 at 10:52 PM
My little hobby channel just turned 2 years old and my most successful video just reached 100k views.
I've also just started working with my first brand!
Best thing - it's all fun. No stress. No pressure. Just pure enjoyment.
I've also just started working with my first brand!
Best thing - it's all fun. No stress. No pressure. Just pure enjoyment.
The best metaphor for 'Single Point of Failure' must be the Death Star.
September 5, 2025 at 5:59 PM
The best metaphor for 'Single Point of Failure' must be the Death Star.
Easter egg on my Pipe Operator post:
Both the donut preview and code examples are projections of an event stream. You were able to see the event stream if you knew what to click.
It was a little too hidden, so now it's automatically visible at the bottom of the post if the stream isn't empty.
Both the donut preview and code examples are projections of an event stream. You were able to see the event stream if you knew what to click.
It was a little too hidden, so now it's automatically visible at the bottom of the post if the stream isn't empty.
August 30, 2025 at 6:33 AM
Easter egg on my Pipe Operator post:
Both the donut preview and code examples are projections of an event stream. You were able to see the event stream if you knew what to click.
It was a little too hidden, so now it's automatically visible at the bottom of the post if the stream isn't empty.
Both the donut preview and code examples are projections of an event stream. You were able to see the event stream if you knew what to click.
It was a little too hidden, so now it's automatically visible at the bottom of the post if the stream isn't empty.
Little moments like this make all the effort worth it. Grateful for the kind words and the reminder of why I love making content!
🫶
🫶
August 26, 2025 at 1:56 PM
Little moments like this make all the effort worth it. Grateful for the kind words and the reminder of why I love making content!
🫶
🫶
I pretend to be ok with this Lighthouse score, but... I'm really really not. 😅
August 18, 2025 at 7:47 PM
I pretend to be ok with this Lighthouse score, but... I'm really really not. 😅
This tiny graphic on my site has, by far, the largest file size.
It was rushed.
Started as SVGs, then animated on an html canvas, before being converted into an animated gif.
Such a waste.
It's time to put my post-holiday "get shit done" energy to good use!
It was rushed.
Started as SVGs, then animated on an html canvas, before being converted into an animated gif.
Such a waste.
It's time to put my post-holiday "get shit done" energy to good use!
August 15, 2025 at 3:53 PM
This tiny graphic on my site has, by far, the largest file size.
It was rushed.
Started as SVGs, then animated on an html canvas, before being converted into an animated gif.
Such a waste.
It's time to put my post-holiday "get shit done" energy to good use!
It was rushed.
Started as SVGs, then animated on an html canvas, before being converted into an animated gif.
Such a waste.
It's time to put my post-holiday "get shit done" energy to good use!
This little guy will soon replace one of the largest assets on my site:
August 7, 2025 at 8:35 AM
This little guy will soon replace one of the largest assets on my site:
You can't create a flipping circle without turning it into the coin from Mario.
I think there's a rule... or something:
I think there's a rule... or something:
August 3, 2025 at 8:52 PM
You can't create a flipping circle without turning it into the coin from Mario.
I think there's a rule... or something:
I think there's a rule... or something:
Flipping looks nice when you animate rotateY:
caniuse.com?search=rotateY
I'll need to figure out how to give the appearance of an edge, but love how simple this was!
caniuse.com?search=rotateY
I'll need to figure out how to give the appearance of an edge, but love how simple this was!
August 3, 2025 at 7:10 PM
Flipping looks nice when you animate rotateY:
caniuse.com?search=rotateY
I'll need to figure out how to give the appearance of an edge, but love how simple this was!
caniuse.com?search=rotateY
I'll need to figure out how to give the appearance of an edge, but love how simple this was!
Animating elements already mounted to the DOM is one thing... but I'll need a lot of interactivity.
Took a minute to get this working how I wanted:
Took a minute to get this working how I wanted:
August 3, 2025 at 2:53 PM
Animating elements already mounted to the DOM is one thing... but I'll need a lot of interactivity.
Took a minute to get this working how I wanted:
Took a minute to get this working how I wanted:
I know I'll need the ability to play/pause individual components on mouse enter/leave.
Mobile would need a different solution. But this is working fine for web:
Mobile would need a different solution. But this is working fine for web:
August 3, 2025 at 1:18 PM
I know I'll need the ability to play/pause individual components on mouse enter/leave.
Mobile would need a different solution. But this is working fine for web:
Mobile would need a different solution. But this is working fine for web:
I'll likely set a global playback rate for an article, with sensible steps.
But, for now, I'll embrace the crazy:
But, for now, I'll embrace the crazy:
August 3, 2025 at 11:23 AM
I'll likely set a global playback rate for an article, with sensible steps.
But, for now, I'll embrace the crazy:
But, for now, I'll embrace the crazy:
Creating a Sprite component has been challenging, so taking a break to look into an adjustable playback rate:
August 3, 2025 at 9:37 AM
Creating a Sprite component has been challenging, so taking a break to look into an adjustable playback rate:
Revisited the first example using the paths.
Was quite tricky getting all these things to pause and resume at the same time - but think I've figured it out.
Was quite tricky getting all these things to pause and resume at the same time - but think I've figured it out.
August 2, 2025 at 4:20 PM
Revisited the first example using the paths.
Was quite tricky getting all these things to pause and resume at the same time - but think I've figured it out.
Was quite tricky getting all these things to pause and resume at the same time - but think I've figured it out.
There we go!
I'll use animations like this to show relationships between components a lot. ERDs, flow charts, etc.
I'll use animations like this to show relationships between components a lot. ERDs, flow charts, etc.
August 2, 2025 at 12:22 PM
There we go!
I'll use animations like this to show relationships between components a lot. ERDs, flow charts, etc.
I'll use animations like this to show relationships between components a lot. ERDs, flow charts, etc.
If you think this dot will follow the path of the star, you are going to be disappointed! 😅
Not quite sure what I've got wrong here, I'm sure another ☕️ is the answer.
Not quite sure what I've got wrong here, I'm sure another ☕️ is the answer.
August 2, 2025 at 11:08 AM
If you think this dot will follow the path of the star, you are going to be disappointed! 😅
Not quite sure what I've got wrong here, I'm sure another ☕️ is the answer.
Not quite sure what I've got wrong here, I'm sure another ☕️ is the answer.
Eeeh, kinda got SVG morphing working...
Needs quite a lot of work to be reusable, though:
Needs quite a lot of work to be reusable, though:
August 2, 2025 at 9:01 AM
Eeeh, kinda got SVG morphing working...
Needs quite a lot of work to be reusable, though:
Needs quite a lot of work to be reusable, though:
So far so good - a simple animation I can play/pause which also loops.
I imagine this will be the core of what I'll need.
I imagine this will be the core of what I'll need.
August 2, 2025 at 8:09 AM
So far so good - a simple animation I can play/pause which also loops.
I imagine this will be the core of what I'll need.
I imagine this will be the core of what I'll need.
Very pleased with how this article is turning out!
Looking forward to publishing it.
Looking forward to publishing it.
July 24, 2025 at 10:44 AM
Very pleased with how this article is turning out!
Looking forward to publishing it.
Looking forward to publishing it.
Finally! 😅
I've solved the pain with dynamic code blocks without breaking syntax highlighting.
I've solved the pain with dynamic code blocks without breaking syntax highlighting.
July 21, 2025 at 7:23 PM
Finally! 😅
I've solved the pain with dynamic code blocks without breaking syntax highlighting.
I've solved the pain with dynamic code blocks without breaking syntax highlighting.
Thank you for subscribing!
🫶
🫶
April 29, 2025 at 7:38 AM
Thank you for subscribing!
🫶
🫶
Composite is a Design Pattern that can be used to treat single objects, and collections of objects, in the same way.
Here's an example:
Here's an example:
March 28, 2025 at 11:51 AM
Composite is a Design Pattern that can be used to treat single objects, and collections of objects, in the same way.
Here's an example:
Here's an example:
Have you ever wondered how strategy games like Red Alert 2 manage hundreds of units on screen without crashing?
The secret is the Flyweight Pattern:
The secret is the Flyweight Pattern:
March 27, 2025 at 10:23 AM
Have you ever wondered how strategy games like Red Alert 2 manage hundreds of units on screen without crashing?
The secret is the Flyweight Pattern:
The secret is the Flyweight Pattern:
The Adapter Pattern is useful when you want to own the interface you want to use:
March 6, 2025 at 2:20 PM
The Adapter Pattern is useful when you want to own the interface you want to use:
I know it's been a minute since my last video, but... I've been putting in the work! 💪
January 10, 2025 at 7:08 PM
I know it's been a minute since my last video, but... I've been putting in the work! 💪