01-bosqich

Code

Professional kod yozish san'ati - Git workflow, branching, clean code, linting, testing va code review asoslari bilan tanishing.

35 daqiqa o'qish 21 ta mavzu 15+ misol
Boshlang'ich Junior Middle Senior

Code nima?

Kod - bu dasturchilar kompyuterga buyruqlar beradigan til. Oddiy qilib aytganda, siz kompyuterga "nima qilish kerakligini" yozma shaklda aytasiz. Biroq, professional dasturlashda kod yozish faqat "ishlasa bo'ldi" emas.

Professional kod yozish quyidagilarni o'z ichiga oladi:

  • O'qilishi oson bo'lsin - 6 oydan keyin o'zingiz ham tushunasiz
  • Qayta ishlatilsin - bir joyda yozib, ko'p joyda ishlatish
  • Xatolar kam bo'lsin - testlar va tekshiruvlar orqali
  • Jamoa bilan ishlashga mos bo'lsin - Git va code review
  • Kengaytirish oson bo'lsin - yangi funksiyalar qo'shish oddiy
Muhim!

Yaxshi kod - bu faqat ishlaydigan kod emas, balki boshqalar (va kelajakdagi siz) oson tushuna oladigan koddir. "Kod yozish - bu kompyuter uchun emas, odam uchun yozishdir."

Nega kerak?

Ko'p yangi dasturchilar "Kod ishlaydimi? Bo'ldi-da!" deb o'ylashadi. Lekin real loyihalarda bu yetarli emas:

Jamoa ishlashi

Bir loyihada 5-50 odam ishlashi mumkin. Barcha bir xil standartga amal qilishi kerak.

Loyiha uzoq yashaydi

Loyiha 5-10 yil davomida rivojlanishi mumkin. Tartibsiz kod "chigal"ga aylanadi.

Xatolarni tuzatish

Tartibli kodda xatoni topish oson. Chalkash kodda esa soatlab izlaysiz.

Tez rivojlantirish

Yaxshi kod bazasi bo'lsa, yangi funksiyalar qo'shish tez va oson.

Pul tejash

Sifatli kod - kamroq xato, kamroq tuzatish vaqti, kamroq xarajat.

Professional o'sish

Yaxshi kod yozish - Senior darajaga yetishning asosiy mezoni.

Haqiqiy hayotdan

Knight Capital 2012-yilda 45 daqiqada $440 million yo'qotdi - sabab: eski kod yangi tizimga to'g'ri integratsiya qilinmagan edi. Yaxshi kod yozish va testlash juda muhim!

Git asoslari

Git - bu eng mashhur version control tizimi. U kodingiz tarixini saqlaydi va jamoaviy ishlashni osonlashtiradi.

Git nima uchun kerak?

  • Tarix saqlash: Har bir o'zgarish saqlanadi, xato bo'lsa orqaga qaytarish mumkin
  • Jamoaviy ish: 100 odam bir vaqtda bitta loyihada ishlashi mumkin
  • Branch'lar: Yangi funksiyalarni alohida ishlab, keyin birlashtirish
  • Backup: Kod GitHub/GitLab'da xavfsiz saqlanadi
  • Kuzatuv: Kim, qachon, nima o'zgartirganini ko'rish mumkin

Git vs GitHub

