SlideShare uma empresa Scribd logo
Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br




Introdução ao Clean Code
Clean Code
@rodrigobranas
  rodrigo.branas@gmail.com
 http://www.agilecode.com.br
Formação Acadêmica
Ciências da Computação – UFSC
Gerenciamento de Projetos - FGV

Certificações

SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
Rodrigo Branas – rodrigo.branas@gmail.com
10 anos de experiência na plataforma Java
1000 horas em sala de aula
Mais de 50 palestras em eventos

Líder da área de desenvolvimento na Gennera
Autor da revista Java Magazine
Palestrante
Instrutor da Academia Java e Agile da Globalcode
Criador dos treinamentos de Clean Code, Selenium e
Maven da Agile Code

Trabalhou com as empresas:
EDS, HP, GM, Citibank, OnCast, Globalcode, V.Office, Dígitr
o, Softplan, Unimed, Suntech, Vale do Rio
O conteúdo deste treinamento vai
 afetar na sua zona de conforto
Sobre o que vamos falar?
Profissionalismo e Felicidade!
Clean Code
Insatisfação com o fracasso!
Clean Code
Existe diferença?
Insatisfação com o trabalho
Você se sente profissional?
Você se sente profissional?
Você se sente profissional?
Poderia ser mais produtivo?
Sensação de impotência
Se sente sempre fazendo um
trabalho braçal e desgastante?
Qual é a diferença entre cansaço
            e stress?
Já teve vontade de largar tudo?
O que mais motiva um
   desenvolvedor?
“Quem trabalha apenas pelo
salário, ganhe o que for, será
      sempre mal pago.”

       (Autor desconhecido)
Clean Code
Clean Code
Clean Code
“Qual é a sua obra? Quando
 você se for, o vai restar?”

        (Mario Cortella)
Afinal, quanto custa a bagunça
        para a empresa?
Alta rotatividade
Demora no lançamento de novas
       funcionalidades
Dificuldade na hora de realizar
    qualquer modificação...
Alta incidência de bugs?
Quanto custa a falta de
confiança do seu cliente?
Quanto tempo você perde
tentando entender o código para
       corrigir um bug?
Conclusão: Passamos a maior
parte do tempo lendo o código!
Evolução da Produtividade




                Uncle Bob – Robert C. Martin
Debate: Dois programadores são
 mais produtivos que um? (Pair)
O que é Clean Code?
Clean Code
Você teria medo de tomar o
          remédio?
Código feito com cuidado
Que revela suas intenções
Simples
Fácil de entender
“Qualquer tolo consegue escrever
código que um computador entenda.
Bons programadores escrevem código
   que humanos possam entender.”

           (Martin Fowler)
Funcionar é o mínimo que se
          espera.
Qualidade Externa x Interna
Qualidade externa é aquela que
 você percebe logo de cara. Se a
usabilidade da interface for ruim, a
performance for sofrível e defeitos
  acontecem com frequência, a
  pessoa logo percebe e sequer
        compra o software.
Qualidade interna é aquela que
  você só percebe com o tempo.
Infelizmente o comercial não vende
     esse tipo de qualidade. No
entanto, é ela que atrasa o negócio
       e mata a empresa aos
   poucos, sufoca e aumenta os
custos. É ela que gera boa parte da
            rotatividade.
Como medir a qualidade do
       código?
Linhas de código?
Número de métodos?
Número de classes?
Linhas de código por método?
Complexidade ciclomática?
Número de estruturas de decisão?



                           ?
Clean Code
Clean Code
WTF?
WTF?


WTF?
WTF?


WTF?



WTF?


WTF?
Clean Code
Dificuldade para entender
Nível máximo de sujeira
Clean Code
Debate: Até que ponto vale a
pena continuar mantendo um
       projeto vivo?
Falar é fácil!
O desafio é criar código de
        qualidade!
No entanto, falar é o primeiro
  passo rumo a melhoria!
Quatro estágios necessários para
     adquirir novos hábitos
Estágio 1

