Diavolul se află în detalii – cum să îl găsești

Diavolul stă în detalii – cum să îl găsești

Ai fost vreodată într-o situație când, după ce ai încercat să identifici o eroare, cel mai bun rezultat a fost „nu se reproduce”, „funcționează pe mașina mea”, „nu are sens”, „vom verifica din nou dacă se întâmplă din nou”?Fiecare dezvoltator a trebuit la un moment dat să înțeleagă de ce aplicația la care lucra nu se comporta conform așteptărilor. Indiferent de natura aplicației, există câțiva pași pe care ar trebui să-i urmezi.

De unde să începi?

Asigură-te că înțelegi pe deplin problema. Dacă este un subiect nou pentru tine, acordă-ți timp să te familiarizezi cu condițiile și circumstanțele care ar putea declanșa comportamentul respectiv. Dacă nu ești conștient de acestea, șansele de succes sunt deja mici. Nu te grăbi să te arunci direct în cod; cele mai comune erori provin din greșeli de dezvoltare. Dacă nu poți găsi sursa, s-ar putea să fii tentat să renunți din cauza presiunii sau frustrării. Dacă ar fi deschisă o investigație a cauzei principale, probabil ar fi o problemă mai profundă.

Colectează informații

Îmi amintesc că am avut o problemă cu unele inserări în masă care eșuau din cauza unei modificări a schemei. Era frustrant deoarece necesita multă muncă manuală pentru a corecta datele corupte. Am încercat să adăugăm loguri suplimentare și să izolăm operația într-o tranzacție cu prioritate mare. Totuși, nimic nu părea să funcționeze sau să ne ofere vreo idee despre ce se întâmpla, iar, desigur, problema nu putea fi reprodusă local.
Planul nostru de mentenanță care făcea backup la jurnalele de tranzacții ale bazei de date pentru a activa și dezactiva CDC-ul la fiecare oră bloca tabela de logare a sistemului pentru a recrea utilizatorul, ceea ce a dus la o modificare a schemei. Am reușit să punem cap la cap evenimentele doar după ce am făcut o altă investigație a unor blocaje (deadlock). Totuși, am învățat o lecție importantă: Încearcă să obții cât mai multe informații despre circumstanțele incidentului, chiar dacă par nesemnificative. Informațiile pot include pași de reproducere, loguri, ora și data, valori ale resurselor, intrări/etichete în bazele de date, activitate în sau în afacerea aplicației și, desigur, codul.

Ține-ți ochii deschiși pentru orice activitate în timpul incidentului, fie că este vorba de un utilizator sau alte procese care rulează; intercalarea firelor de execuție este frecventă și greu de diagnosticat.

Clasifică informațiile

Acum că ai o grămadă de informații despre tot ce s-a întâmplat, trebuie să filtrezi datele; unele piese s-ar putea să nu fie parte din puzzle-ul tău, nu încerca încă să formulezi o ipoteză. În timp ce evaluezi înregistrările, trebuie să-ți categorisești informațiile în grupuri: circumstanțiale, documentare, demonstrative, nesigure și dovezi obiective. Circumstanțiale: relația evenimentelor care ar fi putut declanșa un comportament, cum ar fi pașii pentru a reproduce o problemă.
Acest tip nu trebuie luat de bun, deoarece se bazează pe experiența individuală (Un utilizator spune că a dat click pe un buton și aplicația s-a blocat, dar a fost butonul?). Totuși, nu o ignora! (Un utilizator a dat click pe un buton care a început un proces ce a dus la un deadlock undeva, iar aplicația s-a blocat). Documentare: informații care sunt înregistrate într-un fel: loguri, urme, monitorizarea activității. Acestea îți vor oferi o mai bună înțelegere a fluxului de evenimente, pe baza căruia poți deduce alte acțiuni declanșate. Demonstrative: dovezi care ajută la susținerea contextului altor dovezi: grafice cu înregistrări CPU/memorie (poți suspecta o excepție de tip out-of-memory).

