Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Evolutionary Design

Evolutionary Design

Lucas Ferreira

June 09, 2021
Tweet

More Decks by Lucas Ferreira

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. “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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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