É razoável esperar que um desenvolvedor sênior saiba quais são os padrões de design do OOP? [fechadas]


26

Estou preparando perguntas para entrevistas de emprego para uma posição de desenvolvimento sênior. O trabalho incluiria design orientado a objetos e o software existente usa padrões de design. Por isso, gostaria de pedir aos candidatos que expliquem alguns padrões de design que eles conhecem, que usaram, como eles os usaram, por que eles usou-os e assim por diante. No entanto, em entrevistas anteriores, quando perguntei a desenvolvedores seniores com pelo menos 5 a 10 anos de experiência sobre padrões de design, quase ninguém nunca ouviu falar deles. Eu acho que dois em cada vinte desenvolvedores poderiam nomear um único padrão de design (Singleton e MVC, respectivamente).

Então, minha pergunta é: faz sentido fazer essas perguntas? Ou esse é um assunto tão obscuro que você não pode esperar que novos contratados os conheçam?

Um desenvolvedor sênior deve ter experiência prévia com padrões de design ou você diria que os padrões de design são um tópico tão simples que todo desenvolvedor decente pode buscá-los durante o treinamento? Se sim, que perguntas você faria para avaliar suas habilidades de design?

Adicionar Depois de ler as respostas até agora, devo dar alguns esclarecimentos:

  • O trabalho é para um desenvolvedor .NET com experiência em OOP / OOD
  • O código existente usa nomes de classe como IParameterGraphVisitore IStorageFactoryem muitos lugares
  • Como você pergunta às pessoas sobre suas experiências passadas com os projetos OO que eles criaram, se eles não têm o vocabulário para explicar seus projetos? É isso que eu quero fazer, e tudo o que posso fazer é "por favor, desenhe a hierarquia de design / objeto do seu último projeto no quadro".

27
Os padrões são um artefato transitório; isto é, eles aparecem através de um bom design. Eles não são "usados". Há uma razão para o nome ser "padrão" e não "restrição" ou "requisito". Então, você quer alguém com experiência em design de OO ou alguém com experiência em padrão de design? O primeiro é mais provável que saiba mais do que palavras-chave.
Michael K

6
@ Michael: Concordo. Há uma diferença entre saber os nomes e poder usar o padrão. Fui criado em OO, mas se você me pedisse para citar alguns padrões e descrevê-los, não faria bem. Não me importo particularmente com o que a indústria decidiu chamar, mas aposto que realmente implementei a maioria dos padrões que você esperava que fossem listados.
Unholysampler 28/03

15
@ Michael: Eu sempre vi padrões de design como um auxílio à comunicação. É muito mais eficiente dizer "este é um visitante da árvore" em vez de "esta é uma interface abstrata que será passada para uma função que irá percorrer uma árvore e chamar um método através dessa interface para que eu possa separar a árvore que anda do código que faz o trabalho real ". Mas se você conhece maneiras melhores de avaliar as habilidades de design em uma entrevista, responda à pergunta! É isso que estou procurando.
Nikie 28/03

3
Talvez uma abordagem melhor seria perguntar-lhes como resolver um problema específico. Pelo menos não me lembro dos nomes de todos os padrões de design, mas sei como aplicá-los e usá-los. como @Michael diz, ter experiência e conhecimento de palavras-chave são duas coisas diferentes.
Tyanna 28/03

4
Conhecer bem os padrões de design pode de fato ser negativo. Alguns astronautas da arquitetura falam apenas sobre padrões de design e os aplicam vigorosamente, independentemente de fazer ou não algum sentido.
William Pietri 28/03

Respostas:


67

Provavelmente, eles os conhecem. Eles apenas podem não conhecê-los como 'padrões de design'; isto é, eles podem não estar familiarizados com a terminologia acadêmica para tais coisas. O que você vê como uma "máquina de estado" pode ser simplesmente uma abordagem de senso comum para um problema de um programador mais velho e experiente. Eu nunca prestei muita atenção aos 'padrões de design', por exemplo, mas quando soube o que era uma Máquina de Estado, tive que rir porque fazia isso há anos. Quem sabia que eu era um acadêmico? Eu sempre considerei a habilidade básica de codificação, e não um 'padrão de design'.

