I still get a little twinge of anxiety every time I click on the “Squash and Merge” button in Github. I’m careful about testing locally and following standard QA on everything I do. I don’t have any particular reason to think my code won’t work as expected. But there’s still a little voice in my head that thinks I should wait, maybe run some extra tests, or find some other reason to delay.

That voice in my head is the one trying to protect my ego. When I’m planning a project, or writing up requirements, or testing locally, I don’t have to worry about reality intruding. I can assume I’ve got everything under control and that it’ll work exactly as expected. The users will like it. Other developers will think this code is great. There won’t be any unexpected side effects. And nothing is happening that could pierce the bubble. My ego is in a happy place.

But my ego also knows that once it’s in production, the fantasy in my head might get replaced with a less comfortable reality. Code can break. Users can complain. Someone on my team could ask why I didn’t consider ‘X’, where ‘X’ turns out to be a much easier and better way of accomplishing this task. But as long as I haven’t shipped, my ego is safe. It only starts to feel the threat when I get close to the finish line.

The way I get over my fear is to care more about getting features out to users than about my own ego. When I delay, I’m denying myself the enjoyment of seeing the fruits of my labor in the hands of people who would benefit from it. What got me excited to work in software in the first place was being able to write programs that solved problems for people I cared about. The ego and fears came much later.

It’s good if you feel a slight bit of anxiety before shipping. It means you care. But if you hear a nagging voice in your head like I do, it’s a win when you ship it anyways. Far better to live in reality.