چگونه مثل یک برنامه نویس فکر کنیم- مبحث تکنیک حل مسئله

اگر علاقه‌مند به برنامه نویسی هستید احتمالا قبلا این جمله‌ی معروف از استیو جابز را شنیده اید که میگوید:"هر کسی در این کشور باید یاد بگیرد تا یک کامپیوتر را برنامه نویسی نماید، زیرا این کار چگونه اندیشیدن را به شما یاد می دهد."شاید برای شما هم این سوال پیش آمده باشد که «فکر کردن مثل یک برنامه نویس به چه معناست؟» و «شما چگونه می توانید مثل یک برنامه نویس فکر کنید؟»در اصل این طرز تفکر درباره‌ی یافتن راه حلی کارآمد تر برای حل مسئله است. در این پست ما به معرفی مسیر رسیدن به این طرز تفکر می پردازیم. در انتهای این پست شما خواهید دانست که قدم به قدم چه مسیری را طی کنید مسائل را به روش کاراتری حل نمایید.اهمیت تکنیک حل مسئله چیست؟حل مسئله یکی از اصلی ترین مهارت های یک برنامه نویس می باشد. همه ما مشکلاتی داریم که طرز برخورد ما با آنها به طرزی دل بخواهی می باشد. در صورتی که سیستمی از پیش تعیین شده برای حل مسایل نداشته باشید احتمالا برای حل مسائل از روند زیر پیروی خواهید کرد:امتحان کردن یک پاسخ برای مسئله.اگر این پاسخ درست نبود پاسخ دیگری را امتحان کنیم.اگر پاسخ بعدی هم درست نبود مرحله دوم را تکرار کنیم تا پاسخ درست را پیدا کنیم.شاید برخی مواقع این روش کارساز باشد، اما در عمل این روند علاوه بر اینکه راه مناسبی برای حل مسئله نمی باشد، زمان زیادی نیز از شما به هدر می دهد.بهترین راه حل در وهله اول داشتن یک چارچوب خاص، و پس از آن تمرین آن می باشد."تقریبا برای تمام کارفرما ها، مهارت های حل مسئله از اولویت بالایی برخوردارند. کارفرمایان مهارت های حل مسئله را مهمترین معیار ارزیابی مد نظر قرار می دهند ... حتی مهمتر از تبحر در زبان برنامه نویسی، رفع باگ ها و طراحی سیستم.تشریح تفکر محاسبه گرایانه (computational thinking) یا همان قابلیت تقسیم یک مسئله بزرگ و پیچیده به بخش های کوچک تر، به اندازه( و حتی بیشتر از) مهارت های معیار دیگر، برای انجام کار اهمیت دارد."Hacker Rank (2018 Developer Skills Report)یک چارچوب کلی داشته باش:برای پیدا کردن چارچوب مناسب، من از راهنمایی های Tim Ferriss در کتاب “The 4-Hour Chef” استفاده کردم. این قضیه منجر به مصاحبه ی من با دو چهره ی تأثیر گذار شد: C. Jordan Ball (نفر اول یا دوم در میان بیش از 65000 کاربرCoderbyte ) و V. Anton Spraul (نویسنده‌ی کتاب: “Think Like a Programmer: An Introduction to Creative Problem Solving”)من در جریان مصاحبه از هردو یک سوال را پرسیدم و جوابشان به سوال بسیار شبیه هم بود!!! به زودی شما هم با این دو نفر آشنا خواهید شد.البته این بدان معنی نیست که آنها تمام کارهایشان را مثل هم انجام میدادند. همه افراد متفاوت از یکدیگرند. شما نیز متفاوت از دیگران خواهید بود، اما اگر با اصولی که همگی معتقدیم مناسب هستند کار خود را شروع کنید، مسیر طولانی تری را در زمانی کوتاه تر طی خواهید کرد."بزرگترین مشکل برنامه نویس های تازه وارد از نظر من، تمرکز آنها بر روی دستورات به جای یادگیری فن حل مسئله می باشد."V. Anton Spraulسوال اینجاست که زمانیکه با یک مشکل جدید مواجه میشوید چه باید بکنید؟۱- درک کردنبدانید که دقیقا چه چیزی خواسته شده است. سختی بیشتر سوالات بخاطر مشکل ما در درک آنها است. به همین خاطر این اولین قدم در حین مواجه شدن با مسائل می باشد.به طور کلی می توان گفت زمانیکه ما مسئله را به زبانی ساده و به راحتی بتوانیم شرح دهیم میتوانیم بگوییم آن مسئله را درک کرده ایم. احتمالا برای شما هم اتفاق افتاده است که در حل یک مسئله به مشکل برخورده باشید و در این حالت شروع به توضیح صورت مسئله برای خودتان بکنید، تا اینکه گره کار را پیدا کنید. اکثر برنامه نویس ها این قضیه را تجربه کرده اند.بخاطر همین موضوع است که شما باید مسئله‌تان را روی کاغذ بنویسید، نموداری برای آن بکشید و یا حتی آن را برای فرد دیگری شرح دهید (و حتی در برخی موارد برای یک شی مثل اردک پلاستیکی یا همان تکنیک rubber duck )"اگر قادر به تشریح چیزی به زبانی ساده نباشید، در حقیقت آنرا درک نکرده اید."Richard Feynman۲- برنامه ریزی:بدون داشتن یک برنامه مشخص و به امید اینکه به طریقی کار را پیش خواهید برد برای حل مسئله نشتابید. ابتدا راه حل خود را برنامه ریزی کنید!هیچ کاری نمی تواند به شما کمک کند اگر شما قادر نباشید مراحل کارتان را قدم به قدم برنامه ریزی کنید. در برنامه نویسی این بدان معنیست که همان ابتدای کار دست به کار نشوید و فرصتی دهید تا ذهنتان مسئله را آنالیز کرده و داده های موجود را بررسی نماید. برای طراحی یک برنامه خوب باید پاسخ این سوال را بیابید:"در صورتی که داده‌ی X را داشته باشیم، چه مراحلی لازم است تا خروجی Y حاصل شود؟"تذکر: کامنت ها یکی از کاربردی ترین ابزاری هستند که می توانند برنامه نویسان را در این زمینه یاری کنند.۳- تقسیم بندی:این قدم مهمترین مرحله در میان تمام مراحل می باشد.هرگز تلاش نکنید که یک مسئله بزرگ را حل کنید. بجای آن سعی کنید آنرا به مسائل دیگری که حل آنها بسیار راحت تر است تقسیم کنید. سپس هر کدام از این بخش های آسان تر را یکی پس از دیگری حل کنید. در این مسیر سعی کنید با بخش ساده تر شروع کنید یعنی مسئله ای که یا جواب آنرا می دانید و یا می توانید راحت تر به جواب آن برسید. همچنین واضح است که مسئله ای ساده تر است که حل آن به حل دیگر مسئله ها وابسته نیست.زمانیکه تمام این مسئله های کوچکتر را حل کردید، پاسخ های مسائل ساده تر را کنار هم بگذارید تا به حل مسئله ی اصلی برسید. این تکنیک در واقع سنگ بنای حل مسئله می باشد پس آنرا به خاطر بسپارید."اگر می توانستم به تمام برنامه نویسان تازه کار یک مهارت حل مسئله بیاموزم، آن تکنیک، روش کاهش (پیچیدگی) مسئله می بود. برای مثال فرض کنید شما یک برنامه نویس تازه کار هستید و از شما خواسته شده تا یک برنامه بنویسید که ده عدد بگیرد و سومین عدد بزرگ میان آنها را مشخص کند. برای یک برنامه نویس تازه کار، اینکار همراه با چالش های زیادی همراه خواهد بود، هرچند که تنها با دستورات پایه ای برنامه نویسی قابل انجام است.اگر در حل مسئله ای به مشکل برخورده اید باید آنرا به چیزی ساده تر تبدیل کنید. بجای سومین عدد بزرگ، چطور است که بزرگترین عدد را بیابید؟ آیا هنوز هم انجام آن سخت است؟ در مورد پیدا کردن بزرگترین عدد بین سه عدد چطور؟ و یا حتی عدد بزرگتر بین دو عدد؟مسئله را تا جایی که بدانید چطور آنرا حل کنید ساده کنید و راه حل آنرا بنویسید. سپس مسئله را به مرور گسترش دهید و به تبع آن راه حل خود را نیز اصلاح کنید تا زمانیکه به نقطه اولی که از آن شروع کرده بودید برسید (مسئله اصلی)."- V. Anton Spraul۴- گیر افتادن:تا به اینجای کار شاید این سوال برایتان پیش آمده باشد که اگر مسائل کوچکتر جایگزین را هم نتوانیم حل کنیم چه کنیم؟اول یک نفس عمیق بکشید و بعد از آن بدانید که این امری عادی است و برای همه ممکن است رخ دهد!فرق افراد مختلف اینست که یک برنامه نویس یا تحلیلگرِ بهترِ مسائل، در تقابل با این ضعف ها وکاستی ها بیشترکنجکاو است و مضطرب نمی باشد.در حقیقت در حین مواجه شدن با چنین گره هایی در کارتان می توانید از این 3 نکته استفاده نمایید:مشکل یابی (debug) : قدم به قدم حل خود را چک کنید و سعی کنید پیدا کنید کجای کار را اشتباه رفته اید. برنامه نویس ها اینکار را مشکل یابی (debugging) می گویند."هنر مشکل یابی، دریافتن آنست که شما در واقع به برنامه تان گفته اید چه کاری را انجام دهد به جای چیزی که فکر می کنید به آن گفته اید تا انجام دهد."Andrew Singerارزیابی مجدد: یک قدم به عقب برگردید و مسئله را از دید دیگری مجدداً بررسی نمایید. آیا چیزی هست که منجر به رسیدن به روندی معمول‌تر و راحت‌تر گردد؟"گاهی ما چنان در جزییات یک مسئله غرق می شویم که از کنار اصول کلی تری که همان مسئله را در سطحی عمومی تر حل می نمایند به سادگی عبور می کنیم.مانند مثال قدیمی راجب جمع تعداد زیادی از اعداد صحیح متوالی،1+2+3+...+n ، که جوانی به نام گاوس سریع متوجه شد که حاصل آن مطابق n(n+1)/2 بدست می آید و به واسطه ی آن از تحمل مشقت انجام جمع اعداد راحت شد."C. Jordan Ballتذکر: راه دیگر ارزیابی مجدد شروع از صفر می باشد. یعنی هر آنچه دارید را کنار بگذارید و از نو با نگرشی تازه به مسئله بنگرید. مطمیئن باشید که خودتان نیز باورتان نخواهد شد این روش چقدر تاثیرگذار است.تحقیق: مهم نیست که با چه مشکلی روبرو شده اید، یک نفر احتمالا قبلا آنرا حل کرده است و تنها کافیست آن فرد/حل را پیدا کنید(به عبارتی گوگل اش کنید). در واقع حتی زمانیکه مسائل را خودتان حل کنید هم اینکار را انجام دهید (اینکار می تواند بار آموزشی بالایی برای شما داشته باشد).هشدار: به دنبال راه حلی برای مسئله اصلی تان نباشید بلکه راه حل مسائل آسانتر را جست و جو کنید.چرا؟ چون تا زمانیکه به چالش کشیده نشوید چیزی یاد نخواهید گرفت و اگر چیزی یاد نگیرید تنها وقتتان را هدر داده اید.تمرین:انتظار نداشته باشید تنها پس از گذر یک هفته در کار خود خبره شوید. اگر می خواهید در کار حل مسئله ماهر شوید، زیاد مسئله حل کنید! تمرین، تمرین و تمرین. تنها مدتی طول می‌کشد تا اینکه بتوانید به راحتی تشخیص دهید هر سوال با چه راه حلی سریع‌تر به‌ نتیجه می‌‌رسد. چطور تمرین کنیم؟ باید گفت که تعداد انتخاب ها بسیار زیاداست. شطرنج، پازل، سوالات مسابقات، سودوکو، مونوپولی، بازی های ویدیویی و...در حقیقت یک الگوی معمول بین افراد موفق عادتِ حلِ سوالچه (micro problem) است. برای مثال Peter Thiel شطرنج بازی می کند و Elon Musk بازی های ویدیویی انجام می دهد."Byron Reeves گفت که: «اگر بخواهید ببینید که رهبری تجارت ها در سه تا پنج سال آینده چگونه خواهد بود، نگاه کنید که در بازی های آنلاین چه اتفاقی رخ می دهد.»با جهشی به امروز، Elon [Musk]، Reid [Hoffman]،Mark Zuckerberg و بسیاری دیگر اذعان کرده اند که بازی ها زیربنایی برای موفقیت آنها در ساخت کمپانی هایشان بوده است."Mary Meeker (2017 internet trends report)اما آیا این بدان معناست که شما تنها باید بازی های ویدیویی انجام دهید؟ اصلا و ابدا.پس اهمیت بازی های ویدیویی در چیست؟ باید گفت که اهمیت آنها در حل مسئله است!پس، کاری که باید انجام دهید یافتن یک راه دررو برای تمرین کردن است. چیزی که به شما اجازه دهد تا تعداد زیادی سوالچه (micro problems) حل کنید.برای مثال، من از چالش های کد زنی لذت می برم و هر روز سعی می کنم حداقل یک چالش را حل کنم(معمولا در Coderbyte)همانطور که گفتم تمام مسائل از الگوهای مشابه بهره می گیرند.نتیجه گیری:این تمام کاری بود که باید انجام دهید! حالا شما در مورد «فکر کردن مثل یک برنامه نویس» بیشتر می دانید. همچنین می دانید که مهارت حل مسئله یک مهارت بسیار مهم برای سرمایه گذاری جهت رشد و بارور سازی توانایی هایتان می باشد.علاوه بر این، الان شما می دانید که چه کاری انجام دهید تا مهارت های حل مسئله خود را تمرین کنید!در نهایت امیدوارم با مسائل زیادی برخورد کنید. بله، درست میبینید. حداقل حالا می دانید چطور آنها را حل کنید!(همچنین، یاد میگیرید که با هر پاسخ، شما پیشرفت بیشتری می کنید.)"درست زمانیکه فکر می کنید به سلامتی از سد یک مانع رد شده اید، مانعی دیگر سر راهتان قرار می گیرد. اما همین قضیه است که زندگی را هیجان‌انگیز می کند.[...]زندگی فرآیند عبور از همین موانع است-که مانند جبهه های مجهزی پشت سر هم هستند و ما باید از آنها عبور کنیم.هر بار چیزی یاد خواهید گرفت.هر بار قدرت، ذکاوت و دید شما تکامل می یابد.هر بار که قدری در این رقابت پیش می روید. تا زمانیکه تمام آنچه باقیست خود شمایید: بهترین نسخه ی شما."Ryan Holiday (The Obstacle is the Way)حالا شروع به حل مسائل کنید!و با آرزوی موفقیت برایتان.برای خواندن مطالب مشابه میتونین به بلاگ ما سربزنین: لینک