اگه دوس دارید با مفهوم اسکوپ و کوئری رجیستری توی لاراول عمیقا آشنا بشید و بتونید مثل یه Pro Player ازشون استفاده کنید این مقاله زیبا و کامل رو از دست 👀
https://laravel-news.com/query-scopes
https://laravel-news.com/query-scopes
Laravel News
Learn to master Query Scopes in Laravel - Laravel News
In this article, we're going to take a look at local query scopes and global query scopes
🔥9
🚀 متد Dispatch در Laravel یعنی چی؟ پشت صحنهاش چیه؟
وقتی توی لاراول مینویسی:
داری یه job رو میفرستی به صف (queue)، ولی پشت پرده کلی داستان اتفاق میافته که فهمیدنش میتونه کمکت کنه حرفهایتر کار کنی 👇
🔹 اولین مرحله:
لاراول با dispatch()، Bus::dispatch() یا helper با نام dispatch() شروع میکنه. اینها همه از کامپوننت Bus استفاده میکنن تا job رو آمادهی ارسال کنن.
🔹 چطوری آماده میکنه؟
بسته به نوع job، یکی از این ۳ شیء ساخته میشه:
متد PendingDispatch —> برای job معمولی
متد PendingChain —> برای jobهای زنجیرهای
متد PendingBatch —> برای batchها
🔐 جاب یکتا (Unique):
اگه job از ShouldBeUnique استفاده کنه، لاراول بررسی میکنه که توی صف، همین job با همون شناسه (ID) وجود داره یا نه.
اگه باشه و هنوز پردازش نشده، job جدید ارسال نمیشه.
✅ فقط برای job معمولی فعاله، نه chain یا batch.
🔄 وقتی از chain یا batch استفاده میکنی:
توی chain همه jobها به اولین job چسبیدان.
توی batch اطلاعاتشون توی دیتابیس ذخیره میشه.
💾 بعد از این آمادهسازیها، اگه dispatch بعد از commit تنظیم شده باشه:
لاراول صبر میکنه تا همه تراکنشهای دیتابیس تموم شن (موفقیتآمیز).
اگه rollback شه، job هم اصلاً فرستاده نمیشه.
🧬 تبدیل job به payload:
لاراول باید یه payload بسازه که شامل اینا میشه:
تنظیمات مثل maxTries, timeout, retryUntil
سریالایز کردن job با serialize() (و تبدیل مدلها با trait مخصوص)
رمزنگاری job اگه از ShouldBeEncrypted استفاده کرده باشه
اجرای hookها مثل Queue::createPayloadUsing()
در نهایت تبدیل به JSON و ارسال به صف (database, Redis, SQS و...)
📬 برای event listener، mail, notification و broadcastها:
اگه ShouldQueue رو پیادهسازی کرده باشن، مستقیم میان توی queue (و نه Bus).
یعنی قابلیتهایی مثل unique، chain یا batch اینجا اعمال نمیشن.
🧠 و اما closure؟
اگه بخوای یه closure رو بفرستی به صف، Laravel با SerializableClosure سریالایزش میکنه، رمزنگاریش میکنه و با job مخصوصش (CallQueuedClosure) میفرسته صف.
🎯 جمعبندی:
دستور Job dispatch فقط یه خط نیست! یه مکانیزم کامل پشتشه که با قدرت و امنیت بالا job رو آماده میکنه، serialize و encrypt میکنه، و با دقت میفرسته صف. یاد گرفتنش کمک میکنه کدت تمیزتر و قابل کنترلتر باشه 💪
🔗 منبع : مقاله
@panicdev
وقتی توی لاراول مینویسی:
MyJob::dispatch($data);
داری یه job رو میفرستی به صف (queue)، ولی پشت پرده کلی داستان اتفاق میافته که فهمیدنش میتونه کمکت کنه حرفهایتر کار کنی 👇
🔹 اولین مرحله:
لاراول با dispatch()، Bus::dispatch() یا helper با نام dispatch() شروع میکنه. اینها همه از کامپوننت Bus استفاده میکنن تا job رو آمادهی ارسال کنن.
🔹 چطوری آماده میکنه؟
بسته به نوع job، یکی از این ۳ شیء ساخته میشه:
متد PendingDispatch —> برای job معمولی
متد PendingChain —> برای jobهای زنجیرهای
متد PendingBatch —> برای batchها
🔐 جاب یکتا (Unique):
اگه job از ShouldBeUnique استفاده کنه، لاراول بررسی میکنه که توی صف، همین job با همون شناسه (ID) وجود داره یا نه.
اگه باشه و هنوز پردازش نشده، job جدید ارسال نمیشه.
✅ فقط برای job معمولی فعاله، نه chain یا batch.
🔄 وقتی از chain یا batch استفاده میکنی:
Bus::chain([...]);
Bus::batch([...]);
توی chain همه jobها به اولین job چسبیدان.
توی batch اطلاعاتشون توی دیتابیس ذخیره میشه.
💾 بعد از این آمادهسازیها، اگه dispatch بعد از commit تنظیم شده باشه:
لاراول صبر میکنه تا همه تراکنشهای دیتابیس تموم شن (موفقیتآمیز).
اگه rollback شه، job هم اصلاً فرستاده نمیشه.
🧬 تبدیل job به payload:
لاراول باید یه payload بسازه که شامل اینا میشه:
تنظیمات مثل maxTries, timeout, retryUntil
سریالایز کردن job با serialize() (و تبدیل مدلها با trait مخصوص)
رمزنگاری job اگه از ShouldBeEncrypted استفاده کرده باشه
اجرای hookها مثل Queue::createPayloadUsing()
در نهایت تبدیل به JSON و ارسال به صف (database, Redis, SQS و...)
📬 برای event listener، mail, notification و broadcastها:
اگه ShouldQueue رو پیادهسازی کرده باشن، مستقیم میان توی queue (و نه Bus).
یعنی قابلیتهایی مثل unique، chain یا batch اینجا اعمال نمیشن.
🧠 و اما closure؟
اگه بخوای یه closure رو بفرستی به صف، Laravel با SerializableClosure سریالایزش میکنه، رمزنگاریش میکنه و با job مخصوصش (CallQueuedClosure) میفرسته صف.
🎯 جمعبندی:
دستور Job dispatch فقط یه خط نیست! یه مکانیزم کامل پشتشه که با قدرت و امنیت بالا job رو آماده میکنه، serialize و encrypt میکنه، و با دقت میفرسته صف. یاد گرفتنش کمک میکنه کدت تمیزتر و قابل کنترلتر باشه 💪
🔗 منبع : مقاله
@panicdev
👌13👍1
تجربه کسی که راه زیادی رو رفته تا گلوگاه های یک زیرساخت و شناسایی کنه برای اینکه بتونه پاسخگوئه یک میلیون یوزر باشه .
https://medium.com/@kanishks772/scaling-to-1-million-users-the-architecture-i-wish-i-knew-sooner-39c688ded2f1
https://medium.com/@kanishks772/scaling-to-1-million-users-the-architecture-i-wish-i-knew-sooner-39c688ded2f1
Medium
Scaling to 1 Million Users: The Architecture I Wish I Knew Sooner
When we launched, we were happy just having 100 daily users. But within months, we hit 10,000, then 100,000. And scaling problems piled up…
14👍2🔥1
دوتا پکیج زیبا ببینیم ، هم کاراییشون زیباست هم سورس کدشون
https://prismphp.com
https://laragent.ai
خودم به شخصه prism پسندیدم ، ولی خوب laragent هم تحت توسعست ، احتمالا به زودی چیزای بهتری و بیشتری ساپورت کنه .
@panicdev
https://prismphp.com
https://laragent.ai
خودم به شخصه prism پسندیدم ، ولی خوب laragent هم تحت توسعست ، احتمالا به زودی چیزای بهتری و بیشتری ساپورت کنه .
@panicdev
Prismphp
Prism is a powerful Laravel package for integrating Large Language Models (LLMs) into your applications.
👍12
🔥 حافظه رم Redis پر شد؟ باید چه کار کنیم؟
همون طور که میدونید Redis یه پایگاه داده سریع و درونحافظهایه که خیلی وقتا بهعنوان کش (Cache) استفاده میشه.
اما سؤال مهم: وقتی حافظه Redis پر شد، چه اتفاقی میافته؟ 🤔
📦 ردیس چندین پالسی حذف داده (Eviction Policy) داره که میتونی با maxmemory-policy تنظیمشون کنی.
بیا با هم این سیاستها رو مرور کنیم:
🔒 1. پالسی noeviction (بدون حذف):
✅ هیچ دادهای حذف نمیشه.
❌ اگه حافظه پر باشه، خطا میده و کلید جدیدی نمیذاره.
📌 مناسب برای مواقعی که حذف داده اصلاً مجاز نیست.
🧠 2. پالسی volatile-lru:
✅ فقط کلیدهایی که expire دارن و کمتر استفاده شدن حذف میشن.
📌 خوب برای دادههای موقتی و نه چندان مهم.
📊 3. پالسی allkeys-lru:
✅ کلیدهایی که کمتر استفاده شدن حذف میشن، فرقی نداره expire دارن یا نه.
📌 ایدهآل برای کشهایی که دسترسی بهشون الگوی مشخصی نداره.
🎲 4. پالسی volatile-random:
✅ یه کلید رندوم که expire داره حذف میشه.
📌 ساده، ولی شاید کلید مهمی رو حذف کنه.
🎲 5. پالسی allkeys-random:
✅ هر کلیدی ممکنه رندوم حذف شه، چه expire داشته باشه چه نه.
📌 برای سیستمهای خیلی حساس توصیه نمیشه.
⏳ 6.پالسی volatile-ttl:
✅ کلیدی که زودتر expire میشه اول حذف میشه.
📌 منطقی برای دادههایی که زمان مصرفشون مهمه.
📉 7. پالسی volatile-lfu:
✅ کلیدهایی با expire که کم استفاده شدن حذف میشن.
📌 خوب برای حفظ دادههای پرکاربرد و حذف دادههای کممصرف.
📉 8. پالسی allkeys-lfu:
✅ هر کلیدی (با یا بدون expire) که کم استفاده شده باشه حذف میشه.
📌 برای کشهایی که رفتار مصرف دادههاش مدام تغییر میکنه عالیه.
@panicdev
همون طور که میدونید Redis یه پایگاه داده سریع و درونحافظهایه که خیلی وقتا بهعنوان کش (Cache) استفاده میشه.
اما سؤال مهم: وقتی حافظه Redis پر شد، چه اتفاقی میافته؟ 🤔
📦 ردیس چندین پالسی حذف داده (Eviction Policy) داره که میتونی با maxmemory-policy تنظیمشون کنی.
بیا با هم این سیاستها رو مرور کنیم:
🔒 1. پالسی noeviction (بدون حذف):
✅ هیچ دادهای حذف نمیشه.
❌ اگه حافظه پر باشه، خطا میده و کلید جدیدی نمیذاره.
📌 مناسب برای مواقعی که حذف داده اصلاً مجاز نیست.
🧠 2. پالسی volatile-lru:
✅ فقط کلیدهایی که expire دارن و کمتر استفاده شدن حذف میشن.
📌 خوب برای دادههای موقتی و نه چندان مهم.
📊 3. پالسی allkeys-lru:
✅ کلیدهایی که کمتر استفاده شدن حذف میشن، فرقی نداره expire دارن یا نه.
📌 ایدهآل برای کشهایی که دسترسی بهشون الگوی مشخصی نداره.
🎲 4. پالسی volatile-random:
✅ یه کلید رندوم که expire داره حذف میشه.
📌 ساده، ولی شاید کلید مهمی رو حذف کنه.
🎲 5. پالسی allkeys-random:
✅ هر کلیدی ممکنه رندوم حذف شه، چه expire داشته باشه چه نه.
📌 برای سیستمهای خیلی حساس توصیه نمیشه.
⏳ 6.پالسی volatile-ttl:
✅ کلیدی که زودتر expire میشه اول حذف میشه.
📌 منطقی برای دادههایی که زمان مصرفشون مهمه.
📉 7. پالسی volatile-lfu:
✅ کلیدهایی با expire که کم استفاده شدن حذف میشن.
📌 خوب برای حفظ دادههای پرکاربرد و حذف دادههای کممصرف.
📉 8. پالسی allkeys-lfu:
✅ هر کلیدی (با یا بدون expire) که کم استفاده شده باشه حذف میشه.
📌 برای کشهایی که رفتار مصرف دادههاش مدام تغییر میکنه عالیه.
@panicdev
🔥11👍2
استخدام برنامهنویس ارشد (Full-Stack (PHP
شرط بررسی رزومه:
حداقل ۵ سال سابقه کار حرفهای در حوزه توسعه نرمافزار و برنامهنویسی
حقوق:
+۵۰ میلیون تومان
* طبیعتا بسته به تخصص و رزومه میتونید عدد مدنظرتون رو پیشنهاد بدید و محدودیتی وجود نداره)
مهارتهای فنی مورد نیاز:
تسلط کامل به PHP
آشنایی عمیق با معماری نرمافزار (Software Architecture)
آشنایی با Redis
تجربه در طراحی و توسعه API
آشنایی با Docker
و ...
https://jobinja.ir/1370018
شرط بررسی رزومه:
حداقل ۵ سال سابقه کار حرفهای در حوزه توسعه نرمافزار و برنامهنویسی
حقوق:
+۵۰ میلیون تومان
* طبیعتا بسته به تخصص و رزومه میتونید عدد مدنظرتون رو پیشنهاد بدید و محدودیتی وجود نداره)
مهارتهای فنی مورد نیاز:
تسلط کامل به PHP
آشنایی عمیق با معماری نرمافزار (Software Architecture)
آشنایی با Redis
تجربه در طراحی و توسعه API
آشنایی با Docker
و ...
https://jobinja.ir/1370018
🔥3
دوستان کسی تاحالا کورس سافت اسکیل از جایی شرکت کرده؟ نتیجهش چی بوده؟
کلا چطوری سافت اسکیل هاتون رو بهبود میدید؟
کلا چطوری سافت اسکیل هاتون رو بهبود میدید؟
این سه تا وصله فعلا
https://news.1rj.ru/str/proxy?server=151.244.85.30&port=70&secret=eed77db43ee3721f0fcb40a4ff63b5cd276D656469612E737465616D706F77657265642E636F6D
https://news.1rj.ru/str/proxy?server=151.244.85.66&port=85&secret=ee00ff000fffff00fff5555ffffffffff56D656469612E737465616D706F77657265642E636F6D
https://news.1rj.ru/str/proxy?server=151.244.85.48&port=443&secret=eed77db43ee3721f0fcb40a4ff63b5cd276D656469612E737465616D706F77657265642E636F6D
https://news.1rj.ru/str/proxy?server=151.244.85.30&port=70&secret=eed77db43ee3721f0fcb40a4ff63b5cd276D656469612E737465616D706F77657265642E636F6D
https://news.1rj.ru/str/proxy?server=151.244.85.66&port=85&secret=ee00ff000fffff00fff5555ffffffffff56D656469612E737465616D706F77657265642E636F6D
https://news.1rj.ru/str/proxy?server=151.244.85.48&port=443&secret=eed77db43ee3721f0fcb40a4ff63b5cd276D656469612E737465616D706F77657265642E636F6D
❤🔥4👍1👌1🕊1
⚠️ Update: #Iran has now been disconnected from the global internet for 36 hours; live metrics show national connectivity remains in the low few percent of ordinary levels with only a handful of users able to connect via multi-hop VPNs 📉
🔗 NetBlocks (@netblocks)
🔗 NetBlocks (@netblocks)
داشتم تجربه کسی که داشته روی روش های توسعه نرم افزار ژاپنی ها مطالعه میکرده میخوندم
به قدری ارزشمند و پر محتوا و قابل تعمل هستش که فک کردم به اشتراک گذاریش خالی از لطف نباشه .
طولانی هست ولی ارزش داره ، سعی میکنم در طول روز چند تیکشو بزارم .
امیدوارم که روزی این روش ها در جاهای دیگه دنیا (غرب و ایران ) هم قابل پیاده سازی باشه .🥺
———————————————————————-
می فرماید که :
سه ساله دارم روی روشهای توسعه نرمافزار ژاپنی مطالعه میکنم و چیزی که کشف کردم، دیدم رو نسبت به کدنویسی کاملاً تغییر داد.
در حالی که برنامهنویسهای غربی دائم درگیر آخرین فریمورک جاوااسکریپت هستن یا سر اینکه تب بزنن یا اسپیس، بحث میکنن، برنامهنویسهای ژاپنی بیسروصدا دارن یکی از قابلاعتمادترین و قابلنگهداریترین نرمافزارهای دنیا رو میسازن
رمز کارشون چیه؟
اونا با کد مثل یه تویوتا کمری رفتار میکنن، نه یه تسلا.
به قدری ارزشمند و پر محتوا و قابل تعمل هستش که فک کردم به اشتراک گذاریش خالی از لطف نباشه .
طولانی هست ولی ارزش داره ، سعی میکنم در طول روز چند تیکشو بزارم .
امیدوارم که روزی این روش ها در جاهای دیگه دنیا (غرب و ایران ) هم قابل پیاده سازی باشه .
———————————————————————-
می فرماید که :
سه ساله دارم روی روشهای توسعه نرمافزار ژاپنی مطالعه میکنم و چیزی که کشف کردم، دیدم رو نسبت به کدنویسی کاملاً تغییر داد.
در حالی که برنامهنویسهای غربی دائم درگیر آخرین فریمورک جاوااسکریپت هستن یا سر اینکه تب بزنن یا اسپیس، بحث میکنن، برنامهنویسهای ژاپنی بیسروصدا دارن یکی از قابلاعتمادترین و قابلنگهداریترین نرمافزارهای دنیا رو میسازن
رمز کارشون چیه؟
اونا با کد مثل یه تویوتا کمری رفتار میکنن، نه یه تسلا.
Please open Telegram to view this post
VIEW IN TELEGRAM
Panic Dev
داشتم تجربه کسی که داشته روی روش های توسعه نرم افزار ژاپنی ها مطالعه میکرده میخوندم به قدری ارزشمند و پر محتوا و قابل تعمل هستش که فک کردم به اشتراک گذاریش خالی از لطف نباشه . طولانی هست ولی ارزش داره ، سعی میکنم در طول روز چند تیکشو بزارم . امیدوارم…
فلسفهای که همهچیز را تغییر میدهد
مونوزوکوری (Monozukuri): هنر ساختن
در ژاپن مفهومی وجود دارد به نام مونوزوکوری — یعنی "هنر ساختن".
اما این فقط دربارهی تولید محصولات فیزیکی نیست؛ بلکه یک فلسفه است. فلسفهای که روی مهارت، بهبود مداوم، و افتخار به خود فرآیند ساخت تأکید دارد.
برنامهنویسهای ژاپنی فقط کد نمینویسن، اونو میسازن.
وقتی با هیروشی ناکامورا، یکی از مهندسهای ارشد یه شرکت بزرگ فناوری در ژاپن، مصاحبه کردم، اینطوری توضیح داد:
"در غرب، کد مینویسن که فیچر تحویل بدن. تو ژاپن، کد مینویسیم که دههها عمر کنه. اون فیچر فقط نقطهی شروعه."
این تغییر ذهنیت واقعاً عمیقه.
بهجای اینکه شعارشون "سریع حرکت کن و همهچی رو بشکن" باشه، برنامهنویسهای ژاپنی باور دارن به "آروم بساز و کاری نذار که خراب شه".
———————————————————————
کایزن (Kaizen): اصل ۱٪ بهتر شدن
احتمالاً اسم کایزن رو توی زمینهی بهبود کسبوکار شنیدی،
ولی برنامهنویسهای ژاپنی این مفهوم رو مستقیم روی کد پیاده میکنن.
بهجای بازنویسیهای سنگین یا ریفکتور کردن کل سیستم،
اونا بهبودهای کوچیک و مداوم انجام میدن — هر روز، با هر کامیت.
توی عمل یعنی چی؟ اینطوری: (در تصویر )
برنامهنویس ژاپنی منتظر مجوز برای بهبود کد نمیمونه،
واسه "اسپرینتِ بدهی فنی" برنامهریزی نمیکنه،
فقط هر روز یه ذره همهچی رو بهتر میکنه.
مونوزوکوری (Monozukuri): هنر ساختن
در ژاپن مفهومی وجود دارد به نام مونوزوکوری — یعنی "هنر ساختن".
اما این فقط دربارهی تولید محصولات فیزیکی نیست؛ بلکه یک فلسفه است. فلسفهای که روی مهارت، بهبود مداوم، و افتخار به خود فرآیند ساخت تأکید دارد.
برنامهنویسهای ژاپنی فقط کد نمینویسن، اونو میسازن.
وقتی با هیروشی ناکامورا، یکی از مهندسهای ارشد یه شرکت بزرگ فناوری در ژاپن، مصاحبه کردم، اینطوری توضیح داد:
"در غرب، کد مینویسن که فیچر تحویل بدن. تو ژاپن، کد مینویسیم که دههها عمر کنه. اون فیچر فقط نقطهی شروعه."
این تغییر ذهنیت واقعاً عمیقه.
بهجای اینکه شعارشون "سریع حرکت کن و همهچی رو بشکن" باشه، برنامهنویسهای ژاپنی باور دارن به "آروم بساز و کاری نذار که خراب شه".
———————————————————————
کایزن (Kaizen): اصل ۱٪ بهتر شدن
احتمالاً اسم کایزن رو توی زمینهی بهبود کسبوکار شنیدی،
ولی برنامهنویسهای ژاپنی این مفهوم رو مستقیم روی کد پیاده میکنن.
بهجای بازنویسیهای سنگین یا ریفکتور کردن کل سیستم،
اونا بهبودهای کوچیک و مداوم انجام میدن — هر روز، با هر کامیت.
توی عمل یعنی چی؟ اینطوری: (در تصویر )
برنامهنویس ژاپنی منتظر مجوز برای بهبود کد نمیمونه،
واسه "اسپرینتِ بدهی فنی" برنامهریزی نمیکنه،
فقط هر روز یه ذره همهچی رو بهتر میکنه.
👍8🔥1
توسعه بهموقع (Just-In-Time Development)
تیمهای نرمافزاری ژاپنی، سیستم معروف تولید تویوتا رو برای توسعهی نرمافزار بومیسازی کردن.
یکی از مفاهیم قدرتمند این سیستم، توسعه بهموقع (Just-In-Time) هست.
بهجای اینکه فیچرهایی بسازن که «شاید یه روزی لازم بشه»،
دقیقاً همون چیزی رو میسازن که الان لازمه — نه بیشتر، نه کمتر.
———————————————
جیدوکا (Jidoka): طرز فکر "خط تولید رو متوقف کن"
توی کارخانههای تویوتا، هر کارگری میتونه خط تولید رو کامل متوقف کنه اگه مشکلی ببینه.
تیمهای توسعه نرمافزار ژاپنی دقیقاً همین اصل رو پیاده میکنن:
اگه مشکلی وجود داشته باشه، همهچی متوقف میشه تا اون مشکل حل بشه.
نه از این حرفا که "تو اسپرینت بعدی درستش میکنیم"،
نه این که "فعلاً بفرستیم، بعداً یه پچ میدیم."
یه بار دیدم یه تیم ژاپنی دو روز وقت گذاشت تا یه باگ گوشهای رو دیباگ کنه که فقط روی ۰.۱٪ از کاربرا تأثیر داشت.
وقتی پرسیدم چرا فقط لاگش نکردن و رفتن سراغ بقیه کارا، مدیر تیم گفت:
«اگه یه اشکال کوچیک رو قبول کنیم، یعنی اشکال داشتن رو عادی کردیم. خیلی زود، پر از اشکال میشیم.»
شاید سختگیرانه بهنظر بیاد —
اما وقتی میبینی توی سیستمشون تقریباً هیچ باگ تولیدی وجود نداره، میفهمی چرا اینقدر جواب میده.
تیمهای نرمافزاری ژاپنی، سیستم معروف تولید تویوتا رو برای توسعهی نرمافزار بومیسازی کردن.
یکی از مفاهیم قدرتمند این سیستم، توسعه بهموقع (Just-In-Time) هست.
بهجای اینکه فیچرهایی بسازن که «شاید یه روزی لازم بشه»،
دقیقاً همون چیزی رو میسازن که الان لازمه — نه بیشتر، نه کمتر.
———————————————
جیدوکا (Jidoka): طرز فکر "خط تولید رو متوقف کن"
توی کارخانههای تویوتا، هر کارگری میتونه خط تولید رو کامل متوقف کنه اگه مشکلی ببینه.
تیمهای توسعه نرمافزار ژاپنی دقیقاً همین اصل رو پیاده میکنن:
اگه مشکلی وجود داشته باشه، همهچی متوقف میشه تا اون مشکل حل بشه.
نه از این حرفا که "تو اسپرینت بعدی درستش میکنیم"،
نه این که "فعلاً بفرستیم، بعداً یه پچ میدیم."
یه بار دیدم یه تیم ژاپنی دو روز وقت گذاشت تا یه باگ گوشهای رو دیباگ کنه که فقط روی ۰.۱٪ از کاربرا تأثیر داشت.
وقتی پرسیدم چرا فقط لاگش نکردن و رفتن سراغ بقیه کارا، مدیر تیم گفت:
«اگه یه اشکال کوچیک رو قبول کنیم، یعنی اشکال داشتن رو عادی کردیم. خیلی زود، پر از اشکال میشیم.»
شاید سختگیرانه بهنظر بیاد —
اما وقتی میبینی توی سیستمشون تقریباً هیچ باگ تولیدی وجود نداره، میفهمی چرا اینقدر جواب میده.
👍17🍓1
Panic Dev
توسعه بهموقع (Just-In-Time Development) تیمهای نرمافزاری ژاپنی، سیستم معروف تولید تویوتا رو برای توسعهی نرمافزار بومیسازی کردن. یکی از مفاهیم قدرتمند این سیستم، توسعه بهموقع (Just-In-Time) هست. بهجای اینکه فیچرهایی بسازن که «شاید یه روزی لازم بشه»،…
هفت نوع اتلاف در توسعه نرمافزار
(برگرفته از سیستم تولید تویوتا)
برنامهنویسهای ژاپنی با الهام از سیستم تولید تویوتا،
هفت نوع «اتلاف» یا Wastes در توسعه نرمافزار رو شناسایی کردن —
و هدفشون حذف یا کاهش این موارده:
۱. کارِ نیمهتمام
کدی که نوشته شده ولی تست نشده، بررسی نشده یا هنوز دیپلوی نشده.
تیمهای ژاپنی تا جای ممکن کار در جریان رو کم میکنن و تلاش میکنن کارهای کوچیک رو بهطور کامل و تموم انجام بدن.
۲. قابلیتهای اضافه
ساختن فیچرهایی که کاربر واقعاً نیاز نداره.
برنامهنویسهای ژاپنی استاد "نه گفتن" به رشد بیرویهی امکانات هستن.
۳. دوبارهیادگیری
وقتی زمان صرف میشه برای فهمیدن اینکه یه تکه کد چیکار میکنه — چون مستند نیست یا ساختار خوبی نداره.
برای همین، اونا روی نامگذاری واضح و کامنتنویسی دقیق خیلی تأکید دارن.
۴. تحویلهای دستبهدست
وقتی یه تیم کد رو فقط "پرتاب" میکنه سمت یه تیم دیگه.
ژاپنیها تیمهای چندمهارتهای رو ترجیح میدن که مسئولیت کامل یه فیچر رو از اول تا آخر به عهده بگیرن.
۵. تأخیرها
منتظر موندن برای تأیید، بررسی یا وابستگیها.
اونا تلاش میکنن بازخوردها رو سریعتر بگیرن و تیمهایی بسازن که مستقلتر عمل کنن.
۶. پرش بین کارها
مدام بین پروژهها یا فیچرهای مختلف جابهجا شدن.
برنامهنویسهای ژاپنی ترجیح میدن روی یک چیز تمرکز کنن و همون رو درست و کامل انجام بدن.
۷. باگها (نقصها)
خطاهایی که نیاز به اصلاح دارن و باعث نارضایتی کاربر میشن.
این بزرگترین اتلافه — و دلیلش هم اینه که ژاپنیها پیشگیری رو به تشخیص و اصلاح ترجیح میدن.
✨ نتیجه؟
سیستمی با کمترین اتلاف، تمرکز بالا، و کیفیتی که حتی بعد از سالها هم قابل اتکا باقی میمونه.
(برگرفته از سیستم تولید تویوتا)
برنامهنویسهای ژاپنی با الهام از سیستم تولید تویوتا،
هفت نوع «اتلاف» یا Wastes در توسعه نرمافزار رو شناسایی کردن —
و هدفشون حذف یا کاهش این موارده:
۱. کارِ نیمهتمام
کدی که نوشته شده ولی تست نشده، بررسی نشده یا هنوز دیپلوی نشده.
تیمهای ژاپنی تا جای ممکن کار در جریان رو کم میکنن و تلاش میکنن کارهای کوچیک رو بهطور کامل و تموم انجام بدن.
۲. قابلیتهای اضافه
ساختن فیچرهایی که کاربر واقعاً نیاز نداره.
برنامهنویسهای ژاپنی استاد "نه گفتن" به رشد بیرویهی امکانات هستن.
۳. دوبارهیادگیری
وقتی زمان صرف میشه برای فهمیدن اینکه یه تکه کد چیکار میکنه — چون مستند نیست یا ساختار خوبی نداره.
برای همین، اونا روی نامگذاری واضح و کامنتنویسی دقیق خیلی تأکید دارن.
۴. تحویلهای دستبهدست
وقتی یه تیم کد رو فقط "پرتاب" میکنه سمت یه تیم دیگه.
ژاپنیها تیمهای چندمهارتهای رو ترجیح میدن که مسئولیت کامل یه فیچر رو از اول تا آخر به عهده بگیرن.
۵. تأخیرها
منتظر موندن برای تأیید، بررسی یا وابستگیها.
اونا تلاش میکنن بازخوردها رو سریعتر بگیرن و تیمهایی بسازن که مستقلتر عمل کنن.
۶. پرش بین کارها
مدام بین پروژهها یا فیچرهای مختلف جابهجا شدن.
برنامهنویسهای ژاپنی ترجیح میدن روی یک چیز تمرکز کنن و همون رو درست و کامل انجام بدن.
۷. باگها (نقصها)
خطاهایی که نیاز به اصلاح دارن و باعث نارضایتی کاربر میشن.
این بزرگترین اتلافه — و دلیلش هم اینه که ژاپنیها پیشگیری رو به تشخیص و اصلاح ترجیح میدن.
✨ نتیجه؟
سیستمی با کمترین اتلاف، تمرکز بالا، و کیفیتی که حتی بعد از سالها هم قابل اتکا باقی میمونه.
👍3❤🔥2🔥1
داخل یک پروداکت، زمان پاسخگویی API هاشون به شدت بالا رفته بود.
بررسیها نشون داد که عامل اصلی، استفادهی زیاد از تابع
در هر درخواست، این تابع حدود 300 بار اجرا میشد. در نهایت دیدیم که فقط همین بخش باعث مصرف ۴۰٪ از کل زمان اجرای درخواست شده!
نتایج:
- میانگین زمان پاسخگویی از 700ms به 200ms رسید
- در 95٪ مواقع زمان پاسخ از 1.2s به 350ms کاهش پیدا کرد
- استفاده از CPU سرورها 35٪ کمتر شد
- تعداد درخواستهایی که تونستن در ثانیه پردازش کنند، تقریباً ۳ برابر شد!
-— دلیل اصلی این تفاوت اینه که isset():
- مستقیماً در سطح زبان PHP پیادهسازی شده
- هزینهی پردازش تابع نداره
- بسیار سریعتر اجرا میشه
—- در مقابل array_key_exists():
- باید پارامترها رو بررسی کنه
- نیاز به بررسی نوع داده داره
- زمان اجراش بیشتره
اما توجه:
اگر مقدار
در نسخههای جدید PHP (مثل PHP 8 به بعد)، استفاده از ?? (عملگر Null Coalescing) یک جایگزین بسیار سریع و تمیز برای هر دو هست:
منبع
#laravel #php
@panicdev
بررسیها نشون داد که عامل اصلی، استفادهی زیاد از تابع
array_key_exists() بود، اون هم در تابعی که برای هر محصول در API صدها بار اجرا میشد.در هر درخواست، این تابع حدود 300 بار اجرا میشد. در نهایت دیدیم که فقط همین بخش باعث مصرف ۴۰٪ از کل زمان اجرای درخواست شده!
نتایج:
- میانگین زمان پاسخگویی از 700ms به 200ms رسید
- در 95٪ مواقع زمان پاسخ از 1.2s به 350ms کاهش پیدا کرد
- استفاده از CPU سرورها 35٪ کمتر شد
- تعداد درخواستهایی که تونستن در ثانیه پردازش کنند، تقریباً ۳ برابر شد!
-— دلیل اصلی این تفاوت اینه که isset():
- مستقیماً در سطح زبان PHP پیادهسازی شده
- هزینهی پردازش تابع نداره
- بسیار سریعتر اجرا میشه
—- در مقابل array_key_exists():
- باید پارامترها رو بررسی کنه
- نیاز به بررسی نوع داده داره
- زمان اجراش بیشتره
اما توجه:
اگر مقدار
null برای شما معنیداره (مثلاً در تنظیمات یا اعتبارسنجی API)، باید همچنان از array_key_exists() استفاده کنید چون isset() برای مقادیر null مقدار false برمیگردونه و ممکنه کلید موجود باشه ولی مقدارش null باشه.در نسخههای جدید PHP (مثل PHP 8 به بعد)، استفاده از ?? (عملگر Null Coalescing) یک جایگزین بسیار سریع و تمیز برای هر دو هست:
$value = $array['key'] ?? 'default';منبع
#laravel #php
@panicdev
👍11👌2