عملکرد عالی در مصاحبه برنامه‌نویسی: چگونه دوبار از گوگل و فیس‌بوک پیشنهاد کاری دریافت کردم!

در سال 2017، پیشنهاداتی از فیس‌بوک، گوگل و مایکروسافت دریافت کردم. فکر می‌کردم شانس آورده‌ام. اما در سال 2019، من همان فرآیند آماده‌سازی را دنبال کردم و نتایج تکرار شد: پس از دریافت پیشنهادات از فیس‌بوک، گوگل، اسنپ، اسکوئر و اوبر، متوجه شدم که یک فرایند تکرارپذیر برای مصاحبه‌های برنامه‌نویسی پیدا کرده‌ام. پروسه من طی صدها ساعت مطالعه برای مصاحبه‌های فنی و بیش از 100 ساعت مصاحبه در شرکت‌های واقعی انجام شد. من راهنمایی نوشتم تا با دوستان خود به اشتراک بگذارم؛ که آن را ارزشمند دانستند و من را تشویق کردند که آن را با مخاطبان بیشتری به اشتراک بگذارم.

این راهنما فقط سوالات برنامه‌نویسی را پوشش می‌دهد. فرایند من نکات زیادی را برای تمرین کارآمد ارائه می‌دهد، اما میانبرهای کمی دارد و در میان راهنماهای آماده‌سازی مصاحبه، مانند "هفته کار 4 ساعته" نیست. در عوض، این یک رویکرد سیستماتیک است که زمان می‌برد و یک بنیان مصاحبه قوی ایجاد می‌کند.

آنچه باید انتظار داشته باشید: این کار، سخت است

شب‌های بی‌خوابی. دست‌های عرق‌کرده. چشمان اشک‌آلود. آمادگی و مصاحبه برای مشاغل برنامه‌نویسی طاقت‌فرسا است زیرا مصاحبه به خودی خود یک مهارت است. برنامه‌نویس خوب بودن شما را مصاحبه‌کننده خوبی نمی‌کند. هنگامی که مهارت‌های مصاحبه خود را توسعه می‌دهید، پیشرفت شما از یک منحنی نمایی پیروی می‌کند - شما برای مدتی نتایج را مشاهده نخواهید کرد، با طردشدگی زیادی روبرو خواهید شد و این باعث تضعیف روحیه شما می‌شود. اما نهایتا دانش و تجربه شما ترکیب می‌شود و با پیشروی، به نقطه عطفی خواهید رسید که در آن به سرعت پیشرفت کرده و به طور مداوم در مصاحبه‌ها موفق عمل می‌کنید.

فرآیند

پروسه آمادگی را می‌توان به دو بخش تقسیم کرد:

1. دانش: آیا اطلاعات کافی در زمینه مورد نظر دارید؟

2. اضطراب: آیا می‌توانید تحت فشار روانی خوب عمل کنید؟

شکل دادن به ساختار دانش

تمرین هدفمند، کارآمدترین راه برای بهبود نقاط ضعف شما است.

قدم اول: تشخیص نیاز

برای شناسایی زمینه‌هایی که باید روی آن‌ها کار کنید (اگر همه زمینه‌ها نیاز به کار دارند ایرادی ندارد)، از کتاب "Cracking the Coding Interview (CTCI) "Interview Questions به عنوان یک تست تشخیصی استفاده کنید، زیرا همه دسته‌های اصلی سوالات را پوشش می‌دهد. هر بار یک فصل را مرور کنید. اگر با چند چالش در یک گروه (مانند آرایه‌ها) روبرو شدید و آسان به نظر می‌رسند، به فصل بعدی بروید. در غیر این صورت، تمام چالش‌های یک فصل را حل کنید. وقتی کتاب را مرور می‌کنید، اعتماد به نفس خود را در هر بخش یادداشت کنید. من از مقیاس 4 نقطه‌ای استفاده می‌کنم؛ که در آن: 1- عدم اطمینان، 2- بی‌ثبات، و 3- قابل عبور، و 4- تسلط کامل. پس از گذراندن فصل‌های این کتاب، به چیزی شبیه این می‌رسید:

Arrays and Strings: 2

Linked Lists: 1

Stacks and Queues: 3

همین روند را برای همه فصل‌ها تکرار کنید

قدم دوم: تمرین کارآمد

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

