آموزش زبان انگلیسی (دورهٔ ۹۰ درسی) · درس ۵۶ از ۹۰

کدریویو؛ دادنِ بازخوردِ فنی و گرفتنش بدونِ زخم

⚡ پاسخ کوتاه

کدریویو دو نیمهٔ جداشدنی ندارد — دادن و گرفتنِ نظرِ فنی، هر دو با قالب می‌آیند. دادن: دسته‌بندیِ کامنت‌ها (nit / suggestion / blocking) و سوال‌بستن به‌جای حکم (Would you consider…?). گرفتن: thanks, good catch — و جداکردنِ «کد» از «خود».

درس ۵۶ از ۹۰ — کدریویو؛ دادنِ بازخوردِ فنی و گرفتنش بدونِ زخم

کدریویو، حساس‌ترین مکالمهٔ فنی است: می‌خواهی به همکارت بگویی کدش بد است، بدونِ این‌که بگویی خودش بد است — و برعکس، بخوری «این غلط است» را بدونِ دفاعِ شخصی. فرهنگِ تیم‌های انگلیسی‌زبانِ سالم برای همین، قالب‌های دقیقی دارد؛ قالب‌ها هم مؤدب‌اند هم کارآمد.

برای زبانِ دوم یک خبرِ خوب: کامنتِ ریلویو، مکالمهٔ کوتاهِ نوشتاری است — زمانِ فکر دارد. همین درس را نه فقط بخوان، بلکه template کن؛ اولین ریلویوی جدی‌ات، از دل همین قالب‌ها بیرون می‌آید.

دادنِ کامنت؛ سه درجه و دو قالب

درجه واژه جملهٔ نمونه
اصلاحِ ضروری blocking / must-fix Blocking: this breaks on empty input — we need a guard clause.
پیشنهاد suggestion / could consider Suggestion: we could extract this into a helper — up to you.
جزئی nit (nitpick) Nit: trailing space here. Not blocking.
ستایش praise / this is nice This is a really clean solution — learned something!
سوال question Question: why array over set here? Genuine curiosity.

دو قالبِ طلاییِ نرم‌کردن: ۱) سوال به‌جای حکم: نهِ «This is wrong» — که «Would you consider using a set here? Lookups would be O(1).» ۲) «ما» به‌جای «تو»: «What if we extracted the validation into its own function?» — «ما»، کامنت را از امتحانِ شخصی به تصمیمِ مشترک می‌برد. و قانونِ «praise در جا»: اگر چیزی خوب بود، همان لحظه بنویس — ریلویو فقط شکارِ اشکال نیست.

Nit: could we name this `retryCount` instead of `n`? Future-us will thank us.جزئی: می‌شه اسمش retryCount باشه نه n؟ خودِ آینده‌مون ممنون می‌شه.

گرفتنِ کامنت؛ سه پاسخِ حرفه‌ای

۱) پذیرشِ گرم: "Good catch — fixing now." (دقتِ خوبی بود — همین الان درستش می‌کنم) ۲) توضیح + بازگشایی: "Fair point. I kept it sync because the caller needs the value immediately — but I'm open if you see a cleaner way." ۳) مخالفتِ مستند: "I see it differently — with the new cache, the extra query costs almost nothing. Happy to discuss on a call if you're not convinced." — هر سه: کوتاه، بی‌حالتیِ دفاعی، و برنده. قاعدهٔ طلایی: هر کامنت را یک نظرِ فنی ببین نه حکمِ شخصی — جملهٔ یادگاریِ صنعت: "Review the code, not the coder."

Thanks for the thorough review! Addressed everything except the last point — added a comment in the PR explaining why.ممنون بابت ریلویوی کامل! همه رو اعمال کردم جز آخرین نکته — تو PR توضیحش رو نوشتم.

جریانِ ریلویو؛ درخواست تا merge

زبانِ جریان: "Could you take a look when you get a chance?" (درخواست) · "Left a few comments — nothing blocking." (جوابِ ریلویور) · "Pushed the changes — PTAL." (اعمال شد؛ PTAL = please take another look — مخففِ محبوبِ گیت‌هاب) · "LGTM!" (looks good to me — یعنی تأیید؛ سه حرفِ شیرینِ هر PR) · "LGTM with nits." (تأیید — با همین جزئی‌های کوچیک). ادبِ زمان: ریلویوِ PRِ دیگران را همان روزی که می‌خواهی خودت ریلویو شوی بده — اقتصادِ متقابلِ تیم‌های سالم است.

گرامرِ عمیق‌تر: مودالِ ریلویو — should و could و نرمیِ شرطی

