É um mau sinal que estou frequentemente redesenhando à medida que desenvolvo um projeto?

39

Quando comecei a programar, presumi que um dia chegaria ao ponto em que iniciaria um projeto, sentando-me e desenhando um diagrama UML de todas as classes, depois segui-o bastante. Estou programando há alguns anos e não está saindo dessa maneira. À medida que passo por um projeto, costumo dizer

  • "Ei, eu preciso de uma aula para fazer _ _. Eu não pensei nisso antes."
  • "Espere, essa função deve realmente estar nessa classe, em vez desta. Eu vou passar para ela."
  • "Na verdade, devem ser duas aulas em vez de uma. Vou dividir."
  • "Eu devo fazer com que essas três classes independentes herdam todas de uma classe abstrata".
  • Etcetera, etcetera.

É um mau sinal de que estou sempre redesenhando assim à medida que avança? Isso significa que eu sou um programador ruim ou isso é normal?

Lucy suculenta
fonte

Respostas:

41

Esta é uma parte normal do desenvolvimento. Dois dos principais princípios do Design Contínuo é o seguinte:

  1. Você não é onisciente, não pode conhecer todo o sistema do começo ao fim antes de começar.
  2. O design não é estático. Isso é mais prevalente quando um projeto está em uso há muito tempo e os problemas que está resolvendo agora não são os problemas que estava solucionando quando foi escrito pela primeira vez.

Minha opinião pessoal sobre o assunto é que você deve ter uma boa idéia do design macro , mas permitir que o micro design evolua. Outra maneira de expressar isso é que o design de alto nível (que é o mais longe possível das ferramentas de modelagem / UML) provavelmente permanecerá bastante estático ao longo da vida de um projeto. O design detalhado de quais métodos fazem o quê e a hierarquia de classes precisa ser livre para ser maleável.

Quando você realmente não sabe muito sobre o problema que está resolvendo, fará muito mais erros iniciais. No entanto, depois de trabalhar com ele por tempo suficiente, o design geral começará a se estabelecer e as refatorações de que você está falando são tudo o que será necessário para manter o código organizado.

Berin Loritsch
fonte
3
+1, é por isso que sempre me encolho quando as pessoas falam em serializar objetos em um banco de dados -> e se amanhã sua classe explodir em várias partes, como você desserializa sem manter o código antigo por perto? Eu prefiro a alternativa Protobuf (classes dedicadas para armazenamento / troca de mensagens), onde suas classes principais são livres para evoluir e você só precisa adaptar a camada de serialização / desserialização.
Matthieu M.
@ Matthieu - você escreve uma migração de banco de dados. Isso raramente leva mais de uma hora para escrever e testar. O Ruby on Rails possui um recurso muito bom para migrações de banco de dados.
Kevin cline
1
@ Kevin: acho que não temos os mesmos bancos de dados, os meus contêm algumas centenas de milhões de linhas. A migração não é uma opção.
Matthieu M.
+1 - ser muito orgulhoso / teimoso para admitir que cometeu um erro não é uma coisa boa. Algumas pessoas acham que admitir seus erros é um sinal de semana, mas a maioria provavelmente o respeitará por isso, e certamente se sua estratégia para lidar com um erro grave é negar que é um erro, é muito provável que o segundo erro seja fatal.
Steve314
12

O que você está fazendo é conhecido popularmente como "refatoração". Se você parar de fazer isso, estará com problemas.

O fato é que a maior parte do código é complexo e os seres humanos, mesmo os mais inteligentes, não conseguem descobrir tudo de uma vez.

ElGringoGrande
fonte
5

Isso é perfeitamente bom (a menos que essas reformulações sejam sempre grandes revisões ou sejam reconstruídas do zero). Não se preocupe. Pode ser bom começar com um diagrama UML no início do projeto, mas não o esculpe, pois você quase sempre descobrirá que as coisas mudam à medida que trabalha. Você pode aprender novas técnicas que você não conhecia no início, pode querer aprimorar alguns recursos de maneiras que não conhecia durante o design inicial, os requisitos de negócios mudam, às vezes há incógnitas durante o design inicial que podem ser contabilizado mais tarde, etc ...

O que é importante é ir e atualizar esses documentos iniciais UML para que elas reflitam quaisquer mudanças significativas no projeto, desenvolvedores futuras resto (incluindo a si mesmo) pode acabar muito confuso. Isso pode ser difícil e geralmente requer boa diciplina (e tempo).

É muito, muito, muito raro começar com um design e segui-lo 100% até a implementação. Eu pessoalmente nunca vi uma coisa dessas acontecer, exceto programas muito pequenos e triviais.

FrustratedWithFormsDesigner
fonte
6
Etapa 1: Crie um diagrama UML. Etapa 2: escreva o código. Etapa 3: jogue fora o diagrama UML para que ninguém nunca o veja e fique confuso sobre como o código realmente funciona.
Kubi # 10/11
4

O que você está fazendo é perfeitamente normal (desde que você não comece completamente do zero todas as vezes). Eu estive nisso por mais de vinte anos, e ainda é um processo iterativo.

A única vez em que você conseguirá projetar tudo de antemão e cumpri-lo é se estiver resolvendo exatamente o mesmo problema que resolveu da última vez e, mesmo assim, provavelmente poderá encontrar espaço para melhorias.

John Bode
fonte
2

Eu nunca sou um desenvolvedor altamente experiente, mas faço isso também. Nos últimos anos, minha capacidade de construir mentalmente a arquitetura necessária melhorou bastante. No entanto, ao escrever um software, não importa quanto planejamento eu faça, sempre há lugares que precisam de um novo design. Pontos que eu não sabia que estaria me repetindo até que o código estivesse realmente sendo escrito.

O que quero dizer neste post é dizer que eu faço tudo na sua lista e não sinto que essas coisas sejam necessariamente ruins, a menos que estejam acontecendo constantemente e tenham um efeito negativo real na sua produtividade.

Piper Merriam
fonte
0

Isso chamou processo iterativo e é um conceito básico em todas as técnicas modernas de desenvolvimento de software.

vartec
fonte