درآمدی بر مهم‌ترین اصول آموزش کدنویسی به افراد مبتدی

درآمدی بر مهم‌ترین اصول آموزش کدنویسی به افراد مبتدی

تعدادی از دانشگاه‌ها و حتی بوت‌کمپ‌ها در آموزش برنامه‌نویسی برخی جنبه‌های اصلی آموزش را نادیده می‌گیرند و غالباً راهبردهای ضعیفی را برای آموزش برنامه‌نویسی به افراد مبتدی اتخاذ می‌کنند (برای آشنایی با مفهوم بوت‌کمپ، می‌توانید به مقالهٔ Bootcamp چیست؟ مراجعه نمایید.) اما در این مقاله قصد داریم ببینیم که با پیروی کردن از چه نقشه‌ٔ راهی می‌توان موفقیت دوره‌های آموزش برنامه‌نویسی را دوچندان کرد.

پیش از شروع بحث، توصیه می‌کنیم به دیگر مقالات مرتبط با مقولهٔ #آموزش کدنویسی مراجعه نمایید که برخی از مهم‌ترین آن‌ها عبارتند از:

آشنایی با رویکرد Inductive (از جزء به کل) در یادگیری برنامه‌نویسی
آشنایی با رویکرد Deductive (از کل به جزء) در یادگیری برنامه‌نویسی
Teaching Is Leaning: با آموزش برنامه‌نویسی مهارت‌های کدنویسی خود را ارتقاء بخشید‍
Roadmap پنج مرحله‌ای برای تبدیل شدن به یک وب دولوپر حرفه‌ای

یادگیری اصول پایه‌‌ای در برنامه‌نویسی
برخی افراد، من‌جمله کسانی که به روش آموزشی به اصطلاح Deductive باور دارند، معتقدند که آموزش برنامه‌نویسی به مبتدیان را باید از یک فریمورک آغاز کرد اما این در حالی است که یادگیری کار با لایبرری‌ها و فریمورک‌های سطح بالا برای افراد مبتدی همچون این است که بخواهیم به فردی که چیزی از رانندگی نمی‌داند و حتی تفاوت کلاج و ترمز را متوجه نیست، با یک ماشین مختص مسابقۀ رالی آموزش رانندگی بدهیم و از او بخواهیم که سرعت زیاد ماشین را کنترل کند!

یک فرد تازه‌کار نیز ابتدا باید اصول برنامه‌نویسی را درک کرده و قبل از شروع به کدنویسی با برخی اِلِمان‌های پایه‌ای آن آشنا شود؛ همچنین افراد تازه‌کار با مفاهیمی مانند فانکشن، متغیر، دستورهای شرطی و حلقه‌ها کاملاً بیگانه هستند و این در حالی است که این چهار اِلِمان پایه و اساس برنامه‌نویسی را تشکیل می‌دهند و همه‌چیز در برنامه‌نویسی بر آن‌ها متکی است و از همین روی یادگیری این مفاهیم برای کدآموزان بسیار حائز اهمیت است چرا که با یادگیری اصولی از این دست، راه برای تبدیل شدن به یک برنامه‌نویس ماهر برایشان هموار خواهد شد و چنانچه فردی با مفاهیم پایه‌ای برنامه‌نویسی آشنایی نداشته باشد، در ادامهٔ راه و در مواجهه با مفاهیم پیچیده‌تر دچار سردرگمی و ناامیدی خواهد شد.

از همین روی، مدرسین و منتورهای کدنویسی بایستی بیشتر وقت خود را بر آموزش مبانی پایه در برنامه‌نویسی قرار دهند؛ اما متأسفانه می‌بینیم که برخی از فعالان آموزشی این صنعت از این مرحله به سرعت عبور می‌کنند. در واقع، مشکل اینجا است که برخی از معلمان نمی‌توانند خود را به جای دانشجو قرار دهند چرا که ایشان سالیان زیادی است برنامه‌نویسی می‌کنند و به احتمال زیاد فراموش کرده‌اند که یک فرد مبتدی در حال حاضر با چه مشکلاتی می‌تواند روبه‌رو باشد (برای مثال، فردی را در نظر بگیرید که یک رانندهٔ حرفه‌ای است و به صورت ناخودآگاه کلاچ/ترمز می‌کند به طوری که حتی نمی‌تواند تصورش را هم بکند که کسی قبل از گذاشتن پا بر روی ترمز، نیاز به فکر کردن داشته باشد.)

جان کلامم و به عنوان یک کلید طلایی، یادگیری اصول پایه‌ای برنامه‌نویسی بسیار مهم بوده و تا زمانی که کدآموزان و دولوپرهای تازه‌کار اصول پایه را به طور کامل یاد نگرفته‌اند، نباید از این مرحله عبور کرد.

