سلام خدمت همه دوستان
سال گذشته یک نقشه راه برای گولنگ ارائه شد، که خوشبختانه با بازخوردهای مفیدی روبرو شد و برخی از دوستان با همون نقشه راه تونستند فرصت شغلی مناسبی با گولنگ کسب کنند.
ویرایش ۲۰ شهریور ۱۴۰۱: پس از انتشار این مطلب، دوستان عزیزی پیشنهاداتی داشتند که در انتها در قسمت پیشنهادات مخاطبین بهشون اشاره کردم.
در این مطلب قرار هست در مورد نقشه راه بکند برای برنامهنویسان پایتون نکاتی ارائه بشه.
قبل از اینکه ادامه مطلب رو بخونید، به چند نکته توجه کنید:
- برای طی کردن این مسیر باید صبر و حوصله داشته باشید. هیچ چیزی ساده و سریع به دست نمیاد، یا اگرم بیاد پایدار نیست، پس سعی کنید برای خودتون یه برنامه مدون در نظر بگیرید.
- در این نقشه راه لازم نیست همه آموزشها و لینکهای مطرح شده در این مقاله رو بخونید، در هر بخش فقط کافیه یک آموزش مطالعه بشه، ولی اگه دیدید همچنان مشکل دارید، باز میتونید لینکهای بعدی رو هم مطالعه کنید و یا حتی خودتون در اینترنت به دنبال مطلبی باشید که فکر میکنید باهاش راحتترید.
- نقشه راهی که ارائه شده قطعا بهترین نقشه راه شاید نباشه، اما از نظر من به عنوان یه علاقهمند که شاید حتی خیلی از برنامهنویسی پایتون چیزی نمیدونید، میتونه شروع خیلی خوبی باشه براتون. فکر میکنم اگه این نقشه راه رو دنبال کنید، در مدت زمان معقولی (بسته به وقتی که روزانه صرف میکنید) بین ۳ تا ۶ ماه بتونید خودتون رو برای مصاحبههای استخدامی به عنوان برنامهنویسی junior پایتون و django در حوزه بکند، آماده کنید.
اگر در گوگل جستجو کنید، حتما مطالبی در این مورد وجود داره که سعی کردهاند به صورت کامل و جامع مطالبی که باید در مورد پایتون یاد گرفته بشه رو پوشش بدن، من چندتاشون رو در اینجا لیست میکنم:
- Python Developer
- Technologies to learn to become a Back End Developer (Python/Django)
- [The 2022 Python Developer Roadmap](The 2024 Python Developer Roadmap)
در این نقشه راه سعی شده که نگرش متفاوتی وجود داشته باشه و به جای اینکه تمرکز بر روی یادگیری پایتون باشه، تمرکز بر روی مفاهیم اساسی بکند باشه. بنده بر این عقیده هستم که اگر برنامهنویس دیدگاه درستی نسبت به چالشهای مهندسی نرمافزار به خصوص در حوزه بکند داشته باشه، خیلی راحتتر میتونه ابزار و زبان مورد نیاز برای حل اون چالش رو انتخاب کنه. پایتون در نهایت یک ابزار هست برای پیادهسازی و حل یک سری چالش. قطعا تسلط کامل روی پایتون میسر نیست مگر اینکه تلاش کنید زبان پایتون رو به عنوان یک ابزار در حل چالشهاش مختلف به کار بگیرید. بنده در اینجا سعی میکنم یک ذهنیت و دیدگاه، نسب به جایگاه چالشهای متفاوت در مهندسی نرمافزار و برنامهنویسی بکند رو تشریح کنم امیدوارم که مفید باشه.
قدم صفر - آشنایی با پایتون
برای زبان پایتون بیشمار منابع آموزشی انگلیسی وجود داره!
اگه با دوره ویدیویی راحتتر هستید شاید این لینک به شما کمک کنه دوره خوبی رو انتخاب کنید.
اگه با محتوای متنی و کتاب راحتتر هستید شاید منابع زیر برای شروع مناسب باشند:
- کتاب Learn Python the Hard Way
- کلاس Google’s Python
همچنین از طریق این لینک میتونید یه لیست از کتابهای پایتون رو مشاهده کنید و بسته به ارزیابی خودتون یکی رو برای مطالعه انتخاب کنید.
قدم اول - آشنایی با برنامهنویسی تحت وب
در قدم اول بهتره که با مفاهیم برنامهنویسی تحت وب و سمت سرور آشنا بشیم. یادگیری مفاهیم client و server، اینکه http server چیه و چطور کار میکنه و اینکه یک client و server از چه طریقی با هم در ارتباط هستند.
همچنین، بعد از آشنایی با مفاهیم اولیه بهتره که با مفاهیم HTTP و HTTP Methods و REST API آشنا بشیم. در این قسمت یک سری آموزش با زبان پایتون لیست شده که میتونه نقطه آغاز خوبی باشه.
خوندن بخشهایی از کتاب HTTP: The Definitive Guide میتونه دانش بهتری در این زمینه به ما بده.
همچنین مطالعه مستندات MDN در مورد HTTP میتونه بسیار مفید باشه.
در مرحله بعد، بهتره که با زبان پایتون سعی کنیم چند مثال و پروژه تمرینی رو به صورت REST API کد بزنیم. لینکهایی که در زیر لیست میشه میتونه نقطه آغاز خوبی باشه:
- Python and REST APIs: Interacting With Web Services
- How to Use the Python Requests Module With REST APIs
- Python REST API tutorial: Getting started with FastAPI
- The Right Way to Build an API with Python
قدم دوم - آشنایی با دیتابیس
به عنوان برنامهنویس بکند حتما باید دانش کافی از دیتابیسها داشته باشید. معمولا دانش نسبی از دیتابیسهای رابطهای در پروژههای مختلف لازم میشه، پس بهتون پیشنهاد میکنم حتما مفاهیم SQL رو یاد بگیرید و سعی کنید در یکی از پروژههای تمرینیتون از دیتابیسی مثل MySQL/MariaDB یا PostgreSQL استفاده کنید.
برای یادگیری SQL مطالعه آموزش سایت W3Schools میتونه شروع مناسبی باشه. همچنین سایت Guru99 مطالب خوبی رو در این زمینه منتشر کرده که پیشنهاد میکنم مطالعه کنید.
ضمنا اگه به دورههای ویدیویی علاقه دارید، سایت freeCodeCamp یک سری آموزشهای Crash Course برای دیتابیسهای رابطهای ارائه داده، که دیدنشون میتونه کمک زیادی به شما کنه که درک بهتری از دیتابیسهای رابطهای داشته باشید.
همچنین پیشنهاد میکنم این دو دوره آموزشی رو هم امتحان کنید:
- دوره Learn SQL
- دوره Introduction to Databases and SQL
در آخر، دیدن لیست دورههای Udemy و بررسی reviewهاشون میتونه شما رو در جهت پیدا کردن یه دوره ویدیویی خوب کمک کنه. سعی کنید دورهای که انتخاب میکنید برچسب Bestseller داشته باشه، یا حداقل علاوه بر رای بالای 4.5 تعداد شرکتکنندگان دوره بالایی هم داشته باشه. مثل این دورهها:
در سالهای اخیر، استفاده از دیتابیسهای NoSQL رایج شده و خیلی خوب میشه که شما هم تجربه کار با حداقل یک دیتابیس NoSQL رو داشته باشید.
ابتدا بهتره که انواع دیتابیسهای NoSQL رو بشناسید، به همین دلیل خوندن این مقاله از سایت Guru99 رو بهتون پیشنهاد میکنم.
دیتابیس MongoDB میتونه گزینه خوبی باشه برای یادگیری. دوره ویدیویی MongoDB - The Complete Developer’s Guide 2022 از Udemy یکی از دورههای ویدیویی هست که شما میتونید ببینید. همچنین ویدیو ۲ ساعته MongoDB Quickstart with Python از freeCodeCamp هم میتونه نحوه کار با این دیتابیس با استفاده از زبان پایتون رو به شما آموزش بده.
قدم سوم - آشنایی با مفاهیم و ابزارهای مورد نیاز برای http server
در برنامهنویسی بکند یک سری functionality رایج وجود داره، که معمولا اکثر پروژهها همه یا بخشی از این functionalityها رو پیادهسازی میکنند. مثلا برای کنترل سطح دسترسی کاربران به قسمتهای مختلف سایت لازمه که شما Authentication و Authorization رو پیادهسازی کنید. که این کار معمولا از طریق فراخوانی یک Middleware اتفاق میفته. همچنین نحوه کار JWT و نحوه استفاده از Cookieها در این زمینه مهمه.
اگر از دیتابیسهای رابطهای استفاده میکنید شما لازم دارید migrationهای دیتابیس رو در سرویستون مدیریت کنید.
تو این قسمت به شما پیشنهاد میکنم ابتدا یک web framework از بین فریمورکهای موجود برای زبان پایتون رو انتخاب کنید. در این مقاله یه لیست طولانی از فریمورکهای وب زبان پایتون رو مشاهده میکنید. البته با توجه به متداولتر بودن دو فریمورک Django و Flask یکی از این دو رو انتخاب کنید. طبیعتا فریمورک Django باز از محبوبیت بیشتری برخوردار هست.
اما برای اینکه درک مفاهیم ذکر شده برای شما وابسته به یک فریمورک خاص نشه، و همچنین با توجه به اینکه فریمورک Flask یک فریمورک ساده تر با قابلیتهای کمتر هست، بنده پیشنهاد میکنم حتما در حد یکی دو پروژه تستی کوچک کار با فریمورک Flask رو امتحان کنید. برای یادگیری Flask منابع ویدیویی و متنی خیلی خوبی وجود داره که من در اینجا چندتاشو لیست میکنم:
- دوره ویدیویی REST APIs with Flask and Python
- آموزش Flask از سایت FullStackPython
- پروژههای تمرینی Flask by Example
پس از اینکه چند پروژه تمرینی ساده با Flask رو تجربه کردید، بهتون پیشنهاد میکنم یادگیری فریمورک Django رو هم آغاز کنید. برای Django با توجه به اینکه محبوبیت بیشتری داره، منابع آموزش بیشتری هم وجود داره. در اینجا من به منابع ویدیویی و متنی خوبی که در جستجوهام بهشون رسیدم اشاره میکنم:
- آموزش سایت رسمی Django
- دوره ویدیویی Django For Everybody - Full Python University Course از freeCodeCamp
- دوره ویدیویی Python and Django Full Stack Web Developer Bootcamp
- آموزش متنی Django از Full Stack Python
- آموزش متنی Django از Real Python
- کتاب آنلاین Django Girls
- دوره ویدیویی پیشرفته Build a Backend REST API with Python & Django - Advanced
برای یادگیری عمیق خیلی خوبه که شما چندین و چند پروژه کوچک آموزشی رو با فریمورک Django کد بزنید، بنابراین پیشنهاد میکنم مقالات سایت freeCodeCamp رو در این رابطه حتما بررسی کنید.
قدم چهارم - انجام پروژه کوچک بصورت واقعی
پس از انجام یک سری پروژه تمرینی، شما باید مهارتهایی که آموختهاید رو برای ساخت یک پروژه واقعی هر چند کوچک به کار بگیرید. در اینجا من لیستی از پروژههای کوچک و واقعی که میتونه نقطه شروع خوبی برای شما باشه رو لیست میکنم:
- پروژه مدیریت فایل: در این پروژه شما باید فایلهای آپلودی کاربران را مدیریت کنید به نحوی که هر فایل آپلودی از طریق یک لینک در دسترس عموم قرار بگیرد.
- پروژه کوتاهکننده لینک: در این پروژه شما باید سرویسی ارائه دهید که هر لینک طولانی را به یک لینک کوتاه شده و unique نگاشت میکند و به کاربران اجازه میدهد با داشتن لینک کوتاهشده کاربران خود را به مقصد لینک طولانی هدایت کنند.
- پروژه review: در این پروژه کاربران میتوانند محصولات خود را تعریف کنند در سیستم، و مشتریان آنها اجازه دارند که برای هر محصول یک review شامل کامنت و rate بنویسند. باید یک سری api ارائه شود که بر اساس دستهبندی محصولات، لیست محبوبترین و منفورترین محصولات در اختیار عموم قرار بگیرد.
- پروژه social preview: در این پروژه کاربر یک لینک از شبکههای اجتماعی مثل اینستاگرام را به سرویس میدهد، سرویس در پاسخ باید یک preview از محتوای لینک پس بدهد، مثلا اینکه اگر عکسی هست thumbnail آن عکس در preview پس داده شود، یا title و author آن مشخص باشد.
در این مرحله بهتر است با یکی از ابزارهای REST API Client مثلا Postman یا Insomnia سعی کنید همه APIهای ارائه شده توسط سرویس خود را مستند کنید.
قدم پنجم - آمادهسازی برای استقرار
پس از اینکه پروژه واقعی خود را پیادهسازی کردید، بهتر است کار با ابزار Docker و مفاهیم آن را یاد بگیرید و سعی کنید یک Dockerfile برای پروژه خود آماده کنید. این مقاله، آموزش مناسبی برای این قسمت را ارائه میکند.
برای یادگیری Docker نیز، این مقاله، لیستی از دورههای آموزشی مطرح را ذکر کرده است.
قدم ششم - استقرار
پس از اینکه کار با Docker را بر روی سیستم توسعه خود یاد گرفتید و تونستید یک Dockerfile برای پروژه خودتون بنویسید، قدم بعدی این میشه که یک VPS اجاره کنید و سعی کنید سرویس خودتون رو بصورت واقعی روی اینترنت قرار بدید.
به همین منظور خوندن این مقاله از سایت رسمی Django میتونه خیلی مفید باشه.
همچنین این مقاله از سایت Real Python به شما آموزش میده به کمک ابزار docker-compose چطوری یک docker-compose config file برای پروژه خود آماده کنید.
قدم هفتم - پروژه بزرگ
پس از اینکه تونستید پروژه کوچک اما واقعی خود رو مستقر کنید روی یک سرور مجازی، وقتش رسیده که به سراغ پروژههای بزرگتر برید. در اینجا من لیستی از پروژههای بزرگتر رو بهتون معرفی میکنم:
- پروژه فروشگاه: پروژهای که مرسومه، و به اندازه کافی چالش داره، از قسمت مدیریت محصول و سفارشات گرفته تا مدیریت تراکنشها و ارتباط با درگاه پرداخت، همه و همه میتونه چالشهای خیلی جذابی برای آموختن باشند.
- پروژه تحویل مرسوله: یکی دیگه از پروژههایی که میتونه خیلی چالشبرانگیز باشه، پروژه تحویل مرسوله است. تو این پروژه شما باید یه سریس ماژول یا microservice داشته باشید که ویژگیهای real-time داشته باشند، مثلا بصورت آنی بشه track کرد که محصول در کجای مسیر هست و زمان تخمینی رسیدن به مقصد کی هست.
- پروژه news aggregator: تو این پروژه شما باید یک سری خزنده تعریف کنید که از سایتهای خبری لیستی از لینکهای خبر رو جمعآوری کنه، سپس با توجه به موضوع خبر، اونها رو دستهبندی کنید. در این پروژه معمولا حجم داده خیلی زیاد میشه و کلی چالش جذاب دیتابیسی خواهید داشت.
- پروژه چت: در پروژه چت چالشهای جذابی نهفته است. از نحوه برقراری ارتباط دو کاربر گرفته تا نحوه مدیریت لیست کاربران آنلاین در پلتفرم تا نحوه مدیریت فایلهای آپلود شده، همه و همه چالشهای جذابی برای آموختن هستند.
پروژههای بزرگتر، چالشهای پیچیدهتر هم دارند. علاوه بر اون، نگهداری کد و مانیتورینگ وضعیت سرویس پس از استقرار هم اهمیت بیشتری خواهد داشت. پس به صورت خیلی تیتروار، اینجا به چند نکته اشاره میکنم، که خیلی خوبه برای پروژه بزرگ حتما در نظر بگیرید:
- لاگ: برای پروژههای بزرگ، نحوه لاگ کردن درخواستها بسیار مهمه، پس حتما سعی کنید از کتابخانه درستی استفاده کنید و برای لاگ کردن درخواستها حتما یک ساختار منظم و یکپارچه در کل سرویس در نظر بگیرید.
- مانیتورینگ: پس از استقرار سرویس، بحث مانیتور کردن سرویس خیلی مهم میشه. اینجاست که بحث ابزارهایی مثل prometheus برای در نظر گرفتن metricهای یک سرویس خیلی مهم میشه. سعی کنید برای سرویس rest apiتون حتما prometheus رو راهاندازی کنید و از طریق داشبورد grafana برای متریکهای مختلف سرویستون داشبورد و پنل طراحی کنید.
- پروسه ci/cd: در پروژه بزرگ معمولا تعداد دفعاتی که یک پروژه روی سرور مستقر میشه خیلی زیاد هست، روزی چندین بار. پس بهتره که پروسه ci/cd رو در پروژهتون در نظر بگیرید. این پروسه به شما کمک میکنه کدی که مینویسید خیلی سریع روی سرور اصلی سرویس مستقر بشه.
پیشنهاد مخاطب
دوست عزیز، مهندس رضا سرداری، که سالها تجربه کار با زبان پایتون رو دارند، مطالعه این دو کتاب رو خیلی توصیه کردند:
مخاطب عزیز، احمد جان، توصیه کردند در کنار تجربه کار با Flask و Django حتما فریمورک FastApi رو هم بررسی کنید.
یه نگاهی به FastApi هم بندازید😁 مثل فریمورک های گو سادست و بخاطر نحوه سریالایز کردنش توسط pydantic پرفورمنس به نسبت خوبی هم ارائه میده به نسبت جنگو که یک فریمورک sync هستش