Go Casts 🚀 – Telegram
Go Casts 🚀
7.67K subscribers
279 photos
20 videos
13 files
497 links
VP of Eng Zarinpal | Ex Snapp! Senior SE
فوق لیسانس هوش مصنوعی از دانشگاه تهران

اشتراک محتوا در مورد مهندسی نرم افزار، هوش مصنوعی، گولنگ
https://gocasts.ir

پروفایل
https://www.linkedin.com/in/gohossein

ارتباط
@lifography

Ai for Software
@aicasts_ir
Download Telegram
یه کتابی که خیلی فیدبک های خوبی داره برای ساختمان داده و الگوریتم، کتاب
A Common-Sense Guide to Data Structures and Algorithms, Second Edition: Level Up Your Core Programming Skills 2nd Edition
هست که ریویوهاش رو اینجا میتونید بخونید
https://www.amazon.com/Common-Sense-Guide-Structures-Algorithms-Second/dp/1680507222

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


قبلا تو کانال در مورد مزایای یادگیری مصور صحبت شده بود
https://news.1rj.ru/str/gocasts/155


@gocasts
👍20
یکی از چیزایی که از rust خیلی دوست دارم pattern matching هست، خیلی تر و تمیز و انعطاف پذیر هست.
اینجا بیشتر میتونید در موردش بخونید.
https://doc.rust-lang.org/book/ch06-00-enums.html

مثلا استفاده کردن match در کنار Result ENUM خیلی practice خوبی برای بررسی خروجی یک تابع یا متد هست.

اینطوری مجبور نیستی همه توابع رو طوری بنویسی که خروجی آخرشون error باشه (در گولنگ اینطوریه)

به کمک pattern matching هم خیلی خوانایی کد کمتر نمیشه بنظرم.

let greeting_file_result = File::open("hello.txt");

let greeting_file = match greeting_file_result {
Ok(file) => file,
Err(error) => match error.kind() {
ErrorKind::NotFound => match File::create("hello.txt") {
Ok(fc) => fc,
Err(e) => panic!("Problem creating the file: {e:?}"),
},
other_error => {
panic!("Problem opening the file: {other_error:?}");
}
},
};


از نظر error handling فکر میکنم نگاه مشترکی با گولنگ داره، از این نظر که خطاهارو دو دسته recoverable و unrecoverable میبینه که یکی رو با Result مدیریت میکنه و یکی رو با panic که فکر میکنم خیلی شبیه نگاه گولنگ هست.
Most languages don’t distinguish between these two kinds of errors and handle both in the same way, using mechanisms such as exceptions. Rust doesn’t have exceptions. Instead, it has the type Result<T, E> for recoverable errors and the panic! macro that stops execution when the program encounters an unrecoverable error.


@gocasts

#rust #golang
👍222🔥1
مصاحبه های طراحی سیستم نقش مهمی تو خیلی از مصاحبه های فنی دارن. من با چند برنامه نویس از سطوح مختلف با تجربه های ۴، ۵ سال و کمتر بصورت ناشناس مصاحبه های mock فنی طراحی سیستم انجام دادم که ۶ تا از این مصاحبه ها در دوره قرار گرفته. موضوع مصاحبه ها در مورد سیستم های مختلفی هست از جمله سرویس های پرداخت، بورس، فایل و غیره ست.
الحمدلله که این مصاحبه ها به دوستان کمک کرده تو فرآیند مصاحبه های طراحی سیستم عملکرد بهتری داشته باشن و به استخدام شون کمک کرده.

دوره +‌ تیمسازی بکند و گولنگ Go Casts
لینک خرید دوره + تیمسازی با ۵۰ درصد تخفیف به مبلغ ۴ میلیون و ۵۰۰ هزار تومان
https://gocasts.ir

همه چیز در مورد دوره و تیمسازی در این پست توضیح داده شده
https://news.1rj.ru/str/gocasts/434

تو این پست هم میتونید فیدبک های دوره و تیمسازی و استخدام بچه هارو بخونید
https://news.1rj.ru/str/gocasts/441

دوستانی که در خرید دوره تردید دارند میتونن برای مشاوره کوتاه تلفنی، فرم زیر رو پر کنند که باهاشون تماس بگیرم
https://survey.porsline.ir/s/ATeQL4b4


@gocasts
👏14👍52🔥1
شاید تعجب کرده باشید که چرا در خیلی از کنفرانس های JavaScript جای این عبارت از js و ecmanoscript استفاده میکنن..
دلیلش اینه که آقای oracle که sun microsystems رو خرید تریدمارک JavaScript رو هم در نتیجه ش صاحب شد.
حالا آقای ryan dahl که سازنده nodejs و deno هست چند وقتی هست گیر داده به oracle که تریدمارک JavaScript رو کنسل کنه که دیگه به عنوان یه کلمه عمومی همه بتونن ازش استفاده کنن. سفت و سخت پیگیره..

