RSSAmplifier

Blog

Lucas F. Costa - Essays

Hot takes and cold truths on software, startups, and the lies we tell ourselves.

lucasfcosta.comRSS feed ↗50 posts

Latest posts

Lucas' Laws of Project Management

A project's goal rarely has anything to do with implementing a list of features. It is usually about solving a problem for users, the business, or both. The original specification is a guess about...

Backpressure is all you need

There are two obvious ways to use coding agents. Both are bad. The first is to let the LLM run unattended and hope the repository survives. This is fast, exciting, and stupid. It leads to bugs, conf...

Design docs considered harmful

Somewhere in your company's Google Drive, there's a design doc from six months ago. It describes a system that doesn't exist. It was outdated by the second sprint and abandoned by the third. Fourteen...

Why your retrospectives don't work and how to fix them

Every team must believe in improvement, even when it no longer happens. That’s what retrospectives are for. Most teams also use retrospectives for documenting problems that nobody has time to fix. T...

How to do a successful Hacker News launch

When it comes to writing, the #1 question I usually get asked is how do I get so many HN front pages with this blog. This week, another one of my projects got to the front page for the first time, a...

Why backlogs are harmful, why they never shrink, and what to do instead

Do you remember your backlog ever shrinking? Of course you don't. Backlogs _never_ shrink. Backlogs never shrink because the list of things we'd _eventually_ like to do never shrinks, and that's wha...

How to distort Scrum until it no longer works

The problem with Scrum is that it usually works. In tech, we hate that. What we like is to give talks, prepare slide decks, and, most importantly, to invent things ourselves. Just like creating your...

You don't need Scrum. You just need to do Kanban right.

Why did you choose Scrum instead of Kanban? If you can't answer that question, you didn't choose Scrum. Someone else chose it for you. Even in the rare case people can answer this question, they rev...

Why deadlines are pointless and what to do instead

Deadlines are the bane of every software engineer's existence. We've all been there: the project is "due" in two weeks, and we're nowhere near done. So we pull all-nighters, do poor testing, and cut ...

Useful engineering metrics and why velocity is not one of them

Here's my horoscope for today: > Things should improve for you as the day progresses, Taurus. You shouldn't depend on something that may not pan out the way you want. As you can see, it's useless, ...

How creating a bot farm in an MMORPG got me into programming

> If you have played Ragnarok Online before, you might want to listen to this song while reading. I got into programming at the age of 14. At that time, my friends and I used to play an online MMORP...

The Minimum Viable Nothing: ideas to validate products without building them

Let me be clear: if they tell you it's a great idea but don't give you their credit card, they don't want it. To validate an idea, you need to sell it. To sell an idea, you should, ideally, show peo...

How not to build a bike shed

Welcome to Ultra Bikeshed Co. Please come in. Here, we know it feels _terrible_ when actual results get in the way of following processes. Instead of building a product and talking to customers, we ...

Why tall hierarchies slow organizations down and how to fix them

Large enterprises aren't slow because they're large. They're slow because whenever a decision needs to be made, information travels eight thousand layers of management up and then eight thousand laye...

Why your daily stand-ups don't work and how to fix them

Daily stand-ups are a classic example of learned helplessness. We all know they're useless, but we tell ourselves "that's just how things are" and do nothing about it. These days, we do stand-ups be...

How and why exploiting uncertainty makes products more profitable

Uncertainty is _not_ necessarily bad. It's not necessarily good either. Uncertainty simply exists, and it affects a product's economics, regardless of whether you choose to ignore it — as many produc...

Talking to your customers: a disruptive Agile framework

In this post, I'll present a robust and disruptive Agile framework. It's called "talk to your customers" — or, in short, _TTYC_. Soon I'll be selling a 500-page book with enough diagrams to convince...

How finishing what you start makes teams more productive and predictable

Let's be honest. When you read this post's title, you thought it was obvious. Yet, most people don't follow this simple piece of advice. You know that too, and that's probably what led you here. Wha...

Why long-term plans don't work and how to fix them

Yearly software development plans are my favourite genre of fiction. In the fabulous world of yearly plans, product developers assume they know exactly what product they must build and how long each ...

How high capacity utilisation hurts a team's performance

This is Beigel Bake, in Brick Lane, London. Beigel Bake is notorious for its salt beef beigels and humongous queues. In this blog post, I'll use Beigel Bake to explain how capacity utilisation im...

UX patterns for CLI tools

Most technical people choose GUIs not because GUIs are the best tool for the job. People choose GUIs because the CLI alternatives usually suck. That's my hunch. In this blog post, I'll cover good U...

My book-writing routine

I spent 2020 writing a 500-pages book about JavaScript Testing. In this blog post, I'll explain my writing routine — or system, whatever you want to call it — and other seemingly unrelated habits th...

Explaining explaining: a quick guide on explanatory writing

This blog post is about how to explain things in writing. You should learn to explain things in writing because it's the most efficient way of conveying an idea to a large, distributed audience. Whe...

How to replace estimations and guesses with a Monte Carlo simulation

There are many ways of estimating how long a software project will take. All of them are a waste of time. Some prefer to spend days analysing and planning their changes so that they can estimate mor...

Make haste slowly: quantify economics