فقط سوالات با سطح دشواریِ آسان و متوسط را در LeetCode امتحان کنید. سوالات سخت وقت زیادی می‌برند و در نتیجه به ندرت در مصاحبه‌های واقعی مطرح می‌شوند؛ زیرا مصاحبه‌ها معمولاً فقط 45 دقیقه طول می‌کشند.

هر بار یک دسته را تمرین کنید. با نقاط ضعف خود شروع کنید و به کمک LeetCode، بسیار تمرین کنید. یک گروه را در یک زمان (به عنوان مثال فقط سوالات آرایه) در مجموعه‌های 5 تا 10 سوالی تمرین کنید. برخلاف انجام مجموعه‌ای از سوالات از دسته‌بندی‌های مختلف، عمیق شدن در یک دسته، تکرار مورد نیاز برای ایجاد شهود در حل انواع چالش‌های خاص را فراهم می‌کند. همانطور که در یک دسته تمرین می‌کنید، الگوها و استراتژی‌هایی را مشاهده خواهید کرد که می‌تواند به شما در حل هرگونه سوال در آن زمینه کمک کند.

اکانت پرمیوم Leetcode تهیه کنید. من این هزینه را پرداخت می‌کنم زیرا به من کمک می‌کند بفهمم کدام چالش‌های برنامه‌نویسی رایج هستند و همیشه از محبوب‌ترین آنها در هر دسته شروع می‌کنم، زیرا می‌خواهم سوالات عملی‌ای را که احتمالاً در مصاحبه‌های واقعی مشاهده می‌کنم، تجربه کنم. تفاوت بین پیشنهاد کاری بد و خوب ده‌ها تا صدها هزار دلار در سال است، بنابراین 35 دلار در ماه هزینه کمی است که باید برای افزایش شانس خود پرداخت کنید. من همچنین شنیده‌ام که AlgoExpert نسبت به قیمتش بسیار مناسب است.

برای هر سوال 30 دقیقه زمان صرف کنید. یک تایمر را به مدت 30 دقیقه تنظیم کنید. اگر تمام شد و نزدیک اتمام سوال نیستید، به پاسخ نگاه کنید زیرا صرف زمان بیشتر بازدهی کمتری دارد.

پیچیدگی زمان اجرا را محاسبه کنید. از آنجا که مصاحبه‌کننده همیشه از شما پیچیدگی زمان اجرا را می‌خواهد، در هر سوال این موضوع را تمرین کنید.

با صدای بلند فکر کنید. از آنجایی که برای مصاحبه مجبور هستید در حین برنامه‌نویسی صحبت کنید، با صدای بلند فکر کنید تا به آن عادت کنید.

سوالات متداولی را که برایتان سخت بود، چند روز بعد مرور کنید. این امر آموخته‌های شما را تقویت می‌کند و این که بتوانید تمام سوالات متداول را حل کنید، پایه‌ای قوی ایجاد می‌کند. به هر حال، اکثر سوالات از میان چالش‌های رایج هستند.

چقدر باید تمرین کنید؟ من برای اولین دوره آمادگی مصاحبه، تقریباً 150 سوال را تمرین کردم. بار دوم من حدود 100 مورد که قبلاً انجام داده بودم و 50 مورد جدید را انجام دادم. من به تمرکز بر متداول‌ترین سوالات اعتقاد دارم.

به طور خلاصه: برای تشخیص نقاط ضعف، کتاب CTCI را بخوانید. سپس با Leetcode تمرین کنید. فقط چالش‌های آسان و متوسط را انجام دهید. از پایتون استفاده کنید.

تسلط یافتن بر ذهن

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

1. محیط را شبیه‌سازی کنید

اکنون همه‌ی مصاحبه‌ها به صورت مجازی انجام می‌شود، پس میز کار و لپ‌تاپتان را برای یک مصاحبه‌ی واقعی آماده کنید. نرم‌افزار تماس ویدیویی را باز کنید و از یک ادیتور آنلاینِ بدون تکمیل خودکار مثل Coderpad برای نوشتن برنامه و اجرای آن استفاده کنید.

نکته‌ای در مورد وایت‌برد: در گذشته با توجه به مصاحبه‌های حضوری، ممکن بود بخواهید روی وایت‌برد تمرین کنید؛ اما من دوستی دارم که در جلسات حضوری هم درخواست می‌کرد به جای وایت‌برد از لپ‌تاپ استفاده کند و درخواستش هرگز رد نشد.

