۱۰ سوال مصاحبه‌ای که هر توسعه دهنده JavaScript باید بداند - بخش اول

ترجمه و تالیف : عرفان کاکایی
تاریخ انتشار : 13 خرداد 98
خواندن در 5 دقیقه
دسته بندی ها : جاوا اسکریپت

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

همه چیز با مردم شروع می‌شود

برخی نکات هستند که خوب است به یاد داشته باشید:

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

همانطور که Marcus Lemonnis، مدیر عامل شرکت خرده فروشی یعنی Camping World‌ گفته است، بر روی سه «میم»‌ تمرکز کنید:

«مردم، مراحل، محصول»

در زبان انگلیسی به این سه مورد، با نام سه «P» اشاره می‌شود. این سه P‌ عبارتند از: People (مردم)، Process (روند یا مراحل) و Product (محصول).

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

«بهترین راه برای ارزیابی یک نامزد، یک تمرین برنامه‌نویسی دو نفره (pair programming) است.»

به همراه نامزد مورد نظر،‌ برنامه‌نویسی دو نفره انجام دهید. بگذارید که نامزد مورد نظر، راننده باشد. بیشتر از این که حرف بزنید،‌ نگاه کنید و گوش کنید. یک پروژه خوب،‌ می‌تواند دریافت tweetها از اِی‌پی‌آی Twitter و نمایش آن‌ها بر روی یک خط زمانی (timeline) باشد.

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

جستجو کردن سینتکس و امکانات بر روی گوگل ساده است. اما جستجو کردن خِرَد مهندسی نرم‌افزار یا الگوها و اصطلاحات رایجی که توسعه دهندگان JavaScript از روی تجربه انتخاب می‌کنند، بسیار سخت‌تر است.

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

این مقاله حول محور زبان JavaScript می‌باشد، که می‌توانید دوره مربوط به آن را در این لینک بر روی راکت بیابید.

در اینجا برخی سوال‌ها را مشاهده می‌نمایید که می‌توانند به شما در بررسی مواردی که مهم هستند کمک کنند.

با بخش اول این مقاله همراه ما باشید:

۱. آیا می‌توانید دو الگوی برنامه‌نویسی که برای توسعه دهندگان برنامه JavaScript مهم هستند را نام ببرید؟

JavaScript یک زبان چند الگویی است، که برنامه‌نویسی دستوری / رویه‌ای را به همراه OOP (Object-Oriented Programming = برنامه‌نویسی شئ‌گرا) و برنامه‌نویسی تابعی پشتیبانی می‌کند. JavaScript برنامه‌نویسی شئ‌‌گرا را به همراه وراثت وابسته به نمونه اولیه پشتیبانی می‌کند.

چیزی که مصاحبه گران دوست دارند بشنوند:

  • وراثت وابسته به نمونه اولیه.
  • برنامه‌نویسی تابعی.

هشدارهایی که باید حواستان به آن‌ها باشد:

  • این که ندانید یک الگو چیست، و این که هیچ اشاره‌ای به برنامه‌نویسی وابسته به نمونه اولیه یا برنامه‌نویسی تابعی نکنید.

۲. برنامه‌نویسی تابعی چیست؟

برنامه‌نویسی تابعی، برنامه‌ها را با ساخت توابع ریاضی تولید می‌کند و از state به اشتراک گذاشته شده و داده‌های قابل جهش جلوگیری می‌کند. Lisp (که در سال ۱۹۵۸ معرفی شد) از اولین زبان‌هایی بود که برنامه‌نویسی تابعی را پشتیبانی می‌کرد، و شدیدا از محاسبات lambda الهام گرفته شده بود. Lisp و بسیاری از زبان‌های خانواده Lisp همچنان امروزه تحت استفاده قرار دارند.

برنامه‌نویسی تابعی یک مفهوم ضروری در JavaScript است (در واقع یکی از دو ستون JavaScript می‌باشد). چندین ابزار تابعی رایج در ES5 به JavaScript اضافه شدند.

چیزی که مصاحبه گران دوست دارند بشنوند:

  • توابع خالص / خلوص تابع.
  • جلوگیری از اثرات جانبی.
  • ترکیب‌بندی تابع ساده.
  • نمونه‌های زبان‌های تابعی: Lisp، ML، Haskell، Erlang، Closure، Elm، F Sharp، OCaml و...
  • نمونه امکاناتی که برنامه‌نویسی تابعی را پشتیبانی می‌کنند: توابع کلاس اول، توابع سطح بالا، توابع به عنوان آرگومان‌ها / مقادیر.

هشدارهایی که باید حواستان به آن‌ها باشد:

  • این که هیچ اشاره‌ای به توابع خالص / جلوگیری از اثرات جانبی نکنید.
  • عدم توانایی برای فراهم کردن مثال‌هایی از زبان‌های برنامه‌نویسی تابعی.
  • عدم توانایی مشخص کردن امکانات JavaScript که برنامه‌نویسی تابعی را ممکن می‌کنند.

این مقاله را نیز از دست ندهید:

۳. تفاوت بین وراثت وابسته به کلاس و وراثت وابسته به نمونه اولیه چیست؟

وراثت وابسته به کلاس: نمونه‌ها (instanceها) از کلاس‌‌ها به ارث می‌برند، و روابط زیر کلاسی را می‌سازند. این روابط عبارتند از: طبقه‌بندی کلاس سلسله مراتبی. نمونه‌ها معمولا از طریق توابع سازنده با کلمه کلیدی «new» معرفی می‌شوند. وراثت وابسته به کلاس، ممکن است از کلمه کلیدی «class» متعلق به ES6 استفاده کند، و ممکن است نکند.

