CloudyGo
212 subscribers
8 photos
1 video
1 file
41 links
Software Engineering & Development Best Practices, Especially in Golang!


https://cloudygo.ir

@rezakhademix
Download Telegram
#course
#teach_me_live

سلام دوستان
در نظر دارم تا اولین دوره آموزش برنامه‌نویسی مقدماتی تا پیشرفته گولنگ رو به‌صورت جلسات live coding برگزار کنم.

دوره سرفصل‌های کاملی از آموزش برنامه‌نویسی وب با زبان گولنگ خواهد بود و از مفاهیم پایه تا نوشتن یک اپلیکیشن کامل تحت وب به‌صورت API رو‌ به صورت جلسات لایو طراحی، کدنویسی و دیباگ خواهیم کرد.


سرفصل‌ها:
۰. جلسه صفرم آشنایی و اهداف
۱. چرا گولنگ
۲. مفاهیم پایه و ذهنیت توسعه با گولنگ
۳. نوع داده‌ها در گولنگ
۴. جنریک و اینترفیس‌ها
۵. ساختارهای شرطی
۶. مدیریت خطاها در گولنگ
۷. کانکارنسی در گولنگ
۸. مدیریت لاگ‌ها و‌ لاگ‌های ساختار یافته
۹. ایجاد وب‌سرور گولنگ و مقایسه با روترهای Gin, Chi و...
۱۰. داکر و داکر کامپوز
۱۱. آموزش Clean Arch و مینی پروژه
۱۲. نگاهی به دیتابیس‌ PostgreSQL
۱۳. نرمالایز کردن دیتابیس
۱۴. آموزش Materialized Views, CTE, Analyzing Queries
۱۵. ایندکس‌ها در دیتابیس

۱۶. نوشتن یک پروژه مشابه اینستاگرام شامل:
ـ authentication
ـ authorization
ـ swagger
ـ seeder
- چرا ORM خیر و توسعه یک کوئری بیلدر
ـ پست‌ها
ـ استوری‌ها
- لایک‌ها، دیسلایک
ـ کامنت و پاسخ‌ها
ـ فالو کردن افراد و منشن‌ها
ـ ویدیو و تصاویر
ـ آبجکت استوریج MinIO/S3
ـ race condition و distributed lock
ـ Idempotency
ـ async task
ـ cache
ـ cronjob
- پرومتئوس و گرافانا
- لودتست و K6
ـ مانیتورینگ اپلیکیشن و دیتابیس
ـ دیپلوی کامل
ـ میکروسرویس‌ها چرا و چگونه؟
ـ توسعه مایکروسرویس‌ها
ـ RabbitMQ
ـ gRPC و Protobuff
- نکات مهم در مایکروسرویس‌های توسعه‌یافته

ـ Bonus:
ـ نگاهی بر تست نویسی در گولنگ


جزییات جلسات دوره را در وب‌سایت کلادی‌گو مشاهده کنید.

https://cloudygo.ir/register


این دوره ضمانت بازگشت وجه داره و تا پیش از شروع فصل آخر شما میتونید در هر زمان که تمایل داشتید تمام وجه پرداخت شده رو دریافت کنید.
👍52
یکی از مسائلی که هنگام scale کردن دیتابیس برای تیم توسعه می‌تونه اتفاق بیفته ایجاد Replication دیتابیس و جداسازی کوئری‌های Read و Write است.

بدین معنی که شما یک/چند دیتابیس Main و به تعداد نیاز دیتابیس Replica خواهید داشت که هر کوئری که از جنس نوشتن، سمت دیتابیس Main و هر کوئری که هدفش خواندن اطلاعات باشد در یکی از instanceهای رپلیکا اجرا می‌شود.

در گولنگ نوشتن چنین امکانی بسیار ساده است اما باید استراتژی‌های مناسبی برای لود بالانس دیتابیس‌ها، به‌درستی Sync کردن دیتا (Data Consistency)، مدیریت I/O و جلوگیری از ایجاد Nework Overhead درنظر داشت.

شخصا یک‌مرتبه از پکیج زیر برای ایجاد دیتابیس‌های Read/Write استفاده کردم که در ابتدای مسیر تا حد مناسبی نیازهای اصلی پروژه را پوشش می‌داد.
https://github.com/bxcodec/dbresolver

احتمالا در طول مسیر برای کنترل صحیح‌تر مجبور می‌شوید پکیج اختصاصی خودتان را ایجاد کنید.

در این مسیر حتما به پترن CQRS توجه کنید. علاوه‌بر این، الگوریتم‌هایی مثل Raft و Paxos می‌توانند برای ایجاد Eventual Consistency کاربردی باشند.

