Potencializando a qualidade de código

60
Maykel S. Braz http://about.me/ maykelsantosbraz POTENCIALIZANDO A QUALIDADE DE CÓDIGO Padrões, princípios e ferramentas

Transcript of Potencializando a qualidade de código

Page 1: Potencializando a qualidade de código

Maykel S. Brazhttp://about.me/maykelsantosbraz

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Padrões, princípios e ferramentas

Page 2: Potencializando a qualidade de código

SUMÁRIO

• Definição• Princípios• Padrões de codificação• QA Tools• Profile• Dicas gerais

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Let me cast some light in our path

Page 3: Potencializando a qualidade de código

O QUE É QUALIDADE?Ou, como ela é percebida, visualizada, e/ou medida?

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Page 4: Potencializando a qualidade de código

A QUALIDADE ESTÁ RELACIONADA À ÓTICA

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Analista• Atende os requisitos

Infraestrutura• Robusto

Programador• Intuitivo / Fácil leitura e manutenção

Empresa• Lucrativo

Cliente• Correto

Gestor• Dentro do prazo

freepik.com

Page 5: Potencializando a qualidade de código

MAS O TRABALHO É TODO SEU

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Com grandes poderes, vêm grandes responsabilidades

freepik.com

Page 6: Potencializando a qualidade de código

COMO SE MEDE A QUALIDADE?

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Enquanto isso, na sala de review...

Page 7: Potencializando a qualidade de código

ANÁLISE ESTÁTICA & ANÁLISE DINÂMICA

Análise estática• Baseada na estrutura• Sem rodar o app• Coleta de estatísticas• Requer avaliação ponderada

Análise dinâmica• Baseada no comportamento• Rodando o app• Situações pré-programadas• Rápida avaliação

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Static analysis & Dinamic analysis

http://feaforall.com/wp-content/uploads/2013/04/1.jpg

Page 8: Potencializando a qualidade de código

Extensibilidade(Extensibility)

Corretude(Correctness)

Reusabilidade(Reusability)

Manutenabilidade(Maintainability)

QUALIDADE

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Qualidade

Page 9: Potencializando a qualidade de código

PRINCÍPIOS DE DESIGN DE SOFTWARE

Diretrizes para se considerar ao / antes de codificar

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Page 10: Potencializando a qualidade de código

PRINCÍPIOS DE DESIGN DE SOFTWARE

• Reuso de experiência;• Recomendações do que deve ser feito;• Recomendações do que deve ser evitado.

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

KISS YAGNI STUPIDDRY SOLID

Page 11: Potencializando a qualidade de código

KISS

• Preza pela simplicidade• Fácil de entender e manter• Menos suscetível a erros• Parece simplista ou “chato”• Simplificação de problemas

PRINCÍPIOS DE DESIGN DE SOFTWARE

“Uma solução simples é melhor que uma complexa, mesmo que ela pareça estúpida.”

“Faça de forma simples, mas nãomais simples que o necessário.”

M REC

Page 12: Potencializando a qualidade de código

DRY• Reduzir a repetição de

informações• Mitigar contradições• Métodos e sub-rotinas• Não inclui apenas código• Fonte única de conhecimento

– Geradores– Automatizadores

Reduz o acomplamento (coupling)

PRINCÍPIOS DE DESIGN DE SOFTWARE

“Cada parte do conhecimento deve ter uma origem única e sem ambiguidade.”

M REC

Page 13: Potencializando a qualidade de código

YAGNI• Associado a XP• Refatoração contínua• Requisitos bem definidos• Custo de implementação

– Barato agora e barato depois? Deixe pra depois.

– Barato agora e caro depois? Faça agora.

• Redução de bugs

PRINCÍPIOS DE DESIGN DE SOFTWARE

“Implemente quando você realmente precisar, e não quando acha que vai precisar.”

M REC

Page 14: Potencializando a qualidade de código

STUPID X SOLID

• Ambos definem um conjunto de princípios;• STUPID: Evite problemas no seu código;• SOLID: Boas práticas para melhorar seu

código.

PRINCÍPIOS DE DESIGN DE SOFTWARE

O que fazer e o não fazer quando estiver codificando

STUPID SOLID

Page 15: Potencializando a qualidade de código

STUPID

• Singleton• Tight Coupling• Untestability• Premature Optimization• Indescriptive Naming• Duplication

