Its awesome that we can run some code which cannot be altered by anyone in the world and its a unique property which traditional servers dont provide, however in software engineering, we need to upgrade the code to fix bugs and add new features, but there seems to be a conflict between having immutable code and performing an upgrade. In this document, we will explore various different methodologies for upgrading contracts which are used by many companies today and each of them have their own advantages and disadvantages.