چرا بیشتر آموزش های برنامه نویسی «به درد نخور» هستن؟

بسم الله الرحمن الرحیم.سلام.خیلی وقته که راجب برنامه نویسی چیزی ننوشتم اینجا. جالب اینجاست که اصلی ترین دلیلِ من برای آمدن به ویرگول هم همین بود که میخواستم راجب برنامه نویسی بنویسم فقط. ولی مثل خیلی جاهایِ دیگهء زندگی، وقتی قدم توی یه مسیری برمیداری، یهو میبینی یه چیزای جدیدی کشف میکنی و اصلاً برای اینه که میگن آدم باید «شروع کنه» و نگرانِ مسیر نباشه، چون خیلی وقتها خدا برای ما یه چیزایی آماده کرده که از قبل قابل دیدن نیستن و لازمهء اون اینه که مسیر رو شروع کنیم و قدم برداریم.اولین نوشتهء من توی ویرگول، که مربوط به ۱۲ شهریور ۱۳۹۸ میشه، اینه: (یکم صبر کنید که لینک ها دانلود بشن) https://virgool.io/@rahro/%D8%A7%D8%B5%D9%84%D8%A7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DB%8C%D8%B9%D9%86%DB%8C-%DA%86%D9%87-jwjglqkcglps اینجا من راجب این نوشتم که اصلاً برنامه نویسی، وقتی که از بالا یا به قول خارجکی ها Birds Eye بهش نگاه کنیم، یعنی چه.بعد از اون هم این ۲ تا مقاله رو نوشتم: https://virgool.io/@rahro/%DB%B2-%DA%A9%D9%84%D9%85%D9%87-%D8%A7%D8%B3%D8%A7%D8%B3%DB%8C-%D9%88-%D9%85%D9%87%D9%85-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D9%87%D8%A7%DB%8C-%D8%AA%D8%A7%D8%B2%D9%87-%DA%A9%D8%A7%D8%B1-i6ptynzc41dp https://virgool.io/@rahro/%D9%BE%D8%A7%D8%B1%D8%A7%D8%AF%D8%A7%DB%8C%D9%85-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-lug6yoamrvlr بعدش یهو اون تغیرِ مسیری که گفتم، اتفاق افتاد و دیگه برای یه مدتی راجب برنامه نویسی ننوشتم. ولی خب بعد از یه مدت دلمان براش تنگ شد و مقاله های زیر رو نوشتم: https://virgool.io/@rahro/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B1%D9%88-%D8%AF%D8%B1%D8%B3%D8%AA-%D9%88-%D8%A7%D8%B5%D9%88%D9%84%DB%8C-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1-%D9%85%D8%AB%D9%84-%DB%8C%D9%87-%D9%84%D8%A7%DA%A9%D9%BE%D8%B4%D8%AA-ybwwuu4jdbvu https://virgool.io/@rahro/%DA%86%D9%86%D8%AF-%D9%86%DA%A9%D8%AA%D9%87-%D8%AE%DB%8C%D9%84%DB%8C-%D9%85%D9%87%D9%85-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D9%88%D9%86%D8%A7%DB%8C%DB%8C-%DA%A9%D9%87-%D9%85%DB%8C%D8%AE%D9%88%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%D9%86-swsujif38qw2 https://virgool.io/@rahro/%D8%AA%D9%88%D8%B6%DB%8C%D8%AD-map-%D9%88-filter-%D9%88-reduce-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A2%D8%AF%D9%85-xggtdvyq5zt1 اینا دیگه زورِ آخر بودن (!) و بعد از اینا برای یه ۲ ماهی دیگه راجب برنامه نویسی ننوشتم، تا اینکه بعدش یه چند قسمت آموزشِ پایتون نوشتم: https://virgool.io/@rahro/%D8%AF%D9%88%D8%B1%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D8%A7-%DB%B1%DB%B5%DB%B0-%DA%86%D8%A7%D9%84%D8%B4-%D9%85%D8%B9%D8%B1%D9%81%DB%8C-jwqskdrgphwe ولی خب بعد از یه ۵ قسمت، چون استقبال اونجوری که میخواستم نبود، دیدم به وقت و انرژیش نمی ارزه و ولش کردم.هرچند که چند ماه بعد هم این ۲ تا مقاله رو فقط برای کُشتنِِ وقت و سپری کردنِ شب تا صبح، نوشتم: https://virgool.io/@rahro/%D8%AF%DB%8C%D9%88%D8%A7%D9%86%D9%87-%D8%A8%D8%A7%D8%B2%DB%8C-%D8%A8%D8%A7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%86%D8%B7%D9%88%D8%B1-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%AA%D8%A7-%D8%B5%D8%A8%D8%AD-%D8%A8%DB%8C%D8%AF%D8%A7%D8%B1-%D8%A8%D9%85%D8%A7%D9%86%DB%8C%D9%85-jfgrlr0odrx1 https://virgool.io/@rahro/%D8%AF%DB%8C%D9%88%D8%A7%D9%86%D9%87-%D8%A8%D8%A7%D8%B2%DB%8C-%D8%A8%D8%A7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DB%B2-%DA%86%D8%B7%D9%88%D8%B1-%DA%AF%D9%86%D8%AF-%D8%A8%D8%B2%D9%86%DB%8C%D9%85-%D8%A8%D9%87-%DA%A9%D9%84%D9%85%D8%A7%D8%AA-wmta4i3ys4nc خب، اینها رو اینجا گذاشتم که هم یه معرفی باشه و هم اگه کسی به دردش خورد، مقاله ها رو بخوانه.و اما این مقالهمن برنامه نویسی رو کاملاً بصورت self learning یادگرفتم، چون وقتی ۱۹ یا ۲۰ سالم بود، خیلی علاقه به ساختنِ چیزهای جدید داشتم و برنامه نویسی این قدرت رو بهم میداد.اون موقع این سایت هایی مثل udemy و edx و coursera و غیره یا وجود نداشتن و یا به این گستردگی و کیفیتِ الان نبودن و youtube هم مثل الان پر از آموزش های خوب (و البته خیلی وقتها هم چرت و پرت) نبود و stackoverflow و غیره هم تازگی ها راه اندازی شده بودن و مثل الان اینقدر کار رو برای تقلب و راحت طلبی، راحت نکرده بودن (هرچند که در خیلی موارد هم واقعاً سایت خوبیه).خلاصه ما بودیم و کتابهای مختلف و سایت های مختلف و «یه ذره از اینجا و یه ذره از اونجا».ولی خب واقعاً نتیجه میداد . . .چرا؟ چون به معنای کلمه، آدم «دانش + جو» بود و برای فهمیدنِ مطالب، خودش تلاش میکرد و مثل الان نبود که فقط لَم بدن و ویدیو نگاه کنن و فکر کنن دارن میشن برنامه نویس.خلاصه اینکه بعد از دیدنِ چندین و چند دورهء آموزشی و کتاب و غیره در زمینهء برنامه نویسی توی ۱۰ یا ۱۲ سالِ گذشته، به این نتیجه رسیدم که ۹۹٪ از اونها واقعاً چرت و پرت هستن.ولی چرا؟من اینجا ۴ دلیل رو میارم که به ذهنم میرسه. امیدوارم که کسایی که واقعاً میخوان برنامه نویس های خوبی بشن، بهشان کمک کنه.دلیل اول: syntax یا تفکرِِ الگوریتمی؟مشکلِِ اصلی که خیلی از این آموزش های برنامه نویسی دارن (حالا چه کتاب چه ویدیو یا هر چیز دیگه) اینه که تمرکزِ اینا به جای اینکه روی «خودِ برنامه نویسی» باشه، روی سینتَکسِ یه زبانِ برنامه نویسیِ خاصه.حالا فرق اینها چیه؟کسی که میخواد برنامه نویسی یادبگیره، باید خودِِ برنامه نویسی رو یادبگیره، یعنی باید یادبگیره که چطور بصورتِ Algorithmic فکر کنه و چطور باید برای حل کردنِ مسائل با اونها روبرو بشه.توی یکی از مقاله هام (همون لاکپشت که بالا هم گذاشتمش)، راجب این قضیه مفصل حرف زدم. مثلاً توی کتابی که اونجا معرفی کردم، اولِ کار از یه زبان برنامه نویسی استفاده میکنه که هیچ قابلیتِ اضافی بجز چند تا چیزِ پایه مثل variable ها غیره، نداره. چرا این کار رو کرده؟ چون کسی که تازه کاره، براش اولویت این نیست که syntax یه زبانِِ گردن کلفت مثل پایتون یا جاوا یا غیره رو یادبگیره و سردرگم بشه. برای این شخص مهم اینه که «یادبگیره چطور فکر کنه». همین.کم کم که کتاب جلو میره، توی فصل های بعدیش، به اون زبان هم یه چیزایی اضافه میشه و این باعث میشه که شخصِِ تازه کار، خیلی اصولی و درست و حسابی، خودِ برنامه نویسی رو یاد بگیره، نه یه زبانِ برنامه نویسی.حتماً الان فکر میکنید که «خب مگه نباید یه زبان هم یاد بگیریم؟». بله درسته، ولی خیلی فرق هست بین اینکه شما خودِ برنامه نویسی و Algorithmic فکر کردن رو یادبگیرید یا اینکه فقط سینتَکسِِ یه زبانِ خاص رو یادبگیرید.هرکسی میتانه بیشترِ سینتَکسِ یه زبان مثل پایتون یا جاوااسکریپت رو توی یکی ۲ هفته یادبگیره.ولی خب که چه؟بعد از اون ۲ هفته، یه صفحه رو باز میکنه و میخواد یه برنامه بنویسه و بعد نمیدانه اصلاً باید از کجا شروع کنه.ولی وقتی یکی خودِ برنامه نویسی رو اول یادبگیره، یادگرفتنِ زبان های برنامه نویسیِ معروف هم اونقدر ها هم سخت نیستن دیگه. چون تقریباً همه زبانها (البته بجز پارادایم هایِِ کمتر معروف مثل functional و logic و غیره)، چیزی نیستن جز variable ها و if ها و function ها و loop ها و Object ها و یه چند تا چیزِ دیگه.ولی مهم اینه آدم یادبگیره چطور algorithmic فکر کنه و از اون چند تا چیز استفاده کنه برای نوشتنِ برنامه.متاسفانه خیلی ها از این قضیه استفاده (یا سوء استفاده) میکنن و دوره های آموزشیِ آبَکی میسازن و یه چند تا syntax از یه زبانِ خاص مثل پایتون و جاوااسکریپت رو یاد مردم میدن و اسمش رو هم میزارن «برنامه نویسی».دلیل دوم: هَکِر با کلاهِ Hoodie و Live codingمشکل دیگه ای که بیشترِ آموزش ها دارن، اینه که کسایی که دارن اونها رو نگاه میکنن، فکر میکنن الان این کسی که داره این کُد ها رو مینویسه، چقدر آدمِ خفن و گردن کلفتیه و احتمالاً یه هَکِر هم هست و یه کلاه Hoodie هم پوشیده که کسی نشناسش و با سرعتِ نور هم داره این کُد ها رو تایپ میکنه و توضیح میده (Live coding) و این کسی که داره این آموزش رو نگاه میکنه، با خودش میگه «بابا این چطور داره انقدر سریع این کارها رو میکنه؟ من هیچوقت نمیتانم اینجوری کُد بنویسم».ولی آیا واقعیتِ برنامه نویسی هم همینطوره؟نه، واقعاً اینطور نیست.برنامه نویسی یه کاریه که چندین مرحله داره و آدم همینجور الکی نمیاد بشینه پای کامپیوتر و یه «یا علی» بگه و شروع کنه کُد نوشتن. اولش باید مسئله ای که میخوای حل کنی رو کاملاً بررسی کنی، بعد یه راه حل براش طراحی کنی و تازه بعد از همه این کارها، میرسیم به نوشتنِ کُد و بعد از نوشتنِ کُد هم مراحل دیگه ای داریم. توی دنیای واقعی، اتفاقاً خیلی از وقتِِ برنامه نویس ها برای این کارها صرف میشه و نوشتنِ کُد هم فقط یه قسمت از کاره، خیلی وقتها هم فقط یه قسمتِ کوچیک!اون برنامه نویسی که داره برای شما مثل فیلم های هالیوودی کُد مینویسه و توضیح میده، قبل از اینکه بخواد به شما آموزش بده، وقت زیادی رو صرف این کرده که به اون راه حل برسه و شما توی اون ویدیو ها و کتاب ها، دارید فقط «نتیجه» اون زحمت ها رو میبینید، نه «خودِ اون زحمت ها».همین «خودِ اون زحمت ها» هست که توی اکثر این آموزش ها نشان داده نمیشه و واقعیت یجورایی مخفی میشه از بیننده.دلیل سوم: هلو، بیا برو تو گلو و Bug هامشکل دیگه ای که هست، اینه که همونطور که توی موردِ قبلی گفتم:اون برنامه نویسی که داره برای شما مثل فیلم های هالیوودی کُد مینویسه و توضیح میده، قبل از اینکه بخواد به شما آموزش بده، وقت زیادی رو صرف این کرده که به اون راه حل برسه و شما توی اون ویدیو ها و کتاب ها، دارید فقط «نتیجه» اون زحمت ها رو میبینید، نه «خودِ اون زحمت ها».یکی از این «زحمت» ها، bug ها هستن.شما دارید اون برنامه نویس رو میبینید که داره به روانیِ یه رودخانه کُد مینویسه و هیچ مشکلی هم پیش نمیاد و پیش خودتان هم میگید «بابا دمش گرم، چجوری این کار رو میکنه؟». ولی واقعیت اینه که توی روندِ نوشتنِ یه برنامه، اصلاً غیر عادی نیست که شما هزار تا bug هم داشته باشید و تا یه برنامه کامل بشه، برنامه نویس ها خیلی خیلی با این bug ها روبرو میشن.ولی اینکه شما توی این آموزش ها این bug های مختلف رو نمیبینید، باعث میشه پیش خودتان فکر کنید که یا شما برنامه نویس بدی هستید یا اینکه اون کسی که داره آموزش میده خیلی خوبه. ولی هیچکدام درست نیست!درسته که یه برنامه نویس وقتی چند سال تجربه پیدا میکنه، یه سری bug هایی که تازه کار ها دارن رو نخواهند داشت، ولی اونها هم در طول روز، مطمئن باشید خیلی خیلی به این bug ها برخورد میکنن و اصلاً debug کردنِ برنامه خودش یه مهارتیه که هم اندازهء نوشتنِ برنامه ها مهمه و متاسفانه توی اکثر آموزش ها اونجور که باید بهش بها داده نمیشه.دلیل چهارم: آسانش کُن تا بیشتر بفروشیمشکل دیگه ای که اکثر آموزش ها دارن، اینه که دیگه خیلی آبَکی و آسان هستن.این هم دلیل داره البته. انسان ها (مخصوصاً ما انسان های قرن بیست و یکمی) به شدت تنبل و راحت طلب شدیم و خیلی وقتها هم به جای اینکه مسیر اصولی رو بریم و صبر داشته باشیم، دوس داریم میانبر بزنیم و زودتر به نتیجه برسیم. از اون طرف هم ما دوس داریم که به ما این وعده های خوشگل رو بدن و راحت هم گول میخوریم معمولاً.خب سازنده های این آموزش ها هم اکثراً از این ویژگی یا تمایل های ما انسان ها استفاده (یا سوء استفاده) میکنن و نتیجش هم میشه عناوینی مثل:یادگیریِ صفر تا صدِ پایتون در ۲۱ روزآموزش حرفه ایِ برنامه نویسی در ۲۴ ساعتو هزار جور چرت و پرت دیگه که توی همین ویرگول هم زیاد ازشان هست.چطور ممکنه آخه که آدم توی یه کارِ سختی مثل برنامه نویسی، توی یه ماه یا ۲۴ ساعت «حرفه ای» بشه یا «صفر تا صد» رو یادبگیره؟ حتی کسایی که ۲۰ سال هم تجربه دارن، اینجور ادعایی ندارن که در برنامه نویسی «حرفه ای» هستن و صفر تا صد رو هم بلدن.شاید خواندنِِ مقالهء زیر از Peter Norvig که از بزرگانِ برنامه نویسی و هوش مصنوعیه و بصورت کنایه ای نوشته شده، مفید باشه: https://norvig.com/21-days.html البته ترجمهء فارسیش رو هم از این لینک میتانید بخوانید.علاوه بر اون عناوینِ مسخره و دروغی، محتوای خیلی از این آموزش ها هم واقعاً آبَکی و شُل و وِل و شیربرنجه. یه زمانی یادمه ۱۰ سال پیش که زبان ++C رو یادمیگرفتم، توی همون نصفِ اولِ کتاب برنامه ای نوشتیم که تقریباً یه کامپایلرِ ساده بود! الان توی این دوره زمانه، چالش ها و مسائلی که یه برنامه نویسِ تازه کار حل میکنه، واقعاً آسان و الکی هستن و باید توجه داشته باشید که اینها نتیجه مثبت و خوبی هم ندارن.با حل کردنِ چالش های سخت تره که آدم پیشرفت میکنه، مخصوصاً توی کاری مثل برنامه نویسی که اصلاً از اساس یعنی «حل مسئله».حرف آخرخب اینها مشکلاتی بود که به ذهن من میرسه. البته بعضی از این مشکلات، قابل تصحیح هم نیستن. یعنی مثلاً اگه یه نفر بخواد تمام اون bug ها رو توی یه کتاب یا ویدیو بیاره، فضای کافی نخواهد داشت! ولی خب خیلی از مشکلاتِ دیگه مثل اون عناوینِِ مسخره و وعده و عیدهای الکی، واقعاً درست نیستن.یعنی ای کاش کسی که یه وعده و وعیدی هم میده، واقعاً هم آموزشش کیفیتِ خوبی داشته باشه.که در اکثر موارد، اینجور نیست.اینم یه حسنِ ختامِ بی ربط:این کاره هاش میفهمن!مخلص،یا علی.