در این پست، قصد داریم ببینیم که همچون یک دولوپر فکر کردن به چه معنا است. همچنین در پایان، خواهیم دانست که چه گامهایی برای حل مسائل، بیشتر مثمرثمر واقع خواهند شد.
اگر به برنامهنویسی علاقهمند هستید، احتمالاً این نقلقول از استیو جابز را قبلاً دیده یا شنیده باشید:
همۀ افراد بایستی یاد بگیرن که یه برنامۀ کامپیوتری بنویسن، چرا که برنامهنویسی به اونها یاد میده که چهطور فکر کنن!
ممکن است این سؤال برای شما پیش بیاید که مانند یک دولوپر فکر کردن دقیقاً به چه معنا است؟ در پاسخ به این سؤال باید گفت که مانند یک دولوپر فکر کردن به معنی پیدا کردن یک سولوشن (راهحل) مؤثر برای حل مسائل است. همۀ افراد در زندگی با مشکلاتی بزرگ و کوچک مواجه میشوند و نحوۀ برخورد با این مسائل بسیار حائز اهمیت است. در همین راستا، توانایی حل مسئله یک مهارت کلیدی برای تمامی افراد محسوب میشود.
احتمالاً اکثر افراد به استثنای افرادی که یک سیستم مشخص برای حل مسائل خود دارند، به شیوهای که در ادامه عنوان کردهایم، به حل مسائل میپردازند (همانگونه که اکثر دولوپرها در هنگام شروع برنامهنویسی این شیوه را در پیش میگیرند):
- یک سولوشن را امتحان میکنند.
- اگر این راهحل جواب نداد، یک سولوشن دیگر را امتحان میکنند.
- اگر این سولوشن نیز کار نکرد، مرحلۀ دوم را تا زمانی که موفق شوند، تکرار میکنند!
لازم به ذکر است که این دست افراد گاهیاوقات نیز موفق به حل آن مسئله میشوند اما بایستی گفت که این بدترین شیوه برای حل مسائل است؛ چرا که به شدت موجب اتلاف وقت ایشان خواهد شد. بنابراین بهترین راه برای حل مسائل، داشتن یک چارچوب فکری و عمل کردن بر اساس آن در موقعیتهای مختلف است.
طبق یک نظرسنجی از دولوپرهای سراسر دنیا که در سال 2018 تحت عنوان Developer Skills Report و از سوی HackerRank منتشر شد، این کمپانی اعلام کرد که تقریباً تمام کارفرمایان ابتدا مهارتهای حل مسئلۀ دولوپرها را در استخدام آنها در اولویت قرار میدهند. از نظر اکثر کارفرمایان، مهارت حل مسئله مهمترین قابلیتی است که در استخدام یک فرد، به دنبال آن هستند. این مهارت حتی از مهارتهای زبان برنامهنویسی، دیباگ کردن و طراحی سیستم نیز مهمتر است (برای آشنایی بیشتر با جزئیات این نظرسنجی میتوانید به مقالهٔ HackerRank: گزارش نظرسنجی از دولوپرهای سراسر دنیا در سال ۲۰۱۸ مراجعه نمایید).
همچنین کارفرمایان عنوان کردند که داشتن تفکر محاسباتی یا توانایی شکستن مسائل بزرگ و پیچیده به مسائل کوچکتر، به اندازۀ مهارتهای اولیۀ فنی مورد نیاز برای کار (و گاهیاوقات هم حتی بیشتر)، ارزشمند است. باتوجه به اهمیت این موضوع، در ادامه مهمترین کارهایی که برای حل مسائل باید انجام دهید را تشریح خواهیم کرد.
یک چارچوب فکری داشته باشید
در راستای پیدا کردن چارچوب درست، در کتاب The 4-Hour Chef به نویسندگی Tim Ferriss، توصیههایی مطرح شده است. مطالعۀ این کتاب شما را به سمت دو نفر از افراد مشهور به نامهای C. Jordan Ball (نفر برتر در Coderbyte از میان 65000 کاربر این سایت) و V. Anton Spraul (نویسندۀ کتاب Think Like a Programmer: An Introduction to Creative Problem Solving) سوق خواهد داد که هر دو این افراد در مصاحبهای، به یک نکتۀ مشابه اشاره داشتهاند. V. Anton Spraul میگوید:
بزرگترین اشتباهی که دولوپرهای تازهکار مرتکب میشن اینه که بیشتر تمرکز خودشون رو بر نحوۀ یادگیری سینتکس یک زبان میگذارن تا یادگیری نحوۀ حل مسائل.
لازم به ذکر است که این بدان معنا نیست که این دو همۀ کارها را همانند هم انجام میدهند؛ بلکه همۀ افراد از همدیگر متفاوتاند و شما نیز متفاوت خواهید بود، اما اگر طبق اصولی که اکثر افراد در مورد خوب بودن آنها اتفاق نظر دارند عمل کنیم، مسلماً به نتایج مشابهی نیز خواهیم رسید. در پاسخ به این سؤال که هنگام مواجهه با یک مشکل جدید، چه باید کرد؟، در ادامه چهار مرحله را تشریح خواهیم کرد:
1. مسئله را درک کنید
دقیقاً بدانید چه چیزی از شما خواسته شده است، چرا که سختترین مسائل به این دلیل سخت هستند که آنها را درک نمیکنید. از این روی، اولین گام برای حل یک مسئله، درک آن است. Richard Feynman دربارۀ درک مسائل میگوید:
در واقع زمانی میشه گفت یک مسئله رو درک کردید که بتونید اون رو به زبان ساده توضیح بدید.
آیا زمانهایی بوده که در یک حل یک مسئله گیر افتاده و پس از آنکه شروع به توضیح آن میکنید، فوراً متوجه روزنۀ امیدی برای حل آن مسئله شوید و این در حالی است که قبلاً متوجه آن راهحلها نشدهاید؟ اکثر دولوپرها نیز همین این احساس را دارند. به همین دلیل شما باید مشکل خود را بنویسید، یک نمودار دیاگرام برای آن رسم کنید یا مسئلۀ خود را برای دیگران توضیح دهید.
2. برنامهریزی کنید
به هیچ وجه سعی نکنید تا بدون برنامهریزی یک مسئله را حل کنید. به عبارت دیگر، برای اجرای سولوشن خود، یک پلن تعریف کنید. اگر نتوانید مراحلی دقیق برای پلن خود بنویسید، انتظار نداشته باشید که کسی یا چیزی بتواند به شما کمک کند.
در برنامهنویسی، طراحی پلن بدین معنی است که یک دولوپر نباید فوراً شروع به کد زدن کند! به مغز خود زمان بدهید تا بتواند مسئله را تجزیهوتحلیل کرده و اطلاعات را پردازش کند؛ بنابراین برای رسیدن به یک پلن خوب، به سؤالاتی همچون «با توجه به ورودی X، مراحل لازم برای بازگشت خروجی Y چیست؟» باید پاسخ دهید (لازم به ذکر است که در این زمینه، برای کمک به دولوپرها ابزارهای خوبی موجود است).
3. مسئلۀ خود را به مسائل کوچکتر تقسیم کنید
این گام مهمترین مرحله برای حل یک مسئله است. سعی نکنید یک مشکل بزرگ را حل کنید چرا که شما را به گریه خواهد انداخت! در عوض، آن را به مسائل کوچکتر تقسیم کنید؛ حل مسائل کوچکتر، سادهتر است. سپس شروع به حل هر یک از زیرمسئلهها کنید و این کار را با سادهترین مسئله شروع کنید (منظور از سادهترین مسئله، مسئلهای است که شما جواب آن یا پاسخی نزدیک به آن را میدانید؛ همچنین، سادهترین مسئله میتواند مسئلهای باشد که حل آن به حل مسائل دیگر بستگی نداشته باشد).
در ادامه، پس از حل مسائل کوچکتر، پاسخها را به هم وصل کنید. اتصال تمام زیر راهحلها، راهحل مسئلۀ اصلی را به شما خواهد داد. این تکنیک زیربنای حل تمام مسائل است. V. Anton Spraul در باب شکستن مسئله به مسائل کوچکتر میگوید:
اگر بخوام به هر دولوپر تازهکاری یک مهارت حل مسئله رو آموزش بدم، تکنیک «شکستن مسئله» رو یاد خواهم داد.
به عنوان مثال، فرض کنید شما یک دولوپر تازهکار هستید و از شما خواسته شده است برنامهای بنویسید که ده عدد را خوانده و از میان آنها، سومین عدد بزرگ را مشخص کند. برای یک دولوپر تازهکار، نوشتن این برنامه ممکن است کمی سخت باشد، حتی اگر برای حل آن صرفاً به اصول پایهای برنامهنویسی نیاز باشد.
اگر در حل این مسئله با مشکل مواجه شدید، باید آن را به مسائل سادهتر بشکنید. مثلاً بهجای سومین عدد بزرگ، مسئله را به پیدا کردن بزرگترین عدد از میان کل اعداد تبدیل کنید؛ اگر هنوز هم حل این مسئله برای شما سخت است، آن را به پیدا کردن بزرگترین عدد از میان تنها سه و یا دو عدد تبدیل کنید. میتوانید مسئله را تا جایی بشکنید که مطمئن شوید توانایی حل آن را دارا هستید و پس از آن، راهحل را بنویسید. سپس کمی مسئله را بسط دهید و راهحل را بازنویسی کنید تا با مسئلۀ بزرگتر اصطلاحاً مَچ شود و این روش را ادامه دهید تا زمانی که بهجایی که شروع کردید، برگردید.
4. مواجهه با مشکل حتی پس از شکستن مسئله به مسائل کوچکتر
با وجود شکستن مسئله به مسائل کوچکتر، ممکن است هنوز هم در حل زیرمسائل ناتوان باشید. باید بگوییم که این حالت عادی است. ابتدا یک نفس عمیق بکشید و نگران نباشید زیرا این حالت ممکن است برای همه اتفاق بیفتد! اما وجه تمایز بهترین دولوپرها و افرادی که به حل مسائل میپردازند با یک فرد عادی این است که ایشان در مواجهه با ارورها یا مسائل بیشتر، برای حل آنها بیشتر کنجکاو میشوند تا عصبانی! در حقیقت، در اینجا سه کار وجود دارد که این افراد هنگام مواجه شدن با یک رویداد ناخوشایند، سعی میکنند تا آنها را انجام دهند که عبارتند از:
- دیباگینگ: سولوشن خود را گامبهگام بررسی کنید به این منظور که جایی که خطا رفتهاید را پیدا کنید. دولوپرها به این کار دیباگ کردن میگویند. Andrew Singer در مورد دیباگ کردن میگوید:
هنر دیباگ کردن در اینه که واقعاً بدونید چه چیزی رو از برنامه خودتون خواستید تا انجام بده، نه چیزی رو فکر میکنید از اون خواستید.
- ارزیابی مجدد: یک گام به عقب برگشته و با دید دیگری به مسئله نگاه کنید. بررسی کنید که آیا موردی هست که بشود آن را در یک رویکرد کلیتر خلاصه کرد؟ C. Jordan Ball دربارۀ ارزیابی مجدد مسئله میگوید:
گاهیاوقات ما چنان در جزئیات یک مسئله غرق میشیم که حتی یکسری اصول کلی که میتونه مسئله رو در سطح عمومیتر حل کنه نمیبینیم.
یک مثال کلاسیک در این مورد، جمع اعداد صحیح متوالی است که خیلی راحت میتوان یک فرمول کلی به صورت n (n + 1) / 2 برای آن تعریف کرد که به افراد کمک میکند تا بهسادگی، عملیات جمع اعداد را بیهیچ تلاش بیموردی انجام دهند. همچنین یک راه دیگر برای ارزیابی مجدد میتواند شروع مجدد برای حل آن مسئله باشد. همه چیز را پاک کنید و مجدد با یک دید جدید شروع کنید. در کمال تعجب خواهید فهمید که این کار چقدر مؤثر است.
- تحقیق کنید: همانطور که همه میدانیم، یک راه بسیار خوب برای تحقیق، جستجوی آن مسئله در گوگل است. مهم نیست که چه مشکلی دارید، این احتمال وجود دارد که کسی قبل از شما آن را حل کرده باشد. حتی اگر مشکل را حل کرده باشید، باز هم این کار مفید است چرا که از انجام راهحلهای سایر افراد میتوانید چیزهای زیادی را یاد بگیرید.
همچنین همواره به خاطر داشته باشید که به دنبال راهحل برای مسئلۀ بزرگتر نباشید؛ فقط به دنبال شکستن آن به مسائل کوچکتر باشید. مادامی که شما در مقابل مسئلۀ بزرگتر مقاومت میکنید (آن را به مسائل کوچکتر نمیشکنید)، چیزی را یاد نخواهید گرفت و اگر چیزی یاد نگیرید، زمان خود را هدر دادهاید.
تمرین کنید
پس از گذشت یک هفته نباید انتظار داشته باشید که یک دولوپر یا حلکنندۀ مسئله عالی باشید. اگر میخواهید یک فردی باشید که بهخوبی توانایی حل مسئله را دارا است، باید مشکلات زیادی را حل کنید! بنابراین باید بسیار تمرین کنید و فقط در این صورت است که میتوانید در مواجهه با یک مسئلۀ خاص، به راحتی بهترین سولوشن برای حل آن را بیابید.
حال سؤالی پیش میآید و آنهم اینکه چگونه تمرین کنیم؟ در پاسخ به این سؤال، گزینههای متعددی وجود دارد که یکی از آنها، گیم است. انجام بازیهایی همچون شطرنج، سودوکو، بازی مونوپولی، بازیهای کامپیوتری و غیره از جمله کارهایی هستند که میتوانید بهعنوان تمرین برای تقویت مهارتهای حل مسئلۀ خود، آنها را انجام دهید! در واقع، یک الگوی رایج در میان افراد موفق، عادت دادن خود به تمرین «حل مسائل کوچک» است (به عنوان مثال، یکی از علاقمندیهای ایلون ماسک، انجام بازیهای کامپیوتری بود). Byron Reeves در این باره میگوید:
اگه میخواهید ببینید که رهبری یک کسبوکار در سه تا پنج سال آینده ممکنه چهطور به نظر برسه، به آنچه که در بازیهای آنلاین اتفاق میافته نگاه کنید.
طبق گزارشی که توسط Mary Meeker در سال 2017 منتشر شد، بسیاری از افراد موفق در حوزۀ فناوری از جمله ایلون ماسک، رید هافمن، مارک زاکربرگ و غیره عنوان کردهاند که بازیها، اساس موفقیت آنها در ساختن شرکتهای ایشان بودهاند. لازم به ذکر است که این هرگز بدین معنی نیست که شما فقط باید بازیهای کامپیوتری انجام دهید، بلکه نکتۀ مهم دربارۀ بازیهای کامپیوتری بهکارگیری مهارتهای حل مسئله در آنها است!
بنابراین، آنچه شما باید انجام دهید، پیدا کردن یک سرنخ برای تمرین است. انجام تمرین این امکان را برای شما فراهم میکند تا بسیاری از مشکلات کوچکتر را حل کنید؛ حل مسائل کوچکتری که در نهایت به حل مسائل پیچیدهتر منجر شود، چیزی است که از انجام آن لذت خواهید برد.
به عنوان مثال، ممکن است شما دولوپری باشید که از حل چالشهای برنامهنویسی لذت میبرید. در این صورت سعی خواهید کرد تا روزانه حداقل یکبار چالشی را حل کنید. همچنین بایستی گفت که الگوهای مشابهی برای حل تمامی مسائل وجود دارد.
نتیجهگیری
از این پس، بهتر خواهید دانست که «فکر کردن به مانند یک دولوپر» به چه معنا است. همچنین میدانید که مهارت «حل مسئله» یک شیوۀ باورنکردنی برای پرورش مهارتهای دیگر است. حال اگر موارد مطرح شده در راستای تقویت مهارتهای حل مسئله برای شما کافی نبود، باید به دنبال انجام کاری باشید تا مهارتهای حل مسئله را بیشتر تمرین کنید!
با خواندن این مقاله، حداقل دریافتید که چگونه یک مسئله را حل کنید. همچنین، آموختید که هر بار یافتن راهحل برای یک مسئله، مهارت شما برای حل مسائل را بهبود میبخشد. در خاتمه هم این مقاله را با سخنی ارزشمند از Ryan Holiday به پایان میرسانیم:
زمانهایی هست که شما فکر میکنید یک مانع را در زندگی خود با موفقیت از سر راه برداشتهاید اما این در حالی است که یک مانع دیگر در سر راه شما قرار میگیرد؛ در چنین شرایطی بایستی بگویم که تنها در این صورت است که زندگی زیبا میشود. زندگی فرآیند شکستن این موانع است؛ یکسری از موانع محکم که ما باید از آنها با موفقیت عبور کنیم.
در هر بار مواجهه با مسائل زندگی چیزی یاد خواهیم گرفت؛ هر بار، قدرتمان بیشتر شده و عقلمان کاملتر میشود و دیدمان به مسائل زندگی وسعت مییابد؛ هر بار، کمی بیشتر در این رقابت پیشرفت میکنیم. در نهایت، تمام اینها یک «بهترین نسخه از ما» را خواهند ساخت.
حال نوبت به نظرات شما میرسد. دیدگاه شما در مورد گزارهٔ «چگونه همچون یک دولوپر فکر کنیم» چیست؟ نظرات، دیدگاهها و تجربیات خود را با دیگر کاربران سکان آکادمی به اشتراک بگذارید.