Acabei de me deparar com essa pergunta antiga, perguntando o que há de tão ruim no estado global, e a resposta aceita mais votada afirma que você não pode confiar em nenhum código que funcione com variáveis globais, porque algum outro código em outro lugar pode aparecer e modificar sua valor e então você não sabe qual será o comportamento do seu código, porque os dados são diferentes! Mas quando olho para isso, não posso deixar de pensar que essa é uma explicação realmente fraca, porque é que isso é diferente de trabalhar com dados armazenados em um banco de dados?
Quando seu programa está trabalhando com dados de um banco de dados, você não se importa se outro código do seu sistema está alterando-o ou mesmo se um programa completamente diferente está alterando-o. Você não se importa com o que são os dados; esse é o ponto inteiro. Tudo o que importa é que seu código lide corretamente com os dados encontrados. (Obviamente, estou discutindo a questão muitas vezes espinhosa do armazenamento em cache aqui, mas vamos ignorá-lo por enquanto.)
Mas se os dados com os quais você está trabalhando são provenientes de uma fonte externa sobre a qual seu código não tem controle, como um banco de dados (ou entrada do usuário ou soquete de rede ou arquivo etc.) e não há nada errado com isso, então como os dados globais dentro do próprio código - sobre os quais seu programa tem um controle muito maior - de alguma forma são ruins quando obviamente são bem menos ruins do que coisas perfeitamente normais que ninguém vê como um problema?