https://x.com/deno_land/status/1873615998324203591


@gocasts
👍18🔥3
دوستان سنیور گولنگ که دنبال کار دلاری هستید، اگه مهارت مکالمه زبان خوبی دارید لطفا فرم زیر رو پر کنید، یکی از دوستان به دنبال نیروی سنیور گولنگ هست.
https://survey.porsline.ir/s/O1pXpEzr


کانال تلگرام
@gocasts
👍16😁1
دوستان اگه اپلیکیشن رو بصورت مونولیت مینیوسید، کار خوبی میکنید، اما aggregation pattern رو جدی بگیرید، کمک بزرگی میکنه به حفظ loosely coupled بودن ماژول و سرویس هاتون.

یه اشتباه رایجی که باعث میشه خیلی راحت همه چیز در هم تنیده و coupled بشه نیازهای بیزینسی ای هست که دیتای aggregate شده از چند domain مختلف رو میخواد از شما. تو حالت مونولیت خیلی ساده ست که شما در هر domain به دیتابیس یه domain دیگه درخواست بزنی و یا حتی تو interactor/service دیگه یه متد جدید تعریف کنی که دیتای مد نظر رو بده. که معمولا باعث در هم تنیده شدن و چاق شدن سرویس هاتون میشه.

بهتره سرویس یا همون interactorهاتون کارهای خیلی کوچیک و well-definedی رو انجام بدن و اگه نیازمندی های aggregationطور دارید، یه سری service دیگه بسازید که وابستگی خواهد داشت به سرویس های مختلف و دیتاهای raw رو میگیره و پردازش میکنه که دیتای نهایی رو آماده کنه.

بعضی وقت ها از طریق gateway هم ممکنه بتونید aggregate کنید. بعضی وقت ها ممکنه تو همون لایه دلیوری (کنترلر) تون بتونید دو تا سرویس رو فراخوانی کنید و کار رو در بیارید، گاهی هم پیچیده تر میشه و لازمه یه سرویس(interactor) بنویسید که کار aggregation رو انجام بده
https://learn.microsoft.com/en-us/azure/architecture/patterns/gateway-aggregation

باز خود aggregate کردن حالت های مختلفی داره، اینجا میتونید بیشتر بخونید در موردش
https://medium.com/geekculture/design-patterns-for-microservices-aggregation-pattern-1b8994516fa2

@gocasts
👍203👏2🔥1
ملت از چی پول در میارن 😁

طرف ۹۹ دلار میگیره که ruby رو روی سیستم عامل مک نصب کنه :)
تا الان بیش از ۲ هزار نفر هم بهش پول دادن

https://www.rubyonmac.dev/

حالا من از کجا پیداش کردم؟ برای یه پروژه قدیمی داشتم ruby نصب میکردم که به مشکل خوردم، واقعا هم بعضی وقتا دردسر داره نصبش، مخصوصا اینکه نسخه ۳ هم اومده...

من حاضرم رو سیستم تون کامپایلر گولنگ نصب کنم به همراه همه وابستگی هاش، ۹ دلارم بیشتر نمیگیرم 😄


@gocasts
😁63👍4
Go Casts 🚀
تعداد مشارکت کنندگاه دوره از ۵۰۰ نفر گذشت 🔥 بی نهایت از اعتماد شما متشکریم. ان شاءالله که بتونیم پاسخگوی این همه محبت و اعتماد شما باشیم و بتونیم با تولید محتوای بروز، مناسب و برازنده شما، پاسخگوی محبت شما باشیم دوره +‌ تیمسازی بکند و گولنگ Go Casts لینک…
سلام دوستان
بالاخره سایتمون بروز شد :)

فکر کنم بعد از چند سال لازم بود از یه صفحه خیلی ساده کمی بهتر بشه

زحمت پیاده سازی ش رو دوستان فرانت کشیدن، و من با دخل و تصرف در کارشون صرفا یه سری قسمت هارو خراب کردم :)

اگه مشکلی داشت بدونید کار خودمه، مثلا کلی کلنجار رفتم که بتونم یه سری button رو به وسط صفحه منتقل کنم نشد که نشد 😟😁

از یه برنامه نویس بکند بیشتر از این انتظار نداشته باشید…

فعلا فقط لندینگ اصلی تغییر کرده. سعی کردیم توضیحات خوبی در مورد دوره و تیمسازی تو این صفحه قرار بدیم.

