IlmHamroh
JavaScript Full-stack/32-qism. Professional Git va jamoada ishlash13/19-dars21 daqiqa
Mundarija (37)

Jamoada muloqot: sinxron va asinxron, standup, issue shablonlari va qaror yozuvi

Qisqacha: Sinxron muloqot — hamma bir vaqtda (uchrashuv, qo'ng'iroq); asinxron — har kim o'z vaqtida o'qib javob beradi (issue, PR izohi, chat). Dasturchilar jamoasida asinxron birinchi: savol va qaror yozma joyda turadi, qidiriladi va yangi odam ham o'qiydi. Sinxron — kelishmovchilik, shoshilinch holat va murakkab muhokama uchun; natijasi baribir yoziladi. Chatda salomdan keyin kutmang — savolni bitta xabarda to'liq yozing; yomon xabarni erta ayting; fikrni SBI shaklida bering. Kurs loyihasida issue shablonlari, qaror yozuvi (ADR) va CONTRIBUTING.md dagi «Muloqot» bo'limi shu qoidalarni faylga aylantiradi.

Bu darsda

  • Sinxron va asinxron muloqotni farqlaysiz va har biri qachon kerakligini bilasiz.
  • Chatda to'liq savol, status update va asinxron standup yozasiz.
  • Uchrashuvga kun tartibi va natija yozuvini tayyorlaysiz.
  • Fikrni SBI shaklida berasiz, yomon xabarni erta aytasiz.
  • vazifalar-api ga issue shablonlari, ADR va «Muloqot» qoidalarini qo'shasiz.

Oldin bilishingiz kerak: Issues, Projects va shablonlar, Code review berish va olish, README va loyiha hujjatlari.

1. Nega bu kerak?

Seshanba kuni Telegram guruhida qizg'in bahs bo'ldi: AI so'roviga umumiy muddat 25 soniya bo'lsinmi yoki 60? Bir soatda 40 ta xabar, oxirida kelishildi — 25. Hamma rozi.

Ikki hafta o'tdi. Jamoaga Sardor keldi. U kodda AI_DEADLINE_MS = 25 000 ni ko'rib, "bu juda kam, 60 qilaman" dedi. Chatdagi 40 xabar uni to'xtata olmaydi — u guruhda yo'q edi, bo'lganida ham 600 ta yangi xabar ichidan topa olmasdi. Bahs boshidan boshlanadi.

Muammo qaror sifatida emas. Qaror yozilmagan joyda qolgan. Chat — oqim: xabar o'tib ketadi. Issue, PR va hujjat — arxiv: qidiriladi, havola beriladi, yillar o'tib ham ochiladi.

Hayotiy o'xshatish: mahalla yig'ini. Yig'inda gaplashib, bir qarorga kelindi. Raisning daftarga yozgani esa keyingi yili ham kuchda. Yozilmagan qaror bir oy o'tib "men bunday demagan edim" bahsiga aylanadi.

Bu dars — jamoada qanday gaplashish haqida: qachon yozish, qachon qo'ng'iroq qilish va qarorni qayerda saqlash.

2. Sinxron va asinxron

2.1 Ikki xil muloqot

Sinxron (synchronous) muloqot — qatnashchilar bir vaqtda: uchrashuv, qo'ng'iroq, yonma-yon gaplashish. Javob darhol keladi.

Asinxron (asynchronous) muloqot — har kim o'z vaqtida o'qiydi va javob beradi: issue, PR izohi, email, chatdagi xabar. Javob soatlardan keyin kelishi normal.

Event loop darsidagi so'z bilan bir xil ma'no: sinxron — kutib turasiz, asinxron — ishingizni davom ettirasiz, javob kelganda qaytasiz.

Sinxron Asinxron
Javob darhol soatlar ichida
Diqqat hammani bo'ladi har kim o'zi tanlaydi
Iz qolmaydi (yozilmasa) o'zi yozuv
Kuchli joyi kelishmovchilik, his-tuyg'u o'ylangan javob, arxiv

2.2 Asinxron birinchi

Dasturchi ishi — chuqur diqqat. Kod ustida 40 daqiqa o'ylab, bitta qo'ng'iroq bilan hammasini yo'qotish oson. Har "bir daqiqaga gaplashamizmi?" — kimningdir diqqati.

