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

به عنوان یه Lead Frontend Developer، توی مصاحبههای زیادی برای پوزیشن برنامهنویس فرانتاند بودم؛ چه به عنوان مصاحبهشونده و چه مصاحبهکننده. تقریبا توی همه مصاحبهها، سوال الگوریتمی پرسیدم و برام معیار مهمی بوده. بازخوردی که گاهی گرفتم، به خصوص از جوانترها، مواردی از این قبیل بوده:
این "چیزا" برای بکانده و اصلا فرانتکارو چه به این کارا!
یه چیزایی تو دانشگاه خوندیم ولی توی این چند سال ازش استفاده نکردم و یادم رفته.
رشتم کامپیوتر نبوده. فرانتاندو با کورسهای Youtube یاد گرفتم(و طبیعتا چیزایی که میگی به کارم نیومده)
خوبه بلد باشیم ولی حالا خیلیم مهم نیست...
خب، اگر به گفته این دوستان، بعد از چند سال برنامهنویسی مفاهیمی مثل "پیچیدگی زمانی" به کار نیومده، آیا به این معنی نیست که واقعا توی فرانتاند کاربردی ندارند؟ این اون سوال میلیون تومانیه(خداییش میلیون دلاری نیست!) که میخوایم بهش پاسخ بدیم.
قبل از هر چیز شما به عنوان یک برنامهنویس باید بتونید مساله حل کنید. مستقل از زبانی که باهاش برنامهنویسی میکنید، ما یک مفهومی داریم به اسم تفکر برنامهنویسی که بیشتر نحوه برخورد ما با یک مساله و روشیه که برای حل اون به کار میبریم. حل کردن سوالهای الگوریتمی، تفکر برنامهنویسی رو در شما تقویت میکنه و به شما مهارت حل مساله میده. درست شبیه عملکردی که ورزش کردن برای تقویت عضلات داره. بعد از یک دوره تمرین، وقتی به مساله جدیدی برمیخورید ذهن آمادهتری برای حل دارید.
اکثر بچههایی که توی این فیلد هستند، مهمترین دلیلشون برای شروع این career و موندن توش اینه که کدنویسی بهشون حال میده و شبیه یه بازی فکری میمونه. من به شخصه معتقدم اگر علاقه به این رشته ندارید و حین کدنوشتن یا دیباگ کردن حس میکنید دارید عذاب میکشید، احتمالا این شغل مناسب شما نیست و در آینده ازش خسته میشید.
ولی اگر بهش علاقه داشته باشید، مثل هر کار باحال دیگهای سختیهاش هم براتون شیرین میشه و همه چی براتون شبیه بازی به نظر میاد.
حالا، دونستن مواردی مثل ساختمان داده یا محاسبه پیچیدگی زمانی، به شما کمک میکنن قوانین این بازی رو بهتر بشناسید و توش حرفهایتر بشید و با حرفهایترها رقابت کنید.
همونطور که اشاره کردم، توی اکثر مصاحبههای شغلی در همهی شاخههای برنامهنویسی، سوال الگوریتمی پرسیده میشه. حتی تو برخی شرکتها این یک مرحله جداگانه از مصاحبه است و توی مرحله اول انجام میشه؛ یعنی قبل از مصاحبه فنی!
برای شرکتی که میخواد شما رو جذب کنه، مهمترین چیز اینه که شما بهره هوشی بالایی داشته باشید تا در مواجهه با مسائل دنیای واقعی بتونید به راحتی از پسش بر بیاید. حتی شرکتهایی رو دیدم که صرف داشتن بهره هوشی برای جذب شما کافیه و نیاز نیست در یک فیلد فنی قوی باشید. اون کار رو میتونید بعد از جذب، با وقت و هزینهای که شرکت در اختیارتون قرار میده انجام بدید.
حالا شرکتها چطور میتونند بسنجند شما IQ مد نظرشون رو دارید و میتونید از پس حل مساله در دنیای واقعی بر بیاید؟ آفرین، با دادن مساله الگوریتمی به شما و حل بهینه اون توسط شما. حتی اگر دونستن دانش پایه نرمافزار به هیچ درد شما هم نخوره -که میخوره-، همین یک دلیل کافیه که همین امروز شروع به یادگیری کنید.
حتما شما هم Memeهایی مثل این رو دیدید که با برنامهنویسای فرانت شوخی میکنند.

