پنج نکته که پس از حل کردن 500 سوال لیت‌کد آموختم

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

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

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

1. اهمیت ساختارداده‌ها و الگوریتم

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

صادقانه بگویم، یک پایه علمی قوی از ساختارداده برای هر توسعه‌دهنده ضروری است، من اخیراً به این قضیه پی بردم که چگونه یک پیشرفت الگوریتمی ساده، 70 درصد زمان بارگیری صفحه نمایش را در بازی GTA V کاهش داد، و من از تجربه می‌دانم که چقدر پیاده‌سازی کارآمد می‌تواند یک برنامه را قادر سازد حتی در شرایط استرس، هموار اجرا شود.

2. همیشه فردی داناتر از شما وجود دارد

من معمولاً پس از دستیابی به راه‌حل، به کد خود افتخار می‌کنم، اما اغلب وقتی بخش نظرات را می‌خوانم این حس از بین می‌رود، جایی که گاهی اوقات می‌توانید پیاده‌سازی‌هایی را پیدا کنید که حتی از راه‌حل رسمی ارائه‌شده باکیفیت‌تر است.

صادقانه بگویم، تقریباً نیمی از آنچه در هنگام کار با لیت‌کد آموخته‌ام، از خواندن دقیق کد دیگران و تلاش برای پیاده‌سازی پیشنهادات آن‌ها توسط خودم بوده است.

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

3. یک حالت استئنا می‌تواند حال شما را خراب کند

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

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

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

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

4. سخت‌کوشی استعداد را شکست می‌دهد وقتی که استعداد، سخت کار نمی‌کند

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

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

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

5. برنامه‌ریزی، بخش ضروریِ توسعه‌ی نرم‌افزار است

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

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

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

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

نتیجه‌گیری

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

به هر حال اگر مشغول استفاده از لیت‌کد هستید و می‌خواهید پیشرفت کنید، به شدت به شما توصیه می‌کنم که «Back to Back SWE» را در یوتیوب دنبال کنید. ویدیوهایش در درک موضوعات پیچیده واقعا به من کمک کردند.


متن فوق ترجمه این مقاله است

ما را در تلگرام دنبال کنید