© 2012,CasadoCódigo TodososdireitosreservadoseprotegidospelaLeinº9.610,de10/02/1998. Nenhumapartedestelivropoderáserreproduzida,nemtransmitida,semauto- rizaçãopréviaporescritodaeditora,sejamquaisforemosmeios: fotográficos, eletrônicos,mecânicos,gravaçãoouquaisqueroutros. CasadoCódigo Livrosparaoprogramador RuaVergueiro,3185-8ºandar 04101-300–VilaMariana–SãoPaulo–SP–Brasil CasadoCódigo “AnossaavóCéres” –PauloSilveiraeGuilhermeSilveira “Aminhaesposa,meuspaisemeuirmão” –SérgioLopes “Ameuspaiseesposa” –GuilhermeMoreira “Ameusamadospais” –NicoSteppat “Aminhaamadaesposaefamília” –FabioKung i CasadoCódigo Agradecimentos DepoisdedoisanosministrandoocursodeArquiteturaeDesignnaCaelum,além decincoanoscomumblogdemaisdeduzentosartigostécnicos,pareciafácilescre- versobreumassuntoquefazpartedonossodiaadia. Terrívelengano. Emvezdosseismesesprevistos,passaram-sedoisanos. Doisanostrabalhando de forma a tornar acessível práticas e trade-offs que aparecem com frequência na plataforma.Sãoproblemasqueosdesenvolvedorespassamaenfrentarrapidamente aoganharmaisexperiênciaefamiliaridadecomJava. Juntar esse conhecimento não seria possível sem a existência do GUJ.com.br, criadoem2002,noqualosusuáriosjátrocarammaisdeummilhãodemensagens. Nós,autores,participamosativamentedofórum,oqualnãoatingiriaessamagnitude semaajudadoRafaelSteil. Tambémnãoseriapossívelorganizaressasideiassemacolaboraçãodediversos amigos que as revisaram e discutiram os temas conosco: Lucas Cavalcanti, David Paniz,CeciliaFernandes,AlbertoSouza,BrunodeOliveira,FábioPimentel,Vinicius RobertoeAdalbertoZanata. Agradecemos aos que participaram e participam da elaboração do curso FJ-91 naCaelum:AdrianodeAlmeida,AndersonLeite,JoséDonizettieDouglasCampos. UmaespecialmençãoaoMaurícioAniche,que,alémderealizarumaminuciosa revisão,nosincentivouatodomomentoamelhorarotextoeacortaroquenãofosse essencialparaolivro. iii CasadoCódigo Sobre os autores PauloSilveiraébacharelemestreemciênciadacomputaçãopelaUSPecofundador daCaelum. PossuiexperiênciacomdesenvolvimentowebnaAlemanha,passando peloIBOPEepordoisanoscomoinstrutordaSunMicrosystems.Éumdosfunda- doresdoGUJ.com.br,editortécnicodarevistaMundoJecriadordoVRaptor. GuilhermeSilveiraélídertécnicoecofundadordaCaelum.TrabalhoucomJava eTibconaAlemanha,comitterdoXStreamecriadordoRestfulie. Concentraseus estudosemserviçosREST.Programadorexperiente,participoudasfinaismundiais deprogramaçãonoJapãoenoCanadádoICPCpelotimedaUSPeéarquitetoJava certificado(SCEA5). SérgioLopesécoordenadornaunidadeSãoPaulodaCaelum.Programadesde 2000 e desenvolve em Java desde 2003. É arquiteto Java certificado (SCEA5), mo- derador do GUJ e participante ativo da comunidade através de palestras, projetos, cursoseartigos. GuilhermeMoreiraéinstrutoreconsultorpelaCaelum,ondefocaseutrabalho principalmentecomJavadesde2005,comprojetosinternosetambémdiretamente nosclientes.FormadoemProcessamentodeDadospelaFATEC-SPearquitetoJava certificado(SCEA5),escreveartigosparaarevistaMundoJ,alémdeserresponsável pelaunidadedeBrasíliadaCaelum. NicoSteppatéengenheirodecomputaçãoaplicadapelaFachhochschuleBran- denburg.Éinstrutor,consultoredesenvolvedorháseteanoscomJavanoBrasilena Alemanha.AtuanaunidadeRiodeJaneirodaCaelumeéarquitetoJavacertificado (SCEA5). FabioKungéengenheirodacomputaçãopelaEscolaPolitécnicadaUSP.Passou porweb,Java,Ruby,experiêncianaAlemanha,instrutornaCaelum,responsávelna Locaweb por Cloud Computing e no Heroku em São Francisco. É arquiteto Java certificado(SCEA5). v CasadoCódigo Prefácio PorJimWebber. OArquiteto Quando penso sobre o termo “arquiteto”, é sempre com sentimentos confusos, como suspeito que seja o caso para muitos de nós que trabalham com desenvolvi- mentodesoftwareatualmente.Duranteminhacarreira,ouvidiversasopiniõesdife- rentesparaessetermo,mas,paramim,oqueéprincipalparaserumbomarquiteto possobuscardosmeusprimeirosdiascomodesenvolvedorprofissional(outentando serumprofissional). Meuprimeiroempregopareciaserintimidador-apósdiversosanosdepesquisa acadêmicadentrodeumdepartamentodeciênciadecomputaçãoemumauniver- sidade, entrei em uma empresa que havia comprado recentemente uma startup de middleware Java gerenciada por um grupo de amigos. Esses amigos trabalhavam noramodemiddlewarepordécadase“hackeavam”emJavaatémesmoantesdeele ter esse nome. Sair da zona de conforto da computação de alto desempenho, com tecnologiasasquaiseuestavaacostumado, epularparaumdomínionovodepro- cessamento de transações distribuídas com foco em CORBA e J2EE era realmente intimidador. Apesardeterumsensorazoáveldeteoriadesistemasdistribuídos,eu jamaishaviaescritoCORBAouJ2EEcomousuário, muitomenoscomodesenvol- vedordemiddleware.Foramtemposcomplicados. No laboratório onde comecei a trabalhar, meus colegas ostentavam nomes de cargosbaseadosemsuascapacidades(e,suspeito,longevidade!). Possuíamosenge- nheiros,engenheirossenioresearquitetos,todososquaistrabalhavamarduamente em desenvolver um excelente middleware de transação, workflow e mensageria. Comoumengenheirosênior, eueraumpoucomenosverdedoqueosapenasen- genheiros,masambosrecebíamosordensdosarquitetos-umportime-queeram oráculos.Osarquitetosquelideravamnossotimeconheciamocódigodetrásparaa vii CasadoCódigo frente,mastambémconheciamseuscampos.Erasemprepossívelconfiarqueseriam capazesdeexplicarmodelosdetransaçãodistribuídacomplexosemostrarcomodi- versos padrões e abstrações do código os suportavam. Eles também conheciam as armadilhaseconseguiamdetectarcedoescolhasdedesigneimplementaçãoruins, umavezqueeramcapazesdeveràfrente,oupelomenosvermaislongedoqueeu conseguia. Não acho que disse algum dia para esses arquitetos - talvez por causa do meu orgulhojuvenil-oquãoimportanteelesforamemdelinearmeupensamentoecom- portamento. Entretanto,sempreaspirei(ealgumasvezessucedi)sercomoeles,co- nheceratecnologiaprofundamente,entenderocontextonoqualelaestásendoem- pregada,guiareserguiadopeloscolegasdemeutime. Essafoiumaaspiraçãoque leveiparameupróximoempregoemumaempresaglobalmuitoconhecidaeadmi- radanoramodeconsultoriadeTI. Aoentraremminhanovaempresa,decidiquejáhaviavistobastantesoftwaree erabomosuficienteemescrevercódigo,eentãomedeclareiumarquiteto. Aoen- contraralgunsdemeusnovoscolegaspelaprimeiravez,fuicalorosamenterecebido eperguntadosobrequalseriameupapel.Respondiqueeueraumarquiteto;algoque penseiquedariaumsentidodecompetêncianonívelmicrodapilhadetecnologias, enonívelmacroaoredordaconstruçãodesistemas.Fiqueiatônitoaodescobrirque fuirepreendidoporessarespostaefiqueimeperguntandooqueacabaradeaconte- cer,afinal,eunãohaviaentradoparatrabalharcomessaspessoasdevidoareputação queelespossuíamnodesenvolvimentodesoftwareeAgile? Nãodemoroumuitoparaqueeuentendesseocontexto.Meuscolegastrabalha- vamcomconsultoriaháalgunsanoseconhecerammuitos“arquitetosexperientes”. Mas esses não eram o mesmo tipo de pessoa que eu admirava em meu primeiro trabalho; eram arquitetos perigosamente ultrapassados, com pouca habilidade em entregarsoftware, eumtalentosemfimparacausarconfusãoecriarpolíticascor- porativas. Eeu, aparentemente, tinhameapresentadocomoumdesses. Nãoeraa melhormaneiradecausarumaboaimpressãoaosmeusnovoscolegas. Ainda assim, durante os 6 anos e nos 10 países em que trabalhei, me descrevi comoarquiteto.Euestavaemumamissãoderecuperarovalordessetítulo,ecomo passardotempoobtivealgumsucesso. Começamosapensaremumarquitetonão sócomoo“melhorprogramador”ouum“pesomorto”,massimcomoumpapelque considera os detalhes de nível macro em um time que entrega software - como a integraçãocomoutrossistemasfuncionará,comofalhaserecuperaçõesserãotraba- lhadas,comoavazãoserámedidaegarantida. viii