O ponto não é supor que seus desenvolvedores experientes conheçam os termos do livro-texto para as coisas; em vez disso, pergunte a eles como estruturariam as classes ou como abordariam uma tarefa.


2
Eu já usava essas estruturas há algum tempo antes do Gang of Four ser lançado, então sempre tenho dificuldade em lembrar os nomes que eles receberam.
dietbuddha

10
A literatura de padrões é, penso eu, bastante explícita sobre esse tipo de coisa - os padrões não se destinam a substituir o design, eles pretendem ajudar a se comunicar sobre o design. (Eu diria que ajudar comunicar sobre o projeto também ajuda o projeto em si, mas eu acho que é um ponto diferente.)
Aidan Cully

5
+1. Isso acontece comigo o tempo todo. Há algum tempo, li o artigo da wiki sobre "Injeção de Dependências" para descobrir por que parece tão popular, apenas para descobrir que é uma técnica que venho usando há anos, mas que nunca deu um nome a ela. Mesmo com "máquina de estado".
Whatsisname

4
Não é uma expectativa razoável para um desenvolvedor sênior seguir o que está acontecendo em campo e adotar a terminologia amplamente usada? Padrões foram em torno de mais de 15 anos até agora, para que possa nem sequer chamá-los de "novo" mais ...
Péter Török

2
O objetivo dos padrões de design era fornecer uma linguagem comum para que os desenvolvedores de software conversassem entre si sobre soluções para problemas recorrentes. Esse é o ponto em aprender padrões de design. Na IMO, mostra uma clara falta de dedicação à profissão para que eles nem se preocupem em aprender algo que está na vanguarda do desenvolvimento de software da OO nos últimos 17 anos. Eu certamente teria reservas sobre quem não pode nomear e entender alguns padrões básicos. Eles não se importaram em não conseguir entender as conversas das pessoas porque não sabem os nomes?
Dunk

25

Sua expectativa é bastante razoável para um desenvolvedor sênior de OO. Qualquer pessoa que se autodenomina que, sem conhecer os Padrões de Design, apenas demonstra que a experiência não é trazida automaticamente pelos anos que se passam :-( Claro, existem muitos desenvolvedores por aí que passaram anos ou mesmo décadas em campo, sem nunca ouvir falar sobre design padrões - que apenas mostram que eles não estavam interessados ​​em aprender novas idéias, melhorar a si mesmos e adotar as melhores práticas.

Um desenvolvedor sênior deve ter experiência prévia com padrões de design ou você diria que os padrões de design são um tópico tão simples que todo desenvolvedor decente pode buscá-los durante o treinamento?

A experiência da IMO conta muito. Em teoria, um desenvolvedor decente pode ler os Design Patterns em um livro, ou mesmo na Wikipedia, e entender o conceito básico em 15 minutos. No entanto, a aplicação adequada dos conceitos requer experiência adquirida com muito esforço. É fácil se apaixonar por padrões, tentando amontoá-los em todo pedaço de código possível, l'art pour l'art. Também é fácil descartá-los dizendo que "os padrões não são uma bala de prata, basta usar a coisa mais simples que poderia funcionar". Encontrar o meio termo entre os dois extremos, aprendendo quando e como usar padrões para resolver problemas reais, e quando não usá-los, leva anos de experiência .

que perguntas você faria para avaliar suas habilidades de design?

Em concordância com o acima exposto, gostaria apenas de adicionar estas perguntas à sua lista:

  • Quais são as desvantagens dos padrões de design (em geral, e os que eles mencionam explicitamente)?
  • Quando não usá-los e por quê?

Atualizar

O @GrandmasterB tem um bom argumento de que alguns desenvolvedores podem estar usando padrões de design específicos sem saber seu nome. De certa forma, ele está certo, pois é uma questão de terminologia / comunicação. No entanto, o outro lado da moeda é que é realmente uma questão de terminologia / comunicação :-) Ou seja, um dos principais benefícios do Design Patterns é fornecer um vocabulário comum aos desenvolvedores, melhorando enormemente a comunicação . (Tente explicar a idéia básica do Adapter sem usar a palavra em si, ou seus sinônimos "wrapper" et al!). Por mais talentoso e conhecedor que seja um candidato, sem conhecer as terminologias amplamente aceitas, ele apresentará um problema de comunicação na sua equipe.