باید بهتون بگم اینها صرفا شوخی هستند و فرانتاند -به خصوص در سالهای اخیر- چالشها و پیچیدگیهای فنی مختص خودش رو داره و این میمها هم صرفا برای کلکل کردن و خندیدن هستند.
اکثر چیزهایی که توی ساختمان داده و طراحی الگوریتم یاد میگیرید، توی فرانتاند هم کاربرد واقعی دارند. ممکنه اولش این رو حس نکنید ولی اگر به اونها مسلط نباشید از یک جایی جلوتر نمیتونید برید. اینجا برای اینکه بحث فنیتر بشه چندتا مثال واقعی میزنم.
مثال ۱: خیلی از جاهایی که روی یک آرایه میخواید یک عنصر و find کنید و این کار رو زیاد انجام میدید، بهتره به جای آرایه از ساختمان داده hashMap استفاده کنید(که توی Js توسط کلاس Map پیادهسازی شده). اینکار باعث میشه پیچیدگی زمانی جستجوهاتون به جای O(n)، از مرتبه O(1) باشه.
مثال ۲: برای پیادهسازی undo/redo، احتمالا پشته(Stack) به کارتون میاد.
مثال ۳: برای پیادهسازی Debounce و Throttle از ساختمان داده صف(ْQueue) استفاده میشه.
مثال ۴: برای پیادهسازی cache از ساختمان داده hashMap استفاده میشه.
ممکنه برای پیادهسازی مثالهایی که زدم، Library خاصی به نظرتون بیاد که خودش این کار رو براتون انجام میده و دیگه نیازی نیست پیادهسازیش کنید. اما این به اون معنی نیست که نیاز نیست بدونید توی اون Library داره چه اتفاقی میافته.
همچنین خیلی از این ساختماندادهها به صورت built-in توی جاواسکریپت در توابعی مانند sort, filter, و... پیادهسازی شدند و نیازی نیست خودتون پیادهشون کنید. اما همونطور که گفتم نیازه بدونید داره اون پشت چه اتفاقی میافته و اثر این اتفاق چیه.
حالا سوالی که پیش میاد اینه که از چیا رو باید یاد بگیریم و از کجا؟
اگر رشتتون کامپیوتر نیست یا اینکه از تموم شدن دانشگاهتون چند سالی میگذره و الان از مباحث دور شدید، پیشنهاد میکنم یک دوره ساختمان داده و طراحی الگوریتم رو شروع کنید. من مکتبخونه رو پیشنهاد میکنم که دورههای خوبی برگزار میکنه. فقط فضای دورههاش یکم آکادمیکه و ممکنه خستتون کنه. اگر باهاش زیاد حال نکردید یوتوب هم کورسهای خوبی داره.
بعد از اینکه به مباحث پایه مسلط شدید، وقتشه دست به کد بشید و یکم سوال الگوریتمی حل کنید. سایت کوئرا یه سایت ایرانی باحاله که توش چالشهای الگوریتمی با سطحبندیهای مختلف از آسون تا سخت داره. هرکدوم رو که دوست داشتید با هر زبونی که بهش مسلط هستید میتونید انجام بدید.
یه سایت دیگه که خود من خیلی دوسش دارم LeetCode عه. اونم مشابه کوئرا سوالای الگوریتمی داره و میتونید با زبانهای مختلف حلش کنید. اگر قصدتون آماده شدن برای مصاحبه است، توی این قسمت ۱۵۰ تا از سوالات پرتکرار مصاحبهها رو گذاشته. میتونید از اونها شروع کنید.
هردوی این سایتها علاوه بر سوالات، هم آموزش دارن و هم کامیونیتیهای مختلف که میتونید عضوشون بشید. کلا توشون چرخ بزنید جالب و اعتیاد آورن.

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