Shuning uchun ko'p jamoalar async-first (asinxron birinchi) qoidasini qabul qiladi: sukut bo'yicha — yozma; sinxron — sabab bo'lganda. GitLab ochiq qo'llanmasida qachon asinxronni sukut qilish va qachon sinxron gaplashish kerakligi alohida sahifada yozilgan ("Sync vs. Async Culture", handbook.gitlab.com, 2026-11-04 da ochib o'qildi). U yerda muhim ogohlantirish ham bor: async-first "o'zing bilasan, yordam yo'q" degani emas. Yozma savolga ham javob beriladi, faqat darhol emas.

Yana bir sabab — vaqt mintaqalari. Toshkentdagi dasturchi Berlin yoki Nyu-York jamoasida ishlashi tobora odatiy. Ish soatlari qancha kesishishini hisoblaylik:

js
// ish soatlari mahalliy vaqtda, utc — UTC'dan farq (soat)
function umumiySoatlar(a, b) {
  const bosh = Math.max(a.bosh - a.utc, b.bosh - b.utc);
  const oxir = Math.min(a.oxir - a.utc, b.oxir - b.utc);
  return Math.max(0, oxir - bosh);
}

const toshkent = { bosh: 9, oxir: 18, utc: 5 };
const berlin = { bosh: 9, oxir: 18, utc: 1 };
const nyuYork = { bosh: 9, oxir: 18, utc: -5 };
console.log(umumiySoatlar(toshkent, berlin)); // 5
console.log(umumiySoatlar(toshkent, nyuYork)); // 0
console.log(umumiySoatlar(berlin, nyuYork)); // 3

Ikkala vaqtni UTC'ga o'tkazamiz (mahalliy soatdan farqni ayiramiz), keyin kechroq boshlanish va ertaroq tugashni olamiz. Toshkent va Berlin — 5 umumiy soat. Toshkent va Nyu-York — nol: ish kuningiz tugaganda, ularniki boshlanadi. Bunday jamoada uchrashuv kimningdir kechasida bo'ladi. Asinxron muloqot yagona adolatli yo'l.

Raqamlar noyabr uchun: Berlin (UTC+1) va Nyu-York (UTC−5) yozda soatni bir soat oldinga suradi, Toshkent — yo'q. Haqiqiy dasturda mintaqa nomi va sana bilan hisoblanadi (Date va vaqt zonalari, Temporal API).

2.3 Qachon sinxron

Asinxron birinchi — "hech qachon gaplashmaslik" emas. Sinxron muloqot kerak bo'ladigan holatlar:

  • Bordi-keldi uzayib ketdi. Uch-to'rt xabardan keyin ham kelishilmagan bo'lsa — 15 daqiqalik qo'ng'iroq yozishmadan tezroq.
  • His-tuyg'u bor. Kelishmovchilik keskinlashgan, kimdir xafa. Matnda ohang yo'qoladi, ovozda — yo'q.
  • Shoshilinch. Prodakshn ishlamayapti — chatda kutib o'tirilmaydi.
  • Murakkab, ko'p tomonlama muhokama. Arxitektura tanlovi, yangi xodimni tanishtirish.

Lekin bitta qoida o'zgarmaydi: sinxron muhokamaning natijasi yoziladi. Qo'ng'iroqda kelishildingizmi — issue'ga yoki PR'ga ikki-uch qator: nima kelishildi, kim nima qiladi.

Qaror daraxti:

flowchart TD
  A[Xabar yozish kerak] --> B{Shoshilinchmi?}
  B -->|ha| C[Qo'ng'iroq yoki navbatchi]
  B -->|yo'q| D{Qaror yoki savolmi?}
  D -->|qaror| E[Issue, PR yoki ADR]
  D -->|savol| F[Chat: bitta to'liq xabar]
  F --> G{3-4 xabarda hal bo'ldimi?}
  G -->|yo'q| H[15 daqiqa qo'ng'iroq]
  H --> E
  C --> E

Diagrammaning oxiriga qarang: hamma yo'l E ga — yozma joyga — keladi.

Tekshirib ko'ring: Code review'da siz va muallif bitta izoh ostida yettinchi marta bir-biringizga javob yozyapsiz va ohang keskinlashyapti. Nima qilasiz?

Javob

Yozishmani to'xtatib, qisqa qo'ng'iroq taklif qiling: "Keling, 10 daqiqa gaplashaylik, keyin natijani shu yerga yozaman." Uzun yozma bahs kamdan-kam hal bo'ladi, ohang esa yomonlashadi. Qo'ng'iroqdan keyin kelishilgan narsani PR izohiga yozing — muhokama yozuvda yopiladi (Code review darsidagi "muhokamani izoh egasi yopadi" qoidasi).

3. Chatda yozish

3.1 "Salom" va kutish

Eng ko'p uchraydigan odat:

text
10:02  Aziz: Assalomu alaykum
10:02  Aziz: Bir savol bor edi
10:31  Nodira: Va alaykum assalom, ha?
10:47  Aziz: Lokal bazaga ulanmayapti

Nodira 10:31 da javob berdi, lekin savolni 10:47 da bildi. 45 daqiqa, va hali yechim yo'q. Chatda savolni bitta xabarda to'liq yozing:

text
10:02  Aziz: Assalomu alaykum! Lokal bazaga ulanmayapti:
`npm run db:migrate` → "connect ECONNREFUSED 127.0.0.1:5432".
Docker konteyner ishlayapti (`docker ps` da bor). README'dagi
buyruq bilan ishga tushirdim. Qayerga qarashim kerak?

Salom ham, savol ham bitta xabarda. Bu odatning nomi bor — "no hello", ya'ni "faqat salom yozmang" (nohello.net, 2026-11-04 da ochib o'qildi).

3.2 Yaxshi savolning to'rt qismi

Aziz xabariga qarang:

  1. Nima bo'ldi — aniq xato matni.
  2. Nima qildim — buyruq va tekshirgan narsalar (docker ps).
  3. Kontekst — qaysi hujjat bo'yicha.
  4. Nima kerak — "qayerga qarashim kerak?".

Bu — Code review darsidagi izohga va issue shabloniga juda o'xshaydi. Sababi bir: o'quvchi sizning boshingizda emas. U faqat yozilganni ko'radi.

3.3 Chat odobi

  • Thread (xabar zanjiri) — mavzu bo'yicha javob asosiy xabar ostida. Umumiy kanal toza qoladi.
  • Mention (@ism) — faqat shu odamning javobi kerak bo'lsa. @hamma — faqat hammaga tegishli shoshilinch xabar uchun.
  • Javob kutish. Chat — asinxron. Ish soatida 1–2 soat ichida javob odatiy; darhol javob talab qilmang.
  • Shaxsiy xabar o'rniga ochiq kanal. Texnik savolni bitta odamga emas, jamoa kanaliga yozing: javobni boshqalar ham o'qiydi, keyingi odam qidirib topadi.
  • Telegram va Slack — vosita farq qiladi, odob bir xil. Telegramda thread o'rnini "javob berish" (reply) bosadi.

4. Status: standup va yangilanish

4.1 Daily standup

Standup — jamoaning har kungi qisqa uchrashuvi (odatda 15 daqiqa). Nomi — "tik turib": uchrashuv cho'zilmasin. Scrum'da u Daily Scrum deyiladi; Scrum Guide 2020 ga ko'ra bu dasturchilarning 15 daqiqalik voqeasi, maqsad — sprint maqsadiga qarab rejani moslash (scrumguides.org, 2026-11-04 da ochib o'qildi). Sprint va Scrum'ni Agile va Scrum darsida o'rganamiz.

Ko'p jamoalar uchta savol ishlatadi: kecha nima qildim, bugun nima qilaman, nima to'sib turibdi. Scrum Guide 2020 bu savollarni majburiy qilmaydi — jamoa formatni o'zi tanlaydi (o'sha manba).

