SlideShare uma empresa Scribd logo
1 de 58
Baixar para ler offline
Globalcode – Open4education
Clean Code para Testers
Stefan Teixeira
stefanfk@gmail.com / stefanteixeira.com.br
Sobre o palestrante
Stefan Teixeira
• QA Engineer @ M4U
• Bacharel em Ciência da Computação pela UFRJ
• MBA em Garantia de Qualidade de Software pela Escola Politécnica da UFRJ
• Mantém um blog técnico sobre testes: stefanteixeira.com.br
• Entusiasta de Testes Automatizados, Agile Testing e da cultura DevOps
Contatos:
• E-mail: stefanfk@gmail.com
• Twitter: twitter.com/stefan_teixeira
• Facebook: facebook.com/stefan.teixeira
• LinkedIn: linkedin.com/in/stefanteixeira
• GitHub: github.com/stefanteixeira
• SlideShare: slideshare.net/stefanteixeira
Clean Code
Como me senti quando
comecei a ler o livro…
Mas depois…
Por que Clean Code?
O custo de código ruim
O que é Clean Code?
“I like my code to be elegant and
efficient. Clean code does one thing
well.”
Bjarne Stroustrup, criador do C++
“Clean code always looks like it was
written by someone who cares.”
Michael Feathers, criador do livro “Working
Effectively with Legacy Code"
“You know you are working on clean code
when each routine you read turns out to
be pretty much what you expected”
Ward Cunningham, criador do Wiki, do Fit e um dos
signatários originais do Manifesto Ágil
The Boy Scout Rule
“Leave the campground cleaner than you
found it."
6 pontos sobre Clean
Code importantes para um
tester
#1: Nomes Significativos
Use nomes que revelem a
intenção!
“Se um nome requer um comentário, então ele não
revela sua intenção."
int v1; //valor do produto à vista
int v2; //valor total do produto a prazo
int v3 = v2 - v1; //diferença entre valores à vista e a prazo
int valorAVista;
int valorAPrazo;
int diferencaEntreValoresAVistaAPrazo;
Use nomes buscáveis!
• Evite usar variáveis com apenas uma letra
‣ Usar apenas como variáveis de controle (em um
“for”, por exemplo)
• Evite usar valores “hardcoded" (constantes, strings,
etc.)
assertEquals(“Cadastrado com sucesso”, cadastroPage.getMensagem());
public static final String MSG_SUCESSO = “Cadastrado com sucesso”;
assertEquals( MSG_SUCESSO, cadastroPage.getMessage() );
Nomes de classes e métodos
Classes:
• Devem conter substantivos ou frases nominais
• Ex: LoginPage, Usuario, ConnectionFactory, Conta…
Métodos:
• Devem conter verbos ou frases verbais
• Ex: deletarPagina, salvar, incluirUsuario,
removerConta
#2: Classes
Não crie classes Megazord!
Classes devem ser pequenas!
“The first rule of classes is that they should be small.
The second rule is that they should be smaller than
that.”
“Se a gente não consegue dar um nome sucinto a
uma classe, então provavelmente a classe é grande
demais.”
SRP (Single Responsibility
Principle)
“Uma classe ou módulo deve ter um, e
apenas um, motivo para mudar."
#3: Funções
Cuidado com os Zords…
Funções devem ser pequenas!
“The first rule of functions is that they
should be small. The second rule is that
they should be smaller than that.”
Use nomes descritivos!
“Não tenha medo de dar um nome longo a uma função.
Um nome longo e descritivo é melhor do que um curto
e enigmático.
Um nome longo e descritivo é melhor do que um
comentário.”
//Testa a inclusão de um usuário informando CPF inválido
testeIncluirFalha()
testeIncluirUsuarioComCPFInvalidoSemSucesso()
Faça apenas uma coisa!
public static String renderizarPaginaComSetupsETeardowns(PageData
pageData, boolean isSuite) throws Exception {
if( isTestPage(pageData) )
{
incluiSetupsETeardowns(pageData, isSuite);
}
return pageData.getHtml();
}
O método faz apenas uma coisa?
1) Determina se a página é uma página de teste
2) Caso seja, inclui setups e teardowns
3) Renderiza a página em HTML
Faça apenas uma coisa!
• Parágrafo PARA:
PARA renderizarPaginaComSetupsETeardowns, verificamos se
a página é uma página de teste e, caso seja, incluímos os
setups e teardowns. Em ambos os casos, renderizamos a
página em HTML.
Observe que todos os passos da função do
exemplo estão a um nível de abstração abaixo
do seu nome.
E esse método?
public static String renderizarPaginaComSetupsETeardowns(PageData
pageData, boolean isSuite) throws Exception {
if( isTestPage(pageData) )
{
WikiPage testPage = pageData.getWikiPage();
StringBuffer newPageContent = new StringBuffer();
includeSetupPages(testPage, newPageContent, isSuite);
newPageContent.append(pageData.getContent());
includeTeardownPages(testPage, newPageContent, isSuite);
pageData.setContent(newPageContent.toString());
}
return pageData.getHtml();
}
Como ficaria o parágrafo PARA nesse caso?
Como saber se a função faz apenas uma
coisa?
• Veja se é possível extrair outra função com um nome que
não seja uma reafirmação da implementação inicial.
“Se uma função executa passos que estão a apenas
um nível de abstração abaixo do seu nome, então a
função faz apenas uma coisa.”
“Funções que fazem apenas uma coisa não podem
ser divididas em seções."
DRY (Don’t Repeat Yourself)
LoginPage.java
public HomePage login(String _usuario, String _senha) {
usuario.sendKeys(_usuario);
senha.sendKeys(_senha);
loginForm.submit();
return new HomePage(driver);
}
public LoginPage loginSemSucesso(String _usuario, String_senha) {
usuario.sendKeys(_usuario);
senha.sendKeys(_senha);
loginForm.submit();
wait.until(ExpectedConditions.visibilityOf( mensagemErro ));
return this;
}
DRY (Don’t Repeat Yourself)
LoginPage.java
public HomePage login(String _usuario, String _senha) {
preencherESubmeterForm(_usuario, _senha);
return new HomePage(driver);
}
public LoginPage loginSemSucesso(String _usuario, String _senha) {
preencherESubmeterForm(_usuario, _senha);
wait.until(ExpectedConditions.visibilityOf( mensagemErro ));
return this;
}
private void preencherESubmeterForm(String _usuario, String _senha) {
usuario.sendKeys(_usuario);
senha.sendKeys(_senha);
loginForm.submit();
}
#4: Comentários
“Don’t comment bad code - rewrite it.”
“The proper use of comments is to compensate for our
failure to express ourself in code.”
“Innacurate comments are far worse than no comments
at all. Truth can only be found in one place: the code.”
Comentários BONS
• Comentários legais (copyright)
• TODOs
‣ Cuidado para não encher o código com TODOs
• Amplificar importância
‣ Dar ênfase em algo importante que possa
passar despercebido
Comentários BONS
• Aviso sobre consequências
Comentários RUINS
• Redundância
//Método usado para preencher o form de login, passando usuário e senha
como parâmetros e submetendo o form em seguida
private void preencherESubmeterForm(String _usuario, String _senha) {
usuario.sendKeys(_usuario);
senha.sendKeys(_senha);
loginForm.submit();
}
Comentários RUINS
• Comentários obrigatórios
/**
* @param _usuario Nome do usuario
* @param _senha Senha do usuario
*/
public void preencherESubmeterForm(String _usuario, String _senha) {
usuario.sendKeys(_usuario);
senha.sendKeys(_senha);
loginForm.submit();
}
Comentários RUINS
• Noise comments (reafirmam o óbvio)
/**
* Retorna o nome
* @return o nome
*/
public String getNome() {
return nome;
}
Comentários RUINS
• Código comentado
‣ Quem encontrar um trecho de código
comentado não vai ter coragem de deletá-
lo. Podem pensar que é algo importante.
‣ Pratique o desapego. Temos ferramentas
de controle de versão para isso. :)
Comentários RUINS
• Comentários em HTML
Comentários RUINS
• Comentários extensos
#5: Formatação
• Funções Dependentes
‣ Se uma função chama outra, elas devem estar
próximas verticalmente, e a função que chama deve
estar acima da que é chamada, se possível.
‣ Isso dá a seu código um fluxo natural.
• Afinidade Conceitual
‣Quanto maior for a afinidade entre conceitos de
funções, menor deve ser a distância vertical entre
elas.
• Formatação Vertical
‣ Projetos Java complexos (JUnit, TestNG, Ant,
Tomcat) não possuem arquivos com mais de 500
linhas
• Formatação Horizontal
‣Cuidado com scroll horizontal!
• Indentação
‣ "Without indentation, programs would be virtually
unreadable by humans”
#6: Testes
Era uma vez uma
equipe…
… que não se importava com a
qualidade do código de testes.
Com o passar das releases, o
custo de manter a suite só
aumentava…
… até que tiveram que descartar a
suite inteira.
Moral da História
Código de teste é tão
importante quanto código
de produção!
“Having dirty tests is equivalent to, if not
worse than, having no tests.”
“What makes a clean test? Three things.
Readability, readability, and readability.”
Mantenha seus testes limpos!
Conclusão
“Any fool can write code that a computer
can understand. Good programmers write
code that humans can understand.”
- Martin Fowler
“Refactoring is an iterative process full of
trial and error, inevitably converging on
something we feel is worthy of a
professional."
- "Uncle Bob" Martin
Outros livros recomendados
Globalcode – Open4education
Obrigado!
Stefan Teixeira
stefanfk@gmail.com
stefanteixeira.com.br
@stefan_teixeira