در پست‌های بعدی با راه‌حل چالش‌ها آشنا خواهیم شد

#tip
👍6
سلام
امروز آخرین روز ثبت‌نام دوره صفر تا صد گولنگ با تخفیف ۲۱ درصدی هست.
از همه عزیزانی که ثبت‌نام کردند،‌ ممنونم

در حال حاضر ظرفیت گروه‌های اول و سوم کاملا تکمیل شده و فقط گروه دوم در حدود ۳ نفر ظرفیت خالی دارد و اگر تمایل به‌حضور دارید، به بنده پیام بدید.

ساعت برگزاری جلسات گروه دوم جمعه‌ها از ساعت ۹ الی ۱۴ خواهد بود و دوره برای گروه دوم از تاریخ ۳ اسفند آغاز خواهد شد.

به امید روزهای روشن...

@rezakhademix
3
در اکثر مواقع استفاده از لینترها در هر زبانی میتونه از جنبه‌های مختلف کمک زیادی برای بهبود کدها انجام بده اما هنوز هم دولوپرها بخوبی باهاشون آشتی نکردن.

لینترها با هزینه پایین، میتونن کدها رو از جنبه‌های مختلفی بررسی کنن و خب لینترهای گولنگی هم از این قاعده مستثنی نیستند.

لینترهای گولنگی می‌تونن بهمون کمک کنن:

1. فیلد‌های یک struct طوری بچینیم که با ساختار memory سازگارتر باشه و مموری فوت‌پرینت رو کمتر کنیم

2. هر زمان که فراموش کردیم یه خطا رو به‌درستی لاگ یا wrap کنیم بهمون اخطار بدن

3. کدهای duplicate رو تشخیص بدن

4. اجازه ندن هر dependency در هرجایی ایمپورت بشه

5. از هاردکدها و مجیک نامبرها جلوگیری میکنن

6. برای ifهای بیش از اندازه توو در توو نمره منفی میذارن

7. حتی میتونیم اجازه ندیم بعضی مواقع اسلایسی بدون ظرفیت مناسب تعریف بشه

لینتر golangci در کامیونیتی گولنگ بسیار محبوب هستش و خیلی در پروژه‌های گولنگی کمک‌کننده خواهد بود.
https://golangci-lint.run/


اگر کلا با لینترهای گولنگی آشنا نیستین و نمیدونید چطور باید تنظیمات رو انجام بدید، مقاله زیر یک راهنمای کامل برای شماست.

https://rezakhademix.medium.com/what-is-a-golang-linter-and-how-to-use-it-1bffc0bd8062
مقاله زیر ایجاد یک RAG ساده رو به ما آموزش میده تا علاوه بر اتصال به مدل‌های مختلف مثل: Open AI و... بتونیم داکیومنت‌های خودمون رو بهش بدیم و ازش در خصوص محتوای ارائه شده، سوال بپرسیم

https://entgo.io/blog/2025/02/12/rag-with-ent-atlas-pgvector/
نوشتن middleware برای اجرا مجموعه‌ای پروسه‌ها قبل از رسیدن درخواست به هندلر برای gRPC سرور کار دشواری نیست.

اما خب اگر تمایل دارین پکیجی استفاده کنین که خودش خودکار لاگ بزنه و ردیابی رو‌ با استانداردهای Otel در اختیارتون قرار بده و‌ مواردی
مثل:
Auth,
Metrics (Prometheus),
Logging,
Selector,
Validator,
Ratelimit

و غیره رو خیلی راحت‌تر داشته باشین، یه نگاهی به پکیج زیر بندازین.

نمونه کد:

 grpcSrv := grpc.NewServer(
grpc.StatsHandler(otelgrpc.NewServerHandler()),
grpc.ChainUnaryInterceptor(
srvMetrics.UnaryServerInterceptor(grpcprom.WithExemplarFromContext(exemplarFromContext)),
logging.UnaryServerInterceptor(interceptorLogger(rpcLogger), logging.WithFieldsFromContext(logTraceID)),
selector.UnaryServerInterceptor(auth.UnaryServerInterceptor(authFn), selector.MatchFunc(allButHealthZ)),
recovery.UnaryServerInterceptor(recovery.WithRecoveryHandler(grpcPanicRecoveryHandler)),
),
)

https://github.com/grpc-ecosystem/go-grpc-middleware



#package
#golang
👍3🙏1
به نظرتون اینستاگرام یا توییتر چطور به ‌این سرعت تعداد لایک‌ها یا بازدیدهای یک پست رو نمایش میدن؟

