É normal pensar em um problema de design por dias sem código escrito? [fechadas]

52

Às vezes, olho fixamente para o espaço ou desenho idéias e escrevo alguns pseudo-códigos no papel. Em seguida, raspei o papel e inicio novamente; quando penso que tenho a solução correta para o problema, começo a escrever o código.

É normal pensar por dias sem escrever nenhum código? Isso é um sinal de que estou abordando o problema totalmente errado? Me deixa nervoso por não ter nenhum código tangível escrito no meu IDE.

Kim Jong Woo
fonte
9
Depende muito do problema e do seu processo de pensamento individual. Se você cumprir seus prazos, não importa quanto tempo você gasta pensando e quanto codificação.
precisa
4
Você tentou desenhar seus componentes em um quadro branco? Às vezes, quando me deparo com um dilema de design ou algoritmo complexo, apenas começo a desenhar. Se você está preso, talvez esteja tentando digerir muito em sua mente. Tente dividir as coisas em componentes pequenos e de fácil digestão e depois desenhe como essas peças diferentes interagem. Não há necessidade de padrões formais, eu meio que faço a UML de um pobre homem quando estou no quadro branco.
maple_shaft
2
prefiro pensar abt o projeto para dias de implementar um projeto mal rapidamente
Chani
4
Sim! E às vezes eu olho para código que eu já escrevi e eu desejo que eu tinha pensado mais sobre o projeto antes de escrevê-lo :-)
Giorgio
2
Ciência da Computação, ironicamente, é muitas vezes independente de computadores
Ryan Kinal

Respostas:

60

Dependendo do problema que você está tentando resolver, a fase de design pode levar semanas e meses (se não anos), não apenas dias.

É preciso experiência para não iniciar o código imediatamente. Pensar na arquitetura e no design de alto nível deve levar dias, se não mais, definitivamente algo que deve acontecer antes de você começar a escrever seu código.

Oded
fonte
11
+1 por anos. Estava envolvido com um grupo em que na sala seguinte havia uma equipe envolvida na coleta de requisitos para um novo sistema por 5 anos, sem fim à vista. Duvidamos seriamente se eles iriam mais longe.
jwenting
8
@jwenting ... isso também não é bom, esses caras talvez devessem ter começado a digitar.
Grady Player
8
@jwenting, sim, isso é chamado de método cascata, e cada um deles deve ser demitido. Se você não conseguir descobrir o que está tentando fazer em um ano, nunca poderá comercializá-lo antes que a própria tecnologia se torne obsoleta.
riwalk
11
Eu temo o que teria acontecido se eles tivessem iniciado produzindo código, todos eles eram analistas de negócios sem know-how técnico que seja :)
jwenting
24

Isso geralmente é chamado de "Paralisia da análise"

É comum, mas errado. Em algum momento, você precisa testar as várias idéias para ver o que funcionará melhor para você e, em seguida, aprimorá-lo gradualmente.

Leitura recomendada ao programador Pragmático Especificamente no capítulo 2 da seção "Balas de rastreamento"

idiotas
fonte
12
você está errado ao supor que é necessariamente errado gastar tempo projetando seu sistema. Por algo trivial, os dias podem parecer longos, para sistemas grandes que abrangem dezenas de milhares ou centenas de milhares de linhas de código, é muito pouco tempo para colocar a arquitetura básica no papel.
jwenting
3
O tempo gasto pensando é diretamente relacionado à complexidade do problema. Mas se ele está "nervoso por não obter nenhum código tangível escrito no meu IDE, eu o farei", acho seguro assumir que ele precisa começar.
Idiotas
7
Eu não disse de forma alguma que é "errado gastar tempo projetando seu sistema" #
2150 Idiotas
4
@ Moron: não importa o que você diz, o que importa é o que as pessoas ouvem, e as pessoas ouviram você dizer que o que o OP está fazendo está errado.
Whatsisname
5
O termo "paralisia da análise" implica que um excesso de tempo está sendo gasto na análise de uma decisão. Na verdade, é um problema real, mas não está claro desde o post original se esse é o caso na situação atual. Se você está gastando alguns dias para pensar em como escrever uma função para reverter uma string, isso é paralisia da análise. Se você estiver gastando alguns dias pensando em como escrever um novo compilador c ++ antes de começar, é o mínimo que você poderia fazer.
PeterAllenWebb
10

Isso é completamente comum. No entanto, se você adotar uma abordagem "Teste primeiro" ou TDD, é menos comum e pode ajudá-lo a formular melhor suas idéias.

Prumo
fonte
5

Os hábitos são geralmente o resultado de abordagens de tentativa e erro e continuando o que nos dá os resultados desejados e evitando o que não acontece. Fazer o que gostamos e evitar o que não gostamos também entra em jogo. Isso funciona até certo ponto, porque, eventualmente, faremos algo que não gostamos para que o aluguel seja pago.

