SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

Mais procurados

Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
Valerio Radice
 
Guia rapido java v2
Guia rapido java v2Guia rapido java v2
Guia rapido java v2
Mario Jorge Pereira
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
Victor Hazin da Rocha
 
Gradle - the Enterprise Automation Tool
Gradle  - the Enterprise Automation ToolGradle  - the Enterprise Automation Tool
Gradle - the Enterprise Automation Tool
Izzet Mustafaiev
 
[Curso Java Basico] Aula 12: Lendo dados do teclado usando a classe Scanner
[Curso Java Basico] Aula 12: Lendo dados do teclado usando a classe Scanner[Curso Java Basico] Aula 12: Lendo dados do teclado usando a classe Scanner
[Curso Java Basico] Aula 12: Lendo dados do teclado usando a classe Scanner
Loiane Groner
 
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
Top 10 Mistakes When Migrating From Oracle to PostgreSQLTop 10 Mistakes When Migrating From Oracle to PostgreSQL
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
Jim Mlodgenski
 
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais) [Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
Loiane Groner
 
Reactjs workshop
Reactjs workshop Reactjs workshop
Reactjs workshop
Ahmed rebai
 
Introduction to Objective - C
Introduction to Objective - CIntroduction to Objective - C
Introduction to Objective - C
Asim Rais Siddiqui
 
Java Interview Questions and Answers | Spring and Hibernate Interview Questio...
Java Interview Questions and Answers | Spring and Hibernate Interview Questio...Java Interview Questions and Answers | Spring and Hibernate Interview Questio...
Java Interview Questions and Answers | Spring and Hibernate Interview Questio...
Edureka!
 
Swagger UI
Swagger UISwagger UI
Swagger UI
Walaa Hamdy Assy
 
React for Beginners
React for BeginnersReact for Beginners
React for Beginners
Derek Willian Stavis
 
Orquestração de containers com Rancher
Orquestração de containers com RancherOrquestração de containers com Rancher
Orquestração de containers com Rancher
Alex Ishida
 
Nodejs functions & modules
Nodejs functions & modulesNodejs functions & modules
Nodejs functions & modules
monikadeshmane
 
Express JS
Express JSExpress JS
Express JS
Alok Guha
 
The Play Framework at LinkedIn
The Play Framework at LinkedInThe Play Framework at LinkedIn
The Play Framework at LinkedIn
Yevgeniy Brikman
 
Advanced Json
Advanced JsonAdvanced Json
Advanced Json
guestfd7d7c
 
Introduction to Sightly and Sling Models
Introduction to Sightly and Sling ModelsIntroduction to Sightly and Sling Models
Introduction to Sightly and Sling Models
Stefano Celentano
 
Exemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dadosExemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dados
Luis Borges Gouveia
 
04 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.004 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.0
César Augusto Pessôa
 

Mais procurados (20)

Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
 
Guia rapido java v2
Guia rapido java v2Guia rapido java v2
Guia rapido java v2
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Gradle - the Enterprise Automation Tool
Gradle  - the Enterprise Automation ToolGradle  - the Enterprise Automation Tool
Gradle - the Enterprise Automation Tool
 
[Curso Java Basico] Aula 12: Lendo dados do teclado usando a classe Scanner
[Curso Java Basico] Aula 12: Lendo dados do teclado usando a classe Scanner[Curso Java Basico] Aula 12: Lendo dados do teclado usando a classe Scanner
[Curso Java Basico] Aula 12: Lendo dados do teclado usando a classe Scanner
 
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
Top 10 Mistakes When Migrating From Oracle to PostgreSQLTop 10 Mistakes When Migrating From Oracle to PostgreSQL
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
 
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais) [Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
 
Reactjs workshop
Reactjs workshop Reactjs workshop
Reactjs workshop
 
Introduction to Objective - C
Introduction to Objective - CIntroduction to Objective - C
Introduction to Objective - C
 
Java Interview Questions and Answers | Spring and Hibernate Interview Questio...
Java Interview Questions and Answers | Spring and Hibernate Interview Questio...Java Interview Questions and Answers | Spring and Hibernate Interview Questio...
Java Interview Questions and Answers | Spring and Hibernate Interview Questio...
 
Swagger UI
Swagger UISwagger UI
Swagger UI
 
React for Beginners
React for BeginnersReact for Beginners
React for Beginners
 
Orquestração de containers com Rancher
Orquestração de containers com RancherOrquestração de containers com Rancher
Orquestração de containers com Rancher
 
Nodejs functions & modules
Nodejs functions & modulesNodejs functions & modules
Nodejs functions & modules
 
Express JS
Express JSExpress JS
Express JS
 
The Play Framework at LinkedIn
The Play Framework at LinkedInThe Play Framework at LinkedIn
The Play Framework at LinkedIn
 
Advanced Json
Advanced JsonAdvanced Json
Advanced Json
 
Introduction to Sightly and Sling Models
Introduction to Sightly and Sling ModelsIntroduction to Sightly and Sling Models
Introduction to Sightly and Sling Models
 
Exemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dadosExemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dados
 
04 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.004 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.0
 

Destaque

Migrando aplicações para FireDac - Embarcadero Conference 2014
Migrando aplicações para FireDac - Embarcadero Conference 2014Migrando aplicações para FireDac - Embarcadero Conference 2014
Migrando aplicações para FireDac - Embarcadero Conference 2014
Diego Rosa
 
FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015
Guinther Pauli
 
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
Introdução FireDACAcesso multi-banco para Delphi e C++ BuilderIntrodução FireDACAcesso multi-banco para Delphi e C++ Builder
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
Diego Rosa
 
Firebird
FirebirdFirebird
Software de gestão para indústrias de confecção
Software de gestão para indústrias de confecçãoSoftware de gestão para indústrias de confecção
Software de gestão para indústrias de confecção
Infosoft Sistemas Ltda
 
Aitana Launch - Seattle Overview - Português (br)
Aitana Launch - Seattle Overview - Português (br)Aitana Launch - Seattle Overview - Português (br)
Aitana Launch - Seattle Overview - Português (br)
Fernando Rizzato
 
Apostila winthor básico
Apostila winthor básicoApostila winthor básico
Apostila winthor básico
Evandro Felicio.'.
 
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGOEVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
Diogo Rocha Ferreira de Menezes
 
Apresentação de Lançamento do RAD Studio XE7
Apresentação de Lançamento do RAD Studio XE7Apresentação de Lançamento do RAD Studio XE7
Apresentação de Lançamento do RAD Studio XE7
Fernando Rizzato
 

Destaque (9)

Migrando aplicações para FireDac - Embarcadero Conference 2014
Migrando aplicações para FireDac - Embarcadero Conference 2014Migrando aplicações para FireDac - Embarcadero Conference 2014
Migrando aplicações para FireDac - Embarcadero Conference 2014
 
FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015
 
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
Introdução FireDACAcesso multi-banco para Delphi e C++ BuilderIntrodução FireDACAcesso multi-banco para Delphi e C++ Builder
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
 
Firebird
FirebirdFirebird
Firebird
 
Software de gestão para indústrias de confecção
Software de gestão para indústrias de confecçãoSoftware de gestão para indústrias de confecção
Software de gestão para indústrias de confecção
 
Aitana Launch - Seattle Overview - Português (br)
Aitana Launch - Seattle Overview - Português (br)Aitana Launch - Seattle Overview - Português (br)
Aitana Launch - Seattle Overview - Português (br)
 
Apostila winthor básico
Apostila winthor básicoApostila winthor básico
Apostila winthor básico
 
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGOEVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
 
Apresentação de Lançamento do RAD Studio XE7
Apresentação de Lançamento do RAD Studio XE7Apresentação de Lançamento do RAD Studio XE7
Apresentação de Lançamento do RAD Studio XE7
 

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

Fortes Papo Developer
Fortes Papo DeveloperFortes Papo Developer
Fortes Papo Developer
José Araújo
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
Thiago Cifani
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Pablo Dall'Oglio
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 
PHP para aplicações Web de grande porte
PHP para aplicações Web  de grande portePHP para aplicações Web  de grande porte
PHP para aplicações Web de grande porte
Felipe Ribeiro
 
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endModularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Mario Guedes
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
Eduardo Bregaida
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
Kinn Julião
 
PHP(I-Bim).ppt
PHP(I-Bim).pptPHP(I-Bim).ppt
PHP(I-Bim).ppt
MrcioSantos806520
 
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no DelphiTDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
Mario Guedes
 
ORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NET
Jorge Maia
 
Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0
Wendreo L. Fernandes
 
DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015 DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015
Eduardo Bregaida
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Christiano Anderson
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
Paulo Victor Gomes
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta Performance
Felipe Ribeiro
 
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeRepensando padrões e boas práticas java ee
Repensando padrões e boas práticas java ee
Adriano Tavares
 
Linguagem Delphi-Introdução
Linguagem Delphi-IntroduçãoLinguagem Delphi-Introdução
Linguagem Delphi-Introdução
Carlos Eduardo Melo
 
PHP, Mercado e Certificações
PHP, Mercado e CertificaçõesPHP, Mercado e Certificações
PHP, Mercado e Certificações
Fernando Geraldo Mantoan
 
WEBINAR DE LANÇAMENTO DELPHI, C++ BUILDER E RAD STUDIO 10.1 BERLIM
WEBINAR DE LANÇAMENTO DELPHI, C++ BUILDER E RAD STUDIO 10.1 BERLIMWEBINAR DE LANÇAMENTO DELPHI, C++ BUILDER E RAD STUDIO 10.1 BERLIM
WEBINAR DE LANÇAMENTO DELPHI, C++ BUILDER E RAD STUDIO 10.1 BERLIM
Fernando Rizzato
 

Semelhante a Migrando 4 milhões de linhas de Delphi 7 para XE7 (20)

Fortes Papo Developer
Fortes Papo DeveloperFortes Papo Developer
Fortes Papo Developer
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
PHP para aplicações Web de grande porte
PHP para aplicações Web  de grande portePHP para aplicações Web  de grande porte
PHP para aplicações Web de grande porte
 
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endModularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
PHP(I-Bim).ppt
PHP(I-Bim).pptPHP(I-Bim).ppt
PHP(I-Bim).ppt
 
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no DelphiTDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
 
ORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NET
 
Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0
 
DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015 DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentes
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta Performance
 
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeRepensando padrões e boas práticas java ee
Repensando padrões e boas práticas java ee
 
Linguagem Delphi-Introdução
Linguagem Delphi-IntroduçãoLinguagem Delphi-Introdução
Linguagem Delphi-Introdução
 
PHP, Mercado e Certificações
PHP, Mercado e CertificaçõesPHP, Mercado e Certificações
PHP, Mercado e Certificações
 
WEBINAR DE LANÇAMENTO DELPHI, C++ BUILDER E RAD STUDIO 10.1 BERLIM
WEBINAR DE LANÇAMENTO DELPHI, C++ BUILDER E RAD STUDIO 10.1 BERLIMWEBINAR DE LANÇAMENTO DELPHI, C++ BUILDER E RAD STUDIO 10.1 BERLIM
WEBINAR DE LANÇAMENTO DELPHI, C++ BUILDER E RAD STUDIO 10.1 BERLIM
 

Mais de José Araújo

Curso de Delphi - Banco de Dados
Curso de Delphi - Banco de DadosCurso de Delphi - Banco de Dados
Curso de Delphi - Banco de Dados
José Araújo
 
Curso de Delphi - Linguagem Pascal
Curso de Delphi - Linguagem PascalCurso de Delphi - Linguagem Pascal
Curso de Delphi - Linguagem Pascal
José Araújo
 
Curso de Delphi - Lógica de Programação 3
Curso de Delphi - Lógica de Programação 3Curso de Delphi - Lógica de Programação 3
Curso de Delphi - Lógica de Programação 3
José Araújo
 
Curso de Delphi - Lógica de Programação 2
Curso de Delphi - Lógica de Programação 2Curso de Delphi - Lógica de Programação 2
Curso de Delphi - Lógica de Programação 2
José Araújo
 
Curso de Delphi - Lógica de Programacao
Curso de Delphi - Lógica de ProgramacaoCurso de Delphi - Lógica de Programacao
Curso de Delphi - Lógica de Programacao
José Araújo
 
XPCE - Qualidade no Código
XPCE - Qualidade no CódigoXPCE - Qualidade no Código
XPCE - Qualidade no Código
José Araújo
 
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
José Araújo
 
Delphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no CódigoDelphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no Código
José Araújo
 
Delphi Conference 2011 - Integração Contínua
Delphi Conference 2011 - Integração ContínuaDelphi Conference 2011 - Integração Contínua
Delphi Conference 2011 - Integração Contínua
José Araújo
 

Mais de José Araújo (9)

Curso de Delphi - Banco de Dados
Curso de Delphi - Banco de DadosCurso de Delphi - Banco de Dados
Curso de Delphi - Banco de Dados
 
Curso de Delphi - Linguagem Pascal
Curso de Delphi - Linguagem PascalCurso de Delphi - Linguagem Pascal
Curso de Delphi - Linguagem Pascal
 
Curso de Delphi - Lógica de Programação 3
Curso de Delphi - Lógica de Programação 3Curso de Delphi - Lógica de Programação 3
Curso de Delphi - Lógica de Programação 3
 
Curso de Delphi - Lógica de Programação 2
Curso de Delphi - Lógica de Programação 2Curso de Delphi - Lógica de Programação 2
Curso de Delphi - Lógica de Programação 2
 
Curso de Delphi - Lógica de Programacao
Curso de Delphi - Lógica de ProgramacaoCurso de Delphi - Lógica de Programacao
Curso de Delphi - Lógica de Programacao
 
XPCE - Qualidade no Código
XPCE - Qualidade no CódigoXPCE - Qualidade no Código
XPCE - Qualidade no Código
 
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
 
Delphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no CódigoDelphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no Código
 
Delphi Conference 2011 - Integração Contínua
Delphi Conference 2011 - Integração ContínuaDelphi Conference 2011 - Integração Contínua
Delphi Conference 2011 - Integração Contínua
 

Último

Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
Danilo Pinotti
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Gabriel de Mattos Faustino
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
Faga1939
 

Último (8)

Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
 

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

  • 1.
  • 2. José Araújo Migrando ~4 milhões de linhas de código de Delphi 7 > XE7
  • 3. 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;
  • 4. Um pouco de história • Clipper; • Delphi 1; • BDE; • Mesmos programadores; • Conceito RAD; • 15 anos de legado; • +50 programadores/analistas;
  • 5. Motivação • Delphi 7 obsoleto; • Problemas com link edição; • Se livrar do BDE; • Colaboradores insatisfeitos; • Embarcadero (Delphi – O Retorno); • AlphaControls(Projeto Botox);
  • 6. Dificuldades • Muitos usuá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 • Pessoas para executar; • 1 membro de cada equipe; • Algumas horas por dia; • Equipe PeD (Pesquisa e Desenvolvimento); • Buscar novos conhecimento; • Resolver impedimentos do setor;
  • 12. 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;
  • 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 • Delphi 7 ainda; • Homologamos internamente; • Programa Beta; • Nossos Representantes(Filiais); • Servidor de Deploy gera 2 pacotes;
  • 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! 1800 AC – 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 • Arquitetura de convivência; • Não atrapalhar a produção; • Mudança paralela; • Diretivas de compilação;
  • 25. Exemplos uses {$IF CompilerVersion = 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 unit DelphiUp; interface const {$IF CompilerVersion = cvDelphiXE7} EmptyBookmark = nil; {$ELSE} EmptyBookmark = ''; {$IFEND} type {$IF CompilerVersion = cvDelphi7} TBookmark = string; {$IFEND}
  • 30. Migração Total • Sim! Analisamos;
  • 33. Segurança... • Testes automatizados; • Código versionado; • Testes humanos; • Passos pequenos; • Teste Complete; • DUnit; • Protótipos;

Notas do Editor

  1. [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;
  2. [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;
  3. [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;
  4. [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;
  5. -Nós empolgadissímos; -Figura de animção!!! -Não conseguimos chegar a lugar nenhum; -Reagrupar e traçar nova estrátegia;
  6. -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);
  7. Após falar com todos separados; Alinhar todos;
  8. [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;
  9. [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;
  10. [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;
  11. [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]
  12. [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;
  13. [Removendo] -Replaces especificos dentro do código para remover o que não era mais necessário;
  14. [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;
  15. [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;
  16. [Implantar nos demais clientes] [Mineiros] -Gases tóxicos; -Canários morriam primeiro;
  17. [Canário] -Forma de poder testar em produção; -Impacto controlado; -Reverter a situação rapidamente; -Caption do Form tinha DLib2;
  18. [Comemoração] -Fomos recompensados; -Festa total; -Só alegria; -E agora?
  19. [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;
  20. [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;
  21. [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;
  22. [DBXpress] -Dentro da nossa biblioteca; -cvDelphiXE7 unit chamada DLCompilerConts tem todas as versões de compiladores; -Maior legibilidade;
  23. Unit DLCompilerConsts;
  24. -Override do ClientDataSet;
  25. -Handle para o evento OnDocumentComplete do TWebBrowser; -De VAR para CONST; -Até aqui erros de compilação; -Casos isolados;
  26. -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;
  27. [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;
  28. [Golden Gates]
  29. [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.
  30. [Protótipo] Maneira barata de viabilizar algo; Acredite, começe;