⚛️ ساختار پروژه React؛ بر اساس تغییر، نه پوشه!
یکی از اشتباهات رایج در پروژههای React اینه که ساختار پروژه رو صرفاً بر اساس نوع فایلها بچینیم؛ مثلاً همهی components یکجا، همهی hooks یکجا و...
اما با بزرگتر شدن پروژه، تغییر دادن یک Feature میتونه به جستوجو در چندین پوشه و فایل مختلف نیاز داشته باشه.
💡 ایدهی جالب این مقاله:
ساختار پروژه را بر اساس Feature و نوع تغییرات سازماندهی کنیم، نه صرفاً نوع فایل.
نتیجه؟
کد مرتبط کنار هم قرار میگیره، تغییرات راحتتر پیدا میشن و نگهداری پروژه سادهتر میشه.
مطالعه مقاله
@CodeVerse_dev
یکی از اشتباهات رایج در پروژههای React اینه که ساختار پروژه رو صرفاً بر اساس نوع فایلها بچینیم؛ مثلاً همهی components یکجا، همهی hooks یکجا و...
اما با بزرگتر شدن پروژه، تغییر دادن یک Feature میتونه به جستوجو در چندین پوشه و فایل مختلف نیاز داشته باشه.
💡 ایدهی جالب این مقاله:
ساختار پروژه را بر اساس Feature و نوع تغییرات سازماندهی کنیم، نه صرفاً نوع فایل.
نتیجه؟
کد مرتبط کنار هم قرار میگیره، تغییرات راحتتر پیدا میشن و نگهداری پروژه سادهتر میشه.
مطالعه مقاله
@CodeVerse_dev
❤12
🚀 هر بار که * SELECT مینویسی، شاید داری به دیتابیس ظلم میکنی!
یکی از رایجترین اشتباهاتی که حتی تو پروژههای واقعی هم دیده میشه:
در نگاه اول مشکلی نداره، ولی اگه جدولت ۴۰ ستون داشته باشه و فقط اسم و ایمیل کاربر رو بخوای چی؟
در این حالت دیتابیس:
ستونهای اضافه رو از دیسک میخونه.
دادههای بیشتری از شبکه منتقل میکنه.
حافظه بیشتری مصرف میکنه.
به جاش این کار رو بکن:
شاید تو جدولهای کوچیک تفاوتی حس نکنی، ولی روی دیتابیسهای چند میلیون رکوردی، همین عادت ساده میتونه زمان اجرای Query رو کاهش بده.
برنامهنویس حرفهای فقط به «درست اجرا شدن» فکر نمیکنه؛ به هزینه اجرای کد هم فکر میکنه.
@CodeVerse_dev
یکی از رایجترین اشتباهاتی که حتی تو پروژههای واقعی هم دیده میشه:
SELECT * FROM users;
در نگاه اول مشکلی نداره، ولی اگه جدولت ۴۰ ستون داشته باشه و فقط اسم و ایمیل کاربر رو بخوای چی؟
در این حالت دیتابیس:
ستونهای اضافه رو از دیسک میخونه.
دادههای بیشتری از شبکه منتقل میکنه.
حافظه بیشتری مصرف میکنه.
به جاش این کار رو بکن:
SELECT name, email FROM users;
شاید تو جدولهای کوچیک تفاوتی حس نکنی، ولی روی دیتابیسهای چند میلیون رکوردی، همین عادت ساده میتونه زمان اجرای Query رو کاهش بده.
برنامهنویس حرفهای فقط به «درست اجرا شدن» فکر نمیکنه؛ به هزینه اجرای کد هم فکر میکنه.
@CodeVerse_dev
❤11
🧠 چرا 100vw گاهی باعث اسکرول افقی سایت میشه؟
یه باگ عجیب CSS که احتمالاً یه بار باهاش برخورد کردی:
صفحهات کاملاً ریسپانسیوه، ولی یهدفعه پایین سایت Horizontal Scroll ظاهر میشه. 😐
یکی از مظنونهای اصلی:
مشکل اینجاست که 100vw عرض کل Viewport رو در نظر میگیره؛ حتی فضایی که ممکنه Scrollbar اشغال کرده باشه.
در بعضی شرایط نتیجه میشه:
و همین چند پیکسل باعث Scroll افقی میشه.
برای خیلی از المانها، مخصوصاً داخل Containerها، این بهتره:
البته 100vw خودش بد نیست و در بعضی Layoutها دقیقاً همون چیزیه که میخوای.
نکته اینه که Viewport Width با Container Width یکی نیست.
این تفاوت کوچیک یکی از اون چیزهاییه که وقتی Layout پیچیده میشه، خودش رو نشون میده.
@CodeVerse_dev
یه باگ عجیب CSS که احتمالاً یه بار باهاش برخورد کردی:
صفحهات کاملاً ریسپانسیوه، ولی یهدفعه پایین سایت Horizontal Scroll ظاهر میشه. 😐
یکی از مظنونهای اصلی:
.full-width {
width: 100vw;
}مشکل اینجاست که 100vw عرض کل Viewport رو در نظر میگیره؛ حتی فضایی که ممکنه Scrollbar اشغال کرده باشه.
در بعضی شرایط نتیجه میشه:
Viewport
├───────────────┤
Content
├─────────────────┤ ← کمی بزرگتر
و همین چند پیکسل باعث Scroll افقی میشه.
برای خیلی از المانها، مخصوصاً داخل Containerها، این بهتره:
.full-width {
width: 100%;
}البته 100vw خودش بد نیست و در بعضی Layoutها دقیقاً همون چیزیه که میخوای.
نکته اینه که Viewport Width با Container Width یکی نیست.
این تفاوت کوچیک یکی از اون چیزهاییه که وقتی Layout پیچیده میشه، خودش رو نشون میده.
@CodeVerse_dev
👍8❤2
🔥 چرا بعضی سایتها با JavaScript زیاد هنوز سریع هستن؟
مشکل معمولاً خود JavaScript نیست.
مشکل اینه که چه زمانی اجرا میشه.
فرض کن صفحه برای نمایش محتوای اصلی فقط به ۲۰٪ از JavaScript نیاز داره، ولی مرورگر مجبور میشه قبل از نمایش صفحه، کل Bundle رو Parse و Execute کنه.
اینجاست که مفهوم Code Splitting مهم میشه.
به جای اینکه یک فایل غولپیکر داشته باشی:
app.js → 1.5MB
کد رو بر اساس نیاز تقسیم میکنی:
core.js
checkout.js
dashboard.js
editor.js
کاربر صفحه Checkout رو باز کرده؟
پس لازم نیست کد مربوط به Dashboard رو همون لحظه دانلود و اجرا کنه.
این یعنی:
Less JavaScript ≠ همیشه جواب
گاهی راهحل بهتر اینه:
Load only what you need, when you need it.
همین فلسفه پشت خیلی از تکنیکهای مدرن Performance در وب قرار داره.
@CodeVerse_dev
مشکل معمولاً خود JavaScript نیست.
مشکل اینه که چه زمانی اجرا میشه.
فرض کن صفحه برای نمایش محتوای اصلی فقط به ۲۰٪ از JavaScript نیاز داره، ولی مرورگر مجبور میشه قبل از نمایش صفحه، کل Bundle رو Parse و Execute کنه.
اینجاست که مفهوم Code Splitting مهم میشه.
به جای اینکه یک فایل غولپیکر داشته باشی:
app.js → 1.5MB
کد رو بر اساس نیاز تقسیم میکنی:
core.js
checkout.js
dashboard.js
editor.js
کاربر صفحه Checkout رو باز کرده؟
پس لازم نیست کد مربوط به Dashboard رو همون لحظه دانلود و اجرا کنه.
این یعنی:
Less JavaScript ≠ همیشه جواب
گاهی راهحل بهتر اینه:
Load only what you need, when you need it.
همین فلسفه پشت خیلی از تکنیکهای مدرن Performance در وب قرار داره.
@CodeVerse_dev
👍5❤4
🌐 یک ترفند DevTools که برای بررسی سایت رقبا خیلی کاربردیه
فرض کن وارد یک سایت شدی و میخوای بفهمی یک بخش خاص با چه تکنولوژی ساخته شده.
لازم نیست حدس بزنی.
حالا Chrome DevTools رو باز کن و از تب Network شروع کن.
صفحه رو Reload کن و بعد دنبال اینها بگرد:
.css
.js
.webp
.woff2
.json
اسم فایلها و مسیرها گاهی کلی اطلاعات بهت میدن.
مثلاً ممکنه ببینی:
/wp-content/plugins/...
/wp-content/themes/...
/assets/...
/_next/...
یا حتی اسم کتابخانهای که سایت استفاده میکنه داخل فایلهای JS مشخص باشه.
تب Network فقط برای پیدا کردن خطا نیست؛ یه پنجره به پشت صحنه سایت محسوب میشه.
البته اطلاعاتی که از فرانتاند میبینی، لزوماً کل تکنولوژی Backend رو مشخص نمیکنه.
ولی برای تحلیل ساختار Frontend، Performance و Assetها فوقالعاده کاربردیه.
@CodeVerse_dev
فرض کن وارد یک سایت شدی و میخوای بفهمی یک بخش خاص با چه تکنولوژی ساخته شده.
لازم نیست حدس بزنی.
حالا Chrome DevTools رو باز کن و از تب Network شروع کن.
صفحه رو Reload کن و بعد دنبال اینها بگرد:
.css
.js
.webp
.woff2
.json
اسم فایلها و مسیرها گاهی کلی اطلاعات بهت میدن.
مثلاً ممکنه ببینی:
/wp-content/plugins/...
/wp-content/themes/...
/assets/...
/_next/...
یا حتی اسم کتابخانهای که سایت استفاده میکنه داخل فایلهای JS مشخص باشه.
تب Network فقط برای پیدا کردن خطا نیست؛ یه پنجره به پشت صحنه سایت محسوب میشه.
البته اطلاعاتی که از فرانتاند میبینی، لزوماً کل تکنولوژی Backend رو مشخص نمیکنه.
ولی برای تحلیل ساختار Frontend، Performance و Assetها فوقالعاده کاربردیه.
@CodeVerse_dev
❤9
🔐 یه حمله جدید به WordPress که باید جدی بگیری
چند روز اخیر یک حمله Supply Chain به اکوسیستم وردپرس گزارش شده که از یک JSON Feed آلوده برای سوءاستفاده از چند افزونه استفاده میکرد.
قسمت خطرناک ماجرا اینجاست:
مهاجم فقط دنبال خراب کردن سایت نبود.
طبق گزارشها، حمله میتونست:
❌ یک Administrator جعلی ایجاد کنه
❌ یک Plugin مخرب نصب کنه
❌ و در نهایت یک PHP Web Shell روی سایت قرار بده.
یعنی مهاجم عملاً میتونه کنترل جدی روی سایت به دست بیاره.
پس اگه سایت وردپرسی داری، این چند مورد رو همین امروز بررسی کن:
🔸 افزونههای ناشناس یا قدیمی
🔸 افزونههایی که از منبع غیررسمی نصب شدن
🔸 کاربران Administrator ناشناس
🔸 فایلهای PHP جدید و مشکوک
🔸 لاگهای ورود و تغییرات اخیر
و مهمتر از همه:
آپدیت کردن فقط وردپرس کافی نیست؛ کل اکوسیستم سایت باید مدیریت بشه.
💡 امنیت وردپرس بیشتر از اینکه به یک افزونه Security وابسته باشه، به مدیریت درست زنجیره افزونهها و دسترسیها بستگی داره.
@CodeVerse_dev
چند روز اخیر یک حمله Supply Chain به اکوسیستم وردپرس گزارش شده که از یک JSON Feed آلوده برای سوءاستفاده از چند افزونه استفاده میکرد.
قسمت خطرناک ماجرا اینجاست:
مهاجم فقط دنبال خراب کردن سایت نبود.
طبق گزارشها، حمله میتونست:
❌ یک Administrator جعلی ایجاد کنه
❌ یک Plugin مخرب نصب کنه
❌ و در نهایت یک PHP Web Shell روی سایت قرار بده.
یعنی مهاجم عملاً میتونه کنترل جدی روی سایت به دست بیاره.
پس اگه سایت وردپرسی داری، این چند مورد رو همین امروز بررسی کن:
🔸 افزونههای ناشناس یا قدیمی
🔸 افزونههایی که از منبع غیررسمی نصب شدن
🔸 کاربران Administrator ناشناس
🔸 فایلهای PHP جدید و مشکوک
🔸 لاگهای ورود و تغییرات اخیر
و مهمتر از همه:
آپدیت کردن فقط وردپرس کافی نیست؛ کل اکوسیستم سایت باید مدیریت بشه.
💡 امنیت وردپرس بیشتر از اینکه به یک افزونه Security وابسته باشه، به مدیریت درست زنجیره افزونهها و دسترسیها بستگی داره.
@CodeVerse_dev
👍6❤2🤣1
🌐 وقتی URL را وارد میکنی چه اتفاقی میافتد؟
فرض کن مینویسی:
فکر میکنی مرورگر مستقیم به سرور وصل میشود؟
نه! 😄
تقریباً این مسیر طی میشود:
مثلاً DNS ابتدا مشخص میکند:
بعد اتصال برقرار میشود و درخواست HTTP ارسال میشود.
💡 نکته جالب اینجاست که اگر سایت کند باشد، مشکل لزوماً از PHP یا JavaScript نیست؛ ممکن است Bottleneck در DNS، TLS، Network، Server، Database یا حتی Browser Rendering باشد.
پس وقتی میگویی:
این هنوز یک مشکل فنی مشخص نیست؛ فقط یک Symptom است.
@CodeVerse_dev
فرض کن مینویسی:
https://example.com
فکر میکنی مرورگر مستقیم به سرور وصل میشود؟
نه! 😄
تقریباً این مسیر طی میشود:
URL
↓
DNS
↓
IP Address
↓
TCP / QUIC
↓
TLS
↓
HTTP Request
↓
Web Server
↓
Application
↓
Database / Cache
↓
HTTP Response
↓
Browser
مثلاً DNS ابتدا مشخص میکند:
مثلا example.com روی چه IP ای قرار دارد؟ بعد اتصال برقرار میشود و درخواست HTTP ارسال میشود.
💡 نکته جالب اینجاست که اگر سایت کند باشد، مشکل لزوماً از PHP یا JavaScript نیست؛ ممکن است Bottleneck در DNS، TLS، Network، Server، Database یا حتی Browser Rendering باشد.
پس وقتی میگویی:
«سایت کند است»
این هنوز یک مشکل فنی مشخص نیست؛ فقط یک Symptom است.
@CodeVerse_dev
👍5❤3
🚀 چرا display: none همیشه انتخاب خوبی نیست؟
خیلی وقتها برای مخفی کردن یک المان مینویسیم:
ولی یه تفاوت مهم وجود داره.
وقتی display: none استفاده میکنی، المان از Layout حذف میشه و مرورگر اصلاً اون رو نمایش نمیده.
اما اگر فقط میخوای المان دیده نشه ولی فضای خودش رو حفظ کنه:
و اگر میخوای المان نامرئی باشه ولی همچنان در Layout حضور داشته باشه، بسته به سناریو حتی opacity: 0 هم میتونه گزینه مناسبی باشه.
پس این سهتا یکی نیستن:
display: none → حذف از Layout
visibility: hidden → مخفی، ولی فضا حفظ میشه
opacity: 0 → نامرئی، ولی همچنان وجود داره
انتخاب درست کاملاً به چیزی که میخوای بستگی داره.
یه CSS ساده، ولی تفاوتشون توی انیمیشن، Accessibility و تعامل کاربر میتونه خیلی مهم باشه.
💬 تو معمولاً برای مخفی کردن المانها از کدوم روش استفاده میکنی؟
@CodeVerse_dev
خیلی وقتها برای مخفی کردن یک المان مینویسیم:
.element {
display: none;
}ولی یه تفاوت مهم وجود داره.
وقتی display: none استفاده میکنی، المان از Layout حذف میشه و مرورگر اصلاً اون رو نمایش نمیده.
اما اگر فقط میخوای المان دیده نشه ولی فضای خودش رو حفظ کنه:
.element {
visibility: hidden;
}و اگر میخوای المان نامرئی باشه ولی همچنان در Layout حضور داشته باشه، بسته به سناریو حتی opacity: 0 هم میتونه گزینه مناسبی باشه.
پس این سهتا یکی نیستن:
display: none → حذف از Layout
visibility: hidden → مخفی، ولی فضا حفظ میشه
opacity: 0 → نامرئی، ولی همچنان وجود داره
انتخاب درست کاملاً به چیزی که میخوای بستگی داره.
یه CSS ساده، ولی تفاوتشون توی انیمیشن، Accessibility و تعامل کاربر میتونه خیلی مهم باشه.
💬 تو معمولاً برای مخفی کردن المانها از کدوم روش استفاده میکنی؟
@CodeVerse_dev
👍8❤2
⚡ چرا بعضی سایتها با عکسهای زیاد هنوز سریع باز میشن؟
جواب همیشه «عکس کم» نیست.
گاهی مشکل اصلی اینه که مرورگر نمیدونه کدوم عکس رو اول دانلود کنه.
فرض کن صفحهای داری که ۳۰ تصویر داره.
تصویر Hero بالای صفحه باید سریع نمایش داده بشه، ولی تصاویر پایین صفحه اصلاً نیازی نیست همون لحظه دانلود بشن.
اینجاست که "loading="lazy کاربرد پیدا میکنه:
اما یه اشتباه رایج:
روی تصویر اصلی بالای صفحه هم Lazy Loading نذار.
چون همون تصویری که باید سریع نمایش داده بشه، عملاً به مرورگر میگی:
«فعلاً عجله نکن!»
برای تصویر مهم بالای صفحه، معمولاً باید اولویت بارگذاری رو درست مدیریت کنی و برای تصاویر پایین صفحه Lazy Loading داشته باشی.
بهینهسازی تصویر فقط تبدیل JPG به WebP نیست.
گاهی مهمتر از حجم تصویر، اینه که چه زمانی دانلود بشه.
@CodeVerse_dev
جواب همیشه «عکس کم» نیست.
گاهی مشکل اصلی اینه که مرورگر نمیدونه کدوم عکس رو اول دانلود کنه.
فرض کن صفحهای داری که ۳۰ تصویر داره.
تصویر Hero بالای صفحه باید سریع نمایش داده بشه، ولی تصاویر پایین صفحه اصلاً نیازی نیست همون لحظه دانلود بشن.
اینجاست که "loading="lazy کاربرد پیدا میکنه:
<img src="product.webp" loading="lazy">
اما یه اشتباه رایج:
روی تصویر اصلی بالای صفحه هم Lazy Loading نذار.
چون همون تصویری که باید سریع نمایش داده بشه، عملاً به مرورگر میگی:
«فعلاً عجله نکن!»
برای تصویر مهم بالای صفحه، معمولاً باید اولویت بارگذاری رو درست مدیریت کنی و برای تصاویر پایین صفحه Lazy Loading داشته باشی.
بهینهسازی تصویر فقط تبدیل JPG به WebP نیست.
گاهی مهمتر از حجم تصویر، اینه که چه زمانی دانلود بشه.
@CodeVerse_dev
❤7👍2
🌐 یه قابلیت عجیب HTTP که میتونه رفتار سایتت رو تغییر بده
وقتی مرورگر به سرور درخواست میفرسته، فقط URL رو ارسال نمیکنه.
کلی اطلاعات همراه درخواست رد و بدل میشه.
یکی از جالبترین بخشها، Headerها هستن.
مثلاً سرور میتونه با این Header:
به مرورگر بگه:
«این فایل تا مدت زیادی قابل استفاده مجدده؛ لازم نیست هر بار دوباره دانلودش کنی.»
حالا تصور کن فایلهای ثابت سایت مثل:
هر بار دوباره از سرور درخواست بشن.
کاملاً غیرضروریه.
با Cache درست، مرورگر میتونه نسخهای که قبلاً گرفته رو دوباره استفاده کنه.
ولی یه نکته مهم وجود داره:
اگر فایل جدید منتشر کنی و اسمش همون قبلی باشه، ممکنه مرورگر نسخه قدیمی رو از Cache بخونه.
اینجاست که Cache Busting وارد بازی میشه؛ مثلاً با تغییر نام یا Version فایل:
یا:
مسئله Performance فقط کدنویسی نیست؛ گاهی یک Header کوچک HTTP میتونه روی تجربه کل سایت اثر بذاره.
💬 تا حالا با Cache مرورگر به مشکل «چرا تغییراتم نمایش داده نمیشه؟» خوردی؟
@CodeVerse_dev
وقتی مرورگر به سرور درخواست میفرسته، فقط URL رو ارسال نمیکنه.
کلی اطلاعات همراه درخواست رد و بدل میشه.
یکی از جالبترین بخشها، Headerها هستن.
مثلاً سرور میتونه با این Header:
Cache-Control: max-age=31536000
به مرورگر بگه:
«این فایل تا مدت زیادی قابل استفاده مجدده؛ لازم نیست هر بار دوباره دانلودش کنی.»
حالا تصور کن فایلهای ثابت سایت مثل:
app.js
style.css
logo.svg
font.woff2
هر بار دوباره از سرور درخواست بشن.
کاملاً غیرضروریه.
با Cache درست، مرورگر میتونه نسخهای که قبلاً گرفته رو دوباره استفاده کنه.
ولی یه نکته مهم وجود داره:
اگر فایل جدید منتشر کنی و اسمش همون قبلی باشه، ممکنه مرورگر نسخه قدیمی رو از Cache بخونه.
اینجاست که Cache Busting وارد بازی میشه؛ مثلاً با تغییر نام یا Version فایل:
app.v2.js
یا:
app.js?v=2
مسئله Performance فقط کدنویسی نیست؛ گاهی یک Header کوچک HTTP میتونه روی تجربه کل سایت اثر بذاره.
💬 تا حالا با Cache مرورگر به مشکل «چرا تغییراتم نمایش داده نمیشه؟» خوردی؟
@CodeVerse_dev
❤7👍2
🎨 این ریپو بهت کمک میکنه UIهای خفنتری بسازی!
اگه با React یا Next.js کار میکنی، این ریپو میتونه کلی کامپوننت آماده و قابل شخصیسازی در اختیارت بذاره؛ بدون اینکه مجبور باشی همهچیز رو از صفر بسازی.
کدها هم دست خودته و میتونی هر بخش رو مطابق نیاز پروژهات تغییر بدی. 👌
📎 GitHub
@CodeVerse_dev
اگه با React یا Next.js کار میکنی، این ریپو میتونه کلی کامپوننت آماده و قابل شخصیسازی در اختیارت بذاره؛ بدون اینکه مجبور باشی همهچیز رو از صفر بسازی.
کدها هم دست خودته و میتونی هر بخش رو مطابق نیاز پروژهات تغییر بدی. 👌
📎 GitHub
@CodeVerse_dev
👍5❤2
متد ()Promise.race برای API نجاتت میده
فرض کنید API شما گاهی ۱۰ ثانیه طول میکشد.
اما UI فقط تا ۳ ثانیه میتواند منتظر بماند.
اینجاست که
مثلاً:
هرکدام زودتر اتفاق بیفتد، نتیجه مشخص میشود:
⚡حالا API پاسخ دهد ← ادامه بده.
⏱️ سه ثانیه تمام شود ← Timeout.
البته برای پروژه واقعی بهتر است از
🎯 قابلیت Timeout فقط یک قابلیت UX نیست؛ بخشی از طراحی سیستمهای مقاوم است.
💡 هیچ API نباید بدون محدودیت زمانی منتظر یک سرویس خارجی بماند.
@CodeVerse_dev
فرض کنید API شما گاهی ۱۰ ثانیه طول میکشد.
اما UI فقط تا ۳ ثانیه میتواند منتظر بماند.
اینجاست که
()Promise.race میتواند مفید باشد.مثلاً:
const timeout = new Promise((_, reject) => {
setTimeout(() => {
reject(new Error("Request timeout"));
}, 3000);
});
await Promise.race([
fetch("/api/products"),
timeout
]);هرکدام زودتر اتفاق بیفتد، نتیجه مشخص میشود:
⚡حالا API پاسخ دهد ← ادامه بده.
⏱️ سه ثانیه تمام شود ← Timeout.
البته برای پروژه واقعی بهتر است از
AbortController هم برای متوقف کردن خود Request استفاده کنید.🎯 قابلیت Timeout فقط یک قابلیت UX نیست؛ بخشی از طراحی سیستمهای مقاوم است.
💡 هیچ API نباید بدون محدودیت زمانی منتظر یک سرویس خارجی بماند.
@CodeVerse_dev
❤6👍2
🚨 یک خبر مهم برای PHP Developerها
چرخه توسعه PHP 8.6 آغاز شده و نسخههای آزمایشی آن در حال انتشار هستند.
در حال حاضر PHP 8.6 هنوز نسخه Production نیست و نسخههای Alpha برای تست و بازخورد توسعهدهندگان منتشر شدهاند.
همزمان شاخه PHP 8.5 نیز بهروزرسانیهای امنیتی دریافت میکند؛ آخرین نسخه اعلامشده در منابع رسمی PHP، PHP 8.5.9 است.
پس اگر پروژه Production دارید:
❌ سراغ PHP 8.6 Alpha نروید.
اما اگر توسعهدهنده PHP هستید:
✅ تست نسخههای آزمایشی
✅ بررسی Breaking Changeها
✅ آمادهسازی Libraryها
میتواند از همین حالا شروع شود.
🎯 نسخههای Alpha برای Production نیستند؛ برای این هستند که جامعه توسعهدهندگان قبل از Release نهایی مشکلات را پیدا کنند.
💡 یک Developer حرفهای فقط بعد از انتشار نسخه نهایی به تغییرات فکر نمیکند؛ چرخه توسعه را از همان ابتدا دنبال میکند.
@CodeVerse_dev
چرخه توسعه PHP 8.6 آغاز شده و نسخههای آزمایشی آن در حال انتشار هستند.
در حال حاضر PHP 8.6 هنوز نسخه Production نیست و نسخههای Alpha برای تست و بازخورد توسعهدهندگان منتشر شدهاند.
همزمان شاخه PHP 8.5 نیز بهروزرسانیهای امنیتی دریافت میکند؛ آخرین نسخه اعلامشده در منابع رسمی PHP، PHP 8.5.9 است.
پس اگر پروژه Production دارید:
❌ سراغ PHP 8.6 Alpha نروید.
اما اگر توسعهدهنده PHP هستید:
✅ تست نسخههای آزمایشی
✅ بررسی Breaking Changeها
✅ آمادهسازی Libraryها
میتواند از همین حالا شروع شود.
🎯 نسخههای Alpha برای Production نیستند؛ برای این هستند که جامعه توسعهدهندگان قبل از Release نهایی مشکلات را پیدا کنند.
💡 یک Developer حرفهای فقط بعد از انتشار نسخه نهایی به تغییرات فکر نمیکند؛ چرخه توسعه را از همان ابتدا دنبال میکند.
@CodeVerse_dev
❤5👍2
چرا «بهینهسازی زودهنگام» خطرناک است؟
گاهی یک توسعهدهنده قبل از اینکه حتی مشکل Performance وجود داشته باشد، شروع میکند به:
❌ انجام Cache کردن همه چیز
❌ اضافه کردن Redis
❌ پیچیده کردن Queryها
❌ تبدیل معماری به Microservice
فقط چون:
«ممکنه بعداً کند بشه.»
مشکل اینجاست که هنوز نمیدانیم Bottleneck کجاست.
رویکرد بهتر:
Measure → Identify → Optimize → Measure Again
یعنی:
1️⃣ اندازهگیری کن.
2️⃣ گلوگاه واقعی را پیدا کن.
3️⃣ همان بخش را بهینه کن.
4️⃣ دوباره اندازهگیری کن.
🎯 باید بدونیم Performance Engineering با حدس زدن شروع نمیشود؛ با داده شروع میشود.
💡 گاهی سادهترین کد، تا زمانی که واقعاً مشکل ایجاد نکرده، بهترین کد است.
گاهی یک توسعهدهنده قبل از اینکه حتی مشکل Performance وجود داشته باشد، شروع میکند به:
❌ انجام Cache کردن همه چیز
❌ اضافه کردن Redis
❌ پیچیده کردن Queryها
❌ تبدیل معماری به Microservice
فقط چون:
«ممکنه بعداً کند بشه.»
مشکل اینجاست که هنوز نمیدانیم Bottleneck کجاست.
رویکرد بهتر:
Measure → Identify → Optimize → Measure Again
یعنی:
1️⃣ اندازهگیری کن.
2️⃣ گلوگاه واقعی را پیدا کن.
3️⃣ همان بخش را بهینه کن.
4️⃣ دوباره اندازهگیری کن.
🎯 باید بدونیم Performance Engineering با حدس زدن شروع نمیشود؛ با داده شروع میشود.
💡 گاهی سادهترین کد، تا زمانی که واقعاً مشکل ایجاد نکرده، بهترین کد است.
❤8
آیا Retry میتواند یک مشکل کوچک را به فاجعه تبدیل کند؟
فرض کنید API پرداخت شما موقتاً خطا میدهد.
سیستم تصمیم میگیرد دوباره تلاش کند:
اگر ۱۰۰۰ درخواست همزمان داشته باشید، یک خطای موقت میتواند ناگهان به:
🔥 هزاران Request جدید
تبدیل شود.
این همان چیزی است که باید هنگام طراحی Retry مراقبش باشید.
راهکارهای حرفهای:
✅ محدود کردن تعداد Retry
✅ Exponential Backoff
✅ Jitter
✅ تشخیص خطاهای قابل Retry
و در سیستمهای مالی:
✅ Idempotency
🎯عمل Retry باید سیستم را مقاومتر کند، نه اینکه هنگام بحران فشار بیشتری به سرویس وارد کند.
💡همین Retry بدون Backoff میتواند یک سرویس سالم را هم وارد زنجیره شکست کند.
@CodeVerse_dev
فرض کنید API پرداخت شما موقتاً خطا میدهد.
سیستم تصمیم میگیرد دوباره تلاش کند:
Request
↓
Retry
↓
Retry
↓
Retry
اگر ۱۰۰۰ درخواست همزمان داشته باشید، یک خطای موقت میتواند ناگهان به:
🔥 هزاران Request جدید
تبدیل شود.
این همان چیزی است که باید هنگام طراحی Retry مراقبش باشید.
راهکارهای حرفهای:
✅ محدود کردن تعداد Retry
✅ Exponential Backoff
✅ Jitter
✅ تشخیص خطاهای قابل Retry
و در سیستمهای مالی:
✅ Idempotency
🎯عمل Retry باید سیستم را مقاومتر کند، نه اینکه هنگام بحران فشار بیشتری به سرویس وارد کند.
💡همین Retry بدون Backoff میتواند یک سرویس سالم را هم وارد زنجیره شکست کند.
@CodeVerse_dev
❤6
این روزها AI دیگر فقط یک ابزار برای تکمیل کد نیست.
مدلهای جدید به سمت:
🤖فرایند Coding Agent
🤖 اجرای چندمرحلهای Taskها
🤖همینطور Debugging
🤖انجام Code Review
🤖 تست و اصلاح خودکار
حرکت کردهاند.
حتی Google در ۱۳ آگوست ۲۰۲۶ مدل Gemini 3.7 Flash را معرفی کرد و آن را بهطور ویژه برای Coding و Agentها معرفی کرده است.
اما یک نکته مهم:
هوش مصنوعی میتواند کد بیشتری تولید کند؛
اما این به معنی تولید نرمافزار بهتر نیست.
هرچه تولید کد ارزانتر شود، اهمیت این موارد بیشتر میشود:
✅ Architecture
✅ Testing
✅ Security
✅ Code Review
✅ System Design
🎯 آینده توسعه نرمافزار احتمالاً کمتر درباره «نوشتن کد» و بیشتر درباره هدایت و ارزیابی سیستمهایی است که کد تولید میکنند.
@CodeVerse_dev
مدلهای جدید به سمت:
🤖فرایند Coding Agent
🤖 اجرای چندمرحلهای Taskها
🤖همینطور Debugging
🤖انجام Code Review
🤖 تست و اصلاح خودکار
حرکت کردهاند.
حتی Google در ۱۳ آگوست ۲۰۲۶ مدل Gemini 3.7 Flash را معرفی کرد و آن را بهطور ویژه برای Coding و Agentها معرفی کرده است.
اما یک نکته مهم:
هوش مصنوعی میتواند کد بیشتری تولید کند؛
اما این به معنی تولید نرمافزار بهتر نیست.
هرچه تولید کد ارزانتر شود، اهمیت این موارد بیشتر میشود:
✅ Architecture
✅ Testing
✅ Security
✅ Code Review
✅ System Design
🎯 آینده توسعه نرمافزار احتمالاً کمتر درباره «نوشتن کد» و بیشتر درباره هدایت و ارزیابی سیستمهایی است که کد تولید میکنند.
@CodeVerse_dev
❤8
🔐 ۵۰ پروژه Open Source بررسی شدند؛ یک نکته مهم درباره امنیت در عصر AI
با افزایش استفاده از AI در توسعه نرمافزار، یک سؤال مهمتر از همیشه شده:
آیا استفاده از AI واقعاً باعث امنتر شدن کد میشود؟
پلتفرم GitHub اخیراً تجربه ۵۰ پروژه Open Source را که در برنامه Secure Open Source Fund حضور داشتهاند بررسی کرده است.
نتیجه جالب است:
🤖 هوش مصنوعی (AI) میتواند در شناسایی مشکلات امنیتی کمک کند؛
اما بدون بررسی و تجربه Maintainerها، بهتنهایی کافی نیست.
در این پروژهها ترکیب چند عامل اهمیت زیادی داشته:
✅ ابزارهای امنیتی خودکار
✅ استفاده کنترلشده از AI
✅ همینطور Code Review انسانی
✅ بررسی Dependencyها
✅ آموزش Maintainerها
💡 نکته مهم برای برنامهنویسها:
هوش مصنوعی(AI) میتواند یک لایه امنیتی باشد، اما نباید تنها لایه امنیتی پروژه شما باشد.
قبل از Merge کردن کدی که AI تولید کرده، آن را Review و Test کنید.
@CodeVerse_deb
با افزایش استفاده از AI در توسعه نرمافزار، یک سؤال مهمتر از همیشه شده:
آیا استفاده از AI واقعاً باعث امنتر شدن کد میشود؟
پلتفرم GitHub اخیراً تجربه ۵۰ پروژه Open Source را که در برنامه Secure Open Source Fund حضور داشتهاند بررسی کرده است.
نتیجه جالب است:
🤖 هوش مصنوعی (AI) میتواند در شناسایی مشکلات امنیتی کمک کند؛
اما بدون بررسی و تجربه Maintainerها، بهتنهایی کافی نیست.
در این پروژهها ترکیب چند عامل اهمیت زیادی داشته:
✅ ابزارهای امنیتی خودکار
✅ استفاده کنترلشده از AI
✅ همینطور Code Review انسانی
✅ بررسی Dependencyها
✅ آموزش Maintainerها
💡 نکته مهم برای برنامهنویسها:
هوش مصنوعی(AI) میتواند یک لایه امنیتی باشد، اما نباید تنها لایه امنیتی پروژه شما باشد.
قبل از Merge کردن کدی که AI تولید کرده، آن را Review و Test کنید.
@CodeVerse_deb
👍4❤3
🚨 این کد روی سیستم توسعه کاملاً طبیعی به نظر میرسد:
۱۰۰ کاربر؟
مشکلی نیست.
۱۰۰ هزار کاربر؟
هنوز شاید متوجه مشکل نشوید.
اما وقتی جدول به چند میلیون رکورد برسد، این Query میتواند:
❌ حجم زیادی از RAM را مصرف کند
❌ زمان Response را بالا ببرد
❌ فشار زیادی به Database وارد کند
❌ حتی باعث Timeout شدن Request شود
اگر فقط برای پردازش اطلاعات به رکوردها نیاز دارید، از پردازش تکهای استفاده کنید:
و اگر برای API فقط بخشی از دادهها را لازم دارید، Pagination یا Cursor Pagination انتخاب منطقیتری است.
🎯فضای Database را طوری Query نکن که انگار همیشه فقط ۱۰۰ رکورد دارد.
💡 کدی که امروز با ۱۰۰۰ رکورد عالی است، ممکن است فردا با ۱۰ میلیون رکورد تبدیل به یک Incident واقعی شود.
@CodeVerse_dev
$users = User::all();
۱۰۰ کاربر؟
مشکلی نیست.
۱۰۰ هزار کاربر؟
هنوز شاید متوجه مشکل نشوید.
اما وقتی جدول به چند میلیون رکورد برسد، این Query میتواند:
❌ حجم زیادی از RAM را مصرف کند
❌ زمان Response را بالا ببرد
❌ فشار زیادی به Database وارد کند
❌ حتی باعث Timeout شدن Request شود
اگر فقط برای پردازش اطلاعات به رکوردها نیاز دارید، از پردازش تکهای استفاده کنید:
User::chunkById(1000, function ($users) {
foreach ($users as $user) {
// Process
}
});و اگر برای API فقط بخشی از دادهها را لازم دارید، Pagination یا Cursor Pagination انتخاب منطقیتری است.
🎯فضای Database را طوری Query نکن که انگار همیشه فقط ۱۰۰ رکورد دارد.
💡 کدی که امروز با ۱۰۰۰ رکورد عالی است، ممکن است فردا با ۱۰ میلیون رکورد تبدیل به یک Incident واقعی شود.
@CodeVerse_dev
👍5❤2
⚠️ اگر با GitHub Spark کار میکنید، این خبر را جدی بگیرید!
این پلتفرم اعلام کرده که GitHub Spark در حال بازنشسته شدن است.
از ۴ آگوست ۲۰۲۶:
❌ کاربران جدید نمیتوانند از Spark استفاده کنند.
❌ امکان ساخت App جدید وجود ندارد.
اما کاربران فعلی تا ۳۱ آگوست ۲۰۲۶ فرصت دارند Appهای خود را Export کنند.
اپلیکیشنهایی که قبلاً Deploy شدهاند، بعد از بازنشستگی Spark نیز به کار خود ادامه خواهند داد.
📌 بنابراین اگر قبلاً با GitHub Spark پروژه ساختهاید:
قبل از ۳۱ آگوست حتماً پروژههای خود را بررسی و Export کنید.
💡 این دقیقاً یکی از دلایلی است که نشان میدهد نباید پروژههای مهم را کاملاً به یک سرویس خاص وابسته کرد.
@CodeVerse_dev
این پلتفرم اعلام کرده که GitHub Spark در حال بازنشسته شدن است.
از ۴ آگوست ۲۰۲۶:
❌ کاربران جدید نمیتوانند از Spark استفاده کنند.
❌ امکان ساخت App جدید وجود ندارد.
اما کاربران فعلی تا ۳۱ آگوست ۲۰۲۶ فرصت دارند Appهای خود را Export کنند.
اپلیکیشنهایی که قبلاً Deploy شدهاند، بعد از بازنشستگی Spark نیز به کار خود ادامه خواهند داد.
📌 بنابراین اگر قبلاً با GitHub Spark پروژه ساختهاید:
قبل از ۳۱ آگوست حتماً پروژههای خود را بررسی و Export کنید.
💡 این دقیقاً یکی از دلایلی است که نشان میدهد نباید پروژههای مهم را کاملاً به یک سرویس خاص وابسته کرد.
@CodeVerse_dev
👍5❤2
🌐 یک نکته مهم برای طراحان سایت:
فقط به ظاهر سایت در مرورگر دسکتاپ اعتماد نکن!
ممکن است صفحه روی مانیتور شما کاملاً عالی باشد، اما روی موبایل:
❌ متنها بیش از حد کوچک باشند
❌ دکمهها سخت لمس شوند
❌ تصاویر از صفحه بیرون بزنند
❌ منو تجربه بدی داشته باشد
قبل از انتشار هر صفحه، حداقل این ۳ حالت را بررسی کن:
📱 موبایل
📲 تبلت
💻 دسکتاپ
طراحی Responsive یعنی سایت واقعاً با کاربر سازگار باشد، نه اینکه فقط «در موبایل باز شود».
@CodeVerse_dev
فقط به ظاهر سایت در مرورگر دسکتاپ اعتماد نکن!
ممکن است صفحه روی مانیتور شما کاملاً عالی باشد، اما روی موبایل:
❌ متنها بیش از حد کوچک باشند
❌ دکمهها سخت لمس شوند
❌ تصاویر از صفحه بیرون بزنند
❌ منو تجربه بدی داشته باشد
قبل از انتشار هر صفحه، حداقل این ۳ حالت را بررسی کن:
📱 موبایل
📲 تبلت
💻 دسکتاپ
طراحی Responsive یعنی سایت واقعاً با کاربر سازگار باشد، نه اینکه فقط «در موبایل باز شود».
@CodeVerse_dev
👍5❤2
This media is not supported in your browser
VIEW IN TELEGRAM
داداش یه دوره پایتون پیدا کردم خفن ۱۰۰ تومن
اون دوره:
اون دوره:
😁6❤3