Code
Professional kod yozish san'ati - Git workflow, branching, clean code, linting, testing va code review asoslari bilan tanishing.
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
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.
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:
# 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
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)
# 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:
# 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)
// 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
// ❌ 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
// ❌ 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
// ❌ 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
// ❌ 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)
// ❌ 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
Har bir klass yoki funksiya faqat BIR vazifani bajarsin.
// ❌ 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
{
"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
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 80,
"bracketSpacing": true
}
Husky - Git Hooks
Commit qilishdan oldin avtomatik tekshiruvlar:
# 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"
{
"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
// 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
// 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();
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
❌ 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
VS Code settings.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.
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
Bir commitda 1000 qator o'zgartirish. Review qilish va xato topish juda qiyin. Kichik, mantiqiy commitlar qiling.
"fix", "update", "changes" kabi xabarlar. Aniq yozing: "fix(auth): resolve login timeout issue"
Har doim PR orqali qo'shing. Branch protection rules o'rnating.
Maxfiy kalitlarni Git'ga HECH QACHON qo'shmang! .gitignore dan foydalaning.
"Vaqt yo'q" bahonasi bilan. Keyinchalik bu 10x ko'proq vaqt oladi.
Best practices
- Har kuni kamida bir marta
git pullqiling - 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
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
# 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.