• Save
Não Existe Agile sem Design Ágil
Upcoming SlideShare
Loading in...5
×
 

Não Existe Agile sem Design Ágil

on

  • 1,125 views

Porque software apodrece? Porque grandes projetos maduros se deterioram com o tempo? Como sustentar o crescimento ágil e incremental de uma arquitetura evolutiva em um projeto de grande porte? ...

Porque software apodrece? Porque grandes projetos maduros se deterioram com o tempo? Como sustentar o crescimento ágil e incremental de uma arquitetura evolutiva em um projeto de grande porte? Pretendo com esta palestra apresentar e discutir estes pontos e convencer o público de que não existe o verdadeiro Agile sem um Design Ágil e uma Arquitetura Evolutiva sustentável.

Baseado nas experiências adquiridas em mais de três anos de um projeto Ágil de uma grande instituição bancária e em experiências adquiridas lecionando diversos cursos de especialização, pretendo realizar uma apresentação prática demonstrando que é impossível sustentar um projeto ágil de grande porte sem um grande cuidado e capricho com o design evolutivo e arquitetura do software.
A base teórica da apresentação será construída sobre os livros: Clean Code, Growing Object-Oriented Software Guided by Tests e Agile Software Development, Principles,Patterns,and Practices e os exemplos serão construídos em cima de histórias de sucesso (e fracasso) do meu atual projeto.

Statistics

Views

Total Views
1,125
Views on SlideShare
1,117
Embed Views
8

Actions

Likes
11
Downloads
32
Comments
0

2 Embeds 8

