چگونه بر مشکلات برنامه نویسی غلبه کنیم؟

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

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

بخش دیگر برنامه‌نویس شدن این است که بتوانید بر مشکلات ناشی از آن غلبه کنید.

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

شکل واقعی به مشکلات بدهید.

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

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

چگونه بر مشکلات برنامه نویسی غلبه کنیم؟

این رویکرد برای حل سایر مسائل هم مؤثر است. زمانی‌که حلقه‌ها را یاد می‌گرفتم، از همین روش استفاده می‌کردم. وقتی‌که روی مسائل بازگشتی کار می‌کنم، برای آنکه راحت‌تر بتوانم آن را درک کنم، یک نمودار رسم می‌کنم.

نکته مشترک این است که باید به مسئله، شکل واقعی دهید.

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

وقتی‌که احساس می‌کنید حلقه‌ها کاملاً آشنا هستند، دقیقاً چیزی را که قرار است روی آن کار کنید، یادداشت کنید.

ای کار تنها 5 یا 10 ثانیه از وقت شما را می‌گیرد اما به شما کمک می‌کند که روند فکری‌تان را ثبت کنید و آن را در جهت درستی قرار دهید.

به این مثال‌ها توجه کنید:

  • اسامی دوره‌ها را در قالب کلید در یک شی‌ء نگهدارید.
  • یک آرگومان را در تابع فراخوانی قرار دهید.
  • متغیری که بیشترین مقدار را دارد، صفر کنید.

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

بااین‌وجود هر زمان متوجه شدید که فقط یک رویکرد را دنبال می‌کنید و به یک نتیجه تکراری می‌رسید، کار را متوقف کنید و از خودتان بپرسید: «در اینجا واقعاً قصد انجام چه‌کاری را دارم؟»

سپس پاسختان را روی یک برگه یادداشت کنید.

ورودی‌هایتان را ساده‌سازی کنید.

کارکردن با تعداد کمی ورودی، ساده‌تر از کارکردن با تعداد زیادی از آن‌هاست. به‌همین دلیل بهتر است که ورودی‌هایتان را ساده‌سازی کنید.

یکی از مسائل، سه دیکشنری مختلف را به من نشان داد. بااینکه فقط سه دیکشنری بود، اما آن دوتای اضافی، هنوز هم خیلی زیاد بودند.

names = [
    {'first':'John', 'last':'Smith', 'email':'johns@example.com'},
    {'first':'Mary', 'last':'McDonald', 'email':'marym@example.com'},
    {'first':'Sam', 'last':'Davey', 'email':'samd@example.com'}
]

کار من این بود که هر دیکشنری را براساس نام‌خانوادگی و سپس نام کوچک مرتب کنم (به‌طور مثال: Davey,Sam:samd@example.com). وقتی به‌جای سه دیکشنری مختلف از یکی از آن‌ها استفاده کردم، فکرکردن به مسئله برایم راحت‌تر شد.

name = [
    {'first':'John', 'last':'Smith', 'email':'johns@example.com'}
]

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

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

مسائل کوچک‌تر را حل کنید.

الگوهای کوچک راحت‌تر هستند و بهتر است وقتی‌که مسائل کوچک‌تر را حل می‌کنید، بدانید که در اصل چه‌کاری را باید انجام دهید.

در اینجا یک مثال از مسئله‌ای را می‌بینید که در کتاب Reuven Lerner به نام مسائل پایتون ذکر شده است:

« از یک فهرست قابل‌درک برای معکوس کردن ترتیب کلمات یک خط در یک فایل متنی استفاده کنید. منظور این است که اگر اولین خط به این‌صورت: abc def است و خط دوم به این‌صورت: ghi jkl است، شما باید درنهایت آن‌ها را به‌این‌ترتیب بنویسید:  ['def abc', 'jkl ghi']»

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

سپس توانستم مسئله را حل کنم. از ویرایشگرم استفاده کردم و ساختار داده‌ای موردنظرم را تایپ کردم.

letters = ['abc def', 'ghi jkl']

ترتیب حروف را معکوس کردم و با استفاده از یک حلقه ‌for به نتیجه دلخواه رسیدم.

reversed_letters = []
for letter in letters:
   letter_list = letter.split(" ")
   letter_list.reverse()
   reversed_letters.append(" ".join(letter_list))

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

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

کمی استراحت کنید.

تا زمانی‌که انگشتان شما درحال تایپ کردن هستند، مغز شما هم درحال کارکردن است.

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

این اتفاق که وقتی عمداً درحال انجام کار دیگری هستید و ناگهان یک راه‌حل به ذهنتان می‌رسد، تصادفی نیست. یکی از مقالات  Scientific Americanمی‌گوید: «گویی الهامات متعلق به هیچ‌جا نیستند»؛ اما معمولاً آن‌ها بعد از یک دوره استراحت به ذهن خطور می‌کنند.

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

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

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

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

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

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

سخن پایانی

به مشکل برخوردن مطمئناً ناامیدکننده است. ممکن است شما از یکی از تاکتیک‌های بالا استفاده کنید و ایده حل مشکل هم به ذهنتان برسد و یا ممکن است لازم باشد ترکیبی از موارد بالا را استفاده کنید و بتوانید به تاکتیک موردنظرتان دست پیدا کنید.

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

منبع

گردآوری و تالیف علیرضا معمارزاده

Student of Software Engineering, python Developer, i love programming and game