ریلویو، زبانِ مودال‌های مشورتی است: should (پیشنهادِ قوی: this should be async), could (گزینه: we could extract a helper), might (احتمال: this might break on empty input) — و نرم‌ترینِ همه، شرطیِ دوم: If this were a public API, I'd rename it (اگر API عمومی بود، اسمش رو عوض می‌کردم) — were/'d، فرمِ مؤدبانهٔ نقدِ فرضی! و برای درجه‌گذاریِ نظری به لحنِ نوشتاری: Blocking: (بلاک‌کننده), Nit: (جزئی), Question: (سوال) — سه برچسبِ اولِ کامنت، ریلویو را از گفتگو به سندِ تصمیم می‌برد.

Question: do we need this loop at all? If it were just a lookup, a hash map would do the job in one pass — happy to be wrong here!سوال: اصلاً به این حلقه نیاز داریم؟ اگه فقط جستجو بود، یه هش‌مپ توی یه پاس کافیه — خوشحال می‌شم اشتباه کرده باشم!

گفتگو: بحثِ ریلویو در thread و جمع‌بندی

Reviewer: Blocking — this swallows the error, and we just got burned by that in payments. — You: Fair. I'll log and rethrow. — Reviewer: That's all I wanted.ریلویوئر: بلاک — این خطا رو قورت می‌ده، و تازه تو پرداخت از همین سوخته بودیم. — تو: درسته. لاگ می‌کنم و دوباره می‌اندازمش. — ریلویوئر: همین می‌خواستم.
Reviewer: Nit: this name, `data2`… future-us will suffer. — You: Ha! Renamed to `pricingSnapshot`. — Reviewer: LGTM with that one nit.ریلویوئر: جزئی — این اسم، data2… خودِ آیندهٔ ما زجر می‌کشه. — تو: ها! به pricingSnapshot تغییرش دادم. — ریلویوئر: LGTM با همین جزئی.
You: Pushed — PTAL. And thanks for the burn-mark story, honestly — context like that is why I'd rather have reviews than ship blind. — Reviewer: Same. That's the whole job.تو: پوش شد — یه نگاه دیگه. و ممنون از داستانِ سوختگی — زمینه‌ی این‌جوری دلیلِ ترجیحِ ریلویو به شِپِ کوره. — ریلویوئر: منم. کلِ کار همینه.

اشتباه‌های رایجِ فارسی‌زبان‌ها در همین درس

این بخش را با یک قرارداد بخوان: هر ❌ یعنی «مغزِ فارسی‌زبانت این را می‌سازد و طبیعی است»، و هر ✅ یعنی «این همان چیزی است که گیرندهٔ انگلیسی‌زبان می‌شنود». خطاها اثرِ مستقیمِ ترجمهٔ ذهنیِ فارسی به انگلیسی‌اند؛ با هر جفت بلند تکرار کن تا شکلِ درست در گوشت نشست کند.

❌ This code is wrong, please fix it.❌ فارسیِ «این کد غلطه» نقد را با قاطعیتِ حکم می‌فرستد؛ کامنتِ ریلویوی حرفه‌ای رفتارِ کد را هدف می‌گیرد نه «درستی»ِ نویسنده را، و با could we نرم می‌شود. wrong حکم است؛ swallows the error مشاهده است.
✅ This swallows the error — could we log and rethrow here?✅ شکل درست را دو بار بلند بگو؛ حالا یک بار در یک جملهٔ خودت.
❌ Please do the necessary changes.❌ ترجمهٔ اداریِ «تغییراتِ لازم را اعمال فرمایید» تهِ کامنت خالی است؛ «تغییراتِ لازم» دقیقاً همان چیزی است که ریلویو باید اسمش را ببرد. کامنتِ خوب = فهرستِ مشخص + برچسبِ درجه (Nit/Blocking).
✅ Two nits: rename `data2` to `pricingSnapshot`, and this loop could be a helper — non-blocking.✅ شکل درست را دو بار بلند بگو؛ حالا یک بار در یک جملهٔ خودت.
❌ There is a problem in this line.❌ «مشکل دارد» بدونِ حرفِ تعریف می‌ماند و «در خطِ چهل‌ودو» با in ترجمه می‌شود؛ قراردادِ ریلویو on line 42 است، مثلِ شماره‌گذاریِ صفحه. و مشکل را دقیق و بی‌تهدید توصیف کن، نه با لفظِ کلی.
✅ I think there's an issue on line 42 — the loop starts at 1 instead of 0.✅ شکل درست را دو بار بلند بگو؛ حالا یک بار در یک جملهٔ خودت.

تمرین‌های این درس — چهار قدم، بی‌عجله

چهار تمرینِ ریلویو-نویسی؛ هر پاسخ را اول بلند بگو و بنویس، بعد باز کن — کامنتِ خوب، آینهٔ ذهنِ منظم است.

  1. این کامنت را نرم و فنی‌اش کن: «This loop is bad. Delete it.» — با برچسب و مودالِ مشورتی.
  2. جملهٔ شرطیِ دوم را کامل کن: «If this ___ (be) a public API, I ___ (rename) it.»
  3. به PRی که فقط یک Nit دارد جوابِ کوتاهِ کامل بده — دو جمله، با رأیِ روشن.
  4. ترجمه کن: «نمی‌دانم چرا این بررسی لازم است. اگر ورودی خالی باشد چه می‌شود؟» — با برچسبِ Question.