2. از کسی بخواهید شما را در حین کار تماشا کند

برای شبیه‌سازی فشار مصاحبه‌ی زنده، نیاز دارید کسی شما را حین برنامه‌نویسی و صحبت کردن با خودتان تماشا کند. در حالت ایده‌آل یک مهندس نرم‌افزار را برای این کار پیدا می‌کنید تا بر روی کد زدنتان نظارت کند و در بدترین حالت از هر شخصی مثل مادر، دوست یا خواهر و برادرتان بخواهید در این زمان شما را تحت‌نظر بگیرد. از آنجا که در حال حاضر مصاحبه‌ها مجازی برگزار می‌شوند، از آن‌ها بخواهید از طریق تماس ویدیویی نظارت را انجام دهند.

3. چند مصاحبه‌ی عملی انجام دهید

اگر ممتحن شما یک مهندس کامپیوتر است، از او بخواهید یک سوال که قبلا آن را ندیده‌اید انتخاب کند. سپس ساعت را برای 35 دقیقه‌ی بعد تنظیم و شروع کنید. قطعا هر کس سبک مصاحبه‌ی خاص خود را دارد اما من در همه‌ی مصاحبه‌های موفقیت‌آمیزم از قالب زیر استفاده کرده‌ام:

  • شفاف‌سازی (حدود 2 دقیقه)

ابتدا سوال را چند بار بخوانید و مطمئن شوید آن را درست فهمیده‌اید. حتی اگر فکر می‌کنید آن را کاملا درک کرده‌اید، به مدت دو دقیقه در مورد جزئیات آن بپرسید تا شفاف شود. 90 درصد مصاحبه‌شوندگان بلافاصله به کد زدن می‌پردازند و به دلیل ارتباط ضعیف با مصاحبه‌کننده، امتیاز منفی می‌گیرند. حتی در مورد ورودی‌ها و موارد حاشیه‌ای هم سوال بپرسید. اینکه آیا باید مقادیر null را مدیریت کنید یا خیر.

  • با راه‌حل خام و آسان شروع کنید (حدود 3 دقیقه)

برای حل اکثر سوالات، در وهله‌ی اول یک راه‌حل ناشیانه و ساده وجود دارد. خوب است که با آن شروع کنید و به خود بگویید:«با همین راه‌حل کارم را آغاز می‌کنم و بعد آن را بهبود می‌بخشم. چطور است؟» می‌توانید تعدادی سودو کد برای این راه حل بنویسید اما من معمولا فقط با صدای بلند به آن فکر می‌کنم و پیش ‌می‌روم. حالا از این نقطه به بعد همواره از خود بپرسید چطور می‌توانیم این را بهتر کنیم؟

  • بهینه‌سازی راه‌حل اولیه (حدود 10 دقیقه)

تعداد کمی از مسائل از مرتبه‌ی N^2 یا بیشتر هستند، بنابراین می‌توانید فرض کنید که آن‌ها به دنبال راه‌حلی از مرتبه‌ی N یا LogN یا NLogN هستند. با یک سودو کد ساده شروع کنید چون هنگامی که اشتباه می‌کنید، به راحتی می‌توانید آن را اصلاح کنید. سعی کنید بیش از 10 دقیقه بر روی طراحی اسکلت سودو کد وقت نگذارید. در این مرحله باید به زمان اجرای کد هم توجه کنید و از مصاحبه‌کننده بپرسید آیا به اندازه‌ی کافی سریع هست یا نه.

  • سودو کد را به کد واقعی تبدیل کنید (حدود 15 دقیقه)

ممکن است هنوز 100 درصد از راه‌حل خود مطمئن نباشید اما اشکالی ندارد، گذر زمان به ضرر شماست پس باید شروع کنید. اشکالی ندارد که چند دقیقه در سکوت برنامه بنویسید اما همواره مصاحبه‌کننده را در جریان امور قرار دهید. هر مورد جدیدی که به ذهنتان می‌رسد را آزمایش کنید و زمان اجرا را مجددا حساب کنید.

  • کد خود را همه‌جانبه تست کنید

