اگر به برنامه نویسی علاقهمند باشید، به احتمال زیاد این نقل قول از آقای جابز را شنیدهاید: همه باید برنامه نویسی کامپیوتر را یاد بگیرند، چون در نهایت یاد میگیرند که چطور فکر کنند! احتمالا برای شما این سوال پیش میآید که منظور جابز چیست؟ یعنی هر کسی که برنامه نویسی نداند، نمیتواند فکر کند؟! اصلا چطور میشود مثل یک برنامه نویس فکر کنیم ؟
تمام کارفرمایان خوب بر این باورند که داشتن توانایی حل مسئله به مراتب مهمتر است از بلد بودن چندین تکنولوژی. در واقع یادگیری این مسئله که چطور مثل یک برنامه نویس فکر کنیم به مراتب زمانبرتر و سختتر است تا یادگیری تکنولوژیهای برنامه نویسی!
وقتی میگوییم مثل یک برنامه نویس فکر کنیم، در اصل منظورمان این است که در مواجه با مسائل و مشکلات روزمره، با آنها مثل یک مسئله ریاضی یا برنامه نویسی برخورد کنیم. در نهایت هم با روشهای مشابه آنها را حل کنیم. در این مقاله قصد دارم درباره روشهای حل مسئله صحبت کنم.
در پایان این مقاله شما یاد میگیرید چطور با مسائل و مشکلات روزمرهتان مواجه شوید و آنها را حل کنید. در واقع شما به یک problem-solver خوب تبدیل میشوید. پس با من تا انتهای این مقاله، همراه باشید:
چرا توانایی حل مسئله مهم است
همه ما در زندگی شخصی و حرفهای خود با مشکلات کوچک و بزرگ زیادی مواجه میشویم. هر کدام از این مشکلات به نوبهی خود خیلی سخت و پیچیده هستند و برای ما دردسرساز! اما در نهایت چیزی که باعث برتری افراد میشود، نحوه مواجه شدن با این مشکلات و حل آنها است.
افراد غالبا برای حل مشکلات خود روشهای مشخص ندارند( روشهای که امتحان خود را پس داده باشند!). بلکه موقع بروز مشکل با توجه به شرایط محیطی و حال و احوال جسمی و روحی خود( و هزاران آیتم دیگر) دست به تصمیمگیری میزنند و سعی میکنند مشکل را حل کنند.
من هم به همین روش مشکلات زندگی و البته برنامه نویسیام را حل میکردم:
سعی میکردم مشکل را حل کنم
اگر نتیجه نگرفتم، راه دیگری را امتحان میکردم
اگر نتیجه نگرفتم، تا زمانی که به جواب برسم، گام قبلی را تکرار میکردم!!
با روش بالا بارها و بارها به موفقیت رسیدم اما این یک واقعیت است که روش بالا روشی غلط برای حل مسئله است. باید اعتراف کنم در نهایت با حل مسائلم با کمک این روش، زمان زیادی را تلف کردهام.
بهترین روش حل مسئله این است که اولا یک چهارچوب داشته باشیم، دوما آن را تمرین کنیم. در ادامه بیشتر توضیح میدهم:
داشتن چهارچوب:
برای پیدا کردن یک چهارچوب درست برای حل مسئله، به نصیحت Tim Ferris در کتاب The 4 hour chef گوش کردم. در نهایت این نصیحت باعث شد با دو فرد بسیار تاثیر گذار در برنامه نویسی صحبت کنم.
من همین سوال را از این دو پرسیدم: چطور مثل یک برنامه نویس فکر کنیم و در مواجه با مسائل، چهارچوب خودمان را داشته باشیم؟
حدس بزنید چه اتفاقی افتاد؟ جواب هر دو خیلی نزدیک به هم بود!
C.Jordan Ball :داشتن چهارچوب به این معنا نیست که تمام مسائل را به یک شکل حل کنید! افراد با هم تفاوت دارند و ممکن است هر فرد یک مسئله را به شکل متفاوتی حل کند. از طرفی راه حل تمام مسائل هم یکسان نیست. اما اگر برای حل مسئلههایتان از مجموعهای از اصول پیروی کنید، خیلی سریعتر پیش خواهید رفت.
V.Anton Spraul : بنظر من بزرگترین اشتباهی که افراد مبتدی انجام میدهند این است که در ابتدای کار شروع میکنند به یادگیری syntax ( نحوه برنامه نویسی) . در صورتی که باید یادبگیرند چطور مسئله را حل کنند(solve problem).
در ادامه مراحلی را ذکر میکنم که باید در مواجه با مشکل جدید، آنها را طی کنید تا در نهایت با تفکر الگوریتمی درست، مسئله را حل کنید.
فهم مسئله:
فهم درست مسئله بدون اغراق، نیمی از راه حل مسئله است. اینکه شما درک کنید سوال دقیقا از شما چه میخواهد. اغلب مسائل سخت، به این دلیل سخت هستند که شما نمیدانید باید دنبال چه چیزی بگردید!
چطور بفهمیم یک مسئله را درست فهمیدهایم؟ اگر بتوانید شرایط مسئله و خواستههایش را به زبان فارسی بیان کنید! ( مثلا برای فرد دیگری توضیح دهید) میتوانید تا حدودی زیادی مطمئن شوید که مسئله را درست درک کردهاید.
احتمالا بارها برایتان پیش آمده است، وقتی مشکلتان را با برای فرد دیگری توضیح میدهید، خیلی از نقاط مبهم داخل مغزتان حل میشود. گاهی هم ممکن است به ابعادی از سوال پی ببرید که تا به حال به آن توجه نکرده بودید.
بیشتر برنامه نویس ها این حس را تجربه کردهاند. پس برای فهم بهتر مسئله، از توضیح آن برای دیگران غافل نشوید(البته شنونده هم مهم است. ترجیحا باید صاحب نظر باشد)
همچنین نوشتن مسئله روی کاغذ یا کشیدن نمودار برای مسئله هم میتواند در فهم آن، کمک کننده باشد.
برنامه ریزی
بدون برنامه ریزی در مسئله شیرجه نزنید! اگر شما نتوانید مراحل حل مسئلهتان را گام به گام بنویسید، با مشکل بزرگی مواجه خواهید شد.
در واقع باید به ذهنتان زمان دهید تا بتواند مسئله را آنالیز کند و اطلاعات را پردازش کند. برای اینکه یک برنامه ریزی درست داشته باشید، به این سوال جواب دهید:
اگر ورودی x را به مسئله بدهیم، چه مراحل و اقداماتی لازم است تا خروجی y را دریافت کنیم؟ در اینجا وظیفه شما طراحی این مراحل است.
تقسیم
لطفا دقت کنید. این مرحله واقعا مرحله مهمی است که شما باید طی کنید تا به سوال “چطور مثل یک برنامه نویس فکر کنیم ” پاسخ دهید.
اگر تلاش کنید که یک مسئله بزرگ را حل کنید، در نهایت بعد از صرف زمان زیاد مجبور خواهید بود پرچم سفیدتان را نشان دهید و اعلام شکست کنید.
به جای شیرجه زدن در مسئله اصلی، سعی کنید آن را به مسائل کوچکتر تقسیم کنید. حل کردن این زیر مسئلهها به نسبت آسانتر است.
حل زیر مسئلهها را از آسانترین آنها شروع کنید. همانی که تقریبا جوابش را میدانید و جواب آن به جواب سایر مسائل بستگی ندارد. هر زیر مسئلهای که حل میکنید مثل این است که یک تیکه از پازل را در جای درستش قرار دهید.
بعد از اینکه تمام زیر مسئلهها را حل کردید(sub problem)، باید آنها را به هم وصل کنید. در نهایت پازل شما آماده است. تبریک میگویم.
در برنامه نویسی، این روش به تقسیم و غلبه معروف است. مسئله بزرگ را به مسائل کوچک شکستن. در نهایت با حل کردن آنها به مسئله بزرگ غلبه میکنیم.
بن بست؟
شاید بپرسید: اگر در حل زیر مسئلهها به مشکل خوردیم، باید چکار کنیم؟
پیشنهاد من به شما این است:
اول یک نفس عمیق بکشید
دوم نگران نباشید. این ممکن است برای هر فرد دیگری هم پیش بیاید. اما تفاوت افراد در رفتار آنهاست. میپرسید یعنی چه؟ باید خدمتتان عرض کنم ذات سوال و مشکل، معلوم است. در واقع اگر جواب سوالی را میدانستیم اسمش مشکل نبود!
برنامه نویسهای خوب( یا problem solverها) در مواجه با این سوالات دست به کار میشوند و با بررسی راه حل، گوگل کردن، سوال کردن و…. در نهایت جواب را پیدا میکنند. اما افراد شکست خورده، در گام اول به گفتن: من نمیتوانم. جوابش را نمیدانم و… بسنده میکنند و سوال را رها میکنند!
وقتی فکر میکنید به بن بست خوردهاید از این سه روش استفاده کنید:
دیباگ کردن مسئله:
ابزار زیادی برای این کار وجود دارد اما در مسائل ساده شما میتوانید به صورت دستی هم دیباگ کنید. مرحله به مرحله جواب را بررسی کنید. باید ببینید در کدام مرحله خروجیای تولید میشود که مورد انتظار شما نیست.
ارزیابی مجدد:
یک مرحله به عقب برگردید و به مسئله از زاویه دیگری نگاه کنید. آیا راه حل دیگری وجود ندارد؟
گاهی ما برای حل یک مسئله در جزئیاتی غرق میشویم که هیچ کمکی به ما نمیکنند. همین موضوع باعث میشود دید کلیای که به مسئله داریم از دست برود و نتوانیم با یک راه حل سادهتر و کلیتر(more general) سوال را حل کنیم.
مثلا برای جمع اعداد از ۱ تا n تمام اعداد را جمع نمیکنیم بلکه از n(n+1)/2 استفاده میکنیم.
یک راه برای ارزیابی مجدد این است که از صفر شروع کنید. بارها وقتی در حل مسئلهای شکست خورده بودم و در جزئیات زیادی غرق شده بودم، از اول شروع کردم.
تمام اطلاعات را دور ریختم و سعی کردم مسئله را مجدد بررسی کنم. به قول شاعر چشمها را باید شست. جور دیگر باید دید!
تحقیق کنید
به من اعتماد کنید. اگر جواب سوالتان را در گوگل پیدا نمیکنید، شاید سوال درستی نمیپرسید! در واقع بسیاری از سوالاتی که با آنها برمیخوریم، قبلا مشکلات افراد دیگری بودند. در نتیجه میتوانید جواب آنها را در گوگل پیدا کنید.
در موارد پیشرفتهتر،شما باید سراغ کتابها و مقالات بروید. در بدترین حالت اگر هیچ جا جوابی برای سوال شما نبود، باید بدانید شانس به شما روی آورده! شما میتوانید روی مقاله خودتان کار کنید و با حل آن سوال، به افراد دیگر این فرصت را بدهید که جواب را بدانند.
تمرین، تمرین و تمرین
محض رضای خدا، انتظار نداشته باشید که تمام این تواناییها در طول یک هفته کسب شود! اگر میخواهید یک problem solver خوب باشید، باید مسائل زیادی را حل کنید که قطعا زمانبر هم خواهد بود.
چطور تمرین کنید؟
میتوانید با حل جدول، سودوکو، مونوپولی، بازی های کامپیوتری و…. شروع کنید. در واقع بازیهایی که منطق ریاضی در پشت آنها است خیلی کمک کننده هستند. همچنین فراموش نکنید که هدف این بازیها چیزی جز “حل مسئله” نیست!
اما پیشنهاد بهتر چیست؟ با مسئله بازی کنید! سایت های زیادی هستند مثل codewars که این امکان را به شما میدهند تا مسائل الگوریتمی حل کنید. شما برای حل این مسائل محدودیتی در زبان برنامه نویسی ندارید. پس میتوانید با خودتان، دوستتان یا دوستان مجازی در این سایتها مسابقه برگزار کنید. در نهایت هم جنبه سرگرمی دارد هم توانایی حل مسئله شما افزایش پیدا میکند.
در این مقاله تمام سعیام بر این بود که نه تنها به سوال چطور مثل یک برنامه نویس فکر کنیم؟ پاسخ دهم، بلکه با آموزش راهکاری برای مواجهه و حل مسائل( نه صرفا مسائل برنامه نویسی) به شما کمک کنم تا به یک problem solver خوب تبدیل شوید. امیدوارم به هدفم رسیده باشم.
اگر سوال یا نظری درباره اینکه چطور مثل یک برنامه نویس فکر کنیم؟ دارید یا اینکه تجربهای در زمینه نحوه حل مسئله دارید، با من و سایر خوانندگان این مقاله در میان بگذارید. تا یادم نرفته، بنظر شما مقالهی بعدی دربارهی چه موضوعی باشد؟
راستی! تلگرام چ یاب رو برای با خبر شدن از آخرین دورههای آموزشی، محصولات و تخفیف های ویژه دنبال کنید.
منابع: freecodecamp
ارسال پاسخ
نمایش دیدگاه ها