Mais conteúdo relacionado

Mais procurados

TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeTDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeStefan Teixeira
 
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...minastestingconference
 
TDC 2016 Floripa - Aprendendo Docker sem bruxaria
TDC 2016 Floripa - Aprendendo Docker sem bruxariaTDC 2016 Floripa - Aprendendo Docker sem bruxaria
TDC 2016 Floripa - Aprendendo Docker sem bruxariaStefan Teixeira
 
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCTDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCStefan Teixeira
 
Tester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoTester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoLeonardo Galani
 
QConRio 2014 - Uso de Headless Browsers em Testes Automatizados
QConRio 2014 - Uso de Headless Browsers em Testes AutomatizadosQConRio 2014 - Uso de Headless Browsers em Testes Automatizados
QConRio 2014 - Uso de Headless Browsers em Testes AutomatizadosStefan Teixeira
 
Semana da Computação UFRJ - Testes Automatizados: bruxaria ou não?
Semana da Computação UFRJ - Testes Automatizados: bruxaria ou não?Semana da Computação UFRJ - Testes Automatizados: bruxaria ou não?
Semana da Computação UFRJ - Testes Automatizados: bruxaria ou não?Stefan Teixeira
 
TDC 2014 SP - Visual Regression Testing com PhantomCSS
TDC 2014 SP - Visual Regression Testing com PhantomCSSTDC 2014 SP - Visual Regression Testing com PhantomCSS
TDC 2014 SP - Visual Regression Testing com PhantomCSSStefan Teixeira
 
TDC 2015 Floripa - Visual Regression Testing em ambientes na nuvem
TDC 2015 Floripa - Visual Regression Testing em ambientes na nuvemTDC 2015 Floripa - Visual Regression Testing em ambientes na nuvem
TDC 2015 Floripa - Visual Regression Testing em ambientes na nuvemStefan Teixeira
 
Agile Brazil 2014 - Visual Regression Testing com PhantomCSS
Agile Brazil 2014 - Visual Regression Testing com PhantomCSSAgile Brazil 2014 - Visual Regression Testing com PhantomCSS
Agile Brazil 2014 - Visual Regression Testing com PhantomCSSStefan Teixeira
 
Testes de software
Testes de softwareTestes de software
Testes de softwareVitor Castro
 
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
4º Encontro do Grupo de Testes Carioca - Testes de Carga com LocustStefan Teixeira
 
DevQA - Da zona de conforto ao comprometimento com a Qualidade
DevQA - Da zona de conforto ao comprometimento com a QualidadeDevQA - Da zona de conforto ao comprometimento com a Qualidade
DevQA - Da zona de conforto ao comprometimento com a QualidadeKamilla Queiroz Xavier
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisAna Paula Gomes
 
Mtc docker - utilizando no seu dia a dia
Mtc   docker - utilizando no seu dia a diaMtc   docker - utilizando no seu dia a dia
Mtc docker - utilizando no seu dia a diaRafael Chiavegatto
 
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvemMinas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvemStefan Teixeira
 