وراثت وابسته به نمونه اولیه: نمونه‌ها مستقیما از آبجکت‌های دیگر به ارث می‌برند. این نمونه‌ها معمولا از طریق توابع factory یا Object.create() معرفی می‌شوند، و ممکن است از چندین آبجکت مختلف تشکیل شوند، که وراثت‌های انتخابی بسیاری ساده‌ای را ممکن می‌کنند.

چیزی که مصاحبه گران دوست دارند بشنوند:

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

هشدارهایی که باید حواستان به آن‌ها باشد:

  • نداشتن یک مورد ترجیح داده شده در زمینه وراثت وابسته به نمونه اولیه و ترکیب‌بندی، نسبت به وراثت وابسته به کلاس.

۴. نکات مثبت و منفی برنامه‌نویسی تابعی در مقابل برنامه‌نویسی شئ‌گرا چیست؟

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

نکات منفی برنامه‌نویسی شئ‌‌گرا: برنامه‌نویسی شئ‌‌گرا معمولا به state به اشتراک گذاری شده وابسته است. آبجکت‌ها و رفتارها معمولا بر روی موجودیت مشابه میخ شده‌اند، که می‌تواند به طور تصادفی توسط هر تعداد توابع با ترتیب غیر قطعی مورد دسترسی قرار گیرد، و در نتیجه به رفتار نامطلوبی مانند شروط race ختم شود.

نکات مثبت برنامه‌نویسی تابعی: برنامه‌نویسان با استفاده از الگوی تابعی، از هر state به اشتراک گذاشته یا اثرات جانبی جلوگیری می‌کنند، که باگ‌های ساخته شده توسط چندین تابع که بر روی منبع مشابه در حال رقابت هستند را از بین می‌برد. با امکاناتی مانند دسترسی‌پذیری استایل point-free، توابع ترجیح می‌دهند که به طور اساسی ساده‌سازی شوند و برای کد قابل استفاده مجدد، در مقابل برنامه‌نویسی شئ‌‌گرا به سادگی بازسازی شوند.

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

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

نکات منفی برنامه‌نویسی تابعی: بهره‌برداری بیش از حد از امکانات برنامه‌نویسی تابعی مانند استایل point-free و ترکیب‌بندی‌های بزرگ می‌توانند خوانایی را کاهش دهند؛ زیرا کد نهایی اغلب به طور چکیده مشخص شده است و‌ اختصار کمتری دارد.

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

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

چیزی که مصاحبه گران دوست دارند بشنوند:

  • اشاره به مشکلات state به اشتراک گذاری شده، چیزهای مختلفی که برای هدف مشابه در رقابت هستند و...
  • آگاهی از قابلیت برنامه‌نویسی تابعی برای ساده‌سازی بسیاری از برنامه‌ها.
  • آگاهی از تفاوت‌های موجود در انحناهای یادگیری.
  • تفسیر اثرات جانبی و نحوه تاثیر گذاری آن‌ها بر روی قابلیت نگهداری برنامه.
  • آگاهی از این که یک سورس کد به شدت تابعی، می‌تواند یک انحنای یادگیری با شیب تند داشته باشد.
  • آگاهی از این که یک سورس کد به شدت شئ‌گرا، می‌تواند در مقابل تغییر به شدت مقاوم باشد و در مقایسه با سورس کد تابعی مشابه، بسیار شکننده‌تر باشد.
  • آگاهی از این که غیر قابل جهش بودن، به یک تاریخچه state برنامه دسترسی‌پذیر و انعطاف‌پذیر ختم می‌شود،‌ و در نتیجه اضافه کردن ساده امکاناتی مانند undo / redo بی نهایت، بازگشت / پخش مجدد، خطایابی در طی زمان و... را ممکن می‌کند. غیر قابل جهش بودن می‌تواند در هر کدام از این الگوها به دست آورده شود، اما تکثیر آبجکت‌های stateful به اشتراک گذاشته شده، پیاده‌سازی در برنامه‌نویسی شئ‌گرا را پیچیده‌تر می‌کند.

هشدارهایی که باید حواستان به آن‌ها باشد:

  • عدم توانایی لیست کردن معایب یکی از استایل‌ها. هر کسی که با هر کدام از این استایل‌ها تجربه داشته باشد، باید به برخی محدودیت‌ها بر خورده باشد.

این مقاله را نیز از دست ندهید:

۵. وراثت وابسته به کلاس، چه زمانی یک انتخاب مناسب است؟

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

همانطور که برنامه‌نویس آمریکایی، یعنی Douglas Crockford گفته است:

«اگر یک ویژگی گاهی اوقات کاربردی است و گاهی اوقات خطرناک، و یک گزینه بهتر وجود دارد، همیشه گزینه بهتر را انتخاب کنید.»

چیزی که مصاحبه گران دوست دارند بشنوند:

  • به ندرت، تقریبا هیچ وقت یا هیچ وقت.
  • گاهی اوقات یک استفاده تک سطحی، از یک کلاس بر پایه فریم‌وورک مانند React.component مشکلی ندارد.
  • «ترکیب‌بندی آبجکت را نسبت به وراثت وابسته به کلاس ترجیح دهید.»

در بخش دوم که به زودی بر روی راکت قرار خواهد گرفته، همراه ما باشید...

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید