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

مصاحبهٔ فنی ۱؛ حلِ مسئله با صدای بلند

⚡ پاسخ کوتاه

در مصاحبهٔ coding، ارزیابی‌شده «صدای فکرِ» توست نه فقط کد: سوال‌های شفاف‌ساز بپرس, بلند فکر کن, پیچیدگی را بگو (O(n log n)), و تست بنویس. جملهٔ نجاتِ گیرکردن: "Let me step back and rethink the approach" — بازگشتِ آبرومند، مهندسی است.

درس ۶۱ از ۹۰ — مصاحبهٔ فنی ۱؛ حلِ مسئله با صدای بلند

مصاحبهٔ coding، ترسناک‌ترین ۴۵ دقیقهٔ هر برنامه‌نویسِ غیرِ بومی است: مسئله + کد + انگلیسی، هم‌زمان. اما ساختارش کاملاً بازی‌پذیر است: مصاحبه‌گرها یک روبکِ ارزیابی ثابت دارند (communication, problem solving, coding, testing) و بلند-فکرکردنِ ساختارمند، امتیازِ همان روبریک را می‌گیرد — حتی وقتی جوابِ نهایی ناقص است.

این درس، مسیرِ کامل را با دیالوگ می‌دهد: از «ببخشید، سوال را دقیق‌تر بخواهم» تا «اجازه بده تستش کنم». درسِ بعد system design است؛ درس ۶۳ رفتاری (behavioral).

درکِ مسئله؛ سوال‌های شفاف‌ساز

قبل از کد، سه-چهار سوال بپرس — همین سوال‌ها اولین امتیازِ توست: ۱) ورودی/خروجی: "So the input is a list of integers, and I should return the indices — right?" ۲) لبه‌ها: "Can the list be empty? Can it have duplicates?" ۳) اندازه: "How big can n get? — That tells me if O(n²) is fine or I need better." ۴) مفروضات: "Is the input sorted? Can I modify it in place?" — و جمع‌بندِ بازگویی: "So to confirm: given an unsorted list and a target, return any pair that sums to it. Empty list means no answer." بازگویی، تو را از نصفِ خطاهای مصاحبه دور نگه می‌دارد.

That's a great clarification — so duplicates are possible. That changes my approach: I'll use a hash map of value → index.توضیحِ خوبی بود — پس مقدارِ تکراری ممکنه. رویکردِ من عوض می‌شه: از hash map مقدار→ایندکس استفاده می‌کنم.

بلند فکرکردن؛ قالب‌های مسیرِ حل

سه قالبِ صدای فکر: ۱) رویکرد اولیه: "My first instinct is the brute force — two nested loops, O(n²). It works, but let me see if I can do better." (همیشه از brute force شروع کن — صداقتِ فنی است) ۲) بهبود: "I can trade space for time: one pass with a hash map — O(n) time, O(n) space." ۳) تصمیمِ نوشتن: "I'll code the hash-map version — it's clean and n can be a million." و جمله‌های میانِ کد: "I'm writing a helper for…" · "This part assumes the input is not null — I'll add a guard." · "Let me name it clearly — findFirstPair." اسمِ خوب و کامنتِ «چرا»، امتیازِ نوشتارِ فنی‌ات است.

Let me think out loud for a second… the tricky part is the wrap-around case. I'll handle it by taking the modulus.بذار یه لحظه بلند فکر کنم… قسمتِ پیچیده، حالتِ دور-زدنه. با باقیماندهٔ تقسیم هندلش می‌کنم.

تست، پیچیدگی و گیرکردن؛ سه‌گانهٔ پایان

تست (بعد از کد): "Let me trace through an example: input 2, 7, 11 — target 9. First iteration stores 2, second finds 7's complement… returns 0,1. Looks right. Edge case: empty list — returns null, as agreed." پیچیدگی: "Time is O(n) — single pass. Space is O(n) for the map. If memory were tight, the sorted two-pointer approach gives O(1) extra space at O(n log n) time." و جمله‌های نجاتِ گیر: "Hmm, this doesn't handle the negative case. Let me step back and rethink." · "I'm going in circles here — can I get a hint? I'd rather ask than stall." — درخواستِ hint با این صراحت، در روبریکِ communicationِ بیشترِ شرکت‌ها امتیاز دارد نه جریمه: گیرِ بی‌صدا جریمه دارد، گیرِ شفاف نه.

گرامرِ عمیق‌تر: زبانِ پیچیدگی و زمانِ مصاحبه

