Tere, sÔbrad. Kursuse , traditsiooniliselt jagame teiega kasulikku materjali.
Tarkvara lahendab ĂŒha enam igapĂ€evaseid ĂŒlesandeid, samal ajal muutudes jĂ€rjest keerulisemaks. Nagu kord ĂŒtles Mark Andreessen, see neelab maailma.

SeetĂ”ttu on viimase paarikĂŒmne aasta jooksul rakenduste arendamise ja tarnimise lĂ€henemised muutunud. Need on olnud tektoonilised muutused, mis on toonud kaasa pĂ”himĂ”tete kogumi. Need pĂ”himĂ”tted osutusid kasulikuks teie meeskonna loomisel, projekteerimisel, arendamisel ja rakenduse lĂ”ppkasutajatele tarnimisel.
PÔhimÔtted saab kokku vÔtta jÀrgmiselt: rakendus peab olema vÀike, vÔrgupÔhine ja arendajale suunatud arhitektuuriga. Tuginedes nendele kolmele pÔhimÔttele, saate luua usaldusvÀÀrse, keeruka rakenduse, mida saab kiiresti ja turvaliselt lÔppkasutajale tarnida ning mida on kerge skaleerida ja laiendada.

Iga ettepaneku pĂ”himĂ”tte alusel on mitmeid aspekte, mida arutame, et nĂ€idata, kuidas iga pĂ”himĂ”te aitab kaasa peamise eesmĂ€rgi saavutamisele, milleks on usaldusvÀÀrsete rakenduste kiire tarnimine, mis on lihtsad hooldada ja kasutada. Arutame pĂ”himĂ”tteid nende vastanditega, et selgitada, mida tĂ€hendab nĂ€iteks âVeenduge, et kasutate vĂ€ikuse pĂ”himĂ”tet».
Loodame, et see artikkel julgustab teid kasutama ettepanekut, et luua modernseid rakendusi, mis tagavad ĂŒhtse lĂ€henemise projekteerimisel pidevalt kasvavas tehnoloogia virnas.
Nende pÔhimÔtete rakendamisel leiate, et kasutate uusimaid tarkvaraarenduse suundi, sealhulgas lÀhenemist rakenduste arendusele ja tarnimisele, konteinerite kasutamine (nÀiteks ) ja konteinerite orkestreerimise raamistikud (nÀiteks ), mikroteenuste kasutamine (sealhulgas Mikroteenuste Arhitektuur ja mikroteenuste rakenduste jaoks.
Mis on kaasaegne rakendus?
Kaasaegsed rakendused? Kaasaegne virn? Mida tĂ€pselt tĂ€hendab âkaasaegneâ?
Enamik arendajatest omab vaid ĂŒldistatult arusaama, millest tĂ€napĂ€evane rakendus koosneb, seetĂ”ttu tuleb selle mĂ”istele selge mÀÀratlus anda.
TĂ€napĂ€evane rakendus toetab mitut klienti, olgu need siis kasutajaliidese komponent JavaScripti raamatukogus React, mobiilirakendus Androidile vĂ”i iOS-ile vĂ”i rakendus, mis ĂŒhendub teisega API kaudu. TĂ€napĂ€evane rakendus eeldab, et tal on mÀÀramata arv kliente, kellele ta andmeid vĂ”i teenuseid pakub.
TĂ€napĂ€evane rakendus pakub API-t, et pÀÀseda juurde nĂ”utud andmetele ja teenustele. API peab olema muutumatu ja pĂŒsiv, mitte kirjutatud spetsiaalselt teatud kliendi ĂŒhe konkreetse pĂ€ringu jaoks. API on saadaval HTTP(S) kaudu ja tagab juurdepÀÀsu kogu funktsionaalsusele, mis on saadaval GUI vĂ”i CLI kaudu.
Andmed peavad olema kergesti ligipÀÀsetavas, ĂŒhilduvas formaadis, nĂ€iteks JSON. API pakub objekte ja teenuseid arusaadavas, organisatsioonilises vormis, nĂ€iteks RESTful API vĂ”i GraphQL tagab kvaliteetse liidese.
TĂ€napĂ€evased rakendused on ĂŒles ehitatud kaasaegsele tehnoloogiapinnale, mis toetab selliseid rakendusi. Selline tehnoloogiapind vĂ”imaldab arendajal kergesti luua rakendusi, millel on HTTP-liides ja selged API lĂ”pp-punktid. Valitud lĂ€henemine vĂ”imaldab teie rakendusel hĂ”lpsasti vastu vĂ”tta ja saata andmeid JSON-formaadis. TeisisĂ”nu, kaasaegne tehnoloogia vastab KaheteistkĂŒmne Faktoriga rakenduse elementidele. .
Selle tĂŒĂŒpi tehnoloogiapinna populaarsed versioonid pĂ”hinevad , , , , ja . Mikroteenuste arhitektuur toob esile nĂ€ite kaasaegsest tehnoloogiapinnast, mis on rakendatud igas eespool nimetatud keeles.
Pange tĂ€hele, et me ei propageeri ainult mikroteenuste lĂ€henemist. Paljud teist töötavad monoliitide kallal, mis peavad arenema, samas kui teised tegelevad SOA rakendustega, mis laienevad ja arenevad, et muutuda mikroteenuste rakendusteks. Kolmandad liiguvad suunas serverita (serverless) rakenduste rakendamine ning mĂ”ned rakendavad eelpool nimetatud kombinatsioone. Artiklis esitatud pĂ”himĂ”tted on kohaldatavad igasugustele nendele sĂŒsteemidele, ulatudes mĂ”ningate vĂ€ikeste muudatusteni.
PÔhimÔtted
NĂŒĂŒd, kui oleme saavutanud ĂŒldise arusaama sellest, mis on tĂ€napĂ€evane rakendus ja kaasaegne tehnoloogiaplatvorm, on aeg sĂŒveneda arhitektuuri ja arenduse pĂ”himĂ”tetesse, mis toovad kasu teie rakenduse loomisel, elluviimisel ja hooldamisel.
Ăks pĂ”himĂ”tteid on «looge vĂ€ikeseid rakendusi», nimetagem seda lihtsalt vĂ€ike rakendusprintsiip. On olemas uskumatult keerulisi rakendusi, mis koosnevad paljusid liikuvatest komponentidest. See omakorda muudab rakenduse ehitamise vĂ€ikestest eraldiseisvatest komponentidest lihtsamaks projekteerimise, hooldamise ja ĂŒldise kasutamise osas. (Pange tĂ€hele, et me ĂŒtlesime «lihtsamaks», mitte «lihtsaks»).
Teine pĂ”himĂ”te seisneb selles, et saame suurendada arendajate tootlikkust, aidates neil keskenduda neile funktsioonidele, mida nad arendavad, vabastades nad samas infrastruktuuri ja CI/CD hooldamise muredest elluviimise ajal. Nii et lĂŒhidalt öeldes, meie lĂ€henemine on arendajale suunatud.
LĂ”puks peab kĂ”ik teie rakendusega seonduv olema ĂŒhendatud vĂ”rku. Viimase 20 aasta jooksul oleme teinud suuri edusamme vĂ”rgu tuleviku suunas, kuna vĂ”rgud on muutunud kiiremaks ja rakendused keerukamaks. Nagu juba selgitasime, peab kaasaegne rakendus olema vĂ”rgu kaudu saadaval paljude erinevate klientide jaoks. VĂ”rgupĂ”hise mĂ”tlemise rakendamine arhitektuuris toob kaasa mĂ€rkimisvÀÀrseid eeliseid, mis sobivad hĂ€sti kokku vĂ€ike rakendusprintsiip ja lĂ€henemise mĂ”istega, mille fookus on arendajatel.
Kui peate oma rakenduse arendamise ja kasutuselevÔtu kÀigus silmas neid pÔhimÔtteid, on teil vaieldamatu eelis oma toote arendamisel ja kohandamisel.
Uurime neid kolme pÔhimÔtet lÀhemalt.
VĂ€ike rakendusprintsiip
Inimese ajul on keeruline samal ajal tajuda suurt hulka teavet. PsĂŒhholoogias tĂ€hendab kognitiivne koormus ĂŒldist vaimset pingutust, mis on vajalik info mĂ€letamiseks. Arendajate kognitiivse koormuse vĂ€hendamine on prioriteet, kuna sel juhul saavad nad keskenduda probleemide lahendamisele, selle asemel et hoida peas praegust keerulist mudelit kogu rakendusest ja arendatavatest funktsioonidest.

Rakendused dekomponeeritakse jÀrgmiste pÔhjusel:
- Arendajate kognitiivse koormuse vÀhendamine;
- Testimise kiirendamine ja lihtsustamine;
- Muudatuste kiire kohaletoimetamine rakenduses.
On mitu viisi, kuidas vÀhendada arendajate kognitiivset koormust, ja siin tulebki mÀngu vÀikeste asjade pÔhimÔte.
Nii et kolm viisi kognitiivse koormuse vÀhendamiseks:
- VĂ€hendage ajavahemikke, mida nad peavad uue funktsiooni arendamisel arvestama â mida lĂŒhem on ajavahemik, seda madalam on kognitiivne koormus.
- VĂ€hendage korraga kĂ€sitletava koodi hulka â vĂ€hem koodi, vĂ€hem koormust.
- Lihtsustage rakenduses inkrementaalsete muudatustega tegelemise protsessi.
Ajavahemike lĂŒhendamine arenduses
Naaseme aega, mil metodoloogia waterfall oli arendusprotsessi standardiks ja kuue kuu kuni kahe aasta pikkused ajavahemikud rakenduse arendamiseks vĂ”i uuendamiseks olid tavaline praktika. Ăldiselt lugesid esiteks insenerid asjakohaseid dokumente, nagu toote nĂ”uded (PRD), sĂŒsteemi viidatud dokument (SRD), arhitektuuri plaani ja alustasid nende kĂ”ikide kokku panemist ĂŒhte kognitiivsesse mudelisse, mille kohaselt nad koodi kirjutasid. NĂ”uete ja seega ka arhitektuuri muutudes pidi vĂ€hemalt tiim olema pidevalt kurssi viidud kognitiivse mudeli uuendamisega. See lĂ€henemine halvas töö kĂ”ige halvemal juhul tĂ€ielikult.
Suurem muutus rakenduste arendamise protsessis oli agil-semetoodika kasutuselevĂ”tt. Ăks agili metodoloogia peamisi jooni on korduv arendamine. See omakorda toob kaasa inseneride kognitiivse koormuse vĂ€henemise. Selle asemel, et nĂ”uda arendajate meeskonnalt rakenduse elluviimist ĂŒhe pika tsĂŒkli jooksul, lubab lĂ€henemine keskenduda vĂ€ikestele koodihulkadele, mida on vĂ”imalik kiiresti testida ja juurutada, samal ajal kui saadakse ka tagasisidet. Rakenduse kognitiivne koormus on nihkunud kuue kuu kuni kahe aasta ajavahemikust koos tohutu hulkade spetsifikatsioonidega kahele nĂ€dalasele funktsiooni lisamiseks vĂ”i muutmiseks, mis on suunatud ebaselgele mĂ”istmisele suurest rakendusest. â on iteratiivne arendus. See omakorda vĂ€hendab inseneride kognitiivset koormust. Selle asemel, et nĂ”uda arendusmeeskonnalt rakenduse elluviimist ĂŒhe pika tsĂŒkli jooksul, lubab lĂ€henemine keskenduda vĂ€ikestele koodihulkadele, mida on vĂ”imalik kiiresti testida ja juurutada, samal ajal kui saadakse ka tagasisidet. Rakenduse kognitiivne koormus on nihkunud kuue kuu kuni kahe aasta ajavahemikust koos tohutu hulkade spetsifikatsioonidega kahele nĂ€dalasele funktsiooni lisamiseks vĂ”i muutmiseks, mis on suunatud ebaselgele mĂ”istmisele suurest rakendusest. vĂ”imaldab lĂ€henemine keskenduda vĂ€ikestele koodimahtudele, mida saab kiiresti testida ja juurutada, samal ajal saades ka tagasisidet. Rakenduse kognitiivne koormus on nihkunud kuue kuu kuni kahe aasta ajakavast, arvestades suuri spetsifikatsioone, kahe nĂ€dala jooksul toimuvale funktsiooni lisamisele vĂ”i muutustele, mis on suunatud rohkem hĂ€gusele arusaamisele suurest rakendusest.
Keskendumine massiivsetest rakendustest konkreetsetele vĂ€ikestele funktsioonidele, mis saab lĂ”pule viia kahe nĂ€dala sprintide jooksul, ja vaadates ette mitte rohkem kui ĂŒks funktsioon jĂ€rgmisest sprintist, on mĂ€rkimisvÀÀrne muutus. See on vĂ”imaldanud suurendada arenduse tootlikkust, vĂ€hendades samal ajal pidevalt kĂ”ikuvat kognitiivset koormust.
Metoodikas lubab lĂ€henemine keskenduda vĂ€ikestele koodihulkadele, mida on vĂ”imalik kiiresti testida ja juurutada, samal ajal kui saadakse ka tagasisidet. Rakenduse kognitiivne koormus on nihkunud kuue kuu kuni kahe aasta ajavahemikust koos tohutu hulkade spetsifikatsioonidega kahele nĂ€dalasele funktsiooni lisamiseks vĂ”i muutmiseks, mis on suunatud ebaselgele mĂ”istmisele suurest rakendusest. eeldatakse, et lĂ”plik rakendus on mĂ”nevĂ”rra muudetud versioon algsest kontseptsioonist, seega peab arenduse lĂ”pp-punkt olema kindlasti ebamugavalt mÀÀratletud. Ăksikasjalikud ja selged vĂ”ivad olla ainult iga konkreetse sprindi tulemused.
VĂ€ikesed koodibaasid
JĂ€rgmine samm kognitiivse koormuse vĂ€hendamisel on koodibaasi vĂ€hendamine. TĂŒĂŒpiliselt on tĂ€napĂ€evased rakendused mahukad â usaldusvÀÀrne, ettevĂ”tte rakendus vĂ”ib koosneda tuhandetest failidest ja sadadest tuhandetest koodiridadest. SĂ”ltuvalt failide struktuurist vĂ”ivad koodide ja failide seosed ja sĂ”ltuvused olla ilmsed vĂ”i vastupidi. Isegi koodi tĂ€itmise tĂ”rkeotsing vĂ”ib tekitada probleeme, sĂ”ltuvalt kasutatavatest teekidest ja sellest, kui hĂ€sti tĂ”rkeotsingu tööriistad eraldavad teegid/paketid/moodulid ja kasutajakoode.
Rakenduse koodi töötava vaimse mudeli loomine vÔib vÔtta mÀrkimisvÀÀrselt palju aega ja taaskoormata arendajat suurt kognitiivset koormust. See on eriti iseloomulik monoliitsetele koodibaasile, kus palju koodi, mille funktsionaalsete komponentide omavaheline suhtlemine ei ole selgelt mÀÀratletud, ning tÀhelepanerakkude jaotumine on sageli hÀgune, kuna funktsionaalsed piirid ei ole tÀidetud.
Ăks tĂ”husamaid viise inseneride kognitiivse koormuse vĂ€hendamiseks on mikroteenuste arhitektuurile ĂŒleminek. Mikroteenuste lĂ€henemisviisis keskendub iga teenus ĂŒhele funktsioonide kogumile; samas on teenuse tĂ€hendus tavaliselt mÀÀratletud ja arusaadav. Teenuse piirid on samuti selged â pidage meeles, et teenusega suhtlemine toimub API kaudu, seega vĂ”ivad ĂŒhe teenuse genereeritud andmed kergesti edastada teise.
Koostoime teiste teenustega on tavaliselt piiratud mĂ”ne kasutajateenuse ja mĂ”ne teenusepakkuja teenusega, mis kasutavad lihtsaid ja selgeid API kutsungeid, nĂ€iteks REST-i abil. See tĂ€hendab, et inseneri kognitiivne koormus vĂ€heneb mĂ€rkimisvÀÀrselt. KĂ”ige keerulisemaks ĂŒlesandeks jÀÀb teenuste koostöömudeli mĂ”istmine ja selle mĂ”istmine, kuidas sellised asjad nagu tehingud toimivad mitmes teenuses. LĂ”ppkokkuvĂ”ttes vĂ€hendab mikroteenuste kasutamine kognitiivset koormust, vĂ€hendades koodi mahtu, mÀÀratledes teenuse selged piirid ja tagades kasutajate ja teenusepakkujate suhete mĂ”istmise.
VĂ€ikesed inkrementaalsed muutused
PĂ”himĂ”tte viimane element tĂŒhine â see on muutuste juhtimine. Arendajatele on suur ahvatlus vaadata koodibaasi (vĂ”ib-olla isegi omaenda vanemat koodi) ja kuulutada: âSee on jama, peame kĂ”ik ĂŒmber kirjutama.â MĂ”nikord on see Ă”ige otsus, mĂ”nikord mitte. See seab arendajate meeskonna Ă”lule globaalse mudeli muutmise koorma, mis omakorda toob kaasa ulatusliku kognitiivse koormuse. Paremini on, kui insenerid keskenduvad muudatustele, mida nad saavad sprinti jooksul ellu viia, et seejĂ€rel Ă”ige funktsionaalsus Ă”igeaegselt vĂ€lja tuua, isegi kui see juhtub jĂ€rk-jĂ€rgult. LĂ”pp-tulemus peaks meenutama eelnevalt planeeritud tulemust, kuid mĂ”ningate muudatustega ja testimisega, et vastata kliendi vajadustele.
Suure koodilĂ”ikude ĂŒmberkirjutamisel osutub aeg-ajalt muudatuste kiire tarnimine vĂ”imatuks, kuna mĂ€ngu astuvad sĂŒsteemi muud sĂ”ltuvused. Muudatuste voogu kontrollimiseks vĂ”ib kasutada funktsionaalsuse peitmist (feature hiding). See tĂ€hendab, et funktsionaalsus on olemas tootmises, kuid ei ole kergelt juurdepÀÀsetav keskkonnamuutujate (env-var) vĂ”i mĂ”ne muu konfigureerimismehhanismi kaudu. Kui kood on lĂ€binud kĂ”ik kvaliteedi kontrollimise protsessid, vĂ”ib see jĂ”uda tootmisse varjatud olekus. Siiski toimib see strateegia ainult siis, kui funktsioon lĂ”ppkokkuvĂ”ttes aktiveeritakse. Muul juhul lisab see lihtsalt koodi ĂŒlekoormust ja tĂ”stab arendaja kognitiivset koormust, millega tuleb tulemuslikuks tööks toime tulla. Muudatuste haldamine ja jĂ€rkjĂ€rgulised muudatused aitavad iseenesest hoida arendajate kognitiivset koormust talutaval tasemel.
Insenerid peavad isegi lisafunktsionaalsuse lihtsal rakendamisel ĂŒletama palju raskusi. Juhtkonna poolt on mĂ”istlik vĂ€hendada tiimi liigset koormust, et nad saaksid keskenduda funktsionaalsuse pĂ”hielementidele. On kolm asja, mida saate teha, et aidata oma arendustiimi:
- Kasutage metoodikat
lubab lÀhenemine keskenduda vÀikestele koodihulkadele, mida on vÔimalik kiiresti testida ja juurutada, samal ajal kui saadakse ka tagasisidet. Rakenduse kognitiivne koormus on nihkunud kuue kuu kuni kahe aasta ajavahemikust koos tohutu hulkade spetsifikatsioonidega kahele nÀdalasele funktsiooni lisamiseks vÔi muutmiseks, mis on suunatud ebaselgele mÔistmisele suurest rakendusest., et piirata ajaraame, mille jooksul tiim peab keskenduma vÔtmefunktsioonidele. - Rakendage oma rakendust mitme mikroteenuse kujul. See piirab rakendatavate funktsioonide arvu ja tugevdab piire, mis hoiab kognitiivset koormust töö meatmisel.
- Eelistage jĂ€rkjĂ€rgulisi muudatusi massiivsete ja koormavate ĂŒle, muutke vĂ€ikseid koodilĂ”ike. Kasutage funktsioonide peitmist, et viia ellu muudatusi, isegi kui need ei ole kohe nĂ€htavad pĂ€rast lisamist.
Kui rakendate oma töös vÀikese ulatuse pÔhimÔtet, muutub teie meeskond kindlasti Ônnelikumaks, suudab paremini keskenduda vajalike funktsioonide elluviimisele ja on tÔenÀolisem, et kvaliteetseid muudatusi hakatakse kiiremini ellu viima. Kuid see ei tÀhenda, et töö ei vÔiks keerulisemaks muutuda; mÔnikord nÔuab uue funktsionaalsuse rakendamine mitme teenuse muutmist ning see protsess vÔib olla keerulisem kui sarnane monoliitses arhitektuuris. Igatahes tasuvad vÀikese ulatuse lÀhenemise eelised end Àra.
Esimese osa lÔpp.
Peagi avaldame tÔlke teise osa, kuid praegu ootame teie kommentaare ja kutsume teid osalema , mis toimub juba tÀna kell 20.00.
Allikas: habr.com