3 noções básicas para automação de testes efetivos - Taíse Dias da Silva
3 noções básicas para automação de testes efetivos - Taíse Dias da Silva 3 noções básicas para automação de testes efetivos - Taíse Dias da Silva
3 noções básicas para automação de testes efetivos - Taíse Dias da Silva minastestingconference
 

Mais procurados (17)

TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeTDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
 
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
 
TDC 2016 Floripa - Aprendendo Docker sem bruxaria
TDC 2016 Floripa - Aprendendo Docker sem bruxariaTDC 2016 Floripa - Aprendendo Docker sem bruxaria
TDC 2016 Floripa - Aprendendo Docker sem bruxaria
 
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCTDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
 
Tester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoTester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitido
 
QConRio 2014 - Uso de Headless Browsers em Testes Automatizados
QConRio 2014 - Uso de Headless Browsers em Testes AutomatizadosQConRio 2014 - Uso de Headless Browsers em Testes Automatizados
QConRio 2014 - Uso de Headless Browsers em Testes Automatizados
 
Semana da Computação UFRJ - Testes Automatizados: bruxaria ou não?
Semana da Computação UFRJ - Testes Automatizados: bruxaria ou não?Semana da Computação UFRJ - Testes Automatizados: bruxaria ou não?
Semana da Computação UFRJ - Testes Automatizados: bruxaria ou não?
 
TDC 2014 SP - Visual Regression Testing com PhantomCSS
TDC 2014 SP - Visual Regression Testing com PhantomCSSTDC 2014 SP - Visual Regression Testing com PhantomCSS
TDC 2014 SP - Visual Regression Testing com PhantomCSS
 
TDC 2015 Floripa - Visual Regression Testing em ambientes na nuvem
TDC 2015 Floripa - Visual Regression Testing em ambientes na nuvemTDC 2015 Floripa - Visual Regression Testing em ambientes na nuvem
TDC 2015 Floripa - Visual Regression Testing em ambientes na nuvem
 
Agile Brazil 2014 - Visual Regression Testing com PhantomCSS
Agile Brazil 2014 - Visual Regression Testing com PhantomCSSAgile Brazil 2014 - Visual Regression Testing com PhantomCSS
Agile Brazil 2014 - Visual Regression Testing com PhantomCSS
 
Testes de software
Testes de softwareTestes de software
Testes de software
 
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
 
DevQA - Da zona de conforto ao comprometimento com a Qualidade
DevQA - Da zona de conforto ao comprometimento com a QualidadeDevQA - Da zona de conforto ao comprometimento com a Qualidade
DevQA - Da zona de conforto ao comprometimento com a Qualidade
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e mais
 
Mtc docker - utilizando no seu dia a dia
Mtc   docker - utilizando no seu dia a diaMtc   docker - utilizando no seu dia a dia
Mtc docker - utilizando no seu dia a dia
 
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvemMinas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
 
3 noções básicas para automação de testes efetivos - Taíse Dias da Silva
3 noções básicas para automação de testes efetivos - Taíse Dias da Silva 3 noções básicas para automação de testes efetivos - Taíse Dias da Silva
3 noções básicas para automação de testes efetivos - Taíse Dias da Silva
 

Destaque

TDC 2014 POA - Clean Code para Testers
TDC 2014 POA - Clean Code para TestersTDC 2014 POA - Clean Code para Testers
TDC 2014 POA - Clean Code para TestersStefan Teixeira
 
Reactive microservices
Reactive microservicesReactive microservices
Reactive microservicesAnderson Braz
 
TDC 2014 Floripa - Melhorando sua Estratégia de Testes Automatizados
TDC 2014 Floripa - Melhorando sua Estratégia de Testes AutomatizadosTDC 2014 Floripa - Melhorando sua Estratégia de Testes Automatizados
TDC 2014 Floripa - Melhorando sua Estratégia de Testes AutomatizadosStefan Teixeira
 
