Barcha savollar

Full Stack Developer suhbati uchun eng muhim 50 ta savol

Ushbu savollar yordamida Full-stack bilimingizni sinab ko'ring, baholang va mustahkamlang.

1 / 50Bilaman: 0Bilmayman: 0O'tkazildi: 0

Full-stack development nima?

Eng muhim full-stack developer suhbat savollari

Full-stack developer'lar zamonaviy dasturiy ta'minot jamoalarining tayanchi hisoblanadi: ular foydalanuvchilar ko'radigan qism bilan parda ortida ishlaydigan kuchli tizimlar o'rtasidagi bog'lanishni dadillik bilan o'rnatadi. Ular "shunchaki" frontend developer ham, "shunchaki" backend developer ham emas — ular butun spektrni qamrab oladi. Intuitiv interfeyslarni loyihalashdan tortib samarali veb-server mantiqini yaratishgacha bo'lgan ko'plab vazifalarni bir vaqtning o'zida uddalaydi, bu esa ularning rolini texnologiya sohasidagi eng ko'p qirrali — va eng muhim — rollardan biriga aylantiradi.

Agar full-stack lavozimiga intilayotgan bo'lsangiz, bularning barchasini uddalay oladigan ko'nikmalarga ega ekaningizni isbotlashingiz kerak bo'ladi. Shuning uchun biz eng ko'p beriladigan full-stack developer suhbat savollari bo'yicha ushbu qo'llanmani tayyorladik.

Agar bu ham yetarli bo'lmasa, siz amal qilishingiz mumkin bo'lgan to'liq full-stack yo'l xaritasi ham mavjud.

Endi qulay joylashib oling va boshlaymiz.

Full-stack suhbatiga tayyorgarlik

