SlideShare una empresa de Scribd logo
1 de 61
Descargar para leer sin conexión
The simplest thing that could possibly work
Emanuele DelBono - CodicePlastico
Cos’è il codice “semplice”?
/
/
OrderController
public IEnumerable<OrderRes> GetOrders(int orderId)
{
return _dbGateway.Execute<OrderRes>("SP_GET_ORDER", orderId);
}
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
SIMPLE CODE
I costi di sviluppo crescono esponenzialmente all’aumentare della complessità
La seniority ha un ruolo?
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)
Cos’è il codice “semplice”?
● Facile da leggere
● Facile da capire
● Facile da cambiare e mantenere (o da cancellare)
Cos’è il codice “semplice”?
Assert.That(x).Should().Be().Greater().Than(42)
assert(x > 42)
[
{
"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
}
]
PERCHÉ ACCADE
Fretta di consegnare
Troppo design up-front
Troppi cambi di requisiti
Inesperienza
Il software è un prodotto secondario di un processo di apprendimento
ziobrando
ESEMPI e SPUNTI
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);
}
}
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>
)
}
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>
)
}
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>
)
}
duplication is far cheaper than the wrong abstraction
prefer duplication over the wrong abstraction
Sandi Metz
Domain model monolitico
Bounded Context
CRUD con CQRS/ES
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
Microservizi!
Servizi “logici”
Process Manager
Siamo sicuri che la Single Page Application sia sempre la scelta giusta?
Useless layers
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
Il linguaggio ha un impatto sulla semplicità?
STRUMENTI UTILI
Misurare
● Cyclomatic complexity
● Afferent Coupling
● Efferent Coupling
● Depth of inheritance
● Instability
● Abstraction level
● …
Modularizzare
Idee dall’FP: Funzioni pure e strutture dati immutabili
● Idee dalla programmazione funzionale
● Funzioni pure senza side effect
● Strutture dati immutabili
● High order function
I buoni vecchi principi
● DRY
● KISS
● OCP
● YAGNI
● SOLID or CUPID
● Composition over inheritance
● Be explicit
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
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.
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
test "Scan empty code should return 0" do
assert Checkout.scan("")
=
=
0
end
defmodule Checkout do
def scan(_code) do
0
end
end
Test Driven Development
○ Un test difficile da scrivere è indice di complessità del codice che
dovrà testare
○ Troppo setup
○ Troppe dipendenze
○ Test poco parlante
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
4 rules of simple design
● Test Pass
● Express intent
● No duplication
● Small
As simple as possible, but no simpler. (Einstein)
EMANUELE DELBONO
Founder & Software developer @ CodicePlastico
emanuele@codiceplastico.com
@emadb
Grazie
emanuele@codiceplastico.com

Más contenido relacionado

Similar a The simplest thing that could possibly work

Intoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliIntoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliStefano Leli
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsCommit University
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSAndrea Saltarello
 
Java Unit Testing - Introduction
Java Unit Testing - IntroductionJava Unit Testing - Introduction
Java Unit Testing - Introductionfgianneschi
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS BuildGian Maria Ricci
 
Lean Web Solutions with WP [versione italiana]
Lean Web Solutions with WP [versione italiana]Lean Web Solutions with WP [versione italiana]
Lean Web Solutions with WP [versione italiana]Carlo Beschi
 
Una fugace occhiata al Test Driven Development (2006)
Una fugace occhiata al Test Driven Development  (2006)Una fugace occhiata al Test Driven Development  (2006)
Una fugace occhiata al Test Driven Development (2006)Roberto Bettazzoni
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventPietro Di Bello
 
Evolutive User Experience Design
Evolutive User Experience DesignEvolutive User Experience Design
Evolutive User Experience DesignLuca Mascaro
 
Deno - L'anagramma di node
Deno - L'anagramma di nodeDeno - L'anagramma di node
Deno - L'anagramma di nodeFrancesco Sciuti
 
Loosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain modelLoosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain modelFrancesca1980
 
Fe05 test drivenjavascriptdevelopment
Fe05   test drivenjavascriptdevelopmentFe05   test drivenjavascriptdevelopment
Fe05 test drivenjavascriptdevelopmentDotNetCampus
 
Test Driven Development @ Xe.Net
Test Driven Development @ Xe.NetTest Driven Development @ Xe.Net
Test Driven Development @ Xe.NetMauro Servienti
 
BDD in DDD
BDD in DDDBDD in DDD
BDD in DDDoehsani
 
Linux Day 20091024 Test Driven Development
Linux Day 20091024 Test Driven DevelopmentLinux Day 20091024 Test Driven Development
Linux Day 20091024 Test Driven DevelopmentRoberto Albertini
 
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiDelphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiMarco Breveglieri
 

Similar a The simplest thing that could possibly work (20)

Intoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliIntoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie Agili
 
AngularJS 2.0
AngularJS 2.0 AngularJS 2.0
AngularJS 2.0
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step Functions
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
 