Git GitHub/GitLab
Dastur (kompyuterda o'rnatiladi) Onlayn platforma (sayt)
Local ishlaydi Cloud'da saqlaydi
Versiyalarni boshqaradi Hamkorlik va CI/CD
Bepul va open source Bepul + pullik tariflar

Git buyruqlari

Eng ko'p ishlatiladigan Git buyruqlari:

bash
# BOSHLASH
git init                      # Yangi repo yaratish
git clone URL                 # Mavjud reponi klonlash

# O'ZGARISHLAR BILAN ISHLASH
git status                    # Holatni ko'rish
git add filename              # Faylni staging'ga qo'shish
git add .                     # Barcha fayllarni qo'shish
git commit -m "xabar"         # Commit qilish
git commit --amend            # Oxirgi commitni o'zgartirish

# BRANCH'LAR
git branch                    # Branch'lar ro'yxati
git branch feature/login      # Yangi branch yaratish
git checkout branch-name      # Branch'ga o'tish
git checkout -b new-branch    # Yaratish + o'tish
git merge branch-name         # Branch birlashtirish
git branch -d branch-name     # Branch o'chirish

# REMOTE BILAN ISHLASH
git remote -v                 # Remote'lar ro'yxati
git push origin main          # Kodni yuborish
git pull origin main          # Yangilanishlarni olish
git fetch                     # O'zgarishlarni tekshirish

# TARIX VA QAYTARISH
git log --oneline             # Commit tarixini ko'rish
git diff                      # O'zgarishlarni ko'rish
git reset --soft HEAD~1       # Oxirgi commitni bekor qilish
git stash                     # O'zgarishlarni vaqtinchalik saqlash
git stash pop                 # Saqlangan o'zgarishlarni qaytarish
Pro tip

Git alias'larni o'rnating: git config --global alias.co checkout - endi git co yozish yetarli!

Branching strategiyasi

Branchlar - kodning parallel versiyalari. Professional loyihalarda turli strategiyalar ishlatiladi.

Git Flow (Klassik)

  • main/master - production tayyor kod
  • develop - rivojlanish jarayonidagi kod
  • feature/* - yangi funksiyalar uchun
  • release/* - relizga tayyorlash uchun
  • hotfix/* - shoshilinch tuzatishlar uchun

GitHub Flow (Oddiyroq)

  • main - har doim deploy-ready
  • feature-branch - har bir o'zgarish uchun
  • Pull Request → Review → Merge → Deploy

Trunk-Based Development (Zamonaviy)

  • Asosiy branch'da ishlash
  • Juda qisqa muddatli branch'lar (1-2 kun)
  • Feature flags orqali yangi funksiyalarni yashirish
  • Tez-tez merge qilish (kuniga 1+ marta)
bash
# Feature branch yaratish
git checkout -b feature/user-authentication

# Ish tugagach, develop ga merge
git checkout develop
git merge feature/user-authentication

# Hotfix yaratish (production xatosi uchun)
git checkout -b hotfix/fix-login-bug main
# ... tuzatish ...
git checkout main
git merge hotfix/fix-login-bug

Commit qoidalari

Yaxshi commit xabarlari loyihani tushunishni osonlashtiradi. Conventional Commits standartidan foydalaning:

Conventional Commits
# FORMAT: type(scope): description

feat:     Yangi funksiya
fix:      Xato tuzatish
docs:     Dokumentatsiya
style:    Formatlash (kod o'zgarmaydi)
refactor: Kod refactoring
test:     Testlar qo'shish
chore:    Build, config o'zgarishlari
perf:     Performance yaxshilash
ci:       CI/CD o'zgarishlari

# MISOLLAR:
feat(auth): add password reset functionality
fix(ui): correct button alignment on mobile
docs(readme): update installation instructions
refactor(api): simplify user validation logic
test(auth): add unit tests for login service
chore(deps): update dependencies to latest versions

Commit qoidalari

  • Imperativ shaklda yozing: "Add feature" emas "Added feature"
  • Sarlavha 50 belgidan oshmasin
  • Har bir commit BIR mantiqiy o'zgarish bo'lsin
  • Katta o'zgarishlarda body qo'shing (sarlavhadan keyin bo'sh qator)
  • Issue raqamini qo'shing: "fix(auth): resolve login bug #123"

Code Style

Jamoada barcha bir xil uslubda yozishi kerak. Bu kodni o'qish va tushunishni osonlashtiradi.

Nomlash qoidalari (Naming Conventions)

javascript
// camelCase - o'zgaruvchilar va funksiyalar
let userName = "John";
function getUserData() { }

// PascalCase - klasslar va komponentlar
class UserService { }
function UserProfile() { }  // React component

// SCREAMING_SNAKE_CASE - konstantalar
const MAX_RETRY_COUNT = 3;
const API_BASE_URL = "https://api.example.com";

// snake_case - Python, Ruby, database ustunlari
user_name = "John"
def get_user_data():
    pass

// kebab-case - URL, CSS class, fayl nomlari
// user-profile.component.ts
// .user-card { }

Yaxshi nomlar tanlash

javascript
// ❌ Yomon nomlar
let d = 86400;           // nima?
let arr = [];             // qaysi array?
function process() { }    // nima process?
let flag = true;         // qaysi flag?

// ✅ Yaxshi nomlar
let secondsInDay = 86400;
let activeUsers = [];
function processPayment() { }
let isUserLoggedIn = true;

// Boolean nomlar is, has, can, should bilan
let isActive = true;
let hasPermission = false;
let canEdit = true;
let shouldRefresh = false;

Clean Code

Clean Code - oson o'qiladigan, tushunarli va saqlab turish oson bo'lgan kod. Robert C. Martin (Uncle Bob) ning "Clean Code" kitobi asosiy manba.

1. Funksiyalar kichik bo'lsin

javascript
// ❌ Yomon - funksiya juda ko'p ish qilmoqda
function processUser(user) {
    // validate, save, send email, log... 100+ qator
}

// ✅ Yaxshi - har bir funksiya bitta ish
function validateUser(user) { ... }
function saveUser(user) { ... }
function sendWelcomeEmail(user) { ... }
function logUserCreation(user) { ... }

function processUser(user) {
    validateUser(user);
    saveUser(user);
    sendWelcomeEmail(user);
    logUserCreation(user);
}

2. DRY - Don't Repeat Yourself

javascript
// ❌ Yomon - kod takrorlanmoqda
const adminEmail = admin.email.toLowerCase().trim();
const userEmail = user.email.toLowerCase().trim();
const guestEmail = guest.email.toLowerCase().trim();

// ✅ Yaxshi - funksiya yarating
const normalizeEmail = (email) => email.toLowerCase().trim();

const adminEmail = normalizeEmail(admin.email);
const userEmail = normalizeEmail(user.email);
const guestEmail = normalizeEmail(guest.email);

3. KISS - Keep It Simple, Stupid

javascript
// ❌ Murakkab
const isEven = num => num % 2 === 0 ? true : false;

// ✅ Oddiy
const isEven = num => num % 2 === 0;

// ❌ Murakkab
if (isLoggedIn === true) { ... }

// ✅ Oddiy
if (isLoggedIn) { ... }

4. Early Return (Guard Clauses)

javascript
// ❌ Yomon - chuqur nesting
function getDiscount(user) {
    if (user) {
        if (user.isPremium) {
            if (user.yearsActive > 5) {
                return 0.3;
            } else {
                return 0.2;
            }
        } else {
            return 0.1;
        }
    }
    return 0;
}

// ✅ Yaxshi - early return
function getDiscount(user) {
    if (!user) return 0;
    if (!user.isPremium) return 0.1;
    if (user.yearsActive > 5) return 0.3;
    return 0.2;
}

SOLID Printsiplari

SOLID - bu 5 ta muhim OOP printsipi bo'lib, yaxshi, kengaytiriladigan kod yozishga yordam beradi.

S
Single Responsibility
O
Open/Closed
L
Liskov Substitution
I
Interface Segregation
D
Dependency Inversion

S - Single Responsibility

Har bir klass yoki funksiya faqat BIR vazifani bajarsin.

javascript
// ❌ Yomon - klass ko'p ish qilmoqda
class User {
    save() { /* bazaga saqlash */ }
    sendEmail() { /* email yuborish */ }
    generateReport() { /* hisobot yaratish */ }
}