Full-stack developer suhbatiga kirishdan oldin quyidagi jihatlarni yodda tuting:

  1. Asosiy tushunchalarni o'zlashtiring: Full-stack development asoslari, jumladan frontend freymvorklari (React yoki Angular kabi), backend texnologiyalari (Node.js yoki Django kabi), RESTful API'lar va ma'lumotlar bazalari bilan yaqindan tanishing. Bu qismlarning birgalikda qanday ishlashini tushunish full-stack developer rolini egallashning kalitidir.
  2. Amaliy ko'nikmalarni mashq qiling: Full-stack development butunlay amaliy bilimga tayanadi, shuning uchun ko'nikmalaringizni sinovdan o'tkazing. Kichik loyiha yarating yoki mavjud loyihangizni takomillashtiring. REST API'lar yaratish, responsive UI'larni stillash yoki ma'lumotlar bazasini integratsiya qilishni mashq qiling. Qanchalik ko'p mashq qilsangiz, real hayotdagi muammolarni hal qilishda o'zingizni shunchalik ishonchli his qilasiz.
  3. Dasturiy ta'minot arxitekturasini o'rganing: Garchi siz system architect bo'lmasangiz ham, dasturiy ta'minot arxitekturasi tamoyillarini — masalan, MVC, microservices va event-driven design'larni — puxta tushunish katta ustunlik berishi mumkin. Bu tushunchalar zamonaviy veb-ilovalarda qanday qo'llanilishini muhokama qila olish sizni boshqalardan ajratib turadi.
  4. Kompaniya haqida ma'lumot to'plang: Suhbatga borayotgan kompaniyangizni doimo o'rganib chiqing. Ular har qanday dasturiy ta'minotni ishlab chiqishda (backend bo'ladimi yoki frontend) qaysi vositalar va texnologiyalardan foydalanishini, umumiy tech stack'ini hamda dasturiy ta'minot yaratishga yondashuvini aniqlang. Bu sizning chin dildan qiziqishingizni ko'rsatadi va suhbat davomida mazmunli savollar berishingizga yordam beradi.

Endi boshlashga tayyormiz — tayyorgarlik ko'rishingizga yordam beradigan eng ko'p beriladigan full-stack developer suhbat savollarini ko'rib chiqamiz!

Barcha savollar va javoblar

Boshlang'ich

Full-stack development nima?

Full-stack development — veb-ilova yoki veb-servisning ham frontend, ham backend qismini yaratish va qo'llab-quvvatlash amaliyoti. Full-stack developer ilovaning barcha qatlamlarida ishlaydi va foydalanuvchi interfeysidan tortib server va ma'lumotlar bazasigacha uzluksiz funksionallikni ta'minlaydi.

Full-stack development'ning asosiy yo'nalishlari quyidagilar:

  • Frontend development: Ilovaning foydalanuvchilar bevosita ishlaydigan qismlarini — tugmalar, formalar va layout'larni yaratishni o'z ichiga oladi. Ko'p ishlatiladigan vositalar va texnologiyalar qatoriga HTML, CSS, JavaScript hamda React, Angular yoki Vue.js kabi freymvorklar kiradi. Bunga yanada boy user experience uchun Progressive Web App'lar (PWA) yaratish ham kirishi mumkin.
  • Backend development: Frontend'ni harakatga keltiradigan server-side mantiq, ma'lumotlar bazalari va API'larga qaratilgan. Backend development uchun keng tarqalgan dasturlash tillari qatoriga Python, Java, Node.js va PHP kiradi. Dasturchilar ma'lumotlar bilan ishlash uchun ko'pincha veb-servislar yoki REST/GraphQL API'larni loyihalaydi va integratsiya qiladi.
  • Ma'lumotlar bazalari va ma'lumotlarni saqlash: Ma'lumotlarni relational (masalan, MySQL, PostgreSQL) yoki non-relational (masalan, MongoDB, Redis) ma'lumotlar bazalari orqali boshqarish.
  • DevOps va deployment: Ilovalarni deploy qilish va qo'llab-quvvatlash uchun hosting muhitlarini va CI/CD pipeline'larini sozlash hamda cloud xizmatlarini boshqarish.

Full-stack developer'lar ko'p qirraliligi va veb-ilovaning turli qismlari o'zaro qanday ishlashini tushuna olishi bilan qadrlanadi, bu esa ularni har tomonlama puxta va funksional mahsulotlarni yetkazib berishda juda muhim mutaxassisga aylantiradi.

Client-side va server-side dasturlash o'rtasidagi farqni tushuntiring

Client-side va server-side — foydalanuvchilarga funksionallikni yetkazib berish uchun birgalikda ishlaydigan veb-ilovaning ikki alohida qismi. Ularning vazifalarini tushunish samarali va tez javob beradigan ilovalar yaratish uchun juda muhim.

Client-Side
  • Nima qiladi: Bu ilovaning foydalanuvchi brauzerida ishlaydigan qismi. U foydalanuvchi interfeyslari va foydalanuvchi harakatlarini boshqaradi, ya'ni foydalanuvchilarga ilovani ko'rish va u bilan ishlash imkonini beradi.
  • Asosiy xususiyatlari:
    • Forma validatsiyasi, animatsiyalar va kontentni dinamik yangilash (DOM -Document Object Model- yangilanishlari orqali) kabi vazifalarni bajarish uchun JavaScript kodini bevosita brauzerda ishga tushiradi.
    • Uzluksiz vizual tajriba uchun HTML va CSS'ning render qilinishini boshqaradi.
    • Ma'lumotlarni asinxron tarzda olish yoki yuborish uchun ko'pincha server bilan REST (Representational State Transfer) API'lar orqali aloqa qiladi.
  • Misollar:
    • Popup oynani ko'rsatadigan JavaScript funksiyasini ishga tushiruvchi tugmani bosish.
    • Sahifani to'liq qayta yuklamasdan, fetch() yoki axios yordamida sahifaga qo'shimcha elementlarni yuklab olish.
Server-Side
  • Nima qiladi: Bu qism serverda ishlaydi va client'dan kelgan so'rovlarni qayta ishlaydi: ma'lumotlar bazasiga query'lar yuborish, biznes mantiqni bajarish va javoblarni qaytarish kabi vazifalarni bajaradi.
  • Asosiy xususiyatlari:
    • Python, Java yoki Node.js kabi server-side dasturlash tillarida yozilgan kodni ishga tushiradi.
    • Authentication va ma'lumotlarni saqlash kabi nozik amallarni xavfsiz tarzda bajaradi.
    • Render qilinishi uchun ma'lumotlarni client'ga tuzilmali formatlarda (masalan, JSON) REST API'lar orqali yuboradi.
  • Misollar:
    • Foydalanuvchi hisob ma'lumotlarini ma'lumotlar bazasida tekshirib, login so'rovini qayta ishlash.
    • Client dinamik ko'rsatishi uchun mahsulotlar ro'yxatini JSON formatida qaytarish.
Veb-dasturlashda HTML, CSS va JavaScript qanday vazifani bajaradi?
  • HTML: Veb-sahifaning tuzilmasi va kontentini belgilaydi.
  • CSS: Veb-sahifaga stil beradi (ranglar, layout, shriftlar).
  • JavaScript: Veb-sahifaga interaktivlik va dinamik xatti-harakat qo'shadi.
REST API nima va u nima uchun ishlatiladi?

REST API (Representational State Transfer Application Programming Interface) — ilovalarning muayyan tamoyillar to'plamiga amal qilgan holda HTTP orqali o'zaro aloqa qilishining standartlashtirilgan usuli. U client'larga (masalan, veb-brauzerlar yoki mobil ilovalarga) ma'lumotlarni olish yoki o'zgartirish kabi amallarni bajarish uchun serverlar bilan ishlash imkonini beradi.

REST API'ning asosiy xususiyatlari:

  1. Stateless aloqa: Client'dan serverga yuboriladigan har bir so'rov saqlangan session ma'lumotlariga tayanmasdan, server uni qayta ishlashi uchun zarur bo'lgan barcha ma'lumotlarni o'z ichiga olishi kerak.
  2. Resurslarga asoslangan: Ma'lumotlar va funksionallik endpoint'lar (URL'lar) orqali murojaat qilinadigan "resurslar" sifatida qaraladi.
    • Misol: foydalanuvchilar ro'yxatini olish uchun /users, muayyan foydalanuvchiga murojaat qilish uchun /users/1.
  3. HTTP metodlari: REST API'lar amallarni belgilash uchun HTTP metodlaridan foydalanadi:
    • GET: Ma'lumot olish.
    • POST: Yangi resurslar yaratish.
    • PUT: Mavjud resurslarni yangilash.
    • DELETE: Resurslarni o'chirish.
  4. Tuzilmali javoblar: Ma'lumotlar odatda JSON yoki XML kabi yengil formatda qaytariladi.

Nima uchun ishlatiladi?

  • Interoperability: REST API'lar turli tizimlar va platformalar o'rtasida aloqa qilish imkonini beradi, bu esa ularni veb-servislar yaratish uchun ideal qiladi.
  • Scalability: Ular stateless bo'lgani uchun horizontal scaling yordamida ko'proq trafikni ko'tara oladi.
  • Foydalanish qulayligi: Aniq tuzilma va standart convention'lar dasturchilarga ularni tushunish va joriy qilishni osonlashtiradi.
  • Moslashuvchanlik: Veb-ilovalardan tortib mobil va IoT qurilmalarigacha bo'lgan turli client'lar uchun mos keladi.
GET va POST HTTP metodlari o'rtasidagi farqni tushuntiring

Bu metodlarni aynan muayyan tarzda ishlatish shartligini belgilovchi qat'iy qoida bo'lmasa-da, hozirda qabul qilingan standartga ko'ra:

  • GET: Serverdan ma'lumot oladi (faqat o'qish uchun).
  • POST: Resurslarni yaratish yoki yangilash uchun serverga ma'lumot yuboradi.
HTML hujjatga CSS qanday ulanadi?

CSS'ni HTML'ga ulashning ikkita asosiy usuli bor: buni “inline” tarzda yoki “style” tegi yordamida qilishingiz mumkin.

Inline: HTML elementining ichiga to'g'ridan-to'g'ri style qo'shing.

<p style="color: red;">Hello</p>

Internal: <head> ichida <style> tegidan foydalaning.

<style>
p { color: red; }
</style>

External: <head> ichida <link> yordamida CSS faylini ulang.

<link rel="stylesheet" href="styles.css">
HTML'dagi div va span teglari nima uchun kerak?
  • <div>: Bu boshqa block-level elementlarni (layout yoki bo'limlarni) bir guruhga birlashtiradigan block-level element. U layout'ni belgilashda juda foydali.
  • <span>: Bu inline element matn node'lari kabi boshqa inline elementlarni guruhlash uchun juda qulay. <span > ishlatilganda kontentga hech qanday tuzilmaviy ta'sir ko'rsatmagani sababli, u matnni (yoki kattaroq matnning ayrim qismlarini) vizual jihatdan o'zgartirmasdan (qo'llanilgan CSS'dan tashqari) stillash uchun ayni muddao.
CSS selector'lari nima va ularning bir nechta turini ayta olasizmi?

CSS selector'lari — HTML hujjatdagi muayyan elementlarni tanlash va ularga stil berish uchun ishlatiladigan pattern'lar. Ular CSS qoidalari to'plami qaysi elementlarga qo'llanilishini belgilaydi, shu sababli veb-ilovalar va foydalanuvchi interfeyslari ko'rinishini loyihalashning asosiy qismi hisoblanadi.

CSS selector'lari nima uchun muhim

Selector'lar elementlarni aniq nishonga olish imkonini beradi, bu esa veb-saytingizning layout'i, ranglari, shriftlari va boshqa vizual jihatlarini boshqarishga yordam beradi. Ular tuzilmali va qo'llab-quvvatlash oson bo'lgan CSS kodini yozish uchun zarur.

Selector'lar nimani nishonga olishiga qarab turli turlarga bo'linadi:

  • Elementlar: bu selector'lar muayyan turdagi elementga murojaat qiladi va sahifadagi shu elementning barcha nusxalariga ta'sir qiladi. Misol: p {}
  • Class'lar: Bu selector'lar faqat mos class'ga ega elementlarga ta'sir qiladi. Ular bir xil turdagi elementlarning katta guruhlarini butun to'plamga ta'sir qilmasdan nishonga olish uchun juda qulay. Misol: .my-class {}
  • ID: ID darajasidagi selector'lar faqat bitta elementga ta'sir qiladi (chunki ID faqat bitta elementda ishlatilishi mumkin). Ular guruhning qolgan qismidan ajralib turadigan yagona element bo'lganda juda qulay. Misol: #my-id {}
  • Atribut: Atribut darajasidagi selector'lar elementlarni ularning atributlari qiymatiga qarab nishonga oladi. Ular elementlarni dinamik ravishda ajratib ko'rsatish kerak bo'lgan holatlar uchun juda qulay. Misol: [type="text"] {}
  • Descendant: Elementlarni nishonga olishning yana bir usuli — ularni parent elementga qarab tanlash. Bu usul yuqoridagilarning har qanday kombinatsiyasi bilan ishlaydi, shuning uchun, masalan, muayyan atribut qiymatiga ega elementning descendant'lari bo'lgan va muayyan class'ga ega elementlarni (yoki xayolingizga kelgan boshqa har qanday kombinatsiyani) nishonga olishingiz mumkin. Misol: div p {}
Selector'lardan qachon foydalanish kerak
  • Global stillash uchun type selector'lardan foydalaning.
  • Bir nechta elementda qayta ishlatiladigan stillar uchun class selector'lardan foydalaning.
  • ID selector'lardan yagona elementlar uchun va kam miqdorda foydalaning.
  • Batafsil nazorat va qo'llab-quvvatlashni osonlashtirish uchun selector'larni birlashtiring.

CSS selector'lari veb-ilovangiz dizaynining har bir jihatini boshqarish imkoniyatini beradi va foydalanuvchi interfeyslaringiz izchil, ko'rinishdan jozibali va responsive bo'lishini ta'minlaydi.

JavaScript DOM'ni qanday o'zgartiradi?

JavaScript DOM'ga quyidagi kabi metodlar yordamida murojaat qiladi va uni o'zgartiradi:

  • Elementlarni olish: document.getElementById("id"), querySelector(".class").
  • Kontentni o'zgartirish: element.innerHTML = "New Content".
  • Stillarni o'zgartirish: element.style.color = "blue".
  • Elementlarni qo'shish/o'chirish: appendChild(), removeChild().
JavaScript'da == va === o'rtasida qanday farq bor?
  • ==: Qiymatlarni bir-biri bilan bevosita solishtiradi, zarur bo'lsa, avval type conversion'ni bajaradi (misol: '5' == 5 → true).
  • ===: Bu operator qiymatlar va type'larni bir-biri bilan qat'iy solishtiradi. Bu operatorda hech qanday type conversion bajarilmaydi. Masalan, string va number'ni solishtirmoqchi bo'lsangiz, natija har qanday holatda ham false bo'ladi: '5' === 5 → false.
Relational va non-relational ma'lumotlar bazalari o'rtasida qanday farq bor?
  • Relational: Ma'lumotlarni satr va ustunlardan iborat tuzilmali jadvallarda saqlaydi (masalan, MySQL, PostgreSQL). Relationship'lar va murakkab query'lar uchun yaxshi.
  • Non-relational: Ma'lumotlarni document'lar, key-value juftliklari yoki graph'lar kabi moslashuvchan formatlarda saqlaydi (masalan, MongoDB, Redis). Tuzilmaga ega bo'lmagan yoki ierarxik ma'lumotlar uchun qulayroq.
Veb-ilovada foydalanuvchi authentication'ini qanday amalga oshirgan bo'lardingiz?

Authentication'ni amalga oshirishning oddiy auth'dan tortib oAuth'gacha bo'lgan ko'plab usullari bor. To'g'ri variant sizning muayyan biznes ehtiyojlaringizga bog'liq.
Klassik misol — veb-saytni RESTful API bilan authenticate qilish uchun JWT'dan quyidagi jarayon bo'yicha foydalanish:

  1. Frontend: Foydalanuvchidan hisob ma'lumotlarini olish uchun login formasini ko'rsating.
  2. Backend: Hisob ma'lumotlarini ma'lumotlar bazasidagi yozuvlar bilan solishtirib tekshiring va agar ular to'g'ri bo'lsa, imzolangan token yarating hamda uni javobda qaytaring.
  3. Xavfsiz ulanish: Shu paytdan boshlab frontend har bir so'rovda token'ni yuboradi, backend esa foydalanuvchi haqiqiy va authenticate qilingan ekaniga ishonch hosil qilish uchun uni tekshiradi.
  4. Xavfsizlik bo'yicha eng yaxshi amaliyotlar: Parollaringiz hash qilinganiga (masalan, bcrypt yordamida) ishonch hosil qiling va ma'lumotlarni xavfsiz uzatish kanali uchun HTTPS'dan foydalaning.
Node.js loyihasida package.json nima uchun kerak?

Node.js loyihasidagi package.json fayli bir nechta vazifani bajaradi. U loyihaning nomi, versiyasi va tavsifi kabi metadata'sini belgilaydi. Shuningdek, unda ilovani ishga tushirish yoki ishlab chiqish uchun zarur bo'lgan dependencies va devDependencies ro'yxati, hamda ilovani build qilish, testlash yoki ishga tushirish kabi vazifalar uchun skriptlar (va siz qo'shmoqchi bo'lgan har qanday custom skript) keltiriladi.

Va nihoyat, u npm install buyrug'iga bir xil dependency'larni yuklab olish imkonini berib, takrorlanuvchan o'rnatishlarni ta'minlaydi — bu esa loyihangizni boshqa tizimlarga osongina ko'chirishingizga yordam beradi.

Node.js ilovasini ma'lumotlar bazasiga qanday ulab, asosiy CRUD amallarini bajargan bo'lardingiz?

Umumiy olganda, Node.js yordamida ma'lumotlar bazasiga ulanish quyidagi bosqichlarni talab qiladi:

  1. Ma'lumotlar bazasi driver'ini o'rnating.
  2. Driver yordamida ma'lumotlar bazasiga ulaning.
  3. Qaytarilgan connection obyekti orqali so'rovlar yuboring.

Albatta, siz tanlagan ma'lumotlar bazasi engine'iga qarab bu bosqichlarda biroz farqlar bo'lishi mumkin.
Shunday bo'lsa-da, MongoDB yoki PostgreDB misolida ular bilan Node.js orqali qanday ishlashni ko'rib chiqaylik:

Ma'lumotlar bazasi driver'ini o'rnating

Birinchi navbatda ma'lumotlar bazasi bilan bevosita ishlash imkonini beradigan driver'ni yoki bu ulanishni abstraksiya qilib, sizga yuqoriroq darajadagi abstraction qatlamini taqdim etadigan ORM'ni o'rnatishingiz kerak.
Ma'lumotlar bazangizga mos driver'dan foydalaning.

  • MongoDB uchun: npm install mongoose
  • PostgreSQL uchun: npm install pg
Ma'lumotlar bazasiga ulaning

Endi haqiqiy ma'lumotlar bazasiga ulanish uchun kodni siz foydalanayotgan ulanish usuliga moslashtirishingiz kerak bo'ladi. Keling, MongoDB yoki PostgreDB'ga qanday ulanishni batafsilroq ko'rib chiqaylik.

MongoDB:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/mydb', { useNewUrlParser: true, useUnifiedTopology: true });

PostgreSQL:

const { Pool } = require('pg');
const pool = new Pool({ user: 'user', host: 'localhost', database: 'mydb', password: 'password', port: 5432 });
CRUD amallarini bajaring

CRUD (Create, Read, Update & Delete) uchun kod siz foydalanayotgan texnologiyaga qarab o'zgaradi. Bizning misollarimizdan biri ORM'dan foydalanadi, ya'ni native query tili ustida abstraction qatlami mavjud; ikkinchisi esa oddiy SQL driver bo'lib, unda SQL query'larni bevosita o'zimiz yozishimiz kerak.

Create amali:

MongoDB:

const User = mongoose.model('User', { name: String });
User.create({ name: 'John Doe' });

PostgreSQL:

pool.query('INSERT INTO users (name) VALUES ($1)', ['John Doe']);

Read amali:

MongoDB:

User.find({}, (err, users) => console.log(users));

PostgreSQL:

pool.query('SELECT * FROM users', (err, res) => console.log(res.rows));

Update amali:

MongoDB:

User.updateOne({ name: 'John Doe' }, { name: 'Jane Doe' });

PostgreSQL:

pool.query('UPDATE users SET name = $1 WHERE name = $2', ['Jane Doe', 'John Doe']);

Delete amali:

MongoDB:

User.deleteOne({ name: 'Jane Doe' });

PostgreSQL:

pool.query('DELETE FROM users WHERE name = $1', ['Jane Doe']);
Environment variable'lar nima va ular qanday ishlatiladi?

Environment variable'lar konfiguratsiya qiymatlarini (masalan, API kalitlari, ma'lumotlar bazasi URL'lari) codebase'dan tashqarida saqlaydi. Bu ikki asosiy sababga ko'ra muhim:

  1. Xavfsizlik. Bu qiymatlarni (ular odatda maxfiy bo'ladi) codebase'dan chiqarib olish orqali, kod sizib chiqqan taqdirda ham bu jiddiyroq xavfsizlik muammosiga aylanishining oldini olasiz.
  2. Moslashuvchanroq deployment'lar. Agar bu qiymatlarni o'zgartirish kerak bo'lsa, ular environment variable sifatida saqlangani uchun kodni qayta deploy qilishingiz shart emas — shunchaki qiymatlarni qayta yuklash kifoya (ilovani qayta ishga tushirish yoki qiymatlarni fayldan hot reload qilish orqali).

Amalda buni joriy qilish uchun loyihaning lokal papkasidagi .env faylidan environment variable'larni yuklaydigan dotenv moduli kabi vositadan foydalanish yoki bu qiymatlarni tashqi xavfsiz xotirada saqlaydigan AWS Secret Manager kabi secret manager bilan ishlash mumkin.

O'rta

Responsive design tushunchasini tushuntiring. Uni qanday amalga oshirgan bo'lardingiz?

Responsive design veb-saytning layout'ini turli ekran o'lchamlariga moslashtirish orqali uning barcha qurilmalarda yaxshi ko'rinishini ta'minlaydi.

Bunga erishish uchun moslashuvchan grid'lardan (CSS Grid yoki Flexbox) foydalanishingiz mumkin.

Shuningdek, oyna kengligiga qarab turli stillar qo'llanilishi kerak bo'lgan breakpoint'larni belgilashga yordam beradigan media query'lardan ham foydalanishingiz kerak bo'ladi:

@media (max-width: 768px) {
  .container { flex-direction: column; }
}

Qiymatlar container o'lchamiga avtomatik moslashishi uchun qat'iy birliklar (px) o'rniga nisbiy birliklardan (%, em, rem) ham foydalanishingiz mumkin.

Flexbox va CSS Grid o'rtasida qanday farq bor?

Flexbox: Bir o'lchamli layout'lar (qator yoki ustun) uchun mo'ljallangan. Container ichidagi elementlarni tekislash uchun eng mos keladi. Qo'llanilish misollari: navigatsiya panellari yoki elementlarni markazga joylashtirish.

CSS Grid: Ikki o'lchamli layout'lar (qatorlar va ustunlar) uchun mo'ljallangan. Murakkab, grid'ga asoslangan layout'lar yaratish uchun eng mos keladi. Qo'llanilish misollari: to'liq sahifali layout'lar yoki dashboard'lar.

React hook'lari nima va ular nima uchun ishlatiladi?

React hook'lari — functional component'larda state va React'ning boshqa imkoniyatlaridan foydalanish imkonini beradigan funksiyalar.

Hook'lar yordamida class component'larga ehtiyoj sezmasdan state va lifecycle boshqaruvini soddalashtirishingiz mumkin. Ular, shuningdek, custom hook'lar orqali kodni qayta ishlatish imkonini beradi.

Turli hook'larga misollar:

  • useState — state'ni boshqarish uchun.
  • useEffect — side effect'lar bilan ishlash uchun (masalan, ma'lumotlarni olish).
  • useContext — global state uchun.
React ilovalarida state management qanday ishlaydi?

React'da state ichidagi ma'lumotlarning scope'iga qarab state bilan ishlashning ikki xil usuli bor.

Agar scope lokal bo'lsa, uni component'ning o'zida oddiy useState hook'i orqali boshqarishingiz mumkin.

Aksincha, ko'plab component'lar foydalana oladigan global state'ni saqlash kerak bo'lsa, Context API kabi vositadan yoki Redux, MobX yoki Zustand kabi maxsus state kutubxonalaridan foydalanishingiz mumkin.

React'da state bilan ishlash (umumiy olganda) quyidagicha kechadi:

  • State action'lar orqali yangilanadi (masalan, event handler'lar).
  • Yangilangan state o'zgarishlarni UI'da aks ettirish uchun re-render'larni ishga tushiradi.
  • Context'ni optimallashtirish yoki memoization'dan (React.memo, useMemo) foydalanish orqali ortiqcha re-render'larning oldini oling.
React ilovasining unumdorligini qanday optimallashtirgan bo'lardingiz, tushuntiring

React ilovasining unumdorligiga ko'plab omillar ta'sir qilishi mumkin, ammo ulardan eng keng tarqalganlari va ularni bartaraf etish usullari quyidagilar:

  1. Re-render'larni kamaytiring:
    • Keraksiz yangilanishlarning oldini olish uchun React.memo va useCallback'dan foydalaning.
    • Katta component'larni kichikroq, bitta vazifaga yo'naltirilgan component'larga ajrating.
  2. Lazy Loading: React.lazy va Suspense yordamida component'lar yoki route'larni talab bo'yicha yuklang.
  3. Samarali state management: Iloji boricha state'ni lokal saqlang va global state'dan haddan tashqari ko'p foydalanmang.
  4. DOM yangilanishlarini kamaytiring: Ro'yxatlarda key'lardan foydalaning va chuqur ichma-ich joylashgan props/state yangilanishlaridan qoching.
  5. Code Splitting: Bundle'ni bo'lish uchun Webpack yoki react-loadable kabi vositalardan foydalaning.
  6. Profiling va debugging: Bottleneck'larni aniqlash uchun React Developer Tools'dan foydalaning.
Node.js va Express kontekstida middleware nima?

Express'da middleware — ilovaning request-response cycle'ida so'rov va javoblarni qayta ishlaydigan funksiya. U request/response obyektlarini o'zgartirish, ya'ni ularga qo'shimcha ma'lumot qo'shish yoki keraksiz ma'lumotlarni olib tashlash uchun ishlatilishi mumkin; u kodni bajara oladi (masalan, logging, JSON'ni parse qilish va h.k.), shuningdek request-response cycle'ni yakunlab, jarayonni o'rtada to'xtatishi va boshqa javob qaytarishi mumkin (bu odatda noto'g'ri yoki ruxsatsiz so'rovlarni qayta ishlashda qo'llaniladi).