2
Não sei como isso geralmente é verdade, mas também diria que o uso de padrões de design pode introduzir problemas de comunicação. Por exemplo, quando algo que você está fazendo é semelhante a um padrão conhecido, mas não exatamente como ele, o conhecimento do padrão existente pode ocultar suas diferenças locais. Ou quando os desenvolvedores da sua equipe não entenderem completamente o padrão, eles poderão usar o nome do padrão de maneira idiossincrática.
precisa

1
@Aidan, bom ponto, embora para mim isso seja um uso indevido de padrões. Essa é mais uma maneira pela qual a experiência e a prática são indispensáveis, ou seja, na diferenciação entre variantes do mesmo padrão versus dois padrões diferentes.
Péter Török 28/03

1
+1, qualquer pessoa que se autodenomine um desenvolvedor .NET sênior deve poder nomear pelo menos alguns nomes de padrões explícitos e seu uso. É uma questão de comunicação e caixa de ferramentas, se nada mais.
techphoria414

Eu li-o 3 vezes e ainda não pode dizer se o primeiro parágrafo é sarcasmo ou não
briddums

@ Briddums, o que faz você pensar que é sarcasmo?
Péter Török 28/03

10

Um desenvolvedor sênior ? Definitivamente. Um júnior deveria. Tenho 15 anos, não tenho educação formal sobre o assunto e até eu os entendo. Não é apenas razoável esperar que eles os conheçam, seria inaceitável se não o conhecessem. Supondo que eles saibam algo sobre programação orientada a objetos, o que eles provavelmente sabem.


14
Para ser justo. OO tornou-se apenas uma das metodologias dominantes durante a sua vida. Há várias pessoas que se formaram antes do Java ser a linguagem usada na faculdade. Há muitas pessoas que não vivem no mundo OO.
Unholysampler 28/03

2
@unholysampler: é claro, mas eu acho que é uma posição OOP que está sendo falado
Anto

1
@unholysampler: Eu gostaria de viver naquele tempo .. Eu não suporto ver nada além de Java na uni <_ <
poke

10

Em uma entrevista, você deve perguntar o que é crítico para o candidato saber para fazer o trabalho.

Se eles precisam saber os nomes dos padrões como são do Gangue dos Quatro, esse é um requisito válido.

Se, por outro lado, você deseja que eles exibam o conhecimento de trabalho adequado da arquitetura do programa, acho melhor dar a eles um problema e perguntar como a estrutura do código. Se eles fornecerem a solução padrão apropriada, você terá a prova de que eles sabem disso, independentemente do nome usado.

Sempre que entrevisto para cargos de nível sênior, eles tendem a ser mais "práticos" do que as perguntas e respostas. Quero uma demonstração clara de habilidade e conforto na programação. Eu também quero uma base sólida nos conceitos de CS, o que significa habilidades mais gerais de como aplicar conceitos como encapsulamento, algoritmos, acoplamento / coesão, etc. Experiência e familiaridade em vários idiomas e paradigmas.


4

Depende da área de sua experiência. Eu não esperaria que um desenvolvedor C incorporado soubesse muito sobre padrões de design. Se estamos falando de um desenvolvedor Java ou .NET, eles devem estar familiarizados com os padrões de design e, principalmente, como não se deixar levar por eles.


2
+1 para não ficar muito levado com padrões de design :)
Zaky alemão

Bom ponto. Adicionado um esclarecimento à pergunta. É para desenvolvedores .NET, com experiência em projetos pelo menos na linguagem de programação OO.
Nikie 28/03

4

Supondo que você esteja buscando antiguidade no POO, a resposta é definitivamente sim. Os padrões de design são o léxico da linguagem OOP.

Além disso, atualmente não é razoável que um programador decente de OOP com 10 anos de experiência não consiga nomear um padrão de design, sendo padrões de design amplamente adotados em APIs, bibliotecas e estruturas de desenvolvimento padrão.