Eng muhim qism — to'siq. "Kecha X ni qildim" ni hamma Git tarixidan ko'radi. "Migratsiya testi Docker'siz yurmayapti, kimdir yordam bera oladimi?" — esa faqat standup'da chiqadi.

4.2 Asinxron standup

Vaqt mintaqalari turlicha bo'lsa yoki uchrashuvlar ko'p bo'lsa, standup yoziladi — har kim o'z vaqtida kanalga:

text
Kecha: PR #14 (CONTRIBUTING, SECURITY) merge; PR #15 review'ga.
Bugun: issue shablonlari va ADR shabloni.
To'siq: yo'q. PR #15 da LICENSE topilmasi — alohida issue #16.

Uch qator, har biri raqam yoki havola bilan. O'quvchi PR'ga bosib, tafsilotni ko'radi.

4.3 Status update va yomon xabar

Haftalik status update — rahbar yoki buyurtmachi uchun: nima tayyor, keyingi hafta nima, xavf. Oxirgisi eng muhim.

Yomon xabarni erta aytish — kasbiy odatlarning eng qimmatlisi. Muddatga ulgurmasligingizni payshanba kuni bildingiz. Ikki yo'l bor:

  • Payshanba aytasiz: rahbar rejani o'zgartiradi, yordamchi beradi yoki muddatni ko'chiradi. Hamma tayyor.
  • Dushanba aytasiz (muddat kuni): hech narsani o'zgartirib bo'lmaydi, buyurtmachiga va'da buzilgan, ishonch yo'qolgan.

Kanon CONTRIBUTING.md sida bu alohida qator: "muddatga ulgurmasangiz — bilgan kuningiz issue'da yozing (nima qoldi, nega, yangi taxmin)". Uchta qism: nima qoldi, nega, yangi taxmin. "Kechikyapman" — yetarli emas. "Migratsiya qismi qoldi, chunki DEFAULT bo'limdagi qatorlarni ko'chirish kutilmagan ish bo'ldi; yangi taxmin — chorshanba" — yetarli.

Tekshirib ko'ring: Siz ikki kunlik vazifa oldingiz. Birinchi kun oxirida tushundingiz: ish kamida besh kun. Hozir aytasizmi yoki "ehtimol ulguraman" deb ertaga kutasizmi?

Javob