Misol:

app.use((req, res, next) => {
  console.log('Middleware triggered');
  next();
});
JavaScript'da asinxron kodni qanday boshqarasiz?

JavaScript API'dan ma'lumot olish yoki fayllarni o'qish kabi asinxron amallarni turli paradigmalar orqali boshqaradi: callback'lar, promise'lar va async/await. Ularning har biri o'ziga xos afzallik va qiyinchiliklarga ega. Keling, batafsil ko'rib chiqamiz:

1. Callback'lar

Bu nima:
Callback — boshqa funksiyaga argument sifatida uzatiladigan va keyinroq, odatda asinxron vazifa tugagandan so'ng bajariladigan funksiya.

Misol:

fs.readFile('file.txt', (err, data) => {
  if (err) {
    console.error('Error reading file:', err);
    return;
  }
  console.log('File content:', data.toString());
});

Qiyinchiliklar:

Callback Hell: Vazifalar murakkablashgani sari callback'larni bir-birining ichiga joylashtirish o'qish va qo'llab-quvvatlash qiyin bo'lgan kodga olib keladi.

doTask1(() => {
  doTask2(() => {
    doTask3(() => {
      console.log('All tasks done!');
    });
  });
});
2. Promise'lar

Bu nima:
Promise — hozir, kelajakda yoki umuman mavjud bo'lmasligi mumkin bo'lgan qiymatni ifodalaydi; bu qiymat odatda asinxron amal natijasida hosil bo'ladi. Promise asinxron amallarni boshqarishning tozaroq usulini taqdim etadi: amallar .then() orqali zanjir qilib bog'lanadi, xatolar esa .catch() bilan ushlanadi.

Misol:

fetch('https://api.example.com/data')
  .then((response) => response.json())
  .then((data) => {
    console.log('Fetched data:', data);
  })
  .catch((error) => {
    console.error('Error fetching data:', error);
  });

Afzalliklari:

  • Bir-birining ichiga chuqur joylashgan callback'larga barham beradi.
  • Asinxron workflow'larni boshqarish uchun aniqroq tuzilma beradi.
3. Async/Await

Bu nima:
Async/await promise'lar ustiga qurilgan, ammo bunday kodni boshqarish uchun sinxron kodga o'xshashroq va o'qilishi oson sintaksisni taqdim etadi.

async bilan e'lon qilingan funksiyalar avtomatik ravishda promise qaytaradi, await kalit so'zi esa promise resolve bo'lguncha bajarilishni to'xtatib turadi.

Misol:

const fetchData = async () => {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log('Fetched data:', data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
};

fetchData();

Afzalliklari:

  • Sinxron kod kabi o'qiladi, shuning uchun uni tushunish osonroq.
  • try/catch bloklari yordamida xatolarni qayta ishlashni soddalashtiradi.
Relational ma'lumotlar bazalarida relationship'lar qanday boshqarilishini tushuntiring
  1. One-to-Many: Bir jadvaldagi bitta yozuv boshqa jadvaldagi bir nechta yozuv bilan bog'lanadi. Foreign key'lar orqali amalga oshiriladi. Misol: bitta user ko'plab posts yozuvlariga ega.
  2. Many-to-Many: Ikki jadval yozuvlarini bog'lash uchun join table talab qilinadi. Misol: oraliq enrollments jadvali orqali bog'langan students va courses.
  3. Primary/Foreign Keys: Query'lar yozish va data consistency'ni ta'minlash uchun jadvallar o'rtasida bog'lanish o'rnatadi.
REST API'da pagination'ni qanday amalga oshirgan bo'lardingiz?

RESTful API'ga pagination qo'shishning bir nechta usuli bor, ammo standart implementatsiyani nazarda tutsak, eng yaxshi variant — query parametrlaridan foydalanish.

Query parametrlari: limit va offset (yoki page va size) yordamida.

GET /api/items?limit=10&offset=20

Backend implementatsiyasi:

Backend'da biz bu query param'larni quyidagiga o'xshash ko'rinishga o'tkazamiz:

SQL kodi:

SELECT * FROM items LIMIT 10 OFFSET 20;

Kodda:

const items = await db.find().skip(offset).limit(limit);
res.json({ data: items });
Metadata

Yaxshiroq UX uchun javobga umumiy sonni va joriy sahifani qo'shing.

{ 
  "data": [...], 
  "total": 100,
  "page": 3,
  "size": 10 
}
Authentication va authorization usullari yordamida API'ni qanday himoyalagan bo'lardingiz, tasvirlab bering

Authorization va authentication bir-birini takrorlamaydi: ular ilovangiz xavfsizligining ikki butunlay alohida bosqichini anglatadi.

Authentication

Bir tomonda authentication turadi — u foydalanuvchining shaxsini tekshirishga javob beradi. Buning uchun token'lar (masalan, JWT, OAuth) yoki session'lardan foydalanishingiz mumkin.

Misol: header'larda yuborilgan JWT'ni tekshirish:

const token = req.headers['authorization'];
jwt.verify(token, secretKey, (err, decoded) => { ... });
Authorization

Authentication'dan o'tgach, foydalanuvchilar resurslarga kirish uchun authorization'dan ham o'tishi kerak. Buning ishlashi uchun foydalanuvchilaringiz uchun rollar va ruxsatlarni belgilab chiqishingiz kerak bo'ladi.

Middleware misoli:

app.use((req, res, next) => {
  if (req.user.role !== 'admin') return res.status(403).send('Forbidden');
  next();
});
Eng yaxshi amaliyotlar
  • Brauzer va server o'rtasida xavfsiz kanalni ta'minlash uchun HTTPS'dan foydalaning.
  • Injection attack'larning oldini olish uchun input'ni validatsiya qiling.
  • API'laringiz potensial hujumchilar tomonidan haddan tashqari yuklanib qolmasligi uchun API so'rovlariga rate limit qo'llang.
  • Maxfiy ma'lumotlarni xavfsiz saqlang (masalan, parollarni hash ko'rinishida).
