Programação Pragmática Kleber Silva, [email protected] 11/10/2005 Agenda Conceitos O Programador Pragmático Uma Abordagem Pragmática As Ferramentas Básicas A Paranóia Pragmática Dobre ou Quebre Antes da Implementação... Testes Conclusões Conceitos Criada por Andrew Hunt e David Thomas em 1999 Indica boas práticas de programação e alerta para as maiores armadilhas na área de desenvolvimento de software Principalmente voltada para o programador e para a equipe de programação O Programador Pragmático Adoção Cedo/Adaptação Rápida – Tem um traquejo para tecnologias e técnicas, e adora experimentar. Quando lhe é dado algo novo, pega com facilidade e integra com o resto de seu conhecimento. Sua confiança nasce da experiência. Inquisitivo – Tende a fazer perguntas. Isso está legal, como você fez? Você teve problemas com esta biblioteca? Pensador Crítico – Raramente aceita as coisas de pronto sem primeiro averiguar os fatos. Realista – Tenta entender a natureza oculta de cada problema enfrentado. Isso permite um “feeling” sobre o quão difícil as coisas são, ou quanto tempo vai se levar. Pau pra Toda a Obra. Esforça-se ao máximo para ter familiaridade com uma grande gama de tecnologias e ambientes, trabalha para acompanhar novos desenvolvimentos. Capaz de se mover para áreas novas, embora com foco especialista. O Programador Pragmático Dica 1: Preocupe-se com suas habilidades (expertise); Dica 2: Pense no seu trabalho; Dica 3: Dê opções, não venha com desculpas esfarrapadas (the cat ate my source code); Dica 4: Não viva com janelas quebradas; O Programador Pragmático Dica 5: Seja mudanças um catalisador A Sopa de Pedra de O Programador Pragmático Dica 6: Lembre-se do contexto global O Sapo Cozido O Programador Pragmático Dica 7: Faça da qualidade importante nos requisitos um ponto Good Enough Software Striving to better, oft we mar what´s well. King Lear 1.4 O Programador Pragmático Dica 8: Invista regularmente em seu portfólio de conhecimento Aprenda pelo menos uma nova linguagem a cada ano Leia um livro técnico a cada 4 meses Leia livros não técnicos também Participe em grupos de usuários locais Experimente diferentes ambientes Fique atualizado Antene-se O Programador Pragmático Dica 9: Analise com visão crítica o que você lê e o que você ouve Dica 10: É tanto o que você diz quanto a forma como diz Uma Abordagem Pragmática Os males da duplicação Dica 11: DRY – Don´t Repeat YourSelf Duplicação Imposta Múltiplas Representações de Informações (Uso de MetaDados) Documentação no Código Documentação e Código Issues de Linguagem- i.e. headers do C, C++ Duplicação por desatenção Ex: class Line { public: Point start; Point end; double length; }; ou class Line { public: Point start; Point end; double length() { return start.distanceTo(end); } }; Uma Abordagem Pragmática Os males da duplicação (continuação) Dica Duplicação por Impaciência 11: DRY – Don´t Repeat YourSelf “Shortcuts make for long delays” Duplicação Interdesenvolvedores Dica 12: Facilite o Reuso Uma Abordagem Pragmática Ortogonalidade Tipo de independência ou desacoplamento Uma Abordagem Pragmática Sistemas Não Ortogonais Uma Abordagem Pragmática Ortogonalidade Dica 13: Elimine o efeito entre coisas não relacionadas Produz ganhos de produtividade Facilita o Reuso Reduz Risco Aplicável a equipes de projeto Design Toolkits e ferramentas Uma Abordagem Pragmática Ortogonalidade Código Mantenha desacoplado Evite dados globais Evite funções similares Teste É facilitado Documentação Separação conteúdo e apresentação Uma Abordagem Pragmática Reversibilidade Tudo muda Dica 14: Não há decisões finais (irredutíveis) Arquitetura Flexível O gato de Schrodinger Uma Abordagem Pragmática Tracer Bullet Usado para construção de algo novo: i.e. tecnologias, técnicas, linguagens e algoritmos Dica 15: Use Tracer Bullets para encontrar o alvo Abordagem incremental Uma Abordagem Pragmática Tracer Bullet Vantagens Os usuários conseguem ver algo funcionando cedo Os desenvolvedores constroem uma estrutura para trabalhar Você tem uma plataforma de integração Você tem algo para demonstrar Você tem um maior sentimento de progresso Tracer Bullets vs Prototype Dica 16: Use Protótipos para aprender. Uma Abordagem Pragmática Linguagens do Domínio Estimativas Dica 17: Programe perto do Domínio do Problema Dica 18: Estime para evitar surpresas Qual o grau de acurácia necessário? Estimativas de Cronograma de Projeto “The normal rules of estimating can break down in the face of the complexities and vagaries of a sizable application development. We find that often the only way to determine the timetable for a project is by gaining experience on that same project.”, The Pragmatic Programmer Dica 19: Itere o cronograma com o código As Ferramentas Básicas Dica 20: Mantenha o Conhecimento em Plain Text Dica 21: Use o poder dos Command Shells Dica 22: Use bem um único editor Dica 23: Sempre use Controle de Versão de Código Fonte Dica 24: Fixe-se no problema, não nos culpados Dica 25: Não entre em pânico Dica 26: o "select" não está “buggado” Dica 27: Não assuma – prove Dica 28: Aprenda uma Linguagem de Manipulação As Ferramentas Básicas Geradores de Código – Uma única vez Ativo – Toma uma representação e converte em código. Quando a representação muda, novo código é gerado Dica 29: Escreva código que escreva código Passivo A Paranóia Pragmática Dica 30: Você não pode escrever software perfeito Dica 31: Design with Contracts (DBC) O Programador Pragmático desconfia de si próprio. Précondições Póscondições Invariantes de classe Dica 32: Crash Early Dica 33: Se não pode acontecer. Use Assertions pra garantir que não vai. Dica 34: Use exceções para casos excepcionais Dica 35: Termine o que você começou. (C++ new, delete) Dobre ou Quebre Desacoplamento e a Lei de Demeter Dica 36: Minimize o acoplamento entre módulos Dobre ou Quebre Design para concorrência, para serviços Separar Views de Modelos (MVC) Programação por coincidência Refactoring Wizards Com uso de ferramentas (automático) Não use se você não entende o código produzido!! Design para testes Foco em testes Antes da Implementação... Levantamento de Requisitos Trabalhe com o usuário para pensar como ele Dicionário de dados em reuniões com usuários Especificação de mini-linguagem Use Cases Documentação formal ou informal? Poucos detalhes Template para caso de uso - Cockburn Template 1. CHARACTERISTIC INFORMATION Goal in context Scope Level Preconditions Success end condition Failed end condition Primary actor Trigger Template 2. MAIN SUCCESS SCENARIO 3. EXTENSIONS 4.VARIATIONS 5. SCHEDULE 6. OPEN ISSUES Template 8.RELATED INFORMATION Priority Performance target Frequency Superordinate use case Subordinate use cases Channel to primary actor Secondary actor Channel to secondary actor Template Testes Unitários Integração Validação e Verificação Dados Regressão Testes de Performance Testes de Usabilidade Teste os testes!!! Cause bugs Conclusão Não é só teoria, e sim uma abordagem da experiência que normalmente dá certo na área de desenvolvimento; Serve não somente para os programadores, mas também para a gerência dos projetos que se beneficia do conhecimento do que se deve fazer e do que deve ser evitado Promove um ganho de produtividade aos desenvolvedores Promove um maior nível de formalidade no levantamento de requisitos através do uso de templates específicos Metodologia com enfoque nos testes e no design. Referências Andrew Hunt, David Thomas, The Pragmatic Programmer, Addison-Wesley, 2000 www.pragmaticprogrammer.com Dúvidas ???