https://gocasts.ir

دمتون گرم ❤️

@gocasts
😍4213👍6🔥6😁1
اگه برای یادگیری گولنگ یه دلیل خیلی موجه میخوای، این پست رو با دقت مطالعه کن

آخرش رو اولش بخوام بگم میشه: یادگیری برنامه نویسی بدون فریمورک
حالا این قضیه چرا مهمه؟

درک practiceهای برنامه نویسی و ترکیب کردن اونا کار سختیه. ولی وقتی درکشون کنی و تجربه به کارگیری شون رو داشته باشی، یه دریچه ای به روت باز میشه که خیلی ارزشمند هست و بهت این قدرت رو میده که با انتخاب خودت و با تحلیل خودت انواع ترکیب الگوهارو در کنار هم برای سیستم خودت بسته به نیازت به کار بگیری.

خیلی از الگوهای برنامه نویسی رو فریمورک ها استفاده میکنن و کار رو برای شما خیلی راحت میکنن. اما این راحت شدنه یه هزینه ای داره، اونم اینه که اجازه نمیده به شما برنامه نویسی و کار با الگوهارو تجربه کنی.

گولنگ مزیت بزرگش یادگیری بدون فریمورک همین الگوهاست. بعد از یه مدت که الگوهای مختلف رو خودت تو گولنگ به کار میگیری با خیلی هاشون به اندازه کافی آشنا میشی و برای پروژه های جدیدت با خیال راحت تر و دست باز تصمیم میگیری چه ترکیبی از practiceهارو استفاده کنی.
گولنگ زبان جمع و جوریه و این خودش باز باعث میشه خیلی نتونی تو پیاده سازی الگوها شیوه های مختلفی رو به کار بگیری که انتخاب شیوه پیاده سازی وسواس برات ایجاد کنه.

برنامه نویسا معمولا وقتی میخوان یه زبان جدید رو یاد بگیرن، دوست دارن خیلی زود بتونن یه چیزی ملموس باهاش توسعه بدن، و همین سوق میده برنامه نویس رو به این سمت که فریمورک استفاده کنه. وقتی زبان برنامه نویسی رو با فریمورک یاد بگیری، خیلی سخت میشه که بتونی فلسفه، الگوها و idiomهای خود زبان رو خالص یاد بگیری.

@gocasts
👍71🔥74
Go Casts 🚀
اگه برای یادگیری گولنگ یه دلیل خیلی موجه میخوای، این پست رو با دقت مطالعه کن آخرش رو اولش بخوام بگم میشه: یادگیری برنامه نویسی بدون فریمورک حالا این قضیه چرا مهمه؟ درک practiceهای برنامه نویسی و ترکیب کردن اونا کار سختیه. ولی وقتی درکشون کنی و تجربه به کارگیری…
اجازه بدید برای پست دیروز یه مثال بزنم که شاید به درک بهتر موضوع کمک کنه.

از زیبایی های گولنگ اینه که پکیج ها و building blockهای سطح بالا ارائه میده، که سرعت توسعه برنامه نویس خوب باشه.
حالا مثلا برای یه web framework چه building blockهایی لازمه؟
اگه با گولنگ کار کنی بعد از مدتی میتونی blockهای مهمی که بخواد functionality یه فریمورک وب رو ارائه بده بشناسی، از جمله: یه http listener میخوای که درخواست هارو accept کنه، یه multiplexer میخوای که بر اساس request path درخواست هارو توزیع کنه، یه سری handler لازم داری که درخواست هارو مدیریت کنه، این وسط ممکنه یه سری middleware لازم داشته باشی، ممکنه تو handlerت validation لازم داشته باشی، بعدش نوبت به بیزینس لاجیک ت میرسه و بعدش هم به database driver احتیاج داری که ارتباط با دیتابیس رو مدیریت کنه.

قشنگی کار اینجاست که تو هر building block شما علاوه بر یک سری انتخاب از std packageها میتونی third-party پکیج هارو هم استفاده کنی و به ترکیب های مختلفی این building blockهارو با هم compose کنی و این flexibility فوق العاده ای میده.

علاوه بر همه این ها، برنامه نویس بعد از یه مدت به خودش میاد و میفهمه که نسبت به المان های فریمورک وب شناخت خوبی پیدا کرده و کارایی هر بلاک رو درک کرده و دیگه براش black box نیست. بعدش میتونه خودش هر بلاک رو تحلیل کنه و از بین انتخاب هاش اونی که براش بهتره رو انتخاب کنه.

@gocasts
👍45👏1
یه تعریف خیلی ساده و شسته و رفته برای Stack و Heap

تو مستندات آموزش rust قبل از اینکه ownership رو توضیح بده در مورد heap و stack صحبت کرده، توضیح کوتاه و خوبیه، یادآوری خوبی میتونه باشه
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html

چقدر این مثالش قشنگه برای اینکه چرا دسترسی به heap کندتر از stack هست

Accessing data in the heap is slower than accessing data on the stack because you have to follow a pointer to get there. Contemporary processors are faster if they jump around less in memory. Continuing the analogy, consider a server at a restaurant taking orders from many tables. It’s most efficient to get all the orders at one table before moving on to the next table. Taking an order from table A, then an order from table B, then one from A again, and then one from B again would be a much slower process. By the same token, a processor can do its job better if it works on data that’s close to other data (as it is on the stack) rather than farther away (as it can be on the heap).


@gocasts
👍196
Go Casts 🚀
تعداد مشارکت کنندگاه دوره از ۵۰۰ نفر گذشت 🔥 بی نهایت از اعتماد شما متشکریم. ان شاءالله که بتونیم پاسخگوی این همه محبت و اعتماد شما باشیم و بتونیم با تولید محتوای بروز، مناسب و برازنده شما، پاسخگوی محبت شما باشیم دوره +‌ تیمسازی بکند و گولنگ Go Casts لینک…
تجربه یه incident با رعایت نکردن اصول ساده

خیلی وقت ها پیش میاد که ما یه سری نکته ساده رو رعایت نمی کنیم و همین موضوع باعث میشه که مشکلات بزرگی در سیستم رخ بده.

من سعی میکنم نکات کوچیکی که طبق تجربه خودم داشتم یا اطرافیانم داشتند رو گاه به گاه منتشر کنم. امروز در مورد یکی از این موارد که باعث incident هم شد صحبت می کنم.

قبل از اینکه شرح بدم incident چی بود در مورد root cause صحبت می کنم که تابع Get از پکیج net/http بود. خیلی هاتون ممکنه برای ارسال درخواست های http در گولنگ از این تابع استفاده کنید و خیلی کار رو هم ساده می کنه.

https://pkg.go.dev/net/http#Get


اسم سرویس ها یه چیز دیگه ست من ساده سازی کردم.
یه سرویس اصلی رو در نظر بگیرید که وقتی درخواست بهش میرسه، ابتدا یه سری اطلاعات رو از طریق یه درخواست http از یه سرویس خارجی دریافت میکنه و بعد پاسخ درخواست کاربر رو پس میده.
حالا تصور کنید این سرویس کارهای دیگه ای هم انجام میده، مثلا همین سرویس برای انجام paymentها یه ماژول پرداخت داره که باز هم از درخواست های http استفاده میکنه که با ipgها صحبت کنه و پرداخت هارو انجام بده.

این سرویس با همین مشخصات روی پروداکشن زیر لود بود که فهمیدیم سرویس خارجی ای که اطلاعات رو ازش میگیریم خیلی latency بالایی داره و همین باعث شده درخواست های زیادی باز بمونن برای مدت طولانی و مصرف رم و cpu سرویس بالا رفته و پاسخ ها دچار response time بالا شدن.

اولین نکته ای که به ذهن میرسه اینه که خب بهتره از context timeout استفاده کنیم برای درخواست ها که مثلا یه درخواست http به سرویس خارجی بیشتر از ۳۰ ثانیه باز نمونه.
که خب تابع Get خودش ورودی context نمیگیره، پس باید به فکر راه دیگه ای بود.
برنامه نویس فهمیده بود که تابع Get داره از http.DefaultClient استفاده میکنه و این client یه فیلد timeout داره، پس خیلی سریع تایم اوت رو ست کرد، به این صورت

http.DefaultClient.Timeout = time.Second * 5

کد دیپلوی شد و رفت روی پروداکشن، اتفاقی که افتاد این بود که دیگه مشکل response time وجود نداشت برای سرویس خارجی و اگه درخواست بیشتر از ۵ ثانیه طول میکشید کنسل میشد.

اما یه مشکل جدید خیلی بد بوجود اومده بود، ماژول پرداخت به فنا رفته بود و نمیتونست پرداخت هارو درست مدیریت کنه.

علت چی بود؟‌ علت این بود که اونم داشت از http.Get استفاده میکرد و با تنظیم شدن تایم اوت ۵ ثانیه، اونم درخواست های بیشتر از ۵ ثانیه رو کنسل میکرد.

خب خیلی ها شنیدید که الگوی singleton خیلی جاها میتونه bad practice باشه و یکی از اون جاها همین default http clientی هست که پکیج net/http ارائه میده.