Depende do que o levou a isso e a seus motivos. Aqui estão alguns:

  • Com muita frequência, você teve que alterar o código devido a alterações no design
  • Você não altera um design ruim porque a solução menor já foi codificada
  • Você prefere desenhar e projetar do que escrever procrastinação de código
  • ter que se preocupar com a sintaxe e os detalhes da codificação o distrai de pensar em projetos melhores.

Felizmente, você descobriu que, se criar mais, seu código será melhor. Se você puder olhar para trás e perceber que não importa quanto tempo você gasta em design, convém mudar. Outra consideração é a frequência com que você descobre problemas depois de escrever o código, em comparação com o trabalho com seus designs. Se você não encontrar problemas até depois de escrever algum código, considere um equilíbrio e comece a codificar algo mais cedo ou mais tarde. Talvez essa abordagem possa ser aplicada ao uso de tecnologias mais recentes ou a um recurso muito complexo.

Não sei se tenho disciplina para seguir uma abordagem ou outra, mesmo quando descubro que uma funciona melhor que a outra. Às vezes sinto necessidade de ir ao quadro branco; outros o teclado.

JeffO
fonte
4

É muito comum e acho que é uma maneira melhor de lidar e entender as coisas. Enquanto trabalho em um projeto, fico preso muitas vezes e leva um dia ou dois para entender como posso abordá-lo melhor. Mesmo depois que o problema é resolvido, espero um dia passar. Isso me deixa mais atualizado e pronto.

É um fenômeno natural e bom para um desenvolvedor interceptar sua mente entre os momentos.

Pankaj Upadhyay
fonte
4

Quando fiz um curso de gerenciamento de projetos, uma das coisas que o instrutor nos contou sobre o planejamento, que ficou na minha cabeça, foi que a regra geral que eles ensinavam nas forças armadas era a figura 1/3 do tempo para o planejamento . Portanto, se você tivesse uma operação que exigisse a conclusão daqui a três meses, dedique um mês ao planejamento antes de iniciar a execução.

Scott Whitlock
fonte
4

Na minha opinião, existem três abordagens, cada uma adequada para uma situação de codificação específica

  1. Já vi um problema semelhante antes, por isso tenho uma boa idéia dos padrões a serem aplicados e fica claro como a solução deve se comportar e responder.

    => Use BDD / TDD iniciando nas soluções desejadas e trabalhando no código. (Ok, às vezes trapaceio e escrevo um pouco de código e depois o teste - tipo uma abordagem aninhada 2. -> 1.).

  2. Tenho uma boa idéia de padrões para aplicar, mas não tenho certeza de como a solução deve ser.

    => Protótipo para ver que tipos de coisas interessantes aparecem. Vá para 1. quando descobrir quais coisas interessantes são desejadas.

  3. Não tenho certeza de quais padrões aplicar.

    => Pense sobre o problema e como as várias maneiras de abordar o problema influenciam o código. Vá para 2) ou 1), dependendo do resultado desse exercício.

Em outras palavras, a resposta é a favorita do engenheiro: depende.

forforf
fonte
3

É melhor passar um mês pensando e projetando do que criar um protótipo rápido com base em um design abaixo do padrão, que você precisará moldar. Especialmente se você estiver em um time; depois que outras pessoas começam a depender do seu código, é muito mais difícil implementar um design melhor com uma API diferente.

TMN
fonte
2

Concordo com as outras respostas que, em princípio, dedicar tempo para pensar em um problema / solução é uma boa idéia. No entanto, se você sentir que está empacado, tenho algumas recomendações sobre maneiras de tornar o processo de planejamento um pouco mais coerente:

  • Crie artefatos de design. E daí se você não escrever código? Talvez você apenas anote um diário de seus pensamentos. Ou um esboço de uma solução geral. Ou mesmo apenas um resumo muito bom do problema que você refina com o tempo. Ao considerar as idéias e aceitá-las / rejeitá-las, mantenha um registro do seu raciocínio sobre o assunto. Dessa forma, no final do dia, você ainda pode apontar os resultados do mundo real como prova de seu trabalho.

  • Falar com pessoas! Não há nada como ter um ser humano vivo e respirador com quem discutir idéias. Se você acha que está preso, converse com alguém. Pegue alguém - qualquer um! - e explique o problema para eles. Esboce seus pensamentos sobre como resolver o problema. Mesmo que tudo o que eles façam seja inspirar, expirar e piscar por dez minutos enquanto você balbucia, as chances são de que você descubra novos conhecimentos apenas no processo de explicar o problema .

Stephen Gross
fonte
1

Como disse Satchel Paige, "às vezes eu sento e penso, e às vezes eu apenas sento".

Acho que o que ele estava dizendo é que às vezes é bom clarear sua mente, pois isso pode levar você a pensar no seu problema de uma maneira diferente. Portanto, se você não está estragando o código, pode ter uma solução ou ideia que pode ter escapado de você. Portanto, sim, é normal e uma boa prática não entrar diretamente na codificação.

