Padrões de design sufocam a criatividade

21

Muitos anos atrás, eu estava conversando com um professor de Economia sobre padrões de design, como eles estavam estabelecendo uma linguagem comum para programadores e como eles estavam resolvendo problemas conhecidos de uma maneira agradável, etc.

Então ele me respondeu que essa é exatamente a abordagem oposta que ele usaria para seus alunos de economia. Ele geralmente apresentava um problema e pedia a eles que encontrassem uma solução primeiro, para que pudessem pensar primeiro e tentar encontrar maneiras de resolver o problema primeiro, e somente depois disso ele apresentou a solução "clássica".

Então, eu estava pensando se a abordagem do "padrão de design" é realmente algo que torna os programadores mais inteligentes ou mais burros, já que muitas vezes estão apenas obtendo a "solução certa para esse problema" em vez de talvez usar a criatividade e a imaginação para resolver algum problema em um maneira nova e inovadora.

O que você acha?

Leo
fonte
5
Eu sugeriria a leitura de Uma linguagem de padrões (o livro, não o artigo da Wikipedia) sobre a qual os conceitos de padrões de arquitetura de software são baseados. Eles não são blocos de construção ou peças de quebra-cabeças para serem encaixados.
11
Inclinar / Ensinar é diferente de fazer. Portanto, um bom curso de CS pode fazer com que você escreva um compilador - se você sugeriu ao seu empregador que precisava escrever um compilador para o sistema de processamento de pedidos dele, você deveria / deveria ser demitido.
James Anderson
2
Não acho que os dois sejam necessariamente comparáveis ​​- os padrões de design não são a solução clássica, são uma abordagem para uma infinidade de soluções.
jmoreno
1
possível duplicata de padrões de design - você os usa? - a pergunta pode parecer diferente, mas as respostas a essa pergunta se encaixam bem nesse caso.
Doc Brown
2
Não sei sobre criatividade, mas a multidão de "Que padrão é esse?" ou "Existe um padrão para isso?" perguntas dá a impressão de que alguns desenvolvedores acham que há um padrão para tudo.
19414 JeffO

Respostas:

43

Seu professor de economia está absolutamente correto.

Os Padrões de Design de Software são principalmente uma maneira de os desenvolvedores de software experientes se comunicarem . Eles são uma abreviação de soluções estabelecidas para problemas conhecidos.

Mas elas devem ser usadas apenas por pessoas que entendem como resolver o problema sem o padrão ou que tenham apresentado um padrão semelhante por si mesmas. Caso contrário, eles terão o mesmo problema que o codificador de copiar / colar; eles terão código, mas não entenderão como funciona e, portanto, não poderão solucionar o problema.

Além disso, muitos dos padrões de design são padrões corporativos , padrões que devem ser usados ​​em sistemas de software corporativos grandes. Se você aprender as maravilhas do contêiner Inversion of Control, poderá usá-lo em todos os programas que escrever, mesmo que a maioria dos programas não precise (existem melhores maneiras de injetar suas dependências em programas menores, de maneira que não requer um contêiner de IoC).

Aprenda os padrões. Entenda os padrões e seu uso apropriado. Saiba como resolver o mesmo problema sem o padrão (todos os padrões de software são abstrações sobre algoritmos fundamentais). Então, você poderá usar padrões de software com confiança, quando fizer sentido.

