{"id":36721,"date":"2019-10-31T22:13:20","date_gmt":"2019-10-31T19:13:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-dark-razvertyvaet-kod-za-50-ms\/"},"modified":"2019-10-31T22:13:20","modified_gmt":"2019-10-31T19:13:20","slug":"kak-dark-razvertyvaet-kod-za-50-ms","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","title":{"rendered":"Si Dark implementon kodin p\u00ebr 50 ms","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Si Dark implementon kodin p\u00ebr 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/c159a36eb52bf488f3a70ea511690366.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sa m\u00eb shpejt zhvillohet procesi i zhvillimit, aq m\u00eb shpejt rritet kompania teknologjike.<\/p>\n<p><\/p>\n<p>P\u00ebr fat t\u00eb keq, aplikacionet moderne punojn\u00eb kund\u00ebr nesh \u2014 sistemet tona duhet t\u00eb p\u00ebrdit\u00ebsohen n\u00eb koh\u00eb reale dhe n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb t\u00eb mos shqet\u00ebsojn\u00eb asnj\u00eb dhe t\u00eb mos sjellin nd\u00ebrprerje dhe pushime. Zhvillimi n\u00eb k\u00ebto sisteme b\u00ebhet nj\u00eb detyr\u00eb e v\u00ebshtir\u00eb dhe k\u00ebrkon pipeline t\u00eb komplikuara t\u00eb d\u00ebrges\u00ebs continue edhe n\u00eb ekipet e vogla.<\/p>\n<p><\/p>\n<p>K\u00ebto pipeline zakonisht kan\u00eb nj\u00eb p\u00ebrdorim t\u00eb ngusht\u00eb, punojn\u00eb ngadal\u00eb dhe nuk jan\u00eb t\u00eb besuesh\u00ebm. Zhvilluesit duhet t\u00eb krijojn\u00eb ato manualisht fillimisht dhe pastaj t'i menaxhojn\u00eb ato, dhe kompanit\u00eb shpesh pun\u00ebsojn\u00eb ekipe t\u00eb t\u00ebra DevOps p\u00ebr k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<p>Shpejt\u00ebsia e k\u00ebtyre pipeline-ve p\u00ebrcakton shpejt\u00ebsin\u00eb e zhvillimit. N\u00eb ekipet m\u00eb t\u00eb mira, zhvillimi zgjat 5\u201310 minuta, por zakonisht gjith\u00e7ka b\u00ebhet shum\u00eb m\u00eb ngadal\u00eb dhe p\u00ebr nj\u00eb zhvillim nevojiten disa or\u00eb.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>N\u00eb Dark, kjo z\u00eb 50 ms. <em>Pes\u00ebdhjet\u00eb. Milisekonda<\/em>. Dark \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">\u00ebsht\u00eb nj\u00eb zgjidhje e plot\u00eb me nj\u00eb gjuh\u00eb programimi, nj\u00eb redaktor dhe infrastruktur\u00eb<\/a><\/noindex>, e krijuar posa\u00e7\u00ebrisht p\u00ebr d\u00ebrges\u00ebn continue, dhe t\u00eb gjitha aspektet e Dark, p\u00ebrfshir\u00eb vet\u00eb gjuh\u00ebn, jan\u00eb nd\u00ebrtuar me nj\u00eb sy p\u00ebr zhvillim t\u00eb sigurt momental.<\/p>\n<p><\/p>\n<h3 id=\"pochemu-konveyery-nepreryvnoy-postavki-takie-medlennye\">Pse jan\u00eb kaq t\u00eb ngadalta pipeline-t e d\u00ebrges\u00ebs continue?<\/h3>\n<p><\/p>\n<p>Supozoni se kemi nj\u00eb aplikacion web n\u00eb Python dhe ne kemi krijuar nj\u00eb pipeline t\u00eb shk\u00eblqyer dhe modern t\u00eb d\u00ebrges\u00ebs continue. P\u00ebr nj\u00eb zhvillues q\u00eb \u00ebsht\u00eb i angazhuar n\u00eb k\u00ebt\u00eb projekt \u00e7do dit\u00eb, zhvillimi i nj\u00eb ndryshimi t\u00eb vog\u00ebl do t\u00eb dukej k\u00ebshtu:<\/p>\n<p><\/p>\n<h3 id=\"vnesenie-izmeneniy\">B\u00ebrja e ndryshimeve<\/h3>\n<p><\/p>\n<ul>\n<li>Krijimi i nj\u00eb dege t\u00eb re n\u00eb git<\/li>\n<li>B\u00ebrja e ndryshimeve p\u00ebrmes nd\u00ebrruesit t\u00eb funksionit<\/li>\n<li>Testimi modular p\u00ebr t\u00eb kontrolluar ndryshimet me dhe pa nd\u00ebrruesin e funksionit<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pul-rekvest\">K\u00ebrkesa p\u00ebr bashkim<\/h3>\n<p><\/p>\n<ul>\n<li>Komitimi i ndryshimeve<\/li>\n<li>D\u00ebrgimi i ndryshimeve n\u00eb repo t\u00eb larg\u00ebt n\u00eb github<\/li>\n<li>K\u00ebrkesa p\u00ebr bashkim<\/li>\n<li>Nd\u00ebrtimi CI kryhet automatikisht n\u00eb sfond<\/li>\n<li>Rishikimi i kodit<\/li>\n<li>Disa rishikime shtes\u00eb, n\u00ebse \u00ebsht\u00eb e nevojshme<\/li>\n<li>Bashkimi i ndryshimeve me master-in git.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"ci-vypolnyaetsya-na-mastere\">CI kryhet n\u00eb master<\/h3>\n<p><\/p>\n<ul>\n<li>Instalimi i var\u00ebsive front-end p\u00ebrmes npm<\/li>\n<li>Nd\u00ebrtimi dhe optimizimi i burimeve HTML+CSS+JS<\/li>\n<li>Ekzekutimi i testimeve modulare dhe funksionale n\u00eb front-end<\/li>\n<li>Instalimi i var\u00ebsive Python nga PyPI<\/li>\n<li>Ekzekutimi i testimeve modulare dhe funksionale n\u00eb backend<\/li>\n<li>Testimi i integrimit n\u00eb t\u00eb dy skajet<\/li>\n<li>D\u00ebrgimi i burimeve t\u00eb front-end n\u00eb CDN<\/li>\n<li>Nd\u00ebrtimi i nj\u00eb kontejneri p\u00ebr programin Python<\/li>\n<li>D\u00ebrgimi i kontejnerit n\u00eb regjist\u00ebr<\/li>\n<li>P\u00ebrdit\u00ebsimi i manifestit Kubernetes<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zamena-starogo-koda-novym\">Z\u00ebvend\u00ebsimi i kodit t\u00eb vjet\u00ebr me t\u00eb riun<\/h3>\n<p><\/p>\n<ul>\n<li>Kubernetes aktivizon disa instanca t\u00eb kontejnerit t\u00eb ri<\/li>\n<li>Kubernetes pret q\u00eb instancat t\u00eb b\u00ebhen funksionale<\/li>\n<li>Kubernetes shton instancat n\u00eb balancuesin e ngarkes\u00ebs HTTP<\/li>\n<li>Kubernetes pret derisa instancat e vjetra t\u00eb ndalen s\u00eb p\u00ebrdoruri<\/li>\n<li>Kubernetes ndalon instancat e vjetra<\/li>\n<li>Kubernetes p\u00ebrs\u00ebrit k\u00ebto operacione derisa instancat e reja t\u00eb z\u00ebvend\u00ebsojn\u00eb t\u00eb gjitha t\u00eb vjetrat<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vklyuchenie-novogo-pereklyuchatelya-funkcii\">Aktivizimi i nj\u00eb kalimi t\u00eb ri t\u00eb funksionit<\/h3>\n<p><\/p>\n<ul>\n<li>Kodi i ri aktivizohet vet\u00ebm p\u00ebr veten e tij, p\u00ebr t'u siguruar q\u00eb gjith\u00e7ka \u00ebsht\u00eb n\u00eb rregull<\/li>\n<li>Kodi i ri aktivizohet p\u00ebr 10% t\u00eb p\u00ebrdoruesve, duke monitoring-uar metrikat operuese dhe ato t\u00eb biznesit<\/li>\n<li>Kodi i ri aktivizohet p\u00ebr 50% t\u00eb p\u00ebrdoruesve, duke monitoring-uar metrikat operuese dhe ato t\u00eb biznesit<\/li>\n<li>Kodi i ri aktivizohet p\u00ebr 100% t\u00eb p\u00ebrdoruesve, duke monitoring-uar metrikat operuese dhe ato t\u00eb biznesit<\/li>\n<li>N\u00eb fund, ju p\u00ebrs\u00ebrisni t\u00eb gjith\u00eb procedur\u00ebn p\u00ebr t\u00eb hequr kodin e vjet\u00ebr dhe kalimin<\/li>\n<\/ul>\n<p><\/p>\n<p>Procesi varet nga mjetet, gjuha dhe p\u00ebrdorimi i arkitekturave t\u00eb orientuara nga sh\u00ebrbimi, por n\u00eb p\u00ebrgjith\u00ebsi duket k\u00ebshtu. Nuk i p\u00ebrmenda shp\u00ebrndarjet me migrazhimin e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, sepse p\u00ebr k\u00ebt\u00eb nevojitet planifikim i kujdessh\u00ebm, por m\u00eb posht\u00eb do t\u00eb flas si e trajton Dark k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<p>Ka shum\u00eb komponent\u00eb k\u00ebtu, dhe shumica e tyre mund t\u00eb ngadal\u00ebsojn\u00eb, t\u00eb d\u00ebshtojn\u00eb, t\u00eb shkaktojn\u00eb konkurrenc\u00eb t\u00eb p\u00ebrkohshme ose t\u00eb prishin sistemin e pun\u00ebs.<\/p>\n<p><\/p>\n<p>Dhe pasi k\u00ebto pipeline zakonisht jan\u00eb krijuar p\u00ebr raste t\u00eb ve\u00e7anta, \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb mb\u00ebshtetesh n\u00eb to. Shum\u00eb her\u00eb ka dit\u00eb kur kodi nuk mund t\u00eb shp\u00ebrndahet, sepse ka probleme n\u00eb Dockerfile, nj\u00eb nga dhjet\u00ebra sh\u00ebrbimeve ka d\u00ebshtuar, ose specialisti i nevojsh\u00ebm \u00ebsht\u00eb n\u00eb pushim.<\/p>\n<p><\/p>\n<p>M\u00eb keq akoma, shum\u00eb nga k\u00ebto hapa nuk b\u00ebjn\u00eb absolutisht asgj\u00eb t\u00eb dobishme. Ato ishin t\u00eb nevojshme m\u00eb par\u00eb, kur shp\u00ebrndanim kodin direkt p\u00ebr p\u00ebrdoruesit, por tani kemi kalime p\u00ebr kodin e ri, dhe k\u00ebto procese jan\u00eb ndar\u00eb. Si rezultat, hapi n\u00eb t\u00eb cilin shp\u00ebrndahet kodi (i vjetri z\u00ebvend\u00ebsohet me t\u00eb riun), tani \u00ebsht\u00eb thjesht nj\u00eb rrezik i panevojsh\u00ebm.<\/p>\n<p><\/p>\n<p>Sigurisht, ky \u00ebsht\u00eb nj\u00eb pipeline shum\u00eb i menduar. Ekipa q\u00eb e krijoi at\u00eb nuk kursyeu as koh\u00eb as para p\u00ebr shp\u00ebrndarjen e shpejt\u00eb. Zakonisht, pipeline-et e shp\u00ebrndarjes jan\u00eb shum\u00eb m\u00eb t\u00eb ngadalta dhe t\u00eb pasigurt.<\/p>\n<p><\/p>\n<h3 id=\"realizaciya-nepreryvnoy-postavki-v-dark\">Implementimi i shp\u00ebrndarjes s\u00eb vazhdueshme n\u00eb Dark<\/h3>\n<p><\/p>\n<p>Furnizimi i vazhduesh\u00ebm \u00ebsht\u00eb kaq i r\u00ebnd\u00ebsish\u00ebm p\u00ebr Dark, sa q\u00eb nga fillimi e kemi synuar nj\u00eb koh\u00eb m\u00eb pak se nj\u00eb sekond\u00eb. Ne kemi shqyrtuar t\u00eb gjitha hapat e pipeline-it p\u00ebr t\u00eb hequr \u00e7do t\u00eb panevojshme dhe e kemi p\u00ebrsosur at\u00eb q\u00eb mbeti. K\u00ebtu \u00ebsht\u00eb se si ne heq\u00ebm hapat.<\/p>\n<p><\/p>\n<blockquote><p>Jesse Frazelle (<noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex>) shpiku fjal\u00ebn e re deployless (pa nevoj\u00eb p\u00ebr shp\u00ebrndarje) n\u00eb konferenc\u00ebn Future of Software Development n\u00eb Reykjavik<\/p><\/blockquote>\n<p>Ne menj\u00ebher\u00eb vendos\u00ebm q\u00eb Dark do t\u00eb bazohej n\u00eb konceptin e 'deployless' (faleminderit <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jesse Frazelle<\/a><\/noindex> p\u00ebr neologjin\u00eb). Deployless do t\u00eb thot\u00eb q\u00eb cili do kod shp\u00ebrndahet menj\u00ebher\u00eb dhe \u00ebsht\u00eb gati p\u00ebr p\u00ebrdorim n\u00eb prodhim. Sigurisht, nuk do t\u00eb kalojm\u00eb as nj\u00eb kod t\u00eb d\u00ebshtuar ose t\u00eb paplot\u00eb (parimet e siguris\u00eb do t'i p\u00ebrshkruaj m\u00eb posht\u00eb).<\/p>\n<p><\/p>\n<p>Gjat\u00eb demonstrat\u00ebs s\u00eb Dark, shpesh na pyesnin se si arrit\u00ebm t\u00eb shpejtonim shp\u00ebrndarjen kaq shum\u00eb. Nj\u00eb pyetje e \u00e7uditshme. Njer\u00ebzit mendojn\u00eb se kemi shpikur nj\u00eb sup\u00ebrteknologji q\u00eb krahason kodin, e kompilon, e paket\u00ebn n\u00eb nj\u00eb konteiner, nis nj\u00eb makin\u00eb virtuale, nis konteinerit nga e ftoht\u00eb dhe gjith\u00e7ka tjet\u00ebr, p\u00ebr 50 ms. \u00cbsht\u00eb e v\u00ebshtir\u00eb ta besosh. Por ne krijuam nj\u00eb motor t\u00eb ve\u00e7ant\u00eb shp\u00ebrndarjeje, i cili nuk ka nevoj\u00eb p\u00ebr t\u00eb gjith\u00eb k\u00ebto.<\/p>\n<p><\/p>\n<p>Dark nis interpretor\u00ebt n\u00eb cloud. Supozoni se po shkruani kod n\u00eb nj\u00eb funksion ose trajtues HTTP ose ngjarjesh. Ne d\u00ebrgojm\u00eb dallimin n\u00eb pem\u00ebn sintetike abstrakte (implementimin e kodit q\u00eb p\u00ebrdor brenda editori ton\u00eb dhe server\u00ebve) n\u00eb server\u00ebt tan\u00eb, dhe m\u00eb pas e ekzekutojm\u00eb k\u00ebt\u00eb kod kur arrijn\u00eb k\u00ebrkesat. Pra, shp\u00ebrndarja duket thjesht si nj\u00eb regjistrim modest n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash \u2014 momentale dhe elementare. Shp\u00ebrndarja ndodh kaq shpejt, sepse p\u00ebrfshin minimumin e nevojsh\u00ebm.<\/p>\n<p><\/p>\n<p>N\u00eb t\u00eb ardhmen, ne kemi n\u00eb plan t\u00eb b\u00ebjm\u00eb nga Dark nj\u00eb kompilator infrastrukture q\u00eb do t\u00eb krijosh dhe nis\u00ebsh infrastruktur\u00ebn ideale p\u00ebr performanc\u00eb t\u00eb lart\u00eb dhe besueshm\u00ebri t\u00eb aplikacioneve. Shp\u00ebrndarja momentale, natyrisht, nuk do t\u00eb largohet.<\/p>\n<p><\/p>\n<h2 id=\"bezopasnoe-razvertyvanie\">Shp\u00ebrndarje e sigurt<\/h2>\n<p><\/p>\n<h3 id=\"strukturirovannyy-redaktor\">Editor i strukturuar<\/h3>\n<p><\/p>\n<p>Kodi n\u00eb Dark shkruhet n\u00eb redaktorin Dark. Editor i strukturuar nuk lejon gabime sintaksore. N\u00eb thelb, Dark nuk ka as nj\u00eb analizues. Nd\u00ebrsa ju shkruani tekstin, ne punojm\u00eb direkt me pem\u00ebn sintetike abstrakte (AST), sikurse <noindex><a rel=\"nofollow\" href=\"http:\/\/danmidwood.com\/content\/2014\/11\/21\/animated-paredit.html\">Paredit<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ravichugh.github.io\/sketch-n-sketch\/\">Sketch-n-Sketch<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/gregoor.github.io\/tofu\/\">Tofu<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/notes\/kent-beck\/prune-a-code-editor-that-is-not-a-text-editor\/1012061842160013\/\">Prune<\/a><\/noindex> dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/mps\/\">MPS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Cili do kod i pap\u00ebrfunduar n\u00eb Dark ka nj\u00eb semantik\u00eb t\u00eb pranueshme ekzekutimi, disi si <noindex><a rel=\"nofollow\" href=\"https:\/\/hazel.org\/\">holes me tipe n\u00eb Hazel<\/a><\/noindex>P\u00ebr shembull, n\u00ebse ndryshoni thirrjen e funksionit, ne ruajm\u00eb funksionin e vjet\u00ebr derisa i riu t\u00eb b\u00ebhet i p\u00ebrshtatsh\u00ebm.<\/p>\n<p><\/p>\n<p>\u00c7do program n\u00eb Dark ka kuptimin e tij, prandaj kodi i pap\u00ebrfunduar nuk pengon at\u00eb t\u00eb p\u00ebrfunduar t\u00eb punoj\u00eb.<\/p>\n<p><\/p>\n<h3 id=\"rezhimy-redaktirovaniya\">M\u00ebnyrat e redaktimit<\/h3>\n<p><\/p>\n<p>Ju shkruani kod n\u00eb Dark n\u00eb dy raste. I pari: shkruani kod t\u00eb ri dhe jeni p\u00ebrdoruesi i vet\u00ebm. P\u00ebr shembull, ai \u00ebsht\u00eb n\u00eb REPL dhe p\u00ebrdoruesit e tjer\u00eb kurr\u00eb nuk do t\u00eb ken\u00eb qasje n\u00eb t\u00eb, ose \u00ebsht\u00eb nj\u00eb rrug\u00eb e re HTTP, t\u00eb cil\u00ebn nuk e referoni askund. K\u00ebtu mund t\u00eb punoni pa masa paraprake, dhe tani jeni p\u00ebraf\u00ebrsisht k\u00ebshtu duke punuar n\u00eb ambientin e zhvillimit.<\/p>\n<p><\/p>\n<p>Situata e dyt\u00eb: kodi tashm\u00eb \u00ebsht\u00eb duke u p\u00ebrdorur. N\u00ebse trafiku kalon p\u00ebrmes kodit (funksione, trajtues ngjarjesh, baza t\u00eb dh\u00ebnash, etj.), \u00ebsht\u00eb e nevojshme t\u00eb jeni t\u00eb kujdessh\u00ebm. P\u00ebr k\u00ebt\u00eb, ne bllokojm\u00eb t\u00eb gjith\u00eb kodin e p\u00ebrdorur dhe k\u00ebrkojm\u00eb q\u00eb t\u00eb p\u00ebrdoren mjete m\u00eb strukturore p\u00ebr redaktimin e tij. M\u00eb posht\u00eb do t'ju tregoj p\u00ebr mjetet strukturore: kaluesit e funksioneve p\u00ebr trajtuesit HTTP dhe ngjarjeve, nj\u00eb platform\u00eb e fuqishme migrimi p\u00ebr bazat e dh\u00ebnash dhe nj\u00eb metod\u00eb t\u00eb re p\u00ebr menaxhimin e versioneve p\u00ebr funksione dhe lloje.<\/p>\n<p><\/p>\n<h3 id=\"pereklyuchateli-funkciy\">Kaluesit e funksioneve<\/h3>\n<p><\/p>\n<p>Nj\u00eb nga m\u00ebnyrat <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">p\u00ebr t\u00eb zvog\u00ebluar kompleksitetin e panevojsh\u00ebm<\/a><\/noindex> n\u00eb Dark \u00ebsht\u00eb t\u00eb zgjidhni disa probleme me nj\u00eb zgjidhje. Kaluesit e funksioneve kryejn\u00eb shum\u00eb detyra t\u00eb ndryshme: z\u00ebvend\u00ebsimi i ambientit lokal t\u00eb zhvillimit, deg\u00ebt git, vendosja e kodit dhe, natyrisht, l\u00ebshimi tradicional i ngadalsh\u00ebm dhe i kontrolluar i kodit t\u00eb ri.<\/p>\n<p><\/p>\n<p>Krijimi dhe vendosja e kaluesit t\u00eb funksionit b\u00ebhet n\u00eb redaktorin ton\u00eb n\u00eb nj\u00eb operacion. Ai krijon nj\u00eb hap\u00ebsir\u00eb t\u00eb zbraz\u00ebt p\u00ebr kodin e ri dhe ofron elemente kontrolli p\u00ebr qasjen n\u00eb kodin e vjet\u00ebr dhe t\u00eb ri, si dhe butona dhe komanda p\u00ebr nj\u00eb kalim gradual n\u00eb kodin e ri ose p\u00ebr p\u00ebrjashtimin e tij.<\/p>\n<p><\/p>\n<p>Kaluesit e funksioneve jan\u00eb t\u00eb integruar n\u00eb gjuh\u00ebn Dark, dhe madje kaluesit e pap\u00ebrfunduar kryejn\u00eb detyr\u00ebn e tyre - n\u00ebse kushti n\u00eb kalues nuk p\u00ebrmbushet, do t\u00eb ekzekutohet kodi i vjet\u00ebr i bllokuar.<\/p>\n<p><\/p>\n<h3 id=\"sreda-razrabotki\">Mjedisi i zhvillimit<\/h3>\n<p><\/p>\n<p>Nd\u00ebrruesit e funksioneve z\u00ebvend\u00ebsojn\u00eb ambientin lokal t\u00eb zhvillimit. Sot, ekipeve u \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb sigurojn\u00eb q\u00eb gjithkush t\u00eb p\u00ebrdor\u00eb versione t\u00eb nj\u00ebjta t\u00eb mjeteve dhe bibliotekeve (mjetet e formatimit t\u00eb kodit, linters, menaxher\u00ebt e paketave, kompiler\u00ebt, preprocessors, mjetet e testimit etj.) Me Dark nuk \u00ebsht\u00eb nevoja t\u00eb instaloni var\u00ebsi lokalisht, t\u00eb menaxhoni instalimin lokal t\u00eb Docker ose t\u00eb merrni masa t\u00eb tjera p\u00ebr t\u00eb siguruar t\u00eb pakt\u00ebn nj\u00eb far\u00eb barazie midis ambientit t\u00eb zhvillimit dhe prodhimit. <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/honeycombs-charity-majors-go-ahead-test-in-production\/\">Duke marr\u00eb parasysh se kjo barazi \u00ebsht\u00eb e pamundur<\/a><\/noindex>, ne as nuk do t\u00eb pretendojm\u00eb se po e ndjekim at\u00eb.<\/p>\n<p><\/p>\n<p>N\u00eb vend q\u00eb t\u00eb krijojm\u00eb nj\u00eb ambient lokal t\u00eb klonuar, nd\u00ebrruesit n\u00eb Dark krijojn\u00eb nj\u00eb sand t\u00eb re n\u00eb prodhim, e cila z\u00ebvend\u00ebson ambientin e zhvillimit. N\u00eb t\u00eb ardhmen, ne gjithashtu planifikojm\u00eb t\u00eb krijojm\u00eb nj\u00eb sand p\u00ebr pjes\u00eb t\u00eb tjera t\u00eb aplikacionit (p.sh. klonat momentale t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave), edhe pse p\u00ebr momentin kjo nuk duket kaq e r\u00ebnd\u00ebsishme.<\/p>\n<p><\/p>\n<h3 id=\"vetki-i-razvertyvaniya\">Deg\u00ebt dhe shp\u00ebrndarjet<\/h3>\n<p><\/p>\n<p>Aktualisht ka disa m\u00ebnyra p\u00ebr t\u00eb futur kod t\u00eb ri n\u00eb sisteme: deg\u00ebt git, faza e shp\u00ebrndarjes dhe nd\u00ebrruesit e funksioneve. Ato zgjidhin nj\u00eb problem n\u00eb pjes\u00eb t\u00eb ndryshme t\u00eb procesit t\u00eb pun\u00ebs: git - n\u00eb fazat para shp\u00ebrndarjes, shp\u00ebrndarja - n\u00eb momentin e kalimit nga kodi i vjet\u00ebr n\u00eb t\u00eb riun, dhe nd\u00ebrruesit e funksioneve - p\u00ebr nj\u00eb l\u00ebshim t\u00eb kontrolluar t\u00eb kodit t\u00eb ri.<\/p>\n<p><\/p>\n<p>M\u00ebnyra m\u00eb efektive \u00ebsht\u00eb nd\u00ebrruesit e funksioneve (n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb, m\u00eb t\u00eb thjesht\u00eb p\u00ebr t'u kuptuar dhe p\u00ebrdorur). Me ta mund t\u00eb heqim dor\u00eb plot\u00ebsisht nga dy metodat e tjera. Sidomos e dobishme \u00ebsht\u00eb t\u00eb fshijm\u00eb faz\u00ebn e shp\u00ebrndarjes - n\u00ebse ne gjith\u00ebsesi po p\u00ebrdorim nd\u00ebrruesit e funksioneve p\u00ebr t\u00eb aktivizuar kodin, at\u00ebher\u00eb hapi i kalimit t\u00eb server\u00ebve n\u00eb kodin e ri krijon vet\u00ebm rreziqe t\u00eb tep\u00ebrta.<\/p>\n<p><\/p>\n<p>Git \u00ebsht\u00eb e v\u00ebshtir\u00eb p\u00ebr t'u p\u00ebrdorur, sidomos p\u00ebr fillestar\u00ebt, dhe kjo e kufizon shum\u00eb, por ndihmon me deg\u00ebt e tij t\u00eb dobishme. Ne kemi sheshuar shum\u00eb nga disavantazhet e git. Dark redaktohet n\u00eb koh\u00eb reale dhe ofron mund\u00ebsin\u00eb e bashk\u00ebpunimit n\u00eb stilin e Dokumenteve t\u00eb Google, k\u00ebshtu q\u00eb nuk ka nevoj\u00eb t\u00eb d\u00ebrgoni kodin dhe t\u00eb b\u00ebni refaktorizim dhe bashkime m\u00eb rrall\u00eb.<\/p>\n<p><\/p>\n<p>Funksionet e kalimit jan\u00eb thelb\u00ebsor p\u00ebr implementimin e sigurt. S\u00eb bashku me deploy-et e menj\u00ebhershme, ato lejojn\u00eb testimin e shpejt\u00eb t\u00eb koncepteve n\u00eb pjes\u00eb t\u00eb vogla me rrezik t\u00eb ul\u00ebt, n\u00eb vend q\u00eb t\u00eb b\u00ebni nj\u00eb ndryshim t\u00eb madh q\u00eb mund t\u00eb rr\u00ebzoj\u00eb sistemin.<\/p>\n<p><\/p>\n<h3 id=\"versionirovanie\">Versionimi<\/h3>\n<p><\/p>\n<p>P\u00ebr t\u00eb ndryshuar funksionet dhe llojet, ne p\u00ebrdorim versionimin. N\u00ebse d\u00ebshironi t\u00eb ndryshoni nj\u00eb funksion, Dark krijon nj\u00eb version t\u00eb ri t\u00eb k\u00ebtij funksioni. M\u00eb pas mund ta th\u00ebrrisni k\u00ebt\u00eb version p\u00ebrmes nj\u00eb kalimi n\u00eb trajtuesin HTTP ose ngjarjeve. (N\u00ebse ky \u00ebsht\u00eb nj\u00eb funksion thell\u00eb n\u00eb grafikun e thirrjeve, nj\u00eb version i ri krijohet p\u00ebr secilin funksion gjat\u00eb procesit. Mund t\u00eb dukej se \u00ebsht\u00eb tejet, por funksionet nuk ngat\u00ebrrohen n\u00ebse nuk i p\u00ebrdorni, k\u00ebshtu q\u00eb madje nuk do ta vini re.)<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb nj\u00ebjtat arsye, ne versionojm\u00eb llojet. Ne kemi folur n\u00eb detaje p\u00ebr sistemin ton\u00eb t\u00eb llojeve. <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">in the previous post<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Fal\u00eb versionimit t\u00eb funksioneve dhe llojeve, mund t\u00eb b\u00ebni ndryshime n\u00eb aplikacion gradualisht. Mund t\u00eb kontrolloni q\u00eb secili trajtues funksionon me versionin e ri pa qen\u00eb e nevojshme t\u00eb b\u00ebni t\u00eb gjitha ndryshimet n\u00eb aplikacione menj\u00ebher\u00eb (por ne kemi mjete p\u00ebr ta b\u00ebr\u00eb k\u00ebt\u00eb shpejt n\u00ebse d\u00ebshironi).<\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb shum\u00eb m\u00eb e sigurt se sa implementimi i gjith\u00e7kaje nj\u00ebkoh\u00ebsisht, si\u00e7 ndodh tani.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-paketov-i-standartnaya-biblioteka\">Versionet e reja t\u00eb paketave dhe biblioteka standarde<\/h3>\n<p><\/p>\n<p>Kur p\u00ebrdit\u00ebsoni nj\u00eb paket\u00eb n\u00eb Dark, ne nuk z\u00ebvend\u00ebsojm\u00eb menj\u00ebher\u00eb p\u00ebrdorimin e secilit funksion ose tip n\u00eb t\u00eb gjith\u00eb baz\u00ebn e kodit. Kjo nuk \u00ebsht\u00eb e sigurt. Kodi vazhdon t\u00eb p\u00ebrdor\u00eb versionin e nj\u00ebjt\u00eb q\u00eb ka p\u00ebrdorur, nd\u00ebrsa ju p\u00ebrdit\u00ebsoni p\u00ebrdorimin e funksioneve dhe llojeve n\u00eb versionin e ri p\u00ebr \u00e7do rast t\u00eb ve\u00e7ant\u00eb me ndihm\u00ebn e kalimeve.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rh\/t3\/4w\/rht34wyibolrgracbz88tnqqhg0.png\"><img decoding=\"async\" alt=\"Si Dark implementon kodin p\u00ebr 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/54fdb566b4bcbc10e06e51c47a3820f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Screenshot i nj\u00eb pjese t\u00eb procesit automatik n\u00eb Dark, duke treguar dy versione t\u00eb funksionit Dict::get. Dict::get_v0 kthente tipin Any (t\u00eb cilin ne po e heqim), nd\u00ebrsa Dict::get_v1 kthente tipin Option.<\/em><\/p>\n<p><\/p>\n<p>Ne shpesh ofrojm\u00eb nj\u00eb funksion t\u00eb ri n\u00eb bibliotek\u00ebn standarde dhe p\u00ebrjashtojm\u00eb versionet e vjetra. P\u00ebrdoruesit me versione t\u00eb vjetra n\u00eb kod do t\u00eb ruajn\u00eb qasje tek ato, por p\u00ebrdoruesit e rinj nuk do t\u00eb jen\u00eb n\u00eb gjendje t'i marrin ato. Ne po planifikojm\u00eb t\u00eb ofrojm\u00eb mjete p\u00ebr t\u00eb transferuar p\u00ebrdoruesit nga versionet e vjetra n\u00eb t\u00eb rejat me nj\u00eb hap, gjithashtu duke p\u00ebrdorur kalime funksionesh.<\/p>\n<p><\/p>\n<p>Dark ofron edhe nj\u00eb mund\u00ebsi unike: p\u00ebrderisa ne ekzekutojm\u00eb kodin tuaj t\u00eb pun\u00ebs, ne mund ta testojm\u00eb vet\u00eb versionet e reja duke krahasuar daljet p\u00ebr k\u00ebrkesat e reja dhe ato t\u00eb vjetra, p\u00ebr t'ju informuar mbi ndryshimet. Si rezultat, azhurnimi i pakove, i cili shpesh kryhet n\u00eb err\u00ebsir\u00eb (ose k\u00ebrkon testim t\u00eb kujdessh\u00ebm p\u00ebr siguri), paraqet shum\u00eb m\u00eb pak rreziqe dhe mund t\u00eb ndodh\u00eb automatikisht.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-dark\">Versionet e reja t\u00eb Dark<\/h3>\n<p><\/p>\n<p>Kalimi nga Python 2 n\u00eb Python 3 zgjati nj\u00eb dekad\u00eb dhe akoma mbetet nj\u00eb problem. Duke pasur parasysh se ne po e krijojm\u00eb Dark p\u00ebr shp\u00ebrndarje t\u00eb vazhdueshme, duhet t\u00eb kemi parasysh k\u00ebto ndryshime t\u00eb gjuh\u00ebs.<\/p>\n<p><\/p>\n<p>Kur ne b\u00ebjm\u00eb ndryshime t\u00eb vogla n\u00eb gjuh\u00eb, ne krijojm\u00eb nj\u00eb version t\u00eb ri t\u00eb Dark. Kodi i vjet\u00ebr mbetet n\u00eb versionin e vjet\u00ebr t\u00eb Dark, nd\u00ebrsa kodi i ri p\u00ebrdoret n\u00eb versionin e ri. P\u00ebr t\u00eb kaluar n\u00eb versionin e ri t\u00eb Dark, mund t\u00eb p\u00ebrdoren kaluesit ose versionet e funksioneve.<\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb ve\u00e7an\u00ebrisht e dobishme, duke pasur parasysh se Dark u shfaq shum\u00eb koh\u00ebt e fundit. Shum\u00eb ndryshime n\u00eb gjuh\u00eb ose bibliotek\u00eb mund t\u00eb rezultojn\u00eb t\u00eb d\u00ebshtojn\u00eb. Versionimi gradual i gjuh\u00ebs na lejon t\u00eb b\u00ebjm\u00eb azhurnime t\u00eb vogla, dometh\u00ebn\u00eb ne mund t\u00eb mos ngutemi dhe t\u00eb shtyjm\u00eb shum\u00eb vendime mbi gjuh\u00ebn derisa t\u00eb kemi m\u00eb shum\u00eb p\u00ebrdorues, q\u00eb do t\u00eb thot\u00eb m\u00eb shum\u00eb informacion.<\/p>\n<p><\/p>\n<h3 id=\"migracii-baz-dannyh\">Migrimi i bazave t\u00eb t\u00eb dh\u00ebnave<\/h3>\n<p><\/p>\n<p>P\u00ebr nj\u00eb migrim t\u00eb sigurt t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, ekziston <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brunton-spall.co.uk\/post\/2014\/05\/06\/database-migrations-done-right\/\">formula standarde<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ul>\n<li>Rikopjimi i kodit p\u00ebr t\u00eb mb\u00ebshtetur formate t\u00eb reja dhe t\u00eb vjetra<\/li>\n<li>Transformimi i t\u00eb gjitha t\u00eb dh\u00ebnave n\u00eb formatin e ri<\/li>\n<li>Heqja e aksesit t\u00eb vjet\u00ebr n\u00eb t\u00eb dh\u00ebna<\/li>\n<\/ul>\n<p><\/p>\n<p>Si rezultat, migrazione e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave vonohet dhe k\u00ebrkon shum\u00eb burime. Dhe ne grumbullojm\u00eb skema t\u00eb vjetra, sepse madje edhe detyra t\u00eb thjeshta, si rregullimi i emrit t\u00eb tabel\u00ebs ose kolon\u00ebs, nuk ia vlen p\u00ebrpjekjet e shpenzuara.<\/p>\n<p><\/p>\n<p>Dark ka nj\u00eb platform\u00eb efektive p\u00ebr migrimin e bazave t\u00eb t\u00eb dh\u00ebnave, e cila (shpresojm\u00eb) do ta thjeshtoj\u00eb procesin aq shum\u00eb sa do t\u00eb ndaloni s\u00eb pasuri frik\u00eb p\u00ebr t\u00eb. T\u00eb gjitha depozitat e t\u00eb dh\u00ebnave n\u00eb Dark (depozita \u00e7ift\u00ebsh \u00ab\u00e7el\u00ebs-vler\u00eb\u00bb ose tabela t\u00eb q\u00ebndrueshme) kan\u00eb nj\u00eb tip. P\u00ebr t\u00eb transferuar nj\u00eb depozit\u00eb t\u00eb dh\u00ebnash, thjesht i jepni asaj nj\u00eb tip t\u00eb ri dhe funksion t\u00eb rikthimit dhe rikthimit p\u00ebr t\u00eb transformuar vlerat midis dy tipeve.<\/p>\n<p><\/p>\n<p>Qasja n\u00eb magazinat e t\u00eb dh\u00ebnave n\u00eb Dark b\u00ebhet p\u00ebrmes emrave t\u00eb variablave t\u00eb versionuar. P\u00ebr shembull, magazina e t\u00eb dh\u00ebnave Users fillimisht do t\u00eb quhet Users-v0. Kur krijohet nj\u00eb version i ri me nj\u00eb lloj tjet\u00ebr, emri ndryshon n\u00eb Users-v1. N\u00ebse t\u00eb dh\u00ebnat ruhen p\u00ebrmes Users-v0 dhe ju i qaseni ato p\u00ebrmes Users-v1, aplikohet funksioni i rikthimit. N\u00ebse t\u00eb dh\u00ebnat ruhen p\u00ebrmes Users-v1 dhe ju i qaseni ato p\u00ebrmes Users-v0, aplikohet funksioni i kthimit pas.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/ui\/sl\/wd\/uislwdrfrvact0d1ts5icnk-4ka.png\"><img decoding=\"async\" alt=\"Si Dark implementon kodin p\u00ebr 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/35743ba246f327ca9e8b71f0069a3800.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Ekrani i migrimit t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave me emrat e fushave t\u00eb vjetra t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, shprehjet e rikthimit dhe kthimit pas dhe udh\u00ebzimet p\u00ebr aktivizimin e migrimit.<\/em><\/p>\n<p><\/p>\n<p>P\u00ebrdorni kaluesit e funksioneve p\u00ebr t'i udh\u00ebzuar thirrjet nga Users-v0 n\u00eb versionin Users-v1. Kjo mund t\u00eb b\u00ebhet p\u00ebr nj\u00eb trajtim HTTP n\u00eb nj\u00eb koh\u00eb, p\u00ebr t\u00eb ulur rreziqet, dhe kaluesit punojn\u00eb p\u00ebr p\u00ebrdorues t\u00eb ve\u00e7ant\u00eb, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb mund t\u00eb kontrolloni se \u00e7do gj\u00eb funksionon si\u00e7 pritej. Kur t\u00eb mos ket\u00eb m\u00eb p\u00ebrdorues n\u00eb Users-v0, Dark do t\u00eb konvertoj\u00eb t\u00eb dh\u00ebnat e mbetura n\u00eb sfond nga formati i vjet\u00ebr n\u00eb at\u00eb t\u00eb ri. Ju nuk do ta vini re k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<h3 id=\"testirovanie\">Testimi<\/h3>\n<p><\/p>\n<p>Dark \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">nj\u00eb gjuh\u00eb programimi funksionale me tipizim statik<\/a><\/noindex> dhe vlera t\u00eb pandryshueshme, prandaj sip\u00ebrfaqja e testimit \u00ebsht\u00eb duksh\u00ebm m\u00eb e vog\u00ebl krahasuar me gjuh\u00ebt objekt-orientuese me tipizim dinamik. Por ende \u00ebsht\u00eb e nevojshme t\u00eb b\u00ebhet testimi.<br \/>\nN\u00eb Dark, redaktori automatikisht ekzekuton testin modular n\u00eb sfond p\u00ebr kodin q\u00eb po redaktohet dhe automatikisht ekzekuton k\u00ebto teste p\u00ebr t\u00eb gjitha kaluesit e funksioneve. N\u00eb t\u00eb ardhmen, d\u00ebshirojm\u00eb q\u00eb p\u00ebrmes tipave statik\u00eb t\u00eb ekzekutojm\u00eb automatikisht fuzzing t\u00eb kodit p\u00ebr t\u00eb gjetur gabimet.<\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, Dark ekzekuton infrastruktur\u00ebn tuaj n\u00eb prodhim, e cila hap mund\u00ebsi t\u00eb reja. Ne automatikisht ruajm\u00eb k\u00ebrkesat HTTP n\u00eb infrastruktur\u00ebn Dark (deri tani ruajm\u00eb t\u00eb gjitha k\u00ebrkesat, por m\u00eb von\u00eb duam t\u00eb kalojm\u00eb n\u00eb sampling). Ne i testojm\u00eb ato me kodin e ri dhe kryejm\u00eb teste modulare, dhe n\u00ebse d\u00ebshironi, mund t\u00eb shnd\u00ebrroni leht\u00ebsisht k\u00ebrkesat interesante n\u00eb teste modulare.<\/p>\n<p><\/p>\n<h3 id=\"ot-chego-my-izbavilis\">\u00c7far\u00eb ne hoq\u00ebm<\/h3>\n<p><\/p>\n<p>Duke qen\u00eb se nuk kemi shp\u00ebrndarje, por kemi kaluesit e funksioneve, rreth 60% e pipeline-it t\u00eb shp\u00ebrndarjes mbetet jasht\u00eb. Nuk kemi nevoj\u00eb p\u00ebr deg\u00eb git ose k\u00ebrkesa p\u00ebr t\u00ebrheqje, nd\u00ebrtimin e burimeve prapa dhe kontejner\u00ebve, d\u00ebrgimin e burimeve dhe kontejner\u00ebve n\u00eb regjistra ose hapa shp\u00ebrndarjeje n\u00eb Kubernetes.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/gc\/9e\/g-\/gc9eg-szouq0dtrxxr8jd6c6dyo.jpeg\"><img decoding=\"async\" alt=\"Si Dark implementon kodin p\u00ebr 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/d584b13a1f91e9eef1e2e40c25e90052.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Krahasimi i pipeline-it tradicional t\u00eb shp\u00ebrndarjes s\u00eb vazhdueshme (majtas) dhe shp\u00ebrndarja e vazhdueshme Dark (djathtas). N\u00eb Dark, shp\u00ebrndarja p\u00ebrb\u00ebhet nga 6 hapa dhe nj\u00eb cik\u00ebl, nd\u00ebrsa versioni tradicional p\u00ebrfshin 35 hapa dhe 3 cikle.<\/em><\/p>\n<p><\/p>\n<p>N\u00eb Dark, ka vet\u00ebm 6 hapa dhe 1 cik\u00ebl (hapat q\u00eb p\u00ebrs\u00ebriten disa her\u00eb) n\u00eb shp\u00ebrndarje, nd\u00ebrsa pipeline-i modern i shp\u00ebrndarjes s\u00eb vazhdueshme p\u00ebrb\u00ebhet nga 35 hapa dhe 3 cikle. N\u00eb Dark, testet ekzekutohen automatikisht dhe nuk e shihni; var\u00ebsit\u00eb instalohet automatikisht; gjith\u00e7ka q\u00eb lidhet me git ose Github nuk \u00ebsht\u00eb m\u00eb e nevojshme; nuk nevojitet t\u00eb ndodh\u00eb nd\u00ebrtimi, testimi dhe d\u00ebrgimi i kontejner\u00ebve Docker; shp\u00ebrndarja n\u00eb Kubernetes nuk \u00ebsht\u00eb m\u00eb e nevojshme.<\/p>\n<p><\/p>\n<p>Edhe hapat e mbetur n\u00eb Dark jan\u00eb b\u00ebr\u00eb m\u00eb t\u00eb lehta. Meqen\u00ebse nd\u00ebrruesit e funksioneve mund t\u00eb menaxhohen me nj\u00eb veprim, nuk \u00ebsht\u00eb m\u00eb e nevojshme t\u00eb kaloni p\u00ebrmes t\u00eb gjith\u00eb pipeline-it t\u00eb shp\u00ebrndarjes p\u00ebr t\u00eb hequr kodin e vjet\u00ebr.<\/p>\n<p><\/p>\n<p>Ne e kemi thjeshtuar sa m\u00eb shum\u00eb q\u00eb t\u00eb jet\u00eb e mundur shp\u00ebrndarjen e kodit, duke reduktuar koh\u00ebn dhe rreziqet e shp\u00ebrndarjes s\u00eb vazhdueshme. Po ashtu, ne e kemi thjeshtuar gjithashtu azhurnimin e paketave, migrimet e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, testimin, menaxhimin e versioneve, instalimin e var\u00ebsive, barazin\u00eb midis mjediseve t\u00eb zhvillimit dhe prodhimit dhe azhurnime t\u00eb shpejta dhe t\u00eb sigurta t\u00eb versioneve t\u00eb gjuh\u00ebs.<\/p>\n<p><\/p>\n<p>Un\u00eb po p\u00ebrgjigjem n\u00eb pyetje p\u00ebr k\u00ebt\u00eb n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/news.ycombinator.com\/item?id=20394166\">HackerNews<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb m\u00ebsuar m\u00eb shum\u00eb rreth pajisjes Dark, lexoni <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">artikullin p\u00ebr Dark<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/darklang?source=post_page---------------------------\">na ndiqni n\u00eb Twitter<\/a><\/noindex> (ose n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/paulbiggar?source=post_page---------------------------\">un\u00eb<\/a><\/noindex>) ose <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/subscribe?source=post_page---------------------------\">regjistrohuni p\u00ebr versionin beta dhe merrni njoftime p\u00ebr postimet e ardhshme<\/a><\/noindex>. N\u00ebse po shkoni n\u00eb StrangeLoop n\u00eb shtator, <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/launch\">ejani t\u00eb na ndihmoni n\u00eb lan\u00e7im<\/a><\/noindex>.<\/p>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/462027\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0430\u0441 \u2014 \u043d\u0430\u0448\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u0442\u044c \u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u0440\u043e\u0441\u0442\u043e\u044f\u043c \u0438 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u043c. \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u0430\u0436\u0435 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27506,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36721","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.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.\" \/>\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\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\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\u041a\u0430\u043a Dark \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u0437\u0430 50 \u043c\u0441 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\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-31T19:13:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:20+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\udd47Si e shp\u00ebrndan Dark kodin brenda 50 ms | ProHoster","description":"Sa m\u00eb i shpejt\u00eb t\u00eb jet\u00eb procesi i zhvillimit, aq m\u00eb shpejt.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","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\u041a\u0430\u043a Dark \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u0437\u0430 50 \u043c\u0441 | ProHoster","og:description":"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","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-31T19:13:20+00:00","article:modified_time":"2019-10-31T19:13:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36721","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-22 04:34:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:40:22","updated":"2026-01-22 04:34:22","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\/36721","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=36721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/36721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/27506"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=36721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=36721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=36721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}