مسیر برنامهنویسی در هفت گام
هر روز افرادِ زیادی در این مورد سوال میکنند که «چطور میتوانام یک برنامهنویس شوم؟» و یا اینکه «رشتهیِ تحصیلیِ من کاملا متفاوت بوده ولی علاقه دارم برنامهنویسی را یاد بگیرم و از کجا شروع کنم؟» و تعداد بسیار زیادی سوالاتِ مشابه با این را دریافت میکنم و در این پست بنا دارم تا به شکلی به این سوالات پاسخ دهم.
بدیهی است که این پست با توجه به تجربیاتِ شخصیِ من به عنوان یک برنامهنویس و مدرس نوشته شده و ممکن است برایِ همه کارایی نداشته باشد، هر کس ممکن است روشِ منحصر به فردِ خودش را برای یادگیری داشته باشد و این روشی است که من پیشنهاد میکنم و شما میتوانید روشهایِ پیشنهادی و تجربیاتِ خود را در قالب پست یا کامنت به اشتراک بگذارید.
گام اول: الگوریتم
برای برنامهنویسی لازم نیست یک استادِ ریاضی باشید! کافی است مثلِ یک کامپیوتر فکر کنید.
کامپیوترها بر خلافِ تصورِ عموم، موجوداتی به شدت کودن و ابله هستند و این اول چیزی است که لازم است بدانید، آنها تنها و دقیقا کاری را انجام میدهند که شما خواستهاید و نه چیزی بیشتر و کمتر.
فرض کنید به یک کودک که درکِ درستی از «پُر و خالی» بودن ندارد میگویید در لیوانِ من آب بریز و بعد از چند دقیقه میبینید که کودک همچنان در حال ریختن آب داخل لیوانی است که سرریز شده! چقدر عجیب!
اینبار لیوان را خالی میکنید و از او میخواهید دوباره داخل لیوان آب بریزد تا زمانی که لیوان پُر شود، احتمالا وقتی دوباره به سراغِ کودک بروید میبینید هنوز در حال ریختنِ آب داخلِ لیوان است و بعد از پُر شدنِ لیوان نیز متوقف نشده چرا که درکی از مفهومِ «پُر شدن» ندارد. برای بار سوم لیوان را خالی میکنید، با ماژیک یک خط رویِ قسمتِ بالایی لیوان میکشید و از کودک اینبار میخواهید تا زمانی در لیوان آب بریزد که آب به آن خطِ خاص رسید و در کمال تعجب میبینید که همه چیز اینبار به درستی پیش رفت در حالی که نه شما خواسته و هدفِتان را تغییر دادید و نه کودک در طیِ این چند دقیقه دانا شد، چیزی که اتفاق افتاد این بود که شما توانستید درخواستِ خود را به شکلی قابلِ درک برایِ کودک مطرح کنید و همین شما را به نتیجه رساند.
ویدئویِ زیر را ببینید:
همه چیز دقیقا همانگونه است که در فیلم دیدید. کامپیوترها هیچ هوشی ندارند و تا زمانی که چیزی را به شکل دقیق از آنها نخواهید نمیتوانند آن را انجام دهند و این اشتباهی است که تعدادِ قابلِ توجهی از برنامهنویسان انجام میدهند و عموما در دورههایِ برنامهنویسی و کلاسها زمانی به آموزشِ این موضوع اختصاص داده نمیشود، شما باید یاد بگیرید که مانند یک کامپیوتر فکر کنید و درخواستِ درست را مطرح کنید.
اجازه بدهید یک مثالِ دیگر در این باره بزنم، فرض کنید شما از کامپیوتر خواستهاید که دو عدد را در هم ضرب کند، احتمالا خواستهی شما چیزی است شبیه به این:
دو عدد را در هم ضرب کن
خب سوالی که برای کامپیوترِ شما مطرح میشود این است که «کدام دو عدد؟» پس قبل از آن لازم است دو عدد را به کامپیوتر بدهید، پس خواستهیِ خود را به این شکل تغییر میدهید:
۱- دو عدد را از کاربر بگیر
۲- آن دو عدد را در هم ضرب کن
تا اینجایِ کار خیلی خوب پیش رفت! کامپیوتر از شما دو عدد را در یافت میکند (مثلا ۲ و ۳) و آنها را در هم ضرب میکند و تمام! شما قرار نیست نتیجه را هیچوقت ببینید چرا که از کامپیوتر نخواستید حاصلضرب را به شما نمایشد دهد، تنها خواستهی ِ شما این بود که اعداد در هم ضرب شوند، پس خواستهیِ خود را اینبار این طور تکمیل میکنید:
۱- دو عدد را از کاربر بگیر
۲- آن دو عدد را در هم ضرب کن
۳− نتیجهیِ گامِ دوم را به من نمایش بده
و بووووم! عدد ۶ رویِ صفحه نمایش ظاهر میشود.
این تمامِ آن چیزی است که شما برایِ شروع نیاز دارید و ما به آن الگوریتم میگوییم، شما در این مرحله یاد میگیرد که چطور میتوان مسائلِ بزرگ را به قدمهایِ زیر و قابلِ فهم تقسیم کرد و از آن به جواب رسید. منابع زیادی برای یادگیری الگوریتم وجود دارد.
مراقب باشید! بعضی از اساتید فکر می کنند الگوریتم یعنی نوشتن مسائلِ پیچیدهیِ ریاضی و اگر یکی از آنها را دیدید حتما فرار کنید!
به دلیل کپیرایت در این قسمت هیچ لینکی قرار ندارد ولی می توانید محتوای خوبی در اینترنت پیدا کنید که به شما در فهمِ الگوریتمها کمک کند، همچنین فراموش نکنید که ساعاتِ بسیاری را باید صرفِ یادگیری و تمرین کنید و از این نوضوع به هیچ عنوان غافل نشوید.
گام دوم: انتخاب زبانِ برنامهنویسی
پایتون!
واقعیت این است که به هیچوجه نمیتوان به این سوال یک پاسخِ مشخص داد چرا که زبانِ مناسب برایِ هر فرد با دیگری به کلی متفاوت است، شبیه به انیمیشنِ «چگونه اژدهای خود را تربیت کنیم» در اینجا هم اژدها شما را انتخاب میکند.
برای انتخابِ یک زبانِ مناسب میتوانید در اینترنت جستوجو کنید به عنوان مثلا سایت StackOverFlow هر سال مقالهای منتشر میکند در زمینهیِ برنامهنویسان، زبانهای برنامهنویسی، حقوقهایِ دریافتی، فرصتهایِ شغلی و مواردِ دیگر که ممکن است در انتخابِ شما تاثیرگذار باشد. آخرین نسخه از این مقاله را میتوانید اینجا بخوانید.
یکی دیگر از مواردی که باید به آن توجه کرد علاقهیِ شخصی شماست، گاهی اینکه از قیافهیِ یک چیز خوشِمان بیاید میتواند ملاکِ مهمی برایِ انتخاب باشد، بعد از آن به سطحِ خود نگاه کنید. پایتون به دلیلِ سادگیِ زیاد میتواند همیشه یک انتخابِ خوب برای ابتدایِ کار باشد (هر چند شاید در مواردی بهترین انتخاب نباشد)
تصویر زیر یک نقشه برایِ انتخابِ اولین زبانِ برنامهنویسی است که توانسته نظرات مثبت زیادی را دریافت کند، شاید دنبال کردن این نقشه کمی به شما کمک کند تا راحتتر تصمیم بگیرید:
همچنین مقالاتِ زیادی را میتوانید پیدا کنید که در آنها معیارها و ملاکهایِ گوناگونی برایِ انتخابِ زبانِ برنامهنویسی بیان شده ولی در نهایت تصمیم نهایی فقط با خودِ شماست.
دقت کنید که لینک زیر توسط یک شرکتِ تجاری نوشته شده و ممکن است حاویِ مطالبی باشد که به انگیزههایِ مالی نوشته شده و کاملا بیطرف نباشد مخصوصا در پیوند به کلاسها!
گام سوم: یادگیریِ مبانیِ برنامهنویسی
همانطور که همیشه مثال میزنم، اگر شما برنامهنویسی را مانندِ آشپزی بدانید تا اینجا شما یادگرفتهاید چطور دستورِ پختِ یک غذا را بخوانید و یا آن را به کسی ارائه کنید (گامِ اول) و همینطور ظرفهایِ مناسبِ خودِتان را انتخاب کردهاید و یک دست چاقویِ خوب برایِ خود تهیه کردهاید (گامِ دوم) و در این قسمت یاد میگیرید چطور با گاز، فر و ستِ چاقویِ جدیدِتان کار کنید.
این قسمت دقیقا چیزی است شبیه به مطالعهیِ دفترچهیِ راهنمایِ یک محصول و تنها کاری که نیاز است انجام دهید این است که دفترچه را یک دور بخوانید. یک کتابِ مقدماتی پیدا کنید و سعی کنید مفاهیمِ اولیهی برنامهنویسی را فرابگیرید، چیزهایی شبیه:
- متغیرها
- انواع داده
- کار با دادهها
- کلماتِ کلیدیِ زبان
- دریافت ورودی از ورودیِ استاندارد (صفحه کلید)
- ارسالِ خروجی به خروجیِ استاندارد (صفحه نمایش)
- ساختارهای کنترل و تکرار
- کار با توابع
- و اگر از زبانهایِ بیخودِ شیگرا استفاده میکنید مفاهیم کلی مثل کلاسها
لازم نیست در هیچکدام از این موارد یک متخصصِ بلامنازع شوید، فقط کافیاست تا حدی با آنها آشنا شوید و بعد گاز را روشن کنید، از اینجا به بعد همه چیز آسان میشود.
در اینجا میتوانید لیستی از ابزارها و بازیها پیدا کنید که در این قسمت میتواند به شما کمک کند، همچنین استفاده از سایت و اپلیکیشن (IOS, Android) «سولو لرن» میتواند سرعت یادگیریِ این مقدمات را تا حدِ بسیاری افزایش دهد.
برای انجام تمریناتِ بیشتر هم میتوانید از وبسایت «HackerRank» استفاده کنید و اگر خیلی هم اصرار به مدرک دارید به صورت رایگان مدرک بگیرید :)
توصیه میکنم هنوز به سراغ دورههایِ آموزشی عجیب و غریب و یا کتابهایِ برنامهنویسی نروید و فقط با ابزارها و سایتهای آموزشیِ تمرین محور به یادگیریِ زبانِ موردِ نظر بپردازید.
گام چهارم: یک پروژه را نابود کنید!
برایِ من مهمترین گام در یادگیری همین گامِ چهارم بود. من به کدِ یک برنامه دسترسی پیدا کردم و بعد از آن فهمیدم لذتِ برنامهنویسی تا چه حد برایِ من زیاد است. اگر سنِ شما کمی زیاد باشد و به قدرِ کافی کنجکاو بودهباشید احتمالا به یاد دارید در دورهای بیشترِ بازیهایِ کامپیوتری یک نسخهیِ ایرانیزه شده داشت که در آن منوهایِ بازی و یا صداها فارسی بود! آن زمان من به بازیِ «لوکِ خوش شانس» رسیدم و این خودش آغازِ خوششانسیِ من بود.
در این بازی تمامیِ صداها فارسی بود ولی بقیهیِ قسمتها نه! پس بازی ساختِ ایران نبود برایِ همین کنجکاو شدم تا ببینم دقیقا چطور این اتفاق افتاده، سعی کردم فایلهایِ بازی را یکی یکی باز کنم و بعد رسیدم به فایلی که حجماش بیشتر از بقیه بود و تقریبا با هر ابزاری سعی کردم آن را باز کنم و در نهایت به Winrar رسیدم و بله! تمام قسمتهایِ بازی داخل همان فایل بود و شروع کردم به تغییر دادن، خراب کردن، عوض کردن عکسها و ... و بعد بقیهیِ بازیها.
در نهایت کشف کردم چقدر تغییر دادن میتواند لذت بخش و آموزنده باشد، با انواع فرمتهای عکس و صوت آشنا شدم و حتی خواندن فایلهای تنظیمات و بعد بازکردن dll و چیزهایی از این دست و «لوک خوش شانس» برایِ من بیشتر از چهارسال دورهیِ کارشناسی دستاورد علمی به همراه داشت.
شما هم همین امروز لوکِ خوششانسِ خود را پیدا کنید.
یک پروژهی متن باز که با زبانِ موردِ نظرِ شما نوشته شده انتخاب کنید و سعی کنید آنرا تغییر دهید، با تغییر متن منوها شروع کنید و بعد حذف و اضافه کردنِ قسمتهایِ مختلف، سعی کنید با هر تغییری در برنامه یکبار آن را اجرا کنید و بعد به دنبالِ مفهومِ تغییرات بگردید! مثلا اگر جایی عددی را تغییر دادید و رنگِ متنی عوض شد سعی کنید آن را درک کنید، بفهمید چطور رنگها در برنامه کار میکنند، چطور تعریف میشوند و چطور میتوان متنی با رنگ دلخواه نوشت. این کار را ساعتهای زیادی انجام دهید و هر تغییر را درک کنید آن وقت برایِ گامِ بعدی آماده هستید.
گام پنجم: یک پروژه بسازید!
تا اینجایِ کار شما چیزهایِ زیادی فرا گرفتید، با اصولِ برنامهنویسی آشنا شدید و در عینِ حال حداقل یک پروژهی واقعی را از نزدیک دیدهاید، کدهایِ آن را مطالعه کردهاید و احتمالا تغییراتی در آن ایجاد کردهاید و حالا زمانِ مناسبی است که دست به کارِ ساختِ یک پروژه شوید. لازم نیست دیجیکالا یا گوگل را بازنویسی کنید، خیلی ایدهال گرا نباشید و فقط شروع کنید.
برایِ شروع یک پروژهی ساده انتخاب کنید:
- دفترچه تلفن
- دریافت جدیدترین فیلمها از IMDB
- ارسالِ ایمیل در ساعتِ مشخص
- پشتیبانگیری از فایلهایِ یک دایرکتوریِ خاص
و یا هر چیزی که دوست دارید. میتوانید لیستی از پروژهها را در اینجا و اینجا پیدا کنید که برایِ برنامهنویسانِ مبتدی مناسب است.
توصیهی اکید این است که ایدهآل گرا نباشید ولی سعی کنید به ایدهال نزدیک شوید!
احتمالا هنگامِ نوشتنِ پروژه به سوالات و مشکلاتِ زیادی بخورید و تا حدی ناامید شوید ولی لازم است بدانید تقریبا هر کسی این دوره را طی کرده و شما در این ناامیدی تنها نیستید. سوال بپرسید و سعی کنید از راهنمایی افراد استفاده کنید، خوب جستجو کنید. هر زبانِ برنامهنویسی دارایِ یک جامعهیِ کاربری، مقداری زیادی مستندات و مجموعهای از مثالها است، از آنها بهره ببرید. سایتهای و انجمنهایِ زیادی وجود دارد که به سوالات و مشکلاتِ شما پاسخ میدهند، در آنها ثبت نام کنید و سوالِ خود را آنجا مطرح کنید ولی فراموش نکید «سوالِ درست را مطرح کنید و سوال را درست مطرح کنید».
چند روز پیش پیامی دریافت کردم که «من یک جا به خطا خوردم میتوانی به من کمک کنی؟» و من تنها کاری که می کنم پاک کردنِ این پیام است، اگر شما مشکلی دارید من موظف به پیگیری نیستم باید سوال و مشکل را کامل مطرح کنید. این مهارت به اندازهیِ خودِ برنامهنویسی اهمیت دارد و به هیچ وجه آنرا دستِ کم نگیرید. حتما و حتما مقالهیِ «چگونه هوشمندانه سوال کنیم» را مطالعه کنید.
پروژه را در ابتدا به سادهترین شکل بنویسید و به مرور سعی کنید آنرا توسعه بدهید، مثلا برایِ دفترچهیِ تلفن در ابتدا فقط قابلیتِ افزودنِ یک شماره برایِ هر نام وجود داشته باشد در گامِ بعد جستجو را اضافه کنید، بعد از آن میتوانید به هر فرد تعدادی شماره تخصیص بدهید، شمارههای تکراری را یکی کنید و یا عکس به هر کاربر اضافه کنید و برایِ هر کدام از این مراحل نیاز به مطالعه و یادگیری خواهید داشت و بهترین روشِ یادگیری همین است که با تمرین و تجربه به آن میرسید.
گام ششم: بخوانید و پاسخ دهید!
این گام شاملِ دو مرحله است در مرحلهیِ اول شما شروع به مطالعهیِ کتابهایِ پیشرفتهتر میکنید و این موارد را در پروژهیِ خود اعمال میکند و در مرحلهیِ دوم در یکی از انجمنها و یا سایتی مشابهِ Stack Overflow عضو شده و سعی میکنید به سوالاتِ دیگران پاسخ دهید.
خواندنِ سوالاتِ دیگران باعث میشود که در مدت زمانِ کوتاهی با تعدادِ زیادی از مفاهیمِ چالش برانگیز آشنا شوید و پاسخ دادن به آنها مهارتِ شما برایِ یافتنِ راهِحل را افزایش میدهد و در نهایت شما میتوانید در مدتی کوتاه تجربهیِ بالایی کسب کنید. شاید در نگاهِ اول این روش تا اندازهی زیادی عجیب باشد ولی اثراتِ آن را در مدتِ کوتاهی خواهید دید.
گام هفتم: مانندِ یک حرفهای رفتار کنید!
تا اینجایِ کار شما یک برنامهنویس شدهاید ولی هنوز راهی طولانی در پیش دارید. در اینجا شما تمامِ اصولِ برنامهنویسی را فراگرفتهاید ولی هنوز یک برنامهنویسِ حرفهای نیستید. برایِ اینکار هنوز سه مرحلهیِ اصلی دارید:
مرحلهی یک: کد تمیز
اینکه شما میتوانید یک برنامه بنویسید بالذات چیزِ ارزشمندی است ولی تا زمانی که دیگران نتوانند از آن سر در بیاورند و یا اینکه بعدها خودتان نتوانید چیزی از آنچه که نوشتهاید بفهمید یک عیب محسوب میشود. در حقیقت شما شبیه به کسی هستید که یک گاوصندوق پر از طلا دارد ولی رمزِ گاوصندوق را نمیداند و کس دیگری هم نمیتواند آنرا باز کند و در عمل شما هیچ چیزی ندارید.
نوشتنِ کدِ تمیز یک ویژگیِ است که از شما یک فردِ حرفهای میسازد پس در حینِ یادگیریِ برنامهنویسی سعی کنید این مهارت را نیز کسب و تمرین کنید. تقریبا هر زبانِ برنامهنویسی مجموعهای از دستورالعملها برای کدنویسی تمیز ارائه میکند (مثل PEP8 در پایتون)، همچنین تعداد زیادی استاندارد برایِ کد نویسی توسط شرکتها و سازمانها پیشنهاد شده که میتواند راهنمایِ مناسبی باشد به عنوان مثال:
و ...
همچنین کتابهایی نظیر Clean Code میتواند راهگشایِ ارزشمندی برایِ شما باشد.
مرحلهی دو: یادیگری سیستم کنترل ورژن مثل گیت
برای اینکه بتوانید با یک تیم کار کنید باید اصولِ کارِ تیمی را فرا بگیرید. یک فرد نمیتواند به تنهایی یک پروژه را به سرانجام برساند پس برایِ اینکار لازم است تا با افراد همکاری کنید و برایِ همکاری باید بتوانید با ابزارهایِ لازم کار کنید، یکی از مهمترین ابزارها در حالِ حاضر گیت است و شما باید مهارتِ استفاده از آن را داشته باشید.
مجموعه پستهایِ زیر میتواند در این زمینه به شما کمک کند.
مرحلهی سوم: مشارکت در یک پروژهی واقعی
حالا وقتِ آن رسیده تا مهارتِ خود را بسنجید، یک پروژهیِ واقعی پیدا کنید و سعی کنید یک کامیت موفق رویِ آن داشته باشید. اجازه بدهید دیگران کدِ شما را قضاوت کنند (و فراموش نکنید که این کدِ شماست که قضاوت میشود و نه خود شما پس از نقد نرنجید!)، وقتی شما در یک پروژهی جهانی مشارکت میکنید آدمهای زیادی کدِ شما را میبینند آن را بررسی میکنند و نظراتِ خود را دربارهیِ آن بیان میکنند پس آنقدر تلاش کنید تا کسی ایرادِ بزرگی در کدِ شما پیدا نکند. حالا شما یک برنامهنویسِ حرفهای هستید به همین سادهگی.
در اکثرمواقع از شما انتظار میرود که برایِ کدِ خود تست هم بنویسید پس این را هم فراموش نکنید که زمانی را برایِ یادگیریِ تست نویسی اختصاص دهید
در اینجا شما می توانید لیستِ بلندی از پروژهها برایِ زبانهایِ برنامهنویسی مختلف را پیدا کنید که برایِ مشارکت مناسب است، کارِ مشارکت را با یکی از اینها شروع کنید.
موارد همینطوری:
برایِ نوشتنِ این متن زمانِ قابلِ توجهی صرف شده و اگر نکته و نظری در موردِ آن دارید به شکل کامنت و یا ایمیل آنرا ارسال کنید و آنرا با دیگران به اشتراک بگذارید. در انتهایِ این متن مواردی که فراموش شده و یا در این حوزه مفید و جالب است به مرور قرار خواهد گرفت.
این کشفِ جدیدِ من بود، برنامه نویسی را با بازی یاد بگیرید! خیلی هم هیجان انگیز و سرگرم کننده
مطلبی دیگر از این انتشارات
برنامه نویسی اندروید و پیشنیازهای یادگیری آن چیست؟
مطلبی دیگر از این انتشارات
کد در خدمت جامعه
مطلبی دیگر از این انتشارات
توصیههای بورسی از برنامهنویسی که سرباز شد