Slide 1

Slide 1 text

1 1 Evolutionary Design © 2020 ThoughtWorks

Slide 2

Slide 2 text

QUEM SOMOS 5 anos de desenvolvimento, migrando continuamente entre C# e Javascript. Entusiasta sobre estudo de soft skills e consultor na Thoughtworks. Lucas Ferreira 2 © 2020 ThoughtWorks 8 anos como programador com linguagens orientada a objetos. Atualmente se aprimorando em arquitetura de sistemas distribuídos. Marcos Bezerra

Slide 3

Slide 3 text

O QUE É EVOLUTIONARY DESIGN 3 Desenvolver software de maneira incremental, mantendo a simplicidade do código e evoluindo o design conforme a necessidade do negócio vai sendo descoberta. Nessa abordagem a estrutura de código é revista e melhorada continuamente permitindo otimizar a velocidade de desenvolvimento. © 2020 ThoughtWorks

Slide 4

Slide 4 text

PILARES DO EVOLUTIONARY DESIGN James Shore Crie o melhor design possível para funcionalidade que está sendo desenvolvida. Simple Design 4 Revise e melhore o design constantemente para facilitar a inserção de código novo. Continuous Design Tome decisões analisando o design atual, identificando code smells e priorizando as alterações que geram mais valor. Reflective Design © 2020 ThoughtWorks

Slide 5

Slide 5 text

DESIGN STAMINA HYPOTHESIS 5 © 2020 ThoughtWorks

Slide 6

Slide 6 text

Bons princípios de Design 6 © 2020 ThoughtWorks

Slide 7

Slide 7 text

"Keep it simple, stupid" Kelly Johnson (US Navy) 7 © 2020 ThoughtWorks

Slide 8

Slide 8 text

