ar
Feedback
نوشته‌های ترمینالی

نوشته‌های ترمینالی

الذهاب إلى القناة على Telegram
3 046
المشتركون
-324 ساعات
+197 أيام
+8130 أيام
جذب المشتركين
يونيو '26
يونيو '26
+35
في 1 قنوات
مايو '26
+91
في 1 قنوات
Get PRO
أبريل '26
+44
في 0 قنوات
Get PRO
مارس '26
+11
في 0 قنوات
Get PRO
فبراير '26
+149
في 4 قنوات
Get PRO
يناير '26
+30
في 1 قنوات
Get PRO
ديسمبر '25
+102
في 5 قنوات
Get PRO
نوفمبر '25
+98
في 3 قنوات
Get PRO
أكتوبر '25
+76
في 3 قنوات
Get PRO
سبتمبر '25
+127
في 3 قنوات
Get PRO
أغسطس '25
+410
في 4 قنوات
Get PRO
يوليو '25
+132
في 6 قنوات
Get PRO
يونيو '25
+68
في 2 قنوات
Get PRO
مايو '25
+96
في 4 قنوات
Get PRO
أبريل '25
+70
في 2 قنوات
Get PRO
مارس '25
+57
في 0 قنوات
Get PRO
فبراير '25
+74
في 1 قنوات
Get PRO
يناير '25
+128
في 3 قنوات
Get PRO
ديسمبر '24
+98
في 0 قنوات
Get PRO
نوفمبر '24
+128
في 2 قنوات
Get PRO
أكتوبر '24
+165
في 3 قنوات
Get PRO
سبتمبر '24
+79
في 3 قنوات
Get PRO
أغسطس '24
+87
في 2 قنوات
Get PRO
يوليو '24
+73
في 3 قنوات
Get PRO
يونيو '24
+79
في 4 قنوات
Get PRO
مايو '24
+79
في 6 قنوات
Get PRO
أبريل '24
+67
في 0 قنوات
Get PRO
مارس '24
+61
في 1 قنوات
Get PRO
فبراير '24
+102
في 1 قنوات
Get PRO
يناير '24
+166
في 2 قنوات
Get PRO
ديسمبر '23
+150
في 2 قنوات
Get PRO
نوفمبر '23
+38
في 2 قنوات
Get PRO
أكتوبر '23
+56
في 3 قنوات
Get PRO
سبتمبر '23
+30
في 0 قنوات
Get PRO
أغسطس '23
+20
في 0 قنوات
Get PRO
يوليو '23
+29
في 0 قنوات
Get PRO
يونيو '23
+59
في 0 قنوات
Get PRO
مايو '23
+61
في 0 قنوات
Get PRO
أبريل '23
+25
في 0 قنوات
Get PRO
مارس '23
+154
في 0 قنوات
Get PRO
فبراير '23
+25
في 0 قنوات
Get PRO
يناير '23
+104
في 0 قنوات
Get PRO
ديسمبر '22
+25
في 0 قنوات
Get PRO
نوفمبر '22
+390
في 0 قنوات
التاريخ
نمو المشتركين
الإشارات
القنوات
08 يونيو+1
07 يونيو+1
06 يونيو+14
05 يونيو0
04 يونيو+8
03 يونيو+4
02 يونيو+3
01 يونيو+4
منشورات القناة
Repost from Mahi in Tech
توی سیستم‌های توزیع‌شده، هماهنگ نگه داشتن داده‌ها بین نودهای مختلف همیشه یکی از چالش‌های مهم و البته جذاب بوده. مخصوصاً وقتی چند نود به‌صورت هم‌زمان امکان Write داشته باشن و انتظار بره داده‌ها در نهایت روی همه نودها به وضعیت یکسانی برسن. یکی از رویکردهای قابل استفاده برای حل این مسئله، پیاده‌سازی Replication در لایه Application و بر بستر Event Streaming هست. در چنین معماری‌ای، تغییرات داده به‌جای اینکه مستقیماً از طریق مکانیزم‌های Replication دیتابیس منتقل بشن، به‌صورت Event منتشر و توسط سایر نودها مصرف می‌شن. برای این کار، می‌شه تغییرات دیتابیس شامل Add, Update و Soft Delete رو در لحظه Commit شناسایی کرد و از طریق الگوی Outbox برای انتشار آماده کرد. از سمت مقابل نیز Consumerهایی مسئول دریافت این رویدادها، اعمال مکانیزم‌های Idempotency و مدیریت خطاها از طریق DLQ خواهند بود تا تغییرات در مقصد به‌صورت قابل اعتماد اعمال بشن. در سناریوهای Multi-Master این‌چنینی، اولین چالش جدی معمولاً مدیریت Conflict داده‌هاست. زمانی که چند نود به‌طور مستقل روی یک رکورد تغییر ایجاد می‌کنن، باید مکانیزمی برای تعیین نسخه نهایی وجود داشته باشه. یکی از ساده‌ترین و در عین حال رایج‌ترین راهکارها، Last-Write-Wins (LWW) هست که در آن آخرین تغییر ثبت‌شده بر اساس زمان وقوع، به‌عنوان نسخه معتبر در نظر گرفته می‌شه. چالش مهم بعدی به شناسه‌های داده برمی‌گرده. در معماری‌هایی که چند نود به‌صورت مستقل داده تولید می‌کنن، استفاده از Primary Keyهای Auto-Increment معمولاً به تداخل منجر می‌شه. به همین دلیل استفاده از شناسه‌های Globally Unique اهمیت پیدا می‌کنه. GUID v7 یکی از گزینه‌های جذاب برای این سناریوهاست؛ چون علاوه بر یکتا بودن، به دلیل داشتن Timestamp داخلی، قابلیت Sort شدن داره و نسبت به GUIDهای سنتی رفتار بهتری از نظر ایندکس‌گذاری ارائه می‌کنه. ممکنه این سؤال مطرح بشه که چرا به‌جای چنین رویکردی از Replication نیتیو دیتابیس استفاده نشه؟ پاسخ اینه که در بسیاری از موارد، مسئله صرفاً انتقال داده بین چند دیتابیس مشابه نیست. گاهی نیاز داریم کانفلیکت‌ها در لایه Application مدیریت بشن، داده‌ها قبل از اعمال شدن دچار Transformation بشن یا حتی نودها از تکنولوژی‌های ذخیره‌سازی متفاوتی استفاده کنن. مزیت دیگه‌ی این رویکرد، وجود یک Log پایدار از تمام تغییرات سیستم هست. با استفاده از Kafka، رویدادها برای مدت مشخصی نگهداری می‌شن و هر Consumer می‌تونه مستقل از سایر اجزا وضعیت خودش رو بازیابی کنه. در نتیجه اگر نودی برای مدت طولانی از دسترس خارج بشه، پس از بازگشت می‌تونه از آخرین Offset پردازش‌شده ادامه بده و خودش رو با وضعیت فعلی سیستم همگام کنه. از طرفی، Eventهایی که برای Replication تولید می‌شن معمولاً کاربردشون به همینجا محدود نمی‌مونه. همون جریان رویداد می‌تونه توسط سرویس‌های دیگه برای Cache Invalidation، Analytics، Audit Logging، Search Indexing یا انواع پردازش‌های جانبی مصرف بشه. به همین دلیل، مکانیزم همگام‌سازی عملاً به بخشی از زیرساخت Event-Driven کل سیستم تبدیل می‌شه. پیاده‌سازی چنین معماری‌ای قطعاً بدون هزینه نیست و پذیرش Eventual Consistency هم چالش‌های خودش رو به همراه داره. اما در ازای این پیچیدگی، سیستمی به دست میاد که نودها می‌تونن مستقل عمل کنن، کانفلیکت‌ها به‌صورت کنترل‌شده مدیریت بشن و همگام‌سازی داده‌ها بدون وابستگی مستقیم به نوع دیتابیس یا ساختار استقرار انجام بشه.

