{"id":8684,"date":"2021-07-16T15:22:00","date_gmt":"2021-07-16T12:22:00","guid":{"rendered":"https:\/\/programmingpool.com\/the-devil-is-in-the-details-how-to-find-it\/"},"modified":"2026-04-16T16:23:58","modified_gmt":"2026-04-16T13:23:58","slug":"the-devil-is-in-the-details-how-to-find-it","status":"publish","type":"post","link":"https:\/\/programmingpool.com\/ro\/the-devil-is-in-the-details-how-to-find-it\/","title":{"rendered":"Diavolul este \u00een detalii \u2013 cum s\u0103-l g\u0103se\u0219ti"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"8684\" class=\"elementor elementor-8684 elementor-7201\" data-elementor-settings=\"{&quot;page_masthead_image_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:900,&quot;sizes&quot;:[]},&quot;page_masthead_image_height_tablet&quot;:{&quot;unit&quot;:&quot;vh&quot;,&quot;size&quot;:70,&quot;sizes&quot;:[]},&quot;page_masthead_image_height_mobile&quot;:{&quot;unit&quot;:&quot;vh&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;page_masthead_background_position_x&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;page_masthead_background_position_x_tablet&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;page_masthead_background_position_x_mobile&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;page_masthead_background_position_y&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;page_masthead_background_position_y_tablet&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;page_masthead_background_position_y_mobile&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;rhye_hide_title_disabled&quot;:&quot;yes&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c9f895b e-con-full pb-medium e-flex e-con e-parent\" data-id=\"c9f895b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d9311db elementor-widget elementor-widget-rhye-widget-content-block\" data-id=\"d9311db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"rhye-widget-content-block.default\">\n\t\t\t\t\t\n\t\t<div class=\"section section-content clearfix  \" data-arts-os-animation=\"true\">\n\t\t\t\t\t\t<div class=\"section-content__inner\">\n\t\t\t\t\t\t\t\t\t<div class=\"section-content__wrapper-heading\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"section-content__heading split-text js-split-text mb-1\" data-split-text-type=\"lines,words\" data-split-text-set=\"words\"><h2>Ai fost vreodat\u0103 \u00een situa\u021bia \u00een care, dup\u0103 ce ai \u00eencercat s\u0103 identifici un bug, cel mai bun rezultat a fost: \u201enu se reproduce\u201d, \u201emerge pe ma\u0219ina mea\u201d, \u201enu are sens\u201d sau \u201evom verifica \u00eenc\u0103 o dat\u0103 dac\u0103 se \u00eent\u00e2mpl\u0103 din nou\u201d?<\/h2><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"section-content__wrapper-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"w-100\"><\/div>\n\t\t\t\t\t\t\t<div class=\"section-content__text split-text js-split-text\" data-split-text-type=\"lines\" data-split-text-set=\"lines\"><p>Fiecare dezvoltator a trebuit, la un moment dat, s\u0103 descifreze de ce aplica\u021bia la care lucra nu se comporta a\u0219a cum se a\u0219tepta. Indiferent de natura aplica\u021biei, exist\u0103 c\u00e2\u021biva pa\u0219i pe care ar trebui s\u0103-i urmezi. <\/p><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-22f8013 elementor-widget elementor-widget-rhye-widget-content-block\" data-id=\"22f8013\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"rhye-widget-content-block.default\">\n\t\t\t\t\t\n\t\t<div class=\"section section-content clearfix  \" data-arts-os-animation=\"true\">\n\t\t\t\t\t\t<div class=\"section-content__inner\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"section-content__wrapper-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"w-100\"><\/div>\n\t\t\t\t\t\t\t<div class=\"section-content__text split-text js-split-text\" data-split-text-type=\"lines\" data-split-text-set=\"lines\"><h3>De unde s\u0103 \u00eencepi?<\/h3><p>Asigur\u0103-te c\u0103 \u00een\u021belegi pe deplin problema. Dac\u0103 este un subiect nou pentru tine, acord\u0103-\u021bi timp s\u0103 te familiarizezi cu prerechizitele \u0219i condi\u021biile de baz\u0103 care ar putea declan\u0219a comportamentul respectiv. Dac\u0103 nu e\u0219ti atent la ele, \u0219ansele tale de succes sunt deja mici. Nu te arunca direct \u00een cod; cele mai comune bug-uri provin din gre\u0219eli de dezvoltare. Dac\u0103 nu po\u021bi g\u0103si sursa, s-ar putea s\u0103 fii tentat s\u0103 renun\u021bi din cauza grabei sau a frustr\u0103rii. Dac\u0103 s-ar deschide o investiga\u021bie asupra cauzei principale a problemei, cel mai probabil ar fi o problem\u0103 mai profund\u0103.     <\/p><h3>Colecteaz\u0103 informa\u021bii<\/h3><p>\u00cemi amintesc o dat\u0103 c\u0103 am avut o problem\u0103 cu ni\u0219te inser\u0103ri \u00een bloc care e\u0219uau din cauza unei schimb\u0103ri \u00een schem\u0103. A fost frustrant pentru c\u0103 a necesitat mult\u0103 munc\u0103 manual\u0103 pentru a corecta datele corupte. Am \u00eencercat s\u0103 ad\u0103ug\u0103m logare suplimentar\u0103 \u0219i s\u0103 izol\u0103m opera\u021biunea \u00eentr-o tranzac\u021bie cu prioritate ridicat\u0103. Totu\u0219i, nimic nu p\u0103rea s\u0103 func\u021bioneze sau s\u0103 ne ofere vreo idee despre ce se \u00eent\u00e2mpla, \u0219i, desigur, problema nu putea fi reprodus\u0103 local.   <\/p><p>Planul nostru de mentenan\u021b\u0103, care f\u0103cea backup la jurnalele de tranzac\u021bii ale bazei de date pentru a activa \u0219i dezactiva CDC-ul pe baza de date la fiecare or\u0103, a blocat tabelul de logare al sistemului pentru a recrea utilizatorul s\u0103u, ceea ce a dus la o schimbare de schem\u0103. Am reu\u0219it s\u0103 leg\u0103m evenimentele abia dup\u0103 ce am f\u0103cut o alt\u0103 investiga\u021bie asupra unor deadlock-uri. Totu\u0219i, am \u00eenv\u0103\u021bat cu siguran\u021b\u0103 o lec\u021bie important\u0103: \u00eencearc\u0103 s\u0103 g\u0103se\u0219ti c\u00e2t mai multe informa\u021bii despre circumstan\u021bele incidentului, chiar dac\u0103 par nesemnificative. Informa\u021biile poten\u021biale includ pa\u0219i pentru a reproduce problema, loguri, data \u0219i ora, valorile resurselor, intr\u0103rile\/flag-urile din baza de date, activitatea din interiorul sau exteriorul aplica\u021biei \u0219i, desigur, codul.   <\/p><p>P\u0103streaz\u0103 \u00eentotdeauna aten\u021bia asupra oric\u0103rei activit\u0103\u021bi care are loc \u00een timpul incidentului, fie c\u0103 este vorba de un utilizator sau de alte procese care ruleaz\u0103; intercalarea thread-urilor este frecvent\u0103 \u0219i dificil de diagnosticat.<\/p><h3>Clasific\u0103 informa\u021biile tale.<\/h3><p>Acum c\u0103 ai o mul\u021bime de informa\u021bii despre tot ce s-a \u00eent\u00e2mplat, trebuie s\u0103 filtrezi datele; unele elemente s-ar putea s\u0103 nu fac\u0103 parte din puzzle-ul t\u0103u, a\u0219a c\u0103 nu \u00eencerca s\u0103 formulezi o ipotez\u0103 \u00eenc\u0103. \u00cen timp ce evaluezi \u00eenregistr\u0103rile, trebuie s\u0103-\u021bi categorizezi informa\u021biile \u00een grupuri: circumstan\u021biale, documentare, demonstrative, nesigure \u0219i dovezi obiective.<br>Circumstan\u021biale: rela\u021bia dintre evenimente care ar fi putut declan\u0219a un comportament, cum ar fi pa\u0219ii necesari pentru a reproduce o problem\u0103.  <\/p><p>Acest tip de informa\u021bie nu ar trebui luat de-a gata, deoarece se bazeaz\u0103 pe experien\u021ba individual\u0103 (un utilizator spune c\u0103 a ap\u0103sat un buton \u0219i aplica\u021bia a c\u0103zut \u2013 chiar butonul a fost cauza?). Totu\u0219i, nu o ignora! (Un utilizator a ap\u0103sat un buton care a declan\u0219at un proces ce a intrat \u00een deadlock undeva, iar aplica\u021bia a c\u0103zut).<br>Documentare: informa\u021bii \u00eenregistrate \u00eentr-un fel: loguri, urme (traces), monitorizarea activit\u0103\u021bii. Acestea ofer\u0103 o mai bun\u0103 perspectiv\u0103 asupra fluxului evenimentului, pe baza c\u0103ruia po\u021bi deduce alte ac\u021biuni declan\u0219ate.<br>Demonstrativ: dovezi care ajut\u0103 la sus\u021binerea contextului altor dovezi: grafice cu \u00eenregistr\u0103ri CPU\/memorie (po\u021bi suspecta, de exemplu, o excep\u021bie de tip out-of-memory).     <\/p><p>Nesigur\u0103 (Unreliable): informa\u021bii care se pot schimba \u00een timp, cum ar fi o intrare \u00een baza de date actualizat\u0103 \u00eentre momentul evenimentului \u0219i cel al investiga\u021biei. Una dintre capcanele \u00een care po\u021bi c\u0103dea este s\u0103-\u021bi bazezi teoria pe informa\u021bii nesigure. Cel mai probabil, acest lucru te va abate de la drumul corect.<br>Obiectiv\u0103 (Real): o dovad\u0103 incontestabil\u0103 care indic\u0103 sursa problemei: o linie de cod, o configurare gre\u0219it\u0103.   <\/p><h3>Asambleaz\u0103 piesele<\/h3><p>Informa\u021biile tale sunt acum grupate pe baza fiabilit\u0103\u021bii; trebuie s\u0103 le parcurgi de sus \u00een jos pentru a identifica scenariile posibile care s-ar potrivi \u0219i s\u0103 le analizezi pe fiecare.<\/p><p>Imagineaz\u0103-\u021bi evenimentele ca elemente individuale \u0219i noteaz\u0103 fiecare; astfel, vei \u00een\u021belege mai bine dependen\u021bele dintre ele atunci c\u00e2nd le vei combina.<\/p><p>Creeaz\u0103 o cronologie a incidentelor care au dus la un anumit comportament. Plaseaz\u0103 dovada care sus\u021bine un eveniment sub acesta pentru a crea o imagine clar\u0103 a ceea ce s-a \u00eent\u00e2mplat. <\/p><p>Dac\u0103 problema se manifest\u0103 \u00een mod repetitiv, reconstruie\u0219te \u0219i celelalte apari\u021bii pentru a vedea dac\u0103 po\u021bi identifica un tipar \u00eentre scenarii.<\/p><h3>\u00cencearc\u0103 s\u0103-l reproduci<\/h3><p>Dup\u0103 ce ai toate circumstan\u021bele problemei, po\u021bi \u00eencerca s\u0103 o reproduci. Asigur\u0103-te c\u0103 recreezi mediul c\u00e2t mai exact posibil. Dac\u0103 lucrezi cu un volum mare de date, nu fi lene\u0219 \u0219i investigheaz\u0103 elementul specific care cauzeaz\u0103 probleme; problema ar putea fi \u00een grup, nu la nivel individual.  <\/p><p>Parcurge codul linie cu linie, chiar dac\u0103 ai o idee despre ce se \u00eent\u00e2mpl\u0103. Uneori, set\u0103rile implicite te pot p\u0103c\u0103li. <\/p><p>Dac\u0103 \u00eenc\u0103 nu ai o imagine clar\u0103, nu te teme s\u0103 adaugi mai mult\u0103 logare \u0219i s\u0103 revizuie\u0219ti investiga\u021bia dup\u0103 ce ob\u021bii informa\u021bii suplimentare.<\/p><h3>Este \u00een regul\u0103 s\u0103 ceri ajutor.<\/h3><p>Dac\u0103 te-ai chinuit zile \u00eentregi s\u0103 rezolvi problema f\u0103r\u0103 succes, \u00eencearc\u0103 s\u0103 ceri ajutor colegilor; uneori, o pereche de ochi proasp\u0103t\u0103 sau mai experimentat\u0103 poate fi de mare ajutor.<\/p><p>Colaborarea este cheia rezolv\u0103rii problemelor!<\/p><h3>Anti-modele pentru investiga\u021bii<\/h3><p>Geronimo: \u00eencearc\u0103 s\u0103-\u021bi \u021bii pa\u0219ii \u0219i faptele organizate; odat\u0103 ce g\u0103se\u0219ti o pies\u0103 a puzzle-ului despre care crezi c\u0103 este cheia problemei, nu paria totul pe ea; p\u0103streaz\u0103-\u021bi firul logic \u0219i investigheaz\u0103 p\u00e2n\u0103 la cap\u0103t. Altfel, s-ar putea s\u0103 ajungi la o concluzie gre\u0219it\u0103. <\/p><p>G\u0103ina nebun\u0103: nu alerga \u00een toate direc\u021biile \u00eencerc\u00e2nd s\u0103 aduni informa\u021bii de peste tot, chiar dac\u0103 sunt irelevante, doar pentru c\u0103 nu ai dovezi solide; concluziile tale s-ar putea s\u0103 devieze complet de la adev\u0103r.<\/p><p>P\u0103un: folose\u0219te-\u021bi logica, nu formula o teorie \u00eenainte s\u0103 \u00eencepi, baz\u00e2ndu-te doar pe experien\u021ba ta sau pe zvonuri. Altfel, ai putea vedea doar dovezile care sus\u021bin opinia ta, ignor\u00e2nd alte piste clare. <\/p><p>Lene\u0219ul: chiar dac\u0103 dureaz\u0103 mai mult, nu presupune nimic; verific\u0103 totul cu ochii t\u0103i; altfel, s-ar putea s\u0103 ratezi adev\u0103ratul vinovat.<\/p><p>Pas\u0103rea c\u00e2nt\u0103toare: asum\u0103-\u021bi investiga\u021bia, nu o da altcuiva doar pentru c\u0103 nu ai reu\u0219it s\u0103 o rezolvi; nu este menit\u0103 s\u0103 fie u\u0219oar\u0103; dac\u0103 ar fi, ar fi fost deja rezolvat\u0103.<\/p><p>Negatorul: nu continua presupun\u00e2nd c\u0103 o anumit\u0103 func\u021bionalitate func\u021bioneaz\u0103 corect; fiecare eveniment este un suspect poten\u021bial, chiar dac\u0103 provine de la un ter\u021b.<\/p><h3>Dar el pur \u0219i simplu \u0219tia!<\/h3><p>Ai \u00eent\u00e2lnit vreodat\u0103 pe cineva care putea \u201esim\u021bi fumul\u201d \u0219i s\u0103-\u021bi spun\u0103 de unde vine? Odat\u0103 cu experien\u021ba vine instinctul; finaliz\u00e2nd mai multe astfel de investiga\u021bii, \u00eenve\u021bi s\u0103 filtrezi mai bine informa\u021biile \u0219i s\u0103 ajungi direct la surs\u0103. <\/p><p>Da, parcurgerea tuturor pa\u0219ilor descri\u0219i poate fi consumatoare de timp, dar pe m\u0103sur\u0103 ce exersezi acest tipar de g\u00e2ndire, vei ajunge la un nivel de competen\u021b\u0103, iar acesta va deveni reflex. Cu suficient\u0103 practic\u0103, vei \u00eencepe s\u0103 faci asta mental. P\u00e2n\u0103 atunci, fii meticulos \u0219i neobosit.  <\/p><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Ai fost vreodat\u0103 \u00een situa\u021bia \u00een care, dup\u0103 ce ai \u00eencercat s\u0103 identifici un bug, cel mai bun rezultat a fost: \u201enu se reproduce\u201d, \u201emerge pe ma\u0219ina mea\u201d, \u201enu are sens\u201d sau \u201evom verifica \u00eenc\u0103 o dat\u0103 dac\u0103 se \u00eent\u00e2mpl\u0103 din nou\u201d? Fiecare dezvoltator a trebuit, la un moment dat, s\u0103 descifreze de ce aplica\u021bia [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":8685,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[136,229,234],"tags":[346,304,347],"class_list":["post-8684","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-perspective","category-resurse","category-training","tag-bug-identification","tag-qa-2","tag-root-cause"],"acf":[],"_links":{"self":[{"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/posts\/8684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/comments?post=8684"}],"version-history":[{"count":10,"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/posts\/8684\/revisions"}],"predecessor-version":[{"id":10544,"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/posts\/8684\/revisions\/10544"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/media\/8685"}],"wp:attachment":[{"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/media?parent=8684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/categories?post=8684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programmingpool.com\/ro\/wp-json\/wp\/v2\/tags?post=8684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}