آیا در این حجم داده یک کوئری دیتابیسی و cache یا روشهایی مثل distribution کافیه؟
خب Google Analytics‌‌ چطور می‌تونه این حجم داده از جنس بازدید یکتا، تعداد کلیک یا... رو محاسبه کنه؟

یک الگوریتم بسیار زیبا وجود داره به اسم
HyperLogLog
که به ما اجازه میده با تقریب بسیار خوبی و فقط با مصرف چند کیلوبایت RAM تعداد المان‌های یکتا رو از مجموعه دیتا استخراج کنیم.

این الگوریتم بسیار Memory Efficient هستش و مثلا برای شمردن تعداد لایک‌های منحصر به فرد یک پست با ذخیره Hash داده و استفاده از فرمول HyperLogLog در سریع‌ترین زمان ممکن نتیجه رو برای شما محاسبه می‌کنه.

این موضوع یه چالش سیستم دیزاین جذابه که اگر دوست دارین، بیشتر درباره‌اش بدونید، نگاهی به مقاله زیر بندازید.

https://www.geeksforgeeks.org/hyperloglog-algorithm-in-system-design/


- در دوره صفر تا صد گولنگ کلودی‌گو یک نمونه از این الگوریتم رو پیاده‌سازی خواهیم کرد.

#tip
#systemdesign
👍51🔥1
اگر دوست‌دارین best practiceها و نکات ریزی که حین استفاده از defer در گولنگ بهش برخورد می‌کنید رو بدونید و از اشتباهات رایج جلوگیری کنید، مقاله زیر بهتون کمک می‌کنه.


https://rezakhademix.medium.com/defer-functions-in-golang-common-mistakes-and-best-practices-96eacdb551f0



#tip
#golang
👍4🙏1
مقاله زیر با زبان خیلی ساده به ما میگه که چطور از اشتباهات پیش‌پا افتاده جلوگیری کنیم و بتونیم اپلیکیشن گولنگی که داریم به برای تعداد رکوئست بالا آماده کنیم.


https://dev.to/rikenshah/scaling-backend-to-1m-requests-with-just-2gb-ram-4m0c


#tip
#golang
👍4🔥1
سوال #استخدامی:

اگر فانکشن modify رو به شکل زیر تعریف و سپس تابع main رو با بدنه نوشته اجرا کنیم، در نتیجه کدام یک از گزینه‌ها چاپ خواهد شد؟

1. Compilation Error
2. [100, 200, 300, 4]
3. [1, 2, 3, 4]
4. [100, 200, 300, 0]


func modify(s []int){
copy(s, []int{100, 200, 300})
}

func main(){
nums := []int{1, 2, 3, 4}
modify(nums)
fmt.Println(nums)
}



در زبان Go، تابع copy(dest, src) عناصر src را در dest کپی می‌کند، اما اندازه dest را تغییر نمی‌دهد.

در اینجا، دستور
 copy(nums, []int{100, 200, 300})

سه عنصر اول آرایه nums را جایگزین می‌کند، اما طول اصلی آن را تغییر نمی‌دهد.

بنابراین، وقتی fmt.Println(nums) را اجرا کنیم، خروجی
 [100, 200, 300, 4] 

خواهد بود. (گزینه دو)



#golang
#qa
👍7👏2
اگر دوست‌دارین best practiceها و نکات ریزی که حین استفاده از sliceها در گولنگ بهش برخورد می‌کنید رو بدونید و از اشتباهات رایج جلوگیری کنید، مقاله زیر بهتون کمک می‌کنه.


https://rezakhademix.medium.com/slices-in-golang-common-mistakes-and-best-practices-76c30857d4e4


#tip
#golang
👍4👨‍💻1
اگر دوست‌دارین best practiceها و نکات ریزی که حین استفاده از stringها در گولنگ بهش برخورد می‌کنید رو بدونید و از اشتباهات رایج جلوگیری کنید، مقاله زیر بهتون کمک می‌کنه.


https://rezakhademix.medium.com/strings-in-golang-common-mistakes-and-best-practices-1250045051f8

#tip
#golang
2👍2
زمانی که با گولنگ توسعه میدیم باید دقت خوبی در استفاده از گوروتین‌ها، کنترل پوینترها و موضوعات دیگر با هدف جلوگیری از مموری‌لیک داشته باشیم.

ابزارهای مانیتورینگ و پروفایل کردن برنامه گولنگی مثل: pprof و Prometheus و... هم کمک خوبی برای تشخیص بهتر اشتباهات توسعه و مموری‌لیک هستند.


اما سورپرایز ویژه اضافه شدن دستور

