Something I am thinking about now that I am about to make my contracts upgradeable; what are the best practices when writing upgradeable code? E.g., is there any particular way the codebase should be structured, is it ultimately worth it to make upgradeable contracts (that is, how has been the success of the projects that did use upgradeable contracts) etc.?
Also, I would highly appreciate any resources (books, articles etc.) on Solidity design patterns, particularly in case of upgradeable contracts; it feels as if there is no guidance on this at the moment.