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?

user396089
fonte
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.
S.Robins
fonte
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.

Amadeus Hein
fonte
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.

Kevin Cline
fonte
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.

Konrad Morawski
fonte
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.

Giorgio
fonte
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.

Stuart Muckley
fonte
-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.

PCJ
fonte
-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

erturne
fonte
-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.

Craig Bovis
fonte