https://twitter.com 4
http://alexandreaquiles.com.br 4

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Não Existe Agile sem Design Ágil Não Existe Agile sem Design Ágil Presentation Transcript

  • Não existe Agile semdesign ÁgilEder IgnatowiczSenior Architect, DextraAgileBrazil2013quarta-feira, 26 de junho de 2013
  • There are known knowns; there are things we knowthat we know.There are known unknowns; that is to say, there arethings that we now know we dont know.But there are also unknown unknowns – there arethings wedonotknowwedon’tknow. ”United States Secretary of Defense, Donald Rumsfeldquarta-feira, 26 de junho de 2013
  • SoftwareCraftsman@DextraInstrutorDextrainingDoutorandoUnicampProfessornaFaccampeUnisalEditorlídernaInfoQBrasilPaidaDora<3@ederignquarta-feira, 26 de junho de 2013
  • quarta-feira, 26 de junho de 2013
  • DextraGaleraPontaFirmeequeMandabemAmbientedeMelhoriaContínuaProjetosDesafiadoresQualidadedeVidaquarta-feira, 26 de junho de 2013
  • GreenFieldquarta-feira, 26 de junho de 2013
  • Unit / MicroTestingquarta-feira, 26 de junho de 2013
  • Unit / MicroTesting TDDquarta-feira, 26 de junho de 2013
  • RefactoringUnit / MicroTesting TDDquarta-feira, 26 de junho de 2013
  • KatasTop CoderUVaProject EulerDojosquarta-feira, 26 de junho de 2013
  • Estudoquarta-feira, 26 de junho de 2013
  • quarta-feira, 26 de junho de 2013
  • SistemaLegadoquarta-feira, 26 de junho de 2013
  • DextraRHDextrainingDevquarta-feira, 26 de junho de 2013
  • DextraDextrainingDev RHInstrutores Adm.... ...... ...quarta-feira, 26 de junho de 2013
  • TDD !!! <3quarta-feira, 26 de junho de 2013
  • @Beforepublic void setup() {avo = CentroCustoTestHelper.geraCentroCusto("Avo", null);pai = CentroCustoTestHelper.geraCentroCusto("Pai", avo);filho = CentroCustoTestHelper.geraCentroCusto("Filho", pai);filhoF = CentroCustoTestHelper.geraCentroCusto("Filho X", filho);filhoFF =CentroCustoTestHelper.geraCentroCusto("Filho Y",filhoFF);}@Testpublic void getFilhos() {assertEquals(filho.filhos().size(), 2);assertEquals(avo.filhos().size(), 4);}quarta-feira, 26 de junho de 2013
  • quarta-feira, 26 de junho de 2013
  • public List<CentroCusto> filhos() {Usuario usuario = webService.getUsuarioLogado();if (usuario.isPj()) {UsuarioPj usuarioPj = (UsuarioPj) usuario;if (usuarioPj.podeAcessar(this)) {return getFilhosNaoExcluidos();} else {List<CentroCusto> filhosVisiveis = new ArrayList<CentroCusto>(getFilhosNaoExcluidos());Iterator<CentroCusto> i = filhosVisiveis.iterator();while (i.hasNext()) {CentroCusto filho = i.next();if ((!usuarioPj.podeAcessar(filho)) || (filho.estaExcluido())) {i.remove();}}return filhosVisiveis;}} else {return getFilhosNaoExcluidos();}}quarta-feira, 26 de junho de 2013
  • WTF ?!?quarta-feira, 26 de junho de 2013
  • public List<CentroCusto> filhos() {Usuario usuario = webService.getUsuarioLogado();if (usuario.isPj()) {UsuarioPj usuarioPj = (UsuarioPj) usuario;if (usuarioPj.podeAcessar(this)) {return getFilhosNaoExcluidos();} else {List<CentroCusto> filhosVisiveis = new ArrayList<CentroCusto>(getFilhosNaoExcluidos());Iterator<CentroCusto> i = filhosVisiveis.iterator();while (i.hasNext()) {CentroCusto filho = i.next();if ((!usuarioPj.podeAcessar(filho)) || (filho.estaExcluido())) {i.remove();}}return filhosVisiveis;}} else {return getFilhosNaoExcluidos();}}quarta-feira, 26 de junho de 2013
  • public List<CentroCusto> filhos() {Usuario usuario = webService.getUsuarioLogado();if (usuario.isPj()) {UsuarioPj usuarioPj = (UsuarioPj) usuario;if (usuarioPj.podeAcessar(this)) {return getFilhosNaoExcluidos();} else {List<CentroCusto> filhosVisiveis = new ArrayList<CentroCusto>(getFilhosNaoExcluidos());Iterator<CentroCusto> i = filhosVisiveis.iterator();while (i.hasNext()) {CentroCusto filho = i.next();if ((!usuarioPj.podeAcessar(filho)) || (filho.estaExcluido())) {i.remove();}}return filhosVisiveis;}} else {return getFilhosNaoExcluidos();}}Integração WebService Legadoquarta-feira, 26 de junho de 2013
  • Brownfieldquarta-feira, 26 de junho de 2013
  • O design de software morreu?Existe Agile sem design ágil?Eder IgnatowiczSenior Architect, DextraAgileBrazil2013quarta-feira, 26 de junho de 2013
  • quarta-feira, 26 de junho de 2013
  • WaterfallBig Design Upfrontquarta-feira, 26 de junho de 2013
  • Junte um grupo de pessoasquarta-feira, 26 de junho de 2013
  • DiscutamHipótesesJunte um grupo de pessoasquarta-feira, 26 de junho de 2013
  • DiscutamHipótesesJunte um grupo de pessoasDesign!!!quarta-feira, 26 de junho de 2013
  • Não existem Requisitos deSoftware, mas sim hipóteses.“”quarta-feira, 26 de junho de 2013
  • Agilequarta-feira, 26 de junho de 2013
  • Triângulo AgileCrescimento SustentávelMelhoria ContínuaGeraçãode ValorTransparênciaFeedback Auto organizaçãoquarta-feira, 26 de junho de 2013
  • AgileResponderrapidamenteaonegócioEntregasustentávelLastResponsibleMomentquarta-feira, 26 de junho de 2013
  • Last Responsible MomentTempoQuando vocêsupostamente deveriatomar uma decisãoContextoQuanto mais vocêaguardar, melhor adecisão...quarta-feira, 26 de junho de 2013
  • EquilíbrioEngenhariadeSoftwareÁgilLeanGeraçãodeValorquarta-feira, 26 de junho de 2013
  • Mainstreamquarta-feira, 26 de junho de 2013
  • Espectro do DesignWaterFall BDUF AgileGo HorseProcessquarta-feira, 26 de junho de 2013
  • Vamos deixar deste jeito que funciona, depoisrefatoramos e as estruturas e os patterns emergirãoGo Horse Process“”quarta-feira, 26 de junho de 2013
  • Dívida Técnicaquarta-feira, 26 de junho de 2013
  • Software Apodrece...quarta-feira, 26 de junho de 2013
  • Se você desenvolve iterativamente e não aplicapráticas de engenharia ágil, sua base de códigomorrerá em 2 ou 3 anos...Não se preocupar com o design em um processoiterativo torna o projeto insustentável“”James Shorequarta-feira, 26 de junho de 2013
  • CustodemudançaTempoDesignprontoManutençãoMurodaimpossiblidadedemanutençãoquarta-feira, 26 de junho de 2013
  • Espectro do DesignWaterFall BDUF AgileEvolutionaryor EmergentDesignGo HorseProcessquarta-feira, 26 de junho de 2013
  • EvolutionaryDesignquarta-feira, 26 de junho de 2013
  • quarta-feira, 26 de junho de 2013
  • EvolutionaryDesignRefactoringContinuous IntegrationTestingquarta-feira, 26 de junho de 2013
  • Refactoringquarta-feira, 26 de junho de 2013
  • RefactoringEncapsulate FieldGeneralize TypeState/StrategyReplace Conditional withpolymorphismPull Up / Push DownExtract MethodRename MethodMove Methodquarta-feira, 26 de junho de 2013
  • Refactoring is not the same activity as redesign,where the programmers take a conscious decisionto change a large-scale structure. That said,having taken a redesign decision, a team can usea refactoring techniques to get to new designincrementally and safely.“”Growing Object OrientedSoftware Guided by Testsquarta-feira, 26 de junho de 2013
  • public List<CentroCusto> filhos() {if (usuarioLogado().isPj()) {return filhosUsuarioPJ(usuario);} else {return todosFilhos();}}private List<CentroCusto> filhosUsuarioPJ() {if (usuarioLogado().podeAcessar(this)) {return todosFilhos();} else {return filhosVisiveisUsuario();}}quarta-feira, 26 de junho de 2013
  • Domain DrivenDesignquarta-feira, 26 de junho de 2013
  • The goal of domain-driven design is to createbetter software by focusing on a model of thedomain rather than the technology.“”Eric Evansquarta-feira, 26 de junho de 2013
  • Code == Designquarta-feira, 26 de junho de 2013
  • ContinuousIntegrationquarta-feira, 26 de junho de 2013
  • MicroTestingquarta-feira, 26 de junho de 2013
  • @Beforepublic void setup() {avo = CentroCustoTestHelper.geraCentroCusto("Avo", null);pai = CentroCustoTestHelper.geraCentroCusto("Pai", avo);filho = CentroCustoTestHelper.geraCentroCusto("Filho", pai);filhoF = CentroCustoTestHelper.geraCentroCusto("Filho X", filho);filhoFF =CentroCustoTestHelper.geraCentroCusto("Filho Y",filhoFF);}@Testpublic void getFilhos() {assertEquals(filho.filhos().size(), 2);assertEquals(avo.filhos().size(), 4);}quarta-feira, 26 de junho de 2013
  • public List<CentroCusto> filhos() {Usuario usuario = webService.getUsuarioLogado();if (usuario.isPj()) {return filhosUsuarioPJ(usuario);} else {return todosOsFilhos();}}private List<CentroCusto> filhosUsuarioPJ(Usuario usuario) {if (usuario.podeAcessar(this)) {return todosOsFilhos();} else {return todosFilhosUsuarioPJ(usuario);}}quarta-feira, 26 de junho de 2013
  • public List<CentroCusto> filhos() {Usuario usuario = webService.getUsuarioLogado();if (usuario.isPj()) {return filhosUsuarioPJ(usuario);} else {return todosOsFilhos();}}private List<CentroCusto> filhosUsuarioPJ(Usuario usuario) {if (usuario.podeAcessar(this)) {return todosOsFilhos();} else {return todosFilhosUsuarioPJ(usuario);}}Integração WebService Legadoquarta-feira, 26 de junho de 2013
  • public List<CentroCusto> filhos() {Usuario usuario = usuarioLogado();if (usuario.isPj()) {return filhosUsuarioPJ(usuario);} else {return todosOsFilhos();}}private List<CentroCusto> filhosUsuarioPJ(Usuario usuario) {if (usuario.podeAcessar(this)) {return todosOsFilhos();} else {return todosFilhosUsuarioPJ(usuario);}}Extract Methodquarta-feira, 26 de junho de 2013
  • public class CentroCustoTestHelper {public static class CentroCustoFake extends CentroCusto {public CentroCustoFake(String nome, Produto produto) {super(nome, produto);}@OverridepublicUsuariousuarioLogado(){returnnewUsuarioPj("dorinha@ederig.com");}}public static CentroCusto geraCentroCusto(String nome, CentroCusto pai) {CentroCusto centroCustoFilho = new CentroCustoFake(nome, null);if (pai != null) {pai.adicionarFilho(centroCustoFilho);centroCustoFilho.setPai(pai);}return centroCustoFilho;}}Sobrecarga!quarta-feira, 26 de junho de 2013
  • Things like TDD and Continuous Integration havefundamentally changed the safety indevelopment.“”Joshua Kerievskyquarta-feira, 26 de junho de 2013
  • TDD é difícil emsistemas legadosquarta-feira, 26 de junho de 2013
  • Your microtests TALKS!quarta-feira, 26 de junho de 2013
  • Design bad smells nosmicro testes...quarta-feira, 26 de junho de 2013
  • Você quer testarum método privadoquarta-feira, 26 de junho de 2013
  • Talvez sua classetenha muitasrepsonsabilidadesquarta-feira, 26 de junho de 2013
  • Uma mudança no códigoquebra muitos testesquarta-feira, 26 de junho de 2013
  • Violações doOpen/Closed Principlequarta-feira, 26 de junho de 2013
  • Instanciar uma classenecessita instanciar 20classesquarta-feira, 26 de junho de 2013
  • Alto acoplamentoquarta-feira, 26 de junho de 2013
  • A execução de um teste,afeta o outroquarta-feira, 26 de junho de 2013
  • Singletons, variáveis deestado “Globais”quarta-feira, 26 de junho de 2013
  • Testar é complicado porcausa do framework Xquarta-feira, 26 de junho de 2013
  • Baixa separação dalógica do domínioquarta-feira, 26 de junho de 2013
  • É difícil de se testar umaclasse, pois nãoencontro o efeito da suaexecuçãoquarta-feira, 26 de junho de 2013
  • Separação deresponsabilidadesinsuficiente ou Violaçãode Encapsulamentoquarta-feira, 26 de junho de 2013
  • Muitos asserts para ummétodoquarta-feira, 26 de junho de 2013
  • Violações do SRP,método muito longoquarta-feira, 26 de junho de 2013
  • Não tem como dar setupem uma APIquarta-feira, 26 de junho de 2013
  • Separação deresponsabilidadesinsuficiente ou Excessode Encapsulamentoquarta-feira, 26 de junho de 2013
  • Você quer utilizar umframework de Mockquarta-feira, 26 de junho de 2013
  • Violações da Lei deDeméterquarta-feira, 26 de junho de 2013
  • Difícil Mockar umaclassequarta-feira, 26 de junho de 2013
  • Abstração fracaquarta-feira, 26 de junho de 2013
  • No Mocking!quarta-feira, 26 de junho de 2013
  • Mocks atrapalham oRefactoringquarta-feira, 26 de junho de 2013
  • Mockando você coloca oalto acoplamento pradebaixo do tapetequarta-feira, 26 de junho de 2013
  • Seus dublês sãoaltamente acoplados asclasses que elesmockamquarta-feira, 26 de junho de 2013
  • Micro Testing não é difícil.quarta-feira, 26 de junho de 2013
  • Ele é fácil na presença deum bom designquarta-feira, 26 de junho de 2013
  • Seus testes falam muitomais do que somente dizerse uma funcionalidadefunciona ou não...quarta-feira, 26 de junho de 2013
  • Your microtests TALKS!quarta-feira, 26 de junho de 2013
  • Como praticar designevolutivo?quarta-feira, 26 de junho de 2013
  • Como criar sistemasresistentes à mudanças?quarta-feira, 26 de junho de 2013
  • Como criar sistemascapazes deacomodar constantes econtínuas mudanças?quarta-feira, 26 de junho de 2013
  • Como prover crescimentosustentável?quarta-feira, 26 de junho de 2013
  • EquilíbrioGeraçãodeValorRefactoringTesting/CIquarta-feira, 26 de junho de 2013
  • Esqueçaobarato,Esqueçaosrecursosquarta-feira, 26 de junho de 2013
  • Vocêcolheoqueplantaquarta-feira, 26 de junho de 2013
  • Contrate “nego baum”AumenteoSEUsarrafoquarta-feira, 26 de junho de 2013
  • Convivacomosmelhoresquarta-feira, 26 de junho de 2013
  • Viva com os apaixonados, os craftsman.Viva uma cultura deAprendizadoColaborativoquarta-feira, 26 de junho de 2013
  • Porque sem Refactoring,Testes e CIquarta-feira, 26 de junho de 2013
  • Não existe designevolutivoquarta-feira, 26 de junho de 2013
  • E sem design evolutivoquarta-feira, 26 de junho de 2013
  • Não existeDesenvolvimento Ágilquarta-feira, 26 de junho de 2013
  • SoftwareCraftsman@DextraInstrutorDextrainingDoutorandoUnicampProfessornaFaccampeUnisalEditorlídernaInfoQBrasilPaidaDora<3@ederignquarta-feira, 26 de junho de 2013