چگونه بفهمیم که تمام موارد ممکن را از یک مسئله برنامه نویسی یاد گرفته‌ایم ؟

ترجمه و تالیف : علیرضا داداشی
تاریخ انتشار : 24 دی 99
خواندن در 6 دقیقه
دسته بندی ها : برنامه نویسی

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

در دنیا مسائل زیادی برای حل شدن وجود دارد. آیا با حل مسائل بیشتر، بهتر نمی‌شوید؟ وقتی به جواب دست پیدا کردید، می‌توانید چه کارهای دیگری را انجام دهید؟

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

حالا فهمیده‌ام که رسیدن به راه‌حل تنها بخشی از فرایند حل مسئله است. به قول جورج پولیا :« حالا وقت آن رسیده که به گذشته نگاهی بیاندازیم.»

نگاهی به گذشته

پولیا در کتاب خود از دید ریاضی به فرایند حل مسئله پرداخته است، اما گفته‌های او برای برنامه نویسی نیز قابل استفاده می‌باشند. چیزی که برای من جالب است، فاز چهارم او یعنی "نگاه به گذشته" می‌باشد. پولیا نوشته است:« دانشجویان با بازگشت به راه‌حل نهایی، تجدید نظر، بررسی نتیجه و مسیر پیموده شده می‌توانند دانش خود را تلفیق بخشیده و توانایی خود را در حل مسائل توسعه دهند.»

حل مسئله از بعضی جهات، مانند خلق یک اثر هنری است. همیشه کارهای بیشتری وجود داشت که می‌توانستیم انجام دهیم. پولیا می‌گوید:« ما می‌توانیم در هر صورت راه‌حل خود را بهبود ببخشیم و همیشه درک خود را از راه‌حل بهتر کنیم.» به شخصه برای من نگاه کردن به گذشته، عملی در جهت یادگیری و ارتقای شخصی است. هدف این است که:

- از موفقیت‌های خود درس بگیرم: بفهمم که چه چیزی را با چه علتی نوشته‌ام.

- توانایی خودم را در یادگیری مفاهیم جدید تقویت کنم.

- الگوها را مشاهده کرده و زمینه استفاده از یک ساختار داده یا الگوریتم خاص را درک کنم.

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

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

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

دلیل ۱: الگوها را ببینید و زمینه را درک کنید

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

دلیل ۲: یادگیری خود را تقویت کنید

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

دلیل ۳: از موفقیت‌های خود درس بگیرید

ریچارد همینگ ریاضیدانی است که با گفته‌های خود در کتاب "The Art of Doing Science" کاملا این موضوع را توضیح داده است. او می‌گوید:« من مطالعه‌ی موفقیت‌ها را مهمتر از مطالعه‌ی شکست‌ها می‌دانم. راه‌های زیادی برای اشتباه بودن وجود دارد اما راه‌های درست بودن بسیار اندک هستند. مطالعه کردن موفقیت خیلی تاثیرگذارتر خواهد بود.»

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

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

چهار روش برای نگاه به گذشته

من با چندین روش به گذشته نگاه می‌کنم. این روش‌ها را حتماً امتحان کنید.

به خودتان آموزش دهید

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

من این فرایند را در یادگیری توسعه وب بسیار ارزشمند دانستم. پس از اتمام پروژه، کدهای خودم را در Google Doc کپی می‌کنم. سپس از ابتدا شروع می‌کنم و در مورد آن‌ها نظر می‌دهم تا به خودم مفاهیم مهم را بیاموزم.

در اینجا می‌توانید بخشی از کد و کامنت من را مشاهده کنید:

export default function ManageTeamMembersPage(props) {
 
    const [teammate, setTeammate] = useState({
       name:"",
       email: "",
       role: "",
   })
   
   ...

- از prps برای دسترسی به داده‌های منتقل شده از مولفه اصلی استفاده کنید.

- state hook را اضافه کنید. hook حالت پیش فرض دارد و شامل تمام چیزهایی است که برای فرم لازم خواهد شد: نام، ایمیل، نقش.

روش "نگاه به گذشته" در مورد درک کردن است. در مثال بالا من مشغول یاد گرفتن حالت، پراپ‌ها و فرم‌ها در React بودم. نوشتن کامنت برای کدهایتان به شما در درک مفاهیم کمک می‌کند. اگر نمی‌توانید بلافاصله توضیح کوتاهی را برای آن بنویسید، دوباره مبحث را مرور کنید.

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

راه‌حل‌های برنامه‌نویسان بزرگ را مطالعه کنید

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

من هم روند مشابهی را دنبال می‌کنم تا به برنامه نویسی بهتر تبدیل شوم.

در اینجا می‌توانید نحوه کارکرد را مشاهده کنید:

- یک مسئله را حل کنید.

- برنامه نویسی را پیدا کنید که از شما بهتر بوده و مسئله مشابهی را حل کرده باشد.

- راه‌حل آن‌ها را مطالعه کنید. تمام خطوط کد را بخوانید و برای توضیح آن یک نظر در بخش ادیتور خود بنویسید.

- پس از گذشت مدتی سعی کنید برنامه را دوباره حل کنید. از نظراتی که نوشته‌اید به عنوان راهنمایی استفاده کنید.

- برنامه‌ی خود را با برنامه‌ای که مطالعه کرده‌اید مقایسه کنید.

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

محدودیت اضافه کنید

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

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

یک مسئله مرتبط حل کنید

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

حالا یکی از موارد مشابه و ارائه داده شده توسط LeetCode را حل کنید. این بار به شما آرایه‌ای از اعداد صحیح صعودی داده می‌شود. در کنار این موضوعات برای شما چند محدودیت اضافی اعمال می‌شود تا این مسئله با مسئله قبلی فرق داشته باشد.

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

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

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید