متاسفانه نظام آموزشی کشور ما در مدرسه و دانشگاه (به جزء دانشگاهها و مدارس خاص) جوری بوده که یادگیری هر موضوعی رو به دو بخش کاملا متفاوت تئوری و عملی تقسیم کرده. در ذهن بیشتر افراد، یادگیری تئوری یه روش خستهکننده و بی فایده هست اما یادگیری عملی روشی جذاب و مفید به حساب میاد. این شکاف توی کارهایی مثل برنامهنویسی خیلی عمیقتره! خیلی از افراد فقط آموزشهایی رو مطالعه میکنند که توی هر پاراگراف حداقل یه خط کد بهشون یاد بده وگرنه خوندن اون آموزش یا کتاب رو بیارزش و وقت تلف کردن میدونن.
این طرز تفکر باعث میشه که بیشتر افراد برای یادگیری برنامهنویسی روش پروژه محور رو انتخاب کنند. این انتخاب به خودی خود مشکلی نداره ولی مشکل اونجاست که بنظر من درک درستی از یادگیری پروژه محور ندارند. معمولا یادگیری پروژه محورشون شبیه فرآیند زیر هست:
۱- تعریف پروژه: بیشتر افراد در شروع کار، توانایی تعریف پروژه برای خودشون رو ندارند. در نتیجه با پرس و جو از بقیه یه پروژه مناسب پیدا میکنند.
۲- انجام پروژه: درصد کمی از افراد پیادهسازی پروژه رو با سرچ عبارتهایی شبیه How blah blah شروع میکنند و بعد هر تیکه کدی که پیدا میکنند رو داخل پروژه کپی میکنند. بقیه از همون فردی که پروژه رو براشون تعریف کرده، اینقدر سوال میپرسند تا ذره ذره یه سری نمونه کد ازش بگیرند و عینا داخل پروژه کپی کنند.
۳- عیبیابی: با توجه به اینکه هر دو گروه کدها رو بدون اینکه دانشی ازش داشته باشن توی پروژه کپی کردن، با هزاران مشکل روبرو میشن. اینجاست که باز آدمها دو دسته میشن، یه سری اینقدر سرچ میکنند و کدهای مختلف رو دوباره کپی پیست میکنن تا مشکل حل بشه و یه سری هم به کسی که برنامهنویسی بیشتر ازشون بلده گیر میدن تا بالاخره اون یه نفر بیاد براشون مشکل پروژه رو حل کنه.
تا پروژه کامل بشه، مراحل ۲ و ۳ بینهایت بار تکرار میشه. اینجوری یاد گرفتن برنامهنویسی به شدت اتلاف انرژی و وقت داره. چون کسی که پروژه رو ساخته چیز زیادی رو یاد نگرفته، حتی اگر قرار باشه دوباره یه پروژه مشابه انجام بده، سر هر تفاوت پروژهی جدید با قبلی، دوباره باید بارها مرحلهی ۲ و۳ رو تکرار کنه. تازه نکتهی مهم اینه به سازندهی همچین پروژهای نباید برنامهنویس گفت. چون در اینصورت همه افراد دنیا هم معمار میشدن، چون به هر کسی چهارتا آجر و یه کیسه سیمان (معادل کدهای آماده توی برنامهنویسی) بدی، بالاخره با سعی و خطا میتونه یه خونه برای خودش بسازه ولی این فرد هم معمار حساب نمیشه!! فقط یه سرپناه موقت برای خودش ساخته که احتمالا در آیندهای نزدیک خراب میشه.
باز تاکید میکنم یادگیری پروژه محور بد نیست، مزایای خودشو داره ولی به شرطی که درست انجام بشه. از دید من تفاوت یادگیری پروژه محور با حالت معمولی (گام به گام) در اینه که بجای خوندن فصلهای یه کتاب آموزش برنامهنویسی بصورت فصل به فصل، موضوعاتی که برای ساخت پروژه نیازه رو خوند. این روش با اون فرآیند ۳ مرحلهای که بالاتر گفتم خیلی فرق داره. فرض کنید قراره برنامهای به اسم X برای نمایش نقشه در اندروید ساخته بشه، باید بجای اینکه دنبال نمونه کد نمایش نقشه گشت، توی داکیومنتهای رسمی اندروید سر فصلهای مرتبط با نقشهاش رو خوند یا مثلا به کتابهای رفرنس مثل busy coder رجوع کرد و فصل پیادهسازی نقشهی اون رو نگاه کرد. حالا بعد از آشنا شدن با مفاهیم مربوط به نقشه، از روی نمونه مثالهای موجود در اینترنت، کد برنامه X نوشته بشه.
در این روش چون برنامهنویس بعد از یادگرفتن مفاهیم اولیه به دنبال پیادهسازی میره، مرحلهی کشف خطا براش خیلی راحتتر میشه. چون میدونه هر کد به چه موضوعی ربط داره و وظیفهاش چیه. در نهایت بعد از کامل شدن پروژه هم، سازنده برنامه میتونه به راحتی هر تغییری که دوباره نیاز داره رو بده. با همین روش، وقتی تعدادی پروژه متنوع انجام بده، بخشهای مختلف برنامهنویسی رو یاد میگیره.
ختم کلام اینکه یادگیری پروژه محور به این معنا نیست که فقط باید کپی-پیست کرد و هیچ مطالعهای نداشت. یادگیری پروژه محور ترکیبی از یادگیری تئوری و عملی هست، فقط در ترتیب خوندن موضوعات با یادگیری گام به گام تفاوت داره. بعد اینکه آموزشهای تئوری به دانش ما عمق میدن و یادگیری عملی تجربهی ما رو برای پیادهسازی اون دانش تئوری بالاتر میبره و مکمل یکدیگر هستند. اگر کسی بتونه بالانس رو در مطالعه تئوری و کار کردن بصورت عملی حفظ کنه، قطعا بیشتر از بقیه توی مسیر حرفهایش موفق میشه.