درست ش این بود که هر ماژول برای درخواست های خودش یه http client مجزا داشته باشه که تایم اوت خاص خودش رو ست کنه. حتی میشه از این تابع NewRequestWithContext
استفاده کرد که context رو هم پشتیبانی کنه.

https://pkg.go.dev/net/http#NewRequestWithContext


مشکل singleton اینه که side effectهای تغییر singleton object مبهم میشه، شما میای برای درخواست های سرویس خارجی تایم اوت ست کنی، ولی عملا درخواست های پرداخت رو به فنا میدی..

پکیج net/http و پکیج های دیگه گولنگ برای راحتی استفاده خیلی وقت ها یه default object ارائه میدن، ولی واقعا باید برای استفاده از این objectها احتیاط کرد. بهتره instance خاص خودت رو بسازی که مدیریت stateش فقط خودت رو تحت تاثیر بذاره و side effect نداشته باشه.

@gocasts
👍41🔥8👏1
This media is not supported in your browser
VIEW IN TELEGRAM
ابزار جالبیه برای کار با docker و docker-compose در ترمینال

A simple terminal UI for both docker and docker-compose, written in Go with the gocui library.

https://github.com/jesseduffield/lazydocker

@gocasts
👍34😍12🔥4
بازم داغ داغ بریم سراغ فصل بعد کتاب Go Concurrency که در مورد پکیج پرکاربرد context هست

https://antonz.org/go-concurrency/context/

استفاده از context کاربردهای مختلفی داره که در عین سادگی مهم هم هست.
مثلا برای graceful shutdown کردن اپلیکیشن کاربرد داره.
برای مدیریت زمان پاسخ requestهای client کاربرد داره.
برای propagate کردن auth info کاربر بین درخواست هایی که بین microserviceهای داخلی رد و بدل میشه کاربرد داره.
برای کوئری هایی که به دیتابیس و third-party serviceها زده میشه کاربرد داره.
برای propagate کردن اطلاعات مرتبط با distributed tracing کاربرد داره.

برخی هم یه سری global object رو مثل logger تو context پاس میدن که من خودم به شخصه سعی میکنم چنین استفاده ای نداشته باشم.


دوره +‌ تیمسازی بکند و گولنگ Go Casts
خرید با ۵۰ درصد تخفیف به مبلغ ۴ میلیون و ۵۰۰ هزار تومان از طریق سایت
https://gocasts.ir

همه چیز در مورد دوره و تیمسازی
https://news.1rj.ru/str/gocasts/434

فیدبک های دوره و تیمسازی و استخدام
https://news.1rj.ru/str/gocasts/441

مشاوره تلفنی خرید دوره
https://survey.porsline.ir/s/ATeQL4b4

@gocasts
👍125
یه ابزار خیلی جالب open-source از apache که با گولنگ هم نوشته شده برای مدیریت پایگاه دانش و فروم به کار میاد.

Build a Q&A Platform
with Apache Answer

A Q&A platform software for teams at any scale. Whether it’s a community forum, help center, or knowledge management platform, you can always count on Answer.

https://answer.apache.org


میشه بهش پلاگین هم اضافه کرد
https://answer.apache.org/plugins


@gocasts
👍101
گزارش نظرسنجی JetBrains برای سال ۲۰۲۴ منتشر شده که نتایج جالبی داره.

زبان Go و Rust دو تا زبانی هست که بیشترین adoption را داشتند.

همچنین گولنگ بیشتر از هر زبان دیگه ای برای توسعه web service و cloud service داره استفاده میشه.

گولنگ در لیست زبان های top-paid دوم هست بعد از scala.

گزارش کامل رو اینجا میتونید بخونید
https://www.jetbrains.com/lp/devecosystem-2024/


@gocasts
👍202
اگه میخوای بیشتر در مورد انواع ایندکس های دیتابیس بدونی پیشنهاد میکنم این سری آموزش ویدیویی از PlanetScale رو ببین.

دیدن ش دید عمیق تری بهت میده که بهتر از ایندکس ها استفاده کنی.

لیست موضوعاتی که پوشش داده
Introduction to indexes
B+ trees
Primary keys
Secondary keys
Primary key data types
Where to add indexes
Index selectivity
Prefix indexes
Composite indexes
Covering indexes
Functional indexes
Indexing JSON columns
Indexing for wildcard searches
Fulltext indexes
Invisible indexes
Duplicate indexes
Foreign keys

https://planetscale.com/learn/courses/mysql-for-developers/indexes/introduction-to-indexes

How do Database Indexes Work?
https://planetscale.com/blog/how-do-database-indexes-work


@gocasts
👍22