Já faz anos que faço essa pergunta durante as entrevistas e é um empecilho para o fato de o candidato não fornecer respostas satisfatórias sobre o assunto.


3

Sim, mas você provavelmente deve obter o entendimento deles fazendo perguntas de design, em vez de pedir às pessoas que enumerem os padrões de design de que ouviram falar. Estou bastante confortável com os padrões descritos em PoEAA, GoF e até com alguns padrões de programação funcional, e ainda acho que você não aprenderia muito mais sobre minha abordagem para resolver problemas, pedindo-me para nomear alguns padrões.

Dada uma pergunta como "projete-me um editor de texto" com acompanhamentos como "Como você suporta objetos incorporados, como imagens? Negrito e itálico? Desfazer?" Você provavelmente ouviria o suficiente para reconhecer o padrão de comando, o padrão composto, o padrão de lembranças e alguns outros com até uma breve conversa.

Os padrões de design foram descobertos e descritos para que tivéssemos uma linguagem comum com a qual comunicar decisões de design.

Infelizmente, trabalhei para alguém para quem todo uso de um padrão de design precisava ser explicado e justificado, não por causa da devida diligência, mas porque ele simplesmente não os conhecia. Isso não é divertido. Mas os desenvolvedores mais sérios, por acidente ou design, aprenderam os nomes dos padrões de OO mais usados, se nada mais, e a maioria dos desenvolvedores de aplicativos corporativos vale a pena pelo menos saber algo sobre os padrões PoEAA mais comuns.


3

Razoável. Definitivamente. Necessário. Não

Pergunto aos possíveis candidatos se eles conhecem padrões de design. É apenas um dos vários critérios a serem pesados ​​como um todo. Não negligencie a imagem total.

Sim, muitos desenvolvedores, sem saber, usam alguns padrões de design, sem dúvida.

Não é por isso que faço a pergunta.

É importante saber que posso me comunicar de maneira rápida e eficaz com outro desenvolvedor. Não quero passar 20 minutos em um quadro branco explicando uma máquina de estado apenas para descobrir que eles "a usaram antes, mas nunca sabiam como chamá-la". Isso não é produtivo.

Eles também ajudam no processo de refatoração. Olhar através do código 1 pode, ocasionalmente, implementar alguma forma de padrão de fábrica, mas o padrão de fábrica do GoF resistiu ao teste do tempo. É por isso que é o padrão de fábrica, e NÃO AINDA Outro ponto de fp (não é preferível reinventar a roda, Joel no software tem muitas desvantagens).

Uma equipe que usa e reconhece a importância dos padrões de design aumenta a comunicação e a produtividade. Se sua equipe, como uma unidade, não usa dp, eles perdem sua relevância.


2

Falando por experiência própria, ignorei os padrões de design por um bom tempo. Eu sabia que eles existiam, apenas nunca li sobre eles. Depois que finalmente cheguei à conclusão, percebi que estava usando o padrão de design o tempo todo e simplesmente não percebi ou não sabia que minhas soluções de design realmente tinham um nome comum.

Eu estaria mais inclinado a apresentar um conjunto de problemas em que um padrão de design específico se encaixa bem na solução e ver o desenvolvedor criar algo semelhante ao padrão. Se o fizerem, ótimo. Talvez eu esteja ainda mais inclinado a contratar um desenvolvedor que use padrões de design desconhecidos, pois vejo muitos desenvolvedores que têm conhecimento de padrões de projeto tentando ajustar uma solução a um padrão quando não é apropriado, em vez de perceber que um padrão específico acontece para resolver o problema. problema bem.


2

Penso que uma pergunta melhor seria: Dado o nome de um padrão e uma descrição do padrão, por exemplo, um Padrão de Fábrica do livro Gang of Four, o candidato deve ser capaz de apresentar um cenário em que o padrão seria uma abordagem razoável.


1

