José Araújo 
Migrando ~4 milhões de linhas de 
código de Delphi 7 > XE7
Quem? 
• 9 anos na área de desenvolvimento; 
• Fortes Informática(Fortes Report); 
• Delphi Developer Certification; 
• Embarcadero Conference 2011, 2012; 
• Sócio da Startup Top Sistemas;
Um pouco de história 
• Clipper; 
• Delphi 1; 
• BDE; 
• Mesmos programadores; 
• Conceito RAD; 
• 15 anos de legado; 
• +50 programadores/analistas;
Motivação 
• Delphi 7 obsoleto; 
• Problemas com link edição; 
• Se livrar do BDE; 
• Colaboradores insatisfeitos; 
• Embarcadero (Delphi – O Retorno); 
• AlphaControls(Projeto Botox);
Dificuldades 
• Muitos usuários(+40 mil); 
• Backlog, bugs; 
• Muitas pessoas envolvidas; 
• GP’$; 
• Vendedore$; 
• Diretore$;
1ª reunião 
• GP’s, Vendedores, Diretores e Programadores; 
• Todos na mesma sala;
2ª reunião 
• Reuniões separadas primeiro; 
• GP’s, Vendedores, Diretores; 
• Estratégia para cada grupo; 
• GP’s: Entregar mais tarefas; 
• Vendedores: Sistema mais rico; 
• Diretores: Maior retorno $;
3ª reunião 
• GP’s, Vendedores, Diretores e Programadores; 
• Todos na mesma sala;
Recursos 
• Pessoas para executar; 
• 1 membro de cada equipe; 
• Algumas horas por dia; 
• Equipe PeD (Pesquisa e Desenvolvimento); 
• Buscar novos conhecimento; 
• Resolver impedimentos do setor;
Vamos começar
Cenário 
• 9 sistemas; 
• 9 segmentos diferentes; 
• ~4 milhões de linhas; 
• Firebird e SQLServer; 
• Delphi 7 (12 anos); 
• BDE (Era o que tinha); 
• Poucos componentes de terceiros;
Analisando valores 
• Delphi 7 x Delphi XE; 
• BDE x DBXpress; 
• Morro(MOnitor de eRROs); 
• Maiores queixas dos clientes; 
• Problemas com blobs; 
• MaxFileHandle;
DLib2 
• BDE <> DBXpress(Totalmente); 
• E se amanhã mudar denovo; 
• Design Pattern Strategy; 
• Wrapper(Empacotador); 
• Mínimo de impacto nos sistemas; 
• Reduzir tempo de conversão;
Conversor 
• Próprio; 
• reFind; 
• Programações “criativas”; 
• *.dfm; 
• *.pas; 
• Protótipos; 
• Passos pequenos;
Exemplos 
• TDataBase > TDLServerConnection; 
• SessionName: Morreu; 
• ServerAddress: Morreu; 
• DataBaseName > ConnectionName; 
• DataBaseFile > DataBaseURL; 
• TQuery > TDLQuery; 
• TDataSource > TDLDataSource; 
• Uses: DLDataSet, DLConnections; 
• DB, 
• DB;
Técnica 
• DevOps (Blue/Green); 
• Rollback rápido; 
Sistema 
Router 
(Conversor) 
BDE 
DLib2 DBXpress
Implantação 
• Delphi 7 ainda; 
• Homologamos internamente; 
• Programa Beta; 
• Nossos Representantes(Filiais); 
• Servidor de Deploy gera 2 pacotes;
Técnica
Técnica 
• Implantação “Canário” (Teste em Produção); 
• DevOps; 
• Sinalizador; 
Usuários 
Router 
(Implantadores) 
BDE 
DLib2 DBXpress 
95% 
5%
BDE Adeus! 
1800 AC – 2013 DC
Delphi XE? 
• Volta as atenções; 
• Ânimo da equipe; 
• Vamos para o XE; 
• Investimento “Alto”;
Delphi 7 > XE7 
• Benefícios; 
• Linguagem; 
• 64 bits; 
• FireDAC; 
• VCL Style;
Técnica 
• Arquitetura de convivência; 
• Não atrapalhar a produção; 
• Mudança paralela; 
• Diretivas de compilação;
Exemplos 
uses 
{$IF CompilerVersion = cvDelphiXE7} 
DBXCommon, 
{$ELSE} 
DBXpress, 
{$IFEND}
Exemplos 
const 
cvDelphiXE = 22; //VER220 
cvDelphiXE2 = 23; //VER230 
cvDelphiXE3 = 24; //VER240 
cvDelphiXE4 = 25; //VER250 
cvDelphiXE5 = 26; //VER260 
cvDelphiXE6 = 27; //VER270 
cvDelphiXE7 = 28; //VER280
Exemplos 
{$IF CompilerVersion = cvDelphiXE7} 
function TDLQuery.GetRecord(Buffer: TRecBuf; ...): TGetResult; 
{$ELSE} 
function TDLQuery.GetRecord(Buffer: PChar; ...): TGetResult; 
{$IFEND} 
begin 
try 
Result := inherited GetRecord(Buffer, GetMode, DoCheck); 
except 
on e: Exception do 
raise Exception.Create(...); 
end; 
end;
Exemplos 
{$IF CompilerVersion = cvDelphiXE7} 
procedure OnDocumentComplete(ASender: TObject; const pDisp: 
IDispatch; const URL: OleVariant); 
{$ELSE} 
procedure OnDocumentComplete(Sender: TObject; const pDisp: 
IDispatch; var URL: OleVariant); 
{$IFEND}
O Exemplo 
unit DelphiUp; 
interface 
const 
{$IF CompilerVersion = cvDelphiXE7} 
EmptyBookmark = nil; 
{$ELSE} 
EmptyBookmark = ''; 
{$IFEND} 
type 
{$IF CompilerVersion = cvDelphi7} 
TBookmark = string; 
{$IFEND}
Migração Total 
• Sim! Analisamos;
Segurança
Segurança...
Segurança... 
• Testes automatizados; 
• Código versionado; 
• Testes humanos; 
• Passos pequenos; 
• Teste Complete; 
• DUnit; 
• Protótipos;
joseafilho@gmail.com 
@cengenharia 
centraldaengenharia.wordpress.com

