Publicité
Publicité

Contenu connexe

Publicité

The simplest thing that could possibly work

  1. The simplest thing that could possibly work Emanuele DelBono - CodicePlastico
  2. Cos’è il codice “semplice”? / / OrderController public IEnumerable<OrderRes> GetOrders(int orderId) { return _dbGateway.Execute<OrderRes>("SP_GET_ORDER", orderId); }
  3. Disclaimer ● Tutto quello che dico può essere giusto e condiviso ma anche sbagliato e discorde dalle vostre opinioni, tutto dipende dal contesto, dai gusti e dalla vostra esperienza. ☮💙 ● L’obbiettivo di un team agile è consegnare software funzionante
  4. SIMPLE CODE
  5. I costi di sviluppo crescono esponenzialmente all’aumentare della complessità
  6. La seniority ha un ruolo?
  7. E’ facile scrivere codice semplice? Simplicity and elegance are unpopular because they require hard work and discipline to achieve and education to be appreciated (Edsger W. Dijkstra)
  8. Cos’è il codice “semplice”? ● Facile da leggere ● Facile da capire ● Facile da cambiare e mantenere (o da cancellare)
  9. Cos’è il codice “semplice”? Assert.That(x).Should().Be().Greater().Than(42)
  10. assert(x > 42)
  11. [ { "id": 1, "title": "Clean Code", "authors": [ "Robert C. Martin" ], "year": 2008 }, { "id": 2, "title": "Structure and Interpretation of Computer Programs", "authors": [ "H. Abelson", “G. J. Sussman" ], "year": 1984 } ]
  12. PERCHÉ ACCADE
  13. Fretta di consegnare
  14. Troppo design up-front
  15. Troppi cambi di requisiti
  16. Inesperienza
  17. Il software è un prodotto secondario di un processo di apprendimento ziobrando
  18. ESEMPI e SPUNTI
  19. The hello world public static class Program { public static void SayHello(ISettingReader sr, IMessageComposer mc) { var message = sr.Get("MESSAGE"); var formattedMessage = mc.CreateMessage(new Capitalizer()); var printer = PrinterFactory.createPrinter(sr.Get("CONFIGURED_PRINTER")); printer.print(formattedMessage); } }
  20. Astrazioni errate const Page1 = (props) = > { return ( <div class="container"> { / * content * / } <div class="pop-up-dialog-error-one"> <h3>Inserire il nome del cliente < / h3> <div class="dialog-body"> <img src="trash" / > <button value="Ok" onClick={onOnCustomer} / > < / div> < / div> <div class="pop-up-dialog-error-two"> <h3>Errore durante il salvataggio < / h3> <div class="dialog-body"> <img src="error" / > <button value="Ok" onClick={onSaveError} / > < / div> < / div> < / div> ) }
  21. Astrazioni errate const dialog = (props) = > { return ( <div class="pop-up-dialog"> <h3>{props.title} < / h3> <div class="dialog-body"> <img src={props.icon} / > <button value="Ok" onClick={props.onOk} / > < / div> < / div> ) }
  22. const dialog = (props) = > { let buttons; if (props.isYesNo) { buttons = <div> <button value="Yes" onClick={props.onYes} / > <button value="No" onClick={props.onNo} / > < / div> } else { buttons = <button value="Ok" onClick={props.onOk} / > } return ( <div class="pop-up-dialog"> <h3>{props.title} < / h3> <div class="dialog-body"> <img src={props.icon} / > {buttons} < / div> < / div> ) }
  23. duplication is far cheaper than the wrong abstraction prefer duplication over the wrong abstraction Sandi Metz
  24. Domain model monolitico
  25. Bounded Context
  26. CRUD con CQRS/ES
  27. Alternative? ● Se è davvero solo CRUD: Rails/Django/Phoenix ● Oppure (CQS) ○ Separare lettura e scrittura (stesso db) ○ Salvare sempre tutti gli eventi ○ Salvare lo stato sul db
  28. Microservizi!
  29. Servizi “logici”
  30. Process Manager
  31. Siamo sicuri che la Single Page Application sia sempre la scelta giusta?
  32. Useless layers
  33. Framework ● Non sempre semplificano ● Rendono il codice meno flessibile ● La magia (metaprogrammazione, macro, AOP, mixin, classi base) rende il codice complesso da capire ● Disaccoppiare con ACL ● Preferire librerie a framework
  34. Il linguaggio ha un impatto sulla semplicità?
  35. STRUMENTI UTILI
  36. Misurare ● Cyclomatic complexity ● Afferent Coupling ● Efferent Coupling ● Depth of inheritance ● Instability ● Abstraction level ● …
  37. Modularizzare
  38. Idee dall’FP: Funzioni pure e strutture dati immutabili ● Idee dalla programmazione funzionale ● Funzioni pure senza side effect ● Strutture dati immutabili ● High order function
  39. I buoni vecchi principi ● DRY ● KISS ● OCP ● YAGNI ● SOLID or CUPID ● Composition over inheritance ● Be explicit
  40. Approccio Prototipo/MVP ● Scrivere codice come se non ci fosse un domani ● Soluzioni quick&dirty per arrivare al risultato ● Validare il risultato ● Buttare e ricominciare
  41. Test Driven Development Write a failing test Make the test pasS Refactor Il TDD è Lo strumento per scrivere codice semplice. Obbliga a pensare cosa devi fare. Focus su uno scope ridotto.
  42. Le regole ● Non si può scrivere codice nuovo applicativo a meno che lo si faccia per far diventare verde un test ● Non si può scrivere più di uno unit test che fallisce (gli errori di compilazione sono fallimenti) ● Non è consentito scrivere codice di produzione non necessario a superare l'unico test rosso
  43. test "Scan empty code should return 0" do assert Checkout.scan("") = = 0 end defmodule Checkout do def scan(_code) do 0 end end
  44. Test Driven Development ○ Un test difficile da scrivere è indice di complessità del codice che dovrà testare ○ Troppo setup ○ Troppe dipendenze ○ Test poco parlante
  45. Test Driven Development ○ Ragioni da utente in modo dichiarativo ○ Favorisce l’ortogonalità delle dipendenze ○ Non scriviamo mai codice inutile ○ Il design emerge un po’ alla volta ○ Accorcia feedback loop ○ I test fanno da documentazione
  46. 4 rules of simple design ● Test Pass ● Express intent ● No duplication ● Small
  47. As simple as possible, but no simpler. (Einstein)
  48. EMANUELE DELBONO Founder & Software developer @ CodicePlastico emanuele@codiceplastico.com @emadb
  49. Grazie emanuele@codiceplastico.com
Publicité