Lancei um processador de texto formatando o disco rígido após cada 1024ª salva

Contar aos iniciantes sobre como você estragou tudo seriamente é uma boa maneira de ajudá-los a lidar com a síndrome do impostor .

Provavelmente foi 1984-1985. Então eu era um programador iniciante de 25 anos com cinco anos de experiência. Eu e outro programador escrevemos e suportamos um conjunto de aplicativos semelhantes ao Office de hoje: planilhas, processador de texto, banco de dados, plotadora, etc. Montamos todo esse sistema para três a quatro mercados verticais [ clientes empresariais altamente especializados / aprox. perev. ]

Eu mesmo escrevi a maior parte do processador de texto. Eu escrevi no Forte para várias combinações de sistemas operacionais e processadores. Os jovens não estão familiarizados, mas naqueles dias, novos microcomputadores com seu próprio sistema operacional especial e uma das várias opções de processador eram lançados a cada poucos meses.

Fort usou a troca de dados em bloco com o disco. Cada bloco tinha um comprimento de 1 kb e, para economizar algo mais que 1 kb, era necessário trabalhar com o bloco mestre do arquivo, onde as compensações de todos os blocos com dados eram armazenadas - na verdade, havia algumas listas de blocos ocupados e desocupados.

Para inicializar esse bloco mestre, ele precisava ser preenchido com zeros. Bem, começou. Em resumo, mudei o aplicativo para suportar arquivos com o dobro do tamanho anterior - e em vez de 256 elementos no bloco mestre, apareceu 1024.

Cada entrada chamava a atenção - uma palavra de 16 bits. Portanto, se ainda houver 512 palavras no meu bloco mestre de 1 kb, 1024 palavras já exigirão o uso de dois blocos.

Portanto, alterei o número de blocos preenchidos com zeros, mas não alterei o tamanho do buffer. E quando você trabalha com memória desprotegida e escreve 2048 zeros no espaço de 1024 bytes, os bytes restantes substituem qualquer lixo aleatório encontrado na memória.

No meu caso, qualquer lixo aleatório acabou sendo o bloco principal do disco do SO. Sim ... E quando eu inicializei um novo arquivo, que acontecia a cada 1024 vezes ao escrever um arquivo de bloco único, eu substituí o bloco mestre do disco, que excluiu todos os arquivos dele.

E nós, é claro, lançamos esta versão, que funcionou por 8 a 9 semanas. E você pode imaginar o número de chamadas de clientes que precisávamos receber. No final, aconselhamos a todos a manter backups (que foram feitos, a propósito, usando fitas de vídeo) todos os dias.

Passei muitas semanas apenas me desculpando por telefone enquanto executava meu programa no depurador várias vezes. E eu não tive sucesso. Nada.

E então uma mulher telefonou e descreveu em termos coloridos - e ela trabalhou no tráfego de mercadorias, então agora uso ativamente seus exemplos do campo de palavrões - de que ela fez uma cópia de backup, lançou um processador de texto e ele imediatamente limpou seu disco. Ela baixou o backup novamente e o processador novamente apagou imediatamente o disco. Ela ficou furiosa.

E, imagine, levei duas horas inteiras para entender como tive sorte. Contei essa história ao meu colega no jantar e depois me ocorreu - pare. Pare. De uma vez só? Toda vez?

Liguei para ela e prometi todas as bênçãos terrenas, se ela apenas empacotasse esta fita e a enviasse para nós. Prometi a ela que pagasse os custos de envio e cancelasse os pagamentos mensais pelos nossos serviços (meu chefe não hesitou por um segundo: "Sim, diabos, vamos cancelar os pagamentos dela").

E, finalmente, consegui reproduzir esse erro. E ela não trapaceou. O backup que ela salvou acabou em um ponto crítico: 1023 backups no momento da criação. Faça o download do backup, salve o arquivo e é garantido que a unidade esteja limpa.

Talvez eu esteja exagerando, mas, na minha opinião, encontrei o problema na mesma manhã em que chegamos ao filme. Foi tão fácil de encontrar no depurador.

Eu olhei para um bloco de 2 kb que deveria ser escrito e o último 1 kb foi preenchido com algum tipo de lixo. Pareceu-me estranho e comecei a entender. E, claro, não era lixo - eram 1024 bytes do bloco mestre de disco que o sistema operacional armazenava próximo ao meu bloco mestre de arquivo.

Eu obtive um backup "antes" do kernel - eu não tinha um dump principal, mas isso me deu uma maneira garantida de chegar a esse defeito. Se não tivesse sorte, não o teria encontrado. Eu simplesmente não imaginaria que estava escrevendo não na minha memória, mas no sistema.

Então, sim - seu nerd "mestre" lançou um processador de texto que, dentro de oito a nove semanas, formatava o disco rígido do cliente após cada 1024ª salva. Porque, bem, eu sou um artesão.

Você pode encontrar muita moral nesta história, mas aqui estão duas principais para qualquer júnior:

  1. Nunca escreva constantes numéricas, exceto 0, 1 e -1 no seu código.
  2. Não seja tão duro com você mesmo. Todos os seus sábios idosos têm histórias semelhantes, e alguns deles têm muitas.

All Articles