آمادگی برای مصاحبه های مهندسی نرم افزار به سبک شرکت های بزرگ دنیا

فهرست مطالب

هدف من از این نوشته آشنا کردن برنامه نویسان ایرانی و مصاحبه کنندگان در شرکت های ایرانی با روند مصاحبه و استخدام برنامه نویس و مهندس نرم افزار در شرکت های بزرگ دنیاست. این مطلب و ادامه آن در وب سایت https://dorostcode.com نیز منتشر می شود. در پست های آینده نمونه ای از مسایل مطرح شده در مصاحبه های برنامه نویسی و نحوه پاسخگویی به آنها را مرور خواهیم کرد.

نمایی از یک مصاحبه برنامه نویسی
نمایی از یک مصاحبه برنامه نویسی

اصول مصاحبه های برنامه نویسی

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

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

اهداف یک مصاحبه برنامه نویسی

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

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

نمونه ای از یک مصاحبه برنامه نویسی

بسیاری از برنامه نویسان جویای کار تصویر دقیقی از یک مصاحبه برنامه نویسی در شرکت های خوب دنیا ندارند. برخی به اشتباه تصور می کنند که در این مصاحبه ها تست هوش برگزار می شود. این واقعیت ندارد. هدف این بخش آن است که تصویر دقیقی از یک مصاحبه برنامه نویسی به سبک شرکت های بزرگ دنیا بدهد.

  • تعداد مصاحبه: برخی شرکت ها چندین دور مصاحبه برای استخدام برنامه نویس دارند. به عنوان مثال شرکت گوگل یک مصاحبه آنلاین و ۵ مصاحبه حضوری برای ارزیابی یک برنامه نویس دارد. شرکت های مختلف در تعداد مصاحبه ها اندکی با هم متفاوت هستند.
  • مکان و فضا: مصاحبه بصورت آنلاین یا در محل شرکت برگزار می شود. مصاحبه آنلاین تنها در اولین مرحله انجام می شود و مصاحبه شونده برنامه را در یک ویرایشگر آنلاین (مثلا گوگل داک) می نویسد. مصاحبه های حضوری در محل شرکت و در یک اتاق شامل یک تخته سیاه یا وایت برد انجام می شود.
  • زمان: معمولا مصاحبه های یک ساعت طول می کشد.مصاحبه کننده راس ساعت مصاحبه کننده را ملاقات می کنند و به وی خوش آمد می گوید.
  • معرفی ابتدای جلسه: مصاحبه کننده که خود یک برنامه نویس است رتبه شغلی و کلیات پروژه هایی کار روی آن کاری می کند را در حد ۲ دقیقه تشریح می کند. سپس از مصاحبه شونده می خواهد که کمی درباره خودش بگوید. مصاحبه شونده در حد ۲ دقیقه کلیات مدارج علمی و تجربی مرتبط با موقعیت شغلی که برای پذیرش در آن مصاحبه می شود را می گوید. ممکن است که مصاحبه کننده سوالاتی در مورد توضیحات وی داشته باشد که بصورت مختصر ولی شفاف توضیح می دهد.
  • پرسش الگوریتمی و پاسخ: سپس مصاحبه کننده یک سوال برنامه نویسی مطرح می کند و از برنامه نویس می خواهد آن را حل کند. این سوال عمدا مبهم است. برنامه نویس با ارایه یک یا چند مثال از ورودی و خروجی برنامه سعی می کند که سوال را بهتر درک کند و داده های ورودی و خروجی را بشناسد. معمولا سوالات برنامه نویسی نیاز به فکر کردن از جنبه های مختلف دارند. توقع مصاحبه کننده آن است برنامه نویس در مورد راه حل های مساله با دقت فکر کند، مزایای و معایب آن ها را ارزیابی کند و بهترین راه را انتخاب نماید. شروع به پیاده سازی بدون فکر خصلت زیان بار بسیاری از نوبرنامه نویسان هست و شرکت ها حتما از چنین افرادی دوری می کنند.  بنابر این برنامه نویس بلند بلند فکر می کند با استفاده از وایت برد راه حل های خود را تشریح می کند. کار را معمولا از ساده ترین راه حل (معمولا جستجوی کامل یا همان brute force) شروع می کند. سپس مرحله به مرحله با راه حل های بهتر سرعت یا حافظه استفاده شده توسط الگوریتم را کاهش می دهد. یک برنامه نویس موفق در عرض 20 دقیقه از یک راه حل ساده به راه حل بهینه می رسد. در صورتی که مصاحبه کننده راه حل را تایید کرد، مصاحبه شونده شروع به نوشتن کد برنامه روی وایت برد می کند. او در حین نوشتن برنامه آن را خط به خط توضیح می دهد. با پایان نوشتن برنامه، برنامه نویس برنامه خود را مرور و سپس با چند داده ورودی تست می کند. در صورتی که برنامه نویس در زمان مناسب برنامه را بنویسد (حدود 20 دقیقه) ممکن است مصاحبه کننده سوالات تکمیلی داشته باشد (مثلا چگونه برنامه را تغییر دهیم که با داده های بسیار زیاد کارکند) و بپرسد که چه تغییراتی در حل مساله باید داده شود.
  • فرصت پرسش برای برنامه نویس: در 5 دقیقه انتهایی برنامه مصاحبه کننده از مصاحبه شونده می خواهد که چنانچه سوالی دارد بپرسد. یک مصاحبه شونده  زیرک حتما سوال می پرسد. مثلا اگر در مصاحبه پذیرفته شوم روی چه پروژه ای کار خواهم کرد؟ یا اینکه تجربه شما از کار کردن در این شرکت چیست؟ و نهایتا مراحل بعدی استخدام چیست؟
  • تشکر و تشکر: در انتهای جلسه طرفین از یکدیگر بابت فرصت مصاحبه و وقتی که طرف مقابل گذاشته تشکر می کند. معمولا مصاحبه شونده بعد از بازگشت در همان روز یا روز بعد ایمیلی به مصاحبه کننده می زند و در ضمن تشکر مجدد ابراز می کند که برای پاسخ به هر سوال احتمالی دیگر آمادگی دارد و اینکه منتظر پاسخ آن هست.

توصیه هایی به مصاحبه گر

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

دوستانه و دستیافتنی (approchable) باشید و سوالاتی که یک متقاضی استخدام دارد را با حوصله پاسخ دهید.

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

در انتخاب سوال مصاحبه دقت کنید. به عنوان مثال سوال <<الگوریتم دایجکسترا را پیاده کن>> خوب نیست. به این دلیل که (۱) معمولا برای الگوریتم های معروف پیاده سازی های استاندارد وجود داره و (۲) اگر هم مصاحبه شونده بتونه جواب بده نشان دهنده حافظه خوب هست نه توانایی حل مساله. بنابر این باید از بانک سوالات درست یک سوال انتخاب بشه. با جستجو در سایتهایی مانند leetcode.com می توانید سوالات خوبی را برای مصاحبه انتخاب کنید.

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

نمونه یک مصاحبه

در پست بعدی نحوه پاسخگویی در مصاحبه های برنامه نویسی را همراه یک نمونه بصورت مفصل شرح می دهد.