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


https://cloudygo.ir

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

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

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

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
سلام
در مدتی که گذشت بخاطر تمام روزهای سختی که همه ما تجربه کردیم و مشکلات افزونی که شخصا داشتم، زمان تقریبا زیادی رو از توسعه فاصله گرفتم و فعالیت کانال هم تعلیق شد.

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

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

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

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

از همراهی شما ممنونم
خیلی مخلصیم
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👏2
فرصتی که هوش مصنوعی در اختیار همه ما قرار داده باورنکردنی و بسیار شگفت‌انگیزه!

کافیه کمی با MCPها با ایجاد Ruleهای مشخص باهاشون کار کنید، بهشون کانتکست بدین تا یک خروجی عالی رو داشته باشید.

در زمان‌هایی که تایم آزاد دارین، تا میتونید، روش‌های مختلف توسعه با AI رو برای خودتون تست کنید.
لزومی نداره حتما مدل‌های پریمیوم رو استفاده کنید و همین تجربه کردن، باعث میشه به راحتی بتونید مهارت استفاده از AI رو در خودتون افزایش بدین و تسکی که در ۲ روز انجام میشد رو در کمتر از نصف
تکمیل کنید.

× مدل‌های پریمیوم Sonnet 4 و جمینای ۲.۵ پرو واقعا کاربردی هستند!


دقت کنید ما در مورد شت‌کد نوشتن با AI صحبت نمی‌کنیم. اینکه بارها به AI تاکید کنیم Best Practiceهارو رعایت کن، هیچ فایده‌ای نداره!


1. سعی کنید از agent‌هایی استفاده کنید که امکان بازگشت به مراحل و رویدادهای قبلی حافظه‌شون رو دارن
2. به‌خوبی کانتکست رو شرح بدین
3. موضوع رو به ساب‌تسک‌های کوچک تبدیل کنید
4. شفاف بگین براساس چه معماری و چه پرکتیسی (practice) باید کد نوشته بشه
5. سناریوهای شکست رو براش شرح بدین
7. در هر مرحله ازش بخواین برگرده و با تست مشخص کنه چه چیزهایی تا الان اشتباه بوده
👍31
Please open Telegram to view this post
VIEW IN TELEGRAM
گولنگ زبانی هستش که بسیاری از ساختارهای پیش‌فرض در زبان‌های برنامه‌نویسی قبل از خودش رو زیر سوال می‌بره اما با نگاهی مثبت!

حتی اگر شما هیچوقت قصد ندارید توسعه‌دهنده با زبان‌ گولنگ باشید، یادگیری گولنگ تغییرات مثبتی رو در توسعه براتون ایجاد می‌کنه. یکی از بازرترین تغییرات فکری در توسعه با گولنگ، گذر از پیاده‌سازی لایه‌های مختلف بلااستفاده و ایجاد ساختارهایی هست که برای تغییر بسیار آماده‌تر هستند.
همه ما همواره تمایل داریم در مرحله اول توسعه، یک بخش کامل و اصطلاحا Bullet Proof رو توسعه بدیم اما باید بدونیم این یک خطای ذهنی است. نوشتن یک سرویس کامل و پاسخگو در مرحله اول توسعه کاملا غیرممکن هست.
اکثر برنامه‌نویسان سعی دارند با ایجاد لایه‌های اینترفیس و Generalize کردن از همه اتفاقات آینده مصون بوده و کد توسعه‌پذیرتری داشته باشند اما همواره باید در ذهن داشته باشیم که کد‌های ما باید آماده برای تغییر باشند تا یک چاقوی سوییسی همه‌کاره!
👍6🐳1