چگونه مثل یک برنامه‌نویس فکر کنیم – درس‌هایی از حل مسئله

ترجمه و تالیف : شروین فضلی
تاریخ انتشار : 20 فروردین 99
خواندن در 6 دقیقه
دسته بندی ها : برنامه نویسی

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

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

اگر شما به برنامه‌نویسی علاقه‌ داشته باشید، ممکن است قبلاً این جمله را خوانده باشید: 

"همه باید برنامه‌نویسی را یاد بگیرند، زیرا به شما شیوه فکر کردن را می‌آموزد." - استیو جابز

احتمالاً شما هم این سوال را پرسیدید که منظوراز"دقیقا مثل یک برنامه‌نویس فکر کنید" چیست؟ و شما چگونه آن‌را انجام می‌دهید؟؟

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

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

چرا این مسئله مهم است؟

حل مسئله فرا مهارت است. 

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

مگر اینکه سیستمی داشته باشید. اینگونه می‌توانید مسائل را "حل کنید" (همان کاری که من هنگام شروع کد‌نویسی انجام دادم):

  1. راه‌حلی را امتحان کنید.
  2. اگر این جواب نمی‌دهد، یک مورد دیگر را امتحان کنید.
  3. اگر آن هم جواب نمی‌دهد، مرحله 2 را تکرار کنید تا اینکه موفق شوید.

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

بهترین راه شامل: الف) داشتن فریمورک و ب) تمرین آن است.

"تقریباً همه کارفرمایان ابتدا مهارت‌های حل مسئله را در اولویت قرار می‌دهند.مهارت حل مسئله تقریباً به اتفاق آراء مهم‌ترین صلاحیتی است که کارفرمایان به دنبال آن هستند . بیش‌تر از مهارت‌های زبان برنامه‌نویسی، مشکل‌یابی و طراحی سیستم.

نشان دادن تفکر محاسباتی یا توانایی تجزیه مشکلات پیچیده به همان اندازه ارزشمند است که مهارت های فنی پایه مورد نیاز برای یک شغل است-Hacker Rank”

فریمورک ( چارچوب داشته باشید )

برای پیدا کردن یک فریمورک یا چارچوب مناسب، من از توصیه‌های کتاب آموزشی "سرآشپز 4 ساعته" Tim Ferriss پیروی کردم.

این باعث شد که من با دو نفر مصاحبه کنم: C. Jordan Ball (رتبه 1 یا 2 با بیش از 65000 کاربر در Coderbyte) و V. Anton Spraul (نویسنده کتاب "مثل یک برنامه‌نویس فکر کنید: مقدمه‌ای برای حل مسئله خلاق").

من همان سؤالات را از آن‌ها پرسیدم، و حدس بزنید پاسخ آن‌ها چه بود؟ پاسخ آنها تقریباً مشابه بود!

به زودی، شما نیز آن‌ها را خواهید شناخت.

یادداشت: این بدان معنا نیست که آن‌ها همه کار را به همان روش انجام دادند. همه متفاوت هستند. شما متفاوت خواهید بود اما اگر با اصولی شروع كنید كه همه ما موافقیم خوب است، خیلی سریع‌تر پیشرفت خواهید كرد.

"بزرگترین اشتباهی که من از برنامه‌نویسان جدید می‌بینم این است که به جای یادگیری چگونگی حل مسائل، روی یادگیری سینتکس (قواعد نوشتاری) تمرکز می‌کنند. " —   V. Anton Spraul

بنابراین، هنگام مواجه شدن با مسئله جدید، چه کاری باید انجام دهید؟

مراحل در زیر ذکر شده است:

1. فهمیدن

دقیقاً بدانید چه چیزی از شما خواسته می‌شود، بیش‌تر مسائل سخت است زیرا شما آن‌ها را نمی‌فهمید (از این رو این اولین قدم است)

سوال:چگونه بدانیم مسئله‌ای را فهمیدیم؟ جواب:زمانی‌که بتوانیم آن را به زبان ساده توضیح دهیم.