“Inconsciente e sem habilidade”

 Ignoramos o comportamento
         e o hábito
Estágio 2

“Consciente e sem habilidade”

Conhecemos o comportamento
mas ainda não temos o hábito
        de aplicá-lo”
Estágio 3

  “Consciente e habilidoso”

Nos sentimos confortáveis com
    pela prática que vamos
   adquirindo com o tempo
Estágio 4

“Inconsciente e habilidoso”

O hábito se torna uma coisa
          natural
Escrever código limpo requer
 muita prática e habilidade!
Começando a treinar
Nomes estranhos
Limitação histórica
1.   READ INPUT TAPE A1, B1, C1;
2.   501 FORMAT A1;
3.   IF (A1) 777, 777, 777
4.   IF (B1) 888, 888, 888
5.   IF (C1) 999, 999, 999
6.   STOP 1
7.   799 S = FLOATF(A1 + B1 + C1) / 2.0
8.   WRITE TO TAPE S
9.   END PROCESS
As linguagens não ajudavam
Os ambientes não ajudavam
Os computadores não ajudavam
Recebendo a herança maldita!
Aprendendo com os mestres
1.   // Descrição da maquina
2.   String m_desc;
3.   // Resultado parcial da soma
4.   int s1;
5.   // Cor dos olhos
6.   String cOlhos;
7.   // Valor do índice temporário
8.   int aux;
Revelando a intenção
1.   // Descrição da maquina
2.   String m_desc;
3.   // Resultado parcial da soma
4.   int s1;
5.   // Cor dos olhos
6.   String cOlhos;
7.   // Valor do índice temporário
8.   int aux;
1.   // Descrição da maquina
2.   String descricaoDaMaquina;
3.   // Resultado parcial da soma
4.   int resultadoParcialSoma;
5.   // Cor dos olhos
6.   String corDosOlhos;
7.   // Valor do índice temporário
8.   int valorDoIndiceTemporario;
1.
2.   String descricaoDaMaquina;
3.
4.   int resultadoParcialSoma;
5.
6.   String corDosOlhos;
7.
8.   int valorDoIndiceTemporario;
1.   String descricaoDaMaquina;
2.   int resultadoParcialSoma;
3.   String corDosOlhos;
4.   int valorDoIndiceTemporario;
Não seja genérico
1.   // Processa folha de pagamento
2.   void processa();
3.   // Calcula o imposto de renda ret.
4.   void calcula();
5.   // Renderiza o relatório de alunos
6.   void renderiza();
7.   // Totaliza as estatísticas da ligação
8. void totaliza();
1.   // Processa folha de pagamento
2.   void processaFolhaPagamento();
3.   // Calcula o imposto de renda ret.
4.   void calculaImpostoRetido();
5.   // Renderiza o relatório de alunos
6.   void renderizaRelatorioAlunos();
7.   // Totaliza as estatísticas da ligação
8. void totalizaEstatisticasLigacao();
1.
2. void processaFolhaPagamento();
3.
4. void calculaImpostoRetido();
5.
6. void renderizaRelatorioAlunos();
7.
8. void totalizaEstatisticasLigacao();
1.   void processaFolhaPagamento();
2.   void calculaImpostoRetido();
3.   void renderizaRelatorioAlunos();
4.   void totalizaEstatisticasLigacao();
Simplificando estruturas de
          decisão
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (hora > 22:00 || hora < 06:00) {
5.           return distancia * 3.90;
6.        } else {
7.           return distancia * 2.10;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if () {
5.           return distancia * 3.90;
6.        } else {
7.           return distancia * 2.10;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia * 3.90;
6.        } else {
7.           return distancia * 2.10;
8.        }
9.    }
10.   ...
1.    ...
2.    double calculaValorDaCorrida() {
3.        if (ehBandeiraDois()) {
4.           return distancia * 3.90;
5.        } else {
6.           return distancia * 2.10;
7.        }
8.    boolean ehBandeiraDois() {
9.     return hora > 22:00 || hora < 06:00;
10.   }
11.   ...
Magic numbers
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia * 3.90;
6.        } else {
7.           return distancia * 2.10;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia *;
6.        } else {
7.           return distancia *;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia * PRECO_B_2;
6.        } else {
7.           return distancia * PRECO_B_1;
8.        }
9.    }
10.   ...
1.    class Taximetro {
2.    ...
3.    double calculaValorDaCorrida() {
4.        if (ehBandeiraDois()) {
5.           return distancia * PRECO_BANDEIRA_2;
6.        } else {
7.           return distancia * PRECO_BANDEIRA_1;
8.        }
9.    }
10.   ...
Saindo do labirinto
1. double calculaValorDaCorrida() {
2.   if (hora > 22:00 || hora < 06:00) {
3.      return distancia * 3.90;
4.   } else {
5.       if (diaDaSemana eq Domingo) {
6.          return distancia * 2.9;
7.       else {
8.          return distancia * 2.10;
9.       }
10. }
Distância da margem
1. double calculaValorDaCorrida() {
2.   if (hora > 22:00 || hora < 06:00) {
3.      return distancia * 3.90;
4.   } else {
5.       if (diaDaSemana eq Domingo) {
6.          return distancia * 2.9;
7.       } else {
8.          return distancia * 2.10;
9.       }
10. }
1. double calculaValorDaCorrida() {
2.   if () {
3.      return distancia * 3.90;
4.   } else {
5.       if () {
6.           return distancia * 2.9;
7.       } else {
8.           return distancia * 2.10;
9.       }
10. }
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   } else {
5.       if (ehHorarioDeDomingo()) {
6.          return distancia * 2.9;
7.       } else {
8.          return distancia * 2.10;
9.       }
10. }
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.       if (ehHorarioDeDomingo()) {
6.          return distancia * 2.9;
7.       } else {
8.          return distancia * 2.10;
9.       }
10.
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * 2.9;
7.   } else {
8.      return distancia * 2.10;
9.   }
10.
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * 2.9;
7.   }
8.      return distancia * 2.10;
9.
10.
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * 2.9;
7.   }
8.   return distancia * 2.10;
9.
10.
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * 3.90;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * 2.9;
7.   }
8.   return distancia * 2.10;
9. }
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia *;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia *;
7.   }
8.   return distancia *;
9. }
1. double calculaValorDaCorrida() {
2.   if (ehBandeiraDois()) {
3.      return distancia * PRECO_BANDEIRA_2;
4.   }
5.   if (ehHorarioDeDomingo()) {
6.      return distancia * PRECO_DE_DOMINGO;
7.   }
8.   return distancia * PRECO_BANDEIRA_1;
9. }
Medo de estragar algo?
Test-Driven Development
Economize, teste mais cedo!
Ferramentas – Hudson + Sonar
Clean Code