Nesigure: informații care se pot schimba în timp, cum ar fi o intrare în baza de date actualizată între eveniment și momentul investigației. Unul dintre capcanele în care poți cădea este să îți bazezi teoria pe informații nesigure. Cel mai probabil îți va devia căutarea. Reale: o piesă indiscutabilă de dovezi care indică sursa problemei: linia de cod, o configurare greșită.

Reunește-le

Acum că informațiile tale sunt grupate în funcție de fiabilitate, trebuie să le parcurgi de sus în jos pentru a găsi posibile scenarii care ar putea se potrivească și să digeri fiecare în parte.
Vizualizează evenimentele ca elemente individuale și notează fiecare în parte; apoi vei înțelege mai bine dependența lor atunci când le combini.

Crează o cronologie a incidentelor care au dus la un comportament specific. Pune dovezile care susțin un eveniment sub acesta pentru a crea o imagine a ceea ce s-a întâmplat.

Dacă problema prezintă un comportament repetitiv, reconstruiește și alte ocazii pentru a vedea dacă poți identifica un pattern între scenarii.

Încearcă să o reproduci

După ce ai toate circumstanțele problemei, acum poți încerca să o reproduci. Asigură-te că replici mediul cu cât mai multă acuratețe posibilă. Dacă lucrezi cu o mulțime de date, nu fi leneș și investighează un element specific care poate cauza probleme; s-ar putea să fie o problemă în grup, nu în individ.
Urmărește codul pas cu pas, chiar dacă ai o idee despre ce se întâmplă. Uneori setările implicite te pot înșela.

Dacă tot nu ai o viziune clară, nu ezita să introduci loguri suplimentare și să revii la investigație după ce ai informații suplimentare.

Este în regulă să ceri ajutor.

Dacă te-ai chinuit zile întregi să înțelegi și nu ai reușit, încearcă să te adresezi colegilor tăi; uneori, o pereche de ochi proaspeți sau unul mai experimentat te poate ajuta.
Colaborarea este cheia pentru rezolvarea problemelor!

Anti-patterns pentru investigații

Geronimo: încearcă să îți ții pașii și faptele organizate; o dată ce găsești o piesă a puzzle-ului pe care crezi că este cheia, nu pune toate pariurile pe ea; păstrează-ți linia de gândire și investighează până la capăt. În caz contrar, s-ar putea să ajungi la concluzii greșite.
Mad chicken: nu alerga în jur încercând să extragi informații din toate colțurile, chiar dacă nu sunt legate, doar pentru că îți lipsește o dovadă solidă; concluziile tale ar putea să devieze complet.

Peacock: folosește-ți logica, nu formula o teorie înainte de a începe bazându-te doar pe experiența ta sau auzite. În caz contrar, vei vedea doar dovezile care susțin opinia ta, ignorând alte urme clare.

Sloth: chiar dacă ia mai mult timp, nu presupune nimic; verifică totul cu ochii tăi; s-ar putea să treci pe lângă vinovat.

Passer: asumă-ți investigația, nu o arunca altcuiva doar pentru că nu ai reușit să o rezolvi; nu trebuie să fie ușor; dacă ar fi fost, ar fi fost deja rezolvat.

Denier: nu presupune că o anumită funcționalitate este garantată; fiecare eveniment este un suspect potențial, chiar dacă este vorba de un terț.

Dar el știa!

Ai întâlnit vreodată pe cineva care simțea mirosul fumului și îți spunea de unde vine? Cu experiența vine și instinctul; prin finalizarea mai multor astfel de investigații, înveți să filtrezi informațiile mai bine și să ajungi direct la sursă.
Da, parcurgerea tuturor pașilor descriși poate fi consumatoare de timp, dar pe măsură ce exersezi acest tipar de gândire, vei ajunge să ajungi la o eficiență și va deveni o a doua natură. Cu suficientă practică, vei începe să realizezi acest lucru în mintea ta. Până atunci, fii meticulos și neobosit.

Comments (0)
Join the discussion
Read them all
 

Comment

Hide Comments
Back

This is a unique website which will require a more modern browser to work!

Please upgrade today!

Share