Eu posso escrever código ... mas não consigo projetar bem. Alguma sugestão? [fechadas]


83

Sinto que sou bom em escrever código em partes, mas meus projetos são realmente ruins. A questão é: como melhoro meus projetos - e, por sua vez, me torno um designer melhor?

Eu acho que escolas e faculdades fazem um bom trabalho ao ensinar as pessoas a se tornarem boas na resolução de problemas matemáticos, mas vamos admitir o fato de que a maioria dos aplicativos criados na escola geralmente tem entre 1000 e 2000 linhas, o que significa que é principalmente um exercício acadêmico o que não reflete a complexidade do software do mundo real - da ordem de algumas centenas de milhares a milhões de linhas de código.

É aqui que acredito que mesmo projetos como o topcoder / project euler também não serão de grande ajuda, pois podem aprimorar sua capacidade de resolver problemas matemáticos - mas você pode se tornar um programador acadêmico; alguém que está mais interessado nas coisas legais e limpas, que não tem interesse nenhum no dia-a-dia das coisas mundanas e cabeludas com as quais a maioria dos programadores de aplicativos lida.

Então, minha pergunta é como melhoro minhas habilidades de design? Ou seja, a capacidade de projetar aplicativos de pequena / média escala que vão para alguns milhares de linhas de código? Como posso aprender habilidades de design que me ajudarão a criar um kit de editor de html melhor ou algum programa gráfico como o gimp?


1
"vamos admitir que a maioria dos aplicativos criados na escola geralmente tem entre 1000 e 2000 linhas, o que significa que é principalmente um exercício acadêmico que não reflete a complexidade do software do mundo real": onde eu estava ensinando, tínhamos dois projeto de software para o semestre em que uma equipe de dez alunos desenvolveu um aplicativo bastante complexo por um período de 6 a 8 meses. Além disso, muitas empresas (pelo menos na Alemanha) oferecem contratos curtos para estudantes que desejam praticar um pouco antes de concluir seus estudos.
— Giorgio

Respostas:


87

A única maneira de se tornar realmente bom em algo é tentar, falhar espetacularmente, tentar novamente, falhar novamente um pouco menos do que antes e, com o tempo, desenvolver a experiência para reconhecer o que causa suas falhas, para que você possa gerenciar possíveis situações de falha mais tarde. Isso é tão verdadeiro quanto aprender a tocar um instrumento musical, dirigir um carro ou ganhar uma idade PWN grave no seu jogo de tiro em primeira pessoa favorito, assim como é aprender qualquer aspecto do desenvolvimento de software.

Não existem atalhos reais, mas existem coisas que você pode fazer para evitar que problemas ocorram enquanto você ganha experiência.

  • Identifique um bom mentor . Não há nada melhor do que poder conversar sobre seus problemas com alguém que já pagou suas dívidas. A orientação é uma ótima maneira de ajudar a acelerar o aprendizado.
  • Leia , leia um pouco mais, pratique o que você tem lido e repita por toda a vida de sua carreira. Faço essas coisas há mais de 20 anos, e ainda gosto de aprender algo novo todos os dias. Aprenda não apenas sobre design inicial, mas também design emergente, teste, melhores práticas, processos e metodologias. Todos têm diferentes graus de impacto sobre como seus projetos surgirão, tomarão forma e, mais importante, como durarão ao longo do tempo.
  • Encontre tempo para mexer . Participe de um projeto de skunkwork no seu local de trabalho ou pratique no seu próprio tempo. Isso anda de mãos dadas com a sua leitura, colocando em prática seus novos conhecimentos e vendo como essas coisas funcionarão. Este também é o material que contribui para uma boa discussão com seu mentor.
  • Obter envolvido com algo técnico fora do seu local de trabalho. Pode ser um projeto ou um fórum. Algo que permitirá que você teste suas teorias e idéias fora do seu círculo imediato de colegas, a fim de manter uma nova perspectiva sobre as coisas.
  • Seja paciente . Reconheça que a experiência de ganho leva tempo e aprenda a aceitar que você precisa recuar um pouco para saber por que e onde falhou.
  • Mantenha um diário ou um blog de suas tarefas, pensamentos, fracassos e sucessos. Isso não é estritamente necessário, no entanto, descobri que pode ser de grande benefício para você ver como você se desenvolveu ao longo do tempo, como suas habilidades cresceram e seus pensamentos mudaram. Volto às minhas próprias revistas a cada poucos meses e olho para as coisas que escrevi há 4-5 anos. É uma verdadeira surpresa descobrir o quanto eu aprendi naquele tempo. Também é um lembrete de que eu entendi errado de tempos em tempos. É um lembrete saudável que me ajuda a melhorar.

45
+1 para tentar e falhar. Porque quando você não entende por que existe um padrão de design, você não pode usá-lo efetivamente.
— Mert Akcakaya