Mais conteúdo relacionado

PPTX
Técnicas de Refactorización (EN ESPANOL)
PPTX
Criando serviços com AngularJS
PDF
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
PPTX
Técnicas de Refactoring
PPTX
HTTP, JSON, REST e AJAX com AngularJS
PDF
Node.js - #6 - Core Modules - net - Rodrigo Branas
PPTX
Automação de Testes com AngularJS
PPT
Aula javascript
Técnicas de Refactorización (EN ESPANOL)
Criando serviços com AngularJS
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Técnicas de Refactoring
HTTP, JSON, REST e AJAX com AngularJS
Node.js - #6 - Core Modules - net - Rodrigo Branas
Automação de Testes com AngularJS
Aula javascript

Mais procurados (20)

PPTX
Construindo Diretivas com AngularJS
PDF
Java script aula 08 - formulários
PDF
Javascript aula 01 - visão geral
PDF
Java script aula 02 - operadores
PDF
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
PDF
As novidades do PHP5 (2005)
PPT
(Portuguese) Java EE Poliglota
PPTX
Tutorial JavaFX simples
PPTX
AngularJS - 10 passos para aprender a criar suas directivas
PDF
Java script aula 10 - angularjs
PDF
JavaScript
PDF
Java script aula 05 - funções
PPTX
A evolução do AngularJS
PPT
Tutorial Dwr - Configuração e Uso
PDF
Começando com Zend Framework 2
ODP
Groovy grails
PDF
T11_LM3: Subalgoritmose colisões (2013-2014)
PDF
Java script - funções
PDF
Zend Framework 1.11
PDF
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
Construindo Diretivas com AngularJS
Java script aula 08 - formulários
Javascript aula 01 - visão geral
Java script aula 02 - operadores
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
As novidades do PHP5 (2005)
(Portuguese) Java EE Poliglota
Tutorial JavaFX simples
AngularJS - 10 passos para aprender a criar suas directivas
Java script aula 10 - angularjs
JavaScript
Java script aula 05 - funções
A evolução do AngularJS
Tutorial Dwr - Configuração e Uso
Começando com Zend Framework 2
Groovy grails
T11_LM3: Subalgoritmose colisões (2013-2014)
Java script - funções
Zend Framework 1.11
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
Anúncio

