Writing on software design, development, and more.

All of my thoughts on programming, product design, and more, collected in chronological order.

Flask for Rails Developers A Gentle Introduction

Part 1 of a series on making the transition from Ruby on Rails to Flask If you've spent years in the warm embrace of Rails—where convention rules, generators abound, and rails new gives you everything but the kitchen sink, stepping into Flask can ...

Building a Complex and Flexible Table Component in Rails

While building EstateSync, I created many tables of varying complexity and length, but they still shared a lot of common patterns. Maintaining a consistent UI became increasingly challenging as I was using Tailwind, and I noticed that view code wa...

10 Essential Gems for Security and Code Quality in Rails Projects

Every production-grade Rails project should proactively address security and code quality. The Ruby ecosystem offers a rich collection of gems that help you do just that - catching bugs early, enforcing best practices, and protecting your users an...

Constant Collision in Rails: When Your Concerns Clash with Gems

While working on a Rails app recently, I stumbled across a frustrating bug that only appeared in the test environment. Everything worked perfectly in the development console. Models loaded fine. Associations were intact. My concern methods behaved...

AI Is a Productivity Multiplier - But Only If You Stay in Control

Alberto Fortin’s recent post on dialing back LLM usage resonated with me. Like many developers, I’ve found AI to be both a productivity godsend and a source of friction. It can feel like magic — until it quietly leads you down the wrong path. Here...

The importance of effective One to Ones in software development teams

As a software developer, I have had the opportunity to work in various organizations, each with its own approach to team communication and collaboration. Through these experiences, I have come to realize the significant impact that regular one-to-...

Enhancing performance in rails with ActiveRecord methods

When developing applications using Rails, efficient database interaction is crucial for maintaining high performance. ActiveRecord provides several methods to optimize database queries. In this post, we’ll explore how using specific ActiveRecord m...

Rails Testing Gotcha: When Concerns Work in Console But Not in Tests

If you've ever encountered a situation where your Rails model associations work perfectly in the console but mysteriously fail in your test suite, you're not alone. I recently ran into this exact issue and wanted to share the solution along with s...

High-Leverage Engineering: Multiplying Your Impact

Series: The Effective Engineer by Edmond Lau Welcome to the final post in my series on The Effective Engineer by Edmond Lau. So far, we’ve explored how to prioritise effectively, leverage tools, iterate quickly, and measure what matters. Now, let’...

What Gets Measured Gets Improved: Measuring Your Impact

Series: The Effective Engineer by Edmond Lau Welcome back to my series on The Effective Engineer by Edmond Lau. So far, we’ve covered how to prioritize high-impact work, leverage tools, and iterate quickly. Now it’s time to talk about something th...

Move Fast, Learn Faster: Quick Iteration and Continuous Learning

Series: The Effective Engineer — by Edmond Lau Welcome back to my series on The Effective Engineer by Edmond Lau. In the last post, we explored how leveraging tools and automation can multiply your productivity. Today, we’ll look at another essent...

The Power of a Heard Team

In today's fast-paced and competitive world, organizations are increasingly realizing the importance of teamwork and collaboration. While assembling a team with diverse skills and expertise is crucial, it is equally important to create an environm...

Amplifying Your Impact: Leveraging Tools and Technology

Series: The Effective Engineer — by Edmond Lau Welcome back to my series on The Effective Engineer by Edmond Lau. In previous posts, we discussed the importance of focusing on high impact work through prioritisation. Today, we’ll explore another k...

How to setup GNU Stow with existing dotfiles

Dotfiles are configuration files for applications and shell environments, often prefixed with a dot (.), making them hidden by default. Managing these files across different systems can be challenging. GNU Stow helps by creating symbolic links fro...

Focus on What Truly Matters: Prioritization

Series: The Effective Engineer — by Edmond Lau In software engineering, there’s always more to do than time allows. From bug fixes to features, code reviews to meetings, the to-do list never ends. That’s why prioritisation is one of the most valua...

Maximizing Impact: An Introduction to The Effective Engineer

Welcome to my series on “The Effective Engineer” by Edmond Lau. If you’re a software engineer aiming to make a meaningful impact in your career, I believe this book is a must-read. Over the next few weeks, I’ll delve deep into the core principles ...

What Makes a Senior Engineer Senior?

Introduction The term "Senior Engineer" is often used in the tech industry, but what does it really mean? What separates a Senior Engineer from a Junior or Mid-Level Engineer? In this post, we'll explore the key characteristics that define a Senio...

Exploring Sorting Algorithms with Ruby: A Comprehensive Guide

Sorting Algorithms Bubble Sort Bubble sort is one of the simplest sorting algorithms. It works by repeatedly stepping through the list, comparing each pair of adjacent items and swapping them if they are in the wrong order. This process continues ...

Merge Sort in Ruby

Merge Sort in Ruby Merge sort is one of the fundamental sorting algorithms used in computer science. It belongs to the divide and conquer category of algorithms, where a problem is divided into smaller sub-problems that are solved recursively. In ...