این پست، دومین پست از مجموعهٔ شروع برنامهنویسی ه. این مجموعه قراره که فضای برنامهنویسی و مسیرهایی که به کمک این ابزار میشه طی کرد رو ترسیم کنه. هدف این مجموعه اینه که این مسیر رو برای افرادی که هیچ تجربهای در این حوزه ندارن و یا تجربهٔ خیلی کمی دارن شفافتر کنه. در مطلب سعی میکنم نقشه راه شروع برنامهنویسی تا حرفهای شدن رو از نگاه خودم مجسم کنم.
همهٔ پستهای این مجموعه رو میتونی در صفحه شروع برنامهنویسی پیدا کنی. اگر پست مقدمه رو نخوندی، پیشنهاد میکنم ابتدا نگاهی بهش بندازی. اگر هم با برنامهنویسی خیلی آشنا نیستی، خوبه که اولین پست این مجموعه که در مورد تعریف برنامهنویسی و کاربردهای آن نوشتم رو بخونی.
مراحل یادگیری برنامهنویسی
یادگیری برنامهنویسی شباهت بسیاری به یادگیری هر فرآیند دیگهای داره. مثل یاد گرفتن رانندگی. اولین باری که شروع به یادگیری رانندگی میکنی، باید به همهٔ جزئیات توجه کنی. دستها رو باید با چه زاویهای روی فرمان بذاری، کی باید پا رو روی کلاچ برداری و دنده رو چه زمانی باید عوض کنی. اوایل یادگیری هر کاری، باید مکث کنیم و به قدم بعدی فکر کنیم. توی این بازه ممکنه که بارها به این فکر کنیم که چقدر کار سختیه و اصلاً نمیشه اون رو یاد گرفت. اما به مرور بعضی از کارها تکراری میشه. کم کم بدون فکر کردن دستت به سمت دنده میره و به صورت ناخودآگاه متوجه میشی که باید دنده رو عوض کنی. به عبارتی، رانندگی کم کم وارد حافظهٔ بدنت میشه. حالا که پایهها رو یاد گرفتی، باید خودت رو برای چالشهای بزرگتری آماده کنی. حالا باید در شهر رانندگی کنی. بعدش رانندگی جاده رو تجربه میکنی. چیزی که اینجا واضحه اینه که بدون گذروندن مراحل اولیه، هرگز نمیشد به مرحله رانندگی در جاده رسید.
در فرآیند یادگیری برنامهنویسی، مثل یادگیری رانندگی، ابتدا باید برای هر حرفی که بر روی کیبورد تایپ میکنی، مکث کنی. در اول مسیر با مجموعهای از حروف، اعداد و علامتهای نوشتاری خاص آن زبان برنامهنویسی مواجه میشی که درک درستی از اونها نداری. با گذر از این مرحله، جنس مسائل عوض خواهند شد و باید به مسائل سطح بالاتری فکر کنی. از نظر من یادگیری برنامه نویسی چند مرحله داره:
- ساختن تفکر الگوریتمی
- یادگیری یک زبان برنامهنویسی و نوشتن برنامههای ساده
- نوشتن برنامههای بزرگ و پیچیده
- به سمت بینهایت و فراتر از آن!
در ادامه در مورد هر کدوم از این مراحل بیشتر توضیح میدم. سعی میکنم در هر بخش چند پیشنهاد عملی هم بگم که فقط توضیحات کلی نداده باشم و به کمک این پیشنهادها بشه تمرین کرد. جا داره به این نکته هم اشاره کنم که این تقسیمبندی فقط نظر شخصی منه و ممکنه فرد دیگری نظر متفاوتی با من داشته باشه.
۱- ساختن تفکر الگوریتمی
الگوریتم چیه؟ ویکیپدیای فارسی الگوریتم رو اینطوری تعریف میکنه:
الگوریتم یا خوارزمی -خوارزمی دانشمندی ایرانی بوده است- مجموعهای متناهی از دستورالعملها است، که به ترتیب خاصی اجرا میشوند و مسئلهای را حل میکنند. به عبارت دیگر یک الگوریتم، روشی گام به گام برای حل مسئله است.
یعنی چی؟ یعنی هر کاری رو تقسیم کنی به قدمهای کوچک قابل فهم. طوری که اگر این قدمها رو لیست کنی، فقط با اجرای این دستورالعاملها به خروجی مطلوب برسی. مثلاً الگوریتم جارو کردن یک اتاق مستطیلی شکل، چیزی شبیه به قدمهای زیره:
۱- دوشاخهٔ جاروبرقی رو به پریز برق بزن.
۲- جاروبرقی رو روشن کن.
۳- جارو رو روی گوشهٔ بالا سمت راست اتاق بذار.
۴- جارو رو تا انتهای اتاق بکش.
۵- اگر نمیشه رفت چپ، برو به مرحله ۹.
۶- اگر هنوز میشه رفت سمت چپ، به اندازه عرض جارو، جارو رو ببر سمت چپ.
۷- جارو رو ببر به بالای اتاق.
۸- برو به مرحله ۴.
۹- جارو رو خاموش کن و از پریز برق بکش.
اگر کسی که تا حالا تجربهٔ جارو کردن رو نداشته باشه، با اجرای این دستورالعاملها احتمالاً میتونه با عملکرد معقولی یک اتاق رو جارو بزنه. توی دنیای برنامهنویسی به نوشتن الگوریتم به زبان آدمیزاد (شبیه به چیزی که برای جارو زدن نوشتم) شبهکد (pseudocode) میگن.
یادگیری برنامهنویسی با فکر کردن با ذهنیت الگوریتمی شروع میشه. هر برنامهای رو که بخوای بنویسی، چه برنامهٔ جمع زدن ۲ عدد مثبت و چه برنامهٔ پردازش عکسهای فضایی، باید ابتدا الگوریتم کاری که میخوای بکنی رو ترسیم کنی و کل کار رو به قدمهای کوچک قابل فهم برای کامپیوتر تبدیل کنی و در نهایت اون رو به کد تبدیل کنی.
پیشنهاد عملی
یک تمرین خوب برای بهبود این مهارت، روی کاغذ آوردن هر کاریه که توی روزمره انجام میدی. مثلاً هر موقع که خواستی یک غذا بپزی، رانندگی کنی یا ظرفها رو بشوری، بیای الگوریتمش رو بنویسی. بعد از این که روی کاغذ نوشتی، حالا خودت رو جای کسی بذار که برای اولین باره که میخواد این کار رو انجام بده. سعی کن نواقص الگوریتمت رو پیدا کنی و بهبودش بدی.
البته خوبه که یک سری فرضها از همون اول مشخص بشه. مثلاً در مثال جارو کردن، من فرض کردم که فرد مقابل میدونه که چطوری دوشاخهٔ جاروبرقی رو به پریز برق وصل کنه و یا این که جاروبرقی با کدوم دکمه روشن و خاموش میشه.
۲- یادگیری یک زبان برنامهنویسی و نوشتن برنامههای ساده
هر زبان برنامهنویسی، از یک سری کلیدواژههای خاص مثل if
و for
و return
، عدد و یک سری حروف نوشتاری خاص اون زبان مثل ->
یا >=
تشکیل میشه. توی این مرحله، یادگیری زبان برنامهنویسی آغاز میشه و کم کم درک میکنی هر کدوم از این حروف چه مفهومی دارن، چرا و کجا باید استفاده بشن. این کلیدواژهها ممکنه بین زبانهای مختلف برنامهنویسی مشترک باشن و یا این که با هم تفاوتهایی داشته باشن.
حالا که کم کم جا افتاد هر کدوم از این کلیدواژهها چه مفهومی دارن، شروع میکنی به نوشتن برنامههای ساده. اینجا برای اولین بار حس هکرها به آدم دست میده (حداقل من بعد از نوشتن اولین برنامههای قابل اجرا این حس رو داشتم!). یک سری حروف و عدد مینویسی و به کامپیوتر میگی چیکار کن، اون هم خروجی مطلوبت رو بهت میده. البته معمولاً چندین بار باید امتحان کنی و کد رو تغییر بدی تا به خروجی مطلوب برسی. به فرآیند پیدا کردن مشکلات کدی که اجرا نمیشه و یا خروجی مطلوب رو ارائه نمیده، اشکالزدایی کد (debugging) میگن.
برای مثال میخوایم به زبان پایتون یک برنامهای بنویسیم که یک ستاره مثلثی رو بسازه. چیزی شبیه مثلث زیر:
*
**
***
****
سادهترین حالتی که میشه نوشت اینطوریه:
print("*")
print("**")
print("***")
print("****")
همین خروجی رو با این کد هم میشه به دست آورد:
for i in range(4):
stars = "*"
for j in range(i):
stars = stars + "*"
print(stars)
همونطور که مشخصه، معمولاً راههای زیادی برای رسیدن به یک خروجی یکسان وجود داره.
شاید چاپ کردن مثلث ستارهای از مسائل واقعی یکم دور باشه. ولی توی این مرحله میشه پایهٔ خیلی از برنامههای بزرگ رو یاد گرفت. مثلا کمتر برنامهٔ بزرگی رو میشه سراغ داشت که از مسئلهٔ مرتبسازی استفاده نکنه. مرتبسازی به این صورته که لیستی از اعداد به کامپیوتر بدی و اون رو به صورت صعودی و یا نزولی مرتب کنه. مثلاً:
input:
[5 2 1 3]
output:
[1 2 3 5]
پیشنهاد عملی
در ابتدا باید یک زبان انتخاب کنی و یادگیری اون زبان رو شروع کنی. در روزگاری که دارم این پست رو مینویسم، برای شروع برنامهنویسی پایتون زبان مناسبیه. اینجا احتمالاً بعضیها باهام مخالف باشن و زبان دیگری رو برای شروع پیشنهاد بدن ولی من دلایلم رو لیست میکنم:
- منابع بسیار زیادی برای یادگیری این زبان وجود داره.
- عموماً دیباگ کردن کدهای پایتون سر راسته و در صورت وجود مشکل، ارورهای واضح و مشخصی چاپ میشه.
- تعداد زیادی از شرکتها و محصولهای نرمافزاری از این زبان استفاده میکنن.
- توی بیشتر حوزههای برنامهنویسی استفاده میشه. مثل توسعه بکند، هوش مصنوعی و تحلیل داده.
- زبان سطح بالاییه و برنامهنویس عموماً درگیر بخشهای سطوح پایینتر برنامهنویسی (مثل مدیریت حافظه) نمیشه.
- نسبت به بقیهٔ زبانهای برنامهنویسی، منابع فارسی بهتری داره.
یکی از منبعهای خوب فارسی برای یادگیری پایتون، میتونه آموزش پایتون مقدماتی جادی باشه که به رایگان هم منتشر شده.
بعد از یادگیری پایههای یک زبان برنامهنویسی، مؤثرترین کار تمرین هر چه بیشتره. پیشنهاد من حل کردن سوالهای ساده (معمولاً سؤالهای برنامهنویسی رو به سه دسته ساده، متوسط و سخت تقسیم میکنن) در وبسایتهای تمرین برنامهنویسیه که مسابقات برنامهنویسی هم برگزار میکنن. یکی از ویژگیهای خوب این سایتها اینه که جواب بقیه شرکتکنندهها و کسایی که این سوالات رو حل کردن رو هم میشه دید و مقایسه کرد. خوندن و فهمیدن راهحلهای بقیه، میتونه سهم بزرگی از یادگیری برنامهنویسی رو شامل بشه. من وبسایت leetcode رو برای تمرین برنامهنویسی پیشنهاد میکنم. جدا از این که راهحلهای نوشتاری بقیه شرکتکنندهها رو توی خود سایتشون میشه دید، مجموعههایی هستن که آموزش ویدیویی این سوالات رو هم منتشر میکنن. مثل کانال یوتیوب neetcode .
۳- نوشتن برنامههای بزرگ و پیچیده
هدف ما از یادگیری برنامهنویسی و نوشتن کد، حل کردن یک مسئله در دنیای واقعیه. مسائلی که در قسمت قبلی یاد میگیریم، معمولاً به تنهایی نمیتونن یک مسئله رو برای ما حل کنن؛ بلکه ما باید این مسائل کوچک رو در کنار هم قرار بدیم و یک مجموعه بزرگتر رو تشکیل بدیم تا در نهایت بتونیم یک مسئله واقعی رو حل کنیم. فرض کن که میخوایم برنامهٔ یک ماشینحساب رو بنویسیم. این ماشین حساب یک رابط کاربری داره که میتونه محاسبات جمع، تفریق، ضرب و تقسیم و یا محاسبات پیچیدهتر رو انجام بده. اینجا ما یک برنامه بزرگ داریم که از برنامههای کوچکتری مثل جمع، ضرب، تقسیم و برنامهٔ رابط کاربری تشکیل شده. محصولهای نرمافزاری ممکنه از یک یا چند برنامه بزرگ تشکیل شده باشن.
پیشنهاد عملی
خیلی خوبه که با توجه به حوزهٔ کاری مورد نظرت، پروژههای کوچک برای خودت تعریف و پیادهسازی کنی. مثلاً نوشتن یک بازی و یا یک وبسایت. برای شروع پیشنهاد میکنم که سعی کنی چیزی که وجود داره رو کپی کنی. مثلاً اگر مسیر برنامهنویسی فرانتاند رو انتخاب کردی، تلاش کن کد یکی از وبسایتهایی که دوست داری رو بنویسی.
مورد بعدی که میتونه خیلی مفید باشه اینه که کدهات رو در یک مخزن پروژههای متنباز مثل گیتهاب قرار بدی. این کار چند مزیت داره:
- کدهات پاک نمیشه حتی اگه کامپیوترت هم خراب بشه.
- وقتی کدت رو به صورت عمومی منتشر میکنی اعتماد به نفس بیشتری پیدا میکنی چون بقیه هم میتونن کدت رو ببینن.
- بقیه میتونن از کدهات استفاده کنن و پروژه رو گسترش بدن و یا مشکلاتش رو تصحیح کنن.
- میتونی به کدهای قبلیت برگردی و روند پیشرفتت رو ببینی.
۴- به سمت بینهایت و فراتر از آن!
بعد از نوشتن چند برنامهٔ بزرگ، برنامهنویسی کم کم وارد حافظه بدنت شده. دیگه به این فکر نمیکنی که for
چیکار میکرد و کجا باید ازش استفاده میکردی. از این به بعد چالشها متفاوت میشه و درگیر مسائل سطح بالاتری میشی. به این فکر میکنی که ماشین حساب رو چطوری میتونی بنویسی که با تعداد خط کد خیلی کمتری خروجی مشابهی بگیری. به این فکر میکنی که وبسایتی که نوشتی رو چطوری بهبود بدی که سریعتر عمل کنه و صفحه اول سایتت رو به جای ۱۰ ثانیه، توی ۱ ثانیه بارگزاری کنه.
تبریک میگم؛ این مرحله هیچ وقت تمومی نداره. چون که خود برنامهنویسی و ابعادش هیچ وقت تمومی نداره. هم مطالب و موضوعات خیلی زیادی برای یاد گرفتن وجود داره و هم این که هر روز به گسترهٔ این موضوعات اضافه میشه. امروزه زبان پایتون خیلی کاربرد داره. ممکنه سالها روی یاد گرفتن پایتون وقت و انرژی بذاری ولی ده سال دیگه اثری از پایتون نمونده باشه. همونطور که الان اثر زیادی از زبانهای مرسوم ۲۰ سال پیش نمونده. دنیای کامپیوتر دنیاییه که هر روز وسیعتر میشه و تو به عنوان برنامهنویس هر روز باید خودت رو با تغییرات وفق بدی. هرچند که به یکباره همه چی تغییر نمیکنه و معمولاً اصول و پایهها ثابت هستن.
برای این قسمت پیشنهاد عملی نمیشه نوشت چون کسی که به این نقطه رسیده باشه احتمالاً خودش میتونه مسیر آیندهاش رو بچینه؛ یا حداقل میدونه کجا میتونه دنبال پیدا کردن مسیرش باشه.
جمعبندی
برنامهنویسی یک مهارته که به تمرین و البته زمان نیاز داره. احتمالاً نمیشه با چند هفته و یا چند ماه فشرده کار کردن به جایگاه خیلی خوبی رسید. توی این نوشته سعی کردم مراحل یادگیری برنامهنویسی یک فرد تازه کار رو از زمانی که تازه شروع به یادگیری میکنه تا زمانی که به به نقطه خوبی در این حوزه رسیده باشه ترسیم کنم.
اگر نکتهای تکمیلی در مورد قسمتی از نوشتهها داری و یا این که منبع فارسی خوبی برای شروع یادگیری میشناسی، ممنون میشم توی نظرها بنویسی.
اگر این نوشته براتون مفید بود، پیشنهاد میکنم که عضو کانال تلگرام و یا مشترک خبرنامهٔ ایمیلی بشین تا هم شما سریعتر از نوشتههای بعدی مطلع بشین و هم من بهتر بشناسمتون :)