Talking about software systems, let's stop to talk about waste when we refer to something not necessary or created without a clear understanding of the problem to solve. Let's call it a burden (since you are going to have it holding you back forever)...
If you implement it to experiment, learn and later throw it away, perfect... If you are keeping it, you are fooling yourself.
This code is a burden, worse than the sunk cost, and it will generate a recurrent cost forever.
There are two types of complexity, the inherent and the accidental/incidental.
The inherent complexity can't be avoided because it is intrinsic to the problem we want to solve. But the accidental/incidental is all the complexity we introduce by not fully understanding the problem, not knowing how to solve it, or by our lack of mastery on the subject, etc.
This accidental/incidental complexity is also a burden. The inherent one is not. :)
Do yourself a favor, reduce the burden. reduce the basal cost. improve your life and the life of your team.
Develop product in an agile way:
- Work in small steps
- Try to really understand the real problem and the meaningful impact you want to make
- Validate each increment and its impact
- Always work with quality-in and with attention to technical excellence
- Refactor continuously (to reduce the accidental/incidental complexity)
- And for God's sake, delete everything that is not necessary. Ruthlessly remove; code, dependencies, features, complexity… Minimize basal cost and make the evolution of the system easier.
And follow the principles:
- Continuous attention to technical excellence and good design enhances agility.
- Simplicity --the art of maximizing the amount of work not done-- is essential.