در این نوشته قصد دارم تا درباره یادگیری برنامهنویسی توضیح بدم. این مطلب مناسب افرادی ست که قصد شروع به برنامه نویسی رو دارند یا تازه شروع کردند و قصد دارند تا مهارتشون رو بالا ببرند.
من محمد ایرجی هستم. کار حرفهای خودم رو در سال هشتاد و شش به عنوان طراح بازی(کسی که قوانین بازی رو طراحی میکنه) برای بازی آنلاین «آسماندژ» شروع کردم. بعد از مدتی احساس کردم که طراحی بازی به تنهایی برام کافی نیست. نمیتونستم چیزهایی که میخوام رو بسازم یا در درک قابلیت پیادهسازی یک ایده دچار تردید بودم. این شد که از محل کارم اومدم بیرون، نشستم پای کامپیوتر و تو گوگل تایپ کردم: " How to start programming?". البته به همین راحتی نبود. به عنوان یه برنامه نویس خودآموز راه خیلی سختی رو گذروندم. بعد از مدتی دوباره رفتم دانشگاه اما اونجا هم چیز زیادی برای یادگیری وجود نداشت. پس بیشتر روی مطالعه فردی و استفاده از منابع روی اینترنت تمرکز کردم. بیش از هشت سال از روزی که شروع کردم میگذره و تا الان روی محصولات زیادی به عنوان برنامهنویس، مدیر فنی و مدیر محصول کار کردم. بعضی روزها هم در انیستیتو ملی بازیسازی برنامهنویسی تدریس میکنم. هدفم از نوشتن این مطلب هم به اشتراک گذاری تجربههای سخت هست تا راه برای بقیه سادهتر بشه.
اولین چالش کسی که شروع به برنامهنویسی میکنه انتخاب زبان برنامهنویسی هست. خیلیها هم بر سر این میجنگند که فلان زبان برای شروع بهترین گزینه است. به نظرم بهترین زبان به انتخاب کسی هست که شروع میکنه! باید امتحان کنید تا ببینید کدوم محیط و کدوم روش بیان موضوع براتون قابل فهمتر هست.
بهش مثل یاد گرفتن یک زبان خارجی نگاه کنید. مفهومها (مثل شادی و غم) به دور از زبان ثابت هستند و فقط نحوه بیانشون در زبانها متفاوته. پس برای شروع خیلی نگران زبان نباشید. حتی اگر هیچ پیشزمینهای در برنامهنویسی ندارید میتونید از زبانهای تصویری (Visual programming) استفاده کنید. سایت code.org برنامهنویسی رو به صورت کاملاً بصری آموزش میده شاید به نظر بیاد، بیشتر برای نوجوانها و بچهها مناسبه اما برای درک مطلب برای کسی که تازه شروع به برنامهنویسی کرده، میتونه مفید باشه.
برای انتخاب زبان چند تا پیشنهاد دارم که شاید براتون مفید باشه. تفاوت عمده زبانها به نحوه نوشتار (Syntax) آنها بر میگرده. عمده زبانهای رایج از لحاظ نوشتاری مثل زبان C هستند. یعنی اگر زبانی که مثل C هست رو یاد بگیرید راحتتر میتونید زبانهای دیگه (مثل: C#, Java, C++, Go) رو بخونید و یاد بگیرید. بعضی برای شروع زبان Python رو پیشنهاد یا انتخاب میکنند. هر چند برای شروع زبان خوب و راحتیه اما نوشتارش با زبانهای رایج متفاوته و یادگیری زبانهای شبیه به C که محبوبتر و پرکاربردتر هستند رو در قدمهای بعدی شاید سختتر کنه اما باز انتخاب با خودتونه، در قدم اول یادگیری مفاهیم مهم هستند.
در شروع هدفتون رو مشخص کنید. برای چی میخواهید برنامهنویسی یاد بگیرید؟ برای شغل آینده؟ برای درست کردن برنامه موبایل؟ برای تولید بازی؟ یا از کاری که کارمندهاتون یا بقیه اعضای تیم انجام میدن درک بهتری داشته باشید؟ یا بهش به عنوان یه ابزار برای انجام راحتتر کارهاتون فکر میکنید؟ یا حتی فراتر از اینها، به یادگیری روش فکر کردن برای به دست آوردن دید متفاوتی به زندگی جهت حل مسائل فکر میکنید؟ تمام اینها به انتخاب منابع یادگیری که قدم بعدی هست کمک شایانی میکنه.
خوشبختانه در عصر دسترسی آزاد به اطلاعات و منابع آموزشی زندگی میکنیم. منابعی که هر سال زیادتر و با کیفیت بیشتری تولید میشن. همچنین بسیاری از مراکز آموزشی و افراد دورههای رایگان آموزشی برگزار میکنند و به صورت ویدیو روی اینترنت قرار میدن، کتابها و مقالههای زیادی هر سال نوشته میشه ولی این تعداد زیاد منابع هم گاهی سردرگم کننده ست. اما هر راهی رو انتخاب میکنید این نکته رو مد نظر داشته باشید که تمام این موارد تئوری هستند و همون طور که کسی با خوندن کتاب و فیلم آموزشی فوتبالیست نشده یا شنا یاد نگرفته یا به حجم عضلاتش اضافه نشده. پس تمام این راهها به تلاش و تمرین خودتون بر میگرده. جدای از این که چه روشی برای مطالعه انتخاب میکنید "باید هر روز تمرین کنید!" بدون تمرین مداوم و پیوسته هیچ وقت توی هیچ کاری مهارت لازم رو به دست نمیارید. در ادامه چند تا از گزینههایی که به نظرم میرسه به همراه معایب و مزایا شون رو مرور میکنیم:
انتخاب یک دوره خوب برای شروع میتونه خیلی به یادگیری کمک کنه. اما پیشنهاد میکنم حتماً قبل از شروع یک دوره هدفتون رو مشخص کنید. درباره مسائلی که قراره توی اون دوره یاد بگیرید و خروجی که باید توقع داشته باشید تحقیق کنید حتی چند فصل آغازین یک کتاب مرتبط رو بخونید. در این حالت بهترین استفاده رو از کلاس خواهید برد. توجه داشته باشید مدرس تنها بخشی از مفاهیم رو در زمان محدود در هفته درس میده و هر قدر آمادهتر یه دوره رو شروع کنید بیشتر میتونید در رفع اشکال از مدرس کمک بگیرید.
قبل از ثبتنام درباره مباحثی که تدریس میشه، خروجی که انتهای دوره بهش میرسید و زمان کلاس تحقیق کنید. اگر هم براتون مقدور هست از دانشجویان دورههای قبلی تحقیق کنید. الزاماً هر جای با امکاناتی یا هر مدرس با سابقه کاری موفق الزاماً مهارت آموزش بالایی نداره. توجه داشته باشید به صرف شرکت در کلاس برنامهنویسی یاد نمیگیرید و باید در هر جلسه تمرینات مربوطه رو انجام بدید. اگر وقت کافی برای کلاس و تمرین ندارید هزینهای برای کلاس نکنید.
فیلمهای آموزشی یادگیری رو در دنیای امروز متحول کردند. Julius Yego در المپیک ریو 2016 مدال طلا رو به دست آورد. وقتی خبرنگارها اسم مربیش رو برای مصاحبه میپرسند؛ جواب میده: یوتیوب! روزها از یوتیوب فیلم آموزشی و تمرینی ورزشکارهای حرفهای رشتهاش رو میدیده و تمرین میکرده و تا قهرمانی المپیک پیش میره! در زمینه برنامهنویسی، منابع بسیار بسیار بیشتر از هر رشته دیگهای در دسترس عموم قرار داره. دانشگاههای بزرگ مثل MIT دورههای رایگان آموزشی برگزار میکنند. خیلی از افراد مستقل ساعتها آموزش ضبط میکنند و روی اینترنت قرار میدن که توی هیچ دانشگاهی تدریس نمیشه. من خودم اولین بار با دیدن ویدیوهای آموزشی که کارمندهای گوگل منتشر کرده بودند خیلی تحت تاثیر قرار گرفتم. برجستهترین برنامهنویسها در عالیترین سطح برنامهنویسی دنیا ویدیوی رایگان برای آموزش مبتدیها تولید میکنند!
چند سال پیش Casey Muratori یه پروژه تولید بازی شروع کرد و از صفر و بدون هیچ کتابخونه یا ابزاری شروع به تولید بازی کرد و طی حدود 400 ساعت بازی رو کامل کرد و در طول کار تمام مراحل رو ضبط کرد و جزییترین کارهایی رو که انجام میده رو مفصل توضیح میده و از تمام مراحل فیلم گرفت و رایگان روی اینترنت گذاشت. هیچ برنامهنویس بازی (یا حتی رشته دیگهای) نیست که از دیدن این سری از ویدیوها چیزی یاد نگیره. این سری ویدیوی آموزشی Handmade hero نام داره. همچنین وبسایت liveedu.tv ویدیوهای آموزشی زیادی داره که برنامهنویسها از اول تا آخر یه محصول پیچیده رو تولید میکنند. همچین منابع آموزشی توی هیچ دانشگاهی پیدا نمیشه. اما مواردی که تا الان گفتیم برای شروع خیلی خوب نیستند. شاید دیدن ویدیوهای Lynda یا Coursera برای شروع براتون مناسب باشند. باز هم هیچ ویدیوی خاصی رو پیشنهاد نمیکنم. بگردید منابعی که خودتون راحتتر یاد میگیرید رو امتحان کنید. منابع ویدیویی به زبان فارسی هم هستند هر چند کم، اما برای اونایی که مشکل زبان انگلیسی دارند میتونه نقطه شروع خوبی باشه.
بهترین منبع آموزشی برای یادگیری کتابه. توی هیچ سری از ویدیو یا دوره آموزشی نمیشه به اندازه کتاب مطلب رو منتقل کرد. پیشنهاد اولم برای کتابی که انتخاب میکنید اینه که به زبان انگلیسی باشه! من همه کتابهای برنامهنویسی به فارسی رو نخوندم اما همه اونایی که خوندم برام مفید نبودند. خیلی سعی شده بود مفاهیم اصلی برنامهنویسی به فارسی برگردانده بشه که خیلی کار اشتباهیه! چون مطالب فارسی به شدت روی اینترنت کم و محدود هستند و اگر به محتوای فارسی عادت کنید و اصطلاحات درست رو یاد نگیرید بعداً در رفع اشکال یا تحقیق برای یادگیری بیشتر به مشکل میخورید. باز هم اگر به مطالعه کتاب فارسی اصرار دارید کتابی رو انتخاب کنید که مفاهیم اصلی رو ترجمه نکرده باشه و عین کلمه رو ذکر کنه.
پیشنهاد میکنم حتی اگر زبانتون خوب نیست یه دیکشنری کنار دستتون بذارید و کلمه به کلمه ترجمه کنید و یاد بگیرید! شاید یکی دو صفحه اول پیشرفتتون کند باشه اما بعد از دو، سه روز به واژگان تخصصی رشتهتون آشنا میشنید و میتونید بهتر تو اینترنت دنبال راه حل مشکلات باشید و به منابع گستردهتری برای یادگیری دسترسی خواهید داشت.
برای برنامهنویسی هیچ محدودیت سنی وجود نداره! تکرار میکنم، هیچ محدودیتی! الان خیلی از اسباببازیها برای کودکان تولید میشه که مناسب سنین قبل از دبستان هستند. دانشگاه MIT زبان برنامهنویسی Scratch رو برای آموزش به بچهها توسعه داده. پس هیچ وقت برای یادگیری برنامهنویسی زود نیست.
از سمت دیگه هم برای برنامهنویسی هیچ وقت دیر نیست. Kevin Systrom موسس اینستاگرام حدود بیست و چهار سالگی شروع به یادگیری برنامهنویسی کرد. اولین پروژهای هم که درست کرد، همون نسخه اولیه اینستاگرام بود که بعد از دو سال فیسبوک شرکتش رو به قیمت یک میلیارد دلار خرید! برنامهنویسهای زیادی هستند که بعد از سی، چهل یا حتی پنجاه سالگی شروع به یادگیری کردند و مسیر کاری و زندگیشون رو تغییر دادند. این قضیه خیلی به روحیه و علاقه فردی داره. پس سن هیچ وقت نمیتونه بهانهای برای ترس از یادگیری باشه.
یه شبی رو یادمه که خیلی از برنامهنویسی نامید شده بودم. یک سالی بود که برنامهنویسی رو شروع کرده بودم. نه اونقدر تجربه داشتم که بهم اعتماد به نفس بده و نه اون قدر بلد نبودم که بگم هیچ چیز بلد نیستم. آینده خیلی تیره و تار شده بود تا این که یه مقاله راهم رو روشن کرد. حتی دیدم به بعضی از مسایل تو زندگی رو عوض کرد: «در ده سال به خودتون برنامهنویسی یاد بدید»( Teach Yourself Programming in Ten Years) نویسنده تو این مقاله به عجله دنیای امروز برای زندگی صحبت میکنه به این که کتابهایی میبینیم به عنوان: یادگیری زبان فلان در بیست و یک روز، یادگیری بهمان در چهارده روز و امثالهم اما واقعاً این مدت برای یادگیری کافی نیست. در ادامه به تحقیقی درباره یادگیری اشاره میکنه و میگه برای استاد شدن (Mastery) در هر چیزی، چه ورزش، چه هنر یا برنامهنویسی به ده سال زمان احتیاجه! و خیلی نکات مفید دیگه که خوندنش رو توصیه میکنم (لینک ترجمه فارسی هم کنار مقاله موجوده). اما باید بگم این مقاله به این معنا نیست که بعد از ده سال تازه میتونید شروع به کار کنید.
اگر صحیح و هدفمند شروع کنید بعد از سه تا شش ماه میتونید به هدفی که تعیین کردید برسید و اولین برنامه، بازی یا وبسایتتون رو بسازید و بین شش ماه تا یک سال کسب تجربه میتونید به عنوان یه برنامهنویس استخدام یه شرکت بشید. به یاد داشته باشید یک راه ده ساله رو شروع کردید و برای استادی تو هر رشتهای باید صبر داشته باشید.
هم آره و هم نه! خیلی بسته به راهی که انتخاب میکنید داره. من برنامهنویسهایی با ده الی پانزده سال سابقه کار میشناسم اما هیچ وقت به ریاضی برای انجام کارشون احتیاج پیدا نکردند. از سوی دیگه اگر سراغ تولید نرمافزارهای شبیهسازی برید یا بخواهید موتور پردازش گرافیکی (Graphic rendering engine) بنویسید به دانش ریاضی خوبی حداقل در حد جبر، محاسبات ماتریسی، وکتور و مثلثات و امثالهم نیاز دارید.
اما (شاید) برای برنامهنویسی وب تا آخرین روز کاری به غیر از چهار عمل اصلی ریاضی به چیز دیگهای احتیاج پیدا نکنید.
در اصل برنامهنویسی بر مبنای ریاضی استواره اگر میخواهید برنامهنویس خیلی خاصی بشید و به حد عالی توی کارتون پیشرفت کنید تو زمینهای که در اون فعالیت دارید با توجه به نیاز ریاضی یاد بگیرید. مطمئن باشید ریاضی که توی کار یاد میگیرید با نحوهای که تو دبیرستان و دانشگاه یاد میگرفتید خیلی فرق میکنه. زیبایی ریاضی در برنامهنویسی اینه که میتونید به صورت گرافیکی نتیجه مفهوم ریاضی که استفاده میکنید رو ببینید! خودم تو دبیرستان اصلاً به ریاضی علاقه نداشتم اما بعد وقتی برای درست کردن بازی ازش استفاده کردم تازه خیلی از مباحث از آمار تا مثلثات رو یاد گرفتم و عاشق ریاضی شدم. ریاضی در حد دبیرستان کارتون رو تا حد خیلی زیادی راه میاندازه. اگر خیلی وقت هست از ریاضی فاصله گرفتید و یک کمی هم برنامهنویسی بلدید و دیدید توی کار به ریاضی احتیاج دارید نگران نباشید. یه سری به خان آکادمی بزنید.
این موضوع خیلی مربوط به دانش، مهارت، تجربه و سرعت عمل برنامهنویس داره. اختلاف بازدهی دو برنامه نویس میتونه بیش از ده برابر باشه! سطح حقوق رو هم همین مهارت تعیین میکنه اما سقف حقوق برنامهنویسی به قدری بالا هست که از پردرآمدترین مشاغل حساب بشه. برای مشاهده حقوق برنامهنویسها در ایران میتونید از سایت Iran salary استفاده کنید. برای بخش برنامهنویسی میتونید اینجا رو ببینید. در حال حاضر این بازه بین یک و نیم میلیون برای کسی که تازه شروع کرده تا دوازه میلیون در ماه برای برنامهنویس با سابقه است. البته خارج از ایران به مراتب دستمزد برنامهنویسها بالاتره و تو آمریکا این عدد به صد و بیست هزار دلار (و بیشتر) در سال هم میرسه. با تکنولوژی امروزه و عصر ارتباطات کار کردن به صورت دورکاری (Remote) هم یه گزینه ست و میتونید به زندگی در ایران و کسب درآمد دلاری هم فکر کنید. پس اگر برای شروع با حقوق خیلی بالایی شروع نکردید نگران نباشید با یه کم تجربه و تلاش به رقم دلخواهتون میرسید.
دوستهای برنامهنویس پیدا کنید.رفتن به باشگاه یا سفر با دوستان جذابتر نیست؟ بیشتر به هم روحیه نمیدید؟ بیشتر به هم کمک نمیکنید تا پیشرفت کنید؟ توی برنامهنویسی هم همینطوره. مشکلاتی که بر میخورید شبیه به هم خواهید بود و میتونید به هم کمک کنید.
از مشاور کمک بگیرید. منظورم از مشاور برنامهنویس با تجربه ست که بتونید ازش مشورت بگیرید. فرهنگ بین برنامهنویسها فرهنگ کمک و یاد دادن هست. سایت Stack overflow محلی برای برنامهنویسهاست تا مشکلاتشون رو بپرسن . بعضیها برای کمک به فرد دیگه چندین ساعت صرف نوشتن یک پاسخ میکنند. یا روی Github هزاران پروژه رایگان قرار داده شده. پس مطمئن باشید که همیشه کسی پیدا میشه تا بتونید ازش مشورت بگیرید. اما باید راه سوال پرسیدن و مشورت گرفتن صحیح در بین جامعه رو بلد باشید. Eric Raymond یه مقاله تاریخی در مورد نحوه سوال پرسیدن به روش هوشمندانه (How to ask question the smart way) داره که مطالعه این مقاله رو شدیداً پیشنهاد میکنم.
سایتهایی وجود دارند مثل codingame.com که برای تمرین فوقالعاده خوب هستند! مسائل و سوالات دستهبندی شده دارند که با توجه به مهارتتون میتونید درجه سختی رو انتخاب و اونا رو حل کنید. عمده مسائل حالت گرافیکی دارند و با کد باید اون مسئله رو حل کنید. مثلاً یکی چالشهای ساده اینه که در تصویر یه سری دشمن به بازیکن که شما کنترلش رو با کد در دست داریدحمله میکنند. باید کدی بنویسید که نزدیکترین دشمن رو پیدا کنه و بهش شلیک کنید تا به بازیکنتون آسیب نرسه. این روش، تمرین کردن رو خیلی لذت بخش میکنه. همینطور یه سری بازی آنلاین داره که شما هوش مصنوعی مینویسید و با بقیه بازیکنها به رقابت میپردازید.
سایت codefights یه میدون نبرد برنامهنویسیه! هم برای کسانی که تازه شروع کردن چالش داره و هم برای حرفهایها. اینجا هم مقدار زیادی چالش و مدال وجود داره و کلی مسابقه!
topcoder هم از قدیمیترین سایتهایی هست که روی برنامهنویسی رقابتی تمرکز داره و برای اونایی که اهل رقابت خیلی جدی هستند توصیه میشه.
زبانهای برنامهنویسی ابزار هستند هر زبان برای پاسخ دادن به یک سری مشکلات تولید شده. پس توجه داشته باشید با دونستن زبانهای برنامهنویسی مختلف ابزار مختلفی برای موقعیتهای خاص در اختیار دارید. شاید یه زبان یه کاری رو کمی کندتر از بقیه انجام بده و مناسب کارهایی که باید در لحظه انجام بشه، نباشه اما در عوض سرعت خوبی در نوشتن یه اسکریپت ساده داره تا از انجام یه کار تکراری و خسته کننده دوری کنید.
از نزاع بین این که کدوم زبان سریعتره یا بهتره فاصله بگیرید. به زبانها به چشم ابزار نگاه کنید. هر کدوم جای خودشون سریع هستند. هر کدوم جای خودشون کاربرد دارند.
ما در طی سالها تکامل انسان، موجودی بودیم که در طبیعت به دنبال شکار یا تهیه غذا میدویده و یا روزها در مزرعه کار میکرده. برنامهنویسی به ساعتها نشستن و تمرکز احتیاج داره. این نشستن طولانی میتونه منجر به مشکلات خیلی جدی مثل سندرم تونل کارپال، کمردرد، درد کتف و گردن و مشکلات دیگهای بشه. پس توجه به سلامت فیزیکی و تقویت بدن برای توانایی نشستن در ساعتهای طولانی خیلی به راهی که در پیش دارید کمک میکنه.
هیچ چیز به اندازه کنجکاوی و توجه به جزییات نمیتونه کمکتون کنه! به همه مسائل حساس باشید. مثلاً فرق int main با void main در C/C++ چیه؟ چه طور یه فایل متنی چند گیگابایتی رو باز کنم و سریع تغییرش بدم؟ چه طور زیپ کردن یه فایل، حجم فایل متنی رو خیلی کاهش میده ولی روی عکس اونقدر تاثیر نداره؟ دونستن تمام این موارد خیلی ازتون وقت نمیگیره یا حتی مسئله خیلی بزرگی هم نباشه اما با یادگیری چیزهای کوچیک تو مغز هرمونهایی ترشح میشه که باعث نشاط میشه! این نشاط بعد از مدتی اعتیاد میاره و مطمئن باشید هیچ وقت از این نوع اعتیاد پشیمون نمیشید!
نقاشها وقتی دارند روی بوم کار میکنند خیلی از نزدیک به کار نگاه میکنند. هر از گاهی از تابلو دور میشن تا کل کار رو ببیند روند انجام کار رو بررسی کنند و اگر جایی رو درست اجرا نکردند رو تصحیح کنند. این دید به دست نمیاد مگر این که بعضی وقتها از کارمون فاصله بگیریم جزییات رو کنار بگذاریم و به نقشه بزرگتر راهمون نگاه کنیم. بعضی وقتها روی چیزهای ساده و بی اهمیت متمرکز میشیم و وقت میذاریم که یادمون میره چه چیزهای بزرگتری برای یادگیری وجود داره. یا اگر راه رو داریم اشتباه میریم خیلی دیر میفهمیم. پس هر چند وقت صبر کنید. چند قدم از کار فاصله بگیرید و به ادامه مسیر یا اهمیت موضوعی که دارید کار میکنید فکر کنید. بعضی وقتها بستن یه پروژه و شروع یه پروژه جدید به صرفهتر از پروژهای هست که خیلی اشتباه پیش رفته.
اولین زبان برنامهنویسی رو یاد گرفتید؟ کار با پایگاه داده و برنامهنویسی شبکه یاد گرفتید؟ الان گوگل کار میکنید و از طرف شرکتهای بزرگ پیشنهاد کار دارید؟ همین جا توقف نکنید! شما هنوز برای یاد گرفتن راه زیادی دارید. حتی بعد از اون ده سالی که برای استادی صحبت کردیم تازه در یک بخش برنامهنویسی ماهر هستید! پس هنوز برای تجربههای جدید فرصت دارید. به قول سایه:
آبی که برآسود زمینش بخورد زود، زمینش بخورد زود
دریا شود آن رود که پیوسته روان است
خیلی افراد کمی هستند که تمام زیر و بم یک زبان رو بلد باشند! اگر تنها نحوه نوشتن کد برای یک زبان رو یاد گرفتید هنوز برنامهنویس نشدید. هنوز خیلی ابزارها و روشهایی هست که باید یاد بگیرید تا توی کار پیشرفت کنید. در مطلب بعدی به مهارتهای عمومی که یه برنامهنویس نیاز داره اشاره میکنیم و هر کدوم رو توضیح میدیم.
امیدوارم این مطلب براتون مفید بوده باشه، خوشحال میشم اگر نظری یا سوالی دارید مطرح کنید یا اگر برای مطلب بعدی پیشنهادی دارید با من در میون بذارید.