Hozir. Bilgan kuningiz — eng arzon payt: reja hali o'zgarishi mumkin. Issue'ga yozing: nima ma'lum bo'ldi (qaysi kutilmagan ish), yangi taxmin, va variantlar (vazifani bo'lish, kimdir yordam berishi). "Ehtimol ulguraman" degan umid odatda muddat kuni "ulgurmadim" ga aylanadi.

5. Uchrashuv

Uchrashuv — eng qimmat muloqot. Bir soatlik uchrashuvda 6 kishi — jamoaning 6 soati.

Yaxshi uchrashuvning to'rt qoidasi:

  1. Kun tartibi oldindan. Taklifnomada: maqsad (bir gap), savollar ro'yxati, o'qib kelish kerak bo'lgan havola. Kun tartibi yo'q — uchrashuvga bormaslik uchun sabab.
  2. Faqat kerakli odamlar. Qaror qiladigan va ma'lumot beradiganlar. Qolganlarga — natija yozuvi.
  3. Vaqt chegarasi. 25 yoki 50 daqiqa — keyingi uchrashuvga nafas olish uchun.
  4. Natija yoziladi. Qarorlar va "kim — nima — qachon". Uchrashuv tugagach, issue yoki PR'ga.

Natija yozuvining namunasi:

text
Uchrashuv: AI deadline (2026-11-03, 20 daqiqa; Aziz, Nodira, Sardor)
Qaror: AI_DEADLINE_MS sukuti 25 000 ms. Sabab — PR #9 dagi hisob.
Kim nima qiladi:
- Nodira — .env.example ga izoh (bugun)
- Sardor — prodakshn p99 o'lchovidan keyin qayta ko'rish (1 oy)
Ochiq qolgan: ko'p qatorli DEFAULT ko'chirish vaqti — issue ochiladi.

Bu matn bilan Sardor endi "60 qilaman" demaydi. U qaror, sabab va qachon qayta ko'rilishini biladi.

6. Fikr bildirish va konflikt

6.1 SBI: vaziyat, xatti-harakat, ta'sir

Hamkasbga fikr (feedback) berish kerak. "Sen doim kechikasan" — ayblov: u himoyaga o'tadi va hech narsa o'zgarmaydi.

SBI — Situation, Behavior, Impact (vaziyat, xatti-harakat, ta'sir) — Center for Creative Leadership (CCL) tashkilotining fikr bildirish modeli (ccl.org, 2026-11-04 da ochib o'qildi; CCL uni o'z tadqiqotiga asoslangan usul deb ataydi):

Qism Savol Misol
Vaziyat Qachon, qayerda? "Kechagi reliz oldidan"
Xatti-harakat Nima qilindi (ko'rinadigan)? "PR testlarsiz merge bo'ldi"
Ta'sir Natijasi nima bo'ldi? "Prodakshnda 504 chiqdi, 2 soat tikladik"

Birgalikda: "Kechagi reliz oldidan PR testlarsiz merge bo'ldi, prodakshnda 504 chiqdi va 2 soat tikladik. Keyingi safar CI yashil bo'lishini kutsak bo'ladimi?"

Bunda "sen doim", "sen hech qachon" yo'q. Faqat bitta voqea, ko'rinadigan harakat va o'lchanadigan oqibat. Oxiridagi savol — keyingi qadamga taklif.

SBI maqtov uchun ham ishlaydi. "Sizning PR'ingizda (vaziyat) har sukut qiymati raqam bilan asoslangan (xatti-harakat) — review'da bitta ham "nega?" savoli bo'lmadi (ta'sir)." Bu oddiy "zo'r" dan foydaliroq: odam nimani takrorlashni biladi.

6.2 Konflikt

Jamoada kelishmovchilik bo'ladi — bu normal va ko'pincha foydali. Zararli tomoni — shaxsga o'tish.

  • Muammo haqida, odam haqida emas. "Bu yondashuv bilan bazaga yuk 3 baravar oshadi" — "Sen bazani tushunmaysan" emas.
  • Dalil bilan. O'lchov, hujjat, test. Kanon PR #9 dagi savol: "o'lchov bormi?" — fikr emas, raqam so'radi.
  • Kelishmasangiz — yuqoriga, yozma. Ikki variant, har birining afzalligi va narxi — texnik rahbar qaror qiladi. Qaror — ADR'ga.
  • "Rozi emasman, lekin qo'llayman" (disagree and commit). Qaror qabul qilindi — siz rozi bo'lmasangiz ham, uni sabotaj qilmaysiz. Fikringiz yozuvda qoldi; qaror noto'g'ri chiqsa, qayta ko'riladi.

7. Yozma xotira: kanon tajribasi

vazifalar-api da bu qoidalar uchta faylga aylandi: issue shablonlari, qaror yozuvi va CONTRIBUTING.md dagi «Muloqot» bo'limi. Mexanikasini Issues, Projects va shablonlar darsida o'rgangansiz — bu yerda nega aynan shunday ekanini ko'ramiz.

7.1 Issue shabloni — asinxron savol

Yaxshi xato xabarining qismlari («Yaxshi savolning to'rt qismi» bo'limidagidek) endi formada majburiy maydon. Kanon .github/ISSUE_TEMPLATE/xato.yml faylidan parcha:

yaml
name: Xato haqida xabar
description: Nimadir kutilganidek ishlamayapti
title: "fix: "
labels: ["tur: xato", "holat: saralash"]
body:
  - type: textarea
    id: qadamlar
    attributes:
      label: Takrorlash qadamlari
      description: >-
        Boshqa odam xuddi shu natijani ko'rishi uchun — so'rov,
        ma'lumot, buyruq.
    validations:
      required: true

Telefon uchun description qatori YAML'ning >- shakliga o'tkazildi (ma'nosi bir xil — bir qator). Faylda yana uch majburiy maydon bor: "Kutilgan natija", "Haqiqiy natija" (render: text — log uchun) va "Versiya yoki commit". Biz faylni YAML tahlilchisi bilan tekshirdik: xato 0, beshta maydon (bittasi — xavfsizlik haqida ogohlantiruvchi matn), to'rttasi majburiy.

Nega bu muloqot haqida? Chunki shablon — savol beruvchiga savol. "Bazaga ulanmayapti" deb issue ochib bo'lmaydi: forma qadamlarni, kutilganni va haqiqiyni so'raydi. Jamoa a'zosi "qanday takrorlaysiz?" deb yozib, bir kun javob kutmaydi.

Ikkinchi shablon — taklif.yml: avval muammo ("Qaysi muammo hal bo'ladi?"), keyin hikoya va qabul mezonlari. Yechimdan oldin muammo — bu ham muloqot qoidasi. Hikoya va qabul mezonlarini Mahsulot tafakkuri darsida chuqur ko'ramiz.

Uchinchisi — config.yml:

yaml
blank_issues_enabled: false
contact_links:
  - name: Xavfsizlik zaifligi
    url: https://github.com/login/vazifalar-api/security/policy
    about: >-
      Zaiflik haqida ochiq issue yozmang — shu yo'riqnoma
      bo'yicha xabar bering.

Kanon faylida url qatori oxirida izoh bor edi ("login — repo egasi; SECURITY.md shu sahifada ko'rinadi") va about bir qatorda — telefon uchun o'zgartirildi. blank_issues_enabled: false — tashqi hissa qo'shuvchi bo'sh, shablonsiz issue ocha olmaydi. Repoga yozish huquqi borlarga esa "Maintainers only" belgili bo'sh variant baribir qoladi. contact_links — issue tanlash sahifasidagi tashqi havola (docs.github.com, "Configuring issue templates for your repository", 2026-11-04). Xavfsizlik havolasi — README va loyiha hujjatlari darsidagi SECURITY.md ga.

Shablonlar main ga tushgach GitHub ularni haqiqatan ko'rishini keyingi darsda, commit va PR'dan keyin API bilan tekshiramiz. Brauzerda forma bilan issue ochish kanonda sinalmagan — kanon issue'larni gh bilan yaratgan.

7.2 ADR — qarorning yozuvi

«Nega bu kerak?» bo'limidagi Sardorni eslang. Unga chatdagi 40 xabar emas, bitta sahifa kerak edi: qaror, sabab, muqobillar.

ADR (Architecture Decision Record — arxitektura qarori yozuvi) — bitta muhim texnik qaror haqida qisqa hujjat. Har qaror — alohida raqamli fayl docs/adr/ da. Bu shaklni 2011-yilda Michael Nygard taklif qilgan: sarlavha, holat, kontekst, qaror, oqibatlar (cognitect.com, 2026-11-04 da ochib o'qildi). ADR va arxitektura diagrammalarini Arxitektura qarorlari: ADR va C4 darsida to'liq o'rganamiz; hozir bilish shart emas — bu yerda faqat muloqot vositasi sifatida.

Kanon shabloni (docs/adr/0000-shablon.md, aynan):

text
# NNNN. <Qaror sarlavhasi — fe'l bilan: "X ni Y bilan almashtiramiz">

- **Holat:** taklif | qabul qilingan | bekor qilingan | NNNN bilan almashtirilgan
- **Sana:** YYYY-MM-DD
- **Qatnashchilar:** <kim qaror qildi, kim maslahat berdi>

## Kontekst

Qanday muammo, qanday cheklovlar (vaqt, pul, jamoa bilimi, mavjud kod)? Raqamlar bilan — o'lchov, xato, hodisa.

## Qaror

Nima qilamiz — bir-ikki gap. Keyin: qanday (asosiy nuqtalar).

## Ko'rib chiqilgan muqobillar

| Variant | Afzallik | Kamchilik |
|---|---|---|
| A | | |
| B | | |

## Oqibatlar

Nima yaxshilanadi, nima qimmatlashadi, nimani kuzatish kerak; qachon qaror qayta ko'riladi.

Va birinchi haqiqiy ADR — 0001-har-modelga-alohida-breaker.md: Bisect darsidagi breaker qarori. Undan parcha:

text
# 0001. Circuit breaker — har LLM modeliga alohida

- **Holat:** qabul qilingan
- **Sana:** 2026-11-03

## Qaror

Breaker holati model nomi bo'yicha (`Map<model, Breaker>`) saqlanadi; bulkhead (parallel chegarasi) — umumiy, chunki u ilova resursini himoya qiladi.

"Ko'rib chiqilgan muqobillar" jadvalida uchta variant bor: tanlangani, o'ramlar tartibini o'zgartirish va tayyor Opossum paketi — har biri afzalligi va kamchiligi bilan. Bir yildan keyin kimdir "nega Opossum ishlatmadik?" desa, javob shu faylda.

ADR ning muloqotdagi o'rni: u PR bilan keladi. Qaror muhokamasi PR izohlarida — asinxron, hamma o'z vaqtida o'qiydi. Merge — qaror qabul qilindi. Fayl — qarorning doimiy manzili, issue va kod izohlaridan havola beriladi.

7.3 «Muloqot» bo'limi

Uchinchi fayl — qoidalarning o'zi. Kanon CONTRIBUTING.md siga qo'shilgan bo'lim (aynan):

text
## Muloqot

- **Asinxron birinchi:** savol va qaror — issue yoki PR izohida (yozma, qidiriladi, yangi odam ham o'qiydi). Chat — tezkor savol uchun; chatda qabul qilingan qaror issue'ga ko'chiriladi.
- **Katta qaror** (kutubxona, arxitektura, ma'lumot modeli) — [ADR](docs/adr/): `docs/adr/0000-shablon.md` dan nusxa, PR bilan muhokama. Namuna — `0001-har-modelga-alohida-breaker.md`.
- **Yomon xabar erta:** muddatga ulgurmasangiz — bilgan kuningiz issue'da yozing (nima qoldi, nega, yangi taxmin).

Uchta qator — bu darsning yarmi. Qolgan yarmi (chat odobi, SBI, uchrashuv) — madaniyat: uni faylga yozish qiyin, har kuni ko'rsatiladi.

Shu bilan birga «Xato haqida xabar berish» bo'limining birinchi gapi o'zgardi — endi shablonga ishora qiladi: Issue oching ("Xato haqida xabar" shabloni — .github/ISSUE_TEMPLATE/): ….

8. Loyiha qadami: shablonlar, ADR va «Muloqot»

PR #15 merge bo'lgach, main dan yangi branch:

bash
git switch main
git pull
git switch -c docs/shablonlar-adr

Qo'shing:

  1. .github/ISSUE_TEMPLATE/xato.yml, taklif.yml, config.yml — «Issue shabloni» bo'limidagidek (config.yml dagi login — o'z GitHub login'ingiz).
  2. docs/adr/0000-shablon.md va docs/adr/0001-har-modelga-alohida-breaker.md. Ikkinchisini o'zingiz yozing: Bisect darsidagi raqamlar (1 × 10 da 30 chaqiruv, 8 × 2 da 16/16 — 503) bilan.
  3. CONTRIBUTING.md ga «Muloqot» bo'limi va «Xato haqida xabar berish» dagi shablon ishorasi.

Tekshiring:

bash
git status --short

Yangi fayllar ??, CONTRIBUTING.md — M bo'lib ko'rinishi kerak.

Hali commit qilmang. Keyingi darsda CONTRIBUTING.md ga inglizcha namunalar bo'limi qo'shiladi va hammasi bitta PR bilan ketadi.

9. Ko'p uchraydigan xatolar

9.1 Qaror chatda qoldi

Belgi: "biz buni allaqachon kelishgan edik" — lekin hech kim havola bera olmaydi. Davosi: chatdagi qarorni o'sha kuni issue yoki ADR'ga ko'chirish.

9.2 "Salom" va jimlik

Savolsiz salom — javob beruvchini kutishga majburlaydi. Davosi: bitta xabarda salom va to'liq savol.

9.3 Har narsa uchun uchrashuv

Kalendar uchrashuvlar bilan to'la, kod yozishga vaqt yo'q. Davosi: kun tartibisiz uchrashuvni rad etish, status — yozma.

9.4 Yomon xabarni yashirish

"Ertaga ulgurib qolaman" — besh kun ketma-ket. Davosi: bilgan kuni — nima, nega, yangi taxmin.

9.5 Shaxsga o'tish

"Sen doim…" bilan boshlangan fikr. Davosi: SBI — bitta vaziyat, ko'rinadigan harakat, ta'sir.

9.6 Shaxsiy xabarda texnik savol

Bir odam bilimi bir odamda qoladi. Davosi: jamoa kanali yoki issue — javob hammaga ochiq.

10. Mashqlar

Mashqlar kurs/mashqlar/32/13-muloqot/ da. 2- va 3-mashq yechimlari Node 24.21.0 da tekshirilgan (biz ishga tushirdik).

1-mashq (oson): bo'shliqlarni to'ldiring

  • Hamma bir vaqtda qatnashadigan muloqot turi —
  • Savol va qaror sukut bo'yicha yozma joyda turishi qoidasi —
  • Fikr bildirish modeli: vaziyat, xatti-harakat,
  • Muhim texnik qaror yoziladigan papka — docs/
  • Shablonsiz bo'sh issue'ni o'chiradigan config.yml kaliti —
Yechim
  • sinxron — uchrashuv, qo'ng'iroq.
  • async-first — asinxron birinchi; sinxron — sabab bo'lganda.
  • ta'sir — SBI: Situation, Behavior, Impact.
  • adr — docs/adr/NNNN-nom.md, har qaror alohida fayl.
  • blank_issues_enabled — false qilinsa, faqat shablonlar qoladi.

2-mashq (o'rta): butun jamoaning umumiy soatlari

«Asinxron birinchi» bo'limidagi umumiySoatlar() ikki kishi uchun. jamoaOynasi(jamoa) funksiyasini yozing: jamoa — { ism, bosh, oxir, utc } obyektlari. Funksiya hamma bir vaqtda ishlaydigan oynani Toshkent vaqtida "HH:00–HH:00" ko'rinishida qaytarsin, oyna bo'lmasa — "umumiy vaqt yo'q". Ishora: UTC'dagi eng kech boshlanish va eng erta tugashni Math.max(...) / Math.min(...) bilan toping, keyin 5 qo'shing; String(son).padStart(2, "0") (Spread va rest operatori).

Yechim
js
function jamoaOynasi(jamoa) {
  const bosh = Math.max(...jamoa.map((a) => a.bosh - a.utc));
  const oxir = Math.min(...jamoa.map((a) => a.oxir - a.utc));
  if (oxir <= bosh) return "umumiy vaqt yo'q";
  const soat = (utcSoat) => String(utcSoat + 5).padStart(2, "0");
  return `${soat(bosh)}:00–${soat(oxir)}:00`;
}

const jamoa = [
  { ism: "Aziz", bosh: 9, oxir: 18, utc: 5 },
  { ism: "Klaus", bosh: 9, oxir: 18, utc: 1 },
  { ism: "Nodira", bosh: 10, oxir: 19, utc: 5 },
];
console.log(jamoaOynasi(jamoa));
jamoa.push({ ism: "Emma", bosh: 9, oxir: 18, utc: -5 });
console.log(jamoaOynasi(jamoa));

Konsolda:

text
13:00–18:00
umumiy vaqt yo'q

Uch kishi uchun oyna — Toshkent vaqtida 13:00 dan 18:00 gacha: Klaus 9:00 da (Berlin) boshlaydi — bu Toshkentda 13:00; Aziz 18:00 da tugatadi. Nyu-Yorkdagi Emma qo'shilgach, oyna yo'qoldi. Bunday jamoada standup yoziladi, qarorlar — issue va ADR'da. Funksiya soddalashtirilgan: tunni kesib o'tadigan smenalarni hisobga olmaydi.

3-mashq (qiyin): yangi ADR

yangiAdr(papka, sarlavha, sana) funksiyasini yozing. U papka dagi NNNN-*.md fayllardan eng katta raqamni topadi. Keyin keyingi raqam bilan yangi fayl yaratadi: nomi — NNNN- + sarlavhadan slug (kichik harf, apostrof olib tashlanadi, bo'shliq va boshqa belgilar — -), mazmuni — 0000-shablon.md dan, birinchi qatorda NNNN. <sarlavha>, **Sana:** qatorida berilgan sana, **Holat:** — taklif. Fayl nomini qaytarsin. Sinash uchun vaqtinchalik papkada shablonning qisqa nusxasi va 0001-... faylini yarating.

Ishora: readdirSync, readFileSync, writeFileSync (fs chuqur); raqam — Number(nom.slice(0, 4)), to'ldirish — padStart(4, "0"); satrni almashtirish — replace muntazam ifoda bilan, m bayrog'i qator boshini topadi (RegExp asoslari).

Yechim
js
import {
  mkdtempSync, writeFileSync, readFileSync, readdirSync, rmSync,
} from "node:fs";
import { join } from "node:path";
import { tmpdir } from "node:os";

function slugYasa(matn) {
  return matn
    .toLowerCase()
    .replaceAll("'", "")
    .replace(/[^a-z0-9]+/g, "-")
    .replace(/^-|-$/g, "");
}

function yangiAdr(papka, sarlavha, sana) {
  const raqamlar = readdirSync(papka)
    .filter((f) => /^\d{4}-.*\.md$/.test(f))
    .map((f) => Number(f.slice(0, 4)));
  const raqam = String(Math.max(...raqamlar) + 1).padStart(4, "0");
  const nom = `${raqam}-${slugYasa(sarlavha)}.md`;
  const matn = readFileSync(join(papka, "0000-shablon.md"), "utf8")
    .replace(/^# .*$/m, `# ${raqam}. ${sarlavha}`)
    .replace(/^- \*\*Holat:\*\* .*$/m, "- **Holat:** taklif")
    .replace(/^- \*\*Sana:\*\* .*$/m, `- **Sana:** ${sana}`);
  writeFileSync(join(papka, nom), matn);
  return nom;
}

const p = mkdtempSync(join(tmpdir(), "adr-"));
writeFileSync(join(p, "0000-shablon.md"), [
  "# NNNN. <Qaror sarlavhasi>", "",
  "- **Holat:** taklif | qabul qilingan", "- **Sana:** YYYY-MM-DD",
  "", "## Kontekst", "",
].join("\n"));
const birinchi = "0001-har-modelga-alohida-breaker.md";
writeFileSync(join(p, birinchi), "# 0001\n");
const sarlavha = "AI deadline'ni 25 soniya qilamiz";
const nom = yangiAdr(p, sarlavha, "2026-11-04");
console.log(nom);
const matn = readFileSync(join(p, nom), "utf8");
console.log(matn.split("\n").slice(0, 4));
console.log(readdirSync(p));
rmSync(p, { recursive: true });

Konsolda:

text
0002-ai-deadlineni-25-soniya-qilamiz.md
[
  "# 0002. AI deadline'ni 25 soniya qilamiz",
  '',
  '- **Holat:** taklif',
  '- **Sana:** 2026-11-04'
]
[
  '0000-shablon.md',
  '0001-har-modelga-alohida-breaker.md',
  '0002-ai-deadlineni-25-soniya-qilamiz.md'
]

Raqam fayl nomidan olindi (0001 → 0002), shablon fayli ham hisobga kirdi, lekin 0 eng kichik — xalaqit bermaydi. Sarlavhadagi apostrof slug'da olib tashlandi, fayl ichida esa qoldi. Birinchi qator qo'shtirnoqda chiqdi — Node apostrofli satrni shunday ko'rsatadi. Raqamlash avtomatik — ikki kishi bir vaqtda ADR yozsa, ikkalasi 0002 oladi: buni PR review'da tuzatishadi (biri 0003 ga o'zgaradi).

11. Real ishda

  • Qayerda uchraydi: masofaviy va xalqaro jamoalarda asinxron muloqot — asosiy ish usuli. GitLab o'z ichki qo'llanmasini ochiq e'lon qilgan (handbook.gitlab.com). Uning "non-linear workday" sahifasida maqsad shunday yozilgan: "meetings are a last resort" — uchrashuv oxirgi chora (2026-11-04 da ochib o'qildi).
  • Vositalar: Slack, Microsoft Teams, Telegram — chat; Jira, Linear, GitHub Issues — vazifalar; Notion, Confluence — hujjatlar. Vosita jamoada turlicha, odob bir xil.
  • Ishga qabul va sinov muddati: birinchi oylarda sizni kodingizdan ko'ra ko'proq muloqotingiz bo'yicha baholashadi: savolni qanday berasiz, muddatni qanday bildirasiz, review'ga qanday javob berasiz.
  • Intervyu savollari: "Hamkasbingiz bilan kelishmovchilik bo'lganini va qanday hal qilganingizni aytib bering", "Muddatga ulgurmasligingizni bilsangiz nima qilasiz?", "Masofadan ishlashda muloqotni qanday tashkil qilasiz?"

Xulosa

  • Sinxron — hamma bir vaqtda; asinxron — har kim o'z vaqtida. Jamoada sukut — asinxron, natija har doim yoziladi.
  • Chatda: bitta xabarda salom va to'liq savol (nima bo'ldi, nima qildim, kontekst, nima kerak).
  • Standup va status — qisqa, havolalar bilan; eng muhim qism — to'siq va xavf. Yomon xabar — bilgan kuni.
  • Uchrashuv: kun tartibi, kerakli odamlar, vaqt chegarasi, yozilgan natija.
  • Fikr — SBI bilan; konflikt — dalil bilan, shaxsga o'tmasdan; kelishilmasa — yozma variantlar va qaror.
  • vazifalar-api: issue shablonlari, ADR va «Muloqot» bo'limi qoidalarni faylga aylantirdi.

Keyingi dars: Ingliz tilida yozish va gapirish — commit, PR va review izohlarini ingliz tilida yozishni o'rganamiz va bugungi ishni bitta PR bilan yuboramiz.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Jamoada muloqot: sinxron va asinxron, standup, issue shablonlari va qaror yozuvi — IlmHamroh