I have no idea how many different hobbyist software projects I’ve started and abandoned over the course of my life. Let’s just take an average guess and say I’ve worked on 3 side projects each year since 1987 when I started programming for fun.

That’d put the number at 96 which sounds a whole lot more precise than saying 100 so let’s go with that.

I started these projects with interest, objectives, excitement, and I loved them, then… for whatever reason I didn’t. Sure I would occasionally complete projects, but more often than not, I abandoned them for something new. Sometimes I’d lose interest, sometimes life interrupted me and derailed my momentum, sometimes I’d run out of new things to learn or really wanted to try something new. Sometimes I grew frustrated with the code I have woven, and many more times I realized that I bit off far more than I could chew.

Here I am, over 30 years after starting this journey, I can tell you with absolute confidence that every one of these projects was worth pursuing — and worth abandoning in the proper season.

Why? Because each project taught me how to succeed and how not to fail.

Each project taught me how the architectural choices I made early on resulted in frustration or heightened productivity.

Each project let me try a new library, technique, or tackle a new problem and learn from it, and each next project gave me an opportunity to keep using what worked and abandoned what didn’t.

Each project brought its own unique challenges and constraints for me to think through and work around, and each next project taught me how to plan around these factors.

Each project showed me new and unexpected bugs, helping me understand how — and why — code fails, and each next project taught me how to make those types of defects impossible.

In short, each side project was a safety net that allowed me to try something new and succeed or fail at it — without bringing down a production server or causing a user to get a fatal error or encounter corrupt data.

Trying things in private gave me the skills, tools, and experience I needed to succeed in public. It gave me the wisdom I needed to avoid things that didn’t work with production code. It gave me the patience I needed to work with the same types of production code every day without introducing unnecessary change. It gave me the wide range of tools available to introduce drastic and proper change when it was needed.

Probably most critically, it gave me the knowledge of how to build an application from scratch. Most people don’t get that type of experience on a regular basis at work, so how can you possibly get good at it other than by trying and trying again?

Keep trying, and don’t be afraid to fail 96 times or more.