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

به اکثر ما توصیه‌هایی مشابه شده است: برای حل بهتر چالش‌ها، باید چالش‌های بیش‌تری را حل کنید. اما این توصیه بیش از حد ساده‌انگارانه است. به دست آوردن مهارت در هر زمینه‌ای به چیزی بیش‌تر از تکرار نیاز دارد. نحوه برخورد شما با آن هم اهمیت زیادی دارد.علاوه بر این، وقتی برنامه‌نویسان توصیه "حل مشکلات بیش‌تر" را می‌شنوند، اغلب فکر می‌کنند که "بیشتر" به معنی سریع‌تر است. این اشتباهی است که من هم هنگام شروع مرتکب شدم.تردمیل حل مشکل می‌تواند برای یادگیری و بهبود مضر باشد. اوایل من یک مشکل را سریع حل می‌کردم و سراغ مشکل بعدی می‌رفتم. اما واقعیت آن رویکرد به زودی مشخص شد. با تمرکز بر کمیت، کیفیت را به خطر می‌انداختم و یادگیری‌های کلیدی را در طول مسیر از دست می‌دادم.این بدان معنا نیست که تکرار مهم نیست. با این حال، تکرار به تنهایی شما را به اصل و عمق موضوع نمی‌رساند. اما فرآیند چرا.من علاقه خاصی به این موضوع دارم: من می‌خواهم در حل چالش‌ها پیشرفت کنم تا برنامه‌نویس بهتری شوم. بنابراین در اینجا من راه‌حل خود را ارائه می‌دهم. مطمئناً شامل تکرار است - و موارد خیلی بیشتر.1. حل انواع چالش‌ها در پلتفرم‌های مختلفیک بار مدرس دوره پایتونی که در آن شرکت می‌کردم، گفت: "وقتی شروع به یادگیری برنامه‌نویسی کردم، شیفته HackerRank بودم." اگر چه داشتن یک پلتفرم مورد علاقه خوب است، اما خود را به یک پلتفرم محدود نکنید. دلیل آن این است: شما باید برای هر چیزی آماده باشید.یکی از اهداف من این است که به راحتی بین انواع مختلف چالش‌ها و پلتفرم‌ها جابجا شوم. چالش‌های مربوط به Interview Cake با آنچه در کتاب Reuven Lerner’s book, Python Workout موجود است، تفاوت دارد. به طرز مشابه، من عبارات چالش‌ها در Lerner’s Weekly Python Exercise را با مواردی که در HackerRank وجود دارد متفاوت می‌دانم.من مطمئناً ترجیحات خودم را دارم. با این حال، من باید بتوانم انواع مختلف چالش‌ها را حل کنم. بنابراین من از انواع پلتفرم‌ها و منابع برای تمرین استفاده می‌کنم.در اینجا چند نمونه آورده شده است:LeetCodeCracking the Coding Interview by Gayle Laakmann McDowellExercismInterview CakePython Workout by Reuven LernerWeekly Python Exercise by Reuven Lernerروزهای یکشنبه، هنگامی که برنامه خود را برای هفته آینده تنظیم می‌کنم، چند چالش را از منابع فوق انتخاب می‌کنم. من این کار را دقیق و فعالانه انجام می‌دهم. به عنوان مثال، چالشی را از LeetCode انتخاب می‌کنم که بر روی جستجوی دودویی متمرکز است. سپس، یکی که بر ساختارداده‌های یکی از منابع Reuven Lerner بنا شده است.این تمرین مانع راحت‌طلبی بیش از حد من می‌شود. من نمی‌توانم به همان ساختارداده یا تکنیک مشابه تکیه کنم. باید بتوانم بهترین ابزار را برای کار انتخاب کنم.این موضوع برای من چالش‌برانگیز است. به این دلیل که من چالش‌هایی را انتخاب می‌کنم که من را به مرزهای خود می‌رساند، ویژگی‌ای که روانشناس آندرس اریکسون آن را "تمرین عامدانه" می‌نامد.هدف تمرین عامدانه، توسعه مهارت است. اریکسون در کتاب عالی خود، Peak توضیح می‌دهد که این یک تلاش کاملاً متمرکز و آگاهانه است که شما را از "منطقه راحتی" خودتان خارج می‌کند، بر یک هدف خاص متمرکز شده و "تقریباً حداکثر تلاش را می‌طلبد".به عبارت دیگر، شما حرکتی را انجام نمی‌دهید که آسان یا طبیعی باشد. اریکسون می‌نویسد: "ویژگی برجسته‌ی تمرین عامدانه این است که شما سعی می‌کنید کاری را انجام دهید که نمی‌توانید انجام دهید."2. ذهن برنامه‌نویسی خود را متنوع آموزش دهیداغلب در مورد ورزشکارانی می‌شنوید که تمرینات متنوع را در برنامه روزانه خود قرار می‌دهند. به عنوان مثال، یک دونده هر هفته یک یا دو تمرین دوچرخه انجام می‌دهد. این بسیار منطقی است: با تمرین متنوع، ورزشکاران آمادگی قلبی عروقی خود را از زاویه‌ای متفاوت افزایش می‌دهند.یادگیری متنوع برای برنامه‌نویسان، موضوعی است که قبلاً در مورد آن نوشتم. با این حال، باید بیشتر در مورد مزایای این روش گفت. درست مانند یک ورزشکار که تمرینات متنوع را برای بهبود آمادگی قلبی عروقی انجام می‌دهد، من نیز تمرینات متنوع را برای بهبود آمادگی ذهنی خود انجام می‌دهم.تکنیک یادگیری متنوع من شامل حل مسائل ریاضی است. من همان تاکتیک‌هایی را که برای حل یک مشکل برنامه‌نویسی استفاده می‌کنم، در ریاضیات هم استفاده می‌کنم. فرایند یکسان، زمینه‌ی متفاوت.کتاب ریاضی فعلی من یکی است که باید به آن توجه شود: The Art of Problem Solving. بله، مزایای یادگیری متنوع ذکر شده در بالا را فراهم می‌کند. اما کار بیشتری هم انجام می‌دهد: به من کمک می‌کند تا شهود خود را برای حل چالش‌ها پرورش دهم.این نکته مهم است. من نمی‌خواهم یک معادله یا فرایند ریاضی را حفظ کنم. من می‌خواهم به طور شهودی بدانم چه زمانی از آن استفاده کنم. هنگام حل چالش‌های برنامه‌نویسی نیز همین امر صادق است.3. از راه‌حل‌های خود بیاموزیدهمه‌ی ما هنگام حل مسئله به چالش کشیده می‌شویم و به خطاهای متفاوت برمی‌خوریم. این شکست‌ها به ما کمک می‌کنند تا بفهمیم کدام بخش از کار را باید به نحو متفاوتی انجام دهیم. غالبا در این نقطه یادگیری را متوقف می‌کنیم. به محض آنکه مسئله را حل کردیم مشتاقیم ادامه دهیم. اما این کار را نکنید.ریچارد هامینگ ریاضی‌دان معتقد است که در این زمان باید یادگیری آغاز شود. او در کتاب خود با عنوان «هنر پرداختن به علوم و مهندسی» می‌نویسد:«من اساسا بررسی موفقیت‌ها را مهم‌تر از بررسی شکست‌ها می‌دانم. راه‌های اشتباه زیادی وجود دارند در حالیکه راه‌های درست محدودند. از این رو، مطالعه و بررسی موفقیت‌ها کارآمدتر است.»این ایده‌ی «نگاه به گذشته» و مطالعه‌ی موفقیت‌هایتان موضوعیست که پیش از این در مورد آن نوشته‌ام و ارزش یادآوری دوباره را دارد. شما همیشه می‌شنوید که چگونه باید از شکست‌های خود درس بگیرید اما هامینگ درست می‌گوید، چیزهای زیادی برای آموختن از موفقیت‌هایمان وجود دارد.بنابراین یکی از بزرگ‌ترین تغییراتی که من در فرایند حل مسئله‌ام ایجاد کرده‌ام، به کار بستن توصیه‌های هامینگ است. من به وضوح یکی از اولین مشکلاتم که مربوط به یک لیست لینک شده بود را به خاطر دارم. ساختارداده‌ای که آن زمان برای من کاملا جدید بود. بعد از حل مشکل، به دقت آن را مطالعه کردم. همچنین راه حل را در یک فایل کپی کردم و برای توضیح کد، روی بخش‌های مختلف آن کامنت گذاشتم. با انجام این کار می‌خواستم مطمئن شوم که کاملا فهمیده‌ام چه کار کرده‌ام و مهم‌تر از همه این که می‌توانم دوباره آن را انجام دهم.4. بازخورد دریافت کنیدآگاهی می‌تواند یک معلم فوق‌العاده باشد.تصور نکنید راه‌حل‌های شما بی‌نقص هستند. باید با گرفتن بازخورد به میزان صحت این موضوع پی ببرید. بازخورد، یک عامل مهم برای پیشرفت و بهتر شدن است و همچنین بخشی از هر تمرین عمیق و هدفمند را تشکیل می‌دهد.دو راه کلی برای گرفتن بازخورد وجود دارد:اول اینکه پس از حل یک مسئله، راه‌حل‌های دیگران را مطالعه کنید. اغلب، برخی از منابع مانند LeetCode و Cracking the Coding Interview راه‌حل مسائل را ارائه می‌دهند. در مواقع دیگر به دنبال راه‌حل سوالات مشابه می‌گردم و گاهی از هر دو این‌ها استفاده می‌کنم.در هر صورت گام بعدی یکسان است: از ابتدای راه‌حل شروع می‌کنم و هر خط را برای خودم توضیح می‌دهم؛ مثلا حدس می‌زنم که نویسنده‌ی این برنامه چرا از آن ساختارداده‌ی خاص در هر بخش استفاده کرده است. سپس، یک خلاصه‌ی کوتاه از برنامه را برای تثبیت و درک عمیق‌تر مفاهیم اصلی یا روش‌ها و دیدگاه‌های جدیدی که آموخته‌ام، می‌نویسم.توضیح یک خط کد پیچیده به زبان قابل درک برای خودتان یک آزمایش عالیست تا متوجه شوید آن را عمیقا درک کرده‌اید یا خیر. علاوه بر این، شما با این کار یک مهارت مهم دیگر را در خودتان تقویت می‌کنید: کدخوانی.اگر چیزی برای من جدید باشد در مورد آن تحقیق و جستجو می‌کنم. کد دیگران را با کد خودم مقایسه می‌کنم. همواره مطالعه و ارزیابی می‌کنم و یاد می‌گیرم. این یک روند دشوار است اما به شما چیزهای زیادی می‌آموزد.راه دوم برای دریافت بازخورد این است که به سادگی آن را از برنامه‌نویسان دیگر درخواست کنید. برقراری تماس تصویری برای بررسی خط به خط کد کمک‌کننده است. اگرچه تبادل‌نظر از طریق pull request هم می‌تواند مفید باشد.نکته‌ای در مورد بازخورد وجود دارد: آن را اعمال کنید! از آنچه آموخته‌اید در عمل استفاده کنید.5. پافشاری کنیداکنون لازم است درمورد اهمیت تمرین و تکرار صحبت کنیم. حل مسئله یک مهارت است و مانند هر مهارت دیگری، به دست آوردن آن در طول زمان و به مرور به دست می‌آید؛ یک شبه یا در یک آخر هفته اتفاق نمی‌افتد. به همین دلیل من هر روز زمان مشخصی را به حل مسئله اختصاص می‌دهم.یک واکنش رایج به تمرین روزانه وجود دارد:«چیزهای جدید زیادی برای یادگیری وجود دارد. من نمی‌توانم هر روز بخشی از وقتم را صرف حل مسئله کنم.»پاسخ من به این واکنش دو بخش دارد: اول اینکه همیشه چیزهای بیشتری برای یادگیری وجود دارند. همیشه. دوم اینکه بخش عمده‌ی برنامه‌نویسی را همین حل مسئله تشکیل می‌دهد و پایه و اساس حرفه‌ی ماست؛ بنابراین ارزش وقت و توجه شما را دارد. اینجا یک نکته‌ی اساسی وجود دارد که باید به آن توجه کنید: تمرین روزانه‌ی خود را با تمرکز بالا انجام دهید.این یک هنر استبسیاری از افراد حل مسئله را یک هنر می‌دانند. اتفاقا من با این برداشت موافقم. ایده‌های بیان‌شده در این مقاله، رویکردهای پیشنهادی من برای بهبود مهارت حل مسئله بود. ممکن است روش شما متفاوت باشد اما نکته‌ی اساسی این است: با تمرکز بالا به تمارین خود بپردازید. کیفیت اهمیت دارد. همچنین با هر مسئله‌ای درگیر شوید و به سادگی از آن نگذرید.متنی که خواندید ترجمه این مقاله استما را در تلگرام دنبال کنید