• Difíceis de testar;• Escondem dependências;• Tight coupling.

PRINCÍPIOS DE DESIGN DE SOFTWARE

Só pode haver um

Page 16: Potencializando a qualidade de código

STUPID• Singleton

• Tight Coupling• Untestability• Premature Optimization• Indescriptive Naming• Duplication

• Duplicação de código;• Código de um módulo

utilizando código de outro;• Dependências circulares;• Dependências

descontroladas.

PRINCÍPIOS DE DESIGN DE SOFTWARE

Assim como o mar, onde uma única gota desencadeia uma reação sem proporções

http://martinfowler.com/ieeeSoftware/coupling.pdf

Page 17: Potencializando a qualidade de código

STUPID• Singleton• Tight Coupling

• Untestability• Premature Optimization• Indescriptive Naming• Duplication

• Singleton;• Tight Coupling;• Acúmulo de

responsabilidades.

PRINCÍPIOS DE DESIGN DE SOFTWARE

I find your lack of tests disturbing

Page 18: Potencializando a qualidade de código

STUPID• Singleton• Tight Coupling• Untestability

• Premature Optimization• Indescriptive Naming• Duplication

• 97% do tempo você estará otimizando o lugar errado do código;

• Prejudica a legibilidade;• Aumenta a complexidade;• Possibilidade de introdução

de bugs.

PRINCÍPIOS DE DESIGN DE SOFTWARE

Premature optimization is the root of all evil

Page 19: Potencializando a qualidade de código

STUPID• Singleton• Tight Coupling• Untestability• Premature Optimization

• Indescriptive Naming• Duplication

• Abreviações;• Nomes não

contextualizados;• Baixa legibilidade.

PRINCÍPIOS DE DESIGN DE SOFTWARE

fazABagacaToda($deonde = ‘comeco’);

Page 20: Potencializando a qualidade de código

STUPID• Singleton• Tight Coupling• Untestability• Premature Optimization• Indescriptive Naming

• Duplication

• Mais tempo de manutenção;

• Baixa corretude;• Contradições.

PRINCÍPIOS DE DESIGN DE SOFTWARE

Qual devo usar? Util::limpaTexto() ou Texto::limpa()?

Page 21: Potencializando a qualidade de código

SOLID

• Single Responsibility• Open/Closed• Liskov Substitution• Interface Segregation• Dependency Inversion

PRINCÍPIOS DE DESIGN DE SOFTWARE

Olha pai, é um videocassete com tv, ou uma tv com videocassete?

• Classes, métodos e funções com uma única responsabilidade;

• Cuidado com God Classes.

Page 22: Potencializando a qualidade de código

SOLID• Single Responsibility

• Open/Closed• Liskov Substitution• Interface Segregation• Dependency Inversion

PRINCÍPIOS DE DESIGN DE SOFTWARE

Software entities should be open for extension, but closed for modifications

• Polimorfismo– Tipos concretos

• Interfaces / Classes abstratas– Tipos abstratos

https://en.wikipedia.org/wiki/Subtyping

Pássaro

Pato Cuco Avestruz

Page 23: Potencializando a qualidade de código

Pássaro

Pato Cuco Avestruz

SOLID• Single Responsibility• Open/Closed

• Liskov Substitution• Interface Segregation• Dependency Inversion

PRINCÍPIOS DE DESIGN DE SOFTWARE

Objetos podem ser substituídos por seus subtipos sem alterar a corretude do programa

• Subtipo comportamental– Precondições;– Pós condições.

https://en.wikipedia.org/wiki/Subtyping

Page 24: Potencializando a qualidade de código

SOLID• Single Responsibility• Open/Closed• Liskov Substitution

• Interface Segregation• Dependency Inversion

PRINCÍPIOS DE DESIGN DE SOFTWARE

Várias interfaces específicas são melhores que uma interface geral

• Propósito bem definido;• Implemente apenas os

métodos que irá utilizar;• Diminui a acoplagem;• Aumenta a coesão.

Page 25: Potencializando a qualidade de código

INTERFACE SEGREGATION

PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID

Page 26: Potencializando a qualidade de código

INTERFACE SEGREGATION

PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID

Page 27: Potencializando a qualidade de código

SOLID• Single Responsibility• Open/Closed• Liskov Substitution• Interface Segregation

• Dependency Inversion

PRINCÍPIOS DE DESIGN DE SOFTWARE

