Blockchains are supposed to be immutable, and so is the data stored on the blockchain, including the smart contracts deployed on it. Immutability is one of the central tenets of blockchain technology. With time and the dynamic evolution in the tech industry, most things will eventually need to be fixed. But then the data stored on blockchains is immutable. So how can smart contracts be upgradable and for what reasons?
There are definitely some reasons to make smart contracts "upgradeable." The main reasons could be to fix bugs, improve functionality, or to optimize the code for more efficient use of Ethereum gas.
Basically, smart contracts cannot change themselves because they are permanent and immutable once they are deployed on a blockchain. However, it is possible to design a dApp so that one or more smart contracts work together to provide the "backend." Such a design creates the possibility that we can upgrade the pattern of interaction between these smart contracts. So upgrading a smart contract does not mean that we change the software code of an already implemented smart contract, but that we exchange one smart contract for another smart contract.