Existem duas maneiras pelas quais eu mesmo faço esse processo. Crio uma pasta na qual tenho um arquivo de texto e quaisquer desenhos relacionados ao projeto. Anoto minhas idéias e tento salvar todo o processo de pensamento da melhor maneira possível. Também criarei um projeto do bloco de rascunho, onde posso testar rapidamente idéias simples, de algoritmos a layouts de CSS.

jfrankcarr
fonte
1

Programa = Algoritmo + Estrutura de Dados

IMHO, o processo de design (resolução de problemas) é totalmente determinante. Os detalhes da implementação (problema técnico) seguem e resolvem naturalmente.

Terry Li
fonte
Eu realmente gosto dessa equação simplificada. 1
Kim Jong Woo
1

Aqui está o meu caso.

  1. Começando do zero Primeiro, é necessária uma idéia aproximada do que você deseja. Tente obter uma lista de alguns requisitos ou crie-os. Deve demorar um pouco para descobrir as coisas aqui. Depois de ter pelo menos uma peça que você confia que deseja, conhecendo a maior parte da interface dessa peça, comece a codificar.

  2. Corrigindo um problema com o código existente Primeiro, rastreie o problema. Isso pode exigir algum tempo para não escrever código real (algum código de depuração pode ser escrito, mas isso normalmente não será mantido). Depois de encontrar o problema, dependendo da complexidade, comece a escrever o código para tentar corrigi-lo. Pouco pensamento deve ser necessário quando o bug for conhecido. Se o problema parecer uma das principais falhas de design, consulte a próxima seção.

  3. Alterações no projeto / principais recursos É provavelmente o que exigirá mais reflexão. Deve-se considerar a preservação da estrutura, a compatibilidade com versões anteriores etc. Pensar na melhor mudança poderia economizar um tempo significativo, mas normalmente para mim não é mais do que alguns dias.

  4. Adicionando um recurso simples Se nenhuma alteração significativa no design for necessária, basta codificar no seu recurso, usando alguma tentativa / erro. Isso não deve exigir muito tempo em geral.

PearsonArtPhoto
fonte
0

Eu vou discordar do consenso sobre este. Prefiro começar a criar um protótipo de algo assim que tiver a mais vaga idéia de escrever em um guardanapo de como quero que meu sistema funcione. É quase impossível para mim pensar em todos os pequenos detalhes que podem causar problemas, a menos que eu esteja especificando as coisas de uma maneira muito precisa. Se estou apenas discutindo design com as pessoas, é muito fácil contornar alguns dos problemas mais complexos. Depois de especificar coisas como essa, também pode estar diretamente no código-fonte, em vez de outros meios de expressão precisos e formais, mas que não podem ser compilados e executados.

dsimcha
fonte
3
Há uma diferença entre descobrir os detalhes e descobrir o básico. Por exemplo, se você projetar um idioma, decida se seu idioma é procedimental ou funcional antes de chegar perto de um teclado. Ninguém diz que você precisa descobrir detalhes ao planejar, mas precisa saber para onde está indo.
riwalk
@ Stargazer712: Concordo plenamente. Foi por isso que eu disse que você precisa de pelo menos uma ideia de guardanapo, o que diabos você vai fazer. No entanto, da maneira como essa pergunta foi feita, eu estava imaginando dias ou semanas de reuniões burocráticas formais antes mesmo de tentar criar um protótipo até dos recursos mais arriscados / novos / interessantes.
dsimcha
0

Depende do que você quer dizer com "normal" . Falando de mim, acho que o código é uma ótima ferramenta de aprendizado. Portanto, quando enfrento um problema complexo, faço esboços no papel, mas também faço codificação orientada a testes. O código me diz que um quadro branco não pode dizer e vice-versa, e talvez o resultado seja um insight ou a necessidade de mais algumas perguntas para o especialista em domínio.

Portanto, o conselho real é: "Use todas as ferramentas de aprendizado necessárias para se aproximar da definição do problema" , mas também "lembre-se de que essas são ferramentas de aprendizado; portanto, não se apaixone por elas", tanto o código quanto os esboços devem ser descartáveis .

ZioBrando
fonte
0

Nesta era da programação RAD e ágil, você deve começar a desenvolver assim que conseguir identificar as principais partes do sistema, os detalhes aparecerão. Como os softwares estão aumentando, o foco prematuro em cada detalhe não levará a lugar algum.

Syed Aqeel Ashiq
fonte
2
E não se concentrar em detalhes suficientes pode levá-lo a algum lugar que não é um lugar muito melhor para se estar.
Dunk
@ Dunk Eu usei três palavras: prematuramente, cada uma delas, focando nos detalhes. Eu não disse para tocar o teclado imediatamente, pegue o drift.
Syed Aqeel Ashiq