آیا به یاد دارید که روی یک مسئله گیر کردید؛و برای حل آن شروع کردید به فهمیدن و درک آن ولی باز هم خودتان را در شرایطی دیدید که قبلا نظیرش را ندیده بودید؟

بیش‌تر برنامه‌نویسان این احساس را می‌شناسند.

به همین دلیل است که باید مشکل (مسئله) خود را بنویسید، یک جدول (چارت) بکشید، یا در مورد آن به شخص دیگری بگویید.

“اگر نمی‌توانید چیزی را به زبان ساده توضیح دهید،پس آن را درک نکردید." - ریچارد فاینمن

2. برنامه‌ریزی

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

برای به دست آوردن یک برنامه خوب، به این سوال پاسخ دهید:

"با توجه به ورودی X ، چه مراحلی لازم است تا خروجی Y را به ما برگرداند؟"

یادداشت: برنامه‌نویسان ابزاری عالی برای کمک به خودشان در این زمینه دارند .نظرات!

3. تقسیم‌بندی

توجه کنید.این مهم‌ترین مرحله است.

سعی نکنید یک مسئله پیچیده را حل کنید. به گریه خواهید افتاد.

در‌عوض، آن را به مسائل کوچک تجزیه کنید. حل مسائل کوچک بسیار ساده‌تر است.

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

پس از آن، ساده‌ترین بدان معناست که حل این مسئله کوچک به حل مسائل بقیه بستگی ندارد.

پس از حل هر مسئله کوچک، نقاط را به هم وصل کنید.

اتصال همه "راه حل‌های کوچک" به شما راه‌حلی برای مشکل اصلی می‌دهد. تبریک می‌گویم!

این روش سنگ بنایی برای حل مسئله است. آن‌را بخاطر بسپار (اگر لازم است دوباره این مرحله را بخوان).

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

به عنوان مثال ، فرض کنید شما یک برنامه‌نویس تازه‌کار هستید و از شما خواسته شده است که برنامه‌ای بنویسید که ده عدد را بخواند و بفهمد سومین عدد بزرگ کدام است. برای یک برنامه‌نویس کاملاً تازه‌کار، این کار می‌تواند یک تکلیف سخت باشد، حتی اگر فقط به سینتکس(قاعده نوشتاری) ساده برنامه‌نویسی نیاز داشته باشد.

اگر گیر کردید، باید مسئله را به چیزی ساده‌تر تبدیل کنید. به جای پیدا کردن سومین عدد برتر، بزرگترین عدد کل را پیدا کنید، این چطور؟ هنوز هم خیلی سخت است؟ نظرتان در‌مورد یافتن سه عدد بزرگ (سه عدد برتر از بین ده عدد) چیست؟ یا بزرگتر از دو؟

مسئله را تا جایی کوچک کنید که حل کردن آن را بلد باشید و راه‌حل را بنویسید. سپس مسئله را کمی گسترش داده و راه‌حل متناسب با آن‌را بازنویسی کنید و تا زمانی که به نقطه شروع اولتان برسید آن را ادامه دهید." - V. Anton Spraul

4. گیر افتاده‌اید؟

همین الان، ممکن است شما با خود بگویید " این عالی است، اما اگر گیر کنم که حتی نتوانم یک مسئله کوچک را حل کنم، آن وقت چه می شود؟"

اول از همه، نفس عمیق بکشید. دوم، این منصفانه است.

نگران نباش رفیق، این برای همه اتفاق می‌افتد!

تفاوت این است که بهترین برنامه‌نویسان و تحلیل‌گران حل مسئله در مورد اشکالات و خطاها، بیش‌تر کنجکاو هستند تا اینکه عصبانی شوند.

  • مشکل‌یابی: قدم به قدم راه‌حل خود را طی کنید و سعی کنید اشتباه خود را پیدا کنید. برنامه‌نویسان این عمل را debugging (مشکل‌یابی) می‌نامند(در‌واقع ، این تمام کاری است که یک debugger انجام می‌دهد).
  • ارزیابی مجدد: یک قدم به عقب بردارید. از منظر دیگری به مسئله نگاه کنید. آیا چیزی وجود دارد که بتواند برای یک رویکرد کلی‌تر خلاصه شود؟

  "گاهی‌اوقات ما در جزئیات یک مسئله چنان گم می‌شویم که از اصول کلی غافل می‌شویم که می‌توانند مسئله را در یک سطح کلی‌تر حل کنند. 

مثال قدیمی در این مورد، جمع‌بندی لیست طولانی از اعداد صحیح متوالی ، 1 + 2 + 3 +… + n است که کارل فریدریش گاوس (ریاضیدان، ستاره‌شناس و فیزیک‌دان آلمانی) بسیار جوان که به سرعت راه حل را تشخیص داد، به سادگی n (n + 1) / 2 بود، بنابراین از تلاش برای انجام کار‌های اضافی خودداری کرد."—   C. Jordan Ball

یادداشت: روش دیگر ارزیابی مجدد، شروع دوباره است. همه چیز را پاک کنید و دوباره با چشمان تازه شروع کنید. من جدی هستم. از اینکه چقدر این کار مؤثر است متحیر خواهید شد.

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

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

تمرین

انتظار نداشته باشید بعد از گذشت یک هفته عالی باشید. اگر می‌خواهید یک مشکل‌گشای (تحلیلگر مسئله) خوب شوید، پس مسائل زیادی را حل کنید!

چگونه تمرین کنیم؟ گزینه‌های خارج از wazoo وجود دارد!

معما‌های شطرنج، مسئله‌های ریاضی، سودوکو، Go، مونوپولی ، بازی‌های ویدئویی و... .

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

ایلان [ماسک] ، رید [هافمن] ، مارک زاکربرگ و بسیاری دیگر می گویند که بازی‌ها اساس موفقیت آن‌ها در ساخت شرکت‌هایشان بود. ”- مری میکر (گزارش ترندهای اینترنت 2017)

آیا این بدان معنی است که شما فقط باید بازی‌های ویدئویی انجام دهید؟ نه اصلا.

اما بازی‌های ویدئویی چه کاربردی دارند؟ درست است، حل مسئله!

بنابراین، کاری که شما باید انجام دهید این است که یک محل برای تمرین پیدا کنید. چیزی که به شما امکان می‌دهد بسیاری از مسائل کوچک را حل کنید (در حالت ایده آل، چیزی که از آن لذت می‌برید).

به عنوان مثال، من از چالش‌های کدنویسی لذت می‌برم. هر روز، من سعی می‌کنم حداقل یک چالش را حل کنم (معمولاً در Coderbyte).

همانطور که گفتم، همه مسائل الگو‌های مشابه‌ای دارند.

نتیجه‌گیری

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

اکنون، شما بهتر می‌دانید که "فکر کردن مثل یک برنامه‌نویس" به چه معنی است.

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

اگراین مطلب برایتان کافی نبود، دقت کنید چه کارهای دیگری می‌توانید برای تمرین مهارت‌های حل مسئله خود انجام دهید !

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

شما درست خواندید. حداقل حالا، شما می‌دانید که چگونه آن‌ها را حل کنید! (همچنین، شما یاد خواهید گرفت که با هر راه‌حل، پیشرفت می‌کنید).

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

زندگی فرایندی است برای از بین بردن این موانع - مجموعه ای از خطوط مستحکم که باید از طریق آن، از بین ببریم.

هر بار، شما چیزی یاد می گیرید.

هر بار، شما قدرت خرد و روشن‌بینی را توسعه می دهید.

هر بار، کمی بیش‌تر از رقابت اتفاق می‌افتد. تا تمام آنچه که می‌ماند،خود شما هستید: بهترین ورژن خودتان. "- Ryan Holiday (مانع، یک مسیر است)

اکنون ، بروید برخی از مشکلات را حل کنید!

لطفا نظرات خود را با ما در میان بگذارید!

منبع