Existe alguma esperança para escrever um bom código em cima de um banco de dados horrivelmente projetado?

18

Aqui está a minha situação. Um dos vários programas que herdei recentemente é construído com um banco de dados horrível no back-end. Os estimados criadores aparentemente não apreciavam os conceitos relacionais. Uma tabela para cada cliente, nomeado como um ID de cliente exclusivo. Oitenta e três campos com criptografia. O código é todo processual com dezenas de instruções SQL em linha concatenadas.

Como não recebemos um aplicativo auxiliar importante que roda no mesmo banco de dados, fui encarregado de recriá-lo do zero. Sou um desenvolvedor único, que nem mesmo é minha responsabilidade principal, pois pelo menos metade do meu tempo é ocupada por coisas de operações. Há um prazo inevitável definido para daqui a 30 dias.

Apesar da minha inexperiência, tenho certeza de que poderia ter projetado esse banco de dados e aplicativo existente muito melhor do que eles, mas não acho que seja realista para mim alterar o banco de dados, ajustar o aplicativo existente e ter certeza de que não ' Não quebre nada enquanto precisar criar o aplicativo adicional tão rapidamente.

Então, vamos supor que estou preso ao terrível banco de dados. Precisando trabalhar com uma estrutura tão ruim, qualquer coisa que eu escreva que esteja em conformidade com ela apenas aumentaria a pilha de dívidas técnicas a ser arquivada até que algo quebre completamente ou seja necessária uma nova funcionalidade? Como eu poderia abordar essa situação e obter algo de bom além de um aplicativo que funcionaria?

edit: Caso alguém esteja interessado, acabamos descartando esse banco de dados horrível e o aplicativo que foi executado nele. Terceirizamos a criação do aplicativo auxiliar (eu não estava envolvido na configuração) para, no final das contas, dois contratados diferentes que acabaram caindo em cima de nós, sem realizar nada. Acabei tendo que fazer uma correção horrível e parcialmente funcional em três dias que ainda está em uso hoje.

John Straka
fonte
2
Imagine como você codificaria contra uma biblioteca em que o caso especial "2 + 2" não retornou 4. Não é fácil.
8
então, o que eu estou ouvindo tudo isso é que você tem 30 dias para encontrar outro emprego. tente careers.stackoverflow.com ;-)
Steven A. Lowe
@gnat: Nem mesmo perto.
Robert Harvey

Respostas:

27

Há esperança, mas é uma batalha difícil, especialmente se ninguém perceber que o design do banco de dados é horrível. Você pode tentar abstrair a maldade com camadas de abstração, mas é provável que não valha a pena a batalha.

Meu conselho seria criar abstrações suficientes no banco de dados para que o próprio aplicativo seja limpo e projetado adequadamente; Dessa forma, se você puder consertar o banco de dados, o aplicativo não será afetado, pois não importa como o banco de dados foi projetado.

Essa é a abordagem que normalmente uso ao lidar com um banco de dados existente e, mais frequentemente do que não, projetado com zero pensamento. Alguns aplicativos de escolha dos padrões Repositório ou Gateway, com algumas camadas de serviço para conversar com o gateway / repositório, devem ajudar a colocar em quarentena o design inadequado.

Wayne Molina
fonte
1
+1 Eu basicamente disse a mesma coisa na minha resposta antes de ler completamente a sua, mas não vejo uma maneira de excluir minha resposta, pois a sua abrange o mesmo material.
ominus
Como já comentei com outras pessoas fazendo essa sugestão, é uma boa sugestão, mas é altamente provável que, se o design do banco de dados for uma porcaria, o código do aplicativo também seja uma porcaria. Não vejo sentido em resolver esse problema se o código do aplicativo também deve ser refatorado.
Maple_shaft
3
@maple_shaft Concordou, mas o OP diz que ele foi convidado a criar, a partir do zero, um novo aplicativo que irá interagir com o banco de dados. Em um caso como esse, faz sentido criar o novo aplicativo corretamente.
Wayne Molina
1
@maple_shaft, a única parte de porcaria do aplicativo será a parte que interage com o banco de dados de porcaria. Esse é o ponto da arquitetura N-Tier e do SOC.
precisa saber é o seguinte
1
@maple_shaft O objetivo seria colocar o banco de dados em uma espécie de "caixa preta" e fornecer ao aplicativo uma interface mais ideal e não necessariamente representativa do design do banco de dados.
Michael Dean
10

