چطور مسیر یادگیری برنامه نویسی رو برای خودمون هموار کنیم؟

هر سالی که میگذره، کیفیت اپ های ایرانی که منتشر میشن پایین تر میاد و این دو تا معنی بیشتر نداره:۱. سرمایه گذار ها و ذی نفعان، هر سال دارن حریص تر از پارسال میشن (و میخوان زودتر منتشر کنن به امید اینکه زودتر به سود برسن) که وضعیت وخیم اقتصادیمون توجیحش میکنه.۲. برنامه نویس های کاربلد هر روز انگیزه بیشتری پیدا میکنن که (کار تو بازارِ) ایران رو ترک کنن و برای شرکت های خارجی کار کنن.هر چند که هر دو تفسیر، برای عموم ایرانی ها خوش آیند نیست، اما برای کسایی که میخوان برنامه‌نویسی رو شروع کنند و وارد بازار کار بشن میتونه خبر خوبی باشه. چون بازار اپ های ایرانی هنوز فاصله زیادی با پتانسیل بالقوه اش داره و سرمایه گذار های زیادی هستن که نیروی متخصص ندارند ولی میخوان اپ داشته باشند. این یعنی کاهش عرضه و افزایش تقاضای نیروی متخصص!اگه تا حالا به برنامه‌نویسی به عنوان شغل فکر کردید ولی هیچ وقت انگیزه کافی برای شروع نداشتید، قول میدم با خوندن این پست انگیزه بگیرید و جدی تر بهش فکر کنید!بک گراند این پستاخیرا با مسعود نامی همکار شدم که از قضا مثل من دوست داره بنویسه.امروز یه مقاله در مورد «یادگیری برنامه نویسی» ازش خوندم که لینکش رو پایین میذارم و بنظرم خوندنش خالی از لطف نیست.با خوندن مقاله اش به مسیری که خودم طی کردم فک کردم و اینکه چه چیزایی کمکم کرد با فضای ذهنیِ (mindset) دنیای برنامه نویسی آشنا بشم.اینه که گفتم اینجا یکم از مسیری که خودم طی کردم بگم، به این امید که تازه کار ها بتونن مسیر آسونتری رو برای یادگیری طی کنن. امیدوارم به دردشون بخوره.بک گراند خودمدرسته که تحصیلات آکادمیک من تو حوزه مرتبط (نرم افزار) بوده، اما به نظرم این کلاس های دانشگاه نبود که من رو تبدیل به یه برنامه نویس کرد. من قبل انصراف از تحصیل، طی ۶ سال فقط ۸۸ واحد پاس کردم و وقتی مهرماه سال هفتم به مسیر پر فراز و نشیب درس خوندنم فکر کردم، تصمیم گرفتم بیخیال ادامه ماجرا بشم و به مدرک «کاردانی نرم افزار دانشگاه امیرکبیر» قناعت کنم! ? البته لازم به ذکره که اون دوره تو یه شرکت خوب کار میکردم و این باعث میشد درست یا غلط، درس خوندن به نظرم کم اهمیت بیاد :)مقدمهطی مدت تحصیل و بعدش، کورس های ویدیوئی زیادی رو دیدم. و مقاله های زیادی رو خوندم. اما همونطور که مسعود تو مقاله اش اشاره کرده، اینا چیزایی نبودن که کمکم کنن با فضای حل مسائل برنامه نویسی آشنا بشم. چیزی که بیشترین تاثیر را روی من گذاشت تمرین بود! تمرین برنامه نویسیتمرین دقیقا یعنی چی؟منظورم از تمرین، حل مسائل الگوریتمیک پیچیده یا طراحی وبسایت (یا اپ) های ساده (یا سخت) با وردپرس و امثالهم نیست.مثلا «وزنه زدن» یه تمرین برای عضله سازیه. وقتی وزنه میزنیم، عضله های درگیر حین تمرین رو خسته میکنیم و احساس میکنیم دیگه انرژی لازم برای ادامه دادن رو نداریم. اما تو اوجِ همین خستگی هست که عضله ها شروع میکنن به رشد کردن!یه مثال دیگه بزنم. یه مدتی کلاس گیتار میرفتم و استادم اصرار داشت هر بار که تمرین سرعت رو استارت میزنم ۴۰ دقیقه بدون وقفه تمرین رو ادامه بدم. بعد دو سه جلسه، رو راست بهش گفتم که بعد حدود ۱۰ دقیقه تمرین حس میکنم انگشتام توان ادامه دادن رو ندارن و اونجا استراحت میکنم. با اینکه استاد سخت گیری بود، این جمله طلاییش تو ذهنم موند. گفت: بعد اینکه انگشت هات کاملا خسته شدن و فکر میکنی که دیگه نمیتونی ادامه بدی، تازه از اون لحظه به بعد، عضلهِ بند های انگشتت شروع میکنن قوی شدن!ولی مغز که عضله نیست. پس تمرین برنامه نویسی، چه زمانی با یادگیری عمیق و پیشرفت همراهه؟قبل جواب دادن به این سوال، اول میخوام بگم:تمرین برنامه نویسی در چه صورتی با پیشرفت همراه نیست؟اگه جزو اون دسته از آدمایی هستین که دست به سِرچِتون خوبه و بلدین کلمه های کلیدی رو با ترتیب درستی به گوگل بدین که جواب سوالتون رو در ریزالت اول بگیرین، باید بگم که مسیر سخت تری به نسبت آدمایی که نمیتونن خواسته شون رو درست برای گوگل بیان کنند دارید! نه من تو این پاراگراف کلمه ای رو اشتباه نوشتم و نه شما چیزی رو اشتباه خوندین!سرچ کردن و خوندن جواب مسئله، برای مغزی که میخواد یاد بگیره نه تنها کمک کننده نیست، بلکه تاثیر عکس میذاره! یعنی مغزتون بلافاصله متوجه قدرت گوگل میشه و ناخودآگاهتون دست از یادگرفتن بر میداره! مغز باستانی ما آدما تو این دنیای مدرن، تنبل تر از چیزی شده که به این سادگی ها چیزی رو به خاطر بسپاره. حتی ۹۰٪ مواقع، فردای سرچ یادمون نمیاد که جواب گوگل به سوالمون چی بوده. فقط یادمون میاد که جوابش تو گوگل هست و این برای مغز و ناخودآگاه و آمیگدال ها و غیره، عین کراتینی می‌مونه که پهلوون پنبه ها به عضله هاشون تزریق میکنن! ممکنه جواب یک سوال از بینهایت سوال دنیای برنامه نویسی رو اون لحظه پیدا کرده باشیم و کارِمون جلو رفته باشه، اما متاسفانه با سوزوندن فرصت یادگیری برای خودمون، قطعا که به جای پیشرفت، پسرفت کردیم…تمرین برنامه نویسی، کی با پیشرفت همراه نیست؟احتمالا تشبیه مغز به عضله و پیشرفت دادنش از طریق تمرین دادنش، چیزی نیست که اولین بار، تو این پست خونده باشید. ولی خوب اینم میدونید که مغز دقیقا مثل یک [یا یک سری] عضله کار نمیکنه و ساختار پیچیده تری داره. راستش منم اطلاعات بیشتری در مورد خود مغز و نحوه دقیق کارکردش ندارم! ? خوشحالم که قرار نیست در مورد یادگیری مغز بنویسم. فقط قراره تجربه خودم رو از اینکه شخص خودم چطور طی این چند سال یاد گرفتم و میگیرم بنویسم.موقع هایی که ذهن من خسته است «روان نژندی»ـم بیشتره. یعنی «احتمال گرفتن حس منفی از تجربه هایی که اون لحظه میکنم» بیشتره.این یعنی وقتی خسته ام و میخوام یه کاری انجام بدم (هر کاری)، زودتر از همیشه، از دست خودم نا امید میشم و شروع می‌کنم مذمت کردن خودم که «تو چقد کودنی» یا «حتی از پس این کار هم بر نمیای» و امثالهم. اگه تو این حین که خسته ام، بخوام چیزی یاد بگیرم، جمله های شبیه اینها منجر به این میشه که نتونم روی قدرت مغز و یادگیریم، مثل موقع هایی که خسته نیستم حساب کنم. و این هم منجر میشه به اینکه قدرت یادگیریم اون لحظه واقعا پایینتر باشه.در نتیجه من از اوقاتی که خسته ام، برای یادگیری استفاده نمیکنم و اون موقع ها سعی میکنم «آگاهانه» قربون صدقه خودم برم! برا خودم چایی بریزم یا فیلم بذارم و خلاصه به ذهنم استراحت بدم. پس حالا که میدونم تمرین برنامه نویسی، وقتایی که خسته ام با پیشرفت همراه نیست، تمرین برنامه نویسی رو برای این مواقع نمیذارم. خوب دیگه… مقدمه بسه! تمرین برنامه نویسی، در چه شرایطی منجر به یادگیری عمیق و پیشرفت میشه؟تمرین برنامه نویسی، برای من، وقتی با یادگیری و پیشرفت همراه بوده که (خواسته یا ناخواسته) طبق این مراحل پیش رفتم:۱. یه صورت مسئله برای برنامه نویسی داشتم: این مسئله رو یه موقع هایی انتهای کورس های آنلاین پیدا کردم (یا انتهای هر فصل از کورس). یا خودم برای خودم تعریف کردم (مثلا فیسبوک، توییتر یا اینستاگرام رو با هدف تمرین پیاده سازی کردم). یه موقع هایی استاد یه درس بهم داده. یه موقع هایی هم پروژه هایی که برای این و اون زدم بوده. یا حتی تر، فیچری برای شرکتی که براش کار میکردم بوده.۲. یه ایده برای حل اون مسئله پیدا کردم: بسته به نوع صورت مسئله، این ایده از جنس پیدا کردن الگوریتم بوده یا از جنس انتخاب ابزار (مثل کتابخونه/فریم ورک/اپ/سرویس آماده) یا از جنس پیدا کردن design pattern مناسب، یا مهم ترین چیزی که [حداقل به نظر من،] یه برنامه نویس رو واقعا یه برنامه نویس میکنه: ایده در مورد نحوه پیاده سازی و شکستن صورت مسئله به مسائل کوچک تر (ماژول یا کمپوننت های کوچیک تر).۳. ایده رو پیاده سازی کردم. شروع کردم به نوشتن کد.۴. ایده جواب نداده! خوب تجربه نداشتم! ? طی پیاده سازی هم مطمئن نبودم که ایده ام لزوما جواب میده.۵. چندین بار کل پیاده سازیم رو صفر تا صد خوندم: و اشتباهاتی که توی پیاده سازیم داشتم رو پیدا کردم، حالت های خاص ورودی ها رو پیدا کردم و پیاده سازیم رو دیباگ کردم. انقدی این کار رو ادامه دادم که ذهنم دیگه واقعا خسته شده. (مهمه که این مرحله رو با تمرکز عمیق - یعنی حداقل برای چهار ساعت متوالی - انجام بدید)۶. دست از کار کشیدم. دیر اینو فهمیدم که وقتی ذهنم خسته است، باید بیخیال دیباگ بشم! شاید سه سالی بود که برنامه نویسی میکردم و اینو نمیدونستم. یه بار خیلی شانسی با یکی داشتیم pair programming میکردیم و آخر وقت از پیاده سازیمون نا امید شده بودیم و دیگه چیزی به ذهنمون نمیرسید. برگشت گفت «الان دیگه خسته ایم، نمیتونیم به جواب برسیم. بریم خونه، فردا میایم ببینیم به کجا میرسیم». حرفش به دلم نشست! ?۷. بعد اینکه دست از کار کشیدم، استراحت کردم! این استراحت، وقتی بیشترین تاثیر رو روم گذاشته که آگاهانه برای استراحت دادن به ذهنم، یه کار آرامش بخشی برای خودم کردم. مثلا پیاده روی کردم یا برا خودم چایی ریختم، یا یکی دو ساعتی یوتیوب چرخیدم.۸. وقتی که دیگه احساس خستگی نداشتم، برگشتم پای کد: دوباره پیاده سازی دفعه قبلم رو خوندم و برای بار هزارم (این دفعه با یه ذهن سر حال و شاداب) مطمئن شدم که پیاده‌سازیم دقیقا مطابق ایده‌ام بوده و باگی نداشته.۹. اگه هنوز مسئله حل نشده بود، برگشتم مرحله ۲، نا امید نشدم و دنبال یه ایده جدید گشتم و بقیه مراحل رو مجددا و مجددا و مجددا به همون ترتیب تکرار کردم.۱۰. اگه جواب مسئله ام رو پیدا کردم، خوشحالی کردم و یه حالی به خودم دادم ? در مورد کارکرد هورمون دوپامین و تاثیرش روی یادگیری، تو اینترنت چیزای زیادی هست که منم خیلی وقت نیست که فهمیدم. ولی الان ارزش اون خوشحالی های [هر چند] بچگانه رو میفهمم.۱۱. اگه بعدش راه حل نهاییم رو مرور کردم، دیگه هیچ وقت فراموشش نکردم. یه معلمی داشتیم که میگفت «دلیل اینکه معلم ها بهتر از شاگرد ها درس رو بلدن، اینه که درسی رو که سطحی بلد بودن، با یاد دادن به شاگرد ها برای خودشون عمیق کردن». ولی الان که فکر میکنم، می‌بینم نیازی نیست نفر دیگه ای در کار باشه تا عمق آموخته بیشتر بشه. مرور و نتیجه گیری (خلاصه کردن راه حل و تقلیلش به یکی دو جمله) تاثیر زیادی روی عمق پیدا کردن آموخته‌ام داشته و کمکم کرده که اون راه حل برای اون تیپ مسئله‌ها، توی ذهنم حک بشه.نتیجه گیرییادگیری فقط با تکرار و تمرین اتفاق میفته. وقتی دنبال ایده ای برای مسئله میگردیم، در واقعا داریم تمام دانشمون رو مرور می‌کنیم که ببینیم کدوم قسمتش، الگویی مشابه الگوی مسئله مون داره.مرور کردن تکنیک هایی که برای حل مسئله بلدیم، و بررسی انطباق هر کدوم از اون تکنیک ها با صورت مسئله، چیزیه که دانش ما رو عمیق میکنه. حتی اگه ما رو به جواب مسئله نرسونه.برنامه نویسی، چیزی نیست جز شکوندن مسئله به مسائل کوچیکتر و تمرکز روی حلِ هر کدوم از اون مسائل کوچیک، بدون ترس از حل بقیه مسائل کوچیکی که در آینده قراره بهشون برسیم. نیازی نیست کدِ کسی که تازه در مسیر یادگیری قرار گرفته:عالی باشهبی نقص باشهغیر قابل نفوذ باشهاز اصول SOLID یا هر اصل دیگه ای پیروی کنه.پیچیدگی زمانیش کوچیک باشه یا سریع کار کنه.هیچ کدوم از شرایط Clean code رو داشته باشه.خروجی کدش کمترین فضا رو روی سیستم اشغال کنه.از ابزاری که دقیقا برای حل اون مسئله خاص طراحی شده استفاده کنه.هر کدوم از ویژگی های بند قبلی و صدها ویژگی دیگه ای که برای یک کدبیس میشه در نظر گرفت، یک روزی ممکنه برای یه توسعه دهنده تبدیل به یک «صورت مسئله» بشه که در اون صورت شروع میکنه به حل مسئله جدیدش. پس از حجم مطالب زیادی که سر راهتون قرار داره نا امید نشید و نترسید.فرآیند یادگیری توسعه نرم افزار یا اصطلاحا برنامه نویسی، هیچ وقت به انتها نمیرسه و برای یه مهندس نرم افزار کاربلد، مهمه که بدونه مرحله بعدی برای یادگیری شخص خودش چیه.دوست دارم نظر شمایی که تا اینجا خوندی رو در مورد این مقاله بدونم. پس برام کامنت بذار و بهم بازخورد و فیدبک بده. ممنونم ازت :)