پاسخ تمرین‌ها — اول خودت جواب بده، بعد باز کن

پاسخ تمرین ۱
نمونه: "Question: do we need this loop at all? A hash map would do the job in one pass." — «bad» رفت، برچسب آمد، مودال نشست؛ همان نقد، بدونِ زخم.
پاسخ تمرین ۲
were … I'd rename — "If this were a public API, I'd rename it." were با همهٔ سوژه‌ها و 'd برای نتیجهٔ فرضی؛ این است نرم‌ترین صدای ریلویو.
پاسخ تمرین ۳
نمونه: "Just the one nit, then LGTM — ship it." رأیِ نهایی را با برچسب بده؛ «خوبه ولی…» مرج را معلق می‌کند.
پاسخ تمرین ۴
"Question: I'm not sure why we need this check — what happens if the input is empty?" برچسب + عدمِ قطعیتِ صادقانه + سؤالِ مشخص؛ سه لایهٔ کامنتِ بی‌جنگ.

چالشِ امروز

🎯 در ریلویوی بعدی‌ات یک کامنت را با قالبِ سه‌لایه بنویس: برچسب (Nit/Question/Blocking) + رفتارِ مشخص + مودالِ مشورتی؛ اگر ریلویویی در راه نیست، یکی از کامنت‌های قبلی‌ات را بازنویسی کن.

نکات مکالمهٔ واقعی که کتاب‌ها کم می‌گویند

  • Happy to be wrong — پایانِ کامنتِ نظر-محور: «happy to be wrong here» — علامتِ آگاهیِ تیمی؛ نظر می‌دهی، جنگ نمی‌کنی.
  • پاسخِ بلند ننویس — پاسخِ کامنت: یک-دو خط یا یک commit. بحثِ طولانی در thread = جلسهٔ پنهان — بردارش به تماس.
  • رایِ نهایی را با برچسب بده — پایانِ ریلویو: «LGTM» یا «LGTM with nits» — ابهامِ «خوبه ولی…»، مرج را معلق می‌کند.
🔑 جمع‌بندی این درس

دادن: درجه‌گذاری (blocking / suggestion / nit / praise) + سوال به‌جای حکم (Would you consider…?) + «we» به‌جای «you». گرفتن: Good catch / Fair point / مخالفتِ مستند با پیشنهادِ تماس. جریان: PTAL و LGTM — دو مخففِ دنیای ریلویو. و یادت باشد: کامنت، هدیهٔ فنی است؛ قالبش را همین درس داده.

پرسش‌های رایج

ریلویور تندگوی است و کامنت‌ها زخم‌اند — چه کنم؟
سه پله: ۱) قالب را از خودت نگیر: «This is wrong» را به «رو کد نظر می‌ده» ترجمه کن — و جوابِ سردِ حرفه‌ای بده (بالاتر). ۲) اگر لحنِ واقعاً بی‌ادبانه تکرار شد، خصوصی و آرام: **"Hey, your technical points are always solid — the tone sometimes makes it hard to process. Could we keep it a bit softer?"** ۳) اگر ادامه کرد، مدیر/لید را در جریان بگذار — تیمِ سالم، تیکتِ لحن هم دارد. اما ۹۰٪ موارد، همان پلهٔ یک کافی است: جوابِ آرامِ بی‌دفاعی، خودش لحن را بعد از دو-سه ریلویو نرم می‌کند.
چطور ریلویوگرِ خوبی شوم وقتی جونیورم؟
سه امانتِ ریلویوگرِ جونیور: **۱) سوال بپرس** — سوالِ واقعی، کامنتِ محترم است: «Curious — why not use the standard library here?» **۲) چیزی که یاد گرفتی را بگو**: «TIL you can do this with pattern matching — nice.» **۳) تست و UX را چک کن** — چشمِ تازه، خطاهایی می‌بیند که چشمِ خبره عادت کرده است. جونیورِ ریلویوگرِ فعال، سریع‌ترین مسیرِ ارتقای فنی-اجتماعی است.

انگلیسی را همین امروز در گوشی‌ات تمرین کن

واژه‌های این درس را هر جا که دیدی با منوی «ذخیره در آپ‌ورد» به فلش‌کارت‌هایت اضافه کن؛ الگوریتم مرور فاصله‌دار سرِ موعد یادآوری‌شان می‌کند، تلفظ‌شان را می‌شنوی و در مکالمهٔ هوش مصنوعی همان‌جا که لازم است استفاده‌شان می‌کنی.