Crie uma camada de interface que lide com todo o material do banco de dados e grave seu aplicativo para fazer interface com isso. Caso o banco de dados seja "corrigido", basta substituir / atualizar sua "interface". Essa abordagem me salvou muito tempo ao lidar com um banco de dados ruim ou com um banco de dados que alimentava outros aplicativos e não podia ser mexido.

Ominus
fonte
Como você pode excluir suas próprias respostas ou isso não é uma possibilidade?
ominus
Você pode excluir suas próprias respostas. Você continua vendo-os com um fundo colorido e ele diz algo como "excluído pelo proprietário". Além de você, apenas pessoas com poderes de moderador o verão.
Marjan Venema
@ Minus: Deve ser possível, mas por que você gostaria? Você tem 3 votos positivos!
FrustratedWithFormsDesigner
1
@Marjan: Moderadores e qualquer pessoa com mais de 10.000 representantes.
Jerry Coffin
1
Por que você deseja excluir esta resposta? Eu acho que é uma excelente solução.
Jim G.
6

Você herdou uma bagunça de pesadelo, você tem 30 dias para torná-la utilizável para sua organização e metade do seu dia é ocupada com tarefas de operações?

Tenho certeza de que você poderia refatorar, mas certamente não nessa quantidade de tempo.

Para responder sua pergunta, acho que você não pode escrever um bom código em um design desse tipo. A dívida técnica já é demais. Se eu fosse você, invadiria os recursos que eu poderia e pressionaria para uma refatoração completa em uma data posterior, quando você tiver mais tempo e pessoas em sua equipe para resolvê-lo melhor.

Apenas tenha cuidado ao pressionar para refatorar. Às vezes, um superior decide tomar o código-fonte dos produtos e os direitos de propriedade e não quer pensar que desperdiçou completamente seu dinheiro com lixo. Esse foi o meu caso em um emprego que eu tinha. Infelizmente, os gerentes tomam decisões sobre a compra de software como esse e nunca obtêm envolvimento técnico para avaliar o que estão comprando e ver se é sustentável e possui uma grande quantidade de dívida técnica. Nesse caso, a má decisão é política e pressionar pela refatoração pode colocar seu trabalho em risco.

maple_shaft
fonte
Apesar da falta de familiaridade de todos com a programação, deixei claro como a qualidade dessa base de código afetará a manutenção. Eles estão embarcando em um grande esforço de refatoração para colocar tudo em um estado mais adequado, para que não corra o risco de prejudicar meu trabalho, mas acho que não acontecerá este mês.
John Straka
3
Às vezes, fazer uma invasão bem-sucedida, pois sua primeira experiência com o projeto pode lhe dar credibilidade para refatorar em projetos posteriores para o mesmo aplicativo. Triste mas verdadeiro. Primeiro, eles precisam acreditar que você sabe o que está fazendo antes de considerar qualquer mudança radical. O pôster está em uma situação difícil, com certeza.
HLGEM
1
@ John, é bom que eles RECONHECEM a necessidade de refatoração. É um sinal de boa gestão a longo prazo e o primeiro passo para a refatoração.
Maple_shaft
3
+1 para uma resposta ótima e realista. Você tem um mês, mas na verdade apenas meio mês porque trabalha meio período nas operações. São 11 a 15 dias, dependendo se você tira fins de semana. Eu odeio dizer isso, mas concordo que sua melhor aposta é reunir algo que funcione o mais rápido possível e fazer anotações sobre como aprimorá-lo ou reescrevê-lo mais tarde, especialmente porque seu gerenciamento está a bordo da refatoração.
Bob Murphy
6

