Eu tive o luxo de projetar vários bancos de dados de média complexidade, todos usados em empresas, com vários front-ends, incluindo web, Access e C #.
Normalmente, eu me sentei e trabalhei com antecedência no esquema do banco de dados. Isso sempre fazia mais sentido para mim. No entanto, não houve um único caso em que eu não acabei fazendo alterações, adicionando novas tabelas ou vivendo com aspectos que me incomodavam e eram basicamente tarde demais para corrigir.
Eu não acho que a cura é escrever o código primeiro. E não acho que o problema seja "requisitos de negócios insuficientes" ou, pelo menos, nenhum que pudesse ter sido totalmente resolvido. Os usuários não sabem o que precisam e eu não tenho o poder de fazê-los pensar mais, ficar mais espertos ou mais conscientes ou responder melhor às minhas perguntas. Ou eles discutem e eu recebo ordens para fazer algo de uma certa maneira.
Os sistemas que eu construo geralmente estão em novas áreas nas quais ninguém entrou antes. Não tenho o apoio da organização, os recursos ou as ferramentas para fazer o tipo de trabalho que uma equipe de desenvolvimento de profissionais de design de primeira linha poderia receber por equipe dez vezes mais do que eu faço para criar coisas duas vezes o tempo.
Eu sou bom no que faço. Mas há apenas um de mim fazendo isso em um ambiente que "não faz desenvolvimento".
Tudo isso dito, estou melhorando na descoberta das regras de negócios. E eu vejo uma espécie de terceira opção:
Antes de criar o banco de dados e antes de escrever qualquer código, desenhe telas brutas mostrando como o aplicativo funcionará. Eles devem ser desenhados à mão para impedir que alguém comente sobre fonte, tamanho ou dimensões - você deseja apenas funções.
Com transparências e pedaços de papel, você pode trocar e trocar, uma pessoa é o computador, dois são usuários não técnicos especializados no assunto (dois falam alto) e uma pessoa como facilitadora que faz anotações e desenha os usuários sobre seus processos de pensamento e confusões. Os usuários "clicam", arrastam e escrevem nas caixas, o "computador" atualiza a tela e todos experimentam o design. Você aprenderá coisas que de outra forma não poderia ter aprendido até o início do processo de desenvolvimento.
Talvez eu esteja me contradizendo - talvez seja melhor a descoberta de requisitos. Mas a idéia é projetar o aplicativo primeiro, sem escrever nenhum código. Comecei a fazer isso em pequena escala e está funcionando! Apesar dos problemas no meu ambiente, está me ajudando a projetar melhor o banco de dados desde o início. Aprendo que uma coluna deve passar para uma nova tabela pai porque existem vários tipos. Aprendo que a lista de trabalho precisa ter ordens permanentes que não provêm do sistema integrado de ordens. Eu aprendo todos os tipos de coisas!
Na minha opinião, esta é uma grande vitória.