Testes UI: não aceite mais falso negativos
Testes UI: não aceite mais falso negativosTestes UI: não aceite mais falso negativos
Testes UI: não aceite mais falso negativosAndrei Tognolo
 
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes AutomatizadosScrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes AutomatizadosStefan Teixeira
 
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...Stefan Teixeira
 
Continuous Delivery & APIs - Evoluindo uma Arquitetura Orientada a Serviços
Continuous Delivery & APIs - Evoluindo uma Arquitetura Orientada a ServiçosContinuous Delivery & APIs - Evoluindo uma Arquitetura Orientada a Serviços
Continuous Delivery & APIs - Evoluindo uma Arquitetura Orientada a ServiçosSamanta Cicilia
 
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...Stefan Teixeira
 
Palestra sobre Automação de Testes com Rest-Assured
Palestra sobre Automação de Testes com Rest-AssuredPalestra sobre Automação de Testes com Rest-Assured
Palestra sobre Automação de Testes com Rest-AssuredQualister
 
Testes em uma startup do mundo financeiro
Testes em uma startup do mundo financeiroTestes em uma startup do mundo financeiro
Testes em uma startup do mundo financeiroLuiz Alberto Hespanha
 
Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerScrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerStefan Teixeira
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecerTDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecerStefan Teixeira
 

Destaque (17)

TDC 2014 POA - Clean Code para Testers
TDC 2014 POA - Clean Code para TestersTDC 2014 POA - Clean Code para Testers
TDC 2014 POA - Clean Code para Testers
 
TheDevConf 2015 Testes Kanban
TheDevConf 2015 Testes KanbanTheDevConf 2015 Testes Kanban
TheDevConf 2015 Testes Kanban
 
Reactive microservices
Reactive microservicesReactive microservices
Reactive microservices
 
TDC 2014 Floripa - Melhorando sua Estratégia de Testes Automatizados
TDC 2014 Floripa - Melhorando sua Estratégia de Testes AutomatizadosTDC 2014 Floripa - Melhorando sua Estratégia de Testes Automatizados
TDC 2014 Floripa - Melhorando sua Estratégia de Testes Automatizados
 
Testes UI: não aceite mais falso negativos
Testes UI: não aceite mais falso negativosTestes UI: não aceite mais falso negativos
Testes UI: não aceite mais falso negativos
 
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes AutomatizadosScrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
 
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
 
Continuous Delivery & APIs - Evoluindo uma Arquitetura Orientada a Serviços
Continuous Delivery & APIs - Evoluindo uma Arquitetura Orientada a ServiçosContinuous Delivery & APIs - Evoluindo uma Arquitetura Orientada a Serviços
Continuous Delivery & APIs - Evoluindo uma Arquitetura Orientada a Serviços
 
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
 
Palestra sobre Automação de Testes com Rest-Assured
Palestra sobre Automação de Testes com Rest-AssuredPalestra sobre Automação de Testes com Rest-Assured
Palestra sobre Automação de Testes com Rest-Assured
 
Testes em uma startup do mundo financeiro
Testes em uma startup do mundo financeiroTestes em uma startup do mundo financeiro
Testes em uma startup do mundo financeiro
 
Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerScrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecerTDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
 

Semelhante a Clean Code para Testers

Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)André Justi
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonIgor Sobreira
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dadosSérgio Souza Costa
 
Tutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper jsTutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper js4ALL Tests
 
Tutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSTutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSFrederico Allan
 
Qualidade de Código
Qualidade de CódigoQualidade de Código
Qualidade de CódigoJoberto Diniz
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5Diego Pacheco
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
Código limpo: Funções Capítulo 3
Código limpo: Funções  Capítulo 3Código limpo: Funções  Capítulo 3
Código limpo: Funções Capítulo 3Inael Rodrigues
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshopguestd37c23
 

Semelhante a Clean Code para Testers (20)

Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Clean code
Clean codeClean code
Clean code
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dados
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
Tutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper jsTutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper js
 
Tutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSTutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJS
 
Aula JPA
Aula JPAAula JPA
Aula JPA
 