// ✅ Yaxshi - har bir klass o'z ishini qiladi
class User { /* faqat user ma'lumotlari */ }
class UserRepository { save(user) { } }
class EmailService { send(to, message) { } }
class ReportGenerator { generate(data) { } }

O - Open/Closed

Kod kengaytirish uchun OCHIQ, o'zgartirish uchun YOPIQ bo'lsin.

D - Dependency Inversion

Yuqori darajali modullar quyi darajali modullarga bog'liq bo'lmasin. Abstraksiyalardan foydalaning.

Linting & Formatting

Linter va formatter - kod sifatini avtomatik tekshiruvchi va formatlashni yengillashtiruvchi asboblar.

ESLint - JavaScript/TypeScript uchun

.eslintrc.json
{
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended"
  ],
  "rules": {
    "no-unused-vars": "warn",
    "no-console": "warn",
    "semi": ["error", "always"],
    "quotes": ["error", "single"],
    "max-lines-per-function": ["warn", 50]
  }
}

Prettier - Kod formatlash

.prettierrc
{
  "semi": true,
  "singleQuote": true,
  "tabWidth": 2,
  "trailingComma": "es5",
  "printWidth": 80,
  "bracketSpacing": true
}

Husky - Git Hooks

Commit qilishdan oldin avtomatik tekshiruvlar:

