SlideShare a Scribd company logo
1 of 45
Accelera la tua crescita
Come funziona il cervello
di un programmatore
quando impara e affronta
nuovi problemi?
Pietro Roversi | Senior Developer
Confusione o non confusione, questo è il problema
1. La confusione è una costante dell’attività di un programmatore
2. Non è un problema essere confusi,
il problema è esserlo per più tempo del dovuto
3. Il codice degli altri crea confusione,
ma non tutto il codice è confuso allo stesso modo
Accelera la tua crescita
Differenti tipi di confusione nel codice
1. Conversione di un numero N in binario nel linguaggio APL
2 2 2 2 2 ⊤ n
2. Conversione di un numero N binario nel linguaggio Java
public class BinaryCalculator {
public static void mian(Integer n) {
System.out.println(Integer.toBinaryString(n));
}
}
Accelera la tua crescita
Differenti tipi di confusione nel codice
3. Conversione di un numero N in binario nel linguaggio BASIC
1 LET N2 = ABS (INT (N))
2 LET B$ = ""
3 FOR N1 = N2 TO 0 STEP 0
4 LET N2 = INT (N1 / 2)
5 LET B$ = STR$ (N1 - N2 * 2) + B$
6 LET N1 = N2
7 NEXT N1
8 PRINT B$
9 RETURN
Accelera la tua crescita
Differenti tipi di confusione nel codice
Tutto chiaro?
Accelera la tua crescita
Differenti tipi di confusione nel codice
1. Conversione di un numero N in binario nel linguaggio APL
2 2 2 2 2 ⊤ n
2. Conversione di un numero N binario nel linguaggio Java
public class BinaryCalculator {
public static void mian(Integer n) {
System.out.println(Integer.toBinaryString(n));
}
}
Mancanza di
conoscenza
Mancanza di
informazioni
Accelera la tua crescita
Differenti tipi di confusione nel codice
3. Conversione di un numero N in binario nel linguaggio BASIC
1 LET N2 = ABS (INT (N))
2 LET B$ = ""
3 FOR N1 = N2 TO 0 STEP 0
4 LET N2 = INT (N1 / 2)
5 LET B$ = STR$ (N1 - N2 * 2) + B$
6 LET N1 = N2
7 NEXT N1
8 PRINT B$
9 RETURN
Mancanza di
«potenza di
processo»
Accelera la tua crescita
Processi cognitivi coinvolti nella programmazione
1. Mancanza di conoscenza: non ci sono abbastanza fatti rilevanti
nella long term memory
2. Mancanza di informazioni: le info di cui abbiamo bisogno
dovrebber essere salvate nella short term memory ma, dovendo
cercare in più parti, si potrebbe scordare qualcosa che si ha
assimilato in passato
3. Mancanza di «potenza di processo»: quando è necessario
elaborare molte informazioni, l’onere ricade sulla working
memory
Accelera la tua crescita
Accelera la tua crescita
Long term memory
Può salvare i nostri ricordi per
moltissimo tempo
Gioca un ruolo importantissimo in
tutto quello che facciamo
Possiamo paragonarla all’hard disk
del nostro cervello
Accelera la tua crescita
Short term
memory
Contiene solo pochi elementi: 7 ± 2
Le informazioni vengono
raggruppate in chunks
Può essere paragonata alla RAM del
nostro cervello
Chunking
1. E’ chiaro che siamo in grado di processare più di 6 lettere
contemporaneamente ma..come è possibile?
2. L’esperienza ci aiuta, recuperiamo informazioni dalla LTM
riconducendole a scenari noti
3. Non siete convinti?
Accelera la tua crescita
Chunking
Accelera la tua crescita
Chunking
Accelera la tua crescita
Chunking
Accelera la tua crescita
Chunking
• Quando si ha molta conoscenza sull’argomento è più facile ricordare
qualcosa
• La costruzione dei chunk nella STM dipende dalle nostre esperienze
pregresse
• Questo ci insegna che...i programmatori esperti possono ricordare il
codice meglio dei programmatori meno esperti
Accelera la tua crescita
Ricordare la sintassi è importante
Non ricordo qualcosa lo cerco su internet?
Accelera la tua crescita
• Ciò che sappiamo impatta sull’efficienza con cui
possiamo leggere ed elaborare il codice
• Più concetti, strutture dati e sintassi conosciamo
e più possiamo suddividere il codice in blocchi
• Le interruzioni compromettono il flusso di lavoro
Accelera la tua crescita
Working Memory
• È la responsabile del nostro
pensiero
• Si occupa della generazione
di nuove idee e soluzioni
• Può essere paragonata al
processore del nostro
cervello
Working memory piena, e ora?
Ci sono delle tecniche per aiutare la nostra
memoria durante la fase processo:
• Creare un grafico di dipendenza nel codice
• Usare le tabelle di stato
• Combinare le due soluzioni insieme
Accelera la tua crescita
Perché è difficile capire il codice complesso?
A causa del carico cognitivo che si genera
durante la lettura
Intrinseco: creato dalla complessità
intrinseca di un singolo pezzo di codice
Estraneo: aggiunto al codice accidentalmente
(aggiungendo etichette o astrazioni) o a causa
di lacune del programmatore
Pertinente: dovuto alla difficoltà di memorizzare
il pensiero in LTM a causa dell’elevato
carico cognitivo
Accelera la tua crescita
Accelera la tua crescita
Come riduco il carico?
Tecniche per ridurre il carico cognitivo
• Refactoring
• Sostituzione di costrutti non familiari
• Aggiungere i sinonimi di codice al proprio mazzo di flashcards
Accelera la tua crescita
Flashcards
Strumenti utili per imparare la sintassi di un linguaggio
Accelera la tua crescita
Flashcards
Strumenti utili per imparare la sintassi di un linguaggio
Accelera la tua crescita
Come non dimenticare
Non si possono «ricordare» le cose per troppo
tempo senza esercizio
1. Pratica di recupero: sforzarsi di ricordare le informazioni
prima di cercarle
2. Pianificare esercizi periodici
3. Nella LTM le informazioni sono salvate come una rete
connessa: elaborare attivamente le nuove informazioni
aiuta a rafforzare i ricordi
Accelera la tua crescita
Leggere un testo è così diverso dal
leggere il codice?
• Un programmatore spende il 60% del tempo a leggere il codice,
ma non viene allenato a farlo. (https://ieeexplore.ieee.org/abstract/document/7997917)
• Nel primo 30% del tempo speso guardando il codice i programmatori
guardano circa il 70% delle righe.
• Cosa accade nel nostro cervello dopo aver letto del codice?
2014 Janet Siegmund, offuscò le variabili più significative ai suoi tester.
Notò che la comprensione del codice attivò le aree del cervello dedicate alla
comprensione del linguaggio naturale
Accelera la tua crescita
Quindi…
Se potete imparare il
Francese, potete anche
imparare Python
Accelera la tua crescita
Strategie di comprensione del testo applicate
al codice
1. Attivazione della conoscenza pregressa
2. Monitoraggio
3. Determinare l’importanza delle parti
4. Inferire
5. Visualizzare
6. Porre domande
7. Riepilogare
Accelera la tua crescita
Imparare un secondo linguaggio, è più facile?
• Trasferimento durante l’apprendimento: le informazioni presenti in LTM
possono aiutarci nell’imparare nuovi argomenti.
• Trasferimento di apprendimento: possiamo usare cose che già sappiamo in
situazioni diverse
Accelera la tua crescita
Imparare un secondo linguaggio, è più facile?
• La conoscenza che abbiamo in LTM
su un primo dominio può essere usata
su un secondo dominio: trasferimento positivo
• Sempre la nostra conoscenza, può a
volte, essere un ostacolo nel processo
di apprendimento: trasferimento negativo
Accelera la tua crescita
Quali sono le conseguenze di un trasferimento
negativo?
I malintesi!
Cambiamento concettuale: sostituzione di un malinteso attraverso la creazione
di un nuovo modello mentale.
C’è sempre il rischio di ricadere nel precedente modello errato. Per aiutarci,
usiamo test e documentazione nella nostra codebase
Accelera la tua crescita
Scrittura del codice, cosa succede alla
memoria?
E il debug?
By Felienne Hermans
Solitamente quando si compiono azioni di debug si svolgono tutte e cinque le attività
Accelera la tua crescita
E..se ci interrompono?
• Il nostro carico cognitivo non è lo stesso durante lo
svolgimento di tutto il task, ha un andamento a
campana
• Il 20% del tempo di uno sviluppatore è speso in
interruzioni
(https://ieeexplore.ieee.org/document/714843)
• Microsoft, ha stimato che il 62% degli sviluppatori
considera un problema serio riprendere l’attività
dopo un’interruzione
• Solo il 10% degli sviluppatori, dopo
un’interruzione, riesce a riprendere il lavoro in
meno di un minuto
• Abbiamo la percezione che il compito da svolgere
diventi più difficile
Accelera la tua crescita
Come possiamo organizzarci?
Dobbiamo salvare il nostro modello mentale!
• Lasciare note nei commenti
per aiutare la STM
• Scrivendo dei TODO per il futuro
per aiutare la Prospective Memory
• Dividere il problema in sotto task più semplici e veloci da risolvere
Accelera la tua crescita
Il «bad code» genera carico cognitivo
• E’ importante scrivere codice che
non sia confusionario per gli altri
ma anche per il «noi del futuro»
• Il code smell contiene antipattern,
codice duplicato o nomi confusi
• Il code smell costa, sia in termini
di impatto cognitivo che di tempo
per il refactoring
Accelera la tua crescita
Immagine di cookie_studio su Freepik
Quanto costa il code smell?
Gli antipattern (linguistici) generano confusione perché il codice fa qualcosa di diverso
rispetto a quello che dicono i nomi
• la nostra LTM trova assunzioni sbagliate mentre cerca di supportare il pensiero
• possono indurre a chunking sbagliati
Ci sono diversi modi per misurare il carico cognitivo dovuto al code smell, il più Semplice
è la scala Paas
Accelera la tua crescita
Quanto costa il code smell?
Gli antipattern (linguistici) generano confusione perché il codice fa qualcosa di diverso
rispetto a quello che dicono i nomi
• la nostra LTM trova assunzioni sbagliate mentre cerca di supportare il pensiero
• possono indurre a chunking sbagliati
Ci sono diversi modi per misurare il carico cognitivo dovuto al code smell, il più Semplice
è la scala Paas
Accelera la tua crescita
I nomi giusti sono importanti
• Regole sintattiche:
• uso corretto delle maiuscole, evitare doppi «_», attenzione alla lunghezza, non
usare troppe parole (max 4)..
• Uso di camel case o snake case. (https://ieeexplore.ieee.org/abstract/document/5090039)
• Camel case: più facili da ricordare sul lungo periodo
• Snake case: più facili da identificare all’interno del codice
• Coerenza all’interno della codebase
• Il codice che presenta una nomenclatura confusionaria ha probabilità
maggiori di contenere bug
Accelera la tua crescita
Come scegliere i nomi corretti?
Dror Feitelson ha elaborato un modello
1. Selezionare i concetti da includere
nel nome
2. Scegliere le parole che
rappresentano ogni concetto
3. Costruire il nome usando quelle
parole
Accelera la tua crescita
Immagine di wayhomestudio su Freepik
Problem solving: cosa succede veramente?
Accelera la tua crescita
Problem solving: cosa succede veramente?
Accelera la tua crescita
Possiamo aumentare la nostra capacità di
problem solving?
• Aumentare la memoria implicita:
il suo utilizzo velocizza le nostre attività di base (può anche rallentarci in
certe occasioni es. layout della tastiera, cambio linguaggio)
• Automatizzazione:
padroneggiare delle skill in modo da poterle poi aggiungere alla
memoria (episodica) e farle senza aumentare il carico cognitivo
• Studiare del codice esistente
(https://dl.acm.org/doi/10.1145/131295.131301)
Accelera la tua crescita
Accelera la tua crescita
In conclusione…
Fare lo sviluppatore è una vocazione,
il carico cognitivo su tutti i livelli è altissimo..
o siamo folli o siamo appassionati!
Accelera la tua crescita
Bibliografia
• “The programmer’s brain”, Felienne Hermans, Manning (2021)
• “Replication and Analysis of Ebbinghaus’ Forgetting Curve”, Jaap Murre (2015),
https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0120644
• “Measuring Program Comprehension: A Large-Scale Field Study with Professionals”, Xin Xia et al.(2017),
https://ieeexplore.ieee.org/abstract/document/7997917
• “Understanding Programmers’ Brains with fMRI”, Janet Siegmund et al. (2014),
www.frontiersin.org/10.3389/conf.fninf.2014.18.00040/event_abstract.
• “Interrupts: Just a Minute Never Is,” IEEE Software, vol. 15, no. 5, Rini van Solingen et al.,
https://ieeexplore.ieee.org/document/714843.
• “Maintaining Mental Models: A Study of Developer Work Habits”, Thomas D. LaToza et al.,
https://dl.acm.org/doi/10.1145/1134285.1134355.
• “The case for case studies of programming problems,” Marcia C. Linn and Michael J. Clancy, Communications
of the ACM, vol. 35, no. 3, 1992, https://dl.acm.org/doi/10.1145/131295.131301
• “Anki app”, https://ankiweb.net/ e https://www.ankiapp.com/
Accelera la tua crescita
Accelera la tua crescita
Grazie
pietro.roversi@evoluzione.agency
https://twitter.com/PietroRov
https://www.linkedin.com/in/pietro-roversi-61070527/
https://evoluzione.agency/

More Related Content

Similar to Come funziona il cervello di un programmatore quando impara e affronta nuovi problemi.pdf

Slide Wallabiez Agile Day 2007
Slide Wallabiez Agile Day 2007Slide Wallabiez Agile Day 2007
Slide Wallabiez Agile Day 2007Manuela Munaretto
 
Breaking the ice with agile - cinque strade per rompere il ghiaccio e introdu...
Breaking the ice with agile - cinque strade per rompere il ghiaccio e introdu...Breaking the ice with agile - cinque strade per rompere il ghiaccio e introdu...
Breaking the ice with agile - cinque strade per rompere il ghiaccio e introdu...Pietro Di Bello
 
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
 
Test Driven Development @ Xe.Net
Test Driven Development @ Xe.NetTest Driven Development @ Xe.Net
Test Driven Development @ Xe.NetMauro Servienti
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming LanguagePasquale Paola
 
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clientiScrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clientiMarco Da Rin Zanco
 
Presentazione della Codeweek
Presentazione della Codeweek Presentazione della Codeweek
Presentazione della Codeweek Piero Pavanini
 
Reshaping enterrprise software
Reshaping enterrprise softwareReshaping enterrprise software
Reshaping enterrprise softwareAlberto Brandolini
 
Il pensiero Computazionale come risorsa trasversale
Il pensiero Computazionale come risorsa trasversaleIl pensiero Computazionale come risorsa trasversale
Il pensiero Computazionale come risorsa trasversaleLaura De Biaggi
 
Intoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliIntoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliStefano Leli
 
Intelligenza artificiale nel mondo front-end - CodeGen2021
Intelligenza artificiale nel mondo front-end - CodeGen2021Intelligenza artificiale nel mondo front-end - CodeGen2021
Intelligenza artificiale nel mondo front-end - CodeGen2021Michele Aponte
 

Similar to Come funziona il cervello di un programmatore quando impara e affronta nuovi problemi.pdf (20)

Object Oriented Programming
Object Oriented ProgrammingObject Oriented Programming
Object Oriented Programming
 
Slide Wallabiez Agile Day 2007
Slide Wallabiez Agile Day 2007Slide Wallabiez Agile Day 2007
Slide Wallabiez Agile Day 2007
 
Breaking the ice with agile - cinque strade per rompere il ghiaccio e introdu...
Breaking the ice with agile - cinque strade per rompere il ghiaccio e introdu...Breaking the ice with agile - cinque strade per rompere il ghiaccio e introdu...
Breaking the ice with agile - cinque strade per rompere il ghiaccio e introdu...
 
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)
 
Manuale python
Manuale pythonManuale python
Manuale python
 
Biassono milo
Biassono miloBiassono milo
Biassono milo
 
Biassono milo
Biassono miloBiassono milo
Biassono milo
 
Coding
CodingCoding
Coding
 
Agile software lifecycle
Agile software lifecycleAgile software lifecycle
Agile software lifecycle
 
Test Driven Development @ Xe.Net
Test Driven Development @ Xe.NetTest Driven Development @ Xe.Net
Test Driven Development @ Xe.Net
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming Language
 
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clientiScrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
 
TDD - una introduzione
TDD -  una introduzioneTDD -  una introduzione
TDD - una introduzione
 
Presentazione della Codeweek
Presentazione della Codeweek Presentazione della Codeweek
Presentazione della Codeweek
 
Reshaping enterrprise software
Reshaping enterrprise softwareReshaping enterrprise software
Reshaping enterrprise software
 
Il pensiero Computazionale come risorsa trasversale
Il pensiero Computazionale come risorsa trasversaleIl pensiero Computazionale come risorsa trasversale
Il pensiero Computazionale come risorsa trasversale
 
Intoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliIntoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie Agili
 
Intelligenza artificiale nel mondo front-end - CodeGen2021
Intelligenza artificiale nel mondo front-end - CodeGen2021Intelligenza artificiale nel mondo front-end - CodeGen2021
Intelligenza artificiale nel mondo front-end - CodeGen2021
 
Linux a scuola
Linux a scuolaLinux a scuola
Linux a scuola
 
corso RHO
corso RHOcorso RHO
corso RHO
 

Come funziona il cervello di un programmatore quando impara e affronta nuovi problemi.pdf

  • 1. Accelera la tua crescita Come funziona il cervello di un programmatore quando impara e affronta nuovi problemi? Pietro Roversi | Senior Developer
  • 2. Confusione o non confusione, questo è il problema 1. La confusione è una costante dell’attività di un programmatore 2. Non è un problema essere confusi, il problema è esserlo per più tempo del dovuto 3. Il codice degli altri crea confusione, ma non tutto il codice è confuso allo stesso modo Accelera la tua crescita
  • 3. Differenti tipi di confusione nel codice 1. Conversione di un numero N in binario nel linguaggio APL 2 2 2 2 2 ⊤ n 2. Conversione di un numero N binario nel linguaggio Java public class BinaryCalculator { public static void mian(Integer n) { System.out.println(Integer.toBinaryString(n)); } } Accelera la tua crescita
  • 4. Differenti tipi di confusione nel codice 3. Conversione di un numero N in binario nel linguaggio BASIC 1 LET N2 = ABS (INT (N)) 2 LET B$ = "" 3 FOR N1 = N2 TO 0 STEP 0 4 LET N2 = INT (N1 / 2) 5 LET B$ = STR$ (N1 - N2 * 2) + B$ 6 LET N1 = N2 7 NEXT N1 8 PRINT B$ 9 RETURN Accelera la tua crescita
  • 5. Differenti tipi di confusione nel codice Tutto chiaro? Accelera la tua crescita
  • 6. Differenti tipi di confusione nel codice 1. Conversione di un numero N in binario nel linguaggio APL 2 2 2 2 2 ⊤ n 2. Conversione di un numero N binario nel linguaggio Java public class BinaryCalculator { public static void mian(Integer n) { System.out.println(Integer.toBinaryString(n)); } } Mancanza di conoscenza Mancanza di informazioni Accelera la tua crescita
  • 7. Differenti tipi di confusione nel codice 3. Conversione di un numero N in binario nel linguaggio BASIC 1 LET N2 = ABS (INT (N)) 2 LET B$ = "" 3 FOR N1 = N2 TO 0 STEP 0 4 LET N2 = INT (N1 / 2) 5 LET B$ = STR$ (N1 - N2 * 2) + B$ 6 LET N1 = N2 7 NEXT N1 8 PRINT B$ 9 RETURN Mancanza di «potenza di processo» Accelera la tua crescita
  • 8. Processi cognitivi coinvolti nella programmazione 1. Mancanza di conoscenza: non ci sono abbastanza fatti rilevanti nella long term memory 2. Mancanza di informazioni: le info di cui abbiamo bisogno dovrebber essere salvate nella short term memory ma, dovendo cercare in più parti, si potrebbe scordare qualcosa che si ha assimilato in passato 3. Mancanza di «potenza di processo»: quando è necessario elaborare molte informazioni, l’onere ricade sulla working memory Accelera la tua crescita
  • 9. Accelera la tua crescita Long term memory Può salvare i nostri ricordi per moltissimo tempo Gioca un ruolo importantissimo in tutto quello che facciamo Possiamo paragonarla all’hard disk del nostro cervello
  • 10. Accelera la tua crescita Short term memory Contiene solo pochi elementi: 7 ± 2 Le informazioni vengono raggruppate in chunks Può essere paragonata alla RAM del nostro cervello
  • 11. Chunking 1. E’ chiaro che siamo in grado di processare più di 6 lettere contemporaneamente ma..come è possibile? 2. L’esperienza ci aiuta, recuperiamo informazioni dalla LTM riconducendole a scenari noti 3. Non siete convinti? Accelera la tua crescita
  • 15. Chunking • Quando si ha molta conoscenza sull’argomento è più facile ricordare qualcosa • La costruzione dei chunk nella STM dipende dalle nostre esperienze pregresse • Questo ci insegna che...i programmatori esperti possono ricordare il codice meglio dei programmatori meno esperti Accelera la tua crescita
  • 16. Ricordare la sintassi è importante Non ricordo qualcosa lo cerco su internet? Accelera la tua crescita • Ciò che sappiamo impatta sull’efficienza con cui possiamo leggere ed elaborare il codice • Più concetti, strutture dati e sintassi conosciamo e più possiamo suddividere il codice in blocchi • Le interruzioni compromettono il flusso di lavoro
  • 17. Accelera la tua crescita Working Memory • È la responsabile del nostro pensiero • Si occupa della generazione di nuove idee e soluzioni • Può essere paragonata al processore del nostro cervello
  • 18. Working memory piena, e ora? Ci sono delle tecniche per aiutare la nostra memoria durante la fase processo: • Creare un grafico di dipendenza nel codice • Usare le tabelle di stato • Combinare le due soluzioni insieme Accelera la tua crescita
  • 19. Perché è difficile capire il codice complesso? A causa del carico cognitivo che si genera durante la lettura Intrinseco: creato dalla complessità intrinseca di un singolo pezzo di codice Estraneo: aggiunto al codice accidentalmente (aggiungendo etichette o astrazioni) o a causa di lacune del programmatore Pertinente: dovuto alla difficoltà di memorizzare il pensiero in LTM a causa dell’elevato carico cognitivo Accelera la tua crescita
  • 20. Accelera la tua crescita Come riduco il carico?
  • 21. Tecniche per ridurre il carico cognitivo • Refactoring • Sostituzione di costrutti non familiari • Aggiungere i sinonimi di codice al proprio mazzo di flashcards Accelera la tua crescita
  • 22. Flashcards Strumenti utili per imparare la sintassi di un linguaggio Accelera la tua crescita
  • 23. Flashcards Strumenti utili per imparare la sintassi di un linguaggio Accelera la tua crescita
  • 24. Come non dimenticare Non si possono «ricordare» le cose per troppo tempo senza esercizio 1. Pratica di recupero: sforzarsi di ricordare le informazioni prima di cercarle 2. Pianificare esercizi periodici 3. Nella LTM le informazioni sono salvate come una rete connessa: elaborare attivamente le nuove informazioni aiuta a rafforzare i ricordi Accelera la tua crescita
  • 25. Leggere un testo è così diverso dal leggere il codice? • Un programmatore spende il 60% del tempo a leggere il codice, ma non viene allenato a farlo. (https://ieeexplore.ieee.org/abstract/document/7997917) • Nel primo 30% del tempo speso guardando il codice i programmatori guardano circa il 70% delle righe. • Cosa accade nel nostro cervello dopo aver letto del codice? 2014 Janet Siegmund, offuscò le variabili più significative ai suoi tester. Notò che la comprensione del codice attivò le aree del cervello dedicate alla comprensione del linguaggio naturale Accelera la tua crescita
  • 26. Quindi… Se potete imparare il Francese, potete anche imparare Python Accelera la tua crescita
  • 27. Strategie di comprensione del testo applicate al codice 1. Attivazione della conoscenza pregressa 2. Monitoraggio 3. Determinare l’importanza delle parti 4. Inferire 5. Visualizzare 6. Porre domande 7. Riepilogare Accelera la tua crescita
  • 28. Imparare un secondo linguaggio, è più facile? • Trasferimento durante l’apprendimento: le informazioni presenti in LTM possono aiutarci nell’imparare nuovi argomenti. • Trasferimento di apprendimento: possiamo usare cose che già sappiamo in situazioni diverse Accelera la tua crescita
  • 29. Imparare un secondo linguaggio, è più facile? • La conoscenza che abbiamo in LTM su un primo dominio può essere usata su un secondo dominio: trasferimento positivo • Sempre la nostra conoscenza, può a volte, essere un ostacolo nel processo di apprendimento: trasferimento negativo Accelera la tua crescita
  • 30. Quali sono le conseguenze di un trasferimento negativo? I malintesi! Cambiamento concettuale: sostituzione di un malinteso attraverso la creazione di un nuovo modello mentale. C’è sempre il rischio di ricadere nel precedente modello errato. Per aiutarci, usiamo test e documentazione nella nostra codebase Accelera la tua crescita
  • 31. Scrittura del codice, cosa succede alla memoria? E il debug? By Felienne Hermans Solitamente quando si compiono azioni di debug si svolgono tutte e cinque le attività Accelera la tua crescita
  • 32. E..se ci interrompono? • Il nostro carico cognitivo non è lo stesso durante lo svolgimento di tutto il task, ha un andamento a campana • Il 20% del tempo di uno sviluppatore è speso in interruzioni (https://ieeexplore.ieee.org/document/714843) • Microsoft, ha stimato che il 62% degli sviluppatori considera un problema serio riprendere l’attività dopo un’interruzione • Solo il 10% degli sviluppatori, dopo un’interruzione, riesce a riprendere il lavoro in meno di un minuto • Abbiamo la percezione che il compito da svolgere diventi più difficile Accelera la tua crescita
  • 33. Come possiamo organizzarci? Dobbiamo salvare il nostro modello mentale! • Lasciare note nei commenti per aiutare la STM • Scrivendo dei TODO per il futuro per aiutare la Prospective Memory • Dividere il problema in sotto task più semplici e veloci da risolvere Accelera la tua crescita
  • 34. Il «bad code» genera carico cognitivo • E’ importante scrivere codice che non sia confusionario per gli altri ma anche per il «noi del futuro» • Il code smell contiene antipattern, codice duplicato o nomi confusi • Il code smell costa, sia in termini di impatto cognitivo che di tempo per il refactoring Accelera la tua crescita Immagine di cookie_studio su Freepik
  • 35. Quanto costa il code smell? Gli antipattern (linguistici) generano confusione perché il codice fa qualcosa di diverso rispetto a quello che dicono i nomi • la nostra LTM trova assunzioni sbagliate mentre cerca di supportare il pensiero • possono indurre a chunking sbagliati Ci sono diversi modi per misurare il carico cognitivo dovuto al code smell, il più Semplice è la scala Paas Accelera la tua crescita
  • 36. Quanto costa il code smell? Gli antipattern (linguistici) generano confusione perché il codice fa qualcosa di diverso rispetto a quello che dicono i nomi • la nostra LTM trova assunzioni sbagliate mentre cerca di supportare il pensiero • possono indurre a chunking sbagliati Ci sono diversi modi per misurare il carico cognitivo dovuto al code smell, il più Semplice è la scala Paas Accelera la tua crescita
  • 37. I nomi giusti sono importanti • Regole sintattiche: • uso corretto delle maiuscole, evitare doppi «_», attenzione alla lunghezza, non usare troppe parole (max 4).. • Uso di camel case o snake case. (https://ieeexplore.ieee.org/abstract/document/5090039) • Camel case: più facili da ricordare sul lungo periodo • Snake case: più facili da identificare all’interno del codice • Coerenza all’interno della codebase • Il codice che presenta una nomenclatura confusionaria ha probabilità maggiori di contenere bug Accelera la tua crescita
  • 38. Come scegliere i nomi corretti? Dror Feitelson ha elaborato un modello 1. Selezionare i concetti da includere nel nome 2. Scegliere le parole che rappresentano ogni concetto 3. Costruire il nome usando quelle parole Accelera la tua crescita Immagine di wayhomestudio su Freepik
  • 39. Problem solving: cosa succede veramente? Accelera la tua crescita
  • 40. Problem solving: cosa succede veramente? Accelera la tua crescita
  • 41. Possiamo aumentare la nostra capacità di problem solving? • Aumentare la memoria implicita: il suo utilizzo velocizza le nostre attività di base (può anche rallentarci in certe occasioni es. layout della tastiera, cambio linguaggio) • Automatizzazione: padroneggiare delle skill in modo da poterle poi aggiungere alla memoria (episodica) e farle senza aumentare il carico cognitivo • Studiare del codice esistente (https://dl.acm.org/doi/10.1145/131295.131301) Accelera la tua crescita
  • 42. Accelera la tua crescita In conclusione…
  • 43. Fare lo sviluppatore è una vocazione, il carico cognitivo su tutti i livelli è altissimo.. o siamo folli o siamo appassionati! Accelera la tua crescita
  • 44. Bibliografia • “The programmer’s brain”, Felienne Hermans, Manning (2021) • “Replication and Analysis of Ebbinghaus’ Forgetting Curve”, Jaap Murre (2015), https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0120644 • “Measuring Program Comprehension: A Large-Scale Field Study with Professionals”, Xin Xia et al.(2017), https://ieeexplore.ieee.org/abstract/document/7997917 • “Understanding Programmers’ Brains with fMRI”, Janet Siegmund et al. (2014), www.frontiersin.org/10.3389/conf.fninf.2014.18.00040/event_abstract. • “Interrupts: Just a Minute Never Is,” IEEE Software, vol. 15, no. 5, Rini van Solingen et al., https://ieeexplore.ieee.org/document/714843. • “Maintaining Mental Models: A Study of Developer Work Habits”, Thomas D. LaToza et al., https://dl.acm.org/doi/10.1145/1134285.1134355. • “The case for case studies of programming problems,” Marcia C. Linn and Michael J. Clancy, Communications of the ACM, vol. 35, no. 3, 1992, https://dl.acm.org/doi/10.1145/131295.131301 • “Anki app”, https://ankiweb.net/ e https://www.ankiapp.com/ Accelera la tua crescita
  • 45. Accelera la tua crescita Grazie pietro.roversi@evoluzione.agency https://twitter.com/PietroRov https://www.linkedin.com/in/pietro-roversi-61070527/ https://evoluzione.agency/