سلام و درود
امیدوارم که خوب باشید و حال دلتون رو به راه باشه.
امروز میخوام با هم در مورد مسیر شغلی یک نفر در حوزهی دواپس صحبت کنیم مسیری که خب خیلی طولانی و سنگین هست ولی به اندازه کافی جذاب و دوستداشتنیه که میشه سختیهاش رو باهاش شیرین کرد.
قبلا تو این پست در مورد اینکه دواپس چی هست و چرا لازمه صحبت کردم. پیشنهاد میکنم اگر با دواپس آشنا نیستی قبلش حتما این پست رو بخونی.
مسیر شغلی دواپس از جاهای مختلفی میگذره و تنوع خیلی زیادی داره و تقریبا شاید به تعداد آدمهای که هستند این مسیر میتونه متفاوت و متنوع باشه. اما مسیری که من دوست دارم و به شما هم پیشنهاد میکنم این مسیر هستش که به نظرم این سایت مسیر خوبی رو پیشنهاد میکنه و مداوم هم سعی داره که به روزش کنه. همونطور که قبلا هم اشاره کردم مسیر دواپس خیلی طولانی هست و در هر قسمت هم ابزارهای مختلف که هر کدوم دنیای متفاوتی رو برای ما ایجاد میکنند. اینجا به برخی از این موارد اشاره میکنم و در ادامه هم تعدادی از تجربیات خودم رو با شما به اشتراک میگذارم.
اینجا من با توجه به همون مسیر شغلی که بالاتر بهش اشاره کردم، پیشنهادات خودم رو میگم. البته که معلومه این نظر شخصی من هست و انتخاب شما میتونه متفاوت از این باشه. من سعی کردم قسمتهای مهم رو یه بررسی ریزی بکنم و پیشنهاد خودم رو تو هر قسمت باهاتون به اشتراک بگذارم. بریم که بیشتر با این مسیر شغلی آشنا بشیم.
در ابتدای راه شما نیاز دارید که یه زبان به صورت اسکریپتینگ بدونید و باهاش آشنا باشید. که من پیشنهاد میکنم پایتون یا گولنگ رو یاد بگیرید. این خیلی مهمه که دارید تو چه تیمی کار میکنید. معمولا سعی میکنیم زبانی که انتخاب میکنیم هم استک برنامهی اصلی پروژه باشه که خیلی میتونه به فرآیند رفع اشکال و نگهداری سرویسهای ما کمک میکنه. گاهی پیش میاد که افراد در برخی از پروژهها بیشتر نزدیک به development باشند یعنی خیلی درگیر کد و فرآیند توسعه هستند و خوب این افراد بیشتر نیاز دارند که روی اون زبان مورد نظر تسلط داشته باشند. اما در برخی از پروژهها برعکس این شما بیشتر درگیر زیرساخت و موارد پیرامون آن خواهید بود. اینجا بیشتر برای توسعهی یک ماژول یا exporter نیاز دارید که کد بزنید و باهاش مواجه باشید. این مهمه که کجای این طیف هستید ولی مهمتر اینکه باید بتونید تو این زمینه فعالیت داشته و موثر باشید.
انتخاب سیستم عامل یکی از مهمترین موضوعاتی است که باید براش تصمیم بگیریم. چون تمام تصمیمات و موارد بعدی تحت شعاع این تصمیمگیری خواهد بود. توصیه و پیشنهاد من حتما استفاده از لینوکس هست و تو لینوکس هم حتما توزیع Debian و بعدش توزیع Ubuntu هستش. به نظرم دیگه لازم نیست در مورد این صحبت کنیم که چرا لینوکس ولی میتونیم در مورد این صحبت کنیم که چرا debian و این موضوع رو میتونیم باهم بررسی کنیم. به نظرم debian تو این چند سالهی اخیر مثلا ۱۰ سال اخیر از بهترین توزیعهای لینوکس بوده و هست و خیلی پایدار و استیبل بوده برای همین اعتماد زیادی میشه بهش کرد. شاید دیرتر نسبت به ubuntu به روز بشه اما خیلی استیبلتر از اون هست.
خب لازمه که سیستمعاملی که انتخاب کردیم رو بشناسیم و بتونیم باهاش کار کنیم. این موضوع خیلی مهمه. چون معمولا لینوکس برای استفاده عمومی آماده شده است و اگر برای استفاده خاصی نیاز داریم که ازش استفاده کنیم باید برای همون استفاده اون رو آماده کنیم. پس در نتیجه با توجه به نیازمندی که داریم باید سیستمعامل خودمون رو امنتر (Hardening) و کارایی آن را افزایش (Tuning) دهیم. حتما حتما توصیه میکنم که کار با bash script رو هم یاد بگیرید که خیلی جاها میتونه بهتون کمک کنه. برای خیلی از جاها ما نیاز داریم که اتومیشن داشته باشیم و برخی از کارها رو با اون پیش ببریم که Bash Script میتونه خیلی بهمون کمک کنه.
موضوع مهم دیگه کار با Git هست که خوب دیگه جز ابتداییترین مهارتهایی هست که هر فرد باید در این حوزه داشته باشه. باید گیت رو بدونیم و بتونیم باهاش کار کنیم و موضوعات خودمون رو پیش ببریم. حالا اینکه از چه VCS Hosting داریم استفاده میکنیم زیاد مهم نیست. اینکه gitlab باشه یا github واقعا فرقی نمیکنه. مهم اینه که ما بتونیم با گیت کار کنیم و تمام ساختار و سامانههای خودمون رو با استفاده از آن مدیریت کنیم.
پس لینوکس و کار باهاش خیلی برامون مهمه و تقریبا هم هر چقدر زمان براش بذاریم کمه چون همیشه یه چیزی داره که ما بتونیم یاد بگیریم. اینجا حتما پیشنهاد میکنم که کتاب بخونید و کتاب How linux works رو بهتون پیشنهاد میکنم که خوب کتابی هست. کلا من معمولا تو دورههام دو تا چیز رو اگر بگم به عنوان پیشنیاز هست یکی لینوکس و کار باهاش هست و یکی دیگه هم git و کار با آن است.
موضوع نتورک هم خیلی برامون مهمه و باید دید خوبی داخل نتورک هم داشته باشیم. معمولا موضوع نتورک و کار با سوییچها و روترها رو سرویس میگیریم. اما باید نتورکینگ در سطح سیستمعامل رو بدونیم و بتونیم باهاش کار کنیم. باید نتورک داخل سرویس خودمون رو بدونیم. به نظرم کتاب +Network خیلی میتونه کمک کنه و بهمون دید خوبی برای شروع میده.
معمولا reverse proxy یکی از متداولترین ابزارهایی هست که ما داریم استفاده میکنیم. برای همین لازمه که کار با یکی از بهترینها تو این حوزه یعنی Nginx رو بدونیم. این ابزار بهمون امکان این رو میده که هر جا نیاز داشتیم load balancer داشته باشیم یا cache server میخواستیم یا اگر لازم بود فایل serve کنیم بتونیم ازش استفاده کنیم. کلا nginx ابزار بسیار قدرتمندی هست که توصیه میکنم حتما باهاش کار کنید. کنار nginx من یه ابزار دیگه که خیلی دوستش دارم هم معرفی میکنم که درسته برخی از قابلیتهای nginx رو نداره ولی تو خیلی از موارد میتونه راحتتر از nginx کارمون رو پیش ببره. Traefik ابزاری هست که امکان reverse proxy و load balancer رو بهمون میده و با امکان automatic configuration که در اختیار ما قرار میده میتونیم به راحتی باهاش سرویسهای خودمون رو کانفیگ کنیم. معمولا وقتی داریم از داکر استفاده میکنیم traefik خیلی میتونه بهمون کمک کنه. در کل لازمه که کار با یه reverse proxy رو بدونید و باهاش بتونید سرویسها و سایتهای خودتون رو ایجاد و مدیریت کنید.
مبحث بعدی کانتینرها هستند. که خوب الان دیگه همهجا حرف از اونا هست و دیگه باید سرویسهای خودتون رو به سمت استفاده از کانتینرها ببرید. محبوبترین و شاید بتونیم بگیم یکی از بهترین پلتفرمهایی که میشه باهاش با کانتینرها کار کرد Docker هست که از سال ۲۰۱۴ ارائه شده و هنوز تو سال ۲۰۲۳ بی رقیب و یکهتاز عرصهی کانتینرها هستش. کار با داکر رو یاد بگیرید که خیلی میتونه تو نگهداری و پایش سرویسها بهتون کمک کنه. کلا هر جایی بخوام سرویسی بالا بیارم که نگهش دارم و مدیریتش کنم حتما از داکر استفاده میکنم. چون مدیریت و نگهداری سرویسها باهاش خیلی راحت تره و بهمون خیلی میتونه کمک کنه. این ویدئوی چند دقیقهای میتونه نگاه خوبی رو بهمون منتقل کنه. برای داکر هم پیشنهاد میکنم کتاب docker up and running رو بخونید که کمکتون میکنه تا درک بهتری از داکر و مفاهیم اون پیدا کنید. از سایت داکرمی هم میتونید استفاده کنید که اونجا این مفاهیم رو به صورت فارسی سعی کردم توضیح بدم.
کار با کلاد پروایدرها برای یک نفر که تو حوزهی دواپس کار میکنه لازمه. یعنی باید بتونه روی پروایدرهای مختلف کلاد کارهای خودش رو انجام بده و بتونه سرویس خودش رو استقرار بده و نگهداری کنه. متاسفانه تو ایران ما با تحریم ظالمانه و فیلتر احمقانه مواجه هستیم از این رو خیلی از این پروایدرها برای ما منع دسترسی دارند. خب لازمه که ما یاد بگیریم و بتونیم با آنها کار کنیم. ما باید برای خودمون مسیری رو ایجاد کنیم که بتونیم از هر دوی این محدودیتها عبور کنیم تا بتونیم کارهایی که لازم هست رو انجام بدیم و پیش ببریم.
ما تو دواپس همه چیز رو خودکار میکنیم. یه فکتی هست که میگه اگر قراره هر کاری رو دوباره انجام بدیم حتما براش اتومیشن ایجاد میکنیم. کلا من معتقدم که کار تکراری برای ماشین است و انسانها باید ماشینها رو مدیریت کنند. دقت کنید باز تکرار میکنم که همه چیز رو خودکار میکنیم. برای همین خیلی automation و کلا موضوع infrastructure as code برامون مهمه. یعنی تمام تلاشمون رو میکنیم که تمام زیرساختی که آماده میکنیم تا نرمافزارها روی آن استقرار پیدا کنند به صورت خودکار آماده، پایش و نگهداری شود. برای انجام این مهم چند تا تکنولوژی بهمون کمک میکنند.
اولی CI/CD هست که فرآیند Build, Test, Deploy رو باهاش پیش میبریم. کلا به نظرم کار ما به قبل و بعد CI/CD میتونه تقسیم بشه. قبلا این طوری بود که هر وقت میخواستیم تو پروداکشن دیپلوی کنیم غافلگیر میشدیم و با مواردی مواجه میشدیم که انتظارش رو نداشتیم اما الان با وجود CI/CD ها کار ما خیلی اصولی شده تو محیطهای تستی بارها و بارها دیپلوی کردن رو تست و بررسی کردیم در نتیجه با خیال راحت توی پروداکشن میتونیم دیپلوی کنیم. اینجا ابزارهای خیلی زیادی وجود داره که من خودم ترجیحم gitlab ci/cd هست و به شما هم توصیه میکنم تا ازش استفاده کنید. ما با CI/CD معمولا push deployment خواهیم داشت. در کنار فرآیند CI/CD کانسپت دیگهای هست به اسم Gitops که با حضور Kubernetes خیلی پر استفاده و محبوب شده که Argo-cd از بهترینها تو این زمینه هستش. ابزاری که کمک میکنه تا ما pull deployment داشته باشیم. بسیار ساده و اصطلاحا خوش دست هست که راحت میتونید باهاش تمام فرآیند دیپلوی روی kubernetes رو خودکار کنید.
تکنولوژی بعدی Configuration Management هست که معمولا ما باهاش سرورها رو آماده و نگهداری میکنیم. خیلی از اوقات سرویسهای خودمون رو هم با استفاده از آن مدیریت میکنیم. تو این قسمت من Ansible رو بهتون توصیه میکنم که الحق یکی از بهترینها هست. اگر پایتون بلد باشید کار با انسیبل خیلی میتونه براتون راحت باشه. انسیبل کلی ماژول داره که تقریبا با همهچیز یکپارچه شده و به راحتی میتونیم باهاش زیرساختهای خودمون رو مدیریت، پایش و نگهداری کنیم. اینجا هم کتاب Ansible up and running رو بهتون پیشنهاد میکنم.
موضوع بعدی infrastructure as code هست که اگر از پروایدر کلادی برای زیرساخت خودتون استفاده میکنید بهترین گزینه است. Terraform تو این زمینه نامبر وانه و تقریبا همه ازش استفاده میکنند. با استفاده از terraform میتونید تمام کارهایی که برای ایجاد و نگهداری سرویس و سامانهی خودتون انجام میدید رو به صورت کد داشته باشید و با اعمال آن به صورت کامل تمام زیرساخت خودتون رو تحویل بگیرید.
کلا کار با ابزارهای automation خیلی برای من هیجان داره. میشینم یه بار تمام کارهایی که قراره انجام بدم رو خودکار میکنم دیگه ماشینها میتونند کار من رو انجام بدن. این کار برای من خیلی جذابه. همانطور که اشاره کردم ما همه چیز رو خودکار میکنیم و برای این مهم ابزارهای زیادی داریم. کلا راه برای رسیدن بهش خیلی زیاده که از یک طریقی سعی میکنیم که تمام اکشنها و فرآیندهایی که لازم داریم تا سرویس آماده بشه رو باهاش خودکار کنیم. وقتی همهچیز از کد باشه بهمون کمک میکنه که قابل انتقال باشه، قابل تکرار باشه و قابل بهبود باشه که این موضوعات از اصول اصلی دواپس هستند.
و اما Observability که دنیای خودش رو داره. کلا مانیتورینگ و لاگینگ چشم و گوش ما تو سرویسها و سیستمها هستند و یکی از اصول مهم دواپس هم به شمار مییاد. ما باید تلاش کنیم که همواره شهود خودمون رو نسبت به سرویسها و سیستمها و سامانهها بیشتر و بیشتر کنیم. و این کار اصلا تمومی نداره و باید همواره رو به بهبود باشه و رشد کنه. تو این قسمت هم ابزارها خیلی زیاد است که من برای مانیتورینگ استک Prometheus به همراه Grafana رو پیشنهاد میکنم که خیلی کار رو براتون راحت میکنه و تقریبا همه چیز رو میتویند باهاش مانیتور و پایش کنید. برای لاگینگ استک قدرتمند و سنگین ELK یا EFK است که خیلی میتونه بهتون تو اسکیلهای بزرگ کمک کنه. اما برای اسکیلهای کوچیک با قابلیتهای کمتر Loki از خانوادهی محترم Grafana رو پیشنهاد میکنم که با استک مانیتورینگ خوب جور در میاد و کنار هم عالی میشه. اما Observability یه اصل دیگه به نام tracing هم داره که اینجا توصیه میشه از Jaeger استفاده کنیم اما از grafana tempo هم غافل نشید که خوب ابزاری هست. چیزی که مهمه اینه که بیشترین شهود رو نسبت به سیستمها و سامانههایی که ایجاد کردیم داشته باشیم. هر چقدر ما تلاش کنیم که شهودمون بیشتر بشه مشکلات و معضلاتی که باهاش مواجه میشیم به مراتب کمتر و کمتر میشه.
تو این زمینه دو تا نکته بگم بهتون اولی اینکه از opentelemetry اصلا غافل نباشید که روش استانداردی هست که تقریبا میشه تمام قسمتها رو باهاش پوشش داد. و دومین موضوع خانوادهی محترم Grafana هستش که تقریبا برای همهی قسمتها یه راهکاری بهتون ارائه میکنه. احتمالا در آینده از این دو تا استک حرفهای بیشتری تو زمینهی Observability خواهیم شنید.
کلا تو تمام مسیر دواپس و استقرار نرمافزار و سرویسها ما با کلی آبجکت مواجه هستیم که میتونیم آنها رو cache کنیم. این تو ایران که مشکل اینترنت، تحریم و فیلتر داریم خیلی بیشتر از بیش هم لازمه. با cache کردن ما این امکان رو برای خودمون ایجاد میکنیم که هر چیزی که تو جاهای مختلف لازم داریم رو یکبار از اینترنت دریافت کنیم و در مواقع بعدی از cache خودمون که خیلی سرعت بالاتری داره بگیریم. معمولا این cacheها رو تو شبکهی خصوصی یا نزدیکترین جا به سرویسهای خودمون ایجاد میکنیم. وقتی شما کلاستر بزرگ دارید این موضوع مشهودتر هم هست. وقتی داری با داکر و کوبرنتیز کار میکنی که خیلی برات الزامی هم میشه. داستان چیه؟ ببینید به صورت کلی تمام پکیجهایی که تو سیستمعامل نصب میکنی، تمام ایمیجهای داکر و کوبرنتیز، تمام پکیجهایی که تو زمان بیلد بهشون نیاز داری قابلیت cache کردن دارن و ما میتونیم با استفاده از سرویسهایی مثل nexus repository که خیلی transparent و هوشمندانه این کار رو انجام میده تمام اونها رو cache کنیم تا در دفعات بعدی با سرعت خیلی بالاتری آنها رو بگیریم و ازشون استفاده کنیم.
تو این زمینه ابزار Jfrog واقعا قدرتمند هست و کار باهاش به مراتب از nexus راحتتره اما خوب رایگان نیست و سرویس nexus بیشتر همون امکانات رو به صورت رایگان در اختیار ما قرار داده. ترکیب nexus برای cache و minio برای نگهداری آبجکتها خیلی میتونه کمک کننده باشه و تو اسکیلهای بزرگ راهکار مطمئنی است. Minio بهمون سرویس آبجکت استوریج میده و ما میتونیم ازش به عنوان بکند تمام سرویسهایی که آبجکت میخوان ذخیره کنند استفاده کنیم.
دیگه وقت Orchestration هست که تو این زمینه تقریبا همه اتفاق نظر روی جناب Kubernetes دارند که اونقدر قدرتمند و کارا هست که تقریبا تو این زمینه بی رقیبه. کلی هم ابزار باهاش Integrate شده تا کار باهاش رو برامون سادهتر کنه. فارغ از اینکه الان میتونید تو زیرساخت خودتون ازش استفاده کنید یا نه توصیه میکنم حتما یادش بگیرید که کلی میتونه بهتون تو نگهداری سرویسها و سیستمها کمک کنه. کلی فرآیند داره که یادگیریش و دیدش بهتون میتونه کمک کنه. یکی از نکاتی که تو kubernetes باهاش مواجه هستیم این دیدگاه توصیفی هست. اینکه ما تعریف میکنیم که چه چیزی میخوایم و kubernetes تلاش میکنه تا اون موضوع رو برای ما فراهم کنه. تو این زمینه هم کتاب Kubernetes in action رو پیشنهاد میکنم که خیلی از موارد مربوط به اون رو پوشش داده و خیلی خوب میتونه دید شما رو نسبت به کوبرنتیز باز کن و ازش یاد بگیرید. این سایت هم به نظرم داکیومنتهای خیلی خوبی در مورد کوبرنتیز و آموزش اون داره که از دستش ندید. مفاهیم کوبرنتیز رو به صورت ساده و کامل آموزش میده که حتما بهش مراجعه کنید و ازش یاد بگیرید. البته اینم بگم که سایت خود کوبرنتیز خیلی کامل و جامع هست طوری که شاید شما دیگه نیاز به چیزی نداشته باشید ولی دو تا منبع دیگهای که معرفی کردم کلی میتونه بهتون کمک کنه که این مسیر رو بهتر طی کنید.
همان طور که دیدید کار سخته ولی شدنیه و خیلی میتونه جذاب هم باشه. مسیر طولانی هست ولی میتونید با استپهای کوچیک شروع کنید و آروم آروم پیش برید تا تمام مسیر رو یاد بگیرید و داخلش قوی بشید.
در ادامه برخی از توصیههای خودم رو میگم که شاید بتونه بهتون کمک کنه.
به نظرم الان میتونید یه دید خوبی از مسیر شغلی دواپس داشته باشید. امیدوارم که بتونید درست انتخاب کنید و این نکات بهتون کمک کنه.
این مسیری که از ابتدای این پست باهم مرور کردیم مسیری بود که من پیشنهاد دادم. تقریبا میتونم بگم تو اصول همهی مسیرها همین هست ولی ممکنه تو انتخاب ابزارها متفاوت باشه. مهم چیه! مهم اینه که شما شروع کنید و تو مسیر قرار بگیرید تا آروم آروم پیش برید. هیچ دوره یا معجونی وجود نداره که شما رو چند ماهه دواپس کار بکنه. پس خودت که دوره میگذاری چیه؟ این دورهها کمک میکنه که سرعت شما تو یادگیری مفاهیم بیشتر بشه. کمک میکنه که جامپ کنی و گیر نکنی ولی تا تو تجربه نکنی و تمرین و تلاش نکنی نمیتونی چیزی یاد بگیری.
شاید مسیر طولانی باشه اما دستیافتنی است. ممکنه یکی با یه بار خوندن و انجام دادن یاد بگیره یکی دیگه با پنج بار، مهم اینه که هر دو میتونند یاد بگیرند. اگر جایی گیر کردی و نتونستی خوب درکش کنی بهش آگاه باش و سعی کن تو جامعهی دواپس بگردی و یکی و پیدا کنی که کمکت کنه تا مفهوم برات جا بیافته. اصلا سر خورده نشو، اصلا کم نیار، تلاش کن تا بهش برسی.
شاید الان تو سن من این جمله راحت باشه که بگم صبور باشید ولی برای تو که داری شروع میکنی و احتمالا سن کمتری داری زیاد جذاب نیست و دوست داری خیلی سریع بهش برسی. اما دارم دوستانه بهت میگم، عزیز من صبور باش و سعی کن همیشه پیشرفت کنی. هر چند پیشرفت کوچیک و کم، ولی وقتی تو مدارش باشی و همیشه پیشرفت کنی بهت کمک میکنه که بعد از گذشت زمان خیلی از قبل خودت بهتر شده باشی. حتما دقت کن که فقط خودت رو با خودت مقایسه کنی. خودت رو با قبل خودت نه با دیگران که ممکنه برات دلسردی ایجاد کنه و اعتماد به نفست رو کمتر کنه.
اگر تو اول راه هستی حتما سعی کن به یه منتور دسترسی داشته باشی که بهت مسیر رو بده و بگه تو هر قسمت چقدر وارد بشی. چون دانش کم و سطحی به اندازهی گیر کردن تو یه موضوع میتونه بد باشه. منتور اینجاها بهت کمک میکنه که بدونی چقدر تو هر موضوع پیش بری. منتور کمکت میکنه که دیدگاه درست رو پیدا کنی و درک کنی که چی درسته و چطور باید پیش بری.
در آخر هم من قبلا یه پست نوشته بودم و با خودم زمانی که ۲۰ سالم بود صحبت کرده بودم. شاید بتونه بهت کمک کنه. اونجا در مورد این صحبت کردم که اگر الان ۲۰ سالم بود چی کار میکردم و چطور پیش میرفتم.
شاد و پیروز باشید.