2
این مطلب رو سال ها پیش گذاشته بودم در مورد این که چطور با پروژه های سنگین برنامه نویسی، خودمون رو به چالش بکشیم و چیز جدید یاد بگیریم. این مطلب قسمت دوم هم داره که لینکش رو در ادامه می‌گذارم. مورد علاقه مورد web browser متنیه. توضیحاتشو میتونید بخونید. https://austinhenley.com/blog/morechallengingprojects.html
986
3
راهنمایی برای این که مهندس مهربون تری باشیم! https://kind.engineering
1 030
4
در مورد معماری Hexagonal یا همون Port&Adaptor توی اپلیکیشن بک‌اندی، این بلاگ رو دیدم و خیلی خوب توضیح داده بود. https://medium.com/fastned/the-hexagon-a-battle-tested-blueprint-for-your-event-driven-app-163d4e40bd2d
1 403
5
چرا سرعت ۱۰ برابری کدنویسی با AI ممکنه به یک تله‌ی بدهی فنی/ technical debt تبدیل بشه؟ چند وقت پیش ویدیوی Mario Zechner (سازنده‌ Pi coding agent) با عنوان «ساختن PI در دنیای Slop» رو دیدم و باید بگم که با نگاهش موافقم برای کسایی که با AI کد تولید می‌کنند. یک بلاگ راجع بهش نوشتم که لینکش را پایین میذارم. این روزها صنعت بیش از حد درگیر «ایجنت های ماکسیمالیستی» شده؛ ابزارهای بیشتر، ساب‌ایجنت‌های بیشتر، مدیریت کانتکست پیچیده‌تر و کلی لایه‌ی اضافی. اما داده‌ها داستان متفاوتی را تعریف می‌کنند. سه نکته‌ی مهمی که از صحبت‌های ماریو برداشت کردم: ۱- مینیمال بهتر از ماکسیمال است: بنچمارک‌هایی مثل Terminal Bench نشان می‌دهند که ساده‌ترین محیط‌ها (اغلب فقط یک ترمینال) به‌طور مداوم از هارنس‌های پیچیده و پر از قابلیت عملکرد بهتری دارند. ایجنت Pi هم دقیقاً همین فلسفه را دنبال می‌کند: * فقط ۴ ابزار * یک سیستم‌پرامپت بسیار کوچک * بدون هیچ جادوی پنهانی برای هرس کردن کانتکست نتیجه؟ سیگنال تمیزتر و کد بهتر. ۲- ایجنت‌ها درد را حس نمی‌کنند: یک توسعه‌دهنده‌ی واقعی وقتی با یک کدبیس/codebase شلوغ و به‌هم‌ریخته روبه‌رو می‌شود، خسته و کلافه می‌شود و در نهایت سراغ ریفکتور می‌رود. اما یک ایجنت هوش مصنوعی بدون هیچ مشکلی ممکن است ۱۰ هزار خط کدی تولید کند که از نظر محلی «درست» هستند (locally correct)، ولی از نظر معماری یک فاجعه‌ی کامل محسوب می‌شوند. هوش مصنوعی فشار و هزینه‌ی بدهی فنی را حس نمی‌کند؛ تا زمانی که کدبیس آن‌قدر بزرگ میشه که حتی خود مدل LLM هم دیگر نتواند آن را درست درک کند. ۳- اصطکاک همیشه دشمن نیست: سال‌ها به ما گفته‌اند که هر نوع اصطکاک در فرآیند توسعه بد است و باید حذف شود. اما ماریو نظرش متفاوته: "اصطکاک همان چیزی است که باعث می‌شود درک و دانش از کد به ذهن شما منتقل شود." اگر تمام این اصطکاک را با ایجنت‌ها حذف کنید، کم‌کم دیگر توسعه‌دهنده نخواهید بود؛ بلکه تبدیل می‌شوید به کسی که فقط کدی را بازبینی می‌کند که خودش واقعاً آن را نمی‌فهمد. استراتژی پیشنهادی برای ۲۰۲۶: - وظایف را تا حد ممکن کوچک و مشخص تعریف کنید. - به‌شدت روی ماژولار بودن سیستم پافشاری کنید. - از ایجنت‌ها برای کارهای خسته‌کننده مثل تولید boilerplate یا بازتولید باگ‌ها استفاده کنید. - خطوط مهم و حساس کد را خودتان بخوانید. تک‌تک‌شان را!!! در نهایت، هوش مصنوعی یک ابزار دقیق و قدرتمند است، نه جایگزینی برای تفکر معماری و قضاوت مهندسی. اگر دوست دارید بلاگ کامل من با عنوان «Slop, Speed, and Discipline: Hard Truths About AI Coding Agents» را بخوانید، می‌توانید اینجا بخونیدش. Blog: https://mlnotes.substack.com/p/slop-speed-and-discipline-hard-truths @DevTwitter | <Mehdi Allahyari/>
1 340
6
این چنل آرشیو کتاب‌ها، برگه تقلب، پادکست و وبینار برای دولپرهاست، بدردتون میخوره. t.me/+M4QujCyYc9E1N2Rk عضوگیری محدوده رکوئست ها فردا اکسپت میشه...❤️
509
7
زمانی که یه تیم دیگه به تغییر در کد ما نیاز داره، سه تا گزینه داریم، کدوم یکی بهتره: ۱- بهشون بگیم خودشون تغییر رو انجام بدن. ۲- بهشون بگیم ما کمکشون میکنیم ولی با خیلی تاخیر این کارو انجام بدیم. ۳- کار خودمون رو رها کنیم و کار اونجا رو انجام بدیم. این مطلب میگه عموما گزینه دوم رو انتخاب می‌کنیم ولی گزینه سه بهتره. چون: If you choose to finish your own task: Your team will make it on time. The other team will be late, and will probably mention your team as the reason… You choose to help the other team: You will be late. The other team will be on time - and for sure they’ll mention your team saved them. البته در نظر داشته باشید که این که به اینجا رسیدیم اصلا نشونه یک‌سری اشتباه بوده و باید کاری کنیم مشکلات اینچنینی به وجود نیان. https://open.substack.com/pub/zaidesanton/p/the-delayed-opinions-givers-engineering #زماندار
2 919
8
‏زیاد دیدم که می‌پرسن چرا نوتیفیکیشن اپ‌ها از بله و ایتا گرفته تا تلگرام، توییتر و بقیه این روزها یا نمیاد. واقعیت اینه که نوتیفیکیشن فقط به خود اپ مربوط نیست. روی اندروید تقریباً همه Push Notificationها از طریق سرویس FCM گوگل ارسال میشن و روی آیفون هم از طریق سرویس APNs اپل. (هواوی یا شیائومی یا ... سرویس مخصوص خودشون رو دارن) یعنی حتی اگر اپ کاملاً داخلی باشه، باز هم برای رساندن نوتیفیکیشن باید گوشی بتواند به سرویس‌های گوگل یا اپل وصل شود. وقتی اینترنت بین‌الملل یا دسترسی به این سرویس‌ها مختل می‌شود، نتیجه‌اش این می‌شود که: ناتیف ها اصلاً نمی‌رسند سازوکارش هم خیلی ساده است: ۱- اپ روی گوشی نصب می‌شود ۲- از گوگل/اپل یک شناسه دریافت می‌کند ۳- سرور اپ(مثلا بله یا تلگرام یا ...) پیام را به سرویس گوگل یا اپل می‌فرستد ۴- آن سرویس نوتیفیکیشن را به گوشی تحویل می‌دهد برای همین اگر ارتباط با FCM گوگل یا APNs اپل مشکل داشته باشد، عملاً سیستم نوتیفیکیشن موبایل دچار اختلال می‌شود. نکته مهم اینکه: اپ نمی‌ره مستقیم به هواووی یا شیائومی یا گوگل و اپل API بزنه فقط از SDK استفاده می‌کنه بعد SDK می‌ره با سرویس مناسب حرف می‌زنه FCM = Firebase Cloud Messaging APNs = Apple Push Notification service پ.ن: امیدوارم تونسته باشم ساده توضیح داده باشم. تو این روزا که ناتیف های بله و ... نمیاد مشکل از بله نیست ، اقایان سرویس های پوش ناتیف رو در دسترس قرار ندادن. @DevTwitter | <iSegar0/>
2 317
9
آیا AI جامون رو به عنوان برنامه‌نویس میگیره؟ https://youtu.be/NZa5lApeFic
2 895
10
یه بحثی شکل گرفته در مورد اینکه آیا از روی آیدی auto increment می‌شونه فهمید یه سایتی چقدر کاربر داره. این دغدغه امنیتی درستیه و یه سری راه‌حل هم داره. در واقع این روش‌ها اینطوری کار می‌کنن که آیدی عددی دیتابیس رو سمت سرور نگه می‌دارن و به کاربر نشون نمی‌دن؛ پس چیزی که به کاربر می‌دیم یه استرینگ یا عدد دیگه‌ست و انتظار می‌ره ما با سرعت مناسب بتونیم سمت سرور آیدی‌ای که کاربر داره رو به آیدی دیتابیس تبدیل کنیم. UUID ساده‌ترین ایده‌ای که به ذهن میاد همینه چون در واقع یه استرینگ رندومه. این روش از آیدی طولانی‌تره، کندتره و دیتابیس رو اذیت می‌کنه به عنوان کلید، ولی می‌تونه کمک‌کننده باشه چون احتمال تکراری بودنش خیلی کمه، تولیدش خیلی راحته و نیاز به coordination بین سرورها نداره. NanoID مثل UUID ولی کوتاه‌تره و با الفبایی که شما می‌گید می‌تونه کار کنه، بنابراین می‌تونه URL safe هم باشه (پیش‌فرض هست). SnowflakeID یه آیدی عددی که از ترکیب تایم‌استمپ، نود و شماره ماشین تولید می‌شه، بنابراین عملاً هم می‌تونه یونیک باشه هم ترتیبی نیست. چون عددیه و رقم‌های چپش بر اساس عدد زیاد می‌شن، در واقع صعودی هست و دیتابیس رو کمتر اذیت می‌کنه. HashID این روش آیدی رو به یه استرینگ رمزنگاری می‌کنه و سمت سرور قابل برگردوندن هم هست. ایده‌های دیگه هم می‌شه زد، مثلاً hash کردن آیدی به همراه salt، ولی به نظرم مزیت خاصی ایجاد نمی‌کنه نسبت به UUID.
0