2
+1 ótima resposta, mas acho que é um pouco incompleto. Acredito que a contribuição mais importante de longe seria ter um apetite muito bom pela refatoração. Escreva, observe o que a teoria diz (artigos, livros ou mentor), refatorar / reescrever, voltar à teoria, refatorar / reescrever - isso lhe dará tempo para se concentrar na estrutura, enquanto trabalha com código familiar. Seja o seu pior crítico. Eu diria também que é muito importante que você nunca perca esse apetite por revisitar constantemente seu próprio trabalho.
— Vski 24/04

1
@vski Existem muitos conceitos que eu poderia ter incluído, mas a questão é se esses conceitos forneceriam um caminho razoável para obter a experiência necessária para o OP considerar-se um designer aprimorado. No escopo da minha resposta, vejo a refatoração como uma prática (conforme meu segundo ponto). O mesmo acontece com a prática de Código Limpo, Teste Primeiro, BDD e muitos outros conceitos. Adotei a abordagem de que existem muitas habilidades e experiências necessárias para se desenvolver até um ponto em que as habilidades de design surgirão e crescerão, com a experiência e o conhecimento adquiridos ao longo do tempo. :)
— S.Robins

2
+1 para obter um mentor. Idealmente, peça ao seu mentor para fazer revisões de código com você. Ter alguém para ler e criticar seu código pode realmente ajudá-lo quando se trata de um design melhor e mais limpo.
— Leo

2
"Já tentou. Já falhou. Não importa. Tente novamente. Falhe novamente. Falhe melhor." --- Samuel Beckett.
— Peter K.

16

Bem, não há maçã de ouro para esse tipo de pergunta, e acho que talvez seja para todo programador descobrir o que é certo para ele. Aqui está a minha opinião, de qualquer maneira.

Você pode ler livros sobre o assunto. Ótimos livros. Livros fantásticos. Mas acho que esses livros só ajudam quando você tenta criar e projetar um aplicativo - e falhou.

Para mim, é tudo sobre experiência. Quando comecei como novato, li livros sobre como criar. Eu não entendi muito do conteúdo naquela época. Quando comecei a trabalhar e tive que projetar aplicativos, criei aplicativos muito confusos. Eles trabalharam, mas eram difíceis de manter. Então li esses livros novamente - e desta vez eu os entendi melhor.

Agora, continuo cometendo novos erros e aprendendo com os antigos.


10
Vale a pena destacar aqui um ótimo ponto: continue cometendo novos erros; não continue cometendo os mesmos erros antigos - aprenda com eles e faça algo novo.
— Bevan

11

Pare de projetar e aprenda a refatorar o código. O desenvolvimento incremental com refatoração contínua e agressiva resultará em um produto final muito mais limpo do que em qualquer projeto inicial.


2
Design emergente é uma coisa bonita IMHO, mas sem disciplina você corre o risco de criar "espaguete emergente". O problema do design inicial é que as pessoas a veem como uma proposta de tudo ou nada, dando uma má reputação quando as coisas correm mal. Isso me lembra um dos artigos de Joel, onde ele menciona que o design é importante. O que é necessário, no entanto, é suficiente para que um design faça a diferença sem que você perca tempo, recursos e a chance de ver belos designs de suporte surgirem organicamente por meio de código limpo.
— S.Robins 28/05

@ S.Robins: Eu senti que o OP ainda está atacando projetos pequenos o suficiente para serem concluídos muito bem com TDD e refatoração contínua. Assim, ele pode aprender a disciplina necessária para saber quanto de design é necessário para projetos mais complexos.
— Kevin cline

Eu pensei que poderia ser esse o caso, mas achei que poderia valer a pena acrescentar um contador à implicação de que "qualquer projeto inicial" será potencialmente pior do que algo puramente emergente. Concordo, no entanto, que a maneira de criar a experiência necessária que o OP está buscando é se preocupar menos no começo com o design e o foco, em vez de escrever um código bem fatorado e limpo. :-)
— S.Robins

Não concordo que a refatoração sempre leve ao melhor design. Obviamente, a refatoração geralmente permite explorar e entender o problema, mas o bom design nem sempre surge de forma incremental por meio da refatoração. Às vezes, você vê uma solução muito melhor e percebe que seu código atual está tão distante que a reescrita é muito mais rápida que a refatoração.
— Giorgio

Eu tive essa experiência recentemente: eu continuei refatorando e refatorando e andando em círculos com os mesmos problemas repetidamente: eu estava usando iteradores para codificar algo e o código continuava sendo muito complexo. Decidi esquecer os iteradores e tive que reescrever grande parte do código, mas a lógica ficou muito mais clara e concisa do que antes. Não sei se você chamaria isso de "refatoração agressiva": a estrutura geral do aplicativo não foi alterada, mas algumas partes fundamentais foram simplesmente jogadas fora e reescritas do zero.
— Giorgio