مصاحبهٔ کدنویسی، جمله‌های ثابتِ فنی دارد: "This runs in O(n) time and O(1) space." (این با زمانِ O(n) و فضای O(1) اجرا می‌شه) — دو بعدِ پیچیدگی را همیشه با هم بگو. "I can trade memory for speed" (می‌تونم حافظه رو با سرعت عوض کنم) — قالبِ بهبود. "The naive approach is O(n²); I can do better with a hash map." و برای تست: "Let me trace through an example" (بذار با یه مثال ردیابی کنم) — ردیابیِ بلند، امتیازِ تستِ ذهنی است. و سوالِ شفاف‌سازِ ابدی: "Can the input be empty?" / "Are duplicates possible?"

The brute force is O(n²) — two nested loops. I can trade memory for speed: one pass with a hash map gives O(n) time at O(n) space. Given n up to a million, that trade pays for itself.راهِ بی‌رحمانه O(n²)ئه — دو حلقهٔ تو در تو. می‌تونم حافظه رو با سرعت معاوضه کنم: یه پاس با هش‌مپ، زمانِ O(n) با فضای O(n). با n تا یک میلیون، این معامله خودش رو می‌کنه.

گفتگو: چهار دقیقهٔ اوجِ مصاحبهٔ کدنویسی

Interviewer: Find the first unique character in a string. — You: Quick clarifications — empty string? Case-sensitive? Unicode?مصاحبه‌گر: اولین کاراکترِ یکتا در رشته. — تو: دو سه تا شفاف‌سازی — رشتهٔ خالی؟ حساس به حروفِ بزرگ/کوچک؟ یونیکد؟
Interviewer: Non-empty, case-sensitive, ASCII. — You: So my plan: one pass to count, one pass to find — O(n) twice, O(1) space since the alphabet is fixed. Writing it now.مصاحبه‌گر: غیرخالی، حساس، ASCII. — تو: پس نقشه‌م: یه پاس شمارش، یه پاس پیدا کردن — دوبار O(n)، فضای O(1) چون الفبا ثابته. می‌نویسمش.
You: Let me trace: "swiss" — counts are s:3, w:1, i:1. Second pass finds w. Edge case: all repeated — return -1. That's the contract.تو: ردیابی کنم: «swiss» — شمارش‌ها s:3, w:1, i:1. پاسِ دوم w رو پیدا می‌کنه. حالتِ لبه: همه تکراری — -۱ برمی‌گردونیم. قرارداد همینه.
Interviewer: Solid. What if the string is a stream — can't hold it? — You: Then a second pass is impossible — I'd need a different structure… honestly, this smells like a bounded queue problem. Can I think out loud?مصاحبه‌گر: محکم. اگه رشته استِرِم باشه — نگهش نداشتیم؟ — تو: اون‌وقت پاسِ دوم غیرممکنه — ساختارِ متفاوتی لازمه… راستش بوی مسئلهٔ صفِ محدود می‌ده. می‌شه بلند فکر کنم؟

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

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

❌ I will solve it with hash map.❌ دو گره در یک جمله: فارسی حرفِ تعریف ندارد و a جا می‌افتد؛ و will قول می‌دهد — مصاحبه راه‌حلِ ذهنیِ در-دستِ تکامل می‌خواهد، I'd پیشنهاد می‌دهد. حلِ مسئله با شرطیِ نرم شروع می‌شود نه با قول.
✅ I'd solve it with a hash map.✅ شکل درست را دو بار بلند بگو؛ حالا یک بار در یک جملهٔ خودت.
❌ The time of this solution is n square.❌ «مربعِ n» مستقیم n square می‌شود؛ نشانهٔ استاندارد O(n²) است و خواندنش «او-ان-اسکوئر» یا quadratic — مصاحبه‌گر فقط زبانِ استاندارد را می‌شنود، n square صدای ترجمه است.
✅ This runs in O(n²) time — quadratic.✅ شکل درست را دو بار بلند بگو؛ حالا یک بار در یک جملهٔ خودت.
❌ Let me to think a moment.❌ «بگذار یک لحظه فکر کنم» بعد از let me مصدرِ با to می‌سازد، چون «اجازه‌یِ دادن» در ذهن با to گره خورده؛ بعد از let me فعلِ خام می‌آید — let me think، بدونِ to.
✅ Let me think for a second.✅ شکل درست را دو بار بلند بگو؛ حالا یک بار در یک جملهٔ خودت.

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

