Meu design proposto geralmente é pior que o do meu colega - como posso melhorar? [fechadas]

69

Eu tenho programado por alguns anos e geralmente sou bom quando se trata de corrigir problemas e criar scripts pequenos a médios; no entanto, geralmente não sou bom em projetar programas de grande escala de maneira orientada a objetos. Algumas perguntas

  1. Recentemente, um colega que tem o mesmo número de anos de experiência que eu e eu estávamos trabalhando em um problema. Eu estava trabalhando em um problema mais longo que ele, no entanto, ele encontrou uma solução melhor e, no final, usaremos o design dele. Isso realmente me afetou. Admito que o design dele é melhor, mas eu queria criar um design tão bom quanto o dele. Estou até pensando em deixar o emprego. Não sei por que, mas de repente me sinto sob alguma pressão, por exemplo, o que os juniores pensariam de mim e etc? Isso é normal? Ou estou pensando um pouco demais nisso?

  2. Meu trabalho envolve programação em Python. Eu tento ler o código fonte, mas como você acha que posso melhorar minhas habilidades de design? Existe algum bom livro ou software que eu deva estudar?

Por favor me esclareça. Eu irei apreciar muito sua ajuda.

user151193
fonte
9
@Oded: Eu acho que o ponto de vista do OP é que eles têm o mesmo número de anos de experiência que o colega de trabalho, mas o colega produz melhores projetos, e o OP gostaria de saber como melhorar para que eles sejam tão bom como o colega de trabalho. Eu acho que ...
FrustratedWithFormsDesigner
34
@Oded: Sim, ele não deveria esperar ser um mestre sem colocar seus 10 anos, mas por outro lado, esses 10 anos não o farão muito bem se ele não tiver nenhuma fonte para aprender. . Ele está tentando crescer aqui; não vamos desencorajá-lo, por favor?
Mason Wheeler
6
Você aprendeu alguma coisa com o outro design? Você pode aplicá-lo a outras situações de codificação que você teve? Resolva tudo e aprenda o máximo que puder com seu colega de trabalho. Ofereça almoço.
Jeffo
17
Eu ficaria por aqui. Se você pode aprender com um colega, faça-o. Não deixe seu ego atrapalhar uma oportunidade - e se você seguir em frente e acabar trabalhando com caras que não têm nada a ensinar? Tenho mais de 25 anos de experiência, mas, felizmente, recebo (e faço minha parte de dar) críticas construtivas de um programador com 3. Trabalho com um cara que é melhor no pior dia que eu no meu melhor, como resultado de ambos. sou um programador melhor do que era há 2 anos.
mattnz
7
Um fato da vida é que você sempre encontrará outras pessoas melhores que você. Não deixe que isso o desaponte, apenas tente tudo ao seu alcance para melhorar.
maple_shaft

Respostas:

69

Eu acho que este é um sinal muito positivo de suas habilidades. É muito mais comum que as pessoas que têm dificuldade em criar o design 'melhor' de uma equipe sejam completamente incapazes de reconhecer por que outro design é melhor.

Você tem dois pontos fortes realmente surpreendentes (e surpreendentemente incomuns):

  • Você é capaz de avaliar seus projetos em relação a outras pessoas objetivamente
  • Você deseja e se esforça para otimizar seus projetos

Você tem apenas alguns anos e ainda tem um longo caminho a percorrer, mas com essa atitude você definitivamente chegará lá, apenas não desista; todos nós lidamos com contratempos mentais como este. Sempre que tenho uma chance, gosto de conectar os Princípios de Design (NÃO os mesmos que os padrões de design) e acho que este é um exemplo perfeito de onde eles são úteis. Estude-os e pratique aplicá-los em seus projetos. Antes que você perceba, deu mais um passo nesse sentido.

No final do dia, lembre-se, projetar é difícil. Estamos lidando com abstrações complexas de alto nível todos os dias, para criá-las do nada, para que funcionem bem e o fácil de usar pelos colegas é uma tarefa extremamente difícil. É preciso prática há anos .

Então, levante a cabeça e lembre-se: há um monte de gente por aí que não pode avaliar dois projetos e realmente reconhece um como preferível a outro, quão bem você acha que eles estão se dando bem na criação de bons projetos?

Edit:
'nother tip, depois de entender os princípios e praticar um pouco a aplicação deles, acho que há outra jóia de outra pergunta aqui falando sobre o valor de estudar uma variedade de idiomas que têm objetivos e regras diferentes:

Idealmente, todo programador deve conhecer um idioma de cada classe. O que você pode aprender:

  1. Uma linguagem mainstream OOP de tipo estático: Java, C # (usado principalmente em software corporativo) e C ++ (programação do sistema e aplicativos de desktop complexos)
  2. Uma linguagem OOP baseada em protótipo: Javascript (programação da Web do lado do cliente)
  3. Uma linguagem processual: C (software incorporado e programação do sistema)
  4. Uma linguagem funcional: Haskell, ML ou Lisp (linguagens funcionais são boas para softwares altamente paralelizados).

Uma linguagem de programação lógica (Prolog) provavelmente não é tão útil na indústria, sendo usada principalmente em pesquisas em IA.

Isso ajudará a ampliar a variedade de idéias que vêm à mente ao tentar projetar uma solução.

Jimmy Hoffa
fonte
2
+1 Se é possível entender o porquê , eles estão a caminho de ótimos projetos (especialmente se tiverem apenas alguns anos de experiência).
Daniel B
22
  1. Isso é absolutamente normal para várias pessoas apresentarem designs de qualidade diferente. Fui convidado no passado para julgar competições em design de software, por isso testemunhei em primeira mão: até os designs mais simples resultaram em soluções de qualidade drasticamente diferente, todas provenientes de pessoas inteligentes e experientes.
  2. A leitura do código-fonte é de nível muito baixo para ajudá-lo a melhorar suas habilidades de design: o código aborda a complexidade no nível mais baixo que o design geral.

A melhor maneira de melhorar o design de software é projetar software * . Uma maneira de fazer isso é observando as competições de design: o TopCoder possui um arquivo de mais de 100 designs de componentes, completo com documentação e implementações de design UML em Java e / ou C #. Escolha o componente final que você gosta, leia a especificação de requisitos e tente criar um design original para atender aos requisitos. Passe uma ou duas horas pensando no problema e desenhando um diagrama de classe, abra o design vencedor e leia o que o autor fez. Compare o design dele com o seu, identifique as diferenças e veja se o design é melhor. Verifique o scorecard da competição para ver como os juízes classificaram o design. Isso fornecerá o feedback necessário para você decidir como melhorar suas habilidades de design.


* Isso se aplica a outras coisas além de projetar software: faça algo muitas vezes com um feedback qualificado, preste atenção ao que eles dizem, e você ficará melhor no que estiver fazendo.

dasblinkenlight
fonte
11
Obrigado por chamar o TopCoder, uma idéia interessante de usá-lo como uma ferramenta de ensino.
neontapir
Poderia, por favor, ser muito gentil em fornecer um link para um arquivo TopCoder archive of 100+ component designs,. Não foi possível encontrar esses arquivos.
StepUp
11
@StepUp Aqui está . Pode ser necessário fazer login para acessá-lo.
dasblinkenlight
Se eu quiser ver um design bonito do ASP.NET onde devo ver? Acabei de ver "Encontrar componentes" no link que você forneceu.
StepUp
11
@StepUp O ASP.NET é muito geral. Componentes TopCoder são muito mais específica: analisador SQL, avaliador da expressão, etc.
dasblinkenlight
11

Bem, não saia do seu emprego. É melhor trabalhar com alguém que tenha melhores habilidades do que você, para que você possa aprender com ele.

Observe o melhor design e determine por que ele é melhor. Aprenda com o design aceito e pense em maneiras de aplicar um design similar em outras situações. Depois de saber por que é melhor que o seu design, você saberá o que não fazer na próxima vez que fizer um design. Converse com o outro desenvolvedor e pergunte como ele criou o design.

Para melhorar as habilidades de design, a melhor coisa a fazer é criar projetos e ser brutal consigo mesmo, avaliando-os e determinando como eles podem ser aprimorados. Faça a si mesmo perguntas como: Será que vai funcionar e atende ao requisito em todos os aspectos, é sustentável, como poderei testá-lo, causará problemas de desempenho, qual a probabilidade de o requisito mudar e quão bem será o design ser capaz de lidar com mudanças. Leia sobre os padrões de design e tente aplicá-los aos seus designs. Refatore sem piedade depois de criar um design inicial. Se você estiver projetando um banco de dados junto com o aplicativo, leia bastante sobre normalização e desempenho, ajustando o banco de dados, aprenderá muito sobre o design do banco de dados se aprender a fazer com que um banco de dados funcione de maneira mais eficaz e eficiente. Para aplicativos, pense nos princípios DRY e SOLID ao fazer seu projeto. Leia sobre antipadrões para saber o que evitar.

HLGEM
fonte
3

Reconhecer um design melhor é uma habilidade importante. Você deve adotá-lo ao seguir algumas das sugestões anteriores sobre a visualização de desenhos.

Em que critérios você julgou o outro design melhor? Era mais simples e fácil de entender? Isso proporcionou uma vantagem de desempenho? Foi mais extensível? Existem muitos princípios de design, como decomposição, abstração, ocultação de informações e modularidade de componentes que você pode usar para avaliar projetos e que você já deve reconhecer.

  • Tente nomear seus critérios, entendê-los, expandi-los e reutilizá-los enquanto olha para outros designs. Ao projetar as coisas você mesmo, faça parte do seu processo usar esses critérios e medir conscientemente seus projetos em relação a eles. Em seguida, esteja preparado para modificar ou descartar completamente seu design se ele não atender aos seus critérios.

Você obterá idéias sobre diferentes princípios para projetos de algumas das seguintes fontes: http://www.cs.wustl.edu/~schmidt/PDF/design-principles4.pdf Design de software na wikipedia Google "Princípios de design de software"

  • Entenda os diferentes modelos de design de software, como Design Orientado a Objetos ou Design Funcional ou Design de Análise Estruturada. Essas podem ser mentalidades totalmente diferentes para abordar uma tarefa de design e cada uma delas tem áreas em que se destacam. Aprenda isso como ferramentas para sua caixa de ferramentas. http://userpages.umbc.edu/~khoo/survey2.html

  • Certifique-se de separar o design da implementação, tente fazer um diagrama do que você vê como bons designs, para separar a linguagem e as especificações da implementação dos princípios de design de nível superior. E para desenvolver seus "olhos de design" e habilidades de comunicação.

  • Por último, mas talvez o mais importante, a leitura ampla é uma ferramenta muito boa - há muitas coisas interessantes, desde Fractals até Análise Bayesiana, Fuzzy Logic e Natural Language Processing, que podem fornecer alimento para idéias que surgirão mais tarde e inesperadamente. Com a web, você pode ler tópicos em toda parte, apenas para sua diversão e edificação, e isso será beneficiado. Você não precisa se tornar especialista, apenas familiarizado com termos e idéias.

Divirta-se - não faça isso se não gostar, pelo menos um pouco!

Lindsay Morsillo
fonte
2

Bem, você já deu o primeiro passo. Você admite que tem algo a aprender, que o trabalho do seu colega é melhor que o seu e que deseja aprender e melhorar.

O segundo passo é analisar. Veja o trabalho dele e não diga apenas que é melhor; descobrir por que é melhor. Procure detalhes e pontos específicos que ele fez melhor.

Depois de entender isso, extraia os princípios por trás disso. Faça perguntas como estas:

  • O que esse design é melhor que o meu?
  • Esse ponto é algo específico desse projeto ou é um princípio geral que pode ser aplicado a outros projetos no futuro?
  • Se é um princípio geral, quais são seus limites? Quando é uma boa ideia não fazer as coisas dessa maneira? (Este é muito importante. Impede que você trate uma idéia útil como um martelo de ouro , mesmo em casos inadequados.)

Tente descobrir as coisas por conta própria, porque você internalizará melhor as idéias se tiver a cadeia de raciocínio que o levou à conclusão, mas também conversará com seu colega de trabalho para garantir que você esteja conseguindo as coisas. direito. (Você não quer errar no seu raciocínio e internalizar um princípio ruim, afinal.) E sinta-se à vontade para pedir ajuda ao seu colega de trabalho se não conseguir entender as coisas. A programação é uma disciplina em que a humildade tende a ser respeitada, e muitos codificadores aproveitam a chance de ensinar algo novo a alguém, o que provavelmente é uma grande parte do motivo pelo qual o StackOverflow ficou tão grande tão rápido.

Mason Wheeler
fonte
2

Eu também gostaria de acrescentar (além das ótimas respostas) que há mais do que "Ele pode criar um design melhor do que eu". As outras respostas concentram-se em como você pode melhorar no Design, que é ótimo e bom ... mas ...

Aposto que você pode fazer algo melhor do que seu colega de trabalho. Não para criar um jogo de mijar ou algo assim (você pode fazer melhor com Y? Dane-se, eu posso fazer melhor com X!), Mas para apontar a verdade de que todos têm pontos fortes e fracos.

No meu trabalho, existem 4 desenvolvedores. Há momentos em que os dois principais "programadores" podem criar coisas que me deixam na poeira. Faz minha cabeça girar tentando envolver minha cabeça em torno de suas criações.

Mas sou muito melhor em SQL e em scripts de linha de comando do que eles são, e posso automatizar coisas que os deixam na poeira.

Eles são melhores que eu? Em alguma área é definitivamente. Inferno, em muitas áreas eles são - eu sou o desenvolvedor júnior da minha loja de longe e, individualmente, eles têm anos de experiência em mim. Apesar desses anos de experiência, sou melhor em algumas áreas do que elas são.

Pare de se concentrar no fato de que alguém é melhor em X do que você. Essa pessoa, sem tentar ou sequer pensar nisso, pode ser capaz de superá-lo, mesmo depois de praticá-lo pelos próximos 10 anos. Não que você não deva trabalhar para consertar suas fraquezas, mas lembre-se de que para cada força existe uma fraqueza.

Concentre-se em ambos - pontos fortes e fracos - de você e seus colegas de trabalho.

WernerCD
fonte
1

Em todos os aspectos da vida, você encontrará pessoas que não são tão boas quanto você, assim como pessoas que são melhores que você, especialmente depois de apenas "alguns anos" de experiência.

Você tem que aprender com todos.

Não se sinta mal. Talvez seu colega seja natural. Você deve parabenizá-lo sinceramente e aprender o máximo que puder dele.

Não deixe que o profissional fique ciumento entre você e a oportunidade de aprender.

Tulains Córdova
fonte
1
  1. Alguns anos não são realmente assim. E há pessoas com melhores ou piores visualizações de design de alto nível. Por exemplo, eu conheci pessoas capazes de escrever algoritmos complexos para programas de baixo nível em um piscar de olhos, mas incapazes de entender projetos e conceitos de nível superior, como coesão e dependências. No entanto, este não é um estado de fato. Tanto você pode melhorar em um design de nível superior (leia alguns livros, tente alguns truques em casa, etc.) e também poderá descobrir que em outras áreas da programação seu colega programador é menos bom. Além disso, se você pensa que possui o mesmo nível de experiência e conhecimento técnico, isso pode ter ocorrido numa situação aleatória. Da próxima vez, talvez você tenha melhores idéias de design. Além disso, em vez de deixar o emprego, aproveite esta oportunidade e aprenda com o seu colega. Da próxima vez, faça um design juntos, tente pegar seus segredos, seus pensamentos. Programar é como um ofício, é aprendido fazendo e vendo os outros fazerem isso.

  2. As habilidades de design geralmente vêm com experiência e depois de você ler alguns livros importantes. Eu recomendaria o seguinte:

    • Robert C. Marting - Princípios, padrões e práticas ágeis (existem 2 versões, uma em Java e outra em C #. Não importa qual você escolher, as idéias e os princípios podem ser aplicados a qualquer orientação a objeto - e não apenas - Código fonte)
    • Robert C. Marting tem mais 2 livros interessantes: Clean Code e The Clean Coder
    • Mesmo que Martin cubra todos os padrões de design moderno em seu primeiro livro, você deseja procurar o livro de padrões de design original da Gang of Four.
    • Finalmente, existem outros livros que são altamente valorizados hoje: Software Orientado a Objetos em Crescimento Guiado por Testes, ou Refatoração por M. Feathers (eu acho), ou Escrevendo Casos de Uso Efetivos por A. Cockburn e muito mais que você descobrirá no caminho.

Nenhum desses livros é uma bala mágica, mas a leitura das duas primeiras recomendações provavelmente mudará sua visão e percepção sobre a programação para sempre.

Patkos Csaba
fonte
0

Não deixe que isso chegue até você. Se você tem anos de experiência na correção de bugs e na criação de pequenos programas, é nisso que você se destaca. Seu colega de trabalho provavelmente tem anos de experiência na criação de projetos maiores.

Estar familiarizado com os bits subjacentes é incrivelmente útil, mas se você quiser melhorar o design, precisará criar alguns projetos. Repita até que a habilidade afunde.

Em resumo, "anos de experiência" nem sempre são equivalentes. Vá fazer seus anos valerem alguma coisa.

Philip
fonte
0

"Melhorar" geralmente implica medir seus projetos ou código com relação a algo / alguém melhor, comparar cuidadosamente o que é diferente, aprender com essas diferenças e tentar continuamente melhorar seus projetos futuros com base nisso. Sentir-se muito mal ao descobrir que precisa aprender mais atrasará esse processo benéfico. Se você se mudar para um lugar onde não há pessoas (ou outros recursos) que às vezes ou sempre podem lhe fornecer uma comparação melhor, você poderá perder essa oportunidade de aprender e diminuir o processo de apostas.

hotpaw2
fonte