Existem desenvolvedores com 5 a 10 anos de experiência e desenvolvedores seniores. Eles não são a mesma coisa. Sim, se você está contratando no nível sênior e espera que as pessoas conheçam e usem padrões de design, eu não contrataria uma pessoa sênior que não estivesse familiarizada com eles. Seria como contratar um especialista em banco de dados que não entendeu as associações à esquerda. Isso é bastante básico para um verdadeiro desenvolvedor sênior. Eu provavelmente contrataria uma pessoa júnior.


1

Sim, de fato, eles devem estar familiarizados com o termo e devem ser capazes de nomear alguns dos padrões - mas não cometa o erro de confundir conhecimento teórico com experiência.

Há muitas pessoas que, antes de uma entrevista, revisam os padrões de design e podem descrevê-los com uma breve descrição - mas essa é apenas a teoria. É um desenvolvedor sênior realmente capaz de identificar quando usar um ou, sem o conhecimento de um padrão formal, resolveria o problema de uma maneira clássica de design.

A melhor maneira de verificar é deixá-los projetar algo à sua frente e fazer perguntas aprofundadas. Um desenvolvedor sênior é alguém que pode pensar naturalmente no nível de abstração. Essas são as pessoas que "criam" os padrões de design.

Como a classe Peopleware, que fala sobre contratar um malabarista sem pedir que ele faça malabarismos - só porque eles dizem que podem não significa muito .. experimente-os.


Você poderia dar um exemplo de problema? Todos os exemplos de design que eu posso apresentar são tão simples que nenhum projeto interessante é necessário, ou tão interpretados que é difícil ver por que uma solução seria melhor que outra, ou tão complexo que eles não podem ser resolvidos em uma entrevista.
Nikie 28/03

Realmente não importa o que é, poderia ser algo tão simples como "Crie um jogo de sorteio". Espere para ver o que eles fazem com isso. Em seguida, adicione um requisito para explorar o que você está interessado, por exemplo: como você pode alterar isso para torná-lo: testável | portáteis | usado como um serviço | utilizável para diferentes UIs | executado na web ... etc
Stephen Bailey

0

Como já foi dito, também acredito que não há problema se eles não se lembram de palavras-chave de cor. Mas como essa é uma posição sênior, eles devem saber quando aplicar um padrão para resolver um problema da melhor maneira possível, em vez de usar as piores soluções. Assim, dê a eles um problema que deve ser resolvido usando um padrão (por exemplo, como criar um objeto sem codificar sua classe, como acessar os elementos de um objeto sem ter detalhes sobre sua implementação etc.) e veja como eles vão atacar.


0

Definitivamente, eles deveriam conhecer os padrões, mas não necessariamente as palavras da moda.

Por exemplo, o MVC tem muitas alternativas muito semelhantes, como PAC, de três camadas. Alguns anos atrás, outro termo popular para o MVC era "Modelo 2". Na verdade, conheço desenvolvedores muito bons que conhecem perfeitamente esse padrão, mas não sabiam que o chavão atual para ele é MVC.


0

Muito simplesmente: se você os estiver usando, precisará perguntar aos seus candidatos. Se eles conhecem padrões, deve adicionar alguns pontos positivos; mas não saber não deve necessariamente excluí-los, especialmente se eles mostrarem boas habilidades em OOD. É improvável que os desenvolvedores que tenham participado de projetos de manutenção saibam muito sobre os padrões de design em comparação com aqueles que já os desenvolveram. também depende se eles foram ensinados a desenhar padrões na faculdade. Na minha experiência, é improvável que eles o façam. A maioria das universidades e cursos particulares ensina OOP, mas não OOD. As chances de que eles tenham estudado DP são ainda menores.

Pessoalmente, eu não tinha estudado DP até que meu projeto me exigisse também. Mesmo assim, descobri que havia usado alguns padrões, pelo menos de maneira semelhante, se não da maneira exata descrita no livro. Fiquei surpreso ao saber que eles foram codificados. Portanto, procure boas habilidades de design, se não souberem DP. Se eles conhecem DP, é provável que sejam bons no design, mas ainda os testem. Eles podem ter acabado de encabeçar algum boato sobre DP ou descoberto por algum especialista e apenas estudado alguns padrões sem aplicá-los.


0

É razoável que você espere que as pessoas que se candidatam a um emprego conheçam (ou aprendam) o que é necessário em seu espaço de trabalho, independentemente de serem ou não padrões do setor. Caso contrário, você se condena à mediocridade. Mas tenha cuidado em tornar um conhecimento (ou habilidade) um requisito de trabalho, se não for realmente necessário.

Digamos que você tenha dois candidatos com formação semelhante, e um é capaz de falar sobre padrões de design e o outro não. O que isso vai lhe dizer sobre o desempenho deles no trabalho?

Você diz que o software existente usa padrões de design. Isso é uma vantagem? Se sim, como? É seu objetivo que o novo software escrito esteja em conformidade com os padrões existentes ou que novos padrões sejam introduzidos? Por quê?


0

Posso pensar em um desenvolvedor sênior que não conhece padrões de design na seguinte situação:

  1. Há apenas um livro sobre padrões de design. É o livro que os tornou populares em primeiro lugar. Se a pessoa não leu este livro, é possível que ela não conheça os padrões de design ou tenha ouvido falar deles, mas não saiba para que serve.
  2. Em vez disso, eles teriam que saber algo como uml ....
  3. Encontrar boas informações sobre padrões de design da Internet não é fácil. Você tem muita sorte se acessar a página da web correta que possui um bom conhecimento de padrões de design. Simplesmente vir para o software depois de 1995 pode fazer uma pessoa não conhecer o livro de padrões de design, porque o livro é antigo.

-2

Por que qualquer desenvolvedor em um ambiente não OO deve conhecer os padrões de design do OO? Eu trabalhei em lojas fazendo apenas Cobol, apenas PL / SQL, apenas Progress 4GL, etc. Princípios de design OO são irrelevantes por lá, eu esperaria que os idosos nesses ambientes tivessem conhecimento relevante para esses ambientes, não o design OO padrões.

Ser capaz de citar sem pensar em um catálogo de padrões também não faz de você um bom desenvolvedor (na verdade, na minha experiência, ele produz alguns dos piores códigos que eu já vi). No entanto, é isso que você espera ser a marca de um "desenvolvedor sênior". Trabalho na indústria há 15 anos, mas não me peça para desenhar um diagrama de padrões. Eu nunca dei muito tempo, não preciso. Eu ganhei experiência suficiente para descobrir o que funciona sem colocar um nome específico e, se precisar da definição formal, sei onde procurar (e sim, tenho os livros de referência na minha biblioteca pessoal). Essa é a marca do desenvolvedor experiente, e não o conhecimento adquirido com os livros escolares.


2
Não vejo a relevância para a pergunta. Eu não estou entrevistando para uma posição de desenvolvedor da Cobol e definitivamente não vou pedir às pessoas que "citam irritadamente o conhecimento". Seu único ponto parece ser que você não conhece padrões de design.
Nikie 29/03

O unix / linux está escrito em 'C', está cheio de padrões OO e muito mais que no livro gof.
Ctrl-alt-delor 29/03

2
"Ganhei experiência suficiente para descobrir o que funciona sem colocar um nome específico nele". Parte do valor dos padrões de design É o nome. Então você pode dizer "vamos usar um padrão de fábrica" ​​e seu colega imediatamente sabe o que você quer dizer. Se vocês dois sabem como fazer esse tipo de coisa, mas nenhum de vocês tem um nome para isso, precisam gastar muito mais tempo explicando antes que a outra pessoa diga: "Ah, ISSO". E, novamente, se o código contiver um WidgetFactory, alguém que conhece o padrão Factory entende para que serve.
Nathan Long

Eu concordo com o Nathan. O objetivo dos padrões de design é colocar um nome em uma solução comum. Existem muito poucos padrões de design em que as pessoas não pensariam sozinhas. O benefício é atribuir um nome comumente aceito para que você possa se comunicar com outros desenvolvedores sem entrar em detalhes sangrentos. Portanto, sua opinião de que você não precisa colocar um nome em um padrão porque já os está usando é semelhante a dizer que a comunicação não é importante. Tente ir a uma entrevista e faça a declaração "a comunicação não é importante" e veja quantas ofertas de emprego você recebe.
Dunk
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.