Qualidade de Código
Qualidade de CódigoQualidade de Código
Qualidade de Código
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Código limpo: Funções Capítulo 3
Código limpo: Funções  Capítulo 3Código limpo: Funções  Capítulo 3
Código limpo: Funções Capítulo 3
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 

Mais de Stefan Teixeira

Latinoware 2016 - Continuous Delivery com ferramentas open source
Latinoware 2016 - Continuous Delivery com ferramentas open sourceLatinoware 2016 - Continuous Delivery com ferramentas open source
Latinoware 2016 - Continuous Delivery com ferramentas open sourceStefan Teixeira
 
Ágiles 2016 - Using open source tools to support Continuous Delivery
Ágiles 2016 - Using open source tools to support Continuous DeliveryÁgiles 2016 - Using open source tools to support Continuous Delivery
Ágiles 2016 - Using open source tools to support Continuous DeliveryStefan Teixeira
 
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...Stefan Teixeira
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeStefan Teixeira
 
TDC 2016 Floripa - Testando APIs REST com Supertest e Promises
TDC 2016 Floripa - Testando APIs REST com Supertest e PromisesTDC 2016 Floripa - Testando APIs REST com Supertest e Promises
TDC 2016 Floripa - Testando APIs REST com Supertest e PromisesStefan Teixeira
 
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Stefan Teixeira
 
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorMeetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorStefan Teixeira
 
Meetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
Meetup AngularJS Rio - Testes e2e para apps AngularJS com ProtractorMeetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
Meetup AngularJS Rio - Testes e2e para apps AngularJS com ProtractorStefan Teixeira
 
Testadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerTestadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerStefan Teixeira
 
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicação
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicaçãoAgile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicação
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicaçãoStefan Teixeira
 
TDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de DockerTDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de DockerStefan Teixeira
 
Mobile Conf 2015 - Testes de Unidade com Robolectric
Mobile Conf 2015 - Testes de Unidade com RobolectricMobile Conf 2015 - Testes de Unidade com Robolectric
Mobile Conf 2015 - Testes de Unidade com RobolectricStefan Teixeira
 

Mais de Stefan Teixeira (12)

Latinoware 2016 - Continuous Delivery com ferramentas open source
Latinoware 2016 - Continuous Delivery com ferramentas open sourceLatinoware 2016 - Continuous Delivery com ferramentas open source
Latinoware 2016 - Continuous Delivery com ferramentas open source
 
Ágiles 2016 - Using open source tools to support Continuous Delivery
Ágiles 2016 - Using open source tools to support Continuous DeliveryÁgiles 2016 - Using open source tools to support Continuous Delivery
Ágiles 2016 - Using open source tools to support Continuous Delivery
 
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
 
TDC 2016 Floripa - Testando APIs REST com Supertest e Promises
TDC 2016 Floripa - Testando APIs REST com Supertest e PromisesTDC 2016 Floripa - Testando APIs REST com Supertest e Promises
TDC 2016 Floripa - Testando APIs REST com Supertest e Promises
 
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
 
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorMeetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
 
Meetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
Meetup AngularJS Rio - Testes e2e para apps AngularJS com ProtractorMeetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
Meetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
 
Testadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerTestadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de Docker
 
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicação
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicaçãoAgile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicação
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicação
 
TDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de DockerTDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de Docker
 
Mobile Conf 2015 - Testes de Unidade com Robolectric
Mobile Conf 2015 - Testes de Unidade com RobolectricMobile Conf 2015 - Testes de Unidade com Robolectric
Mobile Conf 2015 - Testes de Unidade com Robolectric
 