In the past thousand sprints, you've been consistently delivering plenty of code. By now, your caffeine intake is on the thousands of milligrams, and you've forgotten whether your yellowish keycaps h...

How much specification does a developer need?

Specifications work in two ways: they inform developers what needs to be built, and they constrain the problem space so that tasks become approachable. Without clear specifications, developers may b...

Why does package-lock.json exist, and how does it work?

When writing JavaScript applications, you describe its dependencies using a `package.json` file. This file contains all of your applications direct dependencies and their versions. If you're buildin...

The most efficient way to solve problems: not having them

It's Monday. The first of the seven alarms you've set on your phone soars louder than the Big Ben. It sends chills down your spine announcing the impending doom: your 8 AM commute. You put on that wh...

Don't write software like you write books: the value of delivering early and frequently

Not delivering early and frequently makes writing software as difficult as writing books. Publishing books is hard because the feedback loop is long and slow. You can't validate a book unless you ha...

Your terminal is not a terminal: An Introduction to Streams

I love streams because I don't like software. I always try to build less software. Less software means you have to spend less time updating it, less time fixing it, and less time thinking about it. ...

How I'm still not using GUIs: A guide to the terminal

> TL;DR: Here are my dotfiles. Use them and have fun. GUIs are bloatware. I've said it before. However, rather than just complaining about IDEs I'd like to provide an understandable guide to a much ...

The Absolute Essentials for Bit Manipulation in JavaScript

This post aims to demystify bitwise operations in JavaScript, as they can be useful for a myriad of applications. They are also very useful, for example, when building emulators, an exercise I'd defi...

Test-Driven Development is not about tests

Counterintuitively, test-driven development is not about tests. Test-driven development is about being able to take gradual and small steps towards a solution. Taking small steps allows you to solve...

A Gentle Introduction to Lambda Calculus - Part 2: Execution

This is the second blog post in my series about Lambda Calculus. To make sure you'll have the necessary knowledge about Lambda Calculus' syntax you will probably want to read the first post in this s...

In Praise of Plain Text

I often joke that graphical interfaces are bloatware. GUIs are, of course, very useful for a great variety of applications and plain-text is not always appropriate for every kind of information. How...

A Gentle Introduction to Lambda Calculus - Part 1: Syntax

Even though lots of people nowadays advocate for applying functional programming principles to JavaScript, not many of them know the principles of Lambda Calculus and how it all started. Theory of c...

Y: The Most Beautiful Idea in Computer Science explained in JavaScript

In this post, we will talk about one of the most beautiful ideas in computer science: the Y-Combinator. And no, I'm not talking about the VC firm in Silicon Valley, even though this post will explain...

Software Engineering in 100 Quotes

I am not good with words. I feel tempted to say most people aren't. But as an engineer and because I know Akin's first law of spacecraft design: Engineering is done with numbers. Analysis witho...

Git Bisect A.K.A. Pure Git Wizardry

Git's `bisect` command is one of those things you will wish you've known since you started using `git` at all. I don't use it that often, but whenever I do I ask myself how did I live without this f...

The Ultimate Guide to JavaScript Fatigue: Realities of our industry

Complaining about JS Fatigue is just like complaining about the fact that humanity has created too many tools to solve the problems we have, from email to airplanes and spaceships. Last week I've ...

Big-O Explained and Why You Will Never Beat a Pigeon

In this blog post I will prove you will never be able to write an algorithm that scales better than a pigeon and also teach you some basic concepts when it comes to Big O notation. Big O is often ...

All About Recursion, PTC, TCO and STC in JavaScript

Recently everyone seems to be really excited about functional programming and its concepts. However, many people don't talk about recursion and, especially, about proper tail calls, which is really...

JavaScript: From Workers to Shared Memory

Hi, everyone! The new Shared Memory proposal has reached stage 4 recently and I got really excited about it after reading a few blog posts on this subject, such as Dr. Axel's excellent post on his...

Writing Good Tests for NodeJS APIs

Hello, everyone! Recently I've been working a lot with Node and I felt the urgent need to write a blog post about how to write good API tests. In those tests, all I do is send a request to an insta...

Open Source Contributions Made Easy

Hi, friends! Sorry for taking too long to post something new, but I have come back from the UK recently, where I've had a great day with some friends at Voxxed Days Bristol. Recently, I have also ...

JavaScript Errors and Stack Traces in Depth

Hi, everyone! After a few weeks without writing about JavaScript, it's about time we talk about it again! This time we're going to talk about errors and stack traces and how to manipulate them. S...

Understanding Dependency Management in Go

Hi, everyone! As you may have noticed I'm really interested into Go and since I fell in love with this language I'd like to write about it more frequently. If you don't know Go yet I really think...

Quick vIM Tips That Will Save Your Life

Hello, everyone! This week I'm a bit out of ideas for blog posts about programming, so I decided to write about vIM! I have already written a blog post teaching people how to get started with it, bu...

Getting Started With Testing in Go

Hello, everyone! Today I'm gonna do something a little bit different from what I usually do. I'm not going to write about JavaScript, I'm going to write about Go! Recently I have been writing Go ...

How to Write Assertions Right

Hi, friends! Today I'm going to write about assertions. I won't be talking about JavaScript, I'll be talking about assertions in general and this knowledge can be applied doesn't matter what lang...