What is starting from scratch?
We often hear bakers or chefs talking about making things “from scratch.” They use this term when they make all of the recipe from the base ingredients and didn’t use any pre-made elements. Usually you pay more to have something made from scratch and it takes longer to make.
Over the years, I’ve become accustomed to actually starting most of my software development projects from scratch. It may sound like a waste of time, but I’ve found a number of compelling reasons that keep me coming back to the same practice of starting with a blank page on every project. This means that I don’t use large project templates, overly complex pre-built tools, or build unnecessary abstraction/interfaces. Let’s dive into why.
It’s can actually be cheaper
This may seem counter intuitive at first. How could it be cheaper to build something over and over again instead of making some kind of template or pre-built tool? Ironically enough, at least for the work I do with nVoid, it is almost always cheaper to start from nothing. Since we don’t have turnkey products, every project that we get is quite a bit different from the last. Even the projects that share similarities end up having a lot of fine-grain differences.
Because of these differences, the amount of time required to update and edit a complex tool is often greater than the time required to build the precise tool I need for that specific project. To make a one-size-fits all template that is little more than a few variables, the functionality would need to be able to handle all kinds of variations and it would need to be quite abstract. The handful of times we looked into building more complex systems to handle our projects, it became evident that it’s actually cheaper for us to start from scratch and just build what we need.
Less extra features = less bugs
I read a quote a long time ago somewhere, and unfortunately I can’t remember who wrote it or where I read it:
“The faster computers become, the faster they reach a crashed state.”
This benefit builds on the last one. The simpler a system is, the less likely there are to be bugs or issues in that system. When you’re working with large templates or systems that are built to handle a ton of situations and you’ve tweaked them to work with your situation, you’re hoping that all of the extra code and features don’t react negatively to the rest of your changes and create bugs.
I find it’s also easier to setup automated testing when you’re building a system from nothing. As you’re going along in your incremental steps of developing and adding features, you can immediately add tests or even manually test new elements before they become too complex.
Keep your chops fresh
This one is a guilty pleasure for me, but part of me enjoys starting from scratch on a project because it always keeps my abilities at a high level. I never forget how to do anything in the pipeline and I don’t become complacent because I’m using tools that abstract away the nitty gritty from me. It’s similar to those daily brain exercises for me. It also feeds into the next reason!
Excuse to innovate
Starting from a blank workspace on every project means I’m never stuck to the last way I did something. I can immediately finish one project, learn a few new tricks or lessons, and then move to a new project and start implementing them. I don’t have to worry about any impact it may have on templates or existing complex systems I’ve built. I’m always able to try new software features, packages, and tools right as they become available and as I start a new project.
One of my favourite things to do is debrief myself on a project I just finished and ask myself “how could I have done everything better?” or “how could I have avoided ______ that I experienced during this project?”. These questions will almost always have an answer because no one is perfect. The nice thing about starting from scratch is that when I answer one of these questions, I can hold myself accountable to the answers right at the start of the next project.
Makes optimization easier
Optimization is one of those things that becomes more and more critical as time goes on. Installations become larger and larger and clients are looking for more and more real-time generative content. I can sit around for a few hours and be happy that I was able to save 0.1 ms of processing time. In these kinds of situations, where I’m trying to get the very very very very most amount of efficiency out of a system, all the extra code, features, and bloat that exist in complex tools/templates begins to get in the way. I’ve used complex tools to start a project off and then got stuck needing to perform surgery and delete as much of extra features and bloat as possible so that the tool would run efficiently.
Starting from nothing makes optimizing a bit easier because there end up being less moving parts in a system and the elements that are there are often built to do very specific things.
But be careful…
I should say again mention that this works for my team and I at nVoid. There are many companies who are working on turnkey solutions or attract clients that want to get a specific thing done over and over again. For those folks, having templates and more complex tools may be the key to delivering bug-free projects quickly and efficiently. It should also be said that there are still tools that we’ve built and use regularly. We have many different tools for talking to APIs, doing large composites, managing external TOX files, and more. The main thing is that any of the tools we have end up being quite simple and only do a very specific thing, and we’re always trying to find the middle ground of having a few tools to make life easier and starting from scratch.
There’s no perfect way to start a project but I’d say give starting from scratch a try on your next few projects. You may find it freeing being able to start over every time, and you may find yourself finished faster than you think!