Robert Harvey
fonte
3
Tenho certeza de que existem tantos desenvolvedores que, sem usar padrões de design, eles escreverão um código de baixa qualidade que ninguém quer ver. Eu discordo que ele deve ser usado SOMENTE por pessoas que entendem como resolver o problema sem o padrão ... Para mim, esse é um ponto essencial de um padrão de design; Se eu soubesse como fazê-lo, por que devo escolher um padrão de design? Além disso, o que esses outros desenvolvedores devem fazer se os forçarmos a não usar um padrão de design? Eles devem criar software real com suas idéias e deixá-lo falhar e aprender algo novo?
Mahdi
18
@ Mahdi, quando muitas pessoas encontram a mesma solução, essa solução é chamada de padrão. Não é o contrário - você não olha para os padrões e os usa como soluções, olha para as soluções e encontra os padrões.
user253751
13
@Mahdi Vejo muito mais iniciantes que pensam que, se usarem o padrão XXX, criarão sempre um software perfeito (onde XXX é o que já leram sobre o último curso) e depois se esforçarão para torturar todos os projetos esse padrão.
Jwenting 18/03/2014
5
@ Mahdi: não tome a frase "por pessoas que entendem como resolver o problema sem o padrão" muito literalmente. Robert certamente quer dizer "por pessoas que entenderam o problema em jogo o suficiente para tomar uma decisão razoável sobre quando usar um padrão e quando não".
Doc Brown
2
@ Dunk Eu posso tentar algo criativo no topo de um padrão conhecido ou posso fazê-lo do zero, mas depois de tentar várias outras coisas e depois de entender quais são os prós e contras exatos de cada padrão. Se você me pedir para construir uma casa pela primeira vez e apenas me disser para ser criativo, não chegarei tão longe para construir algo sólido, simplesmente porque isso é muito complicado em primeiro lugar. Se você quiser ser criativo em vez de usar um padrão, você já deve ter uma sólida compreensão do problema em si, e você vai ganhar só depois de anos de experiência ...
Mahdi
21

A maneira como as pessoas do Design Patterns querem que você olhe para o Design Patterns é como um conjunto de soluções que você pode aplicar se surgirem problemas semelhantes. Eles não querem que você pense nelas como as únicas soluções possíveis, dadas por Deus a Moisés esculpidas em tábuas de pedra na montanha.

Infelizmente, algumas pessoas os consideram algo mais próximo dos escritos sagrados do que um monte de exemplos de projetos que podem ser aprendidos. Isso mata a criatividade e cria um culto à carga.

Seu professor de economia mencionou apresentar aos alunos o problema e pedir que tentassem resolvê-lo primeiro, o que é uma boa técnica educacional, mas ele tinha uma solução para demonstrá-los. Ter uma série de soluções para muitos problemas diferentes em sua cabeça é uma coisa boa, e é algo que os Padrões de Design tentam ser. Eu acho que falha de alguma maneira (Singleton incentiva abordagens ruins, um foco míope no OO imperativo etc.), mas poderia ser usado bem com inteligência e bom gosto. No entanto, é um erro pensar que toda solução de exemplo possível no software deve ser um padrão oficial de design.

Se você olhar para um problema e se perguntar "Qual é o padrão de design para isso?", Estará fazendo algo errado e será menos provável que encontre uma solução que esteja olhando para você.

Se você olhar para um problema e se perguntar "Como posso resolver isso?", Se houver uma solução não padronizada, você a verá e, se houver um padrão adequado, você também verá.

Michael Shaw
fonte
10

Eu também acho que seu professor de economia está correto e é uma maneira de aprender qualquer coisa em primeiro lugar; No entanto, vamos olhar assim: você manteria a roda em segredo e deixaria que todos a reinventassem, por uma questão de criatividade ? Espero que você diga Não, porque nem todas as pessoas são criadas / capazes de inventar suas rodas - e se forem, elas farão isso em algum momento, não importa se estão cientes da existência da roda ou não.

Vamos voltar aos programadores; Como sou desenvolvedor de web por dia, o MVC é uma daquelas coisas com as quais interajo diariamente. Várias vezes tentei construir minhas próprias estruturas, aprendi muito, mas todas foram basicamente malsucedidas. Eu tentei o meu melhor, mas o que aconteceria se não houvesse MVC por aí? Bem, simples, meu código fonte é péssimo - em termos de confiabilidade, manutenção e extensibilidade.

Eu acho que é o mesmo para a maioria de nós. Se ninguém falar sobre DI - como uma boa prática, quantos aplicativos corporativos devem sofrer ou falhar até que seus desenvolvedores aprendam a lição?

O segundo ponto são os padrões da indústria . Se você não ensinará MVC aos desenvolvedores da Web, estará pronto para enfrentar todas essas estruturas não-padrão que você precisa para dedicar algum tempo para aprender o modo de fazer as coisas primeiro e depois perceberá que algumas dessas estruturas podem tenha uma boa idéia, mas a maioria deles terá sérias falhas de design que podem ter sérias conseqüências para o seu projeto de software - mesmo estruturas conhecidas ainda enfrentam falhas de design de tempos em tempos.

