You need to distinguish between what _can_ be done and what _needs_ to be done. Let go of perfection and only do the necessary, then you can realize maintainance with very little time investment.
This obviously does not work if you feel like all your code's libraries must always be on the newest version because simply keeping several projects' code running with the latest thing is quite a bit of work.
I have a profitable project that is still running on PHP 5 on Ubuntu 14 and it seems that now I finally will have to upgrade things, but it will be a single upgrade now after many years that may take 1 day instead of 20 separate little ones that may have cost 1/2 day each if I always had kept up to date.
> You need to distinguish between what _can_ be done and what _needs_ to be done.
I think part of making this distinction comes down to whether the creator thinks the product will ever be 'done'. A lot of products are run with the assumption (implicit or explicit) that they'll keep getting updated as long as they remain viable as a business. Either approach is a valid but they're both choices. Though you may have to choose right from the start, as for some products only one of the two is viable.
This obviously does not work if you feel like all your code's libraries must always be on the newest version because simply keeping several projects' code running with the latest thing is quite a bit of work.
I have a profitable project that is still running on PHP 5 on Ubuntu 14 and it seems that now I finally will have to upgrade things, but it will be a single upgrade now after many years that may take 1 day instead of 20 separate little ones that may have cost 1/2 day each if I always had kept up to date.