نکاتی پیرامون فراگیری مهارت برنامه نویسی – پادکست پرسش و پاسخ


پرسشی که برای بسیاری از افراد علاقهمند به فراگیری مهارت برنامه نویسی مطرح میشود، آن است که چگونه باید برنامهنویسی را بیاموزند و چه پیشنیازهایی برای یادگیری این مهارت لازم است. دکتر «سید مصطفی کلامی هریس»، در پادکستی که در ادامه آمده، به این پرسش به طور مشروح پاسخ داده است. نسخه متنی این پادکست نیز در همین مطلب قرار دارد. البته، منبع اصلی همچنان فایل صوتی محسوب میشود.
پادکست پیرامون فراگیری مهارت برنامه نویسی
ذخیره کردن این فایل صوتی: لینک دانلود
نسخه نوشتاری
یکی از شایعترین سوالاتی که افراد گوناگون مطرح میکنند، پیرامون روش فراگیری مهارت برنامه نویسی است. پرسشهایی با این مفهوم به طور مکرر توسط علاقهمندان به فراگیری مهارت برنامه نویسی، دانشجویان و افراد جویای کار پرسیده میشود.
این موضوع نیازمند بحثهای گستردهای است و از این رو، در وبلاگ فرادرس طی مطالب جداگانهای به آنها پرداخته شده است. در این راستا، مطالعه مطالب زیر توصیه میشوند.
- برنامه نویسی چیست ؟ — از شروع یادگیری تا کسب درآمد
- چگونه برنامه نویس شویم ؟ — راهنمای شروع و موفقیت در برنامه نویسی
- چطور برنامهنویس شویم؟ — راهنمای عملی ورود به دنیای برنامهنویسی
- پاسخ پرسشهای رایج در خصوص برنامهنویسی
- ده زبان برنامهنویسی که باید در سال ۱۳۹۸ یاد بگیرید
- زبانهای برنامهنویسی که نباید در سال ۲۰۱۹ بیاموزید
در این مطلب، یک جمعبندی در این رابطه توسط دکتر «سید مصطفی کلامی هریس» ارائه شده است که طی آن، دغدغههای افراد پیرامون چگونگی فراگیری مهارت برنامهنویسی مورد بررسی قرار گرفتهاند.
چالشهای مهم در مسیر فراگیری مهارت برنامه نویسی
متاسفانه، در حال حاضر در کشور در آموزش چند چیز مشکل اساسی وجود دارد که این موارد از یک منظر خیلی شبیه به هم هستند. یکی از این موارد که برای بسیاری از افراد ملموس است و خیلی جنبه عمومی دارد، آموزش زبان خارجی و به ویژه زبان انگلیسی است. آموزش زبان انگلیسی در دوره راهنمایی، دبیرستان و دانشگاه تدریس میشود.
آموزشگاههای خصوصی بسیاری نیز به آموزش زبان انگلیسی میپردازند. ولی با این وجود، همچنان بسیاری از فراگیران به دانش قابل توجهی از زبان انگلیسی دست پیدا نمیکنند. متاسفانه، حتی بسیاری از دانشجویان مقاطع تحصیلات تکمیلی شامل فوق لیسانس و دکترا نیز در بحث زبان مشکل دارند.
یک مساله انکار ناپذیر پیرامون برنامهنویسی نیز همین موضوع است. مشکل مشابهی در مورد آموزش ریاضیات نیز وجود دارد. نکته جالب آن است که همه این موارد ماهیت بسیار شبیه به یکدیگری دارند. به طور خاص، آموزش برنامهنویسی و زبان خارجی شباهت بسیار زیادی به هم دارند. برای هر دو مورد مذکور، فرد باید مفهومی که در ذهن خود دارد را به زبان دیگری ترجمه کند. حال، اگر این زبان یک زبان کامپیوتری، یعنی زبانی بین انسان و کامپیوتر یا همان زبان برنامهنویسی باشد، میشود برنامهنویسی و اگر زبان خارجی باشد، نوشتار یا گفتار به زبان دیگر میشود . این موضوعی است که این موارد را خیلی به یکدیگر مرتبط میکند. جالبتر آنکه روشهای مورد استفاده برای آموزش این موارد (یعنی برنامهنویسی و زبان خارجی) نیز میتوانند مانند هم باشند.
شرایطی مفروض است که ضمن آن، فرد در محیطی قرار میگیرد که نیاز به استفاده از یک زبان خارجی داشته باشد. طبیعتا سرعت یادگیری در چنین شرایطی افزایش پیدا میکند. معمولا در مورد برنامهنویسی نمیتوان به راحتی چنین شرایطی را فراهم کرد. در واقع، برای فراگیری یک زبان خارجی مثلا میتوان فرد را در معرض شنیدن آن زبان و یا گروهی از افراد قرار داد که با هم به آن زبان صحبت میکنند. اما در مورد کامپیوترها چطور، آیا چنین چیزی امکان دارد؟ حقیقت این است که باید به عنوان یک ابزار حتما به برنامهنویسی اتکا داشته باشیم؛ حتی اگر چیزی با یک کاغذ و قلم نیز حل میشود، گاهی باید سعی کرد که برای آن برنامه نوشت؛ این یک تمرین سخت است. در واقع، این کار مانند آن است که فرد به پاهای خودش وزنه ببندد و بپرد یا بدود. یعنی کاری را که میتوان به راحتی انجام داد، با روش سختتر حل کرد. اینها تمرینات سختی هستند، اما برای مثال در مورد برنامهنویسی چون هدف ورزیده کردن مغز و این است که فرد به طور ناخودآگاه بتواند مانند کامپیوتر فکر کند، پس تمرینات مفیدی هستند و کمک میکنند تا فرد مانند کامپیوتر فکر کند.
فرد نمیتواند مهارت برنامهنویسی را فرا بگیرد مگر آنکه تمرین و تکرار زیاد داشته باشد. در واقع باید گفت که: «برای فراگیری برنامهنویسی، باید برنامه بنویسید».شاید در این گفته کمی تناقض وجود داشته باشد زیرا کسی که برنامهنویسی را به خوبی بلد نیست، نمیداند چه کاری انجام دهد. در واقع منظور از آنچه گفته شد این است که فرد هر آنچه را یاد میگیرد، مثلا یک دستور و یا یک ساختار، بلافاصله از آن در چندین مساله استفاده کند. همین سبک در آموزشهای برنامهنویسی دکتر کلامی که در فرادرس موجود هستند، رعایت شده است.
یعنی برای مثال، مدرس در مورد شرط if، حلقه for و هر مورد دیگری که صحبت میکند، بلافاصله برای آنچه بیان شده چندین مثال نیز ارائه میکند. به کار بردن آنچه فرد آموخته در برنامههای واقعی، باعث میشود تا به طور کامل بر آن مبحث مسلط شود. عدم استفاده از آنچه فرد آموخته در پروژههای عملی، مانع از آن میشود که به خوبی در ناخودآگاه فرد این موضوع هک شود. در ضمن، خیلی از مسائل وجود دارد که اگر حل شوند، در آینده میتوان از نتایج آنها استفاده کرد و سریعتر به حل مسائل پرداخت. این یک موضوع بود و موضوع دیگری که در این رابطه وجود دارد آن است که فرد به بینش برنامهنویسی نیاز دارد. یعنی این که فرد چه زبان برنامهنویسی را استفاده میکند، خیلی ارتباطی با اینکه چطور برنامهنویسی است ندارد.
یادگیری مفاهیم برنامهنویسی، به جای نحو یک زبان
زبانهای گوناگونی مانند سیشارپ، جاوا، ویژوالبیسیک و بسیاری از دیگر موارد برای شروع برنامهنویسی وجود دارد. اما آنچه از مهم است، استعداد برنامهنویسی مستقل از زبان برنامهنویسی است. به عبارت دیگر، کسی که سخنور یا نویسنده خوبی است، اگر به یک زبان زنده جدید نیز مسلط بشود، به احتمال زیاد در آن زبان جدید هم میتواند مهارت خود را به نمایش بگذارد.
حال اگر نمیتواند مهارت خود را در زبان جدید به نمایش بگذارد، یک قضیه ذهنی نیست و اتفاقا یک قضیه مهارتی است و فرد فقط در استفاده از آن زبان ناکام است. این قضیه در مورد زبانهای برنامهنویسی خیلی سریع انجام میشود. فرض میشود که شخصی یک زبان برنامهنویسی ـ مثلا جاوا ـ را یاد گرفته است. بنابراین، فراگیری سیشارپ برای او بیش از چهار الی پنج روز کار ندارد. حقیقتا به این شکل است و این موضوع را باید در نظر گرفت که مهارت برنامهنویسی باید کاملا مستقل از زبان برنامهنویسی توسعه پیدا کند. البته، یک سری از زبانها هستند که فراگیری آنها راحتتر و سادهتر است.
مثلا، به کسی که برای اولین بار قصد فراگیری برنامهنویسی را دارد، پیشنهاد نمیشود که با «سیپلاسپلاس» (C++)، فراگیری را شروع کند. اولین زبان فرد میتواند «ویژوالبیسیک» (Visual Basic)، «متلب» (MATLAB)، «جاوا» (Java)، «سیشارپ» (C#) یا «جاوا اسکریپت» (Java Script) باشد. هر یک از اینها، زبانهای نسبتا ساده و روانی هستند؛ ولی مثلا شروع فراگیری مهارت برنامهنویسی با «سیپلاسپلاس» (++C) توصیه نمیشود که دارای مفاهیم پیچیده و در واقع یک زبان حرفهای است. «زبان برنامهنویسی پایتون» (Python Programming Language) نیز زبان خوبی است. برای آغاز فراگیری مهارت برنامهنویسی، خیلی از زبانهای مدرن نیز زبانهای ساده و مناسبی هستند.
موضوع دیگری که وجود دارد این است که افراد بدون آنکه به فکر استفاده از نکات و مهارتهایی که آموختهاند باشند، یک کتاب یا یک دوره کامل را میگذرانند؛ بدون آنکه پروژهای در این میان انجام دهند. در این شرایط، آموزشها هر چقدر هم کامل باشند، بهترین استاد برنامهنویسی دنیا نیز که مدرس آن باشد، تا هنگامی که فرد از آموختههای خودش استفاده نکند، اتفاق خاصی نخواهد افتاد. یک موضوع دیگر که باید به آن توجه داشت این است که هیچ وقت، هیچ برنامهنویسی از یاد گرفتن بینیاز نیست؛ حتی اگر ده یا بیست سال هم برنامه نویس حرفهای باشد، هنوز هم چیزهایی برای یاد گرفتن وجود دارد. این یعنی نباید زود از آموزش و یادگیری خسته شد. شایان ذکر است که افراد در صورتی که مباحث جدید متعددی را آموختهاند و همچنان با مباحث زیادی مواجه هستند که فرا نگرفتهاند، نباید ناامید یا دلسرد شوند. حتی اساتید برنامهنویسی و توسعهدهندگان فولاستک نیز هنوز با مباحث زیادی مواجه هستند که باید آنها را یاد بگیرند. اینها مسائل کلی است که در این حوزه وجود دارد.
پیشنیازهای مهم فراگیری مهارت برنامه نویسی
از نظر پیشنیازهای لازم برای برنامهنویسی، اکیدا توصیه میشود که افراد مهارتهای ریاضی خود را حتما توسعه دهند. در مطلب «ریاضیات لازم برای برنامه نویسی — پادکست پرسش و پاسخ» به طور کامل به این موضوع پرداخته شده است.
متاسفانه در این موضوع، مشکلات زیادی وجود دارد. خود درس ریاضی یکی از معضلات آموزشی است؛ همچنین زبان انگلیسی. حتی زبان انگلیسی به مراتب مهمتر از بحث ریاضی است و افراد تا هنگامی که نتوانند یک متن انگلیسی را به خوبی بخوانند و تسلط کافی به زبان انگلیسی نداشته باشند، واقعا کار سختی را در پیش رو خواهند داشت. یادگیری برنامهنویسی بدون تسلط کافی به زبان انگلیسی غیر ممکن نیست، اما برای برنامهنویس خوبی شدن راه سختی را پیش پای فرد میگذارد. بنابراین، باید بحث زبان انگلیسی و ریاضیات را بسیار جدی گرفت.
برای مثال، در دوره آموزشی جاوا چند مثال ریاضی ارائه شده است و یکی از دلایل آن این است که علاوه بر رشته کامپیوتر، دانشجویانی از دیگر رشتهها نیز از این آموزش استفاده میکنند و به چنین مواردی نیاز زیادی دارند. مثلا بعضی وقتها نقد میشود که چرا «الگوریتم نیوتن رافسون» (Newton Raphson) در این دوره پیادهسازی شده است و یا اصلا چه استفادهای دارد. همین تفکر، اشتباه است. قرار نیست در کشور فقط برنامه حسابداری، مدیریت آژانس و مدیریت رستوران یا چنین چیزهایی نوشته شوند. البته آنها نیز از مفاهیم ریاضی استفاده میکنند؛ ولی گاهی نیاز است که محاسبات مالی، محاسبه قسط وام، محاسبه یک مدار الکتریکی انجام شود. چرا در کشور مهندسین کامپیوتری که بتوانند خیلی خوب و راحت چنین مباحث علمی را درک و پیاده کنند نداریم؟ «نداریم» شاید جمله خیلی تیزی باشد، ولی به قدری کم هستند که واقعا به جرات باید گفت نداریم. واقعا نداریم؛ فقیریم. چرا برنامهنویسی و سبک برنامهنویسی مورد استفاده در کشور انقدر قدیمی است و مثلا اثری از هوش مصنوعی به ندرت در بین برنامهها و محصولات نرمافزاری ساخت کشور مشاهده میشود.
دلیل این امر آن است که در نظام آموزشی موجود، فقط یک زبان برنامهنویسی شامل ساختارها، شیگرایی و دیگر مباحث آموزش داده میشود ولی به ندرت مورد استفاده قرار میگیرد. معمولا به وصل شدن به یک «پایگاه داده» (Data Base) و پر و خالی کردن چند جدول بسنده میشود. این چیزی است که از آن در اینجا به عنوان مهندسی نرمافزار یاد میشود. این درست نیست و چیزی هم نیست که فرد بخواهد به آن اتکا کند و محصولات در مرز دانشی ارائه شود. این روند، مسیر غلطی است که اگر قرار بود جوابگو باشد، ایران اکنون باید مثل هندوستان و بسیاری از دیگر کشورهای هم رده میتوانست سهم مناسبی را در بازار نرمافزار داشته باشد که ندارد. متاسفانه حتی در برآورده کردن نیاز داخلی نیز ناتوانی وجود دارد.
بسیاری از نیازها در این کشور به صورت ذاتی امکان برآورده شدن را ندارند. خیلی از شرکتها و صنایع دچار این مشکل هستند؛ برای مثال برنامهای که در بانکها مورد استفاده قرار میگیرد، چه نسخه آنلاین و چه نسخه آفلاین که در دستگاه خودپرداز و پوز وجود دارد، از نقطه ضعفهای زیادی رنج میبرند. در این زمینه مشکلات جدی وجود دارد و دلیل آن هم این است که نگاه علمی در ساخت آنها وجود ندارد. حتی جایی که نگاه علمی ضرورت داشته است نیز به روی آن چشم بسته شده است. یک جاهایی هست که اساسا اگر نگاه علمی وجود نداشته باشد، نمیتواند محصولی شکل بگیرید. نگاه ریاضی و نگاه از منظر هوش مصنوعی خیلی مهم است و باید آنها را جدی گرفت؛ به ویژه ریاضیات.
منظور از آنچه گفته شد این نیست که فرد مانند یک ریاضیدان ریاضیات را درک کند، ولی کسی که میخواهد دنبال برنامهنویسی باشد واقعا باید بتواند درک ریاضی درستی داشته باشد. مفاهیم ریاضی را که اتفاقا خیلی هم ساده هستند به درستی درک و پیادهسازی کند. یکی از چیزهایی که برای تقویت این موضوع به ویژه در افراد کم سن و سال استفاده میشود، «اکسل» (Excel) و در واقع «صفحه گستردهها» (Spreadsheet) هستند. صفحات گسترده ساختار خیلی منظمی دارند، سازمان یافتهاند، به ذهن فرد نظم میدهند و تمرینهای خوبی هستند. این برنامهها را نباید دستکم گرفت و پیشنهاد میشود که به ویژه افراد کم سن و سال از این ابزارها استفاده کنند. قابل توجه است که یک فرد هشت، ده یا دوازده ساله میتواند به خوبی برنامهنویسی را یاد بگیرد. یکی از ابزارهایی که میتواند برای تقویت مهارتهای ریاضی یک نوجوان یا کودک مورد استفاده قرار بگیرد، همین صفحه گستردهها هستند.
برای افراد بزرگسال نیز این موضوع صادق است. یعنی کاربر خیلی وقتها میتواند مساله را به چند مسأله ریزتر بشکند و محاسبات را به شکل بهتر و مناسبتری انجام دهد. سپس، با گذشت مدتی زمان، این مهارت را بعد از مدتی به صورت ذهنی جلو ببرد. این مهارت ریاضی واقعا خیلی اهمیت دارد و گاهی وقتها مشاهده میشود که افراد با مفاهیم برنامهنویسی یا خواندن الگوریتمها مشکل ندارند، بلکه نمیتوانند به صورت ریاضی مساله را توصیف کنند یا توصیف ریاضی یک مساله را به درستی درک کنند.
یادگیری، مسیری تا همیشه
موضوع دیگری که باید به آن توجه داشت این است که هیچ کتاب، دوره آموزشی و یا استادی برای کاملا آگاه کردن فرد کافی نیست و فرد همیشه به یادگیری نیاز خواهد داشت. پیش از این نیز بیان شده است که فرد به طور دائم به مطالعه نیاز دارد.
خوشبختانه، در حال حاضر منابع زیادی وجود دارند که میتوان از آنها برای یادگیری و به روز رسانی اطلاعات استفاده کرد که «استک اورفلو» (Stack Overflow) و «استک اکسچنج» (Stack Exchange) از این جمله هستند. چنین سایتهای پرسش و پاسخی، منابعی غنی از تجارب هستند؛ تجربیاتی که افراد در اختیار سایرین قرار میدهند. پروژهای مختلف «متنباز» (Open Source) که در سایتهای مختلف به اشتراک گذاشته شدهاند نیز منابعی محسوب میشوند که درسهایی برای ارائه کردن دارند که اصطلاحا در هیچ دفتری نیست و واقعا این منابع را نباید دستکم گرفت.
خواندن کد منبع برنامههای گوناگون درسهای بسیاری دارد که نمیتوان هیچ استادی برای آن یافت. با خواندن کد منبع و بررسی سایتهای پرسش و پاسخ، فرد چیزهایی را میآموزد که امکان نداشت در هیچ کتابی به آنها برسد. بنابراین، اساسا توصیه میشود که افراد زبان و ریاضیات را تقویت کرده، این سایتها را دنبال کنند و مطالعه مستمر نیز داشته باشند. پس از اینکه فرد این لوازم را در واقع درون یک قابلمه ریخت، تمرین کردن را میتوان به عنوان جوشاندن و پختن این مواد اولیه در نظر گرفت. فرد چارهای جز این ندارد که از برنامه خود نتیجه بگیرد. این موضوعی است که متاسفانه خیلی از افراد پشتکار لازم را برای آن ندارند یا موضوع را خیلی سخت میگیرند؛ فکر میکنند که نمیتوانند مسألهای را حل کنند، زود دست میکشند و ناامید میشوند. برخی افراد هم کار را خیلی سهل میگیرند.
از طرف دیگر نیز برخی از افراد فکر میکنند که با خواندن یک کتاب کار تمام است و باید برنامهنویس شده باشند و هر کاری را بتوانند انجام دهند. اما پای عمل که میآیند میببینند که دچار مشکل شدهاند. همه این مشکلات با استفاده از روش کلی گفته شده قابل رفع هستند و هیچ ارتباطی به سن و سال هم ندارند. به نظر من، فردی که پنجاه سال سن دارد نیز میتواند برنامهنویسی را به خوبی یاد بگیرید. اساسا و از نظر تئوری هر کسی که امکان صحبت کردن دارد میتواند برنامهنویس هم بشود.
حال این بدان معنا نیست که فرد الزاما برنامهنویس قهاری میشود، این را نمیتوان با اطمینان گفت؛ ولی میتواند برنامهنویسی کند و حتی اگر برنامهنویس خوبی هم نباشد ولی میتواند اصطلاحا گلیم خودش را از آب بیرون بکشد. هر انسانی که میتواند صحبت کند (صحبت کردن صرفا به معنی تکلم نیست و شامل نوشتار نیز میشود؛ یعنی کسی که میتواند خودش را توصیف و مفهوم را در قالب زبان بیان منتقل کند، میتواند به زبان کامپیوتر نیز مسلط شود. حالا خب همه میتوانند حرف بزنند ولی الزاما همه سخنوران خوب و قابلی نیستند. همانطور که شخصی نسبت به مردم عادی نویسنده قهار و دیگری سخنران خیلی خوبی است، یک برنامهنویس خوب نیز نسبت به یک برنامهنویس معمولی اینچنین است.
افراد باید به اندازه کافی مطالعه کنند، مثل نویسندهای که آثار مختلفی را میخواند و از آنها ایده میگیرد. باید به اندازه کافی تمرین و تکرار داشته باشند، مثل یک نویسنده که مطالب زیادی را مینویسد و بعد یکباره همه آنها را پاره میکند و دوباره مینویسد. این خیلی مهم است که افراد هیچ وقت فکر نکنند که این روند آموزشی تمام میشود. من خودم هم در حال یادگیری برنامهنویسی هستم؛ یعنی هیچ کس برنامهنویس کاملی نیست که از یادگیری بینیاز باشد.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش اصول و مبانی برنامهنویسی
- آموزش برنامهنویسی جاوا
- مجموعه آموزشهای ریاضیات
- چطور برنامهنویس شویم؟ — راهنمای عملی ورود به دنیای برنامهنویسی
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
^^