bash
# Husky o'rnatish
npm install husky lint-staged --save-dev
npx husky install

# Pre-commit hook qo'shish
npx husky add .husky/pre-commit "npx lint-staged"
package.json
{
  "lint-staged": {
    "*.{js,ts}": ["eslint --fix", "prettier --write"],
    "*.{json,md}": ["prettier --write"]
  }
}

Testing asoslari

Test yozish - professional dasturchilik belgisi. Testlar kodingiz to'g'ri ishlashini kafolatlaydi.

Test turlari

Unit Tests

Bitta funksiya yoki metodni test qiladi. Eng kichik test birligi. Tez ishlaydi.

Integration Tests

Bir necha komponent birgalikda qanday ishlashini tekshiradi.

E2E Tests

Butun ilovani foydalanuvchi nuqtai nazaridan test qiladi. Cypress, Playwright.

Jest bilan test yozish

javascript
// math.js
function add(a, b) {
    return a + b;
}

function divide(a, b) {
    if (b === 0) throw new Error('Cannot divide by zero');
    return a / b;
}

// math.test.js
describe('Math functions', () => {
    test('adds 1 + 2 to equal 3', () => {
        expect(add(1, 2)).toBe(3);
    });

    test('throws error when dividing by zero', () => {
        expect(() => divide(10, 0)).toThrow('Cannot divide by zero');
    });
});

AAA Pattern

  • Arrange - Test uchun kerakli ma'lumotlarni tayyorlash
  • Act - Test qilinadigan funksiyani chaqirish
  • Assert - Natijani kutilgan qiymat bilan solishtirish

Debugging

Xatolarni topish va tuzatish - dasturchilik vaqtining 50%+ ni oladi.

Debugging usullari

Console.log

Eng oddiy usul. O'zgaruvchi qiymatlarini konsolga chiqarish.

Breakpoints

Kodni ma'lum nuqtada to'xtatib, holati ko'rish. DevTools yoki IDE.

Rubber Duck

Muammoni boshqaga tushuntirib, yechim topish usuli.

Console metodlari

javascript
// Oddiy log
console.log('User:', user);

// Jadval ko'rinishida
console.table(usersArray);

// Vaqtni o'lchash
console.time('fetchData');
await fetchData();
console.timeEnd('fetchData');

// Kod ichida breakpoint
debugger; // brauzer shu yerda to'xtaydi

// Stack trace
console.trace('Current stack');

// Guruhlash
console.group('User Details');
console.log('Name:', user.name);
console.log('Email:', user.email);
console.groupEnd();
Eslatma!

Production kodda console.log larni qoldirmang! ESLint no-console qoidasini yoqing.

Code Review