Migrando 4 milhões de linhas de Delphi 7 para XE7

  • 2.
    José Araújo Migrando~4 milhões de linhas de código de Delphi 7 > XE7
  • 3.
    Quem? • 9anos na área de desenvolvimento; • Fortes Informática(Fortes Report); • Delphi Developer Certification; • Embarcadero Conference 2011, 2012; • Sócio da Startup Top Sistemas;
  • 4.
    Um pouco dehistória • Clipper; • Delphi 1; • BDE; • Mesmos programadores; • Conceito RAD; • 15 anos de legado; • +50 programadores/analistas;
  • 5.
    Motivação • Delphi7 obsoleto; • Problemas com link edição; • Se livrar do BDE; • Colaboradores insatisfeitos; • Embarcadero (Delphi – O Retorno); • AlphaControls(Projeto Botox);
  • 6.
    Dificuldades • Muitosusuários(+40 mil); • Backlog, bugs; • Muitas pessoas envolvidas; • GP’$; • Vendedore$; • Diretore$;
  • 7.
    1ª reunião •GP’s, Vendedores, Diretores e Programadores; • Todos na mesma sala;
  • 8.
    2ª reunião •Reuniões separadas primeiro; • GP’s, Vendedores, Diretores; • Estratégia para cada grupo; • GP’s: Entregar mais tarefas; • Vendedores: Sistema mais rico; • Diretores: Maior retorno $;
  • 9.
    3ª reunião •GP’s, Vendedores, Diretores e Programadores; • Todos na mesma sala;
  • 10.
    Recursos • Pessoaspara executar; • 1 membro de cada equipe; • Algumas horas por dia; • Equipe PeD (Pesquisa e Desenvolvimento); • Buscar novos conhecimento; • Resolver impedimentos do setor;
  • 11.
  • 12.
    Cenário • 9sistemas; • 9 segmentos diferentes; • ~4 milhões de linhas; • Firebird e SQLServer; • Delphi 7 (12 anos); • BDE (Era o que tinha); • Poucos componentes de terceiros;
  • 13.
    Analisando valores •Delphi 7 x Delphi XE; • BDE x DBXpress; • Morro(MOnitor de eRROs); • Maiores queixas dos clientes; • Problemas com blobs; • MaxFileHandle;
  • 14.
    DLib2 • BDE<> DBXpress(Totalmente); • E se amanhã mudar denovo; • Design Pattern Strategy; • Wrapper(Empacotador); • Mínimo de impacto nos sistemas; • Reduzir tempo de conversão;
  • 15.
    Conversor • Próprio; • reFind; • Programações “criativas”; • *.dfm; • *.pas; • Protótipos; • Passos pequenos;
  • 16.
    Exemplos • TDataBase> TDLServerConnection; • SessionName: Morreu; • ServerAddress: Morreu; • DataBaseName > ConnectionName; • DataBaseFile > DataBaseURL; • TQuery > TDLQuery; • TDataSource > TDLDataSource; • Uses: DLDataSet, DLConnections; • DB, • DB;
  • 17.
    Técnica • DevOps(Blue/Green); • Rollback rápido; Sistema Router (Conversor) BDE DLib2 DBXpress
  • 18.
    Implantação • Delphi7 ainda; • Homologamos internamente; • Programa Beta; • Nossos Representantes(Filiais); • Servidor de Deploy gera 2 pacotes;
  • 19.
  • 20.
    Técnica • Implantação“Canário” (Teste em Produção); • DevOps; • Sinalizador; Usuários Router (Implantadores) BDE DLib2 DBXpress 95% 5%
  • 21.
    BDE Adeus! 1800AC – 2013 DC
  • 22.
    Delphi XE? •Volta as atenções; • Ânimo da equipe; • Vamos para o XE; • Investimento “Alto”;
  • 23.
    Delphi 7 >XE7 • Benefícios; • Linguagem; • 64 bits; • FireDAC; • VCL Style;
  • 24.
    Técnica • Arquiteturade convivência; • Não atrapalhar a produção; • Mudança paralela; • Diretivas de compilação;
  • 25.
    Exemplos uses {$IFCompilerVersion = cvDelphiXE7} DBXCommon, {$ELSE} DBXpress, {$IFEND}
  • 26.
    Exemplos const cvDelphiXE= 22; //VER220 cvDelphiXE2 = 23; //VER230 cvDelphiXE3 = 24; //VER240 cvDelphiXE4 = 25; //VER250 cvDelphiXE5 = 26; //VER260 cvDelphiXE6 = 27; //VER270 cvDelphiXE7 = 28; //VER280
  • 27.
    Exemplos {$IF CompilerVersion= cvDelphiXE7} function TDLQuery.GetRecord(Buffer: TRecBuf; ...): TGetResult; {$ELSE} function TDLQuery.GetRecord(Buffer: PChar; ...): TGetResult; {$IFEND} begin try Result := inherited GetRecord(Buffer, GetMode, DoCheck); except on e: Exception do raise Exception.Create(...); end; end;
  • 28.
    Exemplos {$IF CompilerVersion= cvDelphiXE7} procedure OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant); {$ELSE} procedure OnDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); {$IFEND}
  • 29.
    O Exemplo unitDelphiUp; interface const {$IF CompilerVersion = cvDelphiXE7} EmptyBookmark = nil; {$ELSE} EmptyBookmark = ''; {$IFEND} type {$IF CompilerVersion = cvDelphi7} TBookmark = string; {$IFEND}
  • 30.
    Migração Total •Sim! Analisamos;
  • 31.
  • 32.
  • 33.
    Segurança... • Testesautomatizados; • Código versionado; • Testes humanos; • Passos pequenos; • Teste Complete; • DUnit; • Protótipos;
  • 34.

Notas do Editor

  • #4 [9 anos] Dedicados: Delphi, Java, Android e Engenharia de Software; [Fortes] 5 anos, Programador nos sistemas finais, Analista na equipe PeD; [EC 2011] -Criando um servidor de integração contínua na prática; [EC 2012] -Melhorando a qualidade do código através de métricas; -Material se encontra na revista Active Delphi e Blog; [TopSistemas] -Menos de 1 ano, Automação, HTTP;
  • #5 [Clipper] Fortes, Sistemas Contábeis; Paradox Depois de vários anos apareceu Delphi 1; Delphi sistemas intuitivos e produtividade; Começou utilizando a forma RAD de ser;
  • #6 [Delphi 7] -12 anos, editor defasado, linguagem obsoleta; -Ferramenta atualizada XE; [Link edição] -Sistema muito grande, vários problemas diários durante as compilações; -Dica muito boa: Trocar dll Link32 do D7 pela do XE; [Colaboradores] -Recursos .Net, Java, Estudando outras ferramentas. -Criar frameworks e a linguagem não da suporte; [AlphaControls] -Tentativa de deixar nossos sistemas mais atraentes; -Criar uma identidade visual para nossos sistemas; -Padronizar;
  • #7 [Pessoas] -Principal dificuldade foi pessoas; -GP’s, Vendedores, Diretores -Cada produto tem seu próprio eco-sistema; -Todos com prioridades diferentes; -Visões diferentes; -Na nossa analise não teríamos problema com tecnologia; -Nem com mão de obra;
  • #8 -Nós empolgadissímos; -Figura de animção!!! -Não conseguimos chegar a lugar nenhum; -Reagrupar e traçar nova estrátegia;
  • #9 -Para cada grupo usamos estratégias diferentes; --GP’s(Programadores iriam realizar as tarefas de forma mais eficaz); --Vendedores(Sistema iria ficar mais Rico, logo iriam vender mais, GPs iriam entregar mais tarefas); --Diretores(Vendedores iriam vender mais, GP’s iriam entregar mais Logo Mais grana);
  • #10 Após falar com todos separados; Alinhar todos;
  • #11 [Peraí, precisamos de gente pra fazer] Selecionar candidatos para executar; 1 Membro de cada equipe trabalhando algumas horas por dia; Não deu certo, tinha dia que a equipe não libera a pessoa; Quando liberava tinha muitas interrupções; Suporte; Estava andando muito lento; Tivemos outra reunião e acabamos criando a Equipe PeD; Nesse ponto, todos já estavam empolgados pelos resultados; As reuniões já eram mais animadoras;
  • #13 [Sistemas] -AC(Contábil, Fiscal, Pessoal) > +1,5 milhões de linhas; -Ponto, Gestão(Financeiro, Estoque), Cargas, Frotas; -Dlib: biblioteca própria para encapsular particularidades, reduzir escrita de código; [Componentes] -DevExpress(Quantum Grid); -AlphaControls(Skins); -SQLMemTable(Tabela em memória); -madException(Captura de Runtime Erros - Morro); [Compilacoes] -Existem alguns sistemas compilando em XE; -Deploy em Delphi 7;
  • #14 [Escolher] -Entre D7 e XE; -BDE e DBXpress; [Morro] -Ferramenta para coletas de erros; -Enviar do windows e de várias empresas; -Por sistema; -Envia a CallStack, Print da tela atual(Não do desktop inteiro); [Blobs] -Nossos sistemas tem muitos blobs; [Decisão] -Se livrar do BDE primeiro; -Agrega mais valor ao cliente final;
  • #15 [DLib1] -Herdando diretamente do BDE; -Estruturas totalmente diferentes entre BDE e DBXpress; -Esforço gigante para migrar; -Maior tempo de testar; [DLib2] -Estrutura de acesso banco de dados partindo do ZERO; -Não reescrevemos a tecnologia de acesso a dados; -Encapsulamos o tipo de tecnologia utilizada; -Strategy Wiki: O padrão Strategy permite definir novas operações sem alterar as classes dos elementos sobre os quais opera. Este padrão permite que o algoritmo possa variar independentemente dos clientes que o utilizam. -Mantemos a compatibilidade com os recursos utilizados nos sistemas; -Insert, Edit, IndexFields, RecordCount... -Trouxemos o problema para dentro da nossa biblioteca; -Protegemos os sistemas; [ABRIR UML JPG]
  • #16 [Próprio] -Na nossa época não existia nenhum tipo de utilitário oficial da Embarcadero; -Começamos devagar, bem inocente, ReplaceAll, Deu nem para o começo; -Maioria do código esta padronizado, porém existe muita criatividade espalhada; -Em alguns casos, foi até uma oportunidade de refatorar o código; [DFM] -Classe Métodos(Substituir o componente inteiro, Adicionar, Substituir e Remover Propriedades); -DFMs Binários; -Até que foi tranquilo, existe um padrão; [PAS] -Tentamos comecar igual ao DFM, não existe um padrão; -Para cada parte do pas fizemos um método virtual; -Uses, Interface, Implementation; -Cada equipe implementa as particularidades dos seus sistemas;
  • #17 [Removendo] -Replaces especificos dentro do código para remover o que não era mais necessário;
  • #18 [DLib2] -Branch da DLib1; -Trabalhar sem afetar a linha principal de desenvolvimento; -Podemos acompanhar todas as mudanças feitas na DLib1; [Router] -Técnica para Internet; -Quando precisava testar, era só converter; -Nada de mudar o principal; -Cópia com todas as modificações; -Fontes2;
  • #19 [Representantes] -Retorno de cara na performance e estabilidade; -Filiais não queriam mais utilizar a DLib1(BDE); -Empolgação total; -Filiais queriam implantar nos seus clientes; -Controlamos os ânimos e agimos com a realidade;
  • #20 [Implantar nos demais clientes] [Mineiros] -Gases tóxicos; -Canários morriam primeiro;
  • #21 [Canário] -Forma de poder testar em produção; -Impacto controlado; -Reverter a situação rapidamente; -Caption do Form tinha DLib2;
  • #22 [Comemoração] -Fomos recompensados; -Festa total; -Só alegria; -E agora?
  • #23 [XE] -Porque? -Com a DLib2 acabamos esquecendo os companheiros; -Colaboradores: Empresa estava muito preocupada com o animo da equipe; -Até o momento só tinhamos agradado os Clientes, Vendedores, GPs e Gerentes; -Animo da equipe foi FUNDAMENTAL para reforçar a ida para o XE; -Nunca vi o setor tão empolgado quando nós anunciamos que iríamos para XE; [Investimento] -Cara, você vive disso; -Maior poder perante a Embarcadero; -Com que moral você vai cobrar a empresa se usa uma versão pirata; -Se por no lugar do outro, Se alguém piratear seu software? -Uma hora o cerco vai fechar; -Estamos na era das validações de licença ser online; -Vida longa a nossa ferramenta de trabalho;
  • #24 [XE] -Retornos imediatos; -Maior de todos: Colaboradores; -Linguagem tem recursos modernos como jamais teve antes; -Generics, Metodos anonimos, RTTI muito robusta, modificadores de acesso(Strict, Final, Abstract Class); -Class Helpers; -Estabilidade; -Gerenciamento de memória; -Milhares de melhorias, não dúvidas sobre isso; -Não ver somente o mobile como melhorias, existes várias outras; -Lógico que a Embarcadero irá dar enfase ao mobile;
  • #25 [Convivencia] -Desafio: Migrar para a nova plataforma sem engasgar a do negócio; -Diferente da DLib, teríamos que mexer no código fonte das equipes; -Maioria das alterações ocorreu dentro da nossa biblioteca; -Diretivas não impactam funcionalmente no funcionamento da outra plataforma; [Passo a Passo] -Usamos pouco o conversor; -Afinal de contas é código Delphi, a linguagem não mudou; -Preferimos analisar caso a caso; -Já tinhamos toda a carga de experiencia de conversão do BDE;
  • #26 [DBXpress] -Dentro da nossa biblioteca; -cvDelphiXE7 unit chamada DLCompilerConts tem todas as versões de compiladores; -Maior legibilidade;
  • #27 Unit DLCompilerConsts;
  • #28 -Override do ClientDataSet;
  • #29 -Handle para o evento OnDocumentComplete do TWebBrowser; -De VAR para CONST; -Até aqui erros de compilação; -Casos isolados;
  • #30 -Bookmark no delphi 7 é um tipo primitivo; -No XE é um tipo complexo; -Usavamos aos milhares no Delphi7 bookmark como string; -Substituir os bookmark para Tbookmark; -Basta declarar a DelphiUP na uses;
  • #31 [Migração] -Já haviamos analisado várias vezes a possibilidade; -Por baixo de 5 a 7 anos; -Detalhe: Esses 5 a 7 anos é na unidade de medida Programador! -Nossa conclusão – IMAGEM; -Não é impossível, mais....; -Todos falam em WEB, alguém em sã conciência acredita mesmo que o Desktop vai morrer duma hora pra outra; -Estruture seu sistema para rodar na sobre HTTP e seja feliz; -Roda em todo lugar. Existem quantos mercantis ou bares que tem um MAC ou Linux no caixa! -No final das contas tudo se resume em MAIS DO MESMO;
  • #32 [Golden Gates]
  • #33 [Golden Gates] Em média, na época, uma fatalidade foi registrada, por cada milhão de dólares gastos em um projeto dessa magnitude. Mas o engenheiro chefe da ponte, Joseph Strauss, cerca de vinte milhões de dólares gastos para a construção não deve ser sinônimo de vinte mortes entre seus funcionários.
  • #34 [Protótipo] Maneira barata de viabilizar algo; Acredite, começe;