Version control tizimining vazifasini va Git workflow'ni tushuntiring

Vazifasi: Version control koddagi o'zgarishlarni kuzatib boradi, hamkorlikda ishlash imkonini beradi va oldingi versiyalarga qaytishga yo'l ochadi.

Git workflow misoli:

  1. Repository'ni clone qiling: git clone <repo_url>.
  2. Branch yarating: git checkout -b feature-branch.
  3. O'zgarishlar kiriting va ularni stage qiling: git add ..
  4. O'zgarishlarni commit qiling: git commit -m "Add feature".
  5. Remote'ga push qiling: git push origin feature-branch.
  6. Review uchun pull request yarating.
  7. Tasdiqlangandan so'ng branch'ni main branch'ga merge qiling.
WebSocket'lar nima va ular HTTP so'rovlardan qanday farq qiladi?

WebSockets: Client va server o'rtasida bitta doimiy ulanish orqali full-duplex aloqa o'rnatish uchun mo'ljallangan protokol.

Farqi:

  • HTTP: Request-response modeli; har bir o'zaro aloqani client boshlaydi.
  • WebSockets: Doimiy ulanish bo'lib, real-time, ikki tomonlama aloqa imkonini beradi (masalan, jonli chat, bildirishnomalar).

Misol:

  • HTTP: Yangi xabarlarni olish uchun qayta-qayta so'rov yuboriladi (polling).
  • WebSocket: Server yangi xabarlarni kelishi bilanoq push qiladi.
MVC arxitekturasi tushunchasini tasvirlab bering