Os bancos de dados podem ser refatorados como qualquer outro código. Corrija a parte afetada pelo código que você precisa para escrever e escrever testes para garantir que nada mais ocorra. Faça um pouquinho de cada vez, como qualquer outra refatoração. Há um bom livro sobre refatoração de banco de dados que pode ajudá-lo a começar a limpar a bagunça. http://www.amazon.com/Refactoring-Databases-Evolutionary-paperback-Addison-Wesley/dp/0321774515/ref=sr_1_1?ie=UTF8&qid=1307025831&sr=8-1

Existem outros também, mas eu pessoalmente li e trabalhei com as técnicas deste.

E não esqueça que você pode reestruturar a maneira como precisa consultar o banco de dados criando visualizações para realizar o trabalho desagradável de transformação para você em uma estrutura mais fácil de consultar.

HLGEM
fonte
Tudo está bem, mas tenho a forte suspeita de que, se o design do banco de dados estiver uma bagunça, o código do aplicativo provavelmente também será inútil.
Maple_shaft
@ maple_shaft, isso pode acontecer, embora seja minha experiência que até bons desenvolvedores de aplicativos criem bancos de dados horríveis. De qualquer maneira, apenas a refatoração gradual consertará a bagunça, ele não pode simplesmente substituí-la completamente, mesmo que eu tenha certeza que ele gostaria.
HLGEM
+1 @HLGEM, estes são bons pontos. Seu conselho é bom se o código do aplicativo for bem projetado. Refatorar em partes é provavelmente o melhor caminho a percorrer, mas em toda a minha carreira nunca vi esse trabalho funcionar com sucesso. No entanto, pode ter sido por causa do mau gerenciamento de projetos, não por ser uma idéia doentia.
Maple_shaft
5

Para obter o melhor retorno possível, crie visualizações atualizáveis ​​para restaurar parte da "relacionalidade" e fornecer nomes de coluna mais significativos.

Mike Sherrill 'Rechamada de gato'
fonte
Este seria um bom começo. Se o banco de dados estiver desnormalizado, eu adicionaria gatilhos ou procedimentos armazenados para isolar o aplicativo da desnormalização.
Kevin cline
4

Uma possibilidade seria configurar um segundo banco de dados estruturado (pelo menos mais próximo) de como você gostaria e configurar a replicação entre os dois bancos de dados. Em seguida, você pode escrever seu código no novo banco de dados e ainda manter intacto o banco de dados existente (e o aplicativo), para ser tratado quando tiver mais tempo.

Na verdade, ainda há muitas perguntas sobre se você pode fazer isso em ~ 15 dias de trabalho. Em particular, é provável que dependa se você precisa de replicação bidirecional (ou seja, seu novo aplicativo realmente atualiza os dados) ou apenas de uma maneira (seu novo aplicativo permite que as pessoas visualizem os dados). O último caso é (é claro) dramaticamente mais fácil de lidar.

Se você precisar de replicação bidirecional, é provável que não haja tempo suficiente para fazer o trabalho. Em particular, a replicação bidirecional que envolve a transformação substancial da estrutura nunca é trivial e as ferramentas disponíveis costumam suportá-la muito mal (por exemplo, ter que escrever manualmente todo o SQL para todas as transformações de dados nas duas direções).

Se você precisar apenas de mão única, é exatamente no ponto em que isso pode ser possível. Também vai depender um pouco se você pode gastar algum dinheiro ou não - existem alguns aplicativos de data warehousing destinados a exatamente esse tipo de tarefa que provavelmente o tornariam um pouco mais rápido e fácil gerenciar - mas a maioria deles não é barata.

Jerry Coffin
fonte
+1, isso pode ser uma boa idéia também, desde que todos os códigos de acesso de dados aplicativo está devidamente separada de outras camadas, e que o código de acesso de dados pode ser reformulado para trabalhar com o novo esquema
maple_shaft