go build -asan 

هستش که قرار هست به گولنگ ۱.۲۵ اضافه شود و با دقت خوبی، مموری‌لیک‌های برنامه رو در هنگام خروج مشخص نماید.


#golang
👍9🔥31
سلام
در مدتی که گذشت بخاطر تمام روزهای سختی که همه ما تجربه کردیم و مشکلات افزونی که شخصا داشتم، زمان تقریبا زیادی رو از توسعه فاصله گرفتم و فعالیت کانال هم تعلیق شد.

تا همین یک هفته پیش حتی لپتاپم رو هم روشن نکرده بودم.

در این میان، دوستانی بودند که محبت داشتند و بسیار کمک کردند تا مسائل قابل تحمل‌تر باشند.
عمیقا و صمیمانه از همه این عزیزان ممنونم.

یکی از دوستان تعبیر جالبی داشت، که این بود:

«همه کارهایی که ما فعالان حوزه نرم‌افزار با اشتیاق انجام میدیم مثل روشن کردن شمعی در میان برهوت نرم‌افزاری ایران است، که شاید بتواند یک نفر را از بیراهه این تاریکی، نجات دهد.»
👍6
فعالیت کانال مجددا از سر گرفته شده و رویدادهای جالب و متفاوتی درنظر گرفته شده تا برگزار بشوند.

از همراهی شما ممنونم
خیلی مخلصیم
4
در این مدت سعی کردم در بسیاری از بخش‌های توسعه و معماری نرم‌افزار بازنگری کنم.

یکی از موارد جالب حضور AI در توسعه است که بسیار کمک‌کننده و اگر به درستی استفاده بشه میتونه بازدهی رو به طرز شگفت‌انگیزی افزایش بده!

میتونم بگم توسعه در این فضا بی‌نهایت جذاب‌تر از گذشته و حس و حال مختص به خودش را دارد.

به‌زودی پست‌های مختلفی برای نحوه استفاده از AI و دیگر بخشهای مرتبط منتشر می‌کنم.
🔥31
احتمالا شما هم دیتاهایی دارین یا وب‌سایتی دارین که اطلاعاتش رو نیاز دارین به یک ساختار LLM Ready تبدیل کنید تا در ساده‌ترین سناریو به‌راحتی بتونید براساسش ربات بسازید یا کارهای جالب‌تری انجام بدین!

ریپازیتوری FireCrawl کل وب‌سایت مورد نظرتون رو به یک ساختار منظم و آماده برای LLM تبدیل می‌کنه و حتی فایل‌های مدیا در وب‌سایت رو هم پردازش میکنه تا با روش‌های مختلفی دیتای مورد نظر رو استخراج کنید.

https://github.com/mendableai/firecrawl


#llm
#github
🔥3👍1
چت با دیتابیس!
یک ابزار متن‌باز و کاربردی که در خصوص نوشتن کوئری‌های پیچیده، بهینه کردن عملکرد دیتابیس و ایجاد گزارش‌های کاربردی مثل: کوئری‌های کند، ایندکس‌های بلااستفاده و ... بهتون کمک می‌کنه و فقط کافیه باهاش چت کنید.

https://chat2db.ai

#github
👍31
بعد از مدت‌ها بالاخره Gorm آپدیتی که اکثر برنامه‌نویسان گولنگ منتظرش بودند رو در نسخه جدید منتشر کرد.

در کامیونیتی گولنگ Gorm بخاطر عدم Type Safty و پیچیدگی‌های مختلف آنچنان محبوب نیست. مدت‌ها بود که Generic ها به زبان گولنگ اضافه شدن اما با وجود درخواست‌های زیاد، همچنان در Gorm مورد استفاده قرار نگرفته بودند تا اینکه در ورژن جدید Gorm یعنی V1.30.0 بالاخره این قابلیت به Gorm اضافه شده و میتونه برگ برنده‌ای برای این ORM باشه.

شخصا از Gorm بخاطر عدم بهینه بودن، رفتار عجیب و… استفاده نمی‌کردم اما این آپدیت آنقدر جدی هست که در صفحه اول داکیومنت Gorm خیلی شفاف به این قابلیت پرداخته و تاکید کرده فقط در ورژن‌های V1.30 به بالا قابل استفاده است. شخصا مایلم یک بار دیگه تستش کنم و ببینم تونسته مشکلات متعددی که داشت رو رفع کنه یا خیر!

به نظرم به‌زودی این سینتکس جدید، به روش پیش‌فرض کوئری نوشتن در Gorm تبدیل میشه!


#gorm
#golang
@cloudygo
2👏2