Destaque (19)

PPTX
Refactoring
PDF
Vamos falar de Clean Code, Refatoração e TDD
PPTX
Testes Automatizados
PPTX
Desvendando os mistérios do Charset
PPTX
Apresentação Clean Code
PPTX
Clean Code (Robert C. Martin)
PPTX
Clean code - Mantenha seu código limpo
PPTX
Maven em 10 minutos
PPTX
Code Smells
PPTX
Clean Code
PPTX
Test-Driven Development com JavaScript, Jasmine Karma
PPTX
XP - Extreme Programming
PPTX
Selenium - WebDriver
PDF
PHP para Adultos: Clean Code e Object Calisthenics
PPTX
Evoluindo a arquitetura de uma aplicação com AngularJS
PPTX
Acelerando projetos de software com Scrum e Extreme Programming
PPT
Clean Code summary
PPTX
Boas práticas técnica para um código limpo (Clean Code)
PDF
Clean code
Refactoring
Vamos falar de Clean Code, Refatoração e TDD
Testes Automatizados
Desvendando os mistérios do Charset
Apresentação Clean Code
Clean Code (Robert C. Martin)
Clean code - Mantenha seu código limpo
Maven em 10 minutos
Code Smells
Clean Code
Test-Driven Development com JavaScript, Jasmine Karma
XP - Extreme Programming
Selenium - WebDriver
PHP para Adultos: Clean Code e Object Calisthenics
Evoluindo a arquitetura de uma aplicação com AngularJS
Acelerando projetos de software com Scrum e Extreme Programming
Clean Code summary
Boas práticas técnica para um código limpo (Clean Code)
Clean code
Anúncio

Semelhante a Clean Code (20)

PPSX
TDD e Clean Code
DOC
Pg sem3-1505102
DOC
Pg sem3ex
PDF
Universidade do Porto Introdução à linguagem Java
ZIP
Relato Sobre a Migração de uma Aplicação Legada para Rails
PDF
Criando Webservice REST com NodeJS, NoSQL & Docker
KEY
Programação Orientada a Testes
ODP
Clean code
PDF
Apostila Calculo II - UDESC.pdf
PDF
Test-driven Development
PDF
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
PDF
VisualG Curso_Basico_manual do aluno____
PDF
Lógica de Programação - Unimep/Pronatec - Aula04
PDF
Codificação segura em C para sistemas embarcados
PPT
Mock Objects
PDF
Principais conceitos e técnicas em vetorização
PDF
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
PDF
Refatoração de código com Capitão Nascimento versão completa
PDF
Cacheamento Lado Servidor
PDF
Robustez de Software - Como ouvir menos reclamações dos seus chefes
TDD e Clean Code
Pg sem3-1505102
Pg sem3ex
Universidade do Porto Introdução à linguagem Java
Relato Sobre a Migração de uma Aplicação Legada para Rails
Criando Webservice REST com NodeJS, NoSQL & Docker
Programação Orientada a Testes
Clean code
Apostila Calculo II - UDESC.pdf
Test-driven Development
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
VisualG Curso_Basico_manual do aluno____
Lógica de Programação - Unimep/Pronatec - Aula04
Codificação segura em C para sistemas embarcados
Mock Objects
Principais conceitos e técnicas em vetorização
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Refatoração de código com Capitão Nascimento versão completa
Cacheamento Lado Servidor
Robustez de Software - Como ouvir menos reclamações dos seus chefes

Mais de Rodrigo Branas (20)

PDF
Clean Architecture
PDF
Node.js - #5 - Process - Rodrigo Branas
PDF
Node.js - #4 - Timers - Rodrigo Branas
PDF
Node.js - #3 - Global Objects - Rodrigo Branas
PDF
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
PDF
Node.js - #1 - Introdução - Rodrigo Branas
PDF
#6 - Git - Desfazendo as coisas
PDF
#1 - Git - Introdução
PDF
#5 - Git - Contribuindo com um repositório remoto
PDF
#4 - Git - Stash
PDF
#3 - Git - Branching e Merging
PDF
#2 - Git - DAG
PPTX
JavaScript - Date
PPTX
JavaScript - Expressões Regulares
PPTX
Scope AngularJS
PDF
HTTP Interceptors com AngularJS
PPTX
Criando Filtros com AngularJS
PPTX
Criando aplicações Single-Page com AngularJS
PPTX
PPTX
Clean Architecture
Node.js - #5 - Process - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
#6 - Git - Desfazendo as coisas
#1 - Git - Introdução
#5 - Git - Contribuindo com um repositório remoto
#4 - Git - Stash
#3 - Git - Branching e Merging
#2 - Git - DAG
JavaScript - Date
JavaScript - Expressões Regulares
Scope AngularJS
HTTP Interceptors com AngularJS
Criando Filtros com AngularJS
Criando aplicações Single-Page com AngularJS

Último (19)

PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Apple Pippin Uma breve introdução. - David Glotz
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Custos e liquidação no SAP Transportation Management, TM130 Col18
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
COBITxITIL-Entenda as diferença em uso governança TI
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Aula 18 - Manipulacao De Arquivos python
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Aula04-Academia Heri- Tecnologia Geral 2025
Processos na gestão de transportes, TM100 Col18
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss

Clean Code

  • 1. Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br Introdução ao Clean Code
  • 3. @rodrigobranas rodrigo.branas@gmail.com http://www.agilecode.com.br Formação Acadêmica Ciências da Computação – UFSC Gerenciamento de Projetos - FGV Certificações SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
  • 4. Rodrigo Branas – rodrigo.branas@gmail.com 10 anos de experiência na plataforma Java 1000 horas em sala de aula Mais de 50 palestras em eventos Líder da área de desenvolvimento na Gennera Autor da revista Java Magazine Palestrante Instrutor da Academia Java e Agile da Globalcode Criador dos treinamentos de Clean Code, Selenium e Maven da Agile Code Trabalhou com as empresas: EDS, HP, GM, Citibank, OnCast, Globalcode, V.Office, Dígitr o, Softplan, Unimed, Suntech, Vale do Rio
  • 5. O conteúdo deste treinamento vai afetar na sua zona de conforto
  • 6. Sobre o que vamos falar?
  • 13. Você se sente profissional?
  • 14. Você se sente profissional?
  • 15. Você se sente profissional?
  • 16. Poderia ser mais produtivo?
  • 18. Se sente sempre fazendo um trabalho braçal e desgastante?
  • 19. Qual é a diferença entre cansaço e stress?
  • 20. Já teve vontade de largar tudo?
  • 21. O que mais motiva um desenvolvedor?
  • 22. “Quem trabalha apenas pelo salário, ganhe o que for, será sempre mal pago.” (Autor desconhecido)
  • 26. “Qual é a sua obra? Quando você se for, o vai restar?” (Mario Cortella)
  • 27. Afinal, quanto custa a bagunça para a empresa?
  • 29. Demora no lançamento de novas funcionalidades
  • 30. Dificuldade na hora de realizar qualquer modificação...
  • 32. Quanto custa a falta de confiança do seu cliente?
  • 33. Quanto tempo você perde tentando entender o código para corrigir um bug?
  • 34. Conclusão: Passamos a maior parte do tempo lendo o código!
  • 35. Evolução da Produtividade Uncle Bob – Robert C. Martin
  • 36. Debate: Dois programadores são mais produtivos que um? (Pair)
  • 37. O que é Clean Code?
  • 39. Você teria medo de tomar o remédio?
  • 40. Código feito com cuidado
  • 41. Que revela suas intenções
  • 44. “Qualquer tolo consegue escrever código que um computador entenda. Bons programadores escrevem código que humanos possam entender.” (Martin Fowler)
  • 45. Funcionar é o mínimo que se espera.
  • 47. Qualidade externa é aquela que você percebe logo de cara. Se a usabilidade da interface for ruim, a performance for sofrível e defeitos acontecem com frequência, a pessoa logo percebe e sequer compra o software.
  • 48. Qualidade interna é aquela que você só percebe com o tempo. Infelizmente o comercial não vende esse tipo de qualidade. No entanto, é ela que atrasa o negócio e mata a empresa aos poucos, sufoca e aumenta os custos. É ela que gera boa parte da rotatividade.
  • 49. Como medir a qualidade do código?
  • 50. Linhas de código? Número de métodos? Número de classes? Linhas de código por método? Complexidade ciclomática? Número de estruturas de decisão? ?
  • 53. WTF?
  • 58. Nível máximo de sujeira
  • 60. Debate: Até que ponto vale a pena continuar mantendo um projeto vivo?
  • 62. O desafio é criar código de qualidade!
  • 63. No entanto, falar é o primeiro passo rumo a melhoria!
  • 64. Quatro estágios necessários para adquirir novos hábitos
  • 65. Estágio 1 “Inconsciente e sem habilidade” Ignoramos o comportamento e o hábito
  • 66. Estágio 2 “Consciente e sem habilidade” Conhecemos o comportamento mas ainda não temos o hábito de aplicá-lo”
  • 67. Estágio 3 “Consciente e habilidoso” Nos sentimos confortáveis com pela prática que vamos adquirindo com o tempo
  • 68. Estágio 4 “Inconsciente e habilidoso” O hábito se torna uma coisa natural
  • 69. Escrever código limpo requer muita prática e habilidade!
  • 73. 1. READ INPUT TAPE A1, B1, C1; 2. 501 FORMAT A1; 3. IF (A1) 777, 777, 777 4. IF (B1) 888, 888, 888 5. IF (C1) 999, 999, 999 6. STOP 1 7. 799 S = FLOATF(A1 + B1 + C1) / 2.0 8. WRITE TO TAPE S 9. END PROCESS As linguagens não ajudavam
  • 74. Os ambientes não ajudavam
  • 77. Aprendendo com os mestres
  • 78. 1. // Descrição da maquina 2. String m_desc; 3. // Resultado parcial da soma 4. int s1; 5. // Cor dos olhos 6. String cOlhos; 7. // Valor do índice temporário 8. int aux;
  • 80. 1. // Descrição da maquina 2. String m_desc; 3. // Resultado parcial da soma 4. int s1; 5. // Cor dos olhos 6. String cOlhos; 7. // Valor do índice temporário 8. int aux;
  • 81. 1. // Descrição da maquina 2. String descricaoDaMaquina; 3. // Resultado parcial da soma 4. int resultadoParcialSoma; 5. // Cor dos olhos 6. String corDosOlhos; 7. // Valor do índice temporário 8. int valorDoIndiceTemporario;
  • 82. 1. 2. String descricaoDaMaquina; 3. 4. int resultadoParcialSoma; 5. 6. String corDosOlhos; 7. 8. int valorDoIndiceTemporario;
  • 83. 1. String descricaoDaMaquina; 2. int resultadoParcialSoma; 3. String corDosOlhos; 4. int valorDoIndiceTemporario;
  • 85. 1. // Processa folha de pagamento 2. void processa(); 3. // Calcula o imposto de renda ret. 4. void calcula(); 5. // Renderiza o relatório de alunos 6. void renderiza(); 7. // Totaliza as estatísticas da ligação 8. void totaliza();
  • 86. 1. // Processa folha de pagamento 2. void processaFolhaPagamento(); 3. // Calcula o imposto de renda ret. 4. void calculaImpostoRetido(); 5. // Renderiza o relatório de alunos 6. void renderizaRelatorioAlunos(); 7. // Totaliza as estatísticas da ligação 8. void totalizaEstatisticasLigacao();
  • 87. 1. 2. void processaFolhaPagamento(); 3. 4. void calculaImpostoRetido(); 5. 6. void renderizaRelatorioAlunos(); 7. 8. void totalizaEstatisticasLigacao();
  • 88. 1. void processaFolhaPagamento(); 2. void calculaImpostoRetido(); 3. void renderizaRelatorioAlunos(); 4. void totalizaEstatisticasLigacao();
  • 90. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (hora > 22:00 || hora < 06:00) { 5. return distancia * 3.90; 6. } else { 7. return distancia * 2.10; 8. } 9. } 10. ...
  • 91. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if () { 5. return distancia * 3.90; 6. } else { 7. return distancia * 2.10; 8. } 9. } 10. ...
  • 92. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia * 3.90; 6. } else { 7. return distancia * 2.10; 8. } 9. } 10. ...
  • 93. 1. ... 2. double calculaValorDaCorrida() { 3. if (ehBandeiraDois()) { 4. return distancia * 3.90; 5. } else { 6. return distancia * 2.10; 7. } 8. boolean ehBandeiraDois() { 9. return hora > 22:00 || hora < 06:00; 10. } 11. ...
  • 95. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia * 3.90; 6. } else { 7. return distancia * 2.10; 8. } 9. } 10. ...
  • 96. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia *; 6. } else { 7. return distancia *; 8. } 9. } 10. ...
  • 97. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia * PRECO_B_2; 6. } else { 7. return distancia * PRECO_B_1; 8. } 9. } 10. ...
  • 98. 1. class Taximetro { 2. ... 3. double calculaValorDaCorrida() { 4. if (ehBandeiraDois()) { 5. return distancia * PRECO_BANDEIRA_2; 6. } else { 7. return distancia * PRECO_BANDEIRA_1; 8. } 9. } 10. ...
  • 100. 1. double calculaValorDaCorrida() { 2. if (hora > 22:00 || hora < 06:00) { 3. return distancia * 3.90; 4. } else { 5. if (diaDaSemana eq Domingo) { 6. return distancia * 2.9; 7. else { 8. return distancia * 2.10; 9. } 10. }
  • 102. 1. double calculaValorDaCorrida() { 2. if (hora > 22:00 || hora < 06:00) { 3. return distancia * 3.90; 4. } else { 5. if (diaDaSemana eq Domingo) { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10. }
  • 103. 1. double calculaValorDaCorrida() { 2. if () { 3. return distancia * 3.90; 4. } else { 5. if () { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10. }
  • 104. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10. }
  • 105. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10.
  • 106. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } else { 8. return distancia * 2.10; 9. } 10.
  • 107. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } 8. return distancia * 2.10; 9. 10.
  • 108. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } 8. return distancia * 2.10; 9. 10.
  • 109. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * 3.90; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * 2.9; 7. } 8. return distancia * 2.10; 9. }
  • 110. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia *; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia *; 7. } 8. return distancia *; 9. }
  • 111. 1. double calculaValorDaCorrida() { 2. if (ehBandeiraDois()) { 3. return distancia * PRECO_BANDEIRA_2; 4. } 5. if (ehHorarioDeDomingo()) { 6. return distancia * PRECO_DE_DOMINGO; 7. } 8. return distancia * PRECO_BANDEIRA_1; 9. }