برگردان فارسی: علی اکبر متواضع
اگر به برنامهنویسی علاقه دارید، حتماً این جمله را شنیدهاید:
“در این کشور، همه باید یادبگیرند که چه طور برای یک کامپیوتر برنامهنویسی کنند زیرا این کار، فکر کردن را به ما میآموزد.” استیو جابز
مفهوم عجیبی در این جمله نهفته است. فکر کردن مثل یک برنامهنویس؟ اما چه طور؟
کل این عبارت، اساساً روشی مؤثرتر برای حل مسأله را مورد تأکید قرار میدهد.
در این مطلب سعی داریم این روش را به خوانندگان خود آموزش دهیم.
در پایان، مراحل دقیقی را که اجرای آنها برای بهتر شدن عملکرد ما در حل مسائل، ضروریست، ذکر خواهیم کرد.
اما قبل از آن به چرایی اهمیت موضوع میپردازیم.
مهارت در حل مسأله، به خودی خود یک مسأله است.
همه ما مشکلاتی داریم. بزرگ و کوچک. همه ما به صورت کاملاً تصادفی، گهگاه با مشکلاتی مواجه میشویم.
اما اگر بدون سیستم عمل کنیم، روش ما در حل مسائل از این الگوریتم پیروی میکند: (این همان کاریست که من در زمان شروع کدنویسی انجام میدادم):
ببینید، درست است که گاهی اوقات این روش به موفقیت منجر میشود، ولی بدترین روش حل مسأله است! و خروار خروار زمان ارزشمند ما را هدر میدهد.
اما بهترین روش حل مسأله، به دو چیز نیاز دارد: الف) داشتن یک چارچوب و ب) تمرین و تکرار آن چارچوب.
“تقریباً تمام کارفرمایان، مهارتهای حل مسأله را اولویت اول خود برای استخدام لحاظ میکنند. همه کارفرمایان، تقریباً به اتفاق آراء مهمترین مهارتی را که به دنبال آن هستند، مهارت حل مسأله است. آنها اولویت این مهارت را حتی بالاتر از تخصص در زبانهای برنامهنویسی، عیبیابی (Debugging) و طراحی سیستم، عنوان کردهاند.
“اهمیت تفکر کامپیوتری یا توانایی تفکیک مشکلات بزرگ پیچیده، اگر از دیگر مهارتهای موردنیاز برای انجام یک شغل، بیشتر نباشد، کمتر نیست.” (Hacker Rank – گزارش مهارتهای توسعه 2018)
من برای یافتن چارچوب درست، توصیه تیم فریس در کتاب “چهارساعت” را دنبال کردم.
توصیه این کتاب باعث شد با دو فرد واقعاً اثرگذار مصاحبه کنم: C. Jordan Ball (رتبه اول یا دوم بیش از 65000 کاربر وبسایت Coderbute) و V. Anton Spraul (نویسنده کتاب “مثل یک برنامهنویس فکر کن: مقدمهای بر خلاقیت در حل مسأله”).
از آنها سؤالات یکسانی را پرسیدم و با کمال تعجب، پاسخهای یکسانی دریافت کردم!
به زودی، شما نیز این پاسخها را خواهید دانست.
حاشیهنویسی: این به این معنا نیست که آن دو نفر، همه کارهایشان را عیناً مثل هم انجام میدادند. روش آنها متفاوت بود. روش شما نیز متفاوت خواهد بود. اما اگر کار خود را با اصولی شروع کنید که درستی آنها را همه ما قبول داریم، موفقیتهای بسیار بیشتری کسب میکنید و بسیار سریعتر به موفقیت میرسید.V. Anton Spraul میگوید: “بنابر مشاهدات من، بزرگترین اشتباهی که برنامهنویسان جدید انجام میدهند، تمرکز روی یادگیری سینتکس به جای یادگیری نحوه حل مسائل است.”
لذا وقتی با یک مشکل جدید مواجه میشوید، چه کار باید بکنید؟
در ادامه، مراحل کار را ذکر میکنیم:
دقیقاً بدانید که با چه سؤالی روبهرو هستید. بیشتر مشکلات سخت، از این جهت مشکل هستند که شما آنها را درک نمیکنید (لذا، اولین گام این است که مسأله را درک کنید).
چه طور بفهمیم، یک مسأله را درک کردهایم یا خیر؟ وقتی بتوانیم به زبان سلیس مادری مسأله را توضیح دهیم، یعنی آن را درک کردهایم.
شاید این تجربه برای شما هم پیش آمده باشد که هنگام سر و کله زدن با یک مسأله، وقتی شروع میکنید به توضیح آن، بلافاصله حفرههایی در استدلال خود میبینید که قبلاً از دیدن آنها ناتوان بودید.
بیشتر برنامهنویسان این احساس را میشناسند.
به همین دلیل، لازم است مسأله خود را روی کاغذ بیاورید، شکل آن را بکشید یا در مورد آن با کسی صحبت کنید (بعضیها از یک اردک پلاستیکی استفاده میکنند).
“اگر نتوانید چیزی را با جملات ساده توضیح دهید، یعنی آن را درک نکردهاید.”
ریچارد فاینمن
نباید بدون هیچ طرح و برنامهای مستقیم داخل مسأله خود شیرجه بزنید (و امیدوار باشید که بتوانید راهتان را در آن میان پیدا کنید). راه حل خود را برنامهریزی کنید.
اگر نتوانید مراحل دقیق را بنویسید، هیچچیز قادر به کمک به شما نیست.
در برنامهنویسی، این یعنی فوراً شروع به هک کردن نکنید. به ذهن خود زمان بدهید تا اطلاعات را بردازش و مسأله را تجزیه و تحلیل کند.
برای رسیدن به یک برنامهریزی خوب، به این سؤال پاسخ دهید:
“اگر ورودی X را داشته باشیم، گامهای مورد نیاز برای تولید خروجی Y کدام است؟”
حاشیهنویسی: برنامهنویسها برای این کار، ابزاری عالی در اختیار دارند: کامنت
دقت کنید. این گام، مهمترین گام در جهت حل مسأله است.
سعی نکنید یک مسأبه بزرگ را در یک مرحله حل کنید. این کار اشک شما را درمیآورد.
به جای این کار، آن را به زیرمسألههای کوچکتری تفکیک کنید. حل این زیرمسألهها بسیار سادهتر است.
زیرمسألهها را یکی یکی حل کنید. با سادهترین آنها شروع کنید. مسأله سادهتر، مسألهایست که جواب آن را میدانید (یا به جواب آن نزدیک هستید).
علاوه بر این، مسأله ساده، مسألهایست که حل آن به حل مسائل دیگر بستگی ندارد.
بعد از این که تمام زیرمسائل خود را حل کردید، نقاط را به یکدیگر وصل کنید.
اتصال تمام “زیرراهحلها” به یکدیگر، راهحل مسأله اصلی را در اختیار شما قرار خواهد داد. تبریک میگم!
این تکنیک، زیربنای حل مسأله است. آن را به یاد داشته باشید (اگر لازم است این قسمت را دوباره بخوانید).
آنتون اسپراول میگوید: “اگر میتوانستم به تمام برنامهنویسان تازهکار، یک تکنیک را در حل مسأله بیاموزم، تکنیک کوچککردن مسأله را میآموختم.
به عنوان مثال، فرض کنید یک برنامهنویس تازهکار هستید و از شما خواسته شده برنامهای بنویسید که ده عدد را بخواند و سومین عدد بزرگ را از میان آنها پیدا کند. این تمرین با این که فقط به سینتکسهای پایه برنامهنویسی نیاز دارد، اما برای یک برنامهنویس صفرکیلومتر، میتواند تمرین بسیار سنگینی باشد.
اگر در حل چنین مسألهای گیر کردید، باید مسأله را به اجزای سادهتر تفکیک کنید. چهطور است به جای سومین عدد بزرگ، بزرگترین عدد را پیدا کنیم؟ هنوز زیادی مشکل است؟ میتوانیم تعداد ارقام را به 3 کاهش دهیم و بزرگترین عدد را بیابیم. یا حتی عدد بزرگتر را بین 2 عدد پیدا کنیم.
مشکل را تا جایی ساده کنید که بتوانید آن را حل کنید. بعد مسأله را کم کم توسعه دهید و راه حل را بازنویسی کنید. این کار را آنقدر ادامه دهید تا به نقطه شروع خود برسید.”
تا اینجا احتمالاً با خود فکر میکنید “چیزی که میگی کلاً خیلی جالبه ولی اگه من کاملاً گیر کرده باشم و حتی نتونم یه زیرمسأله رو حل کنم چی؟”
اول، یک نفس عمیق بکش.
نگران نباش دوست من. همه با چنین شرایطی مواجه میشوند.
با این فرق که بهترین برنامهنویسها/ حلکنندگان مسأله بیش از آن که از دست باگها/خطاها عصبانی شوند، نسبت به آنها کنجکاوند.
در واقع، وقتی با چنین چالههای وحشتناکی مواجه میشوید، سه کار هست که باید انجام دهید:
• دیباگ: مراحل گام به گام راه حل خود را دنبال کنید و به دنبال نقطهای بگردید که از آنجا مسیر خود را اشتباه رفتهاید. برنامهنویسها به این کار دیباگینگ میگویند (در واقع، کل کاری که یک دیباگر انجام میدهد، همین است).
اندرو سینگر میگوید : “هنر دیباگینگ، یعنی بین چیزهایی که به کامپیوتر خود گفتهاید که انجام دهد و چیزهایی که باید به کامپیوتر خود میگفتید که انجام دهد، تفاوت را پیدا کنید.”
• ارزیابی مجدد: یک گام به عقب برگردید و از نقطه دید متفاوتی به مسأله نگاه کنید. شاید چیزی بیابید که بتوان آن را به روش عمومیتری خلاصه کرد.
جوردن بال میگوید: “گاهی به قدری در جزئیات یک مسأله گم میشویم که از اصلی معمولی که میتواند در سطح عمومیتری مسأله را حل کند، غافل میشویم. ]…[
در این زمینه، مثالی کلاسیک وجود دارد: مجموع یک لیست طولانی از ارقام 1+2+3+…+n با فرمول n(n+1)/2 محاسبه میشود. اگر این فرمول را فراموش کنیم، مجبوریم تمام ارقام را با هم جمع کنیم.”حاشیهنویسی: روش دیگر ارزیابی مجدد، از ابتدا شروع کردن است. همهچیز را پاک کنید و با نگاهی نو از ابتدا شروع کنید. باورتان نمیشود این کار چهقدر میتواند مفید و مؤثر باشد.
• تحقیق: آه گوگل من! مهم نیست با چه مسألهای رو به رو هستید، احتمالاً کسی قبلاً آن را حل کرده و کافیست او یا راه حلش را پیدا کنید. در واقع، حتی اگر مسأله خود را حل کردهاید، او را هم پیدا کنید (میتوانید از راهحلهای دیگران چیزهای زیادی بیاموزید).
هشدار: برای یک مسأله بزرگ به دنبال راه حلهای دیگران نروید. این کار را فقط در مورد زیرمسائل خود انجام دهید. میپرسید چرا؟ چون اگر با مشکل مواجه نشوید، هیچ چیز نخواهید آموخت. اگر چیزی نیاموزید، وقت خود را تلف کردهاید.
انتظار نداشته باشید تنها پس از یک هفته کارتان عالی شود. اگر میخواهید در حل مسائل تبحر پیدا کنید، باید مسائل زیادی را حل کنید.
تمرین کنید. تمرین کنید. تمرین کنید. برای این که بفهمید “این مسأله به راحتی و با یک تگ <insert concept here> قابل حل است”، تنها به گذشت زمان نیاز دارید.
چه طور تمرین کنیم؟ برای تمرین، چند گزینه پیش رویتان است:
پازلهای شطرنج، مسائل ریاضی، سودوکو، Go، مونوپولی، بازیهای ویدیویی و… و… و…
در واقع، الگوی مشترک بین تمام افراد موفق، عادت آنها به تمرین “حل ریزمشکلات” است. به عنوان مثال، پیتر تایاینل شطرنج بازی میکند و ایلان ماسک، به بازیهای ویدیویی علاقه دارد.
برایان ریوز میگفت “اگر میخواهید بدانید رهبری کسب و کار در سه تا پنج سال آینده چگونه خواهد بود، کافیست نگاهی به اتفاقات بازیهای آنلاین بیاندازید.”
حال فیلم را تند میکنیم و به زمان حال میآییم. ایلان ماسک، رِید هافمن، مارک زوکربرگ و بسیاری دیگر میگویند که “مبنای موفقیت آنها در ساخت کمپانیهایشان، بازیهای آنلاین بوده است.” (Internet Trends Report سال 2017)
آیا این به آن معناست که بازیهای ویدیویی به تنهایی کافیست؟ مطمئناً خیر.
اما موضوع بازیهای ویدیویی چیست؟ درست است. حل مسأله.
بنابراین، کاری که باید بکنید این است که روش تمرین خود را انتخاب کنید. چیزی که امکان حل ریزمسائل متعددی را به شما بدهد (چه بهتر که از این کار لذت هم ببرید).
به عنوان مثال، من از چالشهای کدنویسی لذت میبرم. هر روز سعی میکنم حداقل یک چالش را حل کنم (معمولاً با Coderbyte این کار را انجام میدهم).
همانطور که گفتیم، تمام مشکلات از الگوی مشابهی پیروی میکنند.
چه کسانی می توانند در شغل برنامه نویسی مشغول به کار شوند؟
شروع آموزش برنامه نویسی – روش های آموزش برنامه نویسی
از همه شما ممنونم!
حال معنی جمله “مثل یک برنامهنویس فکر کن.” را بهتر درک میکنیم.
همچنین، میدانیم که حل مسأله، مهارتی افسانهای است که باید در کسب آن بکوشیم. مسألهای که به خودی خود یک مسأله دیگر است.
جالب بود اینطور نیست؟
در پایان، امیدوارم با مسائل زیادی مواجه شوید.
بله درست خواندید. حداقل، حالا میدانید که چه طور مسائل خود را حل کنید (بعدها خواهید دید که با حل هر مسأله، عملکرد شما نیز در این زمینه بهبود پیدا میکند).
رایان هالیدی در کتاب مانع همان مسیر است میگوید: “درست وقتی که فکر میکنید مانعی را با موفقیت پشت سر گذاشتهاید، مانع دیگر ظاهر میشود. اما این همان چیزیست که زندگی را جذاب میکند.
زندگی، فرایند عبور از میان این موانع است. مجموعهای از خطوط سخت که باید راهمان را از میانشان پیدا کنیم.هر بار، چیز جدیدی یاد میگیرید.هر بار، نیرو، بصیرت و جهانبینی شما تقویت میشود.هر بار، بخشی دیگر از رقابتی که در آن هستید، پشت سر گذاشته منیشود. تا این که فقط شما باقی میمانید: بهترین نسخه از شما.”
حال، بروید و چند مشکل را حل کنید!
موفق باشید…