Java Unit Testing - Introduction
Java Unit Testing - IntroductionJava Unit Testing - Introduction
Java Unit Testing - Introduction
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
Lean Web Solutions with WP [versione italiana]
Lean Web Solutions with WP [versione italiana]Lean Web Solutions with WP [versione italiana]
Lean Web Solutions with WP [versione italiana]
 
Una fugace occhiata al Test Driven Development (2006)
Una fugace occhiata al Test Driven Development  (2006)Una fugace occhiata al Test Driven Development  (2006)
Una fugace occhiata al Test Driven Development (2006)
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
 
Agile Engineering
Agile EngineeringAgile Engineering
Agile Engineering
 
Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
 
Evolutive User Experience Design
Evolutive User Experience DesignEvolutive User Experience Design
Evolutive User Experience Design
 
Deno - L'anagramma di node
Deno - L'anagramma di nodeDeno - L'anagramma di node
Deno - L'anagramma di node
 
Loosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain modelLoosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain model
 
Fe05 test drivenjavascriptdevelopment
Fe05   test drivenjavascriptdevelopmentFe05   test drivenjavascriptdevelopment
Fe05 test drivenjavascriptdevelopment
 
Test Driven Development @ Xe.Net
Test Driven Development @ Xe.NetTest Driven Development @ Xe.Net
Test Driven Development @ Xe.Net
 
BDD in DDD
BDD in DDDBDD in DDD
BDD in DDD
 
Linux Day 20091024 Test Driven Development
Linux Day 20091024 Test Driven DevelopmentLinux Day 20091024 Test Driven Development
Linux Day 20091024 Test Driven Development
 
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiDelphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
 

Más de Emanuele DelBono

Más de Emanuele DelBono (13)

Una crescita armoniosa
Una crescita armoniosaUna crescita armoniosa
Una crescita armoniosa
 
A sip of Elixir
A sip of ElixirA sip of Elixir
A sip of Elixir
 
React.js in real world apps.
React.js in real world apps. React.js in real world apps.
React.js in real world apps.
 
An introduction to React.js
An introduction to React.jsAn introduction to React.js
An introduction to React.js
 
From ActiveRecord to EventSourcing
From ActiveRecord to EventSourcingFrom ActiveRecord to EventSourcing
From ActiveRecord to EventSourcing
 
Ruby seen by a C# developer
Ruby seen by a C# developerRuby seen by a C# developer
Ruby seen by a C# developer
 
Ruby loves DDD
Ruby loves DDDRuby loves DDD
Ruby loves DDD
 
An introduction to knockout.js
An introduction to knockout.jsAn introduction to knockout.js
An introduction to knockout.js
 
Node azure
Node azureNode azure
Node azure
 
Da programmatore a CEO
Da programmatore a CEODa programmatore a CEO
Da programmatore a CEO
 
Sinatra for REST services
Sinatra for REST servicesSinatra for REST services
Sinatra for REST services
 
Test driving an MVVM App
Test driving an MVVM AppTest driving an MVVM App
Test driving an MVVM App
 
Mocking
MockingMocking
Mocking
 

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
  • 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)
  • 11.
  • 12. [ { "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 } ]
  • 13.
  • 14.
  • 15.
  • 19. Troppi cambi di requisiti
  • 21. Il software è un prodotto secondario di un processo di apprendimento ziobrando
  • 22.
  • 23.
  • 25. 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); } }
  • 26. 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> ) }
  • 27. 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> ) }
  • 28. 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> ) }
  • 29. duplication is far cheaper than the wrong abstraction prefer duplication over the wrong abstraction Sandi Metz
  • 33. 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
  • 35.
  • 38. Siamo sicuri che la Single Page Application sia sempre la scelta giusta?
  • 40. 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
  • 41. Il linguaggio ha un impatto sulla semplicità?
  • 43. Misurare ● Cyclomatic complexity ● Afferent Coupling ● Efferent Coupling ● Depth of inheritance ● Instability ● Abstraction level ● …
  • 45. Idee dall’FP: Funzioni pure e strutture dati immutabili ● Idee dalla programmazione funzionale ● Funzioni pure senza side effect ● Strutture dati immutabili ● High order function
  • 46. I buoni vecchi principi ● DRY ● KISS ● OCP ● YAGNI ● SOLID or CUPID ● Composition over inheritance ● Be explicit
  • 47. 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
  • 48. 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.
  • 49. 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
  • 50. test "Scan empty code should return 0" do assert Checkout.scan("") = = 0 end defmodule Checkout do def scan(_code) do 0 end end
  • 51. Test Driven Development ○ Un test difficile da scrivere è indice di complessità del codice che dovrà testare ○ Troppo setup ○ Troppe dipendenze ○ Test poco parlante
  • 52. 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
  • 53.
  • 54.
  • 55.
  • 56. 4 rules of simple design ● Test Pass ● Express intent ● No duplication ● Small
  • 57. As simple as possible, but no simpler. (Einstein)
  • 58.
  • 59.
  • 60. EMANUELE DELBONO Founder & Software developer @ CodicePlastico emanuele@codiceplastico.com @emadb