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
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
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
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
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
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/