درسهایی در حل مسئله
اگر به برنامه نویسی علاقه دارید ، شاید قبلاً این نقل قول را دیده باشید:
“همه در این کشور باید برنامه نویسی کامپیوتر را بیاموزند ، زیرا به شما یاد می دهد فکر کنید.”
استیو جابز
احتمالاً شما هم فکر کرده اید که دقیقاً فکر کردن مثل یک برنامه نویس یعنی چه؟ و چگونه این کار را انجام می دهید ؟؟
اساساً ، همه چیز در مورد یک روش موثرتر برای حل مسئله است .
در این مقاله، هدف من این است که به شما آن را آموزش دهم.
در پایان آن ، شما دقیقاً می دانید که برای حل یک مسئله بهتر چه قدم هایی را باید بردارید.
چرا مهم است؟
حل مسئله فرا مهارت است.
همه ما مشکل داریم. بزرگ و کوچک. نحوه برخورد ما با آنها گاهی اوقات ، بسیار تصادفی است.
تا زمانی که سیستم نداشته باشید ، احتمالاً اینگونه مشکلات را “حل” می کنید (کاری که من هنگام شروع کدنویسی انجام دادم):
- راه حلی را امتحان کنید.
- اگر این کار نکرد ، یکی دیگر را امتحان کنید.
- اگر نتیجه نداد ، مرحله 2 را تکرار کنید تا شانس بیاورید.
گاهی اوقات موفق می شوید. اما این بدترین راه برای حل مشکلات است! و این اتلاف وقت بزرگی است.
بهترین راه شامل الف) داشتن چارچوب و ب) تمرین آن است.
“تقریباً همه کارفرمایان ابتدا مهارتهای حل مسئله را در اولویت قرار می دهند.
مهارتهای حل مسئله تقریباً به اتفاق آرا مهمترین مهارتی است که کارفرمایان به دنبال آن هستند … بیش از مهارتهای زبان برنامه نویسی ، اشکال زدایی و طراحی سیستم.
نشان دادن تفکر محاسباتی یا توانایی تجزیه مشکلات پیچیده و بزرگ به همان اندازه مهارت های فنی اولیه مورد نیاز برای یک کار ارزشمند است (اگر نه بیشتر).
Hacker Rank (گزارش مهارت های برنامه نویس 2018 )
چارچوب داشته باشید
این بدان معنا نیست که همه کارها را به یک شیوه انجام می دهند. همه متفاوت هستند. شما متفاوت خواهید بود اما اگر با اصولی شروع کنید که همه ما موافقیم خوب است ، خیلی سریعتر کارهای زیادی را پیش خواهید برد.
“بزرگترین اشتباهی که من می بینم برنامه نویسان جدید مرتکب شده اند ، تمرکز بر یادگیری نحو(syntax) به جای یادگیری نحوه حل مشکلات است.”
V. Anton Spraul
بنابراین ، وقتی با مشکلی جدید مواجه شدید چه کاری باید انجام دهید؟
1. درک کنید
دقیقاً بدانید که چه سوالی پرسیده می شود. بیشتر مشکلات سخت، سخت است زیرا شما آنها را درک نمی کنید (از این رو این اولین قدم است).
چگونه می توان متوجه شد وقتی مشکلی را می فهمید؟ وقتی می توانید آن را به زبان ساده توضیح دهید.
آیا به خاطر دارید که روی مسئله ای گیر کرده اید ، شروع به توضیح آن می کنید و بلافاصله سوراخ هایی را در منطقی که قبلاً نمی دیدید مشاهده می کنید؟
اکثر برنامه نویسان این احساس را می دانند.
به همین دلیل است که شما باید مشکل خود را یادداشت کنید ، یک نمودار را ابداع کنید ، یا در مورد آن به شخص دیگری بگویید (یا چیز دیگری … برخی از افراد از یک اردک لاستیکی استفاده می کنند! )
“اگر نمی توانید چیزی را به زبان ساده توضیح دهید ، آن را نمی فهمید.”
ریچارد فاینمن
2. برنامه ریزی کنید
بدون داشتن برنامه سراغ حل مسئله نروید (و به نوعی امیدوار باشید که بتوانید راه خود را پیدا کنید) راه حل خود را برنامه ریزی کنید!
اگر نتوانید مراحل را دقیق یادداشت کنید هیچ چیز به شما کمک نمی کند.
در برنامه نویسی ، این بدان معنی است که بلافاصله هک کردن را شروع نکنید. به مغز خود فرصت دهید تا مشکل را تجزیه و تحلیل کرده و اطلاعات را پردازش کند.
برای به دست آوردن یک برنامه خوب ، به این سوال پاسخ دهید:
“با توجه به ورودی X ، مراحل لازم برای بازگرداندن خروجی Y چیست؟”
برنامه نویسان ابزاری عالی برای کمک در این زمینه دارند … نظرات!
3. تقسیم کنید
توجه کنید این مهمترین مرحله است.
سعی نکنید یک مشکل بزرگ را حل کنید. گریه خواهید کرد!
در عوض ، آن را به زیرمشکلات تقیسم کنید. حل این مشکلات فرعی بسیار آسان تر است.
سپس ، هر زیر مسئله را یکی یکی حل کنید. با ساده ترین کار شروع کنید. ساده ترین یعنی شما جواب را می دانید (یا به آن پاسخ نزدیکتر هستید).
پس از آن ، ساده ترین بدان معناست که حل این زیر مسئله به حل دیگر مسائل بستگی ندارد.
هنگامی که هر زیر مسئله را حل کردید ، نقاط را به هم متصل کنید.
اتصال همه “راه حل های فرعی” شما به شما راه حل مشکل اصلی را می دهد. تبریک می گویم!
این تکنیک سنگ بنای حل مسئله است. آن را به خاطر بسپارید (اگر لازم است این مرحله را دوباره بخوانید).
“اگر من می توانستم به هر برنامه نویس آغازین مهارت حل مسئله را بیاموزم ، آن” روش تقسم مسئله “است.
به عنوان مثال ، فرض کنید شما یک برنامه نویس جدید هستید و از شما خواسته می شود برنامه ای بنویسید که ده عدد را بخواند و مشخص کند که کدام عدد سومین عدد بزرگ است. برای یک برنامه نویس کاملاً جدید ، این یک وظیفه دشوار است ، حتی اگر فقط به syntax پایه برنامه نویسی نیاز داشته باشد.
اگر گیر کرده اید ، باید مشکل را به چیزی ساده تر کاهش دهید. به جای سومین عدد بزرگ، پیدا کردن بزرگ ترین عدد در کل چگونه است؟ هنوز خیلی سخت است؟ در مورد یافتن بزرگترین از سه عدد چطور؟ یا بزرگتر از دو؟ مسئله را تا جایی کاهش دهید که بدانید چگونه می توانید آن را حل کنید و راه حل را بنویسید. سپس مسئله را اندکی گسترش دهید و راه حل را مطابق با آن دوباره بنویسید و ادامه دهید تا زمانی که به محل شروع بازگردید.
4. گیر کرده اید؟
در حال حاضر ، شما احتمالاً آنجا نشسته اید و فکر می کنید “خیلی جالب است ، اما اگر گیر بیفتم و حتی نتوانم یک مسئله فرعی را حل کنم چه؟”
اول از همه ، یک نفس عمیق بکشید. دوم، نگران نباش دوست من این برای همه اتفاق می افتد!
تفاوت در این است که بهترین برنامه نویسان / مشکل گشایان بیشتر از اینکه تحریک شوند ، در مورد اشکالات / خطاها کنجکاو هستند.
در واقع ، در اینجا سه چیز وجود دارد که باید هنگام مواجهه با یک مسئلهل وحشتناک امتحان کنید:
- اشکال زدایی: گام به گام راه حل خود را دنبال کنید و سعی کنید بفهمید که کجا اشتباه کرده اید. برنامه نویسان این اشکال زدایی را Debugging می نامند. (در واقع این همه کار اشکال زدایی است).
“هنر اشکال زدایی این است که بفهمید چه چیزی را واقعاً به برنامه خود گفته اید بجای کاری که فکر می کردید به آن گفتید انجام دهد.”
اندرو سینگر
- ارزیابی مجدد: یک قدم عقب بروید. از منظر دیگری به مسئله نگاه کنید. آیا چیزی وجود دارد که بتواند در یک رویکرد کلی تر تغییر کند؟
“بعضی اوقات در جزئیات مسئله چنان گم می شویم که اصول کلی را که می تواند مسئله را در سطح کلی تری حل کند ، نادیده می گیریم. البته مثال کلاسیک این جمع بندی یک لیست طولانی از اعداد صحیح متوالی است ، 1 + 2 + 3 +… + n ، که گاوس بسیار جوان به سرعت تشخیص داد که به سادگی n (n + 1) / 2 است ، بنابراین از تلاش اضافی اجتناب می شود. “
C. Jordan Ball
روش دیگر ارزیابی مجدد ، شروع از نو است. همه چیز را پاک کنید و دوباره با چشمان تازه شروع کنید. جدی هستم.شما از تأثیرگذاری این روش گیج خواهید شد.
- تحقیق: گوگل خوب است. درست خواندید مهم نیست که چه مشکلی دارید ، کسی احتمالاً آن را حل کرده است. آن شخص / راه حل را پیدا کنید. در واقع ، حتی اگر مشکل را برطرف کردید این کار را انجام دهید! (می توانید از راه حل های دیگران چیزهای زیادی یاد بگیرید).
به دنبال راه حل برای مشکل بزرگ نباشید. فقط به دنبال راه حل برای مشکلات فرعی باشید. چرا؟ زیرا تا زمانی که مبارزه نکنید (حتی کمی) ، چیزی یاد نخواهید گرفت. اگر چیزی یاد نگیرید ، وقت خود را تلف کردید.
تمرین
انتظار نداشته باشید که فقط بعد از یک هفته عالی باشید. اگر می خواهید یک مشکل ساز خوب باشید ، بسیاری از مشکلات را حل کنید!
تمرین. تمرین. تمرین. فقط زمان لازم است تا تشخیص دهید که “این مشکل با … به راحتی حل می شود.”
چگونه تمرین کنیم؟ پازل شطرنج ، مشکلات ریاضی ، سودوکو ، برو ، انحصار ، بازی های ویدیویی ، رمزنگاری ها و غیره.
در حقیقت ، الگوی رایج در میان افراد موفق عادت آنها به “حل مسئله خرد” است. به عنوان مثال ، پیتر تیل شطرنج بازی می کند ، و الون ماسک بازی های ویدیویی را انجام می دهد.
” اگر می خواهید ببینید رهبری تجاری در سه تا پنج سال چگونه است ، به آنچه در بازی های آنلاین اتفاق می افتد نگاه کنید. “
بایرون ریوز
آیا این بدان معنی است که شما فقط باید بازی های ویدیویی را انجام دهید؟ اصلا.
اما همه چیز در مورد بازی های ویدیویی چیست؟ درست است ، حل مسئله!
بنابراین ، آنچه شما باید انجام دهید این است که یک محل فروش برای تمرین پیدا کنید. چیزی که به شما امکان می دهد بسیاری از مشکلات خرد را حل کنید (در حالت ایده آل ، چیزی که از آن لذت می برید).
به عنوان مثال ، من از چالش های برنامه نویسی لذت می برم. هر روز ، سعی می کنم حداقل یک چالش (معمولاً در Coderbyte ) را حل کنم .
همانطور که گفتم ، همه مشکلات دارای الگوهای مشابه هستند.
نتیجه
اکنون ، شما بهتر می دانید “فکر کردن مثل یک برنامه نویس” به چه معناست.
شما همچنین می دانید که حل مسئله یک مهارت باورنکردنی برای پرورش (فرا مهارت) است.
توجه کنید که چگونه می دانید برای تمرین مهارتهای حل مسئله خود نیز باید چه کار کنید!
در آخر ، آرزو می کنم که با مشکلات زیادی روبرو شوید.
درست خواندید حداقل اکنون می دانید که چگونه آنها را حل کنید! (همچنین ، خواهید آموخت که با هر راه حلی ، پیشرفت خواهید کرد).
“درست زمانی که فکر می کنید با موفقیت از یک مانع عبور کرده اید ، مانعی دیگر ظاهر می شود. اما این چیزی است که زندگی را جالب نگه می دارد. زندگی فرایند عبور از این موانع است – یک سری خطوط مستحکم که باید از آنها عبور کنیم. هر بار ، شما چیزی یاد می گیرید. هر بار ، قدرت ، خرد و دیدگاه بالایی پیدا خواهید کرد. هر بار ، کمی بیشتر رقابت از بین می رود. تا وقتی که فقط شما بمانید: بهترین نسخه از شما. “
Ryan Holiday (The Obstacle is the Way)
منبع: How to think like a programmer — lessons in problem solving