به تست‌هایی که تا اینجا با آن‌ها پیش آمده‌اید نگاه کنید، حالتی وجود دارد که آن را تست نکرده‌ باشید؟ همه‌ی حالت‌ها را امتحان کنید. مقدار متغیرها را در خلال کد چاپ کنید تا بتوانید تغییراتشان را دنبال کنید. مطمئن شوید تمام خطوط کدتان و حلقه‌هایتان در اجرای تست‌های مختلف امتحان می‌شوند و درست کار می‌کنند.

به طور خلاصه: تا حد ممکن فضای واقعی مصاحبه را شبیه‌سازی کنید

نکات تکمیلی

1. با صدای بلند فکر کنید

لازم است هنگام نوشتن برنامه با صدای بلند فکر کنید. هنگامی که سکوت می‌کنید، مصاحبه‌کننده نمی‌تواند شما را ارزیابی کند. البته خوب است در طول این فرایند، مدتی سکوت کنید تا کاملا متمرکز باشید.

2. کامنت‌های خُرد

برای توابع بی‌اهمیت، کامنت‌های خُرد اضافه کنید و بگویید بعداً آن‌ها را پیاده‌سازی خواهید کرد. به احتمال زیاد مصاحبه‌گر شما را مجبور به پیاده‌سازی آن‌ها نمی‌کند، به خصوص اگر وقت کم داشته باشید و این کار در وقت گران‌بهای شما برای حل اصل چالش صرفه‌جویی می‌کند. یک مثال ساده این است که اگر نیاز دارید حرف اول رشته‌های یک لیست را بزرگ بنویسید، می‌توانید وانمود کنید که یاوری دارید که این کار را انجام می‌دهد و 2 دقیقه به واسطه اجرای آن تابع کمکی صرفه‌جویی کنید.

3. موارد تست را یادداشت کنید

هنگام کد زدن، احتمالا مواردی برای تست کردن به ذهنتان می‌رسد؛ بلافاصله آن‌ها را در قالب کامنت بنویسید و به نوشتنِ برنامه ادامه دهید تا تمرکزتان از دست نرود اما یادتان باشد که در آخر بازگردید آن موارد را تست کنید.

4. از زاویه‌ی ساختارهای داده فکر کنید

ساختارهایی را که در LeetCode و CTCI بررسی کرده‌اید را به یاد دارید؟ آرایه‌ها، لیست‌های لینک‌شده، نمودارها، نقشه‌ها، صف‌ها، داده‌های پویا. پاسخ مسئله‌ای که آن‌ها طرح می‌کنند در یکی از این دسته‌بندی‌ها جای می‌گیرد، با پیدا کردن ساختارداده‌ی مناسب، نیمی از راه‌حل را یافته‌اید.

5. آهسته پیش بروید

خوب ورزش کنید. خوب غذا بخورید. دوستانتان را ببینید و سرگرمی داشته‌ باشید. اعتدال را رعایت کنید، این یک فرایند طولانیست.

نکته‌ی دلگرم‌کننده

با اقدام برای مصاحبه‌ی شغلی، وظیفه‌تان را انجام داده‌اید و حالا زمان برنامه‌ریزی است. مصاحبه‌های خود را از پایین‌ترین اولویت تا مطلوب‌ترین اولویت مرتب کنید. با وجود تمام تلاش شما برای شبیه‌سازی مصاحبه‌ی واقعی، احتمالا 5 مصاحبه‌ی اول خود را به دلیل فشار روانی آن رد می‌شوید. بنابراین اولویت‌های خود را از پایین به بالا بچینید؛ بعد از 5 مصاحبه‌ی اول میزان موفقیت شما افزایش می‌یابد. من تقریبا در 75 درصد مصاحبه‌هایم شکست خورده‌ام اما از آنجا که مهم‌ترین آن‌ها را در اولویت‌های آخر قرار داده بودم، در اوج آمادگی بودم و توانستم بهترین مشاغلی که در نظر داشتم را بدست آورم.

سخن پایانی

دشوار است اما از پس آن برمی‌آیید. ممکن است گاهی انگیزه‌ی خود را از دست بدهید یا از اینکه مصاحبه‌ی فنی، روش کارآمدی برای سنجش توانایی‌های شما نیست به خشم آیید؛ اما اکنون این تنها چیزیست که وجود دارد. بدانید که اگر بر روی آن وقت صرف کنید نتایج آن را خواهید دید. موفق باشید.


متن بالا ترجمه این مقاله است

ما را در تلگرام دنبال کنید