Mas o que aconteceria se tivéssemos todas essas idéias legais e as juntássemos e esses desenvolvedores inteligentes tirassem as coisas boas de todas essas experiências e fizessem uma estrutura muito legal que funcionasse melhor para esse problema específico? Depois de criar os padrões de design . Se você é uma criatura viva, então não há outro caminho; Até os animais seguem as melhores práticas e os padrões de design no seu dia-a-dia.

Mahdi
fonte
3
"Aprendi muito, mas todos eles foram basicamente malsucedidos. Tentei o meu melhor, mas o que aconteceria se não houvesse MVC por aí? Bem, simples, meu código-fonte é uma merda" - palavras de ouro maciço!
ankush981
5

Não reinvente um martelo, mas não trate todos os problemas como um prego

Os padrões de programação economizam muito tempo, pois oferecem soluções prontas para o uso, bem documentadas e testadas com casos médios que você pode esquecer facilmente. Mas você precisa aprender (e pensar) quando usá-los.

Parafraseando sua pergunta: aprender a dirigir me faria andar mais rápido ou apenas andar mais devagar?

Aprender a usar o padrão de programação não significa que você não deve procurar encontrar soluções próprias. Ainda haverá problemas suficientes para exercitar sua criatividade. Conhecer os padrões de programação apenas permitirá que você seja rápido com problemas conhecidos e se concentre naqueles que são menos triviais.

Voltando à segunda parte da sua pergunta - seu professor está certo?

Sim, ele está certo . O objetivo principal dos estudos é aprender os alunos a pensar . Eles precisam tentar encontrar suas próprias soluções para o problema e depois confrontá-los com as soluções existentes. Só assim eles podem realmente entendê-los. Se você aprender os padrões primeiro, corre o risco de que eles aprendam apenas mecanicamente a aplicá-los e a não entender o que está por trás.

Essa é a razão pela qual você ensina os alunos a programar, e os padrões são introduzidos em outros semestres.

Marinheiro Danubiano
fonte
5

Eu recomendaria absolutamente não ensinar programação ensinando padrões de design. Você não pode aplicá-los bem sem entender os princípios por trás deles; portanto, ensinar esses princípios é muito mais importante.

Eu costumo pensar que os padrões de design também não são realmente tão valiosos para os programadores que trabalham. Se você entende completamente os princípios envolvidos em um determinado padrão de design, em uma situação em que é uma boa solução, você naturalmente tenderá a construí-lo (ou algo semelhante) de qualquer maneira apenas como uma questão de disciplina, mesmo que você não saiba que era um padrão com um nome. Qualquer que seja o tempo que você gasta em aprender padrões, pode ser melhor gasto aprendendo a pensar em código em geral. Se suas habilidades de "resolução de problemas em geral" não são adequadas, você não pode escrever um bom código, por mais que seja bom em aplicar algum conjunto de padrões. E se suas habilidades de "resolução de problemas em geral" forem boas, você poderá resolver os problemas, mesmo que não conheça um único padrão.

Eu também acho que em um mundo ideal não haveria ser quaisquer padrões de design, porque as idéias bastante comum a ser chamado de um padrão todos seriam bem-implementado em bibliotecas e nós realmente ser reutilização de código em vez de constantemente reescrevendo -lo. Imagine se houvesse um "padrão de design de expressão regular", que exigisse a implementação de um pequeno mecanismo de expressão regular toda vez que você quisesse usá-lo. Os padrões de design são apenas bibliotecas que não podem ser escritas porque a linguagem não fornece os recursos de abstração corretos.

Essa é realmente outra razão para não se importar muito com eles; eles não são nem de longe tão universais quanto às vezes é reivindicado, mas, de fato, estão fortemente vinculados às maneiras particulares de estruturar programas que uma determinada linguagem permite / incentiva. Um livro de padrões de design escrito para Python seria completamente diferente de um escrito para Java e ainda mais diferente de um escrito para uma linguagem não imperativa como Haskell. Melhor entender em um nível mais profundo, e você poderá descobrir os padrões de design em qualquer idioma com o qual se familiarize.

Ben
fonte
Hum, resposta interessante. Mas ouvi dizer que as entrevistas de programação são pesadas nos padrões de design. Por que isso seria se houvesse pouco valor neles?
ankush981
@dotslash Pela mesma razão que os testes de QI são pesados ​​em matemática / lógica: eles têm algum valor e são fáceis de testar. Dito isto, na minha busca de emprego como programador, não os encontrei tanto em entrevistas; Eu sou australiano, então talvez haja uma diferença na moda.
187 Ben
Mas aprender sobre padrões de design não é uma ótima maneira de ver exemplos concretos de como pensar em código? Que coisas você gostaria de aprender para pensar sobre código, senão problemas + soluções gerais que resolvem os problemas e exemplo de código que implementa a solução?
Amy Blankenship
@ Amy Sim, mas há uma grande diferença entre "aqui está um problema, aqui está uma solução, eis como eu o criei" e "aqui está um padrão, memorize-o para que você possa aplicá-lo a esses problemas no futuro". Você quer ensinar a capacidade de gerar soluções, porque os padrões podem aplicar-se apenas algumas vezes, portanto, eles precisarão dessa capacidade, não importa quantos padrões eles conheçam. Se eu estivesse ministrando um curso que incluísse padrões, provavelmente o faria definindo exercícios projetados para fazer os alunos perceberem por si mesmos que havia conceitos comuns nas soluções para os exercícios.
Ben
Excelente resposta. O melhor ambiente de programação encapsularia os padrões mais interessantes em bibliotecas ou linguagens, liberando os desenvolvedores para trabalharem em um nível superior. Eu também gosto do ponto sobre dependências de linguagem; muitos padrões de design comuns estão atualmente obsoletos.
Frank Hileman
3

Comércio e educação têm objetivos diferentes. Se eu estivesse ensinando aos alunos padrões de design, adotaria a mesma abordagem. Mas em um ambiente de produção, tempo e eficiência são tudo.

Além disso, a (macro) economia fora da sala de aula é uma coisa diferente. Você vê governos dizendo: "Uau! Agora estamos super entediados em fazer os impostos e da mesma maneira, então vamos tentar algo super maluco dessa vez"? Não, você não, porque tais experiências selvagens podem destruir a economia além do reparo. Em vez disso, eles tendem a seguir abordagens testadas e comprovadas: aumentar a taxa de juros, anunciar isenção de impostos, etc. Em outras palavras, eles contam com padrões de design.

ankush981
fonte
1

A resposta é, claro, sim.

Os padrões de design são uma ferramenta de aprendizado maravilhosa, contanto que se dedique um tempo para descobrir como eles funcionam e por que trazem o valor que trazem.

Eles também podem ser grandes impulsionadores da produtividade, acompanhando rapidamente um processo de design, porque fornecem soluções familiares para problemas que surgem o tempo todo.

No entanto, se eles produzem um curto-circuito no projeto demais ou as pessoas se tornam dogmáticas e precisas sobre seu uso, elas têm o efeito oposto.

Roubar
fonte
3
são ferramentas de ensino terríveis para ensinar programação (em vez de design). Eles levam à pergunta oh tão comum nos fóruns da Internet de "como posso implementar XXX usando o padrão AAAA", que é a pergunta errada a ser feita, a pergunta deveria ser (quando você deseja forçar padrões) "quais padrões seriam apropriados para implementar XXX ".
Jwenting
1
lol eu disse ferramenta de aprendizagem, não ensinar ferramenta - se alguém quiser aprender;)
Rob
-2

Os padrões de design são obviamente menos criativos. Essa é a ideia toda. A criatividade é um recurso escasso. Você não deve desperdiçá-lo com problemas que não precisam de criatividade. É muito mais fácil, rápido e mais provável que funcione, se você resolver um problema da mesma maneira que centenas de desenvolvedores antes de você. Código chato e desinteressante que faz seu trabalho é realmente bom.

gnasher729
fonte
2
esta é apenas a sua opinião ou você pode apoiá-la de alguma forma?
Gnat