Clean Code para Testers

  • 1. Globalcode – Open4education Clean Code para Testers Stefan Teixeira stefanfk@gmail.com / stefanteixeira.com.br
  • 2. Sobre o palestrante Stefan Teixeira • QA Engineer @ M4U • Bacharel em Ciência da Computação pela UFRJ • MBA em Garantia de Qualidade de Software pela Escola Politécnica da UFRJ • Mantém um blog técnico sobre testes: stefanteixeira.com.br • Entusiasta de Testes Automatizados, Agile Testing e da cultura DevOps Contatos: • E-mail: stefanfk@gmail.com • Twitter: twitter.com/stefan_teixeira • Facebook: facebook.com/stefan.teixeira • LinkedIn: linkedin.com/in/stefanteixeira • GitHub: github.com/stefanteixeira • SlideShare: slideshare.net/stefanteixeira
  • 4.
  • 5. Como me senti quando comecei a ler o livro…
  • 8.
  • 9. O custo de código ruim
  • 10. O que é Clean Code?
  • 11. “I like my code to be elegant and efficient. Clean code does one thing well.” Bjarne Stroustrup, criador do C++
  • 12. “Clean code always looks like it was written by someone who cares.” Michael Feathers, criador do livro “Working Effectively with Legacy Code"
  • 13. “You know you are working on clean code when each routine you read turns out to be pretty much what you expected” Ward Cunningham, criador do Wiki, do Fit e um dos signatários originais do Manifesto Ágil
  • 14. The Boy Scout Rule “Leave the campground cleaner than you found it."
  • 15. 6 pontos sobre Clean Code importantes para um tester
  • 17. Use nomes que revelem a intenção! “Se um nome requer um comentário, então ele não revela sua intenção." int v1; //valor do produto à vista int v2; //valor total do produto a prazo int v3 = v2 - v1; //diferença entre valores à vista e a prazo int valorAVista; int valorAPrazo; int diferencaEntreValoresAVistaAPrazo;
  • 18. Use nomes buscáveis! • Evite usar variáveis com apenas uma letra ‣ Usar apenas como variáveis de controle (em um “for”, por exemplo) • Evite usar valores “hardcoded" (constantes, strings, etc.) assertEquals(“Cadastrado com sucesso”, cadastroPage.getMensagem()); public static final String MSG_SUCESSO = “Cadastrado com sucesso”; assertEquals( MSG_SUCESSO, cadastroPage.getMessage() );
  • 19. Nomes de classes e métodos Classes: • Devem conter substantivos ou frases nominais • Ex: LoginPage, Usuario, ConnectionFactory, Conta… Métodos: • Devem conter verbos ou frases verbais • Ex: deletarPagina, salvar, incluirUsuario, removerConta
  • 21. Não crie classes Megazord!
  • 22. Classes devem ser pequenas! “The first rule of classes is that they should be small. The second rule is that they should be smaller than that.” “Se a gente não consegue dar um nome sucinto a uma classe, então provavelmente a classe é grande demais.”
  • 23. SRP (Single Responsibility Principle) “Uma classe ou módulo deve ter um, e apenas um, motivo para mudar."
  • 25. Cuidado com os Zords…
  • 26. Funções devem ser pequenas! “The first rule of functions is that they should be small. The second rule is that they should be smaller than that.”
  • 27. Use nomes descritivos! “Não tenha medo de dar um nome longo a uma função. Um nome longo e descritivo é melhor do que um curto e enigmático. Um nome longo e descritivo é melhor do que um comentário.” //Testa a inclusão de um usuário informando CPF inválido testeIncluirFalha() testeIncluirUsuarioComCPFInvalidoSemSucesso()
  • 28. Faça apenas uma coisa! public static String renderizarPaginaComSetupsETeardowns(PageData pageData, boolean isSuite) throws Exception { if( isTestPage(pageData) ) { incluiSetupsETeardowns(pageData, isSuite); } return pageData.getHtml(); } O método faz apenas uma coisa? 1) Determina se a página é uma página de teste 2) Caso seja, inclui setups e teardowns 3) Renderiza a página em HTML
  • 29. Faça apenas uma coisa! • Parágrafo PARA: PARA renderizarPaginaComSetupsETeardowns, verificamos se a página é uma página de teste e, caso seja, incluímos os setups e teardowns. Em ambos os casos, renderizamos a página em HTML. Observe que todos os passos da função do exemplo estão a um nível de abstração abaixo do seu nome.
  • 30. E esse método? public static String renderizarPaginaComSetupsETeardowns(PageData pageData, boolean isSuite) throws Exception { if( isTestPage(pageData) ) { WikiPage testPage = pageData.getWikiPage(); StringBuffer newPageContent = new StringBuffer(); includeSetupPages(testPage, newPageContent, isSuite); newPageContent.append(pageData.getContent()); includeTeardownPages(testPage, newPageContent, isSuite); pageData.setContent(newPageContent.toString()); } return pageData.getHtml(); } Como ficaria o parágrafo PARA nesse caso?
  • 31. Como saber se a função faz apenas uma coisa? • Veja se é possível extrair outra função com um nome que não seja uma reafirmação da implementação inicial. “Se uma função executa passos que estão a apenas um nível de abstração abaixo do seu nome, então a função faz apenas uma coisa.” “Funções que fazem apenas uma coisa não podem ser divididas em seções."
  • 32. DRY (Don’t Repeat Yourself) LoginPage.java public HomePage login(String _usuario, String _senha) { usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit(); return new HomePage(driver); } public LoginPage loginSemSucesso(String _usuario, String_senha) { usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit(); wait.until(ExpectedConditions.visibilityOf( mensagemErro )); return this; }
  • 33. DRY (Don’t Repeat Yourself) LoginPage.java public HomePage login(String _usuario, String _senha) { preencherESubmeterForm(_usuario, _senha); return new HomePage(driver); } public LoginPage loginSemSucesso(String _usuario, String _senha) { preencherESubmeterForm(_usuario, _senha); wait.until(ExpectedConditions.visibilityOf( mensagemErro )); return this; } private void preencherESubmeterForm(String _usuario, String _senha) { usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit(); }
  • 35. “Don’t comment bad code - rewrite it.” “The proper use of comments is to compensate for our failure to express ourself in code.” “Innacurate comments are far worse than no comments at all. Truth can only be found in one place: the code.”
  • 36. Comentários BONS • Comentários legais (copyright) • TODOs ‣ Cuidado para não encher o código com TODOs • Amplificar importância ‣ Dar ênfase em algo importante que possa passar despercebido
  • 37. Comentários BONS • Aviso sobre consequências
  • 38. Comentários RUINS • Redundância //Método usado para preencher o form de login, passando usuário e senha como parâmetros e submetendo o form em seguida private void preencherESubmeterForm(String _usuario, String _senha) { usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit(); }
  • 39. Comentários RUINS • Comentários obrigatórios /** * @param _usuario Nome do usuario * @param _senha Senha do usuario */ public void preencherESubmeterForm(String _usuario, String _senha) { usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit(); }
  • 40. Comentários RUINS • Noise comments (reafirmam o óbvio) /** * Retorna o nome * @return o nome */ public String getNome() { return nome; }
  • 41. Comentários RUINS • Código comentado ‣ Quem encontrar um trecho de código comentado não vai ter coragem de deletá- lo. Podem pensar que é algo importante. ‣ Pratique o desapego. Temos ferramentas de controle de versão para isso. :)
  • 45. • Funções Dependentes ‣ Se uma função chama outra, elas devem estar próximas verticalmente, e a função que chama deve estar acima da que é chamada, se possível. ‣ Isso dá a seu código um fluxo natural. • Afinidade Conceitual ‣Quanto maior for a afinidade entre conceitos de funções, menor deve ser a distância vertical entre elas.
  • 46. • Formatação Vertical ‣ Projetos Java complexos (JUnit, TestNG, Ant, Tomcat) não possuem arquivos com mais de 500 linhas • Formatação Horizontal ‣Cuidado com scroll horizontal!
  • 47. • Indentação ‣ "Without indentation, programs would be virtually unreadable by humans”
  • 49. Era uma vez uma equipe…
  • 50. … que não se importava com a qualidade do código de testes.
  • 51. Com o passar das releases, o custo de manter a suite só aumentava…
  • 52. … até que tiveram que descartar a suite inteira.
  • 53. Moral da História Código de teste é tão importante quanto código de produção!
  • 54. “Having dirty tests is equivalent to, if not worse than, having no tests.” “What makes a clean test? Three things. Readability, readability, and readability.” Mantenha seus testes limpos!
  • 56. “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” - Martin Fowler “Refactoring is an iterative process full of trial and error, inevitably converging on something we feel is worthy of a professional." - "Uncle Bob" Martin
  • 58. Globalcode – Open4education Obrigado! Stefan Teixeira stefanfk@gmail.com stefanteixeira.com.br @stefan_teixeira