MVC — kodni uchta qatlamga ajratib tashkil qilish uchun ishlatiladigan design pattern:

  1. Model: Ma'lumotlar va biznes mantiq bilan ishlaydi (masalan, ma'lumotlar bazasi bilan o'zaro aloqa).
  2. View: Ma'lumotlarni foydalanuvchilarga ko'rsatadi (masalan, HTML, template'lar).
  3. Controller: Foydalanuvchi kiritgan ma'lumotlarni boshqaradi va Model bilan View o'rtasidagi aloqani ta'minlaydi.

Jarayon:

  • Foydalanuvchi View bilan ishlaydi → Controller kiritilgan ma'lumotni qayta ishlaydi → Model yangilanadi → O'zgarishlar View'da aks etadi.
CORS nima va veb-ilovada u bilan qanday ishlaysiz?

CORS (Cross-Origin Resource Sharing) boshqa origin'dagi (domain, protokol yoki port) resurslarga kirishni boshqaradi.

CORS bilan ishlash:

Backend: Muayyan origin'larga ruxsat beruvchi header'larni o'rnating.
Express'dagi misol:

const cors = require('cors');
app.use(cors({ origin: 'https://example.com' }));

Frontend: Ishlab chiqish jarayonida CORS muammolariga duch kelmaslik uchun API so'rovlarini proxy orqali yo'naltiring.

API'larni testlash uchun Postman'dan qanday foydalanasiz?
  1. So'rov yarating: API endpoint'i, metod (GET, POST va h.k.) va header'larni kiriting.
  2. Ma'lumot yuboring:
    • Query param'lar, body (JSON, form data) yoki header'larni qo'shing.
  3. So'rovni yuboring: Javobni ko'rish uchun "Send" tugmasini bosing.

Assertion'lar: Javoblarni avtomatik tekshiradigan skriptlar (JavaScript) yozish uchun Tests tab'idan foydalaning.
Misol:

pm.test("Status is 200", () => {
  pm.response.to.have.status(200);
});
  1. Collection'lar: Workflow'lar yoki muhitlarni testlash uchun so'rovlarni guruhlang.

Murakkab

Full-stack ilovani cloud provider'ga qanday deploy qilgan bo'lardingiz?

Full-stack ilova bir yoki bir nechta veb-sahifa, backend (odatda microservices'dan iborat) va qandaydir storage engine'dan (ya'ni ma'lumotlar bazasidan) tashkil topadi.
Bularning barchasini birgalikda deploy qilish uchun quyidagilarni bajarishingiz kerak:

  1. Ilovani tayyorlang: Frontend'ni build qiling (masalan, npm run build yordamida). Backend production'ga tayyor ekaniga ishonch hosil qiling (masalan, environment variable'lar, ma'lumotlar bazasi sozlamalari).
  2. Frontend'ni deploy qiling: Kodni serverlarga push qiling — statik fayllarni host qilish uchun odatda AWS S3, GCP Cloud Storage yoki Firebase Hosting kabi xizmatlar ishlatiladi. Kerak bo'lsa, statik kontent uchun CDN'ni (masalan, CloudFront) sozlang.
  3. Backend'ni deploy qiling: AWS EC2, GCP Compute Engine kabi cloud xizmatlaridan yoki AWS Elastic Beanstalk kabi managed platformadan foydalaning. Environment variable'larni sozlang va ma'lumotlar bazasiga ulaning (masalan, RDS, Cloud SQL).
  4. Ma'lumotlar bazasi: Scalability uchun managed ma'lumotlar bazasi xizmatidan (masalan, RDS, Firestore) foydalaning yoki serveringizda on-prem ma'lumotlar bazasini deploy qiling.
  5. DNS va SSL: AWS Route 53, GCP Domains yoki boshqa provayder yordamida custom domain va HTTPS'ni sozlang.
Webpack yoki Vite kabi build tool'lar nima uchun kerak?

Build tool'lar kodingizni bundle qiladi, optimallashtiradi va deployment'ga tayyorlaydi.

Asosiy vazifalari:

  • JavaScript, CSS va boshqa asset'larni bundle qilish.
  • Tezroq yuklanishi uchun fayllarni minify qilish va optimallashtirish.
  • Hot module replacement kabi imkoniyatlarni yoqish (ishlab chiqish jarayonida).
  • Zamonaviy JavaScript bilan ishlash (ES6+ kodni eski versiyalarga transpile qilish).
Ham frontend'da, ham backend'da yuzaga keladigan muammoni qanday debug qilasiz?
  1. Muammoni qayta hosil qiling: U qachon va qayerda yuz berishini aniqlang.
  2. Frontend debugging:
    • Tarmoq so'rovlarini ko'zdan kechirish uchun brauzer DevTools'idan foydalaning (masalan, HTTP status kodlari va payload'larni tekshiring).
    • Muammo sababiga ishora beruvchi console xatolarini ko'rib chiqing.
  3. Backend debugging:
    • Xatolarni aniqlash uchun server log'larini yoki so'rovga oid trace log'larni tekshiring.
    • Breakpoint'lar qo'ying yoki debugger'dan foydalaning (masalan, Node.js Inspector).
  4. Aloqa nuqtasi: API endpoint'lari, payload tuzilmasi va ma'lumotlar formatini tekshiring.
  5. End-to-End Testing: Muammoga sabab bo'layotgan qatlamni ajratib olish uchun workflow'ni Postman kabi vositalar bilan testlang.
Ishlab chiqish va deployment jarayonida Docker'ning rolini tushuntiring

Docker ilovalar va ularning dependency'larini container'larga joylashtiradi hamda ularning turli muhitlarda bir xil ishlashini ta'minlaydi.

Ishlab chiqishda:

  • Izolyatsiyalangan muhitlarni taqdim etadi (masalan, turli loyihalar uchun).
  • Onboarding'ni soddalashtiradi (masalan, dependency'larni qo'lda o'rnatish shart emas).

Deployment'da:

  • Dev va production o'rtasida bir xil muhitni ta'minlaydi.
  • Scalability uchun orchestration vositalari (masalan, Kubernetes) bilan integratsiyalashadi.

Dockerfile misoli:

FROM node:14
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
Veb-ilovada real-time yangilanishlarni qanday amalga oshirgan bo'lardingiz?
  1. WebSocket'lardan foydalaning: Real-time aloqa uchun doimiy ulanish o'rnating.

Client misoli:

const socket = new WebSocket('ws://server.com');
socket.onmessage = (message) => console.log(message.data);
  1. Serverni sozlash: WebSocket'larni boshqarish uchun socket.io kabi kutubxonalardan foydalaning.

Server misoli:

const io = require('socket.io')(server);
io.on('connection', (socket) => {
  socket.on('chat message', (msg) => io.emit('chat message', msg));
});
  1. Moslik uchun fallback: Agar WebSocket'lardan foydalanishning imkoni bo'lmasa, long polling yoki server-sent events (SSE) usulini joriy qiling.
  2. Ma'lumotlar bazasi integratsiyasi: Ko'p serverli konfiguratsiyalarda scalability uchun Redis pub/sub kabi event-driven yechimlardan foydalaning.
  3. Xavfsizlik: WebSocket ulanishlari xavfsiz (wss://) bo'lishini ta'minlang va foydalanuvchilarni authenticate qiling.
React asosidagi ilovaning SEO'sini yaxshilash uchun qanday strategiyalar bor?
  1. Server-Side Rendering (SSR): Qidiruv tizimlari sahifalarni yaxshiroq crawl qila olishi uchun Next.js kabi freymvorklar yordamida sahifalarni serverda render qiling.
  2. Meta tag'lar: react-helmet kabi kutubxonalar yordamida sarlavhalar, tavsiflar va kalit so'zlarni dinamik belgilang.
  3. Sitemap va Robots.txt: Qidiruv tizimlari uchun sitemap.xml yarating va robots.txt'ni sozlang.
  4. Lazy Loading: Above-the-fold kontent tez yuklanishini ta'minlang.
  5. Structured Data: Rich search result'lar uchun JSON-LD qo'shing.
  6. Canonical URL'lar: To'g'ri canonical tag'lar yordamida duplicate content muammolarining oldini oling.
Zamonaviy React ilovasida server-side rendering'ni qanday amalga oshirgan bo'lardingiz?

Eng oson yo'l — SSR'ni o'zida qo'llab-quvvatlaydigan Next.js kabi freymvorkdan foydalanish.

Bosqichlar:

  1. So'rov vaqtida ma'lumotlarni olish uchun sahifalarni getServerSideProps bilan sozlang:
export async function getServerSideProps() {
  const data = await fetch('https://api.example.com');
  return { props: { data } };
}
  1. Sahifani server-side render qiling va uni client'ga HTML ko'rinishida yuboring.
  2. Sahifani interaktiv qilish uchun uni client'da hydrate qiling.
Code splitting nima va u unumdorlikni qanday oshiradi?

Code splitting katta ilovani faqat kerak bo'lganda yuklanadigan kichikroq bundle'larga bo'ladi.

Afzalliklari:

  • Faqat zarur kodni yuklab, qolganini kerak bo'lganda yuklab olish orqali dastlabki yuklanish vaqtini qisqartiradi.
  • Veb-ilovadan ancha tezroq foydalanish imkonini berib, sekin tarmoqlarda unumdorlikni oshiradi.

React'ning lazy va Suspense yordamidagi misol:

const LazyComponent = React.lazy(() => import('./Component'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  );
}
Frontend ilovalarda memory leak'lar bilan qanday kurashish kerakligini tushuntiring

Memory leak'lar odatda ishlatilmayotgan resurslar (masalan, DOM elementlari, event listener'lar yoki ma'lumotlar tuzilmalari) to'g'ri bo'shatilmaganda yuz beradi va xotiraning keraksiz sarflanishiga olib keladi.

Keng tarqalgan yechimlar:

  1. Event listener'larni tozalang: Component'lar unmount bo'lganda listener'larni olib tashlang:
useEffect(() => {
  window.addEventListener('resize', handler);
  return () => window.removeEventListener('resize', handler);
}, []);
  1. Fetch so'rovlarini bekor qiling: Kutilayotgan API chaqiruvlarini bekor qilish uchun AbortController'dan foydalaning:
const controller = new AbortController();
fetch(url, { signal: controller.signal });
return () => controller.abort();
  1. Stale reference'lardan qoching: Component state'ini tekshirish orqali unmount'dan keyin state yangilanishlari davom etmasligini ta'minlang.

  2. Profiling vositalaridan foydalaning: Leak'larni aniqlash uchun brauzer DevTools'i yordamida xotira sarfini kuzating va tahlil qiling.

Full-stack ilovada internationalization'ni qanday amalga oshirgan bo'lardingiz?

Frontend: Tarjimalarni boshqarish uchun react-intl yoki i18next kabi kutubxonalardan foydalaning.

Misol:

import { useTranslation } from 'react-i18next';
const { t } = useTranslation();
<h1>{t('welcome_message')}</h1>;

Backend:

  1. Tarjimalarni ma'lumotlar bazasida yoki JSON fayllarda saqlang.
  2. Foydalanuvchi afzalliklari yoki Accept-Language header'lariga qarab to'g'ri til faylini qaytaring.

Qo'shimcha jihatlar:

  • Tilga xos route'larni qo'llab-quvvatlang (masalan, /en/home, /fr/home)
  • Ma'lumotlar bazasi yoki CMS'dagi kontentni dinamik tarjima qiling
  • Tarjima mavjud bo'lmasa, fallback tillarni taqdim eting
  • Tillar almashinishini va arab tili kabi RTL tillar uchun matnning to'g'ri tekislanishini testlang
Microservices arxitekturasini qanday loyihalab, amalga oshirgan bo'lardingiz, tushuntiring
  1. Ilovani qismlarga ajrating: Alohida biznes domain'larni aniqlang va funksionallikni kichik, loosely coupled servislarga bo'ling.

  2. Servislar o'rtasidagi aloqa:

    • Sinxron aloqa uchun API'lardan (REST yoki GraphQL) foydalaning
    • Asinxron aloqa uchun messaging tizimlaridan (masalan, RabbitMQ, Kafka) foydalaning
  3. Mustaqil ma'lumotlar omborlari: Mustaqillikni ta'minlash uchun har bir servis o'z ma'lumotlar bazasini o'zi boshqaradi.

  4. Service Discovery: Servislarning joylashuvini dinamik boshqarish uchun Consul yoki Eureka kabi registry'dan foydalaning.

  5. Deployment:

    • Servislarni Docker yordamida container'lashtiring
    • Kubernetes yordamida orchestration qiling
  6. Monitoring: Observability va debugging uchun Prometheus, Grafana yoki ELK Stack kabi vositalardan foydalaning.

High availability va scalability'ni ta'minlash uchun qanday strategiyalar bor?

High Availability:

  • Trafikni bir nechta server o'rtasida taqsimlash uchun load balancer'lardan foydalaning
  • Failover tizimlari va bir nechta availability zone yordamida redundancy'ni ta'minlang
  • Disaster recovery uchun replica'larga ega managed ma'lumotlar bazalaridan foydalaning

Scalability:

  • Ko'proq instance qo'shish orqali horizontal scaling'ni joriy qiling
  • AWS Auto Scaling yoki Kubernetes kabi auto-scaling xizmatlaridan foydalaning
  • Tez-tez murojaat qilinadigan ma'lumotlarni keshlang (masalan, Redis yoki Memcached yordamida)

Boshqa eng yaxshi amaliyotlar:

  • Ma'lumotlar bazasi query'larini optimallashtiring va indexing'dan foydalaning
  • Yuklama keskin oshgan paytlarni boshqarish uchun rate limiting va throttling'ni joriy qiling
Production tizimlarda database migration'larni qanday boshqarasiz?
  1. Version control: Migration'larni Flyway, Liquibase yoki Sequelize kabi vositalar yordamida kuzatib boring.

  2. Xavfsiz migration skriptlarini yozing:

    • Ustunlarni darhol o'chirib tashlash kabi destructive o'zgarishlardan qoching
    • Migration'larni faqat yangi narsa qo'shadigan bosqichlarga bo'ling:
      • Yangi ustunlar qo'shing
      • Ma'lumotlarni backfill qiling
      • Eski ustunlarni keyinroq o'chiring
  3. Testlash:

    • Migration'larni production ma'lumotlarining nusxasi bilan staging muhitida testlang
  4. Rollback rejalari:

    • Muvaffaqiyatsizlik yuz berganda migration'larni bekor qilish uchun skriptlar yozing
  5. Zero-Downtime Deployment:

    • Silliq o'tishni ta'minlash uchun dual write va feature flag'lar kabi usullardan foydalaning
GraphQL nima va u REST'dan qanday farq qiladi?

GraphQL — API'lar uchun mo'ljallangan query tili bo'lib, u client'larga aynan o'zlariga kerakli ma'lumotlarni so'rash imkonini beradi va shu orqali over-fetching yoki under-fetching'ni kamaytiradi.

REST'dan asosiy farqlari:

Data fetching:

  • REST: Qat'iy belgilangan endpoint'lar oldindan belgilangan ma'lumotlarni qaytaradi
  • GraphQL: Moslashuvchan query'larga ega yagona endpoint

Batching:

  • GraphQL bog'liq ma'lumotlarni bitta so'rovda olishi mumkin (nested query'lar)
  • REST'da bog'liq ma'lumotlar uchun ko'pincha bir nechta endpoint kerak bo'ladi

Versioning:

  • REST'da API o'zgarishlari uchun yangi versiyalar kerak bo'lishi mumkin
  • GraphQL schema'larni bosqichma-bosqich rivojlantirish orqali versioning'dan qochadi

GraphQL query misoli:

query {
  user(id: 1) {
    name
    posts {
      title
    }
  }
}
Backend tizimida keshlashni qanday amalga oshirgan bo'lardingiz?
  1. In-Memory Cache: Tez-tez ishlatiladigan ma'lumotlarga tezkor kirish uchun Redis yoki Memcached kabi vositalardan foydalaning. Eng keng tarqalgan qo'llanilishi — ma'lumotlar bazasiga yuboriladigan qimmat (ko'p resurs talab qiladigan) query'lar natijalarini keshlash.

  2. HTTP Caching: Client-side va proxy keshlash uchun Cache-Control header'laridan foydalaning.

  3. Application-Level Caching: express-cache kabi kutubxonalar yoki decorator'lar yordamida hisoblangan qiymatlarni yoki tez-tez ishlatiladigan obyektlarni xotirada saqlang.

  4. Distributed Caching: Distributed tizimlarda instance'lar o'rtasida consistency'ni ta'minlash uchun umumiy keshdan (masalan, Redis) foydalaning.

  5. Cache Invalidation: Keshni dolzarb holatda saqlash uchun time-to-live (TTL) yoki event-driven invalidation kabi strategiyalardan foydalaning.

  6. Testlash: Cache hit rate'ni kuzatib boring va eskirgan ma'lumotlar qaytarilmayotganiga ishonch hosil qiling.

Browser Caching: Bu qat'iy ma'noda server-side bo'lmasa-da, statik resurslarni client-side'da saqlash va shu orqali backend'ga yuboriladigan so'rovlarni kamaytirish uchun brauzer keshlashidan foydalaning.

