Nem é preciso dizer que as atualizações de código são difíceis – em primeiro lugar, é difícil planejar uma se o seu sistema for bastante complexo.
No entanto, existem alguns pontos problemáticos que, acredito, são desnecessariamente difíceis ou simplesmente não são óbvios.
Um exemplo seriam os registros (Erlang ou Elixir) – eles são muito frequentemente usados para manter o estado do processo, etc. Mas uma vez que você carrega seu novo código, atualizar de um registro anterior se torna uma dor – você precisa ter uma versão anterior do registro definido como um registro com nome diferente, ou confiar em algumas regras menos explícitas … desnecessário dizer, um obstáculo que todos prefeririam não ter.
Eu estava pensando em como me livrar desse problema e, até agora, acho que a única coisa razoavelmente simples que consigo encontrar é incorporar a versão e a estrutura do registro em cada instância do registro e fornecer funcionalidade de conversão entre as versões para qualquer coisa mais complexa do que um simples A -> Um mapeamento.
Eu tenho uma hora livre no meu sábado preguiçoso e resolvi isso: https://github.com/yrashk/exrecord
Certamente, não há ciência de foguetes lá. Mas eu odeio reimplementar estratégias meia-boca apenas para isso. Não seria melhor implementá-lo uma vez e focar em problemas mais difíceis?
Felicidades.