بسیاری از برنامهنویسان توصیه مشابهی را دریافت میکنند: تا جایی که امکان دارد مسائل را حل کن. این درست است که حل مشکلات جدید میتواند به شما کمک کند تا تجربه کسب کنید و دانش خود را بالا ببرید. من نیز به دنبال مسائل و پروژههای جدید هستم.
اما من این موضوع را مهم ساختم تا مشکلات و مسائل را بازیابی کنم: آنها را چند بار تکرار کنید، و هر بار با هدفی متفاوت، چرا که از تکرار با یک هدف سود بیشتری دارد.
دانستن آنچه من نمیدانم
فقط به این دلیل که من یک بار مشکلی را حل کردم همیشه به این معنی نیست که میتوانم آن را دوباره حل کنم.
من روزی در کتابخانه بودم، در حال کار کردن بر روی مشکلی بودم که هفته پیش آن را حل کرده بودم. در عرض چند روز، فراموش کردم که آن مشکل چطور حل شد. به شدت در حال تلاش کردن بودم و خطا پشت خطا رخ میداد.
تجربه به من نشان داد که نیاز به کار بیشتر در شرایط و عملکردهای مختلف دارم. شرایط مشابهی پیش از این اتفاق افتاده است، به همین دلیل است که مسائل مربوط به بازیافت مهم است: این امر دانش مرا تست کرده و نقاط ضعفم را نشان میدهد.
حل مشکلات نیز مفاهیم را تقویت میکند. این فوقالعاده است که من میتوانم مشکلی را حل کنم که از کلاسهایی استفاده کرده است که من در حال مطالعه آنها هستم و مفاهیم در ذهن من تازه هستند. اما آیا میتوانم به خاطر بیاورم که چگونه از آن کلاسها یک یا دو هفته بعد استفاده کنم. گذر برای بار دوم از یک مساله شیوهای برای کشف کردن است.
مشکلات قدیمی، ترفندهای جدید
اضافه کردن محدودیتهای خودساخته راه دوم برای بازیابی مشکلات برنامهنویسی است. مثلا، من اخیرا از یک حلقه for برای حل مشکلی که در برنامه نویسی گرفتار آن شده بودم استفاده کردم. برای بار دوم که روی این موضوع کار میکردم یک محدودیت ساده به خودم دادم: مساله را دوباره بدون حلقه for حل کردم. به عبارت دیگر، من مجبور شدم رویکرد دیگری را امتحان کنم.
بنابراین من استفاده از یک مجموعه را امتحان کردم، و در نتیجه برنامه من تمیزتر و خواناتر شد. سپس با یک محدودیت دیگر گام بعدی را برداشتم: آن موضوع را با تغییر دیگری از مجموعه حل کردم. در مجموع، میزان کد برای این برنامه را بیش از 50% کاهش دادم، و من در این فرآیند مطالب زیادی را در مورد مجموعهها آموختم!
محدودیتهای دیگر باعث پیچیدگی کد من میشوند. در یک مشکل بازیافتی خودم را محدود به استفاده از حلقه while کردم، و برنامه طولانی و پیچیده شد؛ حلقه forای که در حالت قبل استفاده کرده بودم گزینه بهتری بود. حتی هنوز هم تکرار یک مشکل با یک محدودیت به من کمک میکند تا درک کنم که چه موقع یک رویکرد از دیگری بهتر است.
بنابراین تکرار موضوع با محدودیتها من را از حیطه آسودگی خارج کرده و فکر مرا با روشهای جدید و خلاقانه باز میکند. من معمولا در مسائلی گیر کردم و مجبور شدم تا در مورد آن تحقیق کنم. در این روند، جزئیاتی که آنها را نادیده گرفته بودم را فرا گرفتم و روشهای جدید برای انجام کارها را آموختم.
یادگیری نوشتن تست
در مرحله سوم از طریق کتاب "تمارین برنامهنویسی" برایان هوگان پیش رفتم. من برای هر تکرار هدف خاصی داشتم. این بار از طریق نوشتن تست وارد عمل شدم.
این روند چطور کار میکند: موضوعی را به صورت رندم از کتاب هوگان انتخاب کرده و آن را حل کردم. مساله را به فایلهای جداگانه سازماندهی کردم. هر فایل مسئول بخشی از راهحل بود. سپس تستها را نوشتم. اگرچه تمارین زیادی را نوشتم و توابع را گرفتم و فایلها را وارد کردم، اما هنوز تستها را کامل ننوشتم.
نقطه وسیعی برای این تکرارها وجود دارد. این امر به من کمک میکند تا الگوها را ببینم و آنها را در ذهنم تقویت کنم، بنابراین میتوانم آنها را به عنوان الگوهای ذهنی برای مسائل جدید به کار گیرم. این توصیه George Polya در کتاب "چگونه مسائل را حل کنیم" میباشد. او وقتی با مساله جدیدی روبهرو میشود، توصیه میکند "محتوا را با دانش قبلی خود بررسی کنید". وی ادامه میدهد: "سعی کنید در مورد آنچه که در گذشته در موقعیتهای مشابه به شما کمک کرده فکر کنید، سعی کنید در روشی که بررسی کردهاید موارد آشنا را تشخیص دهید، سعی کنید در آنچه که تشخیص دادهاید مطالب مفید را درک کنید."
او درست میگوید. من به تازگی موضوعی را تکمیل کردم که مجبور بودم آن را شناسایی کنم. قبل از اینکه یک خط از کد را تایپ کنم، مساله مشابهی را به خاطر آوردم که چند هفته پیش حل کرده بودم. اگرچه مشکل اصلی خیلی سادهتر از آن چیزی بود که وجود داشت، اما به من فرصتی داد تا آن را شروع کنم.