Sou codificador profissional há vários anos. Os comentários sobre meu código geralmente são os mesmos: escreve um ótimo código, bem testado, mas poderia ser mais rápido .
Então, como me torno um codificador mais rápido, sem sacrificar a qualidade? Para fins de pergunta, vou limitar o escopo ao C #, já que é basicamente isso que eu codifico (por diversão) - ou Java, que é bastante semelhante em muitos aspectos importantes.
Coisas que eu já estou fazendo:
- Escreva a solução mínima que fará o trabalho
- Escreva uma série de testes automatizados (evita regressões)
- Escreva (e use) bibliotecas reutilizáveis para todos os tipos de coisas
- Use tecnologias conhecidas onde elas funcionam bem (por exemplo, Hibernate)
- Use padrões de design onde eles se encaixam no lugar (por exemplo, Singleton)
Tudo isso é ótimo, mas não sinto que minha velocidade esteja aumentando com o tempo. Eu faço cuidado, porque se eu puder fazer algo para aumentar a minha produtividade (até 10%), que é 10% mais rápido do que meus concorrentes. (Não que eu tenha.)
Além disso, eu sempre recebi esse feedback dos meus gerentes - fosse em desenvolvimento em pequena escala do Flash ou em desenvolvimento Java / C ++ corporativo.
Edit: Parece haver muitas perguntas sobre o que quero dizer com rápido, e como sei que sou lento. Deixe-me esclarecer com mais alguns detalhes.
Trabalhei em equipes pequenas e médias (5-50 pessoas) em várias empresas em vários projetos e tecnologias (Flash, ASP.NET, Java, C ++). A observação dos meus gerentes (que eles me disseram diretamente) é que sou "lenta".
Parte disso ocorre porque um número significativo de meus colegas sacrificou a qualidade pela velocidade; eles escreveram códigos com erros, difíceis de ler, difíceis de manter e difíceis de escrever para testes automatizados. Meu código geralmente é bem documentado, legível e testável.
Na Oracle, eu solucionava os bugs de forma consistente mais lentamente que os outros membros da equipe. Eu sei disso, porque gostaria de receber comentários nesse sentido; isso significa que outros desenvolvedores (sim, mais seniores e experientes) poderiam fazer meu trabalho em menos tempo do que o necessário, com quase a mesma qualidade (legibilidade, capacidade de manutenção e testabilidade).
Por quê? o que estou perdendo? Como posso melhorar nisso?
Meu objetivo final é simples: se eu posso fabricar o produto X em 40 horas hoje, e posso me aperfeiçoar de alguma forma para poder criar o mesmo produto às 20, 30 ou até 38 horas amanhã, é isso que eu quero saber - como eu chego lá? Que processo posso usar para melhorar continuamente? Eu pensei que era sobre reutilizar código, mas isso não é suficiente, ao que parece.
Respostas:
Gosto da abordagem de Jeff Atwood para isso, que pode ser encontrada aqui http://www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html .
Basicamente, no artigo, ele faz referência a uma passagem do livro Art & Fear, de David Bayles e Ted Orland. A passagem diz:
Essencialmente, sujar as mãos mais rapidamente e mais frequentemente melhora suas habilidades melhor do que gastar seu tempo estudando e teorizando sobre a maneira "perfeita" de fazê-lo. Meu conselho é continuar praticando, acompanhar a tecnologia e estudar o design.
fonte
Uma possibilidade que ninguém mais parece ter mencionado é que você está indo muito bem e seus gerentes não são muito bons. Como eles estão medindo a produtividade? Eles podem dar exemplos específicos ou é apenas uma percepção geral? Eles levaram em conta a quantidade de tempo gasto consertando o trabalho de outras pessoas em comparação com o seu?
Eu já vi muitas pessoas receberem crédito por fazer as coisas, enquanto o restante da equipe arruma a bagunça que deixou para trás.
fonte
A maior parte do que as pessoas pensam ser importante não é importante. A velocidade de digitação não é importante. Máquinas ou ferramentas mais rápidas não são importantes. Não somos datilógrafos ou operadores de máquinas. Somos pensadores. Somos tomadores de decisão .
O que é importante é usar o feedback para melhorar continuamente o seu processo de tomada de decisão. A única maneira de fazer isso, como adquirir qualquer outra habilidade, é através da experiência, prática proposital e feedback contínuo.
Finalmente: lembre-se de que velocidade sem qualidade é inútil e vice-versa. Para maximizar sua utilidade, encontre um equilíbrio entre essas tensões.
* http://codekata.pragprog.com/
fonte
É bem possível que, na verdade, você esteja sendo solicitado a sacrificar um pouco de qualidade, para maior velocidade.
Em alguns ambientes de desenvolvimento 1 , simplesmente não vale o tempo extra para produzir algo polido, quando "apenas o suficiente" será suficiente.
1 - Estou pensando em "ferramentas internas" em particular, mas provavelmente existem outras.
fonte
Parece que você está fazendo todas as coisas boas - que a médio prazo o tornará mais rápido, portanto não é óbvio se você é realmente lento. Só você realmente sabe disso. (mas é uma possibilidade muito real - o PeopleWare reivindica uma diferença de produtividade de até 10X entre os desenvolvedores para a mesma tarefa).
Então, eu tenho algumas sugestões para você:
O tempo é uma coisa relativa, então talvez o problema não seja a sua velocidade real, mas a percepção do tempo que você está dando. Você pode sugerir que demorará uma semana, mas acabará passando duas semanas, onde outros podem passar três semanas ... mas você parece uma semana lenta.
Como você recebe esse feedback frequentemente, talvez seja hora de conversar com seu gerente e colegas para ver o que eles dizem - deve haver muito a aprender com eles.
Faça alguma programação em pares com um desenvolvedor de "qualidade rápida" para ver se você consegue identificar a diferença.
fonte
Efetivamente, o que se resume a experiência é . Para ser mais rápido no que você faz, é como dirigir um carro, inicialmente você está com medo, já que outros são motoristas velozes (ou bêbados) (ou ambos) e deseja chegar em casa com segurança (em termos de software, deseja garantir que seu código funciona como desenvolvido e funciona bem).
Ao longo dos anos / meses, depois de aprender a dirigir e as estradas, você aprende alguns truques ao longo do caminho que tornam sua condução divertida. É o que chamamos de experiência. Esses "truques" (que eu chamo de traços) são o que ajuda.
No meu caso, aprendi o uso real de padrões de design codificando (até @ home) e aprendendo os usos de alguns. Assim, quando encontro um problema que requer um padrão de design, uso a experiência passada para ver quais funcionaram e por que funcionaria / não funcionaria para a minha situação.
Em suma:
PS: A experiência também vem do aprendizado de outras pessoas. Por exemplo: Ajuda da SO, Programação em pares, Revisões entre pares, etc. Você não pode ter uma experiência se não puder olhar para trás e aprender com os erros (ou se alguém nunca desafiar seu esforço).
fonte
A questão é se você é menos dispendioso quando olha para o custo total de longo prazo.
Em outras palavras, suas correções de bugs cuidadosamente elaboradas são de alta qualidade (incluindo casos de teste e documentação) que superam os custos de manter as correções feitas por seus colegas de trabalho mais rápidos?
Se sim, você precisa conscientizar seus superiores sobre esse fato. Pode ser difícil argumentar se eles não medem e têm os dados necessários para confirmar sua avaliação.
Se não, você deve considerar fortemente por que esse é o caso:
Pense bem e edite sua pergunta com suas descobertas.
fonte
Todas as pessoas que fizeram perguntas sobre se você é ou não realmente lento são bobagens. Tornar-se um programador mais rápido sem sacrificar a qualidade é sempre uma boa meta, não importa o quão lento ou rápido você já seja. Este é o meu objetivo número 1 como programador e nunca terminarei. Estou sempre tentando ficar mais rápido sem sacrificar a qualidade, sou obcecado por isso. Aqui está o que funcionou para mim até agora na ordem da ajuda, juntamente com algumas idéias experimentais no final:
1) Nunca pare de aprender: Aprenda tudo sobre programação e uso de computadores em geral. Encontre áreas em que você é fraco e aprenda-as. Mesmo que pareça completamente não relacionado ao seu trabalho e ao C #, garanto que, se você estiver procurando por ele, frequentemente encontrará maneiras de aplicá-lo ao que faz. Aprender também é experiência, por isso não basta ler as coisas, mas experimentar e expandir suas habilidades. Se você está acostumado a usar o Windows, experimente o Unix ou vice-versa. Se você normalmente gosta de usar as ferramentas de linha de comando e editores de texto do IDE, ou vice-versa. Se você ouvir falar de uma ferramenta ou tecnologia que você nunca ouviu falar antes ou que não conhece muito, não ceda à tentação de seguir em frente. Procure! Não tenha medo de pensar fora da caixa e aprender novas tecnologias experimentais que outros dizem não serem práticas;
2) Divida os projetos: tente dividir seus projetos em mini projetos. Tente fazer um novo lançamento todos os dias ou uma vez a cada poucos dias, no máximo. Pergunte a si mesmo "Qual é a quantidade mínima de funcionalidade que posso liberar e ainda libere algo útil para o usuário". Essa é uma habilidade que você aprenderá fazendo isso. Pode ser necessário convencer seus gerentes a deixarem fazer isso, mas eles geralmente ficam satisfeitos com os resultados rapidamente. Ao fazer isso, você começará a perceber que coisas que considerava essenciais para o seu recurso, na verdade, são recursos adicionais que podem ser desenvolvidos posteriormente. Isso permite que você e seus gerentes priorizem apenas os recursos mais importantes, em vez de todos os recursos relacionados àquele em que você está trabalhando. Isso permite que você pense mais rápido, mantendo a mente clara e focada. Por sua vez, você legitimamente programará mais rapidamente. É provável que seus gerentes ou pelo menos os gerentes de seu gerente percebam que agora você está programando ainda mais rápido do que realmente é porque está obtendo mais lançamentos. Outro grande benefício disso é que você será muito melhor em estimar quanto tempo as versões levarão para serem concluídas, e seus gerentes amarão você por isso. Como você já está realizando muitos testes automatizados, não deve ter problemas ao fazer lançamentos frequentes que são estáveis. Talvez você precise aprimorar seu sistema de compilação automatizado. Eu recomendo a leitura do livro Entrega Contínua da série Martin Fowler. É uma leitura difícil e extremamente repetitiva, mas ainda muito útil. Os gerentes de s também provavelmente perceberão que agora você está programando ainda mais rápido do que realmente porque está obtendo mais lançamentos. Outro grande benefício disso é que você será muito melhor em estimar quanto tempo as versões levarão para serem concluídas, e seus gerentes amarão você por isso. Como você já está realizando muitos testes automatizados, não deve ter problemas ao fazer lançamentos frequentes que são estáveis. Talvez você precise aprimorar seu sistema de compilação automatizado. Eu recomendo a leitura do livro Entrega Contínua da série Martin Fowler. É uma leitura difícil e extremamente repetitiva, mas ainda muito útil. Os gerentes de s também provavelmente perceberão que agora você está programando ainda mais rápido do que realmente porque está obtendo mais lançamentos. Outro grande benefício disso é que você será muito melhor em estimar quanto tempo as versões levarão para serem concluídas, e seus gerentes amarão você por isso. Como você já está realizando muitos testes automatizados, não deve ter problemas ao fazer lançamentos frequentes que são estáveis. Talvez você precise aprimorar seu sistema de compilação automatizado. Eu recomendo a leitura do livro Entrega Contínua da série Martin Fowler. É uma leitura difícil e extremamente repetitiva, mas ainda muito útil. e seus gerentes vão amar você por isso. Como você já está realizando muitos testes automatizados, não deve ter problemas ao fazer lançamentos frequentes que são estáveis. Talvez você precise aprimorar seu sistema de compilação automatizado. Eu recomendo a leitura do livro Entrega Contínua da série Martin Fowler. É uma leitura difícil e extremamente repetitiva, mas ainda muito útil. e seus gerentes vão amar você por isso. Como você já está realizando muitos testes automatizados, não deve ter problemas ao fazer lançamentos frequentes que são estáveis. Talvez você precise aprimorar seu sistema de compilação automatizado. Eu recomendo a leitura do livro Entrega Contínua da série Martin Fowler. É uma leitura difícil e extremamente repetitiva, mas ainda muito útil.
3) Use a técnica pomodoro e adapte / mude o que não funciona para você. Se você combinar isso com o número 2 desta lista, receberá um enorme aumento de produtividade.
4) Aprenda o Vim. Mesmo se você acabar usando esses comandos no Visual Studio via ViEmu, ou a partir do Eclipse por meio de um plug-in ou do Emacs, você ganhará produtividade. A melhor maneira de aprender o Vim é começar a usá-lo e forçar-se a nunca (desabilitá-lo / voltar para suas ferramentas antigas) até que você o domine. É doloroso no começo, mas você nunca vai querer voltar e até se encolher quando precisar trabalhar sem ele. Alguns diriam que isso não aumentará muito sua velocidade. Mas mais rápido é mais rápido, especialmente quando a leitura e modificação de código é O QUE FAZEMOS, e eu me poupou muito tempo com isso de vez em quando.
5) Este último não é necessariamente recomendado, pois não tenho certeza de que seja uma boa ideia, e pode realmente diminuir sua produtividade, mas, mesmo assim, vou fazê-lo. Você pode tentar fazer mais testes de aceitação e menos testes de unidade, ou talvez pelo menos não se esqueça de fazer alguns testes de aceitação. Eu tive sucesso com o SpecFlow, mas suspeito que há algo melhor por aí. Até mesmo escrever as especificações pode ser bastante técnico, portanto, você pode apenas solicitar que seu gerente / cliente escreva uma versão preliminar preliminar para que mude significativamente, ou você mesmo pode escrever a coisa toda e apenas ler e aprovar. Isso irá ajudá-lo com o número 2 desta lista. Os testes de aceitação também podem ser mais práticos e requerem menos código que os testes de unidade. Isso não quer dizer que eles sejam substituídos, ferramentas diferentes para coisas diferentes.
6) Este é ainda mais experimental e controverso. Na verdade, eu mesmo não fiz isso, então não posso recomendá-lo exatamente. Aprenda e use o Meta Programming System da JetBrains. Use-o para criar ferramentas que seu gerente / cliente usa para criar o software desejado. Você pode até parar de fazer testes de unidade e aceitação se puder usá-lo para criar ferramentas que seu gerente / cliente usa para especificar o comportamento de uma maneira muito direta e não complicada. A idéia não é se livrar do programador. Os programadores ainda precisariam adicionar novos recursos a essas ferramentas usadas pelo cliente / gerente sempre que eles (as pessoas, não as ferramentas) não puderem criar facilmente algumas funcionalidades desejadas. Acredito que o MPS ou outras ferramentas semelhantes sejam o caminho do futuro.
fonte
Use seu cérebro mais e faça menos testes. Para ser honesto, o teste tem seu lugar, mas é caro.
Leia também The Art of Unix Programming (livro on-line gratuito, vale o preço)
Finalmente, você pode não estar no lugar certo. Peg redondo no trabalho quadrado, etc.
Por fim, é como a escola: "Produzir o que o professor deseja" se torna "produzir o que a gerência pede e paga".
fonte
Se você pegar um projeto amplo e finalizado e obter o número de linhas "finais" de código por homem-hora, verá que os programadores codificam MUITO mais devagar do que você poderia imaginar.
Estamos falando apenas de algumas linhas de código por dia. O resto do tempo você passa depurando, reescrevendo e fazendo coisas gerais sobre programadores.
Você pode ter ouvido o velho ditado - se você pegar um erro enquanto estiver digitando, ele economizará 10x o tempo que você o tiver capturado no momento da compilação, que é 10x melhor do que pegá-lo durante o controle de qualidade, que é 10x melhor do que pegá-lo após o lançamento ..
Então, como você acelera? Eu não me concentraria em nenhuma forma de velocidade de digitação - reduzir erros e melhorar outras "interações futuras" com o seu código devem ser um investimento muito melhor do seu tempo.
Código legível e claro é essencial. Você escreve seu código uma vez, mas ele será lido dezenas de vezes. Escrever para facilitar a leitura poupa muitos problemas (o que também poupa muito tempo). Se você NUNCA voltar e ler seu código e precisar pensar nisso por um segundo, estará fazendo errado.
A programação em pares pode reduzir o tempo de controle de qualidade e, se você considerar que um programador produz apenas algumas linhas por dia, se dois puderem codificar na mesma taxa que um, mas com menos erros, estará MUITO à frente.
Codificar defensivamente (por exemplo, verificação de parâmetros) pode reduzir problemas ... Se você tem um analista / arquiteto realmente bom em sua equipe, pode economizar tempo com um bom design inicial.
Caso contrário, continue melhorando suas habilidades de design. À medida que você ganha experiência, você se vê mais apto a reconhecer padrões que não funcionarão e evitá-los, será capaz de identificar o tempo gasto mais cedo etc.
fonte
Você já pensou em fazer uma auditoria detalhada de si mesmo enquanto trabalha? Acompanhe com caneta e papel como está gastando seu tempo ou use algo como o Rescue Time para se controlar.
Quando você estiver mais ciente de exatamente como você gasta seu tempo, poderá ter uma idéia melhor do que precisa ser aprimorado e concentrar seus esforços lá.
Idealmente, você pode desafiar alguns de seus colegas de trabalho a fazer isso também, comparar seus resultados e obter idéias uns dos outros. Você provavelmente tem alguns pontos fortes dos quais eles também poderiam se beneficiar.
Talvez você descubra que está gastando muito tempo em uma parte do seu processo que pode ser automatizada ou apenas que você tem muitas distrações durante uma determinada parte do dia e outra parte do dia está quieta, então você pode planejar suas tarefas isso etc.
Ou talvez você descubra que o teste está demorando mais do que você pensava e precisa repensar sua percepção de que o está tornando mais rápido.
Se nada mais, você fornecerá alguns benchmarks com os quais você poderá trabalhar.
fonte
Da sua lista, você está bem.
Se seus colegas estiverem criando código com um número CRAP maior, eles serão mais rápidos. CRAP é uma métrica comicamente nomeada que combina complexidade ciclomática e cobertura de teste.
Não escreva códigos com mais CRAP do que você precisa. ;)
Minha única alteração a sugerir para você é usar bibliotecas, não as escreva, a menos que:
Você está lendo e fazendo e isso é ótimo. Mas você pode ficar parado pensando em código procuedural ou OO. Você se expôs à programação funcional (digamos Haskell?) E ao Prolog?
Para aprimorar sua técnica de programação OO, você já brincou com Smalltalk / Squeak?
E, finalmente, teoria. Você tem pelo menos uma compreensão rudimentar da teoria dos grafos? (Alguns programas funcionam com árvores, DAGs ou apenas gráficos simples em algum momento. Redes são gráficos)
fonte
Vou citar o tio Bob :
- "Mediocridade veemente", Robert C. Martin
fonte
Tanto quanto eu sei, é:
Como gerente, você pode escolher qualquer 2.
Não se preocupe com os comentários que você está recebendo em alta velocidade. Como um programador, prefiro manter um código bem pensado e bem escrito do que algo que foi batido juntos.
fonte
As principais coisas em que consigo pensar são as seguintes
Tenho certeza de que há algumas coisas que você também pode fazer na área de habilidades de codificação, mas parece que você está envolvido com esse tipo de coisa. As coisas listadas acima geralmente são ignoradas pelos desenvolvedores.
fonte
Você pode fazer um curso de digitação rápida. Não sei se digitar mais rápido é um problema, mas "codificar muito lentamente" pode ser causado por velocidades de digitação simplesmente lentas.
E os geradores de código? Às vezes, o código fica repetitivo. A refatoração pode remover parte dela, mas mesmo assim você pode ter chamadas repetitivas para a mesma função refatorada. Dependendo dos dados e código com os quais você trabalha, os geradores de código (escritos em Excel, Perl, Java, qualquer que seja ...) podem economizar muito tempo. E o uso de ferramentas de geração de código para o desenvolvimento da interface do usuário geralmente não é óbvio.
E, finalmente, talvez as métricas estejam erradas. Você considerou que está codificando na velocidade mais rápida possível, considerando todo o resto, e que as linhas de tempo são muito curtas, fazendo você parecer um codificador lento?
Com base nas edições da sua pergunta, parece que você pode seguir o caminho de alguns de seus colegas de trabalho e criar a solução mais rápida que funcionará - e a documentação e o controle de qualidade são condenados!
Ou ... obtenha mais experiência e prática em uma área específica para conhecer a base de código e a API tão bem que você poderá codificar as soluções enquanto dorme. Isso pode ser feito, mas requer mais tempo. Se os outros desenvolvedores mais rápidos do que você são mais experientes e experientes, existe apenas uma coisa a fazer: você deve se tornar mais experiente e experiente!
fonte
Eu tenho uma objeção à visão de "qualidade sacrificada pela velocidade" do OP.
Codificadores profissionais (programadores) precisam satisfazer 3 objetos:
1) O código deve ser executado conforme o esperado
2) A entrega deve ser feita dentro do prazo
3) Tenha boa qualidade, documentação etc.
4) Outros etc.
Eu acho que o OP foi considerado lento, provavelmente porque o OP não foi feito a tempo.
fonte
É um problema 22 difícil de contornar. Embora você ainda não possua experiência e alguma quantidade de conhecimento em muitos aspectos já seja mais rápida que a maioria, o problema é que é mais difícil de medir .
Pessoalmente, o melhor que você pode fazer neste momento é se medir. Forneça feedback sobre como você trabalha, talvez mudanças simples nos seus hábitos de trabalho possam torná-lo mais produtivo.
Eu descobri que os e-mails estavam corroendo muito mais do que eu pensava simplesmente por causa da interrupção. Agora, só respondo e-mails duas vezes por dia e ganhei quase 1 hora de produtividade em alguns dias. Tente métodos como o pomodoro , usei-o como medida. A intervalos regulares (15 minutos), anotava o que estava fazendo naquele momento. Isso me permitiu ver como meus dias foram estruturados e o que eu poderia fazer para maximizar a eficiência.
fonte
A vantagem de Squeak para codificação rápida vai muito além de apenas "aperfeiçoar as habilidades de OOP". Há uma razão pela qual GUIs modernas, assim como IDEs, foram inventadas no Smalltalk, sem mencionar que JUNIT era uma porta do SUNIT para Java, o termo "OOP" foi inventado para descrever o Smalltalk, etc., etc.
É preciso sempre usar a linguagem e o ambiente mais adequados para o que se espera alcançar, mas para a prototipagem geral, pelo menos, eu compararia o squeak contra qualquer coisa, com a possível exceção do HyperCard, e mesmo isso exigiria comparações para ver qual era na verdade, mais rápido, uma vez que existem recursos semelhantes ao hipercard embutidos no Squeak.
fonte