Code Review - jamoa a'zolari bir-birlarining kodini tekshirish jarayoni.

Code Review checklist

  • Funksionallik: Kod talab qilinganidek ishlayaptimi?
  • Testlar: Yetarli testlar yozilganmi?
  • O'qilishi: Kod tushunarli yozilganmi?
  • DRY: Takrorlanuvchi kod yo'qmi?
  • Xavfsizlik: Zaifliklar yo'qmi?
  • Performance: Samaradorlikka ta'sir qiladimi?

Yaxshi review fikrlari

text
❌ Yomon:
"Bu yomon kod"
"Nima uchun shunday yozdingiz?"

✅ Yaxshi:
"Bu yerda `map` o'rniga `filter` yaxshiroq bo'lardi, chunki..."
"Savol: bu funksiya null qiymatda qanday ishlaydi?"
"Ajoyib yechim! 👍 Faqat bir kichik taklif..."
"Nit: o'zgaruvchi nomini `data`dan `userProfile`ga o'zgartirish mumkin"

IDE sozlamalari

To'g'ri sozlangan IDE sizning samaradorligingizni 2-3 barobar oshiradi.

VS Code uchun muhim extensionlar

ESLint Prettier GitLens GitHub Copilot Error Lens Auto Import Live Server Path Intellisense

VS Code settings.json

json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "editor.tabSize": 2,
  "files.autoSave": "afterDelay",
  "editor.wordWrap": "on",
  "emmet.includeLanguages": {
    "javascript": "javascriptreact"
  }
}

AI yordamchilari

2024-yilda AI dasturlashni tubdan o'zgartirdi. Bu vositalar samaradorlikni 2-3 barobar oshiradi.

GitHub Copilot

VS Code'da real-time kod tavsiyalari. Funksiyalar, testlar avtomatik yaratadi. $19/oy.

ChatGPT / Claude

Murakkab muammolarni tushuntirish, debugging, refactoring uchun ideal.

Cursor IDE

AI-first kod muharriri. VS Code asosida, AI chuqur integratsiya qilingan.

Muhim ogohlantirish!

AI yozgan kodni TUSHUNISHINGIZ kerak! Ko'r-ko'rona copy-paste qilmang. AI xato qilishi mumkin, maxfiy ma'lumotlar bilan ehtiyot bo'ling.

Ko'p uchraydigan xatolar

1. Juda katta commitlar

Bir commitda 1000 qator o'zgartirish. Review qilish va xato topish juda qiyin. Kichik, mantiqiy commitlar qiling.

2. Yomon commit xabarlari

"fix", "update", "changes" kabi xabarlar. Aniq yozing: "fix(auth): resolve login timeout issue"

3. Main branch'ga to'g'ridan-to'g'ri push

Har doim PR orqali qo'shing. Branch protection rules o'rnating.

4. .env fayllarni commit qilish

Maxfiy kalitlarni Git'ga HECH QACHON qo'shmang! .gitignore dan foydalaning.

5. Test yozmaslik

"Vaqt yo'q" bahonasi bilan. Keyinchalik bu 10x ko'proq vaqt oladi.

Best practices

  • Har kuni kamida bir marta git pull qiling
  • Commit xabarlarini Conventional Commits formatida yozing
  • Branch nomlarini standartlashtiring: feature/, bugfix/, hotfix/
  • Har bir PR 400 qatordan oshmasin (ideal: 200-300)
  • README.md faylini yangilab turing
  • .gitignore faylini to'g'ri sozlang
  • Pre-commit hooks o'rnating (Husky)
  • Code review'da konstruktiv bo'ling
  • Har bir funksiya uchun test yozing
  • Code coverage 80%+ ga intiling

Asboblar va texnologiyalar

Git GitHub GitLab VS Code ESLint Prettier Husky Jest Vitest Cypress Playwright commitlint lint-staged npm/yarn/pnpm

