شرکتهای بزرگ مانند آمازون، گوگل، مایکروسافت و فیسبوک همیشه در جستجوی برنامهنویسان و مهندسین با استعداد نرم افزار برای پیوستن و به تیم توسعهشان هستند. بنابراین برای بدست آوردن فرصت شغلی عالی و سودآور در چنین شرکتهایی، باید حدالمقدور دانش و مهارت خود را افزایش داد. در این مقاله به جمع آوری برخی از مهمترین سوالات مصاحبه کاری برنامه نویس که هر برنامهنویس باید بداند، پرداختیم.
پاسخ: برنامه نویسی کامپیوتر پروسه کدنویسی یک الگوریتم، معمولا در یک کامپیوتر با استفاده از زبانهای برنامه نویسی است که بتوان آن را توسط یک کامپیوتر اجرا کرد. هر زبان برنامهنویسی شامل مجموعهای از دستوراتی است که کامپیوتر با اساس آنها، کارهایی را اجرا میکند. برنامه نویسی یک پروسه پیچیده است که شامل طراحی الگوریتم، کدنویسی و پیادهسازی آن الگوریتم در یک زبان برنامهنویسی، دیباگ و رفع اشکال، نگهداری و پشتیبانی و بروزرسانی کد میباشد.
پاسخ: سه نوع error ممکن است هنگام اجرای یک برنامه کامپیوتر بوجود بیایند:
پاسخ: الگوریتم مجموعهای محدود از مراحلی میباشد که برای انجام یک کار خاص از آن پیروی میشود. تمیزی، کارایی و ظرافت از ویژگیهای مهم یک الگوریتم خوب میباشد.
پاسخ: مراحل نگهداری و بروزرسانی یک برنامه کامپیوتری پس از نصب موفقیت آمیز آن آغاز میشود. در حالی که نگهداری (maintenance) از برنامه یک پروسه مستمر مانیتورینگ برنامه کامپیوتر برای شناسایی باگها و خطاهاست، بروزرسانی برنامه کامپیوتر به معنی بهینه سازی آن با تغییرات جزئی و اساسی در طول زمان میباشد.
پاسخ: متغیرها برای ذخیره کردن ورودی یک برنامه و همچنین نتایج محاسباتی در حین اجرای برنامه بکار میروند. مقدار ذخیره شده در یک متغیر میتواند در طول اجرای برنامه تغییر کند.
پاسخ: کلمات رزرو شده که به عنوان (keywords) یا کلمات کلیدی نیز شناخته میشوند، کلماتی هستند که معانی از پیش تعریف شده در یک زبان برنامهنویسی خاص دارند. این کلمات مجاز برای استفاده به عنوان نام متغیرها، کلاسها و … اهداف دیگر یا تعریف مجدد نیستند. برخی از کلمات رزرو شده:
پاسخ: حلقه تکرار یک ساختار در برنامهنویسی است که میتواند دستورات تعریف شده را به تعداد معین یا تا زمان تحقق یک شرط پایان حلقه، اجرا کند. سه نوع مهم از حلقههای تکرار:
پاسخ: مستندات برنامه، توضیحات نوشته شده برای الگوریتم(ها)، نحوه کدنویسی، تست طراحی و استفاده مناسب از یک برنامه کامپیوتری خاص میباشد. مستندسازی برای کسانی که بصورت روزانه قصد استفاده از برنامه را دارند و همچنین برای برنامهنویس(هایی) که قصد اصلاح و بروزرسانی برنامه را دارند، بسیار ارزشمند و هائز اهمیت است.
پاسخ: constant یک موجودیت در برنامهنویسی میباشد طوری که مقدار آن در هنگام اجرای برنامه قابل تغییر یا ویرایش نیست. ثوابت ۲ نوع اصلی دارند:
پاسخ: عملگرها برای اجرای عملیات معین روی دادهها در یک برنامه کامپیوتری بکار میروند. عملگرها با استفاده از علامتهایی نشان داده میشوند. مانند: / نشاندهنده عملیات تقسیم در ریاضی، * نشاندهنده عملیات ضرب در ریاضی. ۴ نوع اصلی از عملگرها به شکل زیر میباشند:
پاسخ: آرایه یک ساختار برنامهنویسی است که مجموعهای از دادههای هم نوع را در آن ذخیره میکنیم. از نظر حافظه، یک آرایه گروهی مستمر از لوکیشنهای حافظه است که دادهها هم نوع را به هر تعداد میتوان در آن ذخیره کرد.
پاسخ: machine code یک زبان برنامهنویسی سطح پایین است. بر حلاف زبانهای برنامهنویسی سطح بالا که بواسطه کامپایلر کدهای سطح بالا را برای اجرا به کدهای ماشین یا machine code تبدیل میکنند، میکرو پردازندهها کدهای ماشینی را بصورت مستقیم و بدون کامپایل و تبدیل پردازش میکنند.
پاسخ: همچون برنامهنویسی، تست نرمافزار هم یک جنبه بسیار مهم از چرخه توسعه نرمافزار میباشد. تحت پروسه تست نرم افزار، نرم افزار در شزایط معین جهت بررسی کیفیت تست میشود. یکی دیگر از جنبههای مهم تست کردن نرم افزار کامپیوتر، ارزیابی تجربه کاربری نرم افزار میباشد. سایر جنبههای تست نرم افزار شامل موارد زیر میشود:
پاسخ: انتشار نسخه بتا از برنامه کامپیوتری به معنی آماده بودن آن جهت انتشار بصورت public نیست بلکه به منظور ایجاد تغییرات و بروزرسانی برنامه بر اساس بازخوردهای کاربران دریافت شده در تست بتا، در نسخههای بعدی است.
پاسخ: شیوه طراحی top-down روشی است برای تجزیه و تحلیل نرم افزار. طوری که بجای تلاش برای رفع مشکلات بصورت کلی، آن مشکل به مشکلات کوجکتر تقسیم میشود. سپس هر کدام از آنها بصورت جداگانه حل میشوند. نهایتا راه حل ها ترکیب میشوند تا بهترین راه حل بدست بیاید.
پاسخ: پس از تکمیل توسعه و تستهای برنامه، باید آنرا روی کامپیوترهای هدف نصب کنیم. پروسه نصب و تنظیم برنامه کامپیوتری که توسط کاربران نهایی استفاده خواهد شد، پیاده سازی برنامه نامیده میشود.
پاسخ: اجرای برنامه پروسه انجام دستورالعملهای برنامه توسط کامپیوتر است. قبل از اجرا، برنامه کامپیوتری، باید برنامه در حافظه (RAM) کامپیوتر بارگذاری شود.
پاسخ: کامپایلر یک برنامه کامپیوتری است که کد نوشته شده در یک زبان برنامهنویسی را به یک زبان دیگر ترجمه میکند. معمولا، کامپایلر به برنامهای اشاره دارد که یک زبان برنامهنویسی سطح بالا را به زبان برنامهنویسی سطح پائین ترجمه و تبدیل کند تا یک برنامه قابل اجرا تولید شود.
پاسخ: هنگام تست کردن برنامه کامپیوتری، مشکلاتی درون برنامه کشف میشود که به آنها error یا bug گفته میشود. debugging پروسه تصحیح آنها میباشد. به عبارت دیگر debugging پروسه اصلاح خطاها و مشکلاتی است که در کد نوشته شده پیدا میشوند.
پاسخ: یک برنامه کامپیوتری معمول، شامل صدها تا هزاران خط کد است. افزودن کامنتها به کد روشی مناسب برای ساده کردن تجربه تست کردن و یا پیدا کردن چیزی درون کد برای دیگران میباشد و همچنین به سازمان دهی کدها کمک میکند.
پاسخ: DRY مخفف Don’t Repeat Yourself است. یک اصل توسعه نرم افزار میباشد با هدف کاهش تکرار الگوهای نرم افزار. برای دستیابی به این هدف، باید الگوهای نرم افزاری تکراری با انتزاعات جایگزین شوند یا از نرمالسازی دادهها (data normalization) استفاده شود.
پاسخ: به آنها WET solutions یا راه حل های WET گفته میشود. با اینکه WET مخفف Write Everything Twice (نوشتن دوباره هرچیزی) است، اما گاهی اوقات میتواند معنی We Enjoy Typing (از نوشتن لذت میبریم) یا Waste Everyone’s Time (اصراف زمان همه) را نیز داشته باشد. راه حل های WET معمولاً در معماریهای چند لایه پذیرفته میشوند.
پاسخ: Bubble sorting یک الگوریتم ساده مرتب سازی است که در آن عناصر متوالی و همجوار در یک ساختار داده مانند یک آرایه، بطور مستمر و تا دستیابی به ترتیب صحیح، با یکدیگر مقایسه میشوند. عناصر مقایسه شده تنها زمانی که ترتیب نادرست داشته باشند، تعویض میشوند.
پاسخ: ساختمان دادهها روشی خاص برای سازماندهی و به کار بردن دادهها است. ساختمان دادهها امکان دسترس کارآمد به دادهها و همچنین ویرایش دادهها را فراهم میکند.
یک ساختمان داده همچنین میتواند به عنوان مجموعهای از داده، توابع قابل اجرا برای آنها و ارتباط میان آنها، تعریف شود. آرایهها، linked lists ،heaps ،graphs و stacks برخی از مثالهای ساختمان دادهها هستند.
پاسخ: ساختمان دادهها در هرجایی که با دادهها سر و کار داشته باشیم، مورد نیاز و کاربردی هستند. با این حال برخی از مثالهای قابل توجه:
پاسخ: Sorting پروسه مرتبسازی عناصر یک آرایه هم بصورت صعودی و هم بصورت نزولی میباشد. برخی از معروفترین تکنیکهای مرتب سازی به شکل زیر میباشد:
پاسخ: باینری سرچ کاربردی ترین روش جستجو برای عناصری اس که قبلا مرتب شدند. باینری سرچ، جستجو را از وسط لیست شروع میکند. اگر عنصر میانی عنصر هدفمند نباشد، به جستجو در نیمه پایین یا نیمه بالایی لیست ادامه میدهد. این پروسه تا زمان پیدا شدن عنصر هدف ادامه پیدا میکند.
پاسخ: نوعی ساختمان داده که دارای مجموعهای از جفتهای مرتب شده است، graph نامیده میشود. این جفتهای مرتب همچنین arcs و edges نامیده میشوند. آنها برای اتصال node ها استفاده میشوند؛ محلی که دادهها در آن ذخیره و بازیابی میشوند.
پاسخ: در ساختمان داده خطی، عناصر داده در کنار یکدیگر قرار میگیرند. آرایهها، linked lists ،queues و stacks برخی از ساختمان دادهها خطی هستند.
در ساختمان داده غیر خطی، این امکان برای عناصر داده وجود دارد تا به بیش از دو عنصر داده دیگر متصل باشند. برای مثال ساختمان دادههای graph و درختی (tree)
پاسخ: با اینکه NULL یک مقدار را نشان میدهد، VOID نشاندهنده data type identifier است. یک متغیر با مقدار NULL، یک مقدار خالی را نشان میدهد. Pointer هایی که مقدار اولیه ندارند، بوسیله VOID مشخص میشوند.
در این مقاله به بررسی برخی از سوالات مصاحبه کاری برنامه نویس در شرکتهای بزرگ پرداختیم.