آشنایی با لایبرری‌ها، فریمورک‌ها و نحوۀ کار با آن‌ها
دانشجویان پس از مدتی کدنویسیِ به اصطلاح Pure با یک زبان، بایستی نحوۀ کار با لایبرری‌ها و فریمورک‌ها را بیاموزند. ماژول‌ها و دیزاین پترن‌هایی که اکثر برنامه‌نویسان در فرآیند توسعۀ یک اپلیکیشن به کار می‌گیرند، در قالب یکسری لایبرری و فریمورک در اختیار ایشان قرار می‌گیرد و استفاده از لایبرری و فریمورک‌ها در کدنویسی بیش از آنکه یک نوع الگوی برنامه‌نویسی باشد، یک طرز تفکر برای دولوپرها است. در حقیقت، دولوپر ماهر کسی است که لایبرری مناسب برای تَسک مد نظر خود را می‌شناسد و به جای ساعت‌ها صرف زمان برای نوشتن چند صد خط کدی که احتمال وجود باگ هم در آن‌ها هست، شروع به استفاده از یک لایبرری، فریمورک و یا پلاگین معتبر می‌کند.

پس از درک اهمیت لایبرری‌ها در کدنویسی، حال کدآموزان در درک میزان اهمیت فریمورک‌ها مشکلی نخواهند داشت اما بسته به زمانی که برای آموزش اختصاص یافته است، ممکن است اختصاص زمان برای آموزش فریمورک‌ها به دانشجویان کمی سخت باشد؛ اما همان‌طور که قبلاً اشاره شد، مهم‌ترین نکته این است که بایستی ذهنیت دانشجو را از لزوم کدنویسی از صفر و به قول معروف اختراع مجدد چرخ، به جستجو و استفاده از لایبرری‌ها برای پیاده‌سازی بخش‌های مختلف پروژه‌های نرم‌افزاری تغییر داد.

به طور کلی، گرچه معرفی ابزارهای مورد نیاز برای کدنویسی در این مقاله نمی‌گنجد و این در حالی است که فقط دولوپرهای باتجربه از آن‌ها استفاده می‌کنند، اما دانشجویان در مراحل اولیهٔ برنامه‌نویسی نیازی به یادگیری نحوهٔ به‌کارگیری و کانفیگ این ابزارها ندارند و توصیه می‌شود که بیشتر زمان خود را روی یادگیری مباحث اصلی‌تر بگذارند.

استفاده از تجربیات یک معلم/منتور برای یادگیری
فرض کنید فردی هستید که علاقمند به موسیقی و نواختن ساز پیانو هستید اما نمی‌خواهید برای یادگیری این مهارت هزینه کرده و از یک معلم باسابقه کمک بگیرید و پس از صرف چیزی حدود پنج سال برای پیشرفت در این حوزه، با یک معلم حرفه‌ای مشورت می‌کنید و اینجا است متوجه خواهید شد که در طی یک ماه کار با وی به اندازۀ پنج سال یا حتی بیشتر نکته، ترفند و ریزه‌ٔکاری آموخته‌اید.

در پاسخ به این سؤال که در پروسهٔ یادگیری یک مهارت جدید چرا باید یک معلمی داشته باشیم که در نهایت تبدیل به یک منتور شود، باید گفت که یک معلم (یا راهنما) می‌تواند خطاهای چیزی که در حال یادگیری آن هستید، مثلاً نوازندگی در مثال قبل، را مشاهده کرده و آن‌ها را برای شما چنان تفسیر کند که هرگز تصورش را نمی‌کردید! علاوه بر این، یک معلم، مثلاً در حوزهٔ موسیقی، می‌تواند ذهنیت موسیقیایی و هنری را در شما تقویت کند که ممکن است به عنوان یک فرد معمولی، هیچ آگاهی از آن نداشته باشید.

همین مسئله در حوزۀ برنامه‌نویسی نیز صادق است و اگر کسی تجربه‌ای در برنامه‌نویسی نداشته باشد، خودآموزی صِرف یک ایدۀ بَد برای یادگیری برنامه‌نویسی است (به واژهٔ صِرف خوب دقت کنید به طوری که هرگز نگفتیم خودآموزی بَد است؛ بلکه به اعتقاد ما خودآموزی صِرف کار به جایی نمی‌برد و شاهد این ادعا هم تعداد قابل‌توجهی از دولوپرهای حرفه‌ای سراسر دنیا که به صورت خودآموز و بدون داشتن تحصیلات آکادمیک وارد صنعت توسعهٔ نرم‌افزار شده‌اند.)

در چنین موقعیت‌هایی، استفاده از تجربیات یک معلم برای فرد مفید خواهد بود چرا که در ابتدا وی یکسری اصول را برای آموزش بیان می‌کند که دانشجو بایستی کورکورانه از آن‌ها پیروی کند (البته می‌توان دلایل وضع چنین اصولی را برای دانشجو توضیح داد) اما معمولاً این‌گونه استدلال‌ها فراتر از درک وی خواهند بود! همچنین فرآیند آموزش نباید به نحوی باشد که صرفاً معلم یکسری مفاهیم را به دانشجو آموزش داده و فقط وی مُتکلم‌وَحده (سخنگو) باشد؛ بلکه تعامل دوجانبه در پروسهٔ یادگیری و آموزش بسیار مهم است و مهارت سؤال پرسیدن و از آن مهم‌تر، خوب سؤال پرسیدن را باید به دانشجوی خود آموخت. پس از گذراندن این مراحل و زمانی که دانشجو به سطح معینی از تسلط رسید، باید او را تشویق به کشف مفاهیم جدید در حوزۀ کاری خود کرد به طوری که در این سطح معلم تبدیل به یک مربی/منتور خواهد شد که با دانشجوی خود «خِرد» را به اشتراک می‌گذارد و با او به بحث و تبادل نظر خواهد پرداخت.

ایجاد چالش و انگیزه در دانشجویان
در این مرحله بایستی منتور (معلم) یک تمرین سخت و به قولی غیرمعقول برای دانشجویان تعیین کند! انجام چنین تمرین‌هایی برای افراد مبتدی تقریباً غیرممکن است و دانشجویان تصور می‌کنند که با یک مسئلۀ غیرقابل‌حل روبه‌رو هستند. نیاز به توضیح نیست که بدون شک منتور از عدم توانایی دانشجویان خود برای انجام چنین تمرینی آگاه است و این تمرین را صرفاً برای افزایش انگیزهٔ آن‌ها از یکسو و همچنین از بین بردن اعتماد به نفس کاذب ایشان از سوی دیگر تعریف می‌کند. در واقع، هدف اصلی از این دست تمارین ایجاد سرگرمی برای دانشجویان نیست بلکه حل آن نیاز به استفاده از یکسری تکنیک خاص دارد که دانشجویان ضمن انجام تمرین، مفهوم آن تکنیک را تا حد ممکن درک خواهند کرد.

داشتن انگیزه برای یادگیری یک مهارت ضروری است، اما باید توجه داشت که نباید محتوای آموزشی نادیده گرفته شود. به عنوان مثال، برنامه‌نویسی کار آسانی نیست و اگر کدآموز انگیزهٔ درونی برای یادگیری نداشته باشد، حاضر به شب‌نخوابی کشیدن برای یافتن یک باگ نبوده و خیلی علاقه‌ای به آپدیت کردن اطلاعات قدیمی خود نداشته باشد، به نظر می‌رسد که ورود به حوزهٔ توسعهٔ نرم‌افزار و برنامه‌نویسی انتخاب عاقلانه‌ای برایش نباشد!

افراد تازه‌کار باید بدانند که تبدیل شدن به یک دولوپر حرفه‌ای به چه معنا است و قبل از اینکه شروع به یادگیری برنامه‌نویسی کنند، بایستی بدانند که در راه تبدیل شدن به یک برنامه‌نویس حرفه‌ای و حتی پس از آن، چه کارهایی را باید انجام دهند. به عبارتی، افراد تازه‌کار بایستی برای برنامه‌نویسی در دنیای واقعی #کسب‌وکار آماده شوند.

سخن پایانی
گرچه چیزی که قصد داریم بیان کنیم به عنوان سخن پایانی در انتهای مقاله ذکر شده است، اما هرگز چیزی از اهمیتش کاسته نمی‌شود. به عنوان یک قانون کلی، هرگز نمی‌توان انتظار داشت که طی چند هفته، چند ماه و یا حتی یک الی دو سال به یک برنامه‌نویس حرفه‌ای تبدیل شد و این امر نیاز به صرف زمان و حوصله دارد! بنابراین منتورها نباید در فرآیند آموزش عجله کرده و یا وعده‌های دروغین به دانشجویان خود دهند؛ بلکه بایستی تمرکز خود را بر این نکته بگذارند که تا چه اندازه دانشجویان مفاهیم برنامه‌نویسی را درک کرده‌اند و متناسب با سیر پیشرفت آن‌ها، چالش‌ها و مسائل پیچیده‌تری را بر سر راه یادگیری ایشان بگذارند و به مرور منحی یادگیری ایشان را پُرشیب‌تر نمایند.

حال نوبت به نظرات شما می‌رسد. به نظر شما برای آموزش مهارت به نسبت دشواری همچون کدنویسی، از چه سیاست‌هایی باید پیروی کنیم تا بهترین نتیجهٔ ممکن را، هم برای خود و هم برای دولوپرهای تازه‌کار، به دست آوریم؟ نظرات، دیدگاه‌ها و تجربیات خود را با دیگر کاربران سکان آکادمی به اشتراک بگذارید.

منبع