Xavfsizlik qoidalari

  • Maxfiy kalitlarni HECH QACHON Git'ga push qilmang. .env fayllarni .gitignore'ga qo'shing.
  • GitHub Secrets yoki boshqa secret manager'lardan foydalaning.
  • Dependency'larni muntazam yangilang: npm audit fix
  • Branch protection rules o'rnating - main'ga to'g'ridan-to'g'ri push taqiqlang.
  • 2FA (ikki faktorli autentifikatsiya) yoqing.
  • Dependabot yoki Renovate bot o'rnating.
  • SSH kalitlaridan foydalaning (HTTPS o'rniga).

.gitignore namunasi

.gitignore
# Environment variables
.env
.env.local
.env.production

# Dependencies
node_modules/

# Build outputs
dist/
build/

# IDE
.idea/
.vscode/

# Logs
*.log

# OS
.DS_Store

Ko'p so'raladigan savollar

Merge - ikki branch'ni birlashtiradi va yangi "merge commit" yaratadi. Rebase esa branch tarixini "qayta yozadi", commitlarni boshqa branch ustiga ko'chiradi. Rebase tarixni toza saqlaydi, lekin shared branch'larda ehtiyot bo'ling.

git commit --amend - oxirgi commitni o'zgartirish. git reset --soft HEAD~1 - commitni bekor qilish (o'zgarishlar saqlanadi). git reset --hard HEAD~1 - butunlay o'chirish.

1) Conflict fayllarni oching, 2) <<<, ===, >>> belgilar orasidagi kodni ko'ring, 3) Qaysi versiyani saqlashni hal qiling, 4) Belgilarni o'chirib, to'g'ri kodni qoldiring, 5) git add va git commit qiling.

git stash - joriy o'zgarishlarni vaqtinchalik saqlaydi. Masalan, tezda boshqa branch'ga o'tishingiz kerak. git stash pop bilan qaytarasiz.

1) Kod ishlayaptimi? 2) Testlar bormi? 3) Code style qoidalariga mos kelayaptimi? 4) Xavfsizlik muammolari yo'qmi? 5) Performance ta'sir qilmaydimi? 6) Dokumentatsiya yangilangan mi?

VS Code - eng mashhur, bepul, ko'p extension'lar. WebStorm - pullik, lekin juda kuchli. Cursor - AI integratsiyasi bilan. Boshlang'ich uchun VS Code tavsiya etiladi.

ESLint - kod sifatini tekshiradi (xatolar, anti-patterns). Prettier - faqat formatlash (bo'sh joy, qatorlar). Ikkalasini birga ishlatish tavsiya etiladi.

Glossary (Atamalar lug'ati)

Repository Loyihaning barcha fayllari va tarixini saqlaydigan joy. Qisqacha "repo".
Commit Koddagi o'zgarishlarning saqlangan holati. Har bir commit o'ziga xos ID ga ega.
Branch Kodning parallel nusxasi. Yangi funksiyalar uchun alohida ishlash imkonini beradi.
Merge Ikki branch'ni birlashtirish. O'zgarishlar bitta branch'ga qo'shiladi.
Pull Request Kodni asosiy branch'ga qo'shish so'rovi. Jamoa review qiladi.
Clone Remote repository'ni local kompyuterga to'liq nusxalash.
Fork Boshqa odamning repo'sini o'z akkauntingizga nusxalash.
Staging Commit qilish uchun tayyorlangan o'zgarishlar. git add bilan qo'shiladi.
HEAD Hozirgi joylashgan commit'ga ko'rsatgich.
Remote Online saqlangan repository. "origin" eng ko'p ishlatiladigan nom.
Linter Kodni tekshirib, xatolar va style buzilishlarini ko'rsatadigan dastur.
Hook Git amallaridan oldin/keyin ishlaydigan skriptlar.
Refactoring Kod ishlashini o'zgartirmay, uni toza qilish.
Code Review Jamoa a'zolari tomonidan kodni tekshirish jarayoni.