Você não vai precisar disso! 8 YAGNI (You ain't gonna need it) Criação de complexidade prematura Riscos ao funcionamento da aplicação/feature Delay na entrega de valor efetivo © 2020 ThoughtWorks

Slide 9

Slide 9 text

"Don’t repeat yourself" Andrew Hunt e David Thomas 9 © 2020 ThoughtWorks

Slide 10

Slide 10 text

SOLID Uma classe deve ter um, e somente um, motivo para mudar Princípio da responsabilidade única 10 Objetos ou entidades devem estar abertos para extensão, mas fechados para modificação Princípio Aberto-Fechado Uma classe derivada deve ser substituível por sua classe base Princípio da substituição de Liskov © 2020 ThoughtWorks Uma classe não deve ser forçada a implementar interfaces e métodos que não irão utilizar Princípio da Segregação da Interface Um módulo de alto nível não deve depender de módulos de baixo nível, ambos devem depender da abstração Princípio da inversão da dependência

Slide 11

Slide 11 text

“Domain-Driven Design concentra o desenvolvimento em criar um modelo de domínio com um rico entendimento dos processos e regras do domínio de negócio.” - Martin Fowler 11 © 2020 ThoughtWorks

Slide 12

Slide 12 text

DDD PRINCIPAIS CONCEITOS 12 ● Ubiquitous Language ● Classificação de objetos: ○ Entities ○ Value Objects ○ Services ● Aggregates ● Bounded Contexts © 2020 ThoughtWorks Aggregate: Carro Entity: Motor Value Object: Cor Service: Entregar carro

Slide 13

Slide 13 text

Técnicas 13 © 2020 ThoughtWorks

Slide 14

Slide 14 text

Refatoração 14 © 2020 ThoughtWorks ● Reduz o custo de aprimoramentos ● Faz parte do dia-a-dia da programação ● Ferramentas automatizadas (IDEs) são úteis, mas não essenciais ● Corrigir quaisquer bugs que você encontrar pelo caminho não é refatoração. ● Sempre torne as coisas mais fáceis e seguras para alterar no futuro

Slide 15

Slide 15 text

Integração Contínua 15 © 2020 ThoughtWorks ● Múltiplas integrações por dia ● Cada integração é verificada por um build automatizado (incluindo testes) ● Manutenção de um repositório de fonte única ● Todo mundo faz commits na branch principal todos os dias ● É importante consertar builds quebrados imediatamente ● Todo mundo sabe e pode ver o que está acontecendo ● Automatização de deploy

Slide 16

Slide 16 text

Unit Testing 16 © 2020 ThoughtWorks ● É mais seguro fazer alterações em código testado ● É mais rápido para identificar falhas causadas por uma alteração ● O código escrito se torna mais desacoplado e tem mais reuso ● O desenvolvimento com testes é mais rápido ● O custo para corrigir bugs é menor

Slide 17

Slide 17 text

Test Driven Development 17 © 2020 ThoughtWorks ● Crie um design, faça experimentos e receba feedback rápido ● Valide suas hipóteses de design em pequenos ciclos ● Traz um ciclo natural de evolução "baby-steps" ● É mais fácil fazer testes com TDD do que escrever testes após o código de produção Think Red Green Refactor

Slide 18

Slide 18 text

Design Patterns 18 © 2020 ThoughtWorks ● O mesmos problemas são encontrados em vários projetos de software ● Os padrões são uma documentação de boas práticas para resolver esses problemas ● Melhora a leitura do código e facilita aplicar princípios de design ● Facilita a comunicação do time quando analisam problemas de design, permitindo propor soluções conhecidas ● Ajudam o software a crescer de maneira estruturada

Slide 19

Slide 19 text

19 © 2020 ThoughtWorks State Pattern Usado em aplicação do mercado financeiro para gerenciar transição de estados de uma entidade baseada em eventos. Case

Slide 20

Slide 20 text

20 © 2020 ThoughtWorks Contexto de uma partida de futebol - ANTES

Slide 21

Slide 21 text

21 © 2020 ThoughtWorks EventHandler MatchState applyEvent(Match m, Event e) FirstPeriodState applyEvent(Match m, PeriodEndedEvent e) HalfTimeState SecondPeriodState Match - currentState + applyEvent(Event e) Contexto de uma partida de futebol

Slide 22

Slide 22 text

22 © 2020 ThoughtWorks Contexto de uma partida de futebol - DEPOIS

Slide 23

Slide 23 text

Arquitetura Evolucionária 23 © 2020 ThoughtWorks ● Tomadas de decisões importantes são atrasadas ao máximo, com o objetivo de ampliar as informações sobre a necessidade e minimizar os débitos técnicos por complexidade ● Arquitetar e desenvolver para evolutibilidade ● Lei de Postel (o que devo enviar e receber? KISS) ● Arquitete para testabilidade

Slide 24

Slide 24 text

Referências 24 © 2020 ThoughtWorks ● Evolutionary Design Animated - https://www.jamesshore.com/In-the-News/Evolutionary-Design-Animated.html ● Is Design Dead? - https://martinfowler.com/articles/designDead.html ● Making Architecture Matter - https://www.youtube.com/watch?time_continue=705&v=DngAZyWMGR0&feature=emb_logo ● DesignStaminaHypothesis - https://martinfowler.com/bliki/DesignStaminaHypothesis.html ● What is Evolutionary Design? - https://mozaicworks.com/blog/what-is-evolutionary-design/ ● Continuous design - https://martinfowler.com/ieeeSoftware/continuousDesign.pdf ● Domain Driven Design - https://martinfowler.com/bliki/DomainDrivenDesign.html ● Design Patterns - https://sourcemaking.com/design_patterns ● Javascript Jabber Podcast: Evolutionary Design - https://open.spotify.com/episode/22gMb2Xsxp5qwvscHYvGVn?si=YffFeg-uTFGlnZUNMD4R5Q

Slide 25

Slide 25 text

MARCOS BEZERRA SENIOR CONSULTANT [email protected] | thoughtworks.com 25 © 2020 ThoughtWorks LUCAS FERREIRA CONSULTANT [email protected] | thoughtworks.com

Slide 26

Slide 26 text

GLOBAL SOFTWARE CONSULTANCY 26 © 2020 ThoughtWorks