It's all about Programming
contact: @far1d_ghaderi
Adz: @IranCoderzAdz
Post #5072
2.57K
- ❤ 35
IR @irancoderz
Showing posts older than #5073 · Back to latest
IranCoderz اصلا انتظار نوآوری خاصی نمیرفت، ولی اینکه بزرگترین ویژگی خودشون که دیزاینهای قشنگشون بود رو هم کاملا زیر سوال بردن و از اون سمت، هیچ چیز خاصی هم ارائه نکردن واقعا ناامید کننده بود. پن: همه آیفونها حافظه پایه 256گیگ دارن و از این لحاظ میشه گفت بهترین…


IranCoderz اگه استیو جابز زنده بود امشب وسط رویداد اپل یه بمب به خودش میبست، میرفت وسط کنفرانس و همه رو منفجر میکرد. 🚀@IranCoderz 👨💻


تلگرام برای پوش کردن تغییرات مثل پیام جدید، ادیت، ری اکشن، تایپینگ و… به کلاینتها از سرویس Updates تو پروتکل MTProto استفاده میکنه، ایده ی کلی و کلیدی خیلی ساده اس و اینه که کلاینت ها یه state محلی نگه میدارن و آپدیتارو دقیقا با ترتیب درست اعمال میکنن؛ اگه شکافی بینشون افتاد، Difference میگیرن و دوباره پرش میکنن.
چرا اینکارو کرده و کلا چالشا چیه؟
• ترتیبش مهمه چون ممکنه یه اپدیت وابسته به چیزی باشه که توی خود همون پچ میاد
• تحویل دقیق باید انجام بشه و هیچی گم نشه
• مقیاسش هم میلیونها کاربر همزمان باید بگیرنش، مثل کانال های بزرگ
از اونجایی که هر پیامرسان منبع عظیمی از اتفاقاتیه که هر لحظه میوفته ما میتونیم اسم این اتفاقات رو event بزاریم. تلگرام هم یه پیامرسان مولتی کلاینته، یعنی هر کاربر میتونه چندین دیوایس برای یه حساب داشته باشه، پس وقتی یه ایونت اتفاق میوفته که باید یه کاربر از اون خبردار بشه باید اون ایونت رو به دیوایس های دیگه ی کاربر هم بفرسته، حدودا با مرتبه زمانی On^2.
مکانیزم اینجوریه که وقتی دیوایسی انلاین باشه و سوکت همون سوکتی باشه که keep alive هست یا اخرین rpc رو کال کرده سرور ایونت رو توی queue برای اون دیوایس نگه نمیداره و مستقیم میفرسته به کلاینت، حالا از اونجایی که کلاینت های دیگه ممکنه افلاین باشن یا حتی توی بکگراند پروسسشون کیل شده باشه عقب میمونن. حالا وقتی اون دیوایسی که عقب مونده بود با باز شدن سوکتش درخواست گرفتن اپدیت هارو وقتی که افلاین بوده رو از سرور میکنه و اطلاعات لوکالش رو میفرسته به سرور، من برای ساده شدنش اینجوری میگم که دیوایس میاد به سرور میگه من تا این زمان t رو داشتم و بعد این رو بهم بده، سرور هم میاد حساب کتابش رو میکنه و جواب رو توی یه پچ میفرسته! حالا چی توی این پچ هست و چی رو میفرسته رو میتونم یه رشته توییت دیگه در موردش بزنم.
حالا اگه اعدادی که توی پچ میاد با اعداد توی کلاینت نخونه عملا میگیم گپ اتفاق افتاده، برای همین هم کلاینت باید رکویست getDiff رو بزنه.
رکویست updates.getDifference به کلاینت اجازه میده بگه:
من الان pts = X و seq = Y هستم و هر چی بین این و حالت جدید هست بهم بده.
• سرور ممکنه جواب بده:
difference: همه ی آپدیت های گمشده
differenceSlice: بخشی از آپدیت ها یعنی هنوز باید به فچ کردن ادامه بدی
differenceEmpty: چیزی تغییر نکرده
جالبترش اینه که توی نسخه های جدیدترش برای کانال ها مکانیسم جدا getChannelDifference هست، چون هر کانال pts مستقل داره و این باعث میشه شما فقط کانال هایی رو بگیری که تغییر کردن! برای سوپر گروه هم مکانیزم همینه.
این باعث میشه حتی اگر چند ساعت آفلاین باشی، بعد از اتصال دوباره دقیقاً همهچی رو بگیری و هیچ پیامی رو از دست ندی
حتی با packet loss یا reconnect، state کلاینت خراب نمیشه و سرور مجبور نیست برای هر کلاینت همه چی رو دوباره بفرسته. فقط gap ها sync میشن




IranCoderz 📚 کتاب برنامهنویس عملگرا (The Pragmatic Programmer) یکی از معروفترین کتابهای دنیای برنامهنویسیه. توی این کتاب اصول و قواعدی مطرح شده که هر برنامهنویسی باید بلد باشه و رعایت کردنشون میتونه مسیر شغلی شما رو حسابی جلو ببره. این کتاب حدود ۳۰۰ صفحهست و…

برنامهنویسی کار آسونی نیست. ما باید نیازهای مبهم کاربر رو به زبون کامپیوتر تبدیل کنیم. نویسنده میگه برنامهنویس مثل یه استادکار باید بلد باشه از بین ابزارها بهترین رو انتخاب کنه. پس نباید فقط به یک زبان بسنده کنیم؛ باید یاد بگیریم ابزارها و زبانهای مختلف رو بشناسیم و متناسب با شرایط استفاده کنیم. وقتی منطق برنامهنویسی رو خوب بلد باشید، یاد گرفتن زبانهای جدید خیلی آسون میشه. به قول نویسنده اگه فقط کار با چکش رو بلد باشید، همه چیز رو میخ میبینید و دیدتون محدود میشه.
🤔برای عملگرا شدن باید کنجکاو باشیم و مدام سؤال بپرسیم:
- این کتابخونه چطوری کار میکنه؟
- چرا این مسئله اینطور حل شد؟
- آیا راه بهتری وجود نداره؟
این پرسشگری باعث میشه عمیقتر بشیم و دید بازتری پیدا کنیم.
اشتباه بخشی از کاره. مهم نیست چقدر تست و داکیومنت داشته باشیم، خطا اجتنابناپذیره. مهم اینه که مشکل رو بپذیریم، مسئولیتش رو قبول کنیم و راهحل پیشنهاد بدیم.
بزرگترین ضربهای که میتونیم به اعتماد بقیه بزنیم اینه که شروع کنیم به بهونه آوردن:
- روی سیستم من کار میکرد.
- مشکل از فلان کتابخونه بود.
- همکارم درست ریویو نکرد.
حتی اگه واقعاً تقصیر شما نباشه، باز هم بهتره به جای مقصر جلوه دادن بقیه، دنبال راهحل باشید. اینطوری هم اعتماد همتیمیها رو بهدست میارید هم روابط کاری قویتری میسازید.
یادتون باشه هیچ چیزی به اندازهی صراحت در پذیرش اشتباه، شما رو قابل اعتماد نشون نمیده.


IranCoderz ✖️ مدیرعامل Vercel پست گذاشته که مهندسی نرمافزار تا ۵ سال دیگه به چیز ناشناختهای تبدیل میشه و ایلان ماسک هم کامنت گذاشته و اون رو تایید کرده. 💡قبل از اینکه با این حرفها ناامید بشید و بگید بدبخت شدیم، دقت کنید که همه آدمهایی که این حرفها رو میزنن عموماً…




