Peak Productivity

The goal of pretty much any framework/plattform that you use — from a PaaS offering to application server and everything in between — is to make you more productive by taking care of some technical complexity for you. They speed up development so that you can ship faster. And it’s true that you can ship faster: You can now, with current technologies, build an internet-scale … Continue reading Peak Productivity

In Defense of Design Before Coding

Software design as a separate activity from implementation — “up front” design — got a bad press with agile methods. Agile advocates say the design should be emergent. They say, design without coding is waterfall. It’s a waste of time. I understand that you don’t want to design the whole system up front. But at the feature level, a bit of thinking before coding does … Continue reading In Defense of Design Before Coding

Why a Calendar App is a Great Design Exercise

To check if a salesman is good, one classic is the “Sell me this pen” test. To check if a software designer is good, I propose the “Design me a calendar app” test. That was one of the topic we chose for the software engineering lab, and I loved the results. There are several reasons why it works well as a design exercise: Everybody can … Continue reading Why a Calendar App is a Great Design Exercise

10x

Fred Brooks started it all. In The Mythical Man Month, he quotes a study saying individual difference between low and high performers can vary by an order of magnitude Since then this myth of 10x productivity difference has persisted in our industry. Nowadays it’s best seen in the use of words like rockstar, guru or wizard in job descriptions. But is it really a myth, … Continue reading 10x

Things You Can’t Abstract

The art of programming is to a large extent the art of devising abstractions. Some might be very general and reusable in many contexts, some will be more specialized and applicable only in some domains. The purpose of abstraction is to hide complexity so that we don’t need to care about details. Using abstractions, we can “raise the abstraction level”. Data structures, relational databases, file … Continue reading Things You Can’t Abstract

Become a Domain Expert

It is only possible to design a feature correctly if you have enough understanding of the underlying business domain. Large software systems may have complex domain models with many special situations that aren’t immediately obvious. Taking the time to understand the domain is crucial for making the right assumptions during development. Failing to understand the domain correctly will result in features that work “most of … Continue reading Become a Domain Expert

Lateral Thinking

Lateral thinking is a term coined by Edward De Bono to characterize the generation of alternative ideas, as opposed to vertical thinking, which generates ideas based on logic and stepwise refinements. Another way to explain lateral thinking in a much common way is “thinking out of the box.” Often finding the best solution to a problem requires a creative move to go away from the … Continue reading Lateral Thinking

Unit Testing Matters

Unit testing is a simple practice that can be explained in one sentence: each method should have an associated test that verifies its correctness. This idea is very simple. What is amazing with unit testing is how powerful this simple practice actually is. At first, unit testing seems like a simple approach to prevent coding mistakes. Its main benefit seems obvious: Unit testing guarantees that … Continue reading Unit Testing Matters

Simplicity Prevails

We engineers are masters of self-deception when it comes to our aptitudes to handle complexity. We believe we are way better at handling complexity than we actually are. In practice the level of complexity that people can master (me including) is disappointing low. Instead of self-deceiving ourselves, we should embrace our limitations and aim for simplicity. This is what all geniuses of our time have … Continue reading Simplicity Prevails