O que realmente importa é a necessidade, e não o comportamento

• Módulos de níveis não devem apresentar dependência entre si, ambos devem depender de abstrações;

• Abstrações não devem depender de detalhes;

• Detalhes devem depender da abstração.

https://en.wikipedia.org/wiki/Dependency_inversion_principle

Page 28: Potencializando a qualidade de código

DEPENDENCY INVERSION

PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID

Page 29: Potencializando a qualidade de código

DEPENDENCY INVERSION

PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID

Page 30: Potencializando a qualidade de código

DEPENDENCY INVERSION

Page 31: Potencializando a qualidade de código

PADRÕES DE CODIFICAÇÃOA resposta da velha pergunta: “Coloco a chave na frente ou embaixo?”

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

Page 32: Potencializando a qualidade de código

PADRÕES PHP-FIG

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

PSR: PHP Standard Recommendation

• PSR-1: Basic Code Standard• PSR-2: Coding Style Guide• PSR-3: Logger Interface• PSR-4: Autoloading

Standard• PSR-6: Caching Interface• PSR-7: HTTP Message

Interface

Page 33: Potencializando a qualidade de código

PSR-1 & PSR-2• Série de regras de formatação

de código– Conteúdo de arquivos– Funções– Classes– Métodos– Namespaces– Visibilidade– Tamanho de linha– Endentação– Modificadores– Estruturas– ...

PADRÕES PHP-FIG

Base Code Standard & Coding Style Guide

No more!

Page 34: Potencializando a qualidade de código

PSR FORMATEREditor/IDE Suporte URL

Netbeans Config https://github.com/bobsta63/netbeans-psr-formattingEclipse Nativo -

PHPStorm Nativo -

Sublime Config https://github.com/phpfmt/sublime-phpfmt

Zend Studio Nativo/Config https://github.com/netojoaobatista/PSR-2

Page 35: Potencializando a qualidade de código

QA TOOLSGestão da qualidade

Page 36: Potencializando a qualidade de código

PHPQA

POTENCIALIZANDO A QUALIDADE DE CÓDIGO

The PHP Quality Assurance Toolchain

PHPUnit+

vfsStreamPHPLoc Behat

PHP_Depend

PHPMess Detector PHP_CodeSniffer

PHP Copy/PasteDetector

PHPDoxPHPMetrics

Page 37: Potencializando a qualidade de código

PHP DEPEND

• Métricas do código– Indicadores de qualidade– Refatoração

QA TOOLS >> PHPQA

https://pdepend.org/

Output é complicado e maçante

Page 38: Potencializando a qualidade de código

PHP MESS DETECTOR• Bugs• Código subotimizado• Expressões

supercomplicadas• Código não utilizado• Regras de design• Regras de nomenclatura

QA TOOLS >> PHPQA

https://phpmd.org/

Page 39: Potencializando a qualidade de código

PHP_CODESNIFFER

• Violação de regras de codificação– PHP– Javascript– CSS

QA TOOLS >> PHPQA

http://pear.php.net/PHP_CodeSniffer

Page 40: Potencializando a qualidade de código

PHP COPY/PASTE DETECTOR

• Duplicidade de código

QA TOOLS >> PHPQA

https://github.com/sebastianbergmann/phpcpd

Page 41: Potencializando a qualidade de código

PHPDOX

• Documentação de API• Info de fontes externas

QA TOOLS >> PHPQA

http://phpdox.de/

PHPUnit

PHPMD

PHPCS

PHPDox

PHPLOC

GIT

Page 42: Potencializando a qualidade de código

PHPDOX

QA TOOLS >> PHPQA

http://phpdox.de/

Page 43: Potencializando a qualidade de código

PHPDOX

QA TOOLS >> PHPQA

http://phpdox.de/

Page 44: Potencializando a qualidade de código

PHPMETRICS

• Métricas de código– Indicadores de qualidade

• Geração de relatórios– Qualidade– Complexidade– Manutenabilidade

QA TOOLS >> PHPQA

http://www.phpmetrics.org/

Page 45: Potencializando a qualidade de código

QA TOOLS >> PHPQA >> PHPMETRICS

Page 46: Potencializando a qualidade de código

INTEGRAÇÃO CONTÍNUA

• Incorporação no build– Testes unitários– Documentação– Análise estática

• Aumento legibilidade• Clareza– Helicopter view– Quality Gate– Technical debt

QA TOOLS >> CI

Colocando tudo no mesmo balaio e melhorando a legibilidade

Jenkins

PHPQA

Sonar Qube

Page 47: Potencializando a qualidade de código

SONAR QUBE

QA TOOLS

https://nemo.sonarqube.org/

Page 48: Potencializando a qualidade de código

SONAR QUBE

QA TOOLS

Page 49: Potencializando a qualidade de código

PROFILING

- Não otimize agora.- Ainda não!- Agora sim, vamos lá.- Mas antes disso, já rodou o profiler?

Page 50: Potencializando a qualidade de código

PROFILE

• Identificar bottlenecks• Otimização direcionada• Evita degradação de

performance

PROFILING

Tio, e agora, já posso começar a otimizar meu código?

http://weblogs.asp.net/craigshoemaker/asp-net-caching-and-performance

Page 51: Potencializando a qualidade de código

XDEBUG + $VIEWER

• Profile• Code coverage• Remote debugging• Function trace

• Webgrind– https://github.com/jokkedk/webgrind

• Xdebug trace explorer– https://github.com/corretge/xdebug-trace-gui

• KCacheGrind– https://kcachegrind.github.io/html/Home.html

PROFILING

X-debug ao resgate

Execução não recomendada em produção

Page 52: Potencializando a qualidade de código

KCACHEGRIND

PROFILING >> XDEBUG

https://kcachegrind.github.io/html/Home.html

Page 53: Potencializando a qualidade de código

SYMFONY WEBDEBUG TOOLBAR

PROFILING

Page 54: Potencializando a qualidade de código

ZEND Z-RAY

PROFILING

Page 55: Potencializando a qualidade de código

LARAVEL DEBUGBAR

PROFILING

https://github.com/barryvdh/laravel-debugbar

Page 56: Potencializando a qualidade de código

DICAS GERAIS

Page 57: Potencializando a qualidade de código

DICAS #1

• Comentários• Ler a documentação• Projetos open source• Responsabilidade única• Entender o que está fazendo• Utilizar frameworks

Page 58: Potencializando a qualidade de código

DICAS #2

• Conhecer suas tools• Manter-se atualizado• Reuniões de nivelamento• Usar o bom senso• Pensar antes de codificar

http://www.skorks.com/page/3/

Page 59: Potencializando a qualidade de código

PERGUNTAS?

DC Comics

[email protected]

about.me/maykelsantosbraz

Contato

Page 60: Potencializando a qualidade de código

REFERÊNCIAS http://principles-wiki.net/ https://en.wikipedia.org/wiki/KISS_principle https://effectivesoftwaredesign.com/2013/02/07/on-de

veloper-wisdom-and-software-quality-attributes/

www.cin.ufpe.br/~if718/referencias/qualidade.ppt http://www.artima.com/intv/dry.html http://c2.com/cgi/wiki?DontRepeatYourself http://seiti.eti.br/kiss-yagni-e-dry/ https://www.youtube.com/watch?v=LnPl04fYtcs http://williamdurand.fr/2013/07/30/from-stupid-to-soli

d-code/

http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/

http://programmers.stackexchange.com/questions/40373/so-singletons-are-bad-then-what

http://martinfowler.com/ieeeSoftware/coupling.pdf https://sourcemaking.com/refactoring/smells https://speakerdeck.com/miccheng/continuous-integra

tion-for-php-with-jenkins-and-sonar

http://simpleprogrammer.com/2012/05/27/types-of-duplication-in-code/

http://c2.com/cgi/wiki http://www.oodesign.com/liskov-s-substitution-

principle.html http://noviciateinitiate.blogspot.com.br/2014/01/th

e-solid-principles-of-design-part-4.html

https://en.wikipedia.org/wiki/Dependency_inversion_principle

http://aspiringcraftsman.com/2008/12/28/examining-dependency-inversion/

http://martinfowler.com/articles/dipInTheWild.html https://www.42lines.net/2012/07/06/clean-code-re

ducing-wtfs-per-minute/

http://pt.slideshare.net/nethisip13/quality-control-45498380

https://www.42lines.net/2012/07/06/clean-code-reducing-wtfs-per-minute/

http://erichogue.ca/2011/03/linux/profiling-a-php-application/

POTENCIALIZANDO A QUALIDADE DE CÓDIGO