7

Leia sobre padrões, claro, mas antes de tudo leia sobre antipadrões. O reconhecimento de antipadrões é importante e é mais fácil entender por que algo não deve ser feito dessa maneira do que deveria.

Consulte http://sourcemaking.com/antipatterns/software-development-antipatterns, por exemplo.

Escreva o código para que possa ser ajustado rapidamente se os requisitos forem alterados (o que é muito comum no ambiente de produção).

Seja super cético em adicionar "apenas mais um pequeno truque". Mais um aqui, mais um ali, e o código se torna insustentável.

Valorize o princípio aberto / fechado .

Escreva testes (como no TDD). Eles o forçam a pensar em seu design antes mesmo de implementá-lo.

Procure o código de projetos de código aberto (ou seja, de tamanho razoável). Eu costumava me surpreender - geralmente - vendo tantos níveis de abstração. Agora eu entendo que não é arte por arte, há uma razão pela qual é feito dessa maneira.


4

Um princípio que considero muito importante para o bom design é a decomposição: se uma classe é muito grande (mais do que, digamos, 300-400 linhas de código), divide-a em classes menores; se um método for muito grande (digamos, mais de 50 linhas de código) o decomponha; se um projeto contiver mais de 50 classes, decomponha-o.

A chave é estimar o tamanho do seu sistema e construir várias camadas de abstração (por exemplo, subsistema, aplicativo, projeto, módulo, classe, método) que permitem decompor seu código em unidades compreensíveis, com relações claras entre eles e poucas dependências.


1
Embora exista algum mérito em sua sugestão, as linhas de código realmente não importam, o comportamento importa. Se seu método está fazendo mais de uma coisa, provavelmente é hora de refatorá-lo. Se essa coisa é apenas chamar métodos que fazem uma coisa e costurá-los, tudo bem.
— Jer

1
@jer: É uma regra de ouro, é claro. Um método que chama 100 outros métodos é, como você diz, apenas unindo as coisas (está chamando uma lista de sub-funções). Estou pensando mais em métodos que contêm alguma lógica real: normalmente é um mau sinal se você precisar rolar muito para frente e para trás para entender o que um método está fazendo. O mesmo se você observar uma definição de classe com muitos membros (e a classe não for apenas uma grande coleção plana de propriedades).
— Giorgio

"projeto contém mais de 50 aulas, decompô-la" não é grave
— dinâmica

@ yes123: Era para dar uma idéia. Ela realmente depende do que você está desenvolvendo, em que língua, etc.
— Giorgio

Eu acho que seria sensato observar que isso não ajudará no design inicial (já que você está refatorando), mas ajudará a aprender padrões e práticas recomendadas que melhorarão seus projetos futuros.
— Craig Bovis

0

É difícil, o que realmente estamos falando é a capacidade de abstrair em vez de criar um código melhor, mas duas coisas o farão melhorar e uma coisa o fará mais feliz:

"Melhor"

A) Encontre o melhor designer possível e emparelhe o programa / faça um design juntos. Peça-lhes que expliquem o que estão pensando ao resolver o problema, não se conforme com "simplesmente parece certo" e continuem cavando. Esse processo também ajudará a parte "mentora"

B) Imagine tudo como atores individuais e conversas entre eles. Cada um dos atores deve ter uma única função / responsabilidade e grupos deles lidam com sistemas diferentes. Se essa conversa funcionar e cada ator se sentir coerente e coeso, você estará a caminho.

E "mais feliz"

C) Se você tentou o seu melhor e ainda não está acontecendo, não há nada errado em aceitar que algumas pessoas não podem fazer algumas coisas. Você pode escrever um código rígido e brilhante, mas nunca conseguir projetar ou arquitetar. E daí? Eu não posso praticar esportes físicos para caramelo, eu não sou bonito e meu carro nunca será melhor que a média. Revel e utilizar o que você é bom.


-1

Na minha experiência pessoal, ler o código de outras pessoas é uma boa fonte de "inspiração". Quero dizer, tente entender o design de outras pessoas e se pergunte por que ele / ela faz as coisas dessa maneira?

você pode encontrar muitos projetos de código aberto para pesquisa.

de qualquer maneira você precisa praticar.


-1

Não viva com medo

Esforce-se pela simplicidade

Ouça seus usuários

Experimente muitas ideias

Crie algo e depois melhore

Trabalhe em coisas que agregam valor, abandone coisas que não


-1

Aprenda a fazer as perguntas certas. Na maioria das vezes, você aprimora seu design olhando o problema de um ângulo diferente. Em particular, isso ajudará você a deixar de se concentrar na solução do problema em questão e procurar mais soluções que resolvam vários problemas relacionados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.