{"id":32848,"date":"2019-10-31T21:49:16","date_gmt":"2019-10-31T18:49:16","guid":{"rendered":"https:\/\/prohoster.info\/blog\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\/"},"modified":"2019-10-31T21:49:16","modified_gmt":"2019-10-31T18:49:16","slug":"vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","title":{"rendered":"Inkuadro analiz\u00ebn statike n\u00eb proces, dhe mos k\u00ebrko defekte me t\u00eb","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Artikulli u shkrua nga nj\u00eb num\u00ebr i madh materialesh mbi analiz\u00ebn statike q\u00eb po shkonte gjithnj\u00eb e m\u00eb shum\u00eb n\u00eb sy. N\u00eb radh\u00eb t\u00eb par\u00eb, ky \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/\">blogu PVS-studio<\/a><\/noindex>, i cili promovon vetveten aktivisht n\u00eb Habr\u00eb me ndihm\u00ebn e analizave t\u00eb gabimeve q\u00eb jan\u00eb gjetur nga mjeti i tyre n\u00eb projekte me kod t\u00eb hapur. S\u00eb fundmi, PVS-studio kan\u00eb realizuar <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/436496\/\">mbaSupport of Java<\/a><\/noindex>, dhe, sigurisht, zhvilluesit e IntelliJ IDEA, i cili ndoshta ka analizuesin m\u00eb t\u00eb avancuar p\u00ebr Java sot, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/JetBrains\/blog\/436278\/\">nuk mund t\u00eb mbeten anash.<\/a><\/noindex>. <\/p>\n<p>Kur lexojm\u00eb analiza t\u00eb tilla, ndjejm\u00eb se po flitet p\u00ebr nj\u00eb eliksir magjik: shtypni butonin dhe ja, lista e defekteve \u00ebsht\u00eb para syve tan\u00eb. Duket se me p\u00ebrmir\u00ebsimin e analizator\u00ebve, do t\u00eb gjenden gjithnj\u00eb e m\u00eb shum\u00eb gabime automatikisht, dhe produktet q\u00eb jan\u00eb skanuar nga k\u00ebta robota do t\u00eb b\u00ebhen gjithnj\u00eb e m\u00eb t\u00eb mira, pa ndonj\u00eb p\u00ebrpjekje nga ana jon\u00eb.<\/p>\n<p>Por eliksir\u00ebt magjik\u00eb nuk ekzistojn\u00eb. Do doja t\u00eb flisja p\u00ebr at\u00eb q\u00eb zakonisht nuk diskutohet n\u00eb postime t\u00eb tilla si \"ja \u00e7far\u00eb mund t\u00eb gjej\u00eb roboti yn\u00eb\": \u00e7far\u00eb nuk mund t\u00eb b\u00ebjn\u00eb analizator\u00ebt, cili \u00ebsht\u00eb roli dhe vendi i tyre real n\u00eb procesin e dor\u00ebzimit t\u00eb softuerit dhe si t'i implementojm\u00eb ato si\u00e7 duhet.<\/p>\n<p><img decoding=\"async\" alt=\"Inkuadro analiz\u00ebn statike n\u00eb proces, dhe mos k\u00ebrko defekte me t\u00eb\" src=\"\/wp-content\/uploads\/2019\/05\/2a0339f10edcaed3310676ab6e2f975a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Frenues (burimi: <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D1%80%D0%B0%D0%BF%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC#\/media\/File:Sperrklinke_Schema.svg\">wikipedia<\/a><\/noindex>).<\/i><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Cil\u00ebsit\u00eb q\u00eb kurr\u00eb nuk do t'i arrijn\u00eb analizator\u00ebt statik\u00eb.<\/h2>\n<p>\n\u00c7far\u00eb \u00ebsht\u00eb, nga nj\u00eb pik\u00ebpamje praktike, analiza e kodit burimor? Ne jemi duke d\u00ebrguar disa burime n\u00eb hyrje, dhe n\u00eb dalje, n\u00eb nj\u00eb koh\u00eb t\u00eb shkurt\u00ebr (ndoshta shum\u00eb m\u00eb t\u00eb shkurt\u00ebr se ajo e testimeve) marrim disa informacione mbi sistemin ton\u00eb. Kufizimi themelor dhe matematikisht i pakap\u00ebrcyesh\u00ebm \u00ebsht\u00eb se \u00e7far\u00eb mund t\u00eb marrim n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb \u00ebsht\u00eb vet\u00ebm nj\u00eb klas\u00eb mjaft e ngusht\u00eb informacioni.<\/p>\n<p>Shembulli m\u00eb i njohur i nj\u00eb problemi q\u00eb nuk mund t\u00eb zgjidhet me an\u00eb t\u00eb analiz\u00ebs statike \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">problemi i ndaljes:<\/a><\/noindex>kjo \u00ebsht\u00eb nj\u00eb teorem\u00eb q\u00eb provon se \u00ebsht\u00eb e pamundur t\u00eb zhvillohet nj\u00eb algorit\u00ebm universal q\u00eb do t\u00eb p\u00ebrcaktonte, nga kodi burimor i nj\u00eb programi, n\u00ebse do t\u00eb bjer\u00eb n\u00eb cik\u00ebl apo do t\u00eb p\u00ebrfundoj\u00eb n\u00eb nj\u00eb koh\u00eb t\u00eb p\u00ebrcaktuar. Nj\u00eb zgjerim i k\u00ebsaj teoreme \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rice%27s_theorem\">teorema e Rajsit.<\/a><\/noindex>, e cila, p\u00ebr \u00e7do pron\u00eb jo triviale t\u00eb funksioneve t\u00eb llogaritshme, p\u00ebrcaktimi n\u00ebse nj\u00eb program i caktuar llogarit nj\u00eb funksion me nj\u00eb pron\u00eb t\u00eb till\u00eb \u00ebsht\u00eb nj\u00eb detyr\u00eb algoritmikisht e paqart\u00eb. P\u00ebr shembull, \u00ebsht\u00eb e pamundur t\u00eb shkruhet nj\u00eb analizues q\u00eb, p\u00ebr \u00e7do kod burimi, p\u00ebrcakton n\u00ebse programi i analizuar \u00ebsht\u00eb nj\u00eb implementim i nj\u00eb algoritmi q\u00eb llogarit, le t\u00eb themi, katrorin e nj\u00eb numri t\u00eb plot\u00eb.<\/p>\n<p>Prandaj, funksionaliteti i analizuesve statik\u00eb ka kufij t\u00eb paevituesh\u00ebm. Nj\u00eb analizues statik kurr\u00eb nuk do t\u00eb mund t\u00eb p\u00ebrcaktoj\u00eb n\u00eb t\u00eb gjitha rastet gj\u00ebra t\u00eb tilla si, p\u00ebr shembull, ndodhia e \u2018null pointer exception\u2019 n\u00eb gjuh\u00ebt q\u00eb lejojn\u00eb vler\u00ebn null, ose n\u00eb t\u00eb gjitha rastet t\u00eb p\u00ebrcaktoj\u00eb ndodhin\u00eb e \u2018attribute not found\u2019 n\u00eb gjuh\u00ebt me tipizim dinamik. Gjith\u00e7ka q\u00eb mund t\u00eb b\u00ebj\u00eb nj\u00eb analizues statik i p\u00ebrsosur \u00ebsht\u00eb t\u00eb p\u00ebrzgjedh\u00eb raste t\u00eb ve\u00e7anta, numri i t\u00eb cilave mes t\u00eb gjitha problemeve t\u00eb mundshme me kodin tuaj \u00ebsht\u00eb, pa e ekzagjeruar, nj\u00eb pik\u00eb n\u00eb det.<\/p>\n<h2>Analiza statike nuk \u00ebsht\u00eb k\u00ebrkimi i defekteve<\/h2>\n<p>\nNga e gjitha q\u00eb u p\u00ebrmend m\u00eb sip\u00ebr, del n\u00eb p\u00ebrfundim se analiza statike nuk \u00ebsht\u00eb nj\u00eb mjet p\u00ebr t\u00eb ulur numrin e defekteve n\u00eb program. Kam guximin t\u00eb them se, kur aplikohet p\u00ebr her\u00eb t\u00eb par\u00eb n\u00eb projektin tuaj, ajo do t\u00eb gjej\u00eb \u2018vende interesante\u2019 n\u00eb kod, por me shum\u00eb t\u00eb ngjar\u00eb nuk do t\u00eb identifikoj\u00eb asnj\u00eb defekt q\u00eb ndikojn\u00eb n\u00eb cil\u00ebsin\u00eb e funksionimit t\u00eb programit tuaj.<\/p>\n<p>Shembujt e defekteve, t\u00eb gjetura automatikisht nga analizuesit, jan\u00eb t\u00eb jasht\u00ebzakonsh\u00ebm, por nuk duhet harruar se k\u00ebto shembuj jan\u00eb gjetur p\u00ebrmes skanimit t\u00eb nj\u00eb numri t\u00eb madh kodesh t\u00eb m\u00ebdha. N\u00eb t\u00eb nj\u00ebjt\u00ebn m\u00ebnyr\u00eb, haker\u00ebt q\u00eb kan\u00eb mund\u00ebsin\u00eb t\u00eb provojn\u00eb disa fjal\u00ebkalime t\u00eb thjeshta n\u00eb nj\u00eb num\u00ebr t\u00eb madh llogarish, p\u00ebrfundimisht gjejn\u00eb ato llogari ku ka nj\u00eb fjal\u00ebkalim t\u00eb thjesht\u00eb.<\/p>\n<p>A do t\u00eb thot\u00eb kjo se analiza statike nuk duhet aplikuar? Sigurisht jo! Dhe p\u00ebr t\u00eb nj\u00ebjt\u00ebn arsye p\u00ebr t\u00eb cil\u00ebn \u00ebsht\u00eb e arsyeshme t\u00eb kontrolloni \u00e7do fjal\u00ebkalim t\u00eb ri p\u00ebr t'u siguruar q\u00eb nuk \u00ebsht\u00eb n\u00eb list\u00ebn e ndaluar t\u00eb fjal\u00ebkalimeve \u2018t\u00eb thjeshta\u2019.<\/p>\n<h2>Analiza statike \u00ebsht\u00eb m\u00eb shum\u00eb se k\u00ebrkimi i defekteve<\/h2>\n<p>\nN\u00eb t\u00eb v\u00ebrtet\u00eb, detyrat q\u00eb jan\u00eb praktikisht t\u00eb zgjidhshme p\u00ebrmes analiz\u00ebs jan\u00eb shum\u00eb m\u00eb t\u00eb gjera. Sepse, n\u00eb t\u00ebr\u00ebsi, analiza statike \u00ebsht\u00eb \u00e7do kontroll i burimeve q\u00eb b\u00ebhet para se ato t\u00eb ekzekutohen. Ja disa gj\u00ebra q\u00eb mund t\u00eb b\u00ebhen:<\/p>\n<ul>\n<li> Kontrolli i stilit t\u00eb kodit n\u00eb nj\u00eb kuptim t\u00eb gjer\u00eb. Kjo p\u00ebrfshin si kontrollin e formatimit, ashtu edhe k\u00ebrkimin e p\u00ebrdorimit t\u00eb kornizave t\u00eb panevojshme, vendosjen e pragjeve t\u00eb metrikave si\u00e7 \u00ebsht\u00eb numri i linjave \/ kompleksiteti ciklomatik i metod\u00ebs etj. - gjith\u00e7ka q\u00eb potencialisht v\u00ebshtir\u00ebson lexueshm\u00ebrin\u00eb dhe mir\u00ebmbajtjen e kodit. N\u00eb Java, nj\u00eb mjet i till\u00eb \u00ebsht\u00eb Checkstyle, nd\u00ebrsa n\u00eb Python \u00ebsht\u00eb flake8. Programet e k\u00ebtij lloji zakonisht quhen \"linters\".<\/li>\n<li>Analiza mund t\u00eb p\u00ebrfshij\u00eb jo vet\u00ebm kodin e ekzekutuesh\u00ebm. Dosjet e burimeve, si\u00e7 jan\u00eb JSON, YAML, XML, .properties mund (dhe duhet!) t\u00eb verifikohen automatikisht p\u00ebr vlefshm\u00ebrin\u00eb. Sepse \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb k\u00ebsaj t'i dihet se ndonj\u00ebher\u00eb struktura e JSON \u00ebsht\u00eb prishur p\u00ebr shkak t\u00eb ndonj\u00eb cituar t\u00eb paarritsh\u00ebm n\u00eb nj\u00eb faz\u00eb t\u00eb hershme t\u00eb verifikimit automatik t\u00eb Pull Request sesa gjat\u00eb ekzekutimit t\u00eb testeve ose n\u00eb koh\u00ebs s\u00eb ekzekutimit? Instrumentet p\u00ebrkat\u00ebse ekzistojn\u00eb: p\u00ebr shembull, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/adrienverge\/yamllint\">YAMLlint<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zaach\/jsonlint\">JSONLint<\/a><\/noindex>.<\/li>\n<li> Kompilimi (ose parsing p\u00ebr gjuh\u00ebt e programimit dinamik) \u00ebsht\u00eb gjithashtu nj\u00eb lloj analize statike. N\u00eb p\u00ebrgjith\u00ebsi, kompilator\u00ebt jan\u00eb n\u00eb gjendje t\u00eb japin paralajm\u00ebrime q\u00eb sinjalizojn\u00eb probleme me cil\u00ebsin\u00eb e kodit burimor, dhe ato nuk duhet t\u00eb injorohen.<\/li>\n<li>Her\u00eb pas here, kompiliimi nuk \u00ebsht\u00eb vet\u00ebm kompilim i kodit ekzekutues. P\u00ebr shembull, n\u00ebse keni dokumentacion n\u00eb formatin <noindex><a rel=\"nofollow\" href=\"https:\/\/asciidoctor.org\/\">AsciiDoctor<\/a><\/noindex>, n\u00eb momentin q\u00eb po e ktheni at\u00eb n\u00eb HTML\/PDF, p\u00ebrpunuesi AsciiDoctor (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/asciidoctor\/asciidoctor-maven-plugin\">plugin Maven<\/a><\/noindex>) mund t\u00eb jap\u00eb paralajm\u00ebrime, p\u00ebr shembull, p\u00ebr lidhjet e brendshme t\u00eb prishura. Dhe kjo \u00ebsht\u00eb nj\u00eb arsye e fort\u00eb p\u00ebr t\u00eb mos pranuar nj\u00eb Pull Request me ndryshime n\u00eb dokumentacion.<\/li>\n<li>Kontrolli i ortografis\u00eb \u00ebsht\u00eb gjithashtu nj\u00eb lloj analize statike. Utility <noindex><a rel=\"nofollow\" href=\"http:\/\/aspell.net\/\">aspell<\/a><\/noindex> \u00ebsht\u00eb n\u00eb gjendje t\u00eb kontrolloj\u00eb ortografin\u00eb jo vet\u00ebm n\u00eb dokumentacion, por edhe n\u00eb kodet burimore t\u00eb programeve (komentet dhe literalet) n\u00eb gjuh\u00eb t\u00eb ndryshme programimi, duke p\u00ebrfshir\u00eb C\/C++, Java dhe Python. Nj\u00eb gabim ortografie n\u00eb nd\u00ebrfaqen e p\u00ebrdoruesit ose dokumentacionin \u00ebsht\u00eb gjithashtu nj\u00eb defekt!<\/li>\n<li>Testet e konfigurimit (p\u00ebr ato q\u00eb jan\u00eb, shihni <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KaeEjsAjV6A&amp;index=30&amp;list=PLsVTVVvrKX9tuYyCtL8mASB6IOaa-kRCA&amp;t=0s\">k\u00ebt\u00eb<\/a><\/noindex> dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=Tk_nmV-mWOA\">k\u00ebt\u00eb<\/a><\/noindex> raportet) megjithat\u00eb, q\u00eb ekzekutohen n\u00eb nj\u00eb mjedis t\u00eb ekzekutimit t\u00eb testeve modulare t\u00eb tipit pytest, n\u00eb t\u00eb v\u00ebrtet\u00eb jan\u00eb gjithashtu nj\u00eb lloj analize statike, pasi nuk ekzekutojn\u00eb kodet burimore gjat\u00eb ekzekutimit t\u00eb saj.<\/li>\n<\/ul>\n<p>\nSi\u00e7 e shohim, k\u00ebrkimi i defekteve n\u00eb k\u00ebt\u00eb list\u00eb merr rolin m\u00eb pak t\u00eb r\u00ebnd\u00ebsish\u00ebm, nd\u00ebrsa gjith\u00e7ka tjet\u00ebr \u00ebsht\u00eb e aksesueshme p\u00ebrmes p\u00ebrdorimit t\u00eb mjeteve open source falas.<\/p>\n<p>Cilat nga k\u00ebto lloje t\u00eb analiz\u00ebs statike duhet t\u00eb aplikoni n\u00eb projektin tuaj? Natyrisht, t\u00eb gjitha! Sa m\u00eb shum\u00eb, aq m\u00eb mir\u00eb! E r\u00ebnd\u00ebsishme \u00ebsht\u00eb ta implementoni k\u00ebt\u00eb n\u00eb m\u00ebnyr\u00eb t\u00eb sakt\u00eb, p\u00ebr \u00e7far\u00eb do t\u00eb flasim m\u00eb tej.<\/p>\n<h2>Pipa e furnizimit si nj\u00eb filtrues me shum\u00eb nivele dhe analiza statike si kaskada e saj e par\u00eb<\/h2>\n<p>\nMetafora klasike e integrimit t\u00eb vazhduesh\u00ebm \u00ebsht\u00eb nj\u00eb tubacion (pipeline) p\u00ebrmes t\u00eb cilit kalojn\u00eb ndryshimet \u2014 nga ndryshimi i kodit burimor deri te furnizimi n\u00eb production. Renditja standart e fazave t\u00eb k\u00ebtij tubacioni duket k\u00ebshtu:<\/p>\n<ol>\n<li>analiza statike<\/li>\n<li>kompilimi<\/li>\n<li>testet modulore<\/li>\n<li>testet integruese<\/li>\n<li>testet UI<\/li>\n<li>kontrolli manual<\/li>\n<\/ol>\n<p>\nNdryshimet q\u00eb nuk kalojn\u00eb faz\u00ebn N, nuk transferohen n\u00eb faz\u00ebn N+1.<\/p>\n<p>Pse pik\u00ebrisht k\u00ebshtu dhe jo ndryshe? N\u00eb at\u00eb pjes\u00eb t\u00eb tubacionit q\u00eb ka t\u00eb b\u00ebj\u00eb me testimin, testuesit njohin piramid\u00ebn e njohur t\u00eb testimit.<\/p>\n<p><img decoding=\"async\" alt=\"Inkuadro analiz\u00ebn statike n\u00eb proces, dhe mos k\u00ebrko defekte me t\u00eb\" src=\"\/wp-content\/uploads\/2019\/05\/f155307fd4c1663800843c394098ea6f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Piramida e testit. Burimi: <noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">artikulli<\/a><\/noindex> Martin Fowler.<\/i><\/p>\n<p>N\u00eb pjes\u00ebn e poshtme t\u00eb k\u00ebsaj piramide ndodhen testet q\u00eb jan\u00eb m\u00eb t\u00eb lehta p\u00ebr t'u shkruar, q\u00eb ekzekutohen m\u00eb shpejt dhe nuk kan\u00eb tendenc\u00eb p\u00ebr rrema false. Prandaj, ato duhet t\u00eb jen\u00eb m\u00eb t\u00eb shumta, duhet t\u00eb mbulojn\u00eb m\u00eb shum\u00eb kod dhe t\u00eb ekzekutohen t\u00eb parat. N\u00eb pjes\u00ebn e sip\u00ebrme t\u00eb piramid\u00ebs \u00ebsht\u00eb e kund\u00ebrta, prandaj numri i testeve integruese dhe UI duhet t\u00eb reduktohet n\u00eb minimumin e nevojsh\u00ebm. Njeriu n\u00eb k\u00ebt\u00eb zinxhir \u00ebsht\u00eb burimi m\u00eb i shtrenjt\u00eb, m\u00eb i ngadalsh\u00ebm dhe m\u00eb i pasigurt, prandaj ai ndodhet n\u00eb fund dhe kryen pun\u00ebn vet\u00ebm n\u00ebse fazat e m\u00ebparshme nuk zbulojn\u00eb asnj\u00eb defekt. Megjithat\u00eb, sipas t\u00eb nj\u00ebjtave parime nd\u00ebrtimi, tubacioni nd\u00ebrttohet edhe n\u00eb pjes\u00ebt q\u00eb nuk lidhen drejtp\u00ebrdrejt me testimin!<\/p>\n<p>Deshiroj t\u00eb propozoj nj\u00eb analogji n\u00eb form\u00ebn e nj\u00eb sistemi filtrues me shum\u00eb nivele. N\u00eb hyrje futet uj\u00eb i ndotur (ndryshime me defekte), nd\u00ebrsa n\u00eb dalje duhet t\u00eb marrim uj\u00eb t\u00eb past\u00ebr, t\u00eb gjitha ndotjet e pad\u00ebshiruara p\u00ebrjashtohen.<\/p>\n<p><img decoding=\"async\" alt=\"Inkuadro analiz\u00ebn statike n\u00eb proces, dhe mos k\u00ebrko defekte me t\u00eb\" src=\"\/wp-content\/uploads\/2019\/05\/76b5be8f13d55c16970d67e09767a045.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Filtri me shum\u00eb nivele. Burimi: <noindex><a rel=\"nofollow\" href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Milli-Q_Water_filtration_station.JPG\">Wikimedia Commons<\/a><\/noindex><\/i><\/p>\n<p>Si e dihet, filtrat e pastruar projektohen n\u00eb m\u00ebnyr\u00eb q\u00eb \u00e7do kaskad\u00eb e ardhshme t\u00eb jet\u00eb n\u00eb gjendje t\u00eb filtroj\u00eb nj\u00eb fraksion gjithnj\u00eb e m\u00eb t\u00eb vog\u00ebl t\u00eb ndotjes. N\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb, kaskadat e pastrimit m\u00eb t\u00eb r\u00ebnd\u00eb kan\u00eb nj\u00eb kapacitet m\u00eb t\u00eb madh kalimi dhe nj\u00eb kostosh m\u00eb t\u00eb ul\u00ebt. N\u00eb analogjin\u00eb ton\u00eb, kjo do t\u00eb thot\u00eb se portat e cil\u00ebsis\u00eb s\u00eb hyrjes kan\u00eb performanc\u00eb m\u00eb t\u00eb madhe, k\u00ebrkojn\u00eb m\u00eb pak p\u00ebrpjekje p\u00ebr t\u00eb funksionuar dhe jan\u00eb m\u00eb t\u00eb thjeshta p\u00ebr t'u funksionuar \u2014 dhe kjo \u00ebsht\u00eb m\u00ebnyra si jan\u00eb radhitur. Roli i analiz\u00ebs statike, e cila, si\u00e7 e kuptojm\u00eb tani, mund t\u00eb filtroj\u00eb vet\u00ebm defektet m\u00eb t\u00eb dukshme \u2014 \u00ebsht\u00eb roli i gril\u00ebs s\u00eb \"ndot\u00ebsit\" n\u00eb fillim t\u00eb kaskad\u00ebs s\u00eb filtrave.<\/p>\n<p>Analiza statike vetvetiu nuk e p\u00ebrmir\u00ebson cil\u00ebsin\u00eb e produktit p\u00ebrfundimtar, ashtu si ndot\u00ebsi nuk e b\u00ebn ujin t\u00eb pijsh\u00ebm. Megjithat\u00eb, n\u00eb lidhje me element\u00ebt e tjer\u00eb t\u00eb procesit, r\u00ebnd\u00ebsia e saj \u00ebsht\u00eb evidente. Megjith\u00ebse n\u00eb nj\u00eb filt\u00ebr me shum\u00eb kaskada, kaskadat dal\u00ebse jan\u00eb potencialisht n\u00eb gjendje t\u00eb kapin t\u00eb nj\u00ebjtat gj\u00ebra si ato hyr\u00ebse \u2014 \u00ebsht\u00eb e qart\u00eb se \u00e7far\u00eb pasojash do t\u00eb ket\u00eb p\u00ebrpjekja p\u00ebr t\u00eb vepruar vet\u00ebm me kaskadat e pastrimit t\u00eb holl\u00eb, pa kaskadat hyr\u00ebse.<\/p>\n<p>Q\u00ebllimi i ndot\u00ebsit \u00ebsht\u00eb t\u00eb shkarkoj\u00eb kaskadat e m\u00ebvonshme nga kapja e defekteve m\u00eb t\u00eb dukshme. P\u00ebr shembull, s\u00eb paku, ndihm\u00ebsit p\u00ebr kontrollin e kodit nuk duhet t\u00eb shp\u00ebrqendrohen nga kodet e formatuara keq dhe shkeljet e rregullave t\u00eb kodifikimit (si p\u00ebrshtatjet e panevojshme ose ndarjet shum\u00eb t\u00eb thella). Gabimet si NPE duhet t\u00eb kapen nga testet modulare, por n\u00ebse analiza na tregon se nj\u00eb defekt do t\u00eb ndodh\u00eb patjet\u00ebr para testit \u2014 kjo do t\u00eb p\u00ebrshpejtoj\u00eb ndjesh\u00ebm rregullimin e tij.<\/p>\n<p>Mendoj se tani \u00ebsht\u00eb e qart\u00eb pse analiza statike nuk p\u00ebrmir\u00ebson cil\u00ebsin\u00eb e produktit, n\u00ebse aplikohet episodikisht, dhe duhet t\u00eb aplikohet vazhdimisht p\u00ebr t\u00eb filtruar ndryshimet me defekte t\u00eb dukshme. Pyetja n\u00ebse p\u00ebrdorimi i nj\u00eb analizatori statik do t\u00eb p\u00ebrmir\u00ebsoj\u00eb cil\u00ebsin\u00eb e produktit tuaj, \u00ebsht\u00eb af\u00ebrsisht e barabart\u00eb me pyetjen \"a do t\u00eb p\u00ebrmir\u00ebsohet cil\u00ebsia e ujit t\u00eb pijsh\u00ebm, n\u00ebse e kalojm\u00eb at\u00eb p\u00ebrmes nj\u00eb sitari nga nj\u00eb liqen i ndotur?\"<\/p>\n<h2>Zbatimi n\u00eb projektet legacy<\/h2>\n<p>\nNj\u00eb pyetje e r\u00ebnd\u00ebsishme praktike: si ta implementojm\u00eb analiz\u00ebn statike n\u00eb procesin e integrimit t\u00eb vazhduesh\u00ebm si \"quality gate\"? N\u00eb rastin e testeve automatike, gjith\u00e7ka \u00ebsht\u00eb e qart\u00eb: ka nj\u00eb grup testesh, r\u00ebnia e cilitdo prej tyre \u00ebsht\u00eb nj\u00eb arsye e mjaftueshme p\u00ebr t\u00eb konsideruar se nd\u00ebrtimi nuk kaloi quality gate. P\u00ebpjekja p\u00ebr t\u00eb vendosur n\u00eb m\u00ebnyr\u00eb t\u00eb ngjashme gate sipas rezultateve t\u00eb analiz\u00ebs statike d\u00ebshtojn\u00eb: n\u00eb kodin legacy ka shum\u00eb paralajm\u00ebrime t\u00eb analiz\u00ebs, nuk d\u00ebshirojm\u00eb t'i injorojm\u00eb ato plot\u00ebsisht, por gjithashtu nuk \u00ebsht\u00eb e mundur t\u00eb ndalet shp\u00ebrndarja e produktit thjesht sepse ka paralajm\u00ebrime nga analizatori.<\/p>\n<p>Duke qen\u00eb se aplikohet p\u00ebr her\u00eb t\u00eb par\u00eb, n\u00eb \u00e7do projekt analizatori l\u00ebshon nj\u00eb sasi t\u00eb madhe paralajm\u00ebrimesh, shumica e t\u00eb cilave nuk kan\u00eb lidhje me funksionimin e duhur t\u00eb produktit. T\u00eb gjitha k\u00ebto v\u00ebrejtje \u00ebsht\u00eb e pamundur t'i rregullojm\u00eb menj\u00ebher\u00eb, dhe shum\u00eb prej tyre \u2014 as nuk nevojiten. N\u00eb fund t\u00eb fundit, ne e dim\u00eb se produkti yn\u00eb n\u00eb p\u00ebrgjith\u00ebsi funksionon, dhe madje edhe para se t\u00eb implementonim analiz\u00ebn statike!<\/p>\n<p>Si rezultat, shum\u00eb kufizohen n\u00eb p\u00ebrdorimin episodik t\u00eb analiz\u00ebs statike, ose e p\u00ebrdorin at\u00eb vet\u00ebm n\u00eb m\u00ebnyr\u00eb informative, kur gjat\u00eb nd\u00ebrtimit thjesht l\u00ebshohet nj\u00eb raport nga analizatori. Kjo \u00ebsht\u00eb ekuivalente me munges\u00ebn e \u00e7do analize, sepse n\u00ebse ne tashm\u00eb kemi shum\u00eb paralajm\u00ebrime, shfaqja e nj\u00eb tjet\u00ebr (sa do q\u00eb t\u00eb r\u00ebnd\u00ebsish\u00ebm) gjat\u00eb ndryshimit t\u00eb kodit kalon pa u v\u00ebn\u00eb re.<\/p>\n<p>Jan\u00eb t\u00eb njohura m\u00ebnyra t\u00eb dh\u00ebnies s\u00eb quality gates:<\/p>\n<ul>\n<li>Vendosja e nj\u00eb kufiri t\u00eb numrit t\u00eb p\u00ebrgjithsh\u00ebm t\u00eb paralajm\u00ebrimeve ose numrit t\u00eb paralajm\u00ebrimeve t\u00eb ndar\u00eb me numrin e linjave t\u00eb kodit. Kjo funksionon keq, pasi nj\u00eb gate i till\u00eb lejon lirsh\u00ebm ndryshimet me defekte t\u00eb reja, derisa kufiri i tyre t\u00eb mos tejkalohet.<\/li>\n<li>Regjistrimi, n\u00eb nj\u00eb moment t\u00eb caktuar, i t\u00eb gjitha paralajm\u00ebrimeve t\u00eb vjetra n\u00eb kod si t\u00eb injoruara, dhe ndalimi i nd\u00ebrtimit n\u00eb rast se shfaqen paralajm\u00ebrime t\u00eb reja. K\u00ebt\u00eb funksionalitet e ofron PVS-studio dhe disa burime online, p\u00ebr shembull, Codacy. Nuk kam punuar me PVS-studio, por n\u00eb p\u00ebrvoj\u00ebn time me Codacy, problemi kryesor \u00ebsht\u00eb q\u00eb p\u00ebrcaktimi se \u00e7far\u00eb \u00ebsht\u00eb \"e vjetra\", dhe \u00e7far\u00eb \"e re\" \u00ebsht\u00eb nj\u00eb algorit\u00ebm mjaft i nd\u00ebrlikuar dhe jo gjithmon\u00eb funksionon si\u00e7 duhet, ve\u00e7an\u00ebrisht n\u00ebse skedaret ndryshojn\u00eb shum\u00eb ose rinovohen. N\u00eb kujtes\u00ebn time, Codacy mund t\u00eb kalonte paralajm\u00ebrime t\u00eb reja n\u00eb nj\u00eb pull request, dhe n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb t\u00eb mos e kalonte pull request-in p\u00ebr shkak t\u00eb paralajm\u00ebrimeve q\u00eb nuk i p\u00ebrkasin ndryshimeve n\u00eb kodin e k\u00ebtij PR.<\/li>\n<li>Sipas mendimit tim, zgjidhja m\u00eb efektive \u00ebsht\u00eb ajo q\u00eb p\u00ebrshkruhet n\u00eb lib\u00ebr <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">D\u00ebrgimi i Vazhdush\u00ebm<\/a><\/noindex> \"metoda e ratchet\" (\"ratcheting\"). Ideja kryesore \u00ebsht\u00eb se nj\u00eb atribut i \u00e7do l\u00ebshimi \u00ebsht\u00eb numri i paralajm\u00ebrimeve t\u00eb analiz\u00ebs statike, dhe lejohet vet\u00ebm ndryshime t\u00eb tilla q\u00eb nuk e rrisin numrin e p\u00ebrgjithsh\u00ebm t\u00eb paralajm\u00ebrimeve.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ratchet<\/h2>\n<p>\nFunksionon k\u00ebshtu:<\/p>\n<ol>\n<li>N\u00eb faz\u00ebn fillestare, realizohet regjistrimi n\u00eb metadata p\u00ebr l\u00ebshimin e numrit t\u00eb paralajm\u00ebrimeve n\u00eb kod, t\u00eb gjetura nga analizator\u00ebt. K\u00ebshtu, gjat\u00eb nd\u00ebrtimit t\u00eb deg\u00ebs kryesore, n\u00eb menaxherin tuaj t\u00eb repositor\u00ebve regjistrohet jo thjesht \"l\u00ebshimi 7.0.2\", por \"l\u00ebshimi 7.0.2, q\u00eb p\u00ebrmban 100500 paralajm\u00ebrime Checkstyle\". N\u00ebse p\u00ebrdorni nj\u00eb menaxher repositor\u00ebsh t\u00eb avancuar (si Artifactory), ruajtja e t\u00eb tilla metadata p\u00ebr l\u00ebshimin tuaj \u00ebsht\u00eb e leht\u00eb.<\/li>\n<li>Tani \u00e7do pull request gjat\u00eb nd\u00ebrtimit krahason numrin e paralajm\u00ebrimeve q\u00eb rezultojn\u00eb me numrin q\u00eb nj\u00ebmend ekziston n\u00eb l\u00ebshimin aktual. N\u00ebse PR \u00e7on n\u00eb rritjen e k\u00ebtij numri, kodin nuk e kalon port\u00ebn e cil\u00ebsis\u00eb p\u00ebr analiz\u00ebn statike. N\u00ebse numri i paralajm\u00ebrimeve zvog\u00eblohet ose nuk ndryshon \u2014 at\u00ebher\u00eb kalon.<\/li>\n<li>N\u00eb l\u00ebshimin e ardhsh\u00ebm, numri i rip\u00ebrllogaritur i paralajm\u00ebrimeve do t\u00eb regjistrohet p\u00ebrs\u00ebri n\u00eb metadata t\u00eb l\u00ebshimit.<\/li>\n<\/ol>\n<p>\nDisa pak, por pa ndalur (sikur n\u00eb funksionimin e nj\u00eb mekanizmi z\u00ebvend\u00ebsues), numri i paralajm\u00ebrimeve do t\u00eb arrij\u00eb n\u00eb zero. Sigurisht, sistemi mund t\u00eb manipulohet duke futur nj\u00eb paralajm\u00ebrim t\u00eb ri, por duke rregulluar nj\u00eb t\u00eb huaj. Kjo \u00ebsht\u00eb e pranuar, pasi n\u00eb nj\u00eb distanc\u00eb t\u00eb gjat\u00eb jep rezultat: paralajm\u00ebrimet rregullohen, zakonisht, jo nj\u00eb p\u00ebr nj\u00eb, por t\u00eb gjith\u00eb s\u00eb bashku n\u00eb nj\u00eb grup t\u00eb caktuar, dhe paralajm\u00ebrimet q\u00eb jan\u00eb leht\u00ebsisht t\u00eb eliminueshme shpejt eliminohen.<\/p>\n<p>N\u00eb k\u00ebt\u00eb grafik \u00ebsht\u00eb treguar numri total i paralajm\u00ebrimeve Checkstyle p\u00ebr gjasht\u00eb muaj pun\u00eb t\u00eb k\u00ebtij \"mekanizmi z\u00ebvend\u00ebsues\" n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\">nj\u00eb nga projektet tona OpenSource<\/a><\/noindex>. Numri i paralajm\u00ebrimeve \u00ebsht\u00eb zvog\u00ebluar me nj\u00eb rend, dhe kjo ndodhi n\u00eb m\u00ebnyr\u00eb t\u00eb natyrshme, paralel me zhvillimin e produktit!<\/p>\n<p><img decoding=\"async\" alt=\"Inkuadro analiz\u00ebn statike n\u00eb proces, dhe mos k\u00ebrko defekte me t\u00eb\" src=\"\/wp-content\/uploads\/2019\/05\/9529bb2fb32187057088e8d2c4203333.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn\u00eb aplikoj nj\u00eb version t\u00eb modifikuar t\u00eb k\u00ebsaj metode, duke llogaritur ve\u00e7mas paralajm\u00ebrimet n\u00eb ndarje sipas moduleve t\u00eb projektit dhe mjeteve t\u00eb analiz\u00ebs, skedari YAML i krijuar me metadatat p\u00ebr nd\u00ebrtimin duket m\u00eb pak k\u00ebshtu:<\/p>\n<pre><code class=\"plaintext\">celesta-sql:\n  checkstyle: 434\n  spotbugs: 45\ncelesta-core:\n  checkstyle: 206\n  spotbugs: 13\ncelesta-maven-plugin:\n  checkstyle: 19\n  spotbugs: 0\ncelesta-unit:\n  checkstyle: 0\n  spotbugs: 0\n<\/code><\/pre>\n<p>\nN\u00eb \u00e7do sistem t\u00eb avancuar CI, mekanizmi z\u00ebvend\u00ebsues mund t\u00eb realizohet p\u00ebr \u00e7do mjet t\u00eb analiz\u00ebs statike, pa u mb\u00ebshtetur n\u00eb plugina dhe mjete t\u00eb jashtme. \u00c7do nj\u00eb nga analizator\u00ebt jep raportin e tij n\u00eb nj\u00eb format tekstual t\u00eb thjesht\u00eb ose XML, q\u00eb leht\u00eb mund t\u00eb analizohet. Mbete vet\u00ebm t\u00eb shkruash logjik\u00ebn e nevojshme n\u00eb skriptin CI. Mund t\u00eb shikosh se si \u00ebsht\u00eb realizuar n\u00eb projektet tona open source mbi baz\u00ebn e Jenkins dhe Artifactory, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/2bass\/blob\/dev\/Jenkinsfile\">k\u00ebtu<\/a><\/noindex> ose <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/dev\/Jenkinsfile\">k\u00ebtu<\/a><\/noindex>. T\u00eb dy shembujt varen nga biblioteka <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/inponomarev\/ratchetlib\">ratchetlib<\/a><\/noindex>: metoda <code>countWarnings()<\/code> num\u00ebron zakonisht etiketat xml n\u00eb skedar\u00ebt e krijuar nga Checkstyle dhe Spotbugs, dhe <code>compareWarningMaps()<\/code> realizon pik\u00ebrisht at\u00eb mekanizmin z\u00ebvend\u00ebsues, duke hedhur nj\u00eb gabim n\u00eb rast se numri i paralajm\u00ebrimeve n\u00eb ndonj\u00eb nga kategorit\u00eb rritet.<\/p>\n<p>Nj\u00eb variant interesant i implementimit t\u00eb \u00abratchet\u00bb \u00ebsht\u00eb i mundsh\u00ebm p\u00ebr analiz\u00ebn e drejtshkrimit t\u00eb komenteve, literal\u00ebve tekstual\u00eb dhe dokumentacionit duke p\u00ebrdorur aspell. Si\u00e7 dihet, gjat\u00eb kontrollit t\u00eb drejtshkrimit, jo t\u00eb gjitha fjal\u00ebt q\u00eb nuk jan\u00eb t\u00eb njohura p\u00ebr fjalorin standard jan\u00eb t\u00eb gabuara; ato mund t\u00eb shtohen n\u00eb fjalorin e p\u00ebrdoruesit. N\u00ebse e b\u00ebni fjalorin e p\u00ebrdoruesit pjes\u00eb t\u00eb kodit burimor t\u00eb projektit, at\u00ebher\u00eb cil\u00ebsia e port\u00ebs p\u00ebr drejtshkrimin mund t\u00eb formulohet k\u00ebshtu: ekzekutimi i aspell me fjalorin standard dhe at\u00eb t\u00eb p\u00ebrdoruesit. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/271dcfc8dc3ad65ac2d1dcaa39b7fd3ea8fb5891\/Jenkinsfile#L36\">nuk duhet<\/a><\/noindex> t\u00eb gjej\u00eb ndonj\u00eb gabim drejtshkrimor.<\/p>\n<h2>P\u00ebr r\u00ebnd\u00ebsin\u00eb e fiksmantit t\u00eb versionit t\u00eb analizuesit<\/h2>\n<p>\nN\u00eb p\u00ebrfundim, duhet t\u00eb theksohet se: sado q\u00eb ta implementoni analiz\u00ebn n\u00eb konvjerin tuaj t\u00eb dor\u00ebzimit, versioni i analizuesit duhet t\u00eb jet\u00eb i fikstuar. N\u00ebse lejoni nj\u00eb p\u00ebrdit\u00ebsim spontan t\u00eb analizuesit, at\u00ebher\u00eb gjat\u00eb nd\u00ebrtimit t\u00eb nj\u00eb pull request-i t\u00eb ri mund t\u00eb dalin defekte t\u00eb reja, t\u00eb cilat nuk jan\u00eb t\u00eb lidhura me ndryshimin e kodit, por me faktin se analizuesi i ri thjesht \u00ebsht\u00eb n\u00eb gjendje t\u00eb gjej\u00eb m\u00eb shum\u00eb defekte \u2014 dhe kjo do ta d\u00ebshtoj\u00eb procesin tuaj t\u00eb pranimit t\u00eb pull request-eve. P\u00ebrmir\u00ebsimi i analizuesit duhet t\u00eb jet\u00eb nj\u00eb veprim i vet\u00ebdijsh\u00ebm. Megjithat\u00eb, fiksmanti i fort\u00eb i versionit t\u00eb \u00e7do komponenti t\u00eb nd\u00ebrtimit \u00ebsht\u00eb nj\u00eb k\u00ebrkes\u00eb e nevojshme dhe nj\u00eb tem\u00eb p\u00ebr nj\u00eb bised\u00eb t\u00eb ve\u00e7ant\u00eb.<\/p>\n<h2>P\u00ebrfundimet<\/h2>\n<p><\/p>\n<ul>\n<li>Analiza statike nuk do t'ju gjej\u00eb gabit\u00eb dhe nuk do t\u00eb p\u00ebrmir\u00ebsoj\u00eb cil\u00ebsin\u00eb e produktit tuaj si rezultat i nj\u00eb aplikimi t\u00eb vet\u00ebm. Efekti pozitiv p\u00ebr cil\u00ebsin\u00eb jepet vet\u00ebm nga aplikimi i saj t\u00eb vazhduesh\u00ebm gjat\u00eb procesit t\u00eb dor\u00ebzimit.<\/li>\n<li>Gjetja e gabive nuk \u00ebsht\u00eb n\u00eb t\u00eb v\u00ebrtet\u00eb detyra kryesore e analiz\u00ebs; shumica d\u00ebrrmuese e funksioneve t\u00eb dobishme jan\u00eb t\u00eb disponueshme n\u00eb mjetet opensource.<\/li>\n<li>Implementoni cil\u00ebsit\u00eb e portave sipas rezultateve t\u00eb analiz\u00ebs statike n\u00eb faz\u00ebn e par\u00eb t\u00eb konvjerit t\u00eb dor\u00ebzimit, duke p\u00ebrdorur \u00abratchet\u00bb p\u00ebr kodin legacy.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Linket<\/h2>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">D\u00ebrgimi i Vazhdush\u00ebm<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=8Cx3LHNjI24\">A. Kudryavtsev: Analiza e programeve: si t\u00eb kuptoni se jeni nj\u00eb programues i mir\u00eb<\/a><\/noindex> nj\u00eb referat mbi metoda t\u00eb ndryshme t\u00eb analiz\u00ebs s\u00eb kodit (jo vet\u00ebm statike!)<\/li>\n<\/ol>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436868\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24622,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32848","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0412\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043d\u0435 \u0438\u0449\u0438\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0433\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:49:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:49:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Implementoni analiz\u00ebn statike n\u00eb proces, dhe mos e k\u00ebrkoni at\u00eb p\u00ebr t\u00eb gjetur gabit\u00eb | ProHoster","description":"T\u00eb shkruaj k\u00ebt\u00eb artikull m\u00eb shtyu nj\u00eb num\u00ebr i madh materialesh mbi analiz\u00ebn statike, q\u00eb po shfaqeshin gjithnj\u00eb e m\u00eb shum\u00eb.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0412\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043d\u0435 \u0438\u0449\u0438\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0433\u0438 | ProHoster","og:description":"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:49:16+00:00","article:modified_time":"2019-10-31T18:49:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32848","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 12:50:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:51:27","updated":"2026-01-21 12:50:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=32848"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32848\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/24622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=32848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=32848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=32848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}