توی خیلی از مصاحبه ها معمولا دیدیم سوال هایی راجب الگریتم و ساختمان داده ها پرسیده میشه. خیلی از دوستام رو میبینم که با پرسیدن سوال های این شکلی فکر میکنند که اندازه کافی خوب نیستند و شاید همین موضوع باعث بشه حتی دست از شغل برنامه نویسی بردارند.
اول اینکه بچه ها این رو بدونید که یکی از تکنیک های مصاحبه کننده ها این هستش که سوال هایی از شما بپرسند که شما اون رو ندونید و بعد ببیند توی همچین شرایطی واکنش شما چی هستش که توی یک پست دیگه راجب این موضوع صحبت میکنم.
بیاید برنامه ها بک اند رو به دو نوع زیر تقسیم کنیم:
یا شما به عنوان یک برنامه نویس بک اند میتونید integrator باشید که در واقع راه حل های موجود رو integrate میکنه که جلوتر مثالش رو میزنم و یا کسی باشید که قرار هستش یک برنامه core مثل دیتابیس و یا web server بسازه.
فرض کنید که شما قرار هست یک برنامه CRUD بنویسید مثلا یک فروشگاه اینترنتی و یا یک سایت سمینار آموزش و یا ...
شما توی این نوع وبسایت ها قرار هست از دیتابیس ها و فریم ورک هایی که دیگران ساختند استفاده کنید و برنامه خودتون رو بنویسید. شما قرار نیستش که دیتابیس جدید خودتون رو اختراع کنید درست میگم؟ شما قرار هست یک وب سرور و یک دیتابیس و یک زبان رو انتخاب کنید و در عمل با هم دیگه integrate کنید.
تجربه شخصی من این بوده که در این نوع برنامه ها شما معمولا خیلی کم ممکن هست درگیر موضوعات ساختمان داده و الگریتم بشید (البته واضح هستش که ممکنه استثنا هایی هم باشه) ولی شاید بیشتر از ۸۰ درصد وقت شما صرف نوشت لاجیک ها یا مثلا کوئوری زدن به دیتابیس یا concurrency ها و .. میشه.
فرض کنید مثلا قرار هست یک برنامه شبکه اجتماعی بسازید. آیا این نوع برنامه از جنس integration هستش و یا از جنس core هستش؟ (بر اساس نیازمندیهای پروژه میتونه از هر دو نوع باشه)
برنامه های شبکه های اجتماعی میتونه خیلی پیچیده بشه. در واقع شما یک سری دنبال کننده دارید که اونا هم یک سری دنبال کننده دارند و و .. که در نهایت یک گراف رو تشکیل میده و بسیار الگریتم های پیچیده ای رو میتونه شامل بشه.
شما میتونید تصیم بگیرید که یک تکنولوژی بک اندی که توی زمینه گراف ها خوب باشه رو انتخاب کنید ( مثل انتخاب یک دیتابیس گراف مثل Neo4j ) و در نهایت لاجیک خودتون رو روی این نوع دیتابیس بنویسید.
و یا همچنین شما ممکنه به جایی برسید که متوجه بشید اون دیتابیس برای شما کافی نیستش و باید راه حل خودتون رو داشته باشید. اگه شما توی این دسته از گروه ها قرار میگیرید بی شک باید الگریتم و فلوچارت ها و همچنین خیلی خیلی موضوعات دیگه مثل کرنل سیستم عامل و ..خوب بلد باشید. که البته این موضوعات هرکدوم انقدر تخصصی میشه که دنیای خودش رو داره.
ولی بچه ها حتی توی همین کیس هم نترسید چون کسایی که توی این زمینه ها دارند کار میکنند هیچ وقت نمیان بشینند این الگریتم ها رو حفظ کنند! واسه همین من اصلا طرفدار این نیستم که توی مصاحبه ها سوال های الگریتمی پرسیده بشه چون به برکت دوره های بسیار زیادی که توی اینترنت میتونید پیدا کنید چند روز وقت بزارید کلی از الگریتم ها رو یاد میگیرید و نیازی به حفظ کردنشون نداره اصلا!
مثلا دیدم طرف میاد توی مصاحبه میگه بیا این آرایه رو مرتب کن.
جواب من این هستش که من چرا باید حفظ کنم این الگریتم ها رو! اگه حتی قرار هست توی اون شرکت مثلا یک دیتابیس جدید بسازید آیا مدیرتون میاد بالای سرتون و میگه یک ساعت وقت داری بیا بشین و دیتابیس جدید رو بساز بدون دسترسی به اینترنت؟ نههه !!! معلومه که نه!!
این کار یک عملیات پیچیده هستش و نیاز به هفته ها google کردن داره!
پس بسته به اینکه شما توی کدوم یکی از این دو نوع میخواید کار بکنید اهمیت دونستن ساختمان داده ها و طراحی الگریتم میتونه متفاوت باشه.
البته باز تاکید میکنم که شما ممکنه توی برنامه هایی از نوع integration نیاز داشته باشید از الگریتم ها استفاده کنید و قطعا دونستن هر چیزی میتونه بسیار مفید باشه. اینجا بحث سر اولویت های یادگیری هستش.
عملا نیاز داره یکم واقع گرایانه نگاه کنیم به ساختمان داده ها و الگریتم ها. خیلی موقع ها یک الگوریتم بهتر همیشه راه حل اون مشکل نیستش. مثلا فرض کنید شما یک الگریتم مرتب سازی مثل quick sort رو دارید و قرار هستش با اون یک آرایه یک ملیونی رو مرتب کنید. توی این حالت شاید بگید خوب مثلا الگریتم merge sort میتونه دو درصد سرعت رو بهتر کنه. ولی سوال اینجاست! آیا ما یک کوئری میزنم و یک ملیون رکورد رو از دیتابیس fetch میکنیم و بعد نتیجه رو توی برنامه sort میکنیم؟! نه!! چرا باید این کار رو کنیم خوب! این کار رو میسپاریم به دیتابیس و اون مرتب سازی رو واسه ما انجام میده!
در آخر بگم که یادگیری الگریتم ها و ساختمان داده ها بسیار موضوع شیرینی هستش فارغ از اینکه توی کدوم نوع از برنامه ها دارید کار میکنید و اصلا نیازی نیستش حفظشون کنید و یا بترسید ازشون. فقط کافی بدونید مثلا فلان الگریتم هستش که فلان کار رو واسه شما بهتر انجام میده. هر وقت نیاز شد میرید سمتش و یادش میگیرید. این در واقع یک دانش هست و دانش یک موضوع کلیدی هستش توی همه بخش های زندگی.