همه میتونن برنامهنویس بشن! این جملهایه به هر کی که با من درباره شروع برنامهنویسی و یادگیریش مشورت میکنه میگم. برای حرفم دلیل دارم. اما قبل از اینکه بریم راجع به دلیلش صحبت کنیم، بیاین ببینیم چرا جو یادگرفتن برنامهنویسی راه افتاده و خیلیا دوست دارن برنامهنویس بشن؟ قبل از اینکه وارد متن بشیم، اینم بگم که اگه حوصله خوندن متن رو نداری، میتونی یه سر به کانال پادکست الگولوریتم بزنی و این متن رو به صوتی گوش کنی!
تو دورههای مختلف، همیشه یکی از علوم یا مهارتها بوده که خیلیا دوستش داشتن. حس خفن بودن به مردم میداده یا هایپ بالا داشته. یه زمانی فیزیک بوده یه زمانی کیمیاگری بوده و … . بعضی وقتا همراه با توهم بوده، اکثرا هم ناشی از وعده وعیدهای افراد که اگه مثلا فلان علم رو یا فلان مهارت رو فرا بگیری، پول دار میشی. مثل کیمیاگری که فکر میکردن میتونن هرچیزی رو به طلا تبدیل کنن و یه شبه پولدار بشن. متاسفانه این ماجرای یک شبه ره صد ساله رو رفتن، هیچوقت از کیسه آمال و آرزوهای ملت خارج نمیشه! بعضی وقتا هم البته برای کلاس داشتن و خفن بودنه. مثلا یه زمانی فیزیک خوندن حس خفن بودن به آدما میداده. و حالا توی قرن ۲۱ ام ما با هایپ بالای یادگیری برنامهنویسی مواجهیم که به نظرم خبر خوبیه. به هر حال از اونجاییکه زندگی ما با دستگاههای دیجیتال یه جورایی گره خورده، خوبه که برنامهنویسی رو حداقل در حد مبتدی بلد باشیم. مثلا همه ما یه حدی از ریاضیات و علوم تجربی رو توی مدرسه یاد میگیریم و جزء آموزههای عمومی محسوب میشن. به نظر من برنامهنویسی هم به زودی به مجموعه این مهارتها میپیونده.
۲ تا سوال پیش میاد. سوال اول اینکه آیا اصلا نیازه چنین مهارتی آموزش داده بشه؟ و سوال دوم اینکه آموزش دادن این مهارت برای آدما چقدر ممکنه چالش برانگیز باشه و آیا جامعه آموزشپذیر (دانشآموز، دانشجو) میتونه باهاش ارتباط برقرار کنه و به راحتی برنامهنویسی رو فرا بگیره؟
سوال دوم رو قبل از سوال اول جواب میدم. اجازه بدید فضای بحث رو ببرم سمت یادگیری زبان خارجی. اینکه ما زبان انگلیسی رو یاد میگیریم اصلا و ابدا کار سختی نیست. قاعدتاً یه سری مفهوم که معادل فارسیشون رو میدونیم وجود داره و ما میخوایم حفظ کنیم معادل انگلیسی این مفوم چیه. اجازه بدین یه مثال بزنم. «وسیلهای وجود داره که ما برای نشستن ازش استفاده میکنیم». توی فارسی ما به این وسیله میگیم صندلی، توی انگلیسی میگیم chair و خب توی زبانهای دیگه ممکنه معادل دیگری داشته باشه. مسئله اینجاس معلم زبان انگلیسی نیاز نداره به شاگردش یاد بده که مفهوم صندلی چیه! حالا تصور کنین ما یه ماشین زمان داریم، سوارش میشیم میریم به گذشته اون زمان که اجدادمون توی غار بودن، یکی از اجدادمون رو زنده شکار میکنیم سوار ماشین زمان میکنیم و برمیگردیم به زمان خودمون! (امیدوارم ذهنها درگیر داستانپردازی اثرات پروانهای نشه!). خب حالا فضای تصور رو میخوام ببرم به سمتی که ما قراره در اولین قدم در آموزش تمدن به انسان اولیه بهش حرف زدن یاد بدیم. مثلا میخوایم بهش صندلی رو یاد بدیم. قطعا خیلی سخته، نه فقط اینکه باید بهش یاد بدیم «صندلی وسیلهای است که روی آن مینشینیم»، بلکه از اونجایی که مبانی ذهنیمون باهم قرنها فاصله داره، قطعا خیلی اذیت میشیم که بهش یاد بدیم نشستن چیه تا حالا بعدش برسیم به صندلی و چیزای بیشتر. حالا تصور کنین ما اگه قرار باشه واقعا به یه انسان غارنشین فارسی یا انگلیسی یاد بدیم یکی از سختترین کارهای جهان، نه فقط برای ما بلکه برای خود اون آدمه. چرا که به غیر از مفاهیم ((نشستن)) و ((صندلی))، حدود ۲۰ هزار مفهوم (شاید حتی بیشتر) وجود داره که تکتکشون باید توسط انسان اولیه فرا گرفته بشه. حالا تصور کنین با همون ماشین زمان به جای سفر به عصر انسان غارنشین، سفر کرده بودیم به هزار سال پیش، جایی که انسانها شهر نشینی و قانون و حکومت و اینجور چیزا رو هم میدونستن. حتی اگه آدمی که به دنیای امروز میاریم ایرانی باشه که با توجه به عدم تغییر چندان زبان فارسی طی هزاره اخیر،تا حدی زبان ما رو هم میفهمه. در ثانی مجبور نیستیم ابتدایی ترین مفاهیم مثل نشستن و اینجور چیزها رو بهش یاد بدیم. تهش اینه بخوایم بهش یاد بدیم کامپیوتر و اینترنت چیه، یا تلفن و تلگراف چیه که چون درگیر مفاهیم کم تعدادتر هستیم، قطعا کار سختی نیست. از این حیث، برنامهنویسی راحته. مفاهیم برنامهنویسی، مفاهیم زیادی نیستن. شاید به سختی از تعداد انگشتای ۲ دست بیشتر بشن. بنابراین خیلی باید کار راحتی باشه. پس چیه که برنامهنویسی رو ممکنه سخت کنه تا همه نتونن یادش بگیرن؟
بیاید بحث رو ببریم سمت رانندگی. رانندگی هم یه مهارته، درسته؟ اولش باید "زبان ماشین" رو یاد بگیریم: گاز، ترمز، فرمون. خود اینا سخت نیستن، ولی مشکل اصلی اینه که رانندگی با راه رفتن فرق داره. ماشین مستقیم به چپ و راست نمیره، باید بچرخه. سرعتش زیاده، نیاز به تمرکز بالایی داره. و تازه این اولشه، بعدش باید قوانین رو هم یاد بگیریم. قاعدتاً کسی مادرزادی نمیدونه گاز و ترمز و فرمان چیه، اما یادگرفتشون ۱۵ دقیقه بیشتر زمان نمیخواد. پس چرا کسی ۱۵ دقیقهای راننده نمیشه؟ به نظرم اولین عامل سخت شدن رانندگی، تفاوت شکل حرکتی خودرو با راه رفتنه. خودرو مستقیما به چپ یا راست حرکت نمیکنه، بلکه باید به این ۲ جهت چرخش کنه. خودرو سرعت بالاتری داره و بالطبع واکنشها برای هدایتش باید سریعتر باشه و تمرکز بیشتری میخواد. در حالیکه وقتی پیادهروی میکنیم نیاز نیست زیاد حواسمون رو جمع کنیم. جدای از اون، هدایت خودرو اولین گام برای یادگیری رانندگیه. قدم بعدی رعایت قوانینه که جلوتر بهش میپردازم.
هدایت خودرو، مهارتیه که کسی مادرزادی بهش مسلط نیست. برای هدایت خودرو، لزوما انتخاب دنده سنگین برای حرکت و تنظیم سرعت کافی نیست. اگه اینجوری بود که خیلی راحت میشد. ما همینجوری محض خنده که خودرو رو حرکت نمیدیم. قاعدتاً یه هدف و مقصدی داریم. بنابراین اول از همه باید مسیر مناسب رو انتخاب کنیم. اینجا شباهت برنامهنویسی با رانندگی بیشتر مشخص میشه. برنامهنویسی هم یه همچین داستانیه. ما باهاش میخوایم به یه هدف مشخص برسیم. هدفمون اینه که یه مسئله رو حل کنیم. اسنپ یا اوبر چطور نزدیکترین راننده رو به شما اختصاص میده؟ یا آمازون دیجیکالا چطور وقتی یه کالا کمیاب میشه، سفارشها رو مدیریت میکنن؟ حل این مسائل یه الگوریتم میخواد. سختی برنامهنویسی هم همینه: خیلیا به جای اینکه اول فکر کنن، مستقیم میرن سراغ کد زدن. حالا اینجا یه سوال مطرح میکنم. آیا ما روش و الگوریتم حل این مشکلات و مسائل رو، بدون استفاده از کامپیوتر بلدیم؟
برنامهنویسی فقط نوشتن کد نیست، بلکه یعنی تحلیل و حل مسئله. اگه یه برنامهنویس قبل از شروع کدنویسی یه کم مکث کنه، مسئله رو روی کاغذ بررسی کنه، نصف سختی راه رو رفته. پس نه، برنامهنویسی سخت نیست، فقط یه طرز فکر و روش حل مسئله میخواد. اگه اینو یاد بگیری، برنامهنویسی برات مثل آب خوردنه!
الان نمیخوام درباره حل کردن مسئله توضیح بدم. یه ویدیوی کوتاه دارم که دوست داشتین میتونین نگاهش کنین.
شاید این سوال پیش بیاد که برنامهنویسی و علوم رایانه کلی مبحث و مطلب داره و نمیشه از کنارش ساده گذشت. به نظر من بازم باید نگاهمون شبیه رانندگی باشه. همه آدما بلد نیستن کامیون برونن! و همه آدما اونقدر به تعمیرات موتور ماشین مسلط نیستن که خودشون بتونن هر خرابی رو تعمیر کنن. اگه بخوایم به برنامهنویسی به عنوان یه مهارت عمومی نگاه کنیم کمی منطقیتر به نظر میاد که همه نباید به کل مباحث و حتی قسمت قابل توجهی از علوم رایانه مسلط بشن. ضمن اینکه برای درک بهتر علوم رایانه، توصیه میکنم اول از همه به حل مسئله برنامهنویسی مسلط بشین.