SlideShare uma empresa Scribd logo
1 de 76
Sistemas evolutivos
ou “pacíficos”
Hugo Corbucci
hugo.corbucci@thoughtworks.com
1Wednesday, July 3, 13
Agenda
Anatomia de uma mudança
Mudança de código
Mudança de banco de dados
Sistemas externos
Retro-compatibilidade e Compatibilidade futura
2Wednesday, July 3, 13
Anatomia de uma mudança
167 insertions(+),
119 files changed,
153 deletions(-)
3Wednesday, July 3, 13
Dissecando uma mudança
class Exemplo
def nome_velho
return 42
end
end
class Exemplo
def nome_novo
return 42
end
end
- def nome_velho
+ def nome_novo
4Wednesday, July 3, 13
Dissecando uma mudança
class Exemplo
def nome_velho
return 42
end
end
class Exemplo
def nome_novo
return 42
end
end
class Resposta
def resposta(pergunta)
e = Exemplo.new
return e.nome_velho
end
end
5Wednesday, July 3, 13
class Resposta
def resposta(pergunta)
e = Exemplo.new
return e.nome_velho
end
end
Dissecando uma mudança
class Exemplo
def nome_velho
return 42
end
end
class Exemplo
def nome_novo
return 42
end
end
6Wednesday, July 3, 13
Evitando o problema
class Exemplo
def nome_velho
return 42
end
end
class Resposta
def answer(pergunta)
e = Exemplo.new
return e.nome_velho
end
end
7Wednesday, July 3, 13
Evitando o problema
class Exemplo
def nome_velho
return 42
end
end
class Resposta
def answer(pergunta)
e = Exemplo.new
return e.nome_velho
end
end
class Exemplo
def nome_velho
puts "Esse método
foi deperequetado.
Favor usar nome_novo"
return nome_novo
end
def nome_novo
return 42
end
end
8Wednesday, July 3, 13
Que vantagem Maria leva?
9Wednesday, July 3, 13
Que vantagem Maria leva?
..........................................................Esse método foi
deperequetado. Favor usar nome_novo
....................................................................Esse método foi
deperequetado. Favor usar nome_novo
.Esse método foi deperequetado. Favor usar nome_novo
...................................................Esse método foi
deperequetado. Favor usar nome_novo
....................................................................................................
....................................................................................................
.....................................................................................
Finished in 86.438778 seconds.
463 tests, 534 assertions, 0 failures, 0 errors
10Wednesday, July 3, 13
Que vantagem Maria leva?
..........................................................Esse método foi
deperequetado. Favor usar nome_novo
....................................................................Esse método foi
deperequetado. Favor usar nome_novo
.Esse método foi deperequetado. Favor usar nome_novo
...................................................Esse método foi
deperequetado. Favor usar nome_novo
....................................................................................................
....................................................................................................
.....................................................................................
Finished in 86.438778 seconds.
463 tests, 534 assertions, 0 failures, 0 errors
11Wednesday, July 3, 13
Sistemas externos
(Sim, seu banco de dados é um sistema externo)
12Wednesday, July 3, 13
Mudança de BD
mysql> describe sessions;
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(255) | YES | | NULL | |
| summary | text | YES | | NULL | |
| description | text | YES | | NULL | |
| mechanics | text | YES | | NULL | |
| benefits | text | YES | | NULL | |
| target_audience | varchar(255) | YES | | NULL | |
| author_id | int(11) | YES | MUL | NULL | |
| experience | text | YES | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| track_id | int(11) | YES | MUL | NULL | |
| session_type_id | int(11) | YES | MUL | NULL | |
| duration_mins | int(11) | YES | | NULL | |
| audience_level_id | int(11) | YES | MUL | NULL | |
| state | varchar(255) | YES | | NULL | |
| conference_id | int(11) | YES | MUL | NULL | |
| language | varchar(255) | YES | | NULL | |
+---------------------+--------------+------+-----+---------+----------------+
19 rows in set (0.11 sec)
13Wednesday, July 3, 13
Mudança de BD
mysql> ALTER TABLE sessions DROP COLUMN experience;
Query OK, 0 rows affected (1.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
14Wednesday, July 3, 13
Mudança de BD
mysql> describe sessions;
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(255) | YES | | NULL | |
| summary | text | YES | | NULL | |
| description | text | YES | | NULL | |
| mechanics | text | YES | | NULL | |
| benefits | text | YES | | NULL | |
| target_audience | varchar(255) | YES | | NULL | |
| author_id | int(11) | YES | MUL | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| track_id | int(11) | YES | MUL | NULL | |
| session_type_id | int(11) | YES | MUL | NULL | |
| duration_mins | int(11) | YES | | NULL | |
| audience_level_id | int(11) | YES | MUL | NULL | |
| state | varchar(255) | YES | | NULL | |
| conference_id | int(11) | YES | MUL | NULL | |
| language | varchar(255) | YES | | NULL | |
+---------------------+--------------+------+-----+---------+----------------+
18 rows in set (0.11 sec)
15Wednesday, July 3, 13
Mudança de BD
mysql> describe sessions;
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(255) | YES | | NULL | |
| summary | text | YES | | NULL | |
| description | text | YES | | NULL | |
| mechanics | text | YES | | NULL | |
| benefits | text | YES | | NULL | |
| target_audience | varchar(255) | YES | | NULL | |
| author_id | int(11) | YES | MUL | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| track_id | int(11) | YES | MUL | NULL | |
| session_type_id | int(11) | YES | MUL | NULL | |
| duration_mins | int(11) | YES | | NULL | |
| audience_level_id | int(11) | YES | MUL | NULL | |
| state | varchar(255) | YES | | NULL | |
| conference_id | int(11) | YES | MUL | NULL | |
| language | varchar(255) | YES | | NULL | |
+---------------------+--------------+------+-----+---------+----------------+
18 rows in set (0.11 sec)
16Wednesday, July 3, 13
Lá no código
class Session
def experience
return execute("select experience from
sessions where id = ?", id)
end
end
17Wednesday, July 3, 13
Lá no código
> session.experience
ColumnNotFoundException: no column named
experience
18Wednesday, July 3, 13
Lá no código
> session.experience
ColumnNotFoundException: no column named
experience
E agora José?
19Wednesday, July 3, 13
Como evitar?
V1
Código usa experience
BD tem experience
V2
Código não usa experience
BD não tem experience
20Wednesday, July 3, 13
Como evitar?
V1
Código usa experience
BD tem experience
V2
Código não usa experience
BD não tem experience
21Wednesday, July 3, 13
Como evitar?
V1
Código usa experience
BD tem experience
V2
Código não usa experience
BD não tem experience
V1.5
Código não usa experience
BD tem experience
22Wednesday, July 3, 13
Como evitar?
V1
Código usa experience
BD tem experience
V2
Código não usa experience
BD não tem experience
V1.5
Código não usa experience
BD tem experience
23Wednesday, July 3, 13
E a adição?
V1
Código não usa limit
BD não tem limit
V2
Código usa limit
BD tem limit
24Wednesday, July 3, 13
E a adição?
V1
Código não usa limit
BD não tem limit
V2
Código usa limit
BD tem limit
25Wednesday, July 3, 13
E adição?
V1
Código não usa limit
BD não tem limit
V2
Código usa limit
BD tem limit
V1.5
Código não usa limit
BD tem limit
26Wednesday, July 3, 13
E adição?
V1
Código não usa limit
BD não tem limit
V2
Código usa limit
BD tem limit
V1.5
Código não usa limit
BD tem limit
27Wednesday, July 3, 13
Passo a passo
1.Explicitar
2.Avisar
3.Duplicar
4.Descontinuar
5.Proteger
6.Limpar
28Wednesday, July 3, 13
Explicitar
class Subclasse < Superclasse
end
> implementacao = Subclasse.new
> implementacao.metodo_da_super_classe
29Wednesday, July 3, 13
Explicitar
class Subclasse < Superclasse
end
> implementacao = Subclasse.new
> implementacao.metodo_da_super_classe
class Subclasse < Superclasse
def metodo_da_super_classe
super
end
end
30Wednesday, July 3, 13
Avisar
class Subclasse < Superclasse
def metodo_da_super_classe
puts "Esse método está sendo
deperequetado. Favor não usar mais"
super
end
end
31Wednesday, July 3, 13
Avisar
class Subclasse < Superclasse
def metodo_da_super_classe
puts "Esse método está sendo
deperequetado. Favor não usar mais"
super
end
end
> implementacao = Subclasse.new
> implementacao.metodo_da_super_classe
Esse método está sendo deperequetado.
Favor não usar mais
32Wednesday, July 3, 13
Duplicar
class Subclasse < Superclasse
def metodo_da_super_classe
puts "Esse método está sendo
deperequetado. Favor usar novo_metodo"
super
end
def novo_metodo
42
end
end
33Wednesday, July 3, 13
Duplicar
class Subclasse < Superclasse
def metodo_da_super_classe
puts "Esse método está sendo
deperequetado. Favor usar novo_metodo"
super
return novo_metodo
end
def novo_metodo
42
end
end
34Wednesday, July 3, 13
Descontinuar
class Subclasse < Superclasse
def metodo_da_super_classe
puts "Esse método está sendo
deperequetado. Favor usar novo_metodo"
return novo_metodo
end
def novo_metodo
42
end
end
35Wednesday, July 3, 13
Proteger
class Subclasse < Superclasse
def metodo_da_super_classe
raise "Esse método está
deperequetado. Use novo_metodo"
end
def novo_metodo
42
end
end
36Wednesday, July 3, 13
Limpar
class Subclasse < Superclasse
def novo_metodo
42
end
end
37Wednesday, July 3, 13
Sistemas externos
Estratégias de evolução
38Wednesday, July 3, 13
Mesmo padrão
Sistema com contrato velho
Externo com contrato velho
39Wednesday, July 3, 13
Mesmo padrão
Sistema com contrato velho
Externo com contrato velho
Sistema com contrato velho e novo
Externo com contrato velho
40Wednesday, July 3, 13
Mesmo padrão
Sistema com contrato velho
Externo com contrato velho
Sistema com contrato velho e novo
Externo com contrato novo
Sistema com contrato velho e novo
Externo com contrato velho
41Wednesday, July 3, 13
Mesmo padrão
Sistema com contrato velho
Externo com contrato velho
Sistema com contrato velho e novo
Externo com contrato novo
Sistema com contrato velho e novo
Externo com contrato velho
Sistema com contrato novo
Externo com contrato novo
42Wednesday, July 3, 13
Troca de mensagens
{ nome: “Hugo
Corbucci”,
nascimento:
“1983-12-26”
}
43Wednesday, July 3, 13
Troca de mensagens
{ nome: “Hugo
Corbucci”,
nascimento:
“1983-12-26”
}
{ nome: “Hugo
Corbucci”,
nascimento:
“1983-12-26”,
primeiro_nome:
“Hugo”,
ultimo_nome:
“Corbucci”
}
44Wednesday, July 3, 13
Versionamento
/api/v1/
{ nome: “Hugo
Corbucci”,
nascimento:
“1983-12-26”
}
45Wednesday, July 3, 13
Versionamento
/api/v1/
{ nome: “Hugo
Corbucci”,
nascimento:
“1983-12-26”
}
/api/v2/
{ nascimento:
“1983-12-26”,
primeiro_nome:
“Hugo”,
ultimo_nome:
“Corbucci”
}
46Wednesday, July 3, 13
Compatibilidade
47Wednesday, July 3, 13
Código Velho + Dado Velho
Código Velho + Dado Novo
Código Novo + Dado Velho
Código Novo + Dado Novo
Retro-compatibilidade
48Wednesday, July 3, 13
Código Velho + Dado Velho
Código Velho + Dado Novo
Código Novo + Dado Velho
Código Novo + Dado Novo
Retro-compatibilidade
49Wednesday, July 3, 13
Código Velho + Dado Novo
50Wednesday, July 3, 13
Código Velho + Dado Novo
•Não remover dado usado pelo código velho
51Wednesday, July 3, 13
Código Velho + Dado Novo
•Não remover dado usado pelo código velho
•Não mudar acesso de dados
52Wednesday, July 3, 13
Código Velho + Dado Novo
•Não remover dado usado pelo código velho
•Não mudar acesso de dados
•Não mudar semântica de dados
53Wednesday, July 3, 13
Código Novo + Dado Velho
54Wednesday, July 3, 13
Código Novo + Dado Velho
• Ler novo dado se presente – usar o velho
se ausente
55Wednesday, July 3, 13
Código Novo + Dado Velho
• Ler novo dado se presente – usar o velho
se ausente
• Escrever novo dado se possível – escrever
dado velho se não der
56Wednesday, July 3, 13
Código Novo + Dado Velho
• Ler novo dado se presente – usar o velho
se ausente
• Escrever novo dado se possível – escrever
dado velho se não der
• Adicionar logs para acompanhar migração
de dados
57Wednesday, July 3, 13
Código atual + Dado atual
Código atual + Dado futuro
Código futuro + Dado atual
Código futuro + Dado futuro
Compatibilidade futura
58Wednesday, July 3, 13
Código atual + Dado atual
Código atual + Dado futuro
Código futuro + Dado atual
Código futuro + Dado futuro
Compatibilidade futura
59Wednesday, July 3, 13
Código atual + Dado futuro
60Wednesday, July 3, 13
Código atual + Dado futuro
• Não depender de ‘dado não existir’
61Wednesday, July 3, 13
Código atual + Dado futuro
• Não depender de ‘dado não existir’
• Não depender de validações no BD
(unicidade, tipo, etc)
62Wednesday, July 3, 13
Código atual + Dado futuro
• Não depender de ‘dado não existir’
• Não depender de validações no BD
(unicidade, tipo, etc)
• Você vai falhar!
Não tem problema com isso
63Wednesday, July 3, 13
Código atual + Dado futuro
64Wednesday, July 3, 13
Código atual + Dado futuro
• Mantenha seus dados limpos - corrija
dados antigos se estiverem sujos
65Wednesday, July 3, 13
Código atual + Dado futuro
• Mantenha seus dados limpos - corrija
dados antigos se estiverem sujos
• Limpe/remova dados obsoletos (ou
deperequetados) e dados não utilizados
66Wednesday, July 3, 13
Código atual + Dado futuro
• Mantenha seus dados limpos - corrija
dados antigos se estiverem sujos
• Limpe/remova dados obsoletos (ou
deperequetados) e dados não utilizados
• Você vai falhar!
Não tem problema com isso
67Wednesday, July 3, 13
Resumindo
(Só queria essa imagem em ALGUM lugar)
68Wednesday, July 3, 13
Resumindo
69Wednesday, July 3, 13
Resumindo
• Avise ao invés de remover
70Wednesday, July 3, 13
Resumindo
• Avise ao invés de remover
• Desacople migrações/sistemas externos de
mudanças de código
71Wednesday, July 3, 13
Resumindo
• Avise ao invés de remover
• Desacople migrações/sistemas externos de
mudanças de código
• Retrocompatibilidade é difícil mas seguro
72Wednesday, July 3, 13
Resumindo
• Avise ao invés de remover
• Desacople migrações/sistemas externos de
mudanças de código
• Retrocompatibilidade é difícil mas seguro
• Compatibilidade futura é quase impossível
mas tudo bem com isso
73Wednesday, July 3, 13
Resumindo
• Avise ao invés de remover
• Desacople migrações/sistemas externos de
mudanças de código
• Retrocompatibilidade é difícil mas seguro
• Compatibilidade futura é quase impossível
mas tudo bem com isso
• Isso é necessário para Entrega Contínua
74Wednesday, July 3, 13
Resumindo
• Avise ao invés de remover
• Desacople migrações/sistemas externos de
mudanças de código
• Retrocompatibilidade é difícil mas seguro
• Compatibilidade futura é quase impossível
mas tudo bem com isso
• Isso é necessário para Entrega Contínua
• Existem ferramentas que ajudam a lidar
com isso. Procure-as!
75Wednesday, July 3, 13
Perguntas
Hugo Corbucci
hugo.corbucci@thoughtworks.com
76Wednesday, July 3, 13

Mais conteúdo relacionado

Mais de Hugo Corbucci

Retrospectivas Ágeis - Agile Brazil 2010 - PT-BR
Retrospectivas Ágeis - Agile Brazil 2010 - PT-BRRetrospectivas Ágeis - Agile Brazil 2010 - PT-BR
Retrospectivas Ágeis - Agile Brazil 2010 - PT-BRHugo Corbucci
 
Lean Lego Game - EA 2009 - PT-BR
Lean Lego Game - EA 2009 - PT-BRLean Lego Game - EA 2009 - PT-BR
Lean Lego Game - EA 2009 - PT-BRHugo Corbucci
 
Agile in FLOSS world - EA 2009 - PT-BR
Agile in FLOSS world - EA 2009 - PT-BRAgile in FLOSS world - EA 2009 - PT-BR
Agile in FLOSS world - EA 2009 - PT-BRHugo Corbucci
 
Métodos Ágeis - DataPrev 2009 - PT-BR
Métodos Ágeis - DataPrev 2009 - PT-BRMétodos Ágeis - DataPrev 2009 - PT-BR
Métodos Ágeis - DataPrev 2009 - PT-BRHugo Corbucci
 
Eclipse Rich Client Platform - FISL 2009 - PT-BR
Eclipse Rich Client Platform - FISL 2009 - PT-BREclipse Rich Client Platform - FISL 2009 - PT-BR
Eclipse Rich Client Platform - FISL 2009 - PT-BRHugo Corbucci
 
Coding Dojo - FISL 2009 - PT-BR
Coding Dojo - FISL 2009 - PT-BRCoding Dojo - FISL 2009 - PT-BR
Coding Dojo - FISL 2009 - PT-BRHugo Corbucci
 
Coding Dojo - Pycon Br 2008 - PT-BR
Coding Dojo - Pycon Br 2008 - PT-BRCoding Dojo - Pycon Br 2008 - PT-BR
Coding Dojo - Pycon Br 2008 - PT-BRHugo Corbucci
 
Coding Dojo - PyCon Br 2008 - EN
Coding Dojo - PyCon Br 2008 - ENCoding Dojo - PyCon Br 2008 - EN
Coding Dojo - PyCon Br 2008 - ENHugo Corbucci
 

Mais de Hugo Corbucci (9)

Retrospectivas Ágeis - Agile Brazil 2010 - PT-BR
Retrospectivas Ágeis - Agile Brazil 2010 - PT-BRRetrospectivas Ágeis - Agile Brazil 2010 - PT-BR
Retrospectivas Ágeis - Agile Brazil 2010 - PT-BR
 
Lean Lego Game - EA 2009 - PT-BR
Lean Lego Game - EA 2009 - PT-BRLean Lego Game - EA 2009 - PT-BR
Lean Lego Game - EA 2009 - PT-BR
 
Agile in FLOSS world - EA 2009 - PT-BR
Agile in FLOSS world - EA 2009 - PT-BRAgile in FLOSS world - EA 2009 - PT-BR
Agile in FLOSS world - EA 2009 - PT-BR
 
Métodos Ágeis - DataPrev 2009 - PT-BR
Métodos Ágeis - DataPrev 2009 - PT-BRMétodos Ágeis - DataPrev 2009 - PT-BR
Métodos Ágeis - DataPrev 2009 - PT-BR
 
Eclipse Rich Client Platform - FISL 2009 - PT-BR
Eclipse Rich Client Platform - FISL 2009 - PT-BREclipse Rich Client Platform - FISL 2009 - PT-BR
Eclipse Rich Client Platform - FISL 2009 - PT-BR
 
Coding Dojo - FISL 2009 - PT-BR
Coding Dojo - FISL 2009 - PT-BRCoding Dojo - FISL 2009 - PT-BR
Coding Dojo - FISL 2009 - PT-BR
 
Archimedes - PT-BR
Archimedes - PT-BRArchimedes - PT-BR
Archimedes - PT-BR
 
Coding Dojo - Pycon Br 2008 - PT-BR
Coding Dojo - Pycon Br 2008 - PT-BRCoding Dojo - Pycon Br 2008 - PT-BR
Coding Dojo - Pycon Br 2008 - PT-BR
 
Coding Dojo - PyCon Br 2008 - EN
Coding Dojo - PyCon Br 2008 - ENCoding Dojo - PyCon Br 2008 - EN
Coding Dojo - PyCon Br 2008 - EN
 

Sistemas Evolutivos ou "pacíficos"

  • 1. Sistemas evolutivos ou “pacíficos” Hugo Corbucci hugo.corbucci@thoughtworks.com 1Wednesday, July 3, 13
  • 2. Agenda Anatomia de uma mudança Mudança de código Mudança de banco de dados Sistemas externos Retro-compatibilidade e Compatibilidade futura 2Wednesday, July 3, 13
  • 3. Anatomia de uma mudança 167 insertions(+), 119 files changed, 153 deletions(-) 3Wednesday, July 3, 13
  • 4. Dissecando uma mudança class Exemplo def nome_velho return 42 end end class Exemplo def nome_novo return 42 end end - def nome_velho + def nome_novo 4Wednesday, July 3, 13
  • 5. Dissecando uma mudança class Exemplo def nome_velho return 42 end end class Exemplo def nome_novo return 42 end end class Resposta def resposta(pergunta) e = Exemplo.new return e.nome_velho end end 5Wednesday, July 3, 13
  • 6. class Resposta def resposta(pergunta) e = Exemplo.new return e.nome_velho end end Dissecando uma mudança class Exemplo def nome_velho return 42 end end class Exemplo def nome_novo return 42 end end 6Wednesday, July 3, 13
  • 7. Evitando o problema class Exemplo def nome_velho return 42 end end class Resposta def answer(pergunta) e = Exemplo.new return e.nome_velho end end 7Wednesday, July 3, 13
  • 8. Evitando o problema class Exemplo def nome_velho return 42 end end class Resposta def answer(pergunta) e = Exemplo.new return e.nome_velho end end class Exemplo def nome_velho puts "Esse método foi deperequetado. Favor usar nome_novo" return nome_novo end def nome_novo return 42 end end 8Wednesday, July 3, 13
  • 9. Que vantagem Maria leva? 9Wednesday, July 3, 13
  • 10. Que vantagem Maria leva? ..........................................................Esse método foi deperequetado. Favor usar nome_novo ....................................................................Esse método foi deperequetado. Favor usar nome_novo .Esse método foi deperequetado. Favor usar nome_novo ...................................................Esse método foi deperequetado. Favor usar nome_novo .................................................................................................... .................................................................................................... ..................................................................................... Finished in 86.438778 seconds. 463 tests, 534 assertions, 0 failures, 0 errors 10Wednesday, July 3, 13
  • 11. Que vantagem Maria leva? ..........................................................Esse método foi deperequetado. Favor usar nome_novo ....................................................................Esse método foi deperequetado. Favor usar nome_novo .Esse método foi deperequetado. Favor usar nome_novo ...................................................Esse método foi deperequetado. Favor usar nome_novo .................................................................................................... .................................................................................................... ..................................................................................... Finished in 86.438778 seconds. 463 tests, 534 assertions, 0 failures, 0 errors 11Wednesday, July 3, 13
  • 12. Sistemas externos (Sim, seu banco de dados é um sistema externo) 12Wednesday, July 3, 13
  • 13. Mudança de BD mysql> describe sessions; +---------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | title | varchar(255) | YES | | NULL | | | summary | text | YES | | NULL | | | description | text | YES | | NULL | | | mechanics | text | YES | | NULL | | | benefits | text | YES | | NULL | | | target_audience | varchar(255) | YES | | NULL | | | author_id | int(11) | YES | MUL | NULL | | | experience | text | YES | | NULL | | | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | track_id | int(11) | YES | MUL | NULL | | | session_type_id | int(11) | YES | MUL | NULL | | | duration_mins | int(11) | YES | | NULL | | | audience_level_id | int(11) | YES | MUL | NULL | | | state | varchar(255) | YES | | NULL | | | conference_id | int(11) | YES | MUL | NULL | | | language | varchar(255) | YES | | NULL | | +---------------------+--------------+------+-----+---------+----------------+ 19 rows in set (0.11 sec) 13Wednesday, July 3, 13
  • 14. Mudança de BD mysql> ALTER TABLE sessions DROP COLUMN experience; Query OK, 0 rows affected (1.14 sec) Records: 0 Duplicates: 0 Warnings: 0 14Wednesday, July 3, 13
  • 15. Mudança de BD mysql> describe sessions; +---------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | title | varchar(255) | YES | | NULL | | | summary | text | YES | | NULL | | | description | text | YES | | NULL | | | mechanics | text | YES | | NULL | | | benefits | text | YES | | NULL | | | target_audience | varchar(255) | YES | | NULL | | | author_id | int(11) | YES | MUL | NULL | | | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | track_id | int(11) | YES | MUL | NULL | | | session_type_id | int(11) | YES | MUL | NULL | | | duration_mins | int(11) | YES | | NULL | | | audience_level_id | int(11) | YES | MUL | NULL | | | state | varchar(255) | YES | | NULL | | | conference_id | int(11) | YES | MUL | NULL | | | language | varchar(255) | YES | | NULL | | +---------------------+--------------+------+-----+---------+----------------+ 18 rows in set (0.11 sec) 15Wednesday, July 3, 13
  • 16. Mudança de BD mysql> describe sessions; +---------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | title | varchar(255) | YES | | NULL | | | summary | text | YES | | NULL | | | description | text | YES | | NULL | | | mechanics | text | YES | | NULL | | | benefits | text | YES | | NULL | | | target_audience | varchar(255) | YES | | NULL | | | author_id | int(11) | YES | MUL | NULL | | | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | track_id | int(11) | YES | MUL | NULL | | | session_type_id | int(11) | YES | MUL | NULL | | | duration_mins | int(11) | YES | | NULL | | | audience_level_id | int(11) | YES | MUL | NULL | | | state | varchar(255) | YES | | NULL | | | conference_id | int(11) | YES | MUL | NULL | | | language | varchar(255) | YES | | NULL | | +---------------------+--------------+------+-----+---------+----------------+ 18 rows in set (0.11 sec) 16Wednesday, July 3, 13
  • 17. Lá no código class Session def experience return execute("select experience from sessions where id = ?", id) end end 17Wednesday, July 3, 13
  • 18. Lá no código > session.experience ColumnNotFoundException: no column named experience 18Wednesday, July 3, 13
  • 19. Lá no código > session.experience ColumnNotFoundException: no column named experience E agora José? 19Wednesday, July 3, 13
  • 20. Como evitar? V1 Código usa experience BD tem experience V2 Código não usa experience BD não tem experience 20Wednesday, July 3, 13
  • 21. Como evitar? V1 Código usa experience BD tem experience V2 Código não usa experience BD não tem experience 21Wednesday, July 3, 13
  • 22. Como evitar? V1 Código usa experience BD tem experience V2 Código não usa experience BD não tem experience V1.5 Código não usa experience BD tem experience 22Wednesday, July 3, 13
  • 23. Como evitar? V1 Código usa experience BD tem experience V2 Código não usa experience BD não tem experience V1.5 Código não usa experience BD tem experience 23Wednesday, July 3, 13
  • 24. E a adição? V1 Código não usa limit BD não tem limit V2 Código usa limit BD tem limit 24Wednesday, July 3, 13
  • 25. E a adição? V1 Código não usa limit BD não tem limit V2 Código usa limit BD tem limit 25Wednesday, July 3, 13
  • 26. E adição? V1 Código não usa limit BD não tem limit V2 Código usa limit BD tem limit V1.5 Código não usa limit BD tem limit 26Wednesday, July 3, 13
  • 27. E adição? V1 Código não usa limit BD não tem limit V2 Código usa limit BD tem limit V1.5 Código não usa limit BD tem limit 27Wednesday, July 3, 13
  • 29. Explicitar class Subclasse < Superclasse end > implementacao = Subclasse.new > implementacao.metodo_da_super_classe 29Wednesday, July 3, 13
  • 30. Explicitar class Subclasse < Superclasse end > implementacao = Subclasse.new > implementacao.metodo_da_super_classe class Subclasse < Superclasse def metodo_da_super_classe super end end 30Wednesday, July 3, 13
  • 31. Avisar class Subclasse < Superclasse def metodo_da_super_classe puts "Esse método está sendo deperequetado. Favor não usar mais" super end end 31Wednesday, July 3, 13
  • 32. Avisar class Subclasse < Superclasse def metodo_da_super_classe puts "Esse método está sendo deperequetado. Favor não usar mais" super end end > implementacao = Subclasse.new > implementacao.metodo_da_super_classe Esse método está sendo deperequetado. Favor não usar mais 32Wednesday, July 3, 13
  • 33. Duplicar class Subclasse < Superclasse def metodo_da_super_classe puts "Esse método está sendo deperequetado. Favor usar novo_metodo" super end def novo_metodo 42 end end 33Wednesday, July 3, 13
  • 34. Duplicar class Subclasse < Superclasse def metodo_da_super_classe puts "Esse método está sendo deperequetado. Favor usar novo_metodo" super return novo_metodo end def novo_metodo 42 end end 34Wednesday, July 3, 13
  • 35. Descontinuar class Subclasse < Superclasse def metodo_da_super_classe puts "Esse método está sendo deperequetado. Favor usar novo_metodo" return novo_metodo end def novo_metodo 42 end end 35Wednesday, July 3, 13
  • 36. Proteger class Subclasse < Superclasse def metodo_da_super_classe raise "Esse método está deperequetado. Use novo_metodo" end def novo_metodo 42 end end 36Wednesday, July 3, 13
  • 37. Limpar class Subclasse < Superclasse def novo_metodo 42 end end 37Wednesday, July 3, 13
  • 38. Sistemas externos Estratégias de evolução 38Wednesday, July 3, 13
  • 39. Mesmo padrão Sistema com contrato velho Externo com contrato velho 39Wednesday, July 3, 13
  • 40. Mesmo padrão Sistema com contrato velho Externo com contrato velho Sistema com contrato velho e novo Externo com contrato velho 40Wednesday, July 3, 13
  • 41. Mesmo padrão Sistema com contrato velho Externo com contrato velho Sistema com contrato velho e novo Externo com contrato novo Sistema com contrato velho e novo Externo com contrato velho 41Wednesday, July 3, 13
  • 42. Mesmo padrão Sistema com contrato velho Externo com contrato velho Sistema com contrato velho e novo Externo com contrato novo Sistema com contrato velho e novo Externo com contrato velho Sistema com contrato novo Externo com contrato novo 42Wednesday, July 3, 13
  • 43. Troca de mensagens { nome: “Hugo Corbucci”, nascimento: “1983-12-26” } 43Wednesday, July 3, 13
  • 44. Troca de mensagens { nome: “Hugo Corbucci”, nascimento: “1983-12-26” } { nome: “Hugo Corbucci”, nascimento: “1983-12-26”, primeiro_nome: “Hugo”, ultimo_nome: “Corbucci” } 44Wednesday, July 3, 13
  • 46. Versionamento /api/v1/ { nome: “Hugo Corbucci”, nascimento: “1983-12-26” } /api/v2/ { nascimento: “1983-12-26”, primeiro_nome: “Hugo”, ultimo_nome: “Corbucci” } 46Wednesday, July 3, 13
  • 48. Código Velho + Dado Velho Código Velho + Dado Novo Código Novo + Dado Velho Código Novo + Dado Novo Retro-compatibilidade 48Wednesday, July 3, 13
  • 49. Código Velho + Dado Velho Código Velho + Dado Novo Código Novo + Dado Velho Código Novo + Dado Novo Retro-compatibilidade 49Wednesday, July 3, 13
  • 50. Código Velho + Dado Novo 50Wednesday, July 3, 13
  • 51. Código Velho + Dado Novo •Não remover dado usado pelo código velho 51Wednesday, July 3, 13
  • 52. Código Velho + Dado Novo •Não remover dado usado pelo código velho •Não mudar acesso de dados 52Wednesday, July 3, 13
  • 53. Código Velho + Dado Novo •Não remover dado usado pelo código velho •Não mudar acesso de dados •Não mudar semântica de dados 53Wednesday, July 3, 13
  • 54. Código Novo + Dado Velho 54Wednesday, July 3, 13
  • 55. Código Novo + Dado Velho • Ler novo dado se presente – usar o velho se ausente 55Wednesday, July 3, 13
  • 56. Código Novo + Dado Velho • Ler novo dado se presente – usar o velho se ausente • Escrever novo dado se possível – escrever dado velho se não der 56Wednesday, July 3, 13
  • 57. Código Novo + Dado Velho • Ler novo dado se presente – usar o velho se ausente • Escrever novo dado se possível – escrever dado velho se não der • Adicionar logs para acompanhar migração de dados 57Wednesday, July 3, 13
  • 58. Código atual + Dado atual Código atual + Dado futuro Código futuro + Dado atual Código futuro + Dado futuro Compatibilidade futura 58Wednesday, July 3, 13
  • 59. Código atual + Dado atual Código atual + Dado futuro Código futuro + Dado atual Código futuro + Dado futuro Compatibilidade futura 59Wednesday, July 3, 13
  • 60. Código atual + Dado futuro 60Wednesday, July 3, 13
  • 61. Código atual + Dado futuro • Não depender de ‘dado não existir’ 61Wednesday, July 3, 13
  • 62. Código atual + Dado futuro • Não depender de ‘dado não existir’ • Não depender de validações no BD (unicidade, tipo, etc) 62Wednesday, July 3, 13
  • 63. Código atual + Dado futuro • Não depender de ‘dado não existir’ • Não depender de validações no BD (unicidade, tipo, etc) • Você vai falhar! Não tem problema com isso 63Wednesday, July 3, 13
  • 64. Código atual + Dado futuro 64Wednesday, July 3, 13
  • 65. Código atual + Dado futuro • Mantenha seus dados limpos - corrija dados antigos se estiverem sujos 65Wednesday, July 3, 13
  • 66. Código atual + Dado futuro • Mantenha seus dados limpos - corrija dados antigos se estiverem sujos • Limpe/remova dados obsoletos (ou deperequetados) e dados não utilizados 66Wednesday, July 3, 13
  • 67. Código atual + Dado futuro • Mantenha seus dados limpos - corrija dados antigos se estiverem sujos • Limpe/remova dados obsoletos (ou deperequetados) e dados não utilizados • Você vai falhar! Não tem problema com isso 67Wednesday, July 3, 13
  • 68. Resumindo (Só queria essa imagem em ALGUM lugar) 68Wednesday, July 3, 13
  • 70. Resumindo • Avise ao invés de remover 70Wednesday, July 3, 13
  • 71. Resumindo • Avise ao invés de remover • Desacople migrações/sistemas externos de mudanças de código 71Wednesday, July 3, 13
  • 72. Resumindo • Avise ao invés de remover • Desacople migrações/sistemas externos de mudanças de código • Retrocompatibilidade é difícil mas seguro 72Wednesday, July 3, 13
  • 73. Resumindo • Avise ao invés de remover • Desacople migrações/sistemas externos de mudanças de código • Retrocompatibilidade é difícil mas seguro • Compatibilidade futura é quase impossível mas tudo bem com isso 73Wednesday, July 3, 13
  • 74. Resumindo • Avise ao invés de remover • Desacople migrações/sistemas externos de mudanças de código • Retrocompatibilidade é difícil mas seguro • Compatibilidade futura é quase impossível mas tudo bem com isso • Isso é necessário para Entrega Contínua 74Wednesday, July 3, 13
  • 75. Resumindo • Avise ao invés de remover • Desacople migrações/sistemas externos de mudanças de código • Retrocompatibilidade é difícil mas seguro • Compatibilidade futura é quase impossível mas tudo bem com isso • Isso é necessário para Entrega Contínua • Existem ferramentas que ajudam a lidar com isso. Procure-as! 75Wednesday, July 3, 13