SQL injection va XSS kabi xavfsizlik zaifliklariga qarshi qanday choralar ko'rasiz?
SQL Injection:

SQL injection attack'larining oldini olish uchun zararli SQL kodi bajarilishiga yo'l qo'ymaydigan parameterized query'lar yoki prepared statement'lardan foydalaning:

db.query('SELECT * FROM users WHERE id = ?', [userId]);

Shuningdek, foydalanuvchi input'larida SQL statement'lariga xalaqit berishi mumkin bo'lgan belgilar bo'lmasligi uchun ularni validatsiya va sanitize qiling.

Cross-Site Scripting (XSS):

Skriptlar yoki dinamik kontent sahifangizga ta'sir qilishiga yo'l qo'ymaslik uchun:

  1. Brauzerda render qilishdan oldin kontentni escape qiling:
<div>{sanitize(userInput)}</div>
  1. HTML'ni sanitize qilish uchun DOMPurify kabi kutubxonalardan foydalaning.

  2. Skriptlar uchun ruxsat etilgan manbalarni faqat ishonchli manbalar bilan cheklash uchun Content-Security-Policy header'larini o'rnating.

CI/CD pipeline'lari qanday ishlashini va ularni joriy qilishda ishlatiladigan vositalarni tushuntiring

CI/CD pipeline'lari har qanday loyihaning build, test va deployment jarayonlarini avtomatlashtiradi. Bu pipeline'lar har qanday muvaffaqiyatli ishlab chiqish jarayonining muhim qismidir.

Continuous Integration (CI):

Bu bosqichda repository'ga o'zgarishlar push qilinganda kod avtomatik ravishda build qilinadi va testlanadi. Bu ish uchun odatda Jenkins, GitHub Actions, CircleCI va shunga o'xshash muqobil vositalar ishlatiladi.

Continuous Delivery (CD):

Bu bosqichda mahsulotning haqiqiy deployment jarayoni avtomatlashtiriladi, ya'ni kod CI bosqichida tekshirilgach, u avtomatik ravishda kerakli muhitga o'tkazilishi mumkin.

Pipeline bosqichlari:

To'liq jarayon quyidagi bosqichlardan iborat:

Kodni olish → Ilovani build qilish → Testlarni ishga tushirish → Artifact'ni deploy qilish → Jamoani xabardor qilish

Bularning barchasi avtomatik ravishda ketma-ket bajariladi va ulardan birida xato yuz bersa, zanjir uziladi.

Eng ko'p ishlatiladigan vositalar:
  1. Jenkins: Murakkab workflow'lar uchun juda moslashuvchan.
  2. GitHub Actions: GitHub repository'lari bilan oson integratsiya.
  3. Docker: Container'lashtirilgan build'lar uchun.
  4. ArgoCD yoki Spinnaker: Kubernetes deployment'lari uchun.
Full-stack ilovada performance monitoring'ga qanday yondashasiz?

Full-stack developer sifatida ilovangizni monitoring qilish uni 360 darajada — frontend'dan backend'gacha, jumladan ma'lumotlar bazasi va jarayonda ishtirok etadigan boshqa tizimlarni ham — to'liq kuzatishni anglatadi.

Frontend monitoring:
  • Yuklanish vaqti, interaktivlik va rendering'ni kuzatish uchun Google Lighthouse yoki Web Vitals kabi vositalardan foydalaning.
  • Foydalanuvchi xatti-harakatlarini New Relic Browser yoki LogRocket kabi vositalar bilan kuzating.
Backend monitoring:
  • Serverning javob berish vaqti, ma'lumotlar bazasi query'larining unumdorligi va API latency'sini kuzatish uchun APM vositalaridan (masalan, Datadog, Dynatrace) foydalaning.
Logging:
  • Bottleneck'larni tahlil qilish uchun log'larni ELK Stack yoki CloudWatch Logs kabi vositalar yordamida markazlashtiring.
  • Bu ko'plab alohida microservice'lar va turli client'lar birgalikda ishlaydigan tizimlar uchun juda muhim.
Ma'lumotlar bazasi monitoring'i:
  • Query profiler'lardan (masalan, MySQL EXPLAIN) foydalaning va ma'lumotlar bazasi holatini Percona Monitoring kabi vositalar bilan kuzating.
Alerting:
  • Prometheus va Grafana kabi vositalar yordamida anomaliyalar yoki threshold'lar uchun alert'larni sozlang.
Event-driven architecture nima va undan qachon foydalanasiz?

Event-Driven Architecture: Servislar event'larni asinxron tarzda emit qilish va ularga javob berish orqali o'zaro aloqa qiladigan design pattern.

Asosiy qismlari:

  • Event Producer: Event'larni hosil qiladi (masalan, foydalanuvchi fayl yuklaydi).
  • Event Consumer: Event'larni tinglaydi va ularga javob beradi (masalan, servis yuklangan faylni qayta ishlaydi).
  • Message Broker: Event'larning yetkazilishini ta'minlaydi (masalan, Kafka, RabbitMQ).

Qachon foydalaniladi:

  • Real-time yangilanishlarni talab qiladigan ilovalar (masalan, chat ilovalari, birja savdo platformalari).
  • Scalability va maintainability'ni oshirish uchun decoupled microservices.
  • Asinxron vazifalarga ega workflow'lar (masalan, buyurtmalarni qayta ishlash).
Full-stack ilovalarni yaratishda qanday umumiy qiyinchiliklar uchraydi?
  1. Qiyinchilik: Frontend va backend bo'ylab state'ni boshqarish.

    • Yechim: Global state management vositalaridan (masalan, Redux, Zustand) va aniq data contract'larga ega API'lardan foydalaning.
  2. Qiyinchilik: Scalability muammolari.

    • Yechim: Ma'lumotlar bazasi query'larini optimallashtiring, keshlashni joriy qiling va scalable cloud infratuzilmasidan foydalaning.
  3. Qiyinchilik: Xavfsizlik bilan bog'liq xavotirlar.

    • Yechim: Xavfsiz authentication'ni (masalan, OAuth2) joriy qiling, input'larni sanitize qiling va OWASP tavsiyalariga amal qiling.
  4. Qiyinchilik: Butun codebase bo'ylab (ham frontend, ham backend kodida) sifatni bir xil darajada saqlash.

    • Yechim: Unit testing, integration testing, end-to-end testing va muntazam code review'larni o'z ichiga olgan puxta testlash strategiyasini joriy qiling.
  5. Qiyinchilik: Texnologiyalardagi yangilanishlardan ortda qolmaslik.

    • Yechim: Eskirgan texnologiyalarni bosqichma-bosqich almashtirish uchun modulli arxitekturani qo'llang.
  6. Qiyinchilik: Frontend va backend o'rtasidagi murakkab o'zaro ta'sirlarni debug qilish.

    • Yechim: Muammolarni kuzatish uchun end-to-end testing freymvorklaridan (masalan, Cypress) va logging vositalaridan foydalaning.

Yo'l xaritalariQo'llanmalarFAQYouTube

yo'lxaritaroadmap.shasosida

Hamjamiyat tomonidan yaratilgan yo'l xaritalari, eng yaxshi amaliyotlar, loyihalar, maqolalar, manbalar va yo'nalishlar — o'z yo'lingizni tanlash va kasbingizda o'sish uchun.

© yo'lxarita·Shartlar·Maxfiylik·

roadmap.sh

Barcha kontent roadmap.sh loyihasidan olingan (© Kamran Ahmed) va shaxsiy o'rganish uchun o'zbek tiliga tarjima qilinmoqda.

Qidiruv

Yo'l xaritalari, loyihalar va savollarni qidiring