مصاحبهٔ کدنویسی، گفتارِ حینِ فکرکردن است؛ چهار تمرین را بلند و با وقفهٔ طبیعی اجرا کن، بعد پاسخ‌ها را باز کن.

  1. برای مسئلهٔ «اولین کاراکترِ یکتا» دو سؤالِ شفاف‌ساز دربارهٔ ورودی بپرس.
  2. پیچیدگیِ راهِ بی‌رحمانه را کامل بگو: دو حلقهٔ تو-در-تو — زمان و فضا، هر دو.
  3. جملهٔ معاوضه را کامل کن: «I can trade ___ for ___: one pass with a hash map gives…»
  4. ردیابی را بلند اجرا کن: برای رشتهٔ swiss شمارش‌ها را بگو و پاسِ دوم را گزارش کن.

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

پاسخ تمرین ۱
نمونه: "Quick clarifications — can the string be empty? And is it case-sensitive?" شفاف‌سازی امتیازِ مستقلِ مصاحبه است؛ سکوتِ شروعِ فوری، نمرهٔ communication را می‌سوزاند.
پاسخ تمرین ۲
"The brute force is O(n²) — two nested loops, and constant space." دو بُعدِ پیچیدگی همیشه با هم گفته می‌شوند؛ جملهٔ نصفه در مصاحبه، فکرِ نصفه شنیده می‌شود.
پاسخ تمرین ۳
"...trade memory for speed: one pass with a hash map gives O(n) time at O(n) space." معاوضه با trade X for Y — «حافظه را با سرعت»؛ for یعنی «به‌عوضِ»، نه «به».
پاسخ تمرین ۴
"Let me trace: swiss — counts are s:3, w:1, i:1. The second pass finds w." ردیابیِ بلند هم تستِ ذهنی است هم نمایشِ ذهنِ منظم؛ نمره، مسیرِ فکر را هم می‌خرد.

چالشِ امروز

🎯 امروز یک مسئلهٔ سادهٔ برنامه‌نویسی را بلند حل کن — شفاف‌سازی، طرح، ردیابی، همه با صدا. مصاحبه از گوشِ تمرین‌ندیده عبور نمی‌کند.

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

  • شفاف‌سازی = امتیاز — سه-چهار سوالِ آغازین، امتیازِ مستقلِ مصاحبه است — سکوتِ شروعِ فوری، نمرهٔ communication را می‌سوزاند.
  • Blind blind را بلند بگو — «Let me trace through an example» — ردیابیِ بلند، هم تست است هم نشانهٔ ذهنِ منظم؛ سکوتِ ایده‌آل، سکوتِ فکر شمرده می‌شود نه ابهام.
  • گیر کردی؟ مثل حرفه‌ای بگیر — «Let me step back and rethink the approach» یا «Can I get a hint? I'd rather ask than stall» — درخواستِ hint با این صراحت، امتیاز است.
🔑 جمع‌بندی این درس

روتینِ مصاحبهٔ coding: شفاف‌سازها (ورودی/لبه/اندازه/مفروضات) + بازگویی + بلند-فکر (brute force → بهبود → تصمیم) + تستِ ردیابی + پیچیدگی (O(n)/O(n²) را راحت بگو). گیر که خوردی: "Let me step back" یا درخواستِ صریحِ hint. صدای فکر، همان چیزی است که مصاحبه‌گر می‌خرد.

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

انگلیسی‌ام وسطِ فکر قطع می‌شود و سکوت می‌کنم!
سکوتِ فکری، مشکلِ همه است — حتی بومی‌ها. تفاوت در مدیریتش: جمله‌های پرکنندهٔ فکر را از حفظ کن: **"Give me a second to think…"** · **"I'm weighing two approaches here…"** · **"Bear with me — this is the tricky part."** — همین سه جمله، سکوتِ آبرومند می‌سازند. و برای قطعیِ جدی‌تر: **"Sorry, I lost my thread — where were we?"** مصاحبه‌گرها این‌ها را روزی ده بار می‌شنوند؛ هیچ‌کدام امتیازِ منفیِ واقعی ندارند، فقط سکوتِ مرده دارد.
چهار 公司类型ِ مصاحبهٔ coding را بشناسم؟
چهار چهرهٔ رایج: **۱) الگوریتمیِ کلاسیک** (همین درس — CoderPad/Google Doc), **۲) take-home** (مسئله را می‌بری خانه، ۲-۳ روز): جمله‌اش در ایمیلِ تحویل: "A few notes on the design choices are in the README — happy to walk through them." **۳) pair-programming** (با کارمند): "Want me to drive first, or you?" (من تایپ کنم اول یا تو؟) **۴) live debugging**: کدِ ناقصِ عمدی می‌دهند — درس ۵۷ (دیباگ) همان ادبیاتش است. برای هر چهار، صدای فکر یکسان است؛ فقط ظرف عوض می‌شود.

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

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