Saiba como ser um melhor programador!
Em todas as profissões existe o interesse pela autosuperação. A profissão de programador não foge à regra. Esta reveste-se da particularidade de exigir lucidez de raciocínio, por um lado, e por outro, criatividade e inspiração.
Tentarei refletir sobre o assunto e sintetizar ideias resultantes da minha experiência e forma de estar na área. Afinal de contas, a instrospeção fomenta a melhoria. É por isso natural que alguns pontos sejam subjetivos e muitos não estejam isentos de exceções. Os objetivos passam por pensar, fazer pensar e promover a discussão.
Envolvência
- Conhece os recursos à tua disposição, principalmente das API em uso. Por exemplo, uma simples leitura na diagonal da API do jQuery pode fazer a diferença no futuro (ex: “Sim é possível; já vi isto em algum lado”).
- Conhece o projeto: roadmap, objetivos, pessoas envolvidas e a “big picture”. Só com plena consciência do ambiente se pode fazer o ideal. Saber os “porquês” terá muito impacto na direção do desenvolvimento.
- Comunicação: tenta promover a comunicação para evitar situações como “não sabia que tinhas resolvido” ou “não sabia que isso tinha sido abandonado”.
- Espírito crítico: envolve-te no levantamento de requisitos. Se isso não for possível, “exige” que estes cumpram critérios SMART. Não aceites tudo sem antes pôr em causa (mas sê moderado). Não sejas apenas um executante.
Fig. 1 - Gestor que compara os programadores a robôs de uma linha de montagem
- Orientação para o utilizador/cliente. É para eles que trabalhas. O ideal não é o que achas, mas sim o que os utilizadores/cliente querem e precisam. Deves dar opinião, mas sempre com o foco neles e não na tecnologia ou em ti.
- Conhece as regras para as poderes quebrar. Se o resultado final for melhor para a empresa, podes arriscar um pouco, propondo novas formas de fazer as coisas.
- Cultiva um espírito positivo: não te irrites ou amues por algo não ter acontecido como previsto ou com algo que não podes mudar; tenta mudar ou muda.
Simplificação
- Simplifica o texto: tenta ter o mínimo de parágrafos, frases, palavras para dizer a mesma coisa. DRY.
- Não repitas código: (copy/paste de mais do que uma linha deve lançar o alerta); considera procedimentos reutilizáveis, criar/partilhar bibliotecas entre projetos, componentes GUI, templating, etc. DRY.
- Simplifica o código: tenta ter o mínimo de funções/métodos, classes, linhas de código, etc., mas sem sacrificar a legibilidade e modelo concetual.
“Simplicity – the art of maximizing the amount of work not done – is essential.”
- O código deve falar por si. Qualquer programador deverá conseguir perceber e alterar o teu código.
- Não comentes o código com frases inúteis como por exemplo: “aqui coloco mais um elemento na lista”. Comenta para complementares o código de maneira a ajudar a perceber a ligação ao negócio. Faz o exercício de perguntar: “se voltar a ver este código daqui a um mês vou perceber rapidamente?” Se a resposta for “não”, comenta com uma explicação.
- Reduz as dependências técnicas: usa o mínimo de tecnologias (ex. bibliotecas, frameworks, bases de dados, serviços).
- Divide para conquistar: pensa sempre como um engenheiro; reparte os problemas em subproblemas até ficarem simples e manipuláveis.
- Não reinventes a roda: é altamente provável que o problema que estás a resolver já tenha sido resolvido por outrém; procura primeiro. Mas cuidado com o peso das frameworks/bibliotecas (pergunta-te quanto irás usar de cada uma).
- Adequa a solução ao problema. Não arranjes soluções mais complexas que o próprio problema. Nao uses “um canhão para matar uma mosca”. Isto não invalida preparar o código para o futuro (daí ser importante a envolvência).
Fig. 2 - Escolha da solução para problema
- Não te contentes com a primeira solução a que chegaste; de certeza que com mais algumas iterações ela fica mais simples. Itera e pratica o refactoring.
Tecnologia
- Não sejas um obcecado por tecnologias: não as uses sem argumentos lógicos. Evita argumentos como: “vamos usar porque o Twitter usa”, “toda a gente usa isto agora”, “isto é o que está a dar”, “porque estou curioso em experimentar”.
- Não uses frameworks/bibliotecas cegamente, mas sim se os ganhos superarem as perdas. Tenta sempre saber o que fazem “por baixo do capô”. Não tentes forçar o seu uso (Fig. 2), pois as frameworks/bibliotecas não encaixam em todos os problemas.
- Repensa o uso de tecnologias a que estás habituado, especialmente quando começas um novo projeto ou tarefa. Podem estar ultrapassadas ou ser inadequadas ao caso. Cada uma tem as suas vantagens, aplicação e domínio.
- Não descartes tecnologias que desconheces (é provável que sirvam outros propósitos). Mantém-te a par de tecnologias concorrentes às que usas, nem que seja só para ter opinião. Não aches que as que sabes resolvem tudo (ex. PHP) da melhor forma. Desconfia de tecnologias que sirvam para tudo.
- Não aprendas tecnologias sem aprender conceitos: as tecnologias são efémeras: nascem, vivem e morrem; os conceitos ficam. Saber programar não é saber linguagens de programação.
- Automatiza o que é automatizável e reduz as dependências humanas. Se algo pode ser feito por uma máquina, então que o seja; liberta os humanos (programadores e utilizadores) de tarefas repetitivas ou que exijam lembrança. Isso evita, por exemplo, que alguma coisa deixe de funcionar porque alguém se esqueceu de fazer algo.
- Ferramenta ideal != melhor ferramenta. Escolhe ferramentas de trabalho que se adequem às necessidades (ex. saber reconhecer quando basta o SVN e não o GIT) (ver Fig. 2). Cuidado com o deslumbramento tecnológico (ex. usar um documento eletrónico quando bastava um caderno).
- Não tentes impôr tecnologias, aceita que cada uma tem as suas vantagens. Evita discussões do tipo Win. vs Mac ou Android vs iOS; a diversidade é algo positivo. O importante não são os sistemas mas sim o que fazes com eles.
- O teu foco não é a tecnologia. Nunca escolhas tecnologias antes de conhecer bem o problema. Não forces tecnologias nem obrigues as pessoas a adaptarem-se às mesmas. Pelo contrário, defende que a tecnologia se adapte às pessoas.
Boas práticas
- Cria software flexível e que não “castiga”. Não o prepares só para a situação ideal e aumenta as situações em que este não falha. Trata os erros, recuperando com graciosidade e com fallbacks.
- Prepara-te para a mudança constante. Bom código está preparado para a mudança que o negócio naturalmente sofre. Não esperes pela estabilidade…
- Ambiciona código escalável: uma boa prática é pensar “e se isto aumentar muito?”, “e se houvesse muitos ficheiros?”, “e se houvesse um ataque DoS? isto recuperaria?”, “e se fosse reiniciado?”.
- Ambiciona separação de conceitos (a encapsulação, modularidade, separação entre camadas). Exemplos clássicos são o MVC e o unobtrusive JavaScript.
Fig. 3 - Unobtrusive JavaScript (retirado de jQuery - A Sua Biblioteca JavaScript, Luís Soares)
- Desenvolve interfaces autónomas: uma boa interface (seja uma GUI ou uma API) deve ambicionar “falar por si”.
- Mantém testes unitários e de integração em continuous integration. Considera praticar TDD.
- Limpeza de código: tenta que o teu código caminhe apenas para ser a resolução dos problemas do negócio e não dos teus (ex.: logs) ou outros. Por exemplo, evita blocos de código todo comentado (usa o controlo de versões) e não sujes o código/logs com prints (usa debug interativo).
- Não sejas um freak da performance. Tem também em conta o tempo de desenvolvimento, a legibilidade, entre outros. Por vezes, alguns milisegundos não justificam o impacto no projeto. A performance tem de ser relativizada.
- Conhece e usa software design patterns.
- Lê as guidelines UI do sistema para o qual desenvolves (ex. iOS Design, Android Design, Windows Platform Design). Conhece e usa patterns de design de interação.
Humildade
- Aceita a crítica ao teu código e ao teu trabalho em geral. Aceita que o teu código não é teu mas sim da empresa e de todos. Temos sempre a aprender, com júniores e séniores.
- Repensa o papel do programador. Não aches que és um grande programador por dominares if/else, ciclos e funções. Programar envolve muitas mais disciplinas: análise, resolução de problemas, conceção, arquitetura, gestão, standards, trabalho em equipa, QA, integração, etc. Não aches que ser programador é ser mais inteligente.
Fig. 4 - Tarefas de um programador (retirado de Computer Programmer, Antonin Karlo Tilaon)
- Cuidado com as assunções e ideias preconcebidas. Parte para uma nova tarefa com uma mente livre e aberta. Usa a experiência mas não sejas sua vítima: sê imparcial e objetivo nas decisões.
- Questiona. Perguntas estúpidas são as que não são feitas. Não tenhas medo de perguntar ou de admitir que não sabes. Mesmo assim, investiga primeiro e aprende a fazer questões, evitando problemas XY.
- Não metas logo as mãos na massa. Não aches que és tão inteligente que não precisas de desenhos, fluxogramas, pseudocódigo, protótipos/mockups, etc. Perceber bem um problema e a sua solução previne fazê-la várias vezes. Uma hora de análise/conversa pode poupar horas de implementação.
- Não culpes o utilizador. Se o utilizador não consegue fazer algo ou se queixa, a culpa não é dele, é tua. Pensamentos como: “ele não viu o botão” ou “ele que leia o manual” são inadmissíveis.
- Testa-te: regista-te em HackerRank e vê como estás a nível de algoritmos. Usa o StackOverflow e ganha estatuto contribuindo para a comunidade. Tenta participar em projetos open source via GitHub. São três serviços que enriquecem muito o teu CV.
Melhoria contínua
- Pede que revejam o teu código, quando fazes algo complexo (no GitHub, isto é um pull request).
Fig. 5 - Pull request no GitHub
- Quando descobres e resolves um bug, cria um teste automático para cobrir casos semelhantes.
- Tenta sempre a solução ideal. Mesmo que demore mais tempo, compensa a médio/longo prazo. Quando tiveres de fazer algo parecido, já sabes fazer da maneira ideal.
- Analisa a complexidade algorítmica e aprende a notação O(n); muito mais importante que otimizar ao nível da instrução, é otimizar a nível algorítmico.
- Não maltrates a Língua Portuguesa: não és de Letras mas não tens de escrever com erros, até porque lidas com entidades externas (dando imagem de ti e da tua empresa) e fazes interfaces-utilizador com inúmeros textos. O novo A.O. não é desculpa para escrever mal.
- Experimenta software semelhante ao que desenvolves, para poderes comparar. Tenta reconhecer tendências e padrões (especialmente em apps mobile).
- Aprende algo novo: uma linguagem de programação ou ambiente (ex: aplicação Android, aplicação Chrome, aplicação Go). Tira certificações.
- Segue os blogues das tecnologias que mais usas. O bom programador alia a teoria à prática e está a par das novidades das tecnologias que usa.
- Acompanha blogues e canais de pessoas importantes/influentes na tua área (ex. com leitor de RSS, Twitter, Youtube).
- Assiste a palestras; há muitas que são gratuitas ou de baixo custo. Tenta que a tua empresa pague. Além de aprenderes, fazes networking.
- Cria o teu blogue de desenvolvimento de software; falar sobre algo obriga-te a pensar no assunto, e, consequentemente, a estruturá-lo/consolidá-lo na tua mente.
Em suma
- Conhece o ambiente: cliente/utilizadores/projeto;
- Reduz ao mínimo: código, dependências tecnológicas, etc.;
- Conhece a tecnologia e repensa o seu papel;
- Conhece e usa normas;
- Conhece-te e repensa o teu papel como programador;
- Interessa-te, sê curioso e crítico.
Ler mais
Este artigo tem mais de um ano
Está muito interessante.
No entanto está demasiado orientado para programação Web, como se fosse o único tipo de programação existe.
Mas sim, dicas que vou reler e guardar. Bom trabalho
Olá darkvoid. obrigado. Eu tentei ser o mais genérico possível… Pelo menos sem ser nos exemplos. Quanto aos exemplos, dei no que melhor conheço 🙂 mas obrigado pela sugestão.
Por ter um exemplo HTML já é orientado para web?
Não foi só por isso.
No inicio, por exemplo, fala de bibliotecas jquery.
Mais a baixo fala de javascript. etc
Basicamente devias ler o artigo completo antes de vires comentar.
é um facto. mas refiro que são exemplos do conceito que estou a transmitir. é mais fácil dar exemplos que mais pessoas conhecem. depois cada um deve conseguir transportar para o seu ramo. se eu metesse um exemplo de I.A. ou de controladores, era percebido por menos pessoas.
Mais um excelente artigo do Luís Soares. Parabéns!
Muito sinceramente e na minha perspetiva, este deve ser o melhor post que já li no pplware. Ótimas dicas, dadas de forma sucinta mas com as referências necessárias.
Apesar de, a nível tecnológico, serem referidas várias tecnologias web, não concordo com o comentário do darkvoid. Tudo o que li é aplicável independentemente da plataforma ou linguagem na minha opinião.
Parabéns Marisa!
Luís Soares, peço desculpa. Com o “novo” layout do pplware não me tinha apercebido da mudança de local de referência a autores externos. Corrijo da seguinte forma:
Parabéns Luís Soares!
🙂 Ficamos muito contentes por provicar essas opiniões 🙂
Obrigada!!
Um dos melhores, se não mesmo o melhor artigo que já li no pplware.
Keep it up
Artigo muito bom!
Fantástico artigo. Mais uma vez, parabéns ao Pplware e Luís Soares pelo serviço público 🙂
melhor pratica ainda alem dessa indicada, é por os scripts no FIM, antes de fechar o body….
assim o carregamento do html não ficará a espera e/ou bloqueado nos scripts….
advice from google.
tens razão; essa é 1 boa prática sem dúvida; e isso é dito como nota no livro de onde a figura 3 foi tirada. ali não meti, para não complicar. porque a figura e o contexto só querem evidenciar a *separação de conceitos*.
de qq forma, a imagem não está mal se considerares isto:
http://www.w3schools.com/tags/att_script_async.asp
http://caniuse.com/#feat=script-async
Bom artigo 😉
Muito bom artigo 🙂 muitos parabéns mesmo.
Continuação de bom trabalho.
Excelente artigo. Como programador no activo há 20 anos, uma das dificuldades e preocupações que tenho é acompanhar a evolução constante. A formação continua é por isso muito importante, embora nem sempre possível por várias razões. Uma ideia para um grande artigo, seria disponibilizar informação sobre formações (pagas ou não) e mesmo informação sobre cursos superiores\mestrados, para pessoas no activo, mas que gostariam de melhorar o seu conhecimento, tirar outro curso (mesmo dentro da área), ou até uma especialização numa área especifica. O mundo do trabalho está mudado e temos de ter o máximo de ferramentas (conhecimento\curriculum) para o enfrentar.
Fiquei intrigado com a frase pensa como engenheiro. A esmagadora maioria dos programadores não são engenheiros? Não lhes foi incutido filosofia do “engenheiro”?
Uma coisa é ser, outra coisa é pensar como 🙂
Cumps,
não tens de ter tirado engenharia para pensar como um engenheiro. eu sou engenheiro mas acho que o querer fazer, criar, desmontar, montar, resolver, reconstruir (ex. Lego), está no DNA… tires o curso ou não.
Já agora, muitos parabens Luis. O artigo está mesmo muito bom.
Em muitos projectos não é aconselhavel a todas as equipas conhecerem a fundo o big picture, nem a interface com o cliente. Em projetos grandes deve haver uma equipa independente para isso. As equipas mais tecnicas devem estar preocupadas com os problemas tecnicos (sem estar a desfazer, bem pelo contrário). É importante que haja uma visão mais operacional com o cliente e uma visão mais técnica na implementação. Mas não deixa de ser importante conhecer para o que se está a trabalhar.
sim. concordo. às vezes é utópico conhecer-se toda a big picture. mas deve tentar sair-se do cubículo técnico.
obrigado 🙂
Não!
muito bom o artigo.
onde fala em “projetos open source via GitHub”, existe alguma coisa assim mas em pt-pt? e rever o código em pt-pt?
parabéns Luís Soares
“porque estou curioso em experimentar”
Acho que se for um projeto pessoal, até é uma mais valia experimentar uma nova tecnologia porque estamos curiosos. Em ambiente profissional, obviamente que concordo que seja uma péssima forma de escolher a tecnologia a usar.
sim. eu num ponto abaixo defendo que se deve tentar aprender algo novo. mas acho que não se deve usar uma tecnologia só porque é nova ou por capricho de alguém. tem de haver argumentos lógicos (isto num ambiente profissional, claro)
Bom Dia gostaria de deixar aqui uma pergunta talvez no contexto deste artigo.
Tenho o seguinte problema como posso esconder ou atrapalhar o código para que da parte do cliente não consiga vasculhar o meu código? JavaScript
Obrigado
código JS vai sempre para o browser/utilizador. é impossível escondê-lo. o máximo que se pode fazer é: minification e obfuscation.
mas com um bocado de trabalho consegue-se sempre recuperar o original, embora os nomes das coisas se percam.
Obrigado 🙂
Excelente artigo com muito boas linhas orientadoras para todo e qualquer programador.
Digo todo, porque duvido que alguém no mundo real cumpra à regra todas as directrizes e “conselhos” sugeridos.
Metaforicamente falando parece uma daquelas receitas culinárias que vemos num desses programas de tv com aspeto delicioso mas que na tentativa de a replicar, ou não conhecemos 1 terço dos ingredientes, ou não temos dinheiro para comprar outro terço dos ingredientes(e por falar em terço, rezar não ajuda), ou se formos a cumprir à regra todos os passos morremos de fome antes de termos a comida na mesa.
Apesar de utópico, concordo com todos os pontos do artigo e em teoria há que cumprir estes ideais, na prática temos de arranjar shortcuts e ingredientes substitutos para no fim do dia termos que comer.
Eu percebo que a vontade de auto superação deveria constituir motivação suficiente para fazermos “bolos melhores” mas hoje em dia as empresas só pagam para ter o “bolo na caneca feito no microondas”.
Mas de programação não percebo nada, “eu é mais bolos”…
Parabéns pelo artigo.
Artigo sobre ser melhor programador e nada de Xcode? Objective-C? Swift?
Pensei que fossem essas as 3 soluções para todos os problemas do mundo!!!
😉
Acho que a melhor dica e que tento sempre incutir aos programadores mais juniores e’ esta:
Não aprendas tecnologias sem aprender conceitos: as tecnologias são efémeras: nascem, vivem e morrem; os conceitos ficam. Saber programar não é saber linguagens de programação.
E’ uma falha que encontro em muitos “programadores”, “engenheiros” tanto juniores como seniores.
Bom artigo!
Pedro
Excelente artigo!
Muitos Parabéns pelo excelente artigo. De facil leitura e muito preciso nos mais variados “temas” da programacao!
Excelente artigo, parabéns.
lol gostei da parte do gestor xD fez-me lembrar um artigo antigo que qualquer developer já deve ter lido ou senão leu deve ler aqui:
http://www.slideshare.net/josenaldomatos/programao-orientada-a-gambiarra-30097904
ahaha. adorei. vou tomar a liberdade de colocar link no artigo 😀
Força é sempre importante saber o que não se deve fazer. 😉
Um artigo muito bem estruturado sobre os paradigmas e dicotomias mais comuns em projectos tecnológicos.
Conselhos baseados no dia a dia que podem resultar ou não , mas vale a pena ter na cabeça na hora de tomada de decisões.
Obrigado http://luissoares.com/
Eu estou de acordo com a maior parte do post e todos nos temos sempre algo a melhorar.
Este post deixou-me a pensar na vida. Eu já fiz bastantes esforços para melhorar a qualidade do software que faço e até tenho bom feedback das duas pessoas que fazem codereview ao software que faço.
No entanto tenho de fazer este esforço todo para no final do mês levar 950 euros e com quase 5 anos de experiência!!! Está algo de errado nisto e desmotiva bastante saber que o esforço não compensa.
https://landing.jobs
🙂
Em: ” (no GIT, isto é um pull request).” é errado. Pull Requests são uma feature do Github (platforma/serviço) e não do Git (SCM)
Obrigado! Corrigido. Espero que tenhas gostado do artigo 🙂
Post verdadeiramente relevante para quem está na área de informática.
Creio que quem está nesta área deve ler e refletir sobre os vários aspetos apresentados.
Obrigado pela tua valiosa contribuição, Luís Soares
Na teoria e no mundo perfeito isto funciona, na pratica e por experiencia nem metade se aplica, se o cliente quer o cliente tem … se não te actualizas estas ultrapassado e o mercado nem te contrata, ja viram bem os perfis que pedem hoje em dia ? (Experiencia em A, B, C,D …. etc) No mundo em que existem frameworks novas todos os dias e que as empresas ( vulgo Consultoras ) andam sempre a caça de quem vista o que esta na moda e que seja um guru da progrmação desde o tempo antes dos mainframes… e depois como o RUI diz leva-se uma miseria para casa e um esgotamento.
Bom.. é um facto e percebo bem o teu comentário.. mas felizmente há muita oferta na nossa área. Quanto ao serem coisas utópicas, lembrei-me citar esta frase lamechas:
“Ideals are like stars; you will not succeed in touching them with your hands. But like the seafaring man on the desert of waters, you choose them as your guides, and following them you will reach your destiny.”
~Carl Schurz, address, Faneuil Hall, Boston, 1859
Excelente artigo. Muitos parabéns.
O melhor deste post é que se adequa perfeitamente a outras áreas laborais.
É difícil pensar em tudo isto no começo de um novo projeto, mas a experiência ajuda a evoluir este aspeto.
A experiência, humildade e facilitar são coisas que facilmente se descuram no trabalho em grupo.
Grande Post, inteligente e completo.
Excelente texto!
Só para dizer que a minha área de trabalho não tem NADA a ver com o que se está a tratar aqui, que não percebo metade dos conceitos referidos, mas… como por um lado gosto de aprender e por outro a minha profissão anda de mãos dadas com esse gosto (Lic. Ciências da Informação) li tudo e devo dizer que até para outras áreas se consegue “repescar” princípios essenciais como aquele bastante básico (mas que muita gente não lembra ou não quer lembrar: não reinventar a roda).
Não te vou elogiar Luís porque… não tenho capacidade 🙂