Coding Interview Patterns: Nail Your Next Coding Interview
Coding interviews are tough, and they're only getting tougher, typically demanding months of preparation. What we all want is a way to master algorithms and data structures without having to spend countless hours sifting through endless, unfocussed resources. Introducing "Coding Interview Patterns," your complete guide to mastering the key patterns needed to ace your next coding interview.
What’s inside?
An insider’s perspective on what interviewers are truly looking for and why.
101 real coding interview problems with detailed solutions.
Intuitive explanations that guide you through each problem as if you were solving it in a live interview.
1000+ diagrams to illustrate key concepts and patterns.
Table of Contents
Chapter 1: Two Pointers
Chapter 2: Hash Maps and Sets
Chapter 3: Linked Lists
Chapter 4: Fast and Slow Pointers
Chapter 5: Sliding Windows
Chapter 6: Binary Search
Chapter 7: Stacks
Chapter 8: Heaps
Chapter 9: Intervals
Chapter 10: Prefix Sums
Chapter 11: Trees
Chapter 12: Tries
Chapter 13: Graphs
Chapter 14: Backtracking
Chapter 15: Dynamic Programming
Chapter 16: Greedy
Chapter 17: Sort and Search
Chapter 18: Bit Manipulation
Chapter 19: Math and Geometry
Coding interviews are tough, and they're only getting tougher, typically demanding months of preparation. What we all want is a way to master algorithms and data structures without having to spend countless hours sifting through endless, unfocussed resources. Introducing "Coding Interview Patterns," your complete guide to mastering the key patterns needed to ace your next coding interview.
What’s inside?
An insider’s perspective on what interviewers are truly looking for and why.
101 real coding interview problems with detailed solutions.
Intuitive explanations that guide you through each problem as if you were solving it in a live interview.
1000+ diagrams to illustrate key concepts and patterns.
Table of Contents
Chapter 1: Two Pointers
Chapter 2: Hash Maps and Sets
Chapter 3: Linked Lists
Chapter 4: Fast and Slow Pointers
Chapter 5: Sliding Windows
Chapter 6: Binary Search
Chapter 7: Stacks
Chapter 8: Heaps
Chapter 9: Intervals
Chapter 10: Prefix Sums
Chapter 11: Trees
Chapter 12: Tries
Chapter 13: Graphs
Chapter 14: Backtracking
Chapter 15: Dynamic Programming
Chapter 16: Greedy
Chapter 17: Sort and Search
Chapter 18: Bit Manipulation
Chapter 19: Math and Geometry
❤4
DotNet | دات نت
Coding Interview Patterns: Nail Your Next Coding Interview Coding interviews are tough, and they're only getting tougher, typically demanding months of preparation. What we all want is a way to master algorithms and data structures without having to spend…
Alex_Xu,_Shaun_Gunawardane_Coding_Interview_Patterns_Nail_Your_Next.pdf
66.2 MB
https://www.instructa.ai/en/ai-prompts/next-15-coding-standards
از این قسمت میتونین به Cursor یک سری Rule بدین و میتونین خودتون بر اساس پروژه هم Customize کنین، بعد از این به بعد توی جنریت کردن کد این نکات رو در نظر میگیره، مثلا قوانين که تو ESLint تعریف میکنین میتونین اینجا هم بیارین و ازش استفاده کنین خوبیش اینه به صورت General هم میتونین بزارین توی ریپو تا بقیه هم ازش استفاده کنن.
توی این لینک هم کلی Structure و پیاده سازی سرویس های مختلف دیگه هست که به نظرم جالبه میتونه کمک کنه.
https://www.instructa.ai/en/ai-prompts?framework=next
و اینم برای یک سری Rule های کار با Sonnet 3.7 هست :
https://www.instructa.ai/en/ai-prompts/claude-sonnet-37-best-practices
از این قسمت میتونین به Cursor یک سری Rule بدین و میتونین خودتون بر اساس پروژه هم Customize کنین، بعد از این به بعد توی جنریت کردن کد این نکات رو در نظر میگیره، مثلا قوانين که تو ESLint تعریف میکنین میتونین اینجا هم بیارین و ازش استفاده کنین خوبیش اینه به صورت General هم میتونین بزارین توی ریپو تا بقیه هم ازش استفاده کنن.
توی این لینک هم کلی Structure و پیاده سازی سرویس های مختلف دیگه هست که به نظرم جالبه میتونه کمک کنه.
https://www.instructa.ai/en/ai-prompts?framework=next
و اینم برای یک سری Rule های کار با Sonnet 3.7 هست :
https://www.instructa.ai/en/ai-prompts/claude-sonnet-37-best-practices
Instructa Courses
Next.js 15 AI Prompt by Kevin Kern
Comprehensive rules and best practices for Next.js 15 development, covering project structure, TypeScript usage, and more
👍3
Forwarded from Software Philosophy
آشنایی با Outbox Pattern و اهمیت آن در سیستمهای توزیعشده
آیا تاکنون در توسعهی یک سیستم توزیعشده با این دغدغه مواجه شدهاید که هنگام ثبت تغییرات در پایگاه داده و همزمان ارسال پیام (رویداد) به یک سرویس دیگر (مانند RabbitMQ یا Kafka)، ممکن است یکی از این مراحل با موفقیت انجام شود و دیگری با شکست روبهرو گردد؟ در چنین شرایطی، بخشی از دادهها بهروز میشود اما سرویسهای مصرفکننده از این تغییرات بیخبر میمانند و هماهنگی میان بخشهای مختلف سیستم از بین میرود.
مشکل اصلی کجاست؟
بهطور معمول، اگر در حین بهروزرسانی یک موجودیت در پایگاه داده بخواهیم یک رویداد نیز به سیستم دیگری ارسال کنیم و مراحل دیتابیس و ارسال پیام در یک تراکنش مجزا یا بهصورت ناهمزمان انجام شوند، احتمال از دست رفتن یا عدم ارسال پیام وجود دارد. این امر ممکن است به ناسازگاری در دادهها و عملکرد سرویسهای وابسته منجر شود.
راهحل چیست؟
در اینجاست که الگوی Outbox وارد عمل میشود. این الگو پیشبینی میکند که ابتدا همهی رویدادهایی که قرار است برای سیستمهای دیگر ارسال شوند در جدولی اختصاصی (Outbox Table) در همان پایگاه دادهی اصلی ذخیره شوند. این کار همزمان با تراکنش بهروزرسانی سایر دادهها صورت میگیرد، بهطوریکه اگر عملیات اصلی موفق باشد، اطلاعات رویداد نیز قطعاً ثبت میشود.
سپس چه میشود؟
یک فرایند مجزا (Outbox Process) بهطور مستمر این جدول را بررسی میکند و رویدادهای ثبتشده را به پیامرسان (Message Broker) ارسال میکند. در صورت موفقیت در ارسال، رکورد مربوطه از جدول Outbox حذف میشود و بدین ترتیب از ارسال مجدد ناخواسته جلوگیری میگردد. اگر هم پیامرسان در لحظه غیرفعال باشد یا خطایی رخ دهد، رکورد رویداد کماکان در پایگاه داده باقی میماند تا در تلاش بعدی مجدداً ارسال شود.
مزایای Outbox Pattern
۱. جلوگیری از ناسازگاری دادهها: با انجام ثبت رویداد و تغییرات داده در یک تراکنش واحد، احتمال بروز تناقض در دادهها کاهش مییابد.
۲. اطمینان از عدم از دست رفتن رویدادها: حتی اگر زیرساخت ارتباطی یا پیامرسان موقتاً از دسترس خارج شود، پیام در Outbox محفوظ میماند و پس از بازگشت سرویس، ارسال خواهد شد.
۳. مقیاسپذیری بالا: افزودن سرویسهای جدید یا گسترش زیرساخت پیامرسانی تحت تأثیر این الگو بهراحتی امکانپذیر است، چرا که شیوهی ثبت و ارسال رویدادها مشخص و یکپارچه است.
در واقع Outbox Pattern راهکاری قدرتمند و مطمئن برای ساخت سیستمهای توزیعشده و مبتنی بر رویداد است و کمک میکند دغدغهی شکست ارسال پیام و ناسازگاری دادهها برطرف شود.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
___________
آیا تاکنون در توسعهی یک سیستم توزیعشده با این دغدغه مواجه شدهاید که هنگام ثبت تغییرات در پایگاه داده و همزمان ارسال پیام (رویداد) به یک سرویس دیگر (مانند RabbitMQ یا Kafka)، ممکن است یکی از این مراحل با موفقیت انجام شود و دیگری با شکست روبهرو گردد؟ در چنین شرایطی، بخشی از دادهها بهروز میشود اما سرویسهای مصرفکننده از این تغییرات بیخبر میمانند و هماهنگی میان بخشهای مختلف سیستم از بین میرود.
مشکل اصلی کجاست؟
بهطور معمول، اگر در حین بهروزرسانی یک موجودیت در پایگاه داده بخواهیم یک رویداد نیز به سیستم دیگری ارسال کنیم و مراحل دیتابیس و ارسال پیام در یک تراکنش مجزا یا بهصورت ناهمزمان انجام شوند، احتمال از دست رفتن یا عدم ارسال پیام وجود دارد. این امر ممکن است به ناسازگاری در دادهها و عملکرد سرویسهای وابسته منجر شود.
راهحل چیست؟
در اینجاست که الگوی Outbox وارد عمل میشود. این الگو پیشبینی میکند که ابتدا همهی رویدادهایی که قرار است برای سیستمهای دیگر ارسال شوند در جدولی اختصاصی (Outbox Table) در همان پایگاه دادهی اصلی ذخیره شوند. این کار همزمان با تراکنش بهروزرسانی سایر دادهها صورت میگیرد، بهطوریکه اگر عملیات اصلی موفق باشد، اطلاعات رویداد نیز قطعاً ثبت میشود.
سپس چه میشود؟
یک فرایند مجزا (Outbox Process) بهطور مستمر این جدول را بررسی میکند و رویدادهای ثبتشده را به پیامرسان (Message Broker) ارسال میکند. در صورت موفقیت در ارسال، رکورد مربوطه از جدول Outbox حذف میشود و بدین ترتیب از ارسال مجدد ناخواسته جلوگیری میگردد. اگر هم پیامرسان در لحظه غیرفعال باشد یا خطایی رخ دهد، رکورد رویداد کماکان در پایگاه داده باقی میماند تا در تلاش بعدی مجدداً ارسال شود.
مزایای Outbox Pattern
۱. جلوگیری از ناسازگاری دادهها: با انجام ثبت رویداد و تغییرات داده در یک تراکنش واحد، احتمال بروز تناقض در دادهها کاهش مییابد.
۲. اطمینان از عدم از دست رفتن رویدادها: حتی اگر زیرساخت ارتباطی یا پیامرسان موقتاً از دسترس خارج شود، پیام در Outbox محفوظ میماند و پس از بازگشت سرویس، ارسال خواهد شد.
۳. مقیاسپذیری بالا: افزودن سرویسهای جدید یا گسترش زیرساخت پیامرسانی تحت تأثیر این الگو بهراحتی امکانپذیر است، چرا که شیوهی ثبت و ارسال رویدادها مشخص و یکپارچه است.
در واقع Outbox Pattern راهکاری قدرتمند و مطمئن برای ساخت سیستمهای توزیعشده و مبتنی بر رویداد است و کمک میکند دغدغهی شکست ارسال پیام و ناسازگاری دادهها برطرف شود.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
___________
Baeldung on Computer Science
Outbox Pattern in Microservices | Baeldung on Computer Science
Learn how to implement the Outbox Pattern for microservices.
در ادامه یک راهنمای کامل و بهبود یافته برای استفاده رایگان از Cursor ارائه شده است. لطفاً مراحل زیر را به ترتیب با دقت دنبال کنید:
---
گام ۱: خروج از حساب کاربری Cursor
1. خروج از حساب (Logout):
ابتدا از حساب کاربری Cursor خود خارج شوید. این کار تضمین میکند که تنظیمات قبلی یا اطلاعات ورود مانع روند ثبتنام جدید نشوند.
2. راهاندازی مجدد برنامه:
پس از خروج، برنامه Cursor را دوباره اجرا کنید تا مطمئن شوید در وضعیت خارج از حساب هستید.
---
گام ۲: اجرای PowerShell
1. باز کردن PowerShell:
برنامه Windows PowerShell را اجرا کنید. این محیط به شما امکان میدهد تا دستورات خط فرمان را وارد کرده و اسکریپتهای لازم را اجرا کنید.
2. اجرای اسکریپت نصب:
در پنجره PowerShell، دستور زیر را وارد کنید:
توضیح:
دستور irm مخفف Invoke-RestMethod است که فایل اسکریپت نصب را از گیتهاب دانلود میکند.
عملگر | خروجی دستور اول را به دستور دوم (که در اینجا liex است) میدهد.
با اجرای این دستور، اسکریپت نصب اجرا شده و فرآیند تنظیمات اولیه آغاز میشود.
---
گام ۳: ثبتنام جدید در Cursor
1. انتخاب گزینه ثبتنام:
پس از اجرای موفق اسکریپت، در منوی ارائه شده گزینه "Cursor New Register" را انتخاب کنید.
2. شروع فرآیند ثبتنام توسط ربات:
به محض انتخاب گزینه، ربات به صورت خودکار فعال شده و تلاش میکند شما را در سیستم ثبت کند.
3. نکات مهم در این مرحله:
فعال بودن فیلترشکن:
مطمئن شوید فیلترشکن (VPN) شما فعال است. این امر به دلیل محدودیتهای جغرافیایی و دسترسی به سرورهای مورد نیاز ضروری است.
تأیید عدم ربات بودن:
قبل از کلیک روی دکمه مربوط به ربات، گزینه "من ربات نیستم" را فعال کنید. این اقدام از بروز خطاهای احتمالی در فرآیند ثبتنام جلوگیری میکند.
---
گام ۴: تکمیل ثبتنام و استفاده از Cursor
1. تغییر شناسه دستگاه:
پس از تکمیل فرآیند ثبتنام، شناسه (Machine ID) دستگاه شما تغییر میکند. این تغییر به معنای موفقیتآمیز بودن ثبتنام و فعال شدن خدمات رایگان Cursor است.
2. استفاده از نسخه جدید Cursor:
حالا میتوانید از امکانات و ویژگیهای جدید Cursor بهره ببرید.
3. پیشنهاد مهم:
توصیه میشود پس از تکمیل ثبتنام، از بهروزرسانی (Update) خودداری کنید تا تنظیمات و دسترسی رایگان شما حفظ شود.
---
با دنبال کردن دقیق مراحل فوق، میتوانید به راحتی از نسخه رایگان Cursor استفاده کرده و از امکانات آن لذت ببرید.
---
گام ۱: خروج از حساب کاربری Cursor
1. خروج از حساب (Logout):
ابتدا از حساب کاربری Cursor خود خارج شوید. این کار تضمین میکند که تنظیمات قبلی یا اطلاعات ورود مانع روند ثبتنام جدید نشوند.
2. راهاندازی مجدد برنامه:
پس از خروج، برنامه Cursor را دوباره اجرا کنید تا مطمئن شوید در وضعیت خارج از حساب هستید.
---
گام ۲: اجرای PowerShell
1. باز کردن PowerShell:
برنامه Windows PowerShell را اجرا کنید. این محیط به شما امکان میدهد تا دستورات خط فرمان را وارد کرده و اسکریپتهای لازم را اجرا کنید.
2. اجرای اسکریپت نصب:
در پنجره PowerShell، دستور زیر را وارد کنید:
irm https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/scripts/install.ps1 | iex
توضیح:
دستور irm مخفف Invoke-RestMethod است که فایل اسکریپت نصب را از گیتهاب دانلود میکند.
عملگر | خروجی دستور اول را به دستور دوم (که در اینجا liex است) میدهد.
با اجرای این دستور، اسکریپت نصب اجرا شده و فرآیند تنظیمات اولیه آغاز میشود.
---
گام ۳: ثبتنام جدید در Cursor
1. انتخاب گزینه ثبتنام:
پس از اجرای موفق اسکریپت، در منوی ارائه شده گزینه "Cursor New Register" را انتخاب کنید.
2. شروع فرآیند ثبتنام توسط ربات:
به محض انتخاب گزینه، ربات به صورت خودکار فعال شده و تلاش میکند شما را در سیستم ثبت کند.
3. نکات مهم در این مرحله:
فعال بودن فیلترشکن:
مطمئن شوید فیلترشکن (VPN) شما فعال است. این امر به دلیل محدودیتهای جغرافیایی و دسترسی به سرورهای مورد نیاز ضروری است.
تأیید عدم ربات بودن:
قبل از کلیک روی دکمه مربوط به ربات، گزینه "من ربات نیستم" را فعال کنید. این اقدام از بروز خطاهای احتمالی در فرآیند ثبتنام جلوگیری میکند.
---
گام ۴: تکمیل ثبتنام و استفاده از Cursor
1. تغییر شناسه دستگاه:
پس از تکمیل فرآیند ثبتنام، شناسه (Machine ID) دستگاه شما تغییر میکند. این تغییر به معنای موفقیتآمیز بودن ثبتنام و فعال شدن خدمات رایگان Cursor است.
2. استفاده از نسخه جدید Cursor:
حالا میتوانید از امکانات و ویژگیهای جدید Cursor بهره ببرید.
3. پیشنهاد مهم:
توصیه میشود پس از تکمیل ثبتنام، از بهروزرسانی (Update) خودداری کنید تا تنظیمات و دسترسی رایگان شما حفظ شود.
---
با دنبال کردن دقیق مراحل فوق، میتوانید به راحتی از نسخه رایگان Cursor استفاده کرده و از امکانات آن لذت ببرید.
❤2👍1
Forwarded from thisisnabi.dev [Farsi]
لابلای تموم خستگیاتون، این ویدیو رو هم ببینید.
https://www.youtube.com/watch?v=xtxfrxf0mfE
جذاب بود :)
کلا من مفاهیم فرایند توسعه نرم افزار و معماری نرم افزار رو خیلی دوست دارم از تجربیات دیگران استفاده کنم تا کتاب بخونم. (می دونمم کتاب از آسمون نیومده و بخشیش تجربه هست)
هر چند کتاب های پایه رو هم 4، پنج جلدی مطالعه کردم ولی خب این مدل کنفرانس ها بیشتر بهم حال میده.
https://www.youtube.com/watch?v=xtxfrxf0mfE
جذاب بود :)
کلا من مفاهیم فرایند توسعه نرم افزار و معماری نرم افزار رو خیلی دوست دارم از تجربیات دیگران استفاده کنم تا کتاب بخونم. (می دونمم کتاب از آسمون نیومده و بخشیش تجربه هست)
هر چند کتاب های پایه رو هم 4، پنج جلدی مطالعه کردم ولی خب این مدل کنفرانس ها بیشتر بهم حال میده.
👍5
در طراحی API، صفحهبندی (Pagination) برای مدیریت دادههای بزرگ و بهبود عملکرد بسیار مهم است. در اینجا شش تکنیک رایج برای صفحهبندی در API ها آورده شده است:
---
1. صفحهبندی بر اساس آفسِت (Offset-based Pagination)
در این روش از پارامترهای آفست (offset) و حد (limit) برای تعیین نقطه شروع و تعداد رکوردهایی که باید بازگردانده شوند، استفاده میشود.
مثال:
GET /orders?offset=0&limit=3
مزایا:
ساده برای پیادهسازی و فهم.
معایب:
برای آفستهای بزرگ، ممکن است عملکرد کاهش یابد، زیرا باید رکوردهای زیادی را جستجو کرده و از آنها عبور کنید.
---
2. صفحهبندی بر اساس کَرسور (Cursor-based Pagination)
در این روش از یک کرسور (یک شناسه منحصر به فرد) برای مشخص کردن موقعیت در دیتاست استفاده میشود. این کرسور معمولاً به صورت یک رشته رمزگذاری شده است که به یک رکورد خاص اشاره میکند.
مثال:
GET /orders?cursor=xxx
مزایا:
برای دیتاستهای بزرگ کارآمدتر است، زیرا نیازی به جستجو و عبور از رکوردها نیست.
معایب:
پیچیدهتر در پیادهسازی و درک.
---
3. صفحهبندی بر اساس صفحه (Page-based Pagination)
در این روش، شماره صفحه و اندازه هر صفحه مشخص میشود.
مثال:
GET /items?page=2&size=3
مزایا:
پیادهسازی و استفاده آسان است.
معایب:
مشابه صفحهبندی آفسِت، برای شماره صفحههای بزرگ ممکن است مشکلات عملکردی داشته باشد.
---
4. صفحهبندی بر اساس کلید (Keyset-based Pagination)
در این روش از یک کلید (معمولاً کلید اصلی یا یک ستون ایندکسشده دیگر) برای فیلتر کردن دیتاست استفاده میشود.
مثال:
GET /items?after_id=102&limit=3
مزایا:
برای دیتاستهای بزرگ کارآمد است و مشکلات عملکردی آفسِت را برطرف میکند.
معایب:
نیاز به یک کلید منحصر به فرد و ایندکسشده دارد و پیادهسازی پیچیدهتر است.
---
5. صفحهبندی بر اساس زمان (Time-based Pagination)
در این روش از تاریخ و زمان برای صفحهبندی رکوردها استفاده میشود.
مثال:
GET /items?start_time=xxx&end_time=yyy
مزایا:
برای دیتاستهایی که بر اساس زمان مرتب شدهاند مفید است. این روش از اضافه شدن رکوردهای جدید جلوگیری میکند.
معایب:
نیاز به یک تاریخ/زمان قابل اعتماد و ثابت دارد.
---
6. صفحهبندی ترکیبی (Hybrid Pagination)
در این روش از ترکیب چند تکنیک صفحهبندی برای بهرهبرداری از مزایای آنها استفاده میشود.
مثال:
GET /items?cursor=abc&start_time=xxx&end_time=yyy
مزایا:
میتواند بهترین عملکرد و انعطافپذیری را برای دیتاستهای پیچیده ارائه دهد.
معایب:
پیادهسازی پیچیدهتر است و نیاز به طراحی دقیق دارد.
---
این روشها به شما کمک میکنند تا با توجه به نیازهای مختلف پروژهتان، صفحهبندی بهینه و کارآمدی در API ها پیادهسازی کنید.
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
---
1. صفحهبندی بر اساس آفسِت (Offset-based Pagination)
در این روش از پارامترهای آفست (offset) و حد (limit) برای تعیین نقطه شروع و تعداد رکوردهایی که باید بازگردانده شوند، استفاده میشود.
مثال:
GET /orders?offset=0&limit=3
مزایا:
ساده برای پیادهسازی و فهم.
معایب:
برای آفستهای بزرگ، ممکن است عملکرد کاهش یابد، زیرا باید رکوردهای زیادی را جستجو کرده و از آنها عبور کنید.
---
2. صفحهبندی بر اساس کَرسور (Cursor-based Pagination)
در این روش از یک کرسور (یک شناسه منحصر به فرد) برای مشخص کردن موقعیت در دیتاست استفاده میشود. این کرسور معمولاً به صورت یک رشته رمزگذاری شده است که به یک رکورد خاص اشاره میکند.
مثال:
GET /orders?cursor=xxx
مزایا:
برای دیتاستهای بزرگ کارآمدتر است، زیرا نیازی به جستجو و عبور از رکوردها نیست.
معایب:
پیچیدهتر در پیادهسازی و درک.
---
3. صفحهبندی بر اساس صفحه (Page-based Pagination)
در این روش، شماره صفحه و اندازه هر صفحه مشخص میشود.
مثال:
GET /items?page=2&size=3
مزایا:
پیادهسازی و استفاده آسان است.
معایب:
مشابه صفحهبندی آفسِت، برای شماره صفحههای بزرگ ممکن است مشکلات عملکردی داشته باشد.
---
4. صفحهبندی بر اساس کلید (Keyset-based Pagination)
در این روش از یک کلید (معمولاً کلید اصلی یا یک ستون ایندکسشده دیگر) برای فیلتر کردن دیتاست استفاده میشود.
مثال:
GET /items?after_id=102&limit=3
مزایا:
برای دیتاستهای بزرگ کارآمد است و مشکلات عملکردی آفسِت را برطرف میکند.
معایب:
نیاز به یک کلید منحصر به فرد و ایندکسشده دارد و پیادهسازی پیچیدهتر است.
---
5. صفحهبندی بر اساس زمان (Time-based Pagination)
در این روش از تاریخ و زمان برای صفحهبندی رکوردها استفاده میشود.
مثال:
GET /items?start_time=xxx&end_time=yyy
مزایا:
برای دیتاستهایی که بر اساس زمان مرتب شدهاند مفید است. این روش از اضافه شدن رکوردهای جدید جلوگیری میکند.
معایب:
نیاز به یک تاریخ/زمان قابل اعتماد و ثابت دارد.
---
6. صفحهبندی ترکیبی (Hybrid Pagination)
در این روش از ترکیب چند تکنیک صفحهبندی برای بهرهبرداری از مزایای آنها استفاده میشود.
مثال:
GET /items?cursor=abc&start_time=xxx&end_time=yyy
مزایا:
میتواند بهترین عملکرد و انعطافپذیری را برای دیتاستهای پیچیده ارائه دهد.
معایب:
پیادهسازی پیچیدهتر است و نیاز به طراحی دقیق دارد.
---
این روشها به شما کمک میکنند تا با توجه به نیازهای مختلف پروژهتان، صفحهبندی بهینه و کارآمدی در API ها پیادهسازی کنید.
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1
Forwarded from thisisnabi.dev [Farsi]
سلام دوستان
ما برای یک استارت آپ در حوزه فین تک در حال جذب نیروی Backend در 2 سطح Senior و Mid هستیم.
اگر دوست داشتید می تونید برام رزومه بفرستید که من معرفیتون کنم.
دارن کارشون رو from scratch بالا میارن.
1. Senior .NET Developer
2. .NET Developer
🪖 امکان ریموت ندارند
@thisisnabi
ما برای یک استارت آپ در حوزه فین تک در حال جذب نیروی Backend در 2 سطح Senior و Mid هستیم.
اگر دوست داشتید می تونید برام رزومه بفرستید که من معرفیتون کنم.
دارن کارشون رو from scratch بالا میارن.
1. Senior .NET Developer
2. .NET Developer
🪖 امکان ریموت ندارند
@thisisnabi
Forwarded from TondTech (مسعود بیگی)
برای یکی از چند تا شرکت بزرگ اکوسیستم، دوستانم در حال تیم سازی هستند. اگر در حوزه دات نت مید (d3 به بالا) تا تک لید هستید و دوست دارید این فرصت رو بررسی کنید، رزومه تون رو برام بفرستین
برای سنجش خودتون نگاهی به این فریم ورک بندازید:
https://github.com/jorgef/engineeringladders
@Merkousha
برای سنجش خودتون نگاهی به این فریم ورک بندازید:
https://github.com/jorgef/engineeringladders
@Merkousha
Forwarded from Code With HSN
یکی از بهترین معماری های CA که DDD هم پیاده کرده درون خودش میتونید سورسش رو بخونید و ایده بگیرین ازش:
https://github.com/jasontaylordev/CleanArchitecture/
ضمنا برای عزیزان فریلنسر هم مناسبه چون فرانت هم داره با React
https://github.com/jasontaylordev/CleanArchitecture/
ضمنا برای عزیزان فریلنسر هم مناسبه چون فرانت هم داره با React
GitHub
GitHub - jasontaylordev/CleanArchitecture: Clean Architecture Solution Template for ASP.NET Core
Clean Architecture Solution Template for ASP.NET Core - jasontaylordev/CleanArchitecture
👍7❤1
سیستم Logging در NET.: از اشتباهات رایج تا بهترین روشها
مقدمه
سلام دوستان! اینجا میخوایم در مورد Logging داخل برنامههای NET. صحبت کنیم. نکاتی که نیک چاپساس میگه رو به زبون ساده مرور میکنیم تا بتونید به راحتی سیستمهای خودتون رو بهبود بدید.
اهمیت Logging
سیستم Logging به شما کمک میکنه تا:
- خطاها رو راحتتر پیدا کنید.
- رفتار برنامه رو زیر نظر داشته باشید.
- اطلاعات لازم برای رفع مشکلات رو جمعآوری کنید.
اما اگه درست انجام نشه، ممکنه:
- گزارشها خیلی بزرگ و پیچیده بشن.
- نتونید مشکلات رو به درستی بفهمید.
- عملکرد برنامه تحت تاثیر قرار بگیره.
۸ قانون ساده Logging
قانون ۱: پیام یعنی الگوی پیام
به جای یه رشته ساده، پیام باید الگو باشه. اینجوری پیامها مرتبتر و قابل فهمتر میشن.
قانون ۲: از درونیابی یا الحاق رشته دوری کن
این روشها میتونن باعث کاهش سرعت برنامه بشن و اطلاعات مفید رو از بین ببرن.
قانون ۳: Logging ساختاریافته رو انتخاب کن
با استفاده از الگوهای پیام با پارامترهای مشخص:
- سرعت و کارایی بهتر میگیری.
- دادهها به صورت ساختاریافته ثبت میشن.
- خوانایی گزارشها افزایش پیدا میکنه.
قانون ۴: از جعبهسازی غیرضروری دوری کن
قبل از اینکه هر مقداری رو ارسال کنی، ببین سطح گزارش فعاله یا نه تا از مشکلات عملکردی جلو گیری کنی.
قانون ۵: از Source Generator استفاده کن
این ابزار توی NET. بهت کمک میکنه تا:
- کد بهینه تولید بشه.
- از نوشتن کد اضافی جلوگیری بشه.
- گزارشهای یکنواخت و ساختاریافته داشته باشی.
قانون ۶: پیچیدگیهای غیرضروری رو کنار بگذار
همیشه سعی کن راهحلهای ساده و قابل فهم انتخاب کنی تا همه راحت کار کنن.
قانون ۷: هشدار رو به عنوان سطح پیشفرض انتخاب کن
این کار باعث میشه:
- حجم گزارشها کمتر بشه.
- تمرکز روی موارد مهم حفظ بشه.
(البته برای موارد خاص میتونی گزارشهای اطلاعاتی هم فعال کنی.)
قانون ۸: فقط اطلاعات ضروری رو ثبت کن
تنها اون اطلاعاتی رو ثبت کن که واقعاً برای فهم داستان برنامه نیاز داری. اینجوری گزارشها مرتب و مفید میمونن.
نتیجهگیری
سیستم Logging درست کلید موفقیت توی برنامهنویسه. با رعایت این ۸ قانون ساده، میتونی گزارشهایی داشته باشی که هم کارآمد باشن و هم بهت کمک کنن داستان برنامهات رو بهتر بفهمی. فقط اطلاعات ضروری رو ثبت کن تا همه چیز مرتب و بهینه بمونه.
منابع
- ویدیوی اصلی
- مستندات NET. برای Logging
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
مقدمه
سلام دوستان! اینجا میخوایم در مورد Logging داخل برنامههای NET. صحبت کنیم. نکاتی که نیک چاپساس میگه رو به زبون ساده مرور میکنیم تا بتونید به راحتی سیستمهای خودتون رو بهبود بدید.
اهمیت Logging
سیستم Logging به شما کمک میکنه تا:
- خطاها رو راحتتر پیدا کنید.
- رفتار برنامه رو زیر نظر داشته باشید.
- اطلاعات لازم برای رفع مشکلات رو جمعآوری کنید.
اما اگه درست انجام نشه، ممکنه:
- گزارشها خیلی بزرگ و پیچیده بشن.
- نتونید مشکلات رو به درستی بفهمید.
- عملکرد برنامه تحت تاثیر قرار بگیره.
۸ قانون ساده Logging
قانون ۱: پیام یعنی الگوی پیام
به جای یه رشته ساده، پیام باید الگو باشه. اینجوری پیامها مرتبتر و قابل فهمتر میشن.
قانون ۲: از درونیابی یا الحاق رشته دوری کن
این روشها میتونن باعث کاهش سرعت برنامه بشن و اطلاعات مفید رو از بین ببرن.
قانون ۳: Logging ساختاریافته رو انتخاب کن
با استفاده از الگوهای پیام با پارامترهای مشخص:
- سرعت و کارایی بهتر میگیری.
- دادهها به صورت ساختاریافته ثبت میشن.
- خوانایی گزارشها افزایش پیدا میکنه.
قانون ۴: از جعبهسازی غیرضروری دوری کن
قبل از اینکه هر مقداری رو ارسال کنی، ببین سطح گزارش فعاله یا نه تا از مشکلات عملکردی جلو گیری کنی.
قانون ۵: از Source Generator استفاده کن
این ابزار توی NET. بهت کمک میکنه تا:
- کد بهینه تولید بشه.
- از نوشتن کد اضافی جلوگیری بشه.
- گزارشهای یکنواخت و ساختاریافته داشته باشی.
قانون ۶: پیچیدگیهای غیرضروری رو کنار بگذار
همیشه سعی کن راهحلهای ساده و قابل فهم انتخاب کنی تا همه راحت کار کنن.
قانون ۷: هشدار رو به عنوان سطح پیشفرض انتخاب کن
این کار باعث میشه:
- حجم گزارشها کمتر بشه.
- تمرکز روی موارد مهم حفظ بشه.
(البته برای موارد خاص میتونی گزارشهای اطلاعاتی هم فعال کنی.)
قانون ۸: فقط اطلاعات ضروری رو ثبت کن
تنها اون اطلاعاتی رو ثبت کن که واقعاً برای فهم داستان برنامه نیاز داری. اینجوری گزارشها مرتب و مفید میمونن.
نتیجهگیری
سیستم Logging درست کلید موفقیت توی برنامهنویسه. با رعایت این ۸ قانون ساده، میتونی گزارشهایی داشته باشی که هم کارآمد باشن و هم بهت کمک کنن داستان برنامهات رو بهتر بفهمی. فقط اطلاعات ضروری رو ثبت کن تا همه چیز مرتب و بهینه بمونه.
منابع
- ویدیوی اصلی
- مستندات NET. برای Logging
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
You are doing logging in .NET wrong. Let’s fix it. - Nick Chapsas - NDC London 2024
This talk was recorded at NDC London in London, England. #ndclondon #ndcconferences #developer #softwaredeveloper
Attend the next NDC conference near you:
https://ndcconferences.com
https://ndclondon.com/
Subscribe to our YouTube channel and learn…
Attend the next NDC conference near you:
https://ndcconferences.com
https://ndclondon.com/
Subscribe to our YouTube channel and learn…
👍5🔥1
آکادمی OpenAI (academy.openai.com) پلتفرم آموزشی جدید OpenAI برای یادگیری هوش مصنوعی، از مبتدی تا پیشرفته است.
مزایا:
* آموزش توسط متخصصان OpenAI
* محتوای متنوع و کاربردی
* ایجاد ارتباط با جامعه متخصصان
* دسترسی به آخرین دستاوردها
به طور خلاصه: آکادمی OpenAI، فرصتی عالی برای ارتقای دانش و مهارتهای هوش مصنوعی است.
https://academy.openai.com
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
مزایا:
* آموزش توسط متخصصان OpenAI
* محتوای متنوع و کاربردی
* ایجاد ارتباط با جامعه متخصصان
* دسترسی به آخرین دستاوردها
به طور خلاصه: آکادمی OpenAI، فرصتی عالی برای ارتقای دانش و مهارتهای هوش مصنوعی است.
https://academy.openai.com
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
OpenAI Academy
Unlock the new opportunities of the AI era by equipping yourself with the knowledge and skills to harness artificial intelligence effectively.
👍3
ترند های گیت هاب اینجاست
https://github.com/trending
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
https://github.com/trending
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.
👍1
مطمئناً! در دنیای پرشتاب امروز، یادگیری یک مهارت ارزشمند که میتواند درآمد شما را به طور چشمگیری افزایش دهد، یک مزیت بزرگ محسوب میشود. مقاله جدیدی در فوربس با عنوان "چگونه یک مهارت 100 هزار دلاری را در 90 روز در سال 2025 یاد بگیریم" منتشر شده است که دقیقاً به همین موضوع میپردازد. این مقاله راهنمایی است برای کسانی که به دنبال تغییر مسیر شغلی یا ارتقای مهارتهای خود در مدت زمان کوتاه هستند و وعده میدهد که میتوان در عرض تنها سه ماه، مهارتی را کسب کرد که ارزش سالانه 100 هزار دلار یا بیشتر را داشته باشد. اگر به دنبال یک تحول سریع و پربازده در زندگی حرفهای خود هستید، این مقاله میتواند نقطه شروع بسیار خوبی برای شما باشد.
Https://www.forbes.com/sites/rachelwells/2025/03/31/how-to-learn-a-100000-skill-within-90-days-in-2025/
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
Https://www.forbes.com/sites/rachelwells/2025/03/31/how-to-learn-a-100000-skill-within-90-days-in-2025/
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
Forbes
How To Learn A $100,000+ Skill Within 90 Days In 2025
How do you learn a high-income skill that pays $100,000 or more within 90 days? Here are three essential steps you should take in 2025.
👍1
Reload responses with other Copilot models on github.com - GitHub Changelog
https://github.blog/changelog/2025-04-08-reload-responses-with-other-copilot-models-on-github-com/
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
https://github.blog/changelog/2025-04-08-reload-responses-with-other-copilot-models-on-github-com/
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
The GitHub Blog
Reload responses with other Copilot models on github.com - GitHub Changelog
The immersive mode of Copilot Chat now gives you more choices when reloading your responses. What’s new? You can now easily regenerate Copilot responses using a different model. Simply click…
جادوی Dictionary در سیشارپ: چرا اینقدر سریعاند؟
1. نوع Dictionary چیست؟
دیکشنری در سیشارپ ساختاری است که دادهها را بهصورت جفتکلید-مقدار ذخیره میکند. برای دسترسی سریع به دادهها، تنها نیاز به کلید داریم که باید منحصربهفرد باشد.
2. راز سرعت: جدول هش
دیکشنری از جدول هش (Hash Table) برای جستجوهای سریع استفاده میکند. در این روش، تابع هش برای تبدیل کلید به کد هش استفاده میشود که مستقیماً به آدرس ذخیرهسازی در حافظه اشاره میکند.
3. فرآیند هش کردن (Hashing)
کلیدها با استفاده از تابع هش به عددی ثابت (کد هش) تبدیل میشوند که به دیکشنری کمک میکند دادهها را سریع پیدا کند. این فرآیند زمان جستجو را به O(1) کاهش میدهد.
4. برخورد هش (Hash Collision)
اگر دو کلید کد هش یکسان تولید کنند، به آن برخورد هش میگویند. برای مدیریت این مشکل، دیکشنری از زنجیرهسازی (Chaining) استفاده میکند تا لیستی از جفتهای برخوردی ایجاد کند.
5. مقایسه با آرایه و لیست
دیکشنری برای دسترسی سریع به دادهها بر اساس کلید استفاده میشود. در حالی که آرایهها و لیستها بیشتر برای دسترسی بر اساس اندیس مناسب هستند.
6. مثال ساده
7. اهمیت GetHashCode()
برای استفاده از Dictionary با انواع سفارشی، باید متد
جمعبندی
نوع Dictionary برای ذخیره و دسترسی سریع به دادهها بر اساس کلید منحصربهفرد مناسب است و با استفاده از جدول هش عملکرد بسیار بالایی دارد. برای جستجوهای سریع و کارآمد، Dictionary بهترین گزینه است.
#سی_شارپ #داتنت #Dictionary #برنامهنویسی
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
1. نوع Dictionary چیست؟
دیکشنری در سیشارپ ساختاری است که دادهها را بهصورت جفتکلید-مقدار ذخیره میکند. برای دسترسی سریع به دادهها، تنها نیاز به کلید داریم که باید منحصربهفرد باشد.
2. راز سرعت: جدول هش
دیکشنری از جدول هش (Hash Table) برای جستجوهای سریع استفاده میکند. در این روش، تابع هش برای تبدیل کلید به کد هش استفاده میشود که مستقیماً به آدرس ذخیرهسازی در حافظه اشاره میکند.
3. فرآیند هش کردن (Hashing)
کلیدها با استفاده از تابع هش به عددی ثابت (کد هش) تبدیل میشوند که به دیکشنری کمک میکند دادهها را سریع پیدا کند. این فرآیند زمان جستجو را به O(1) کاهش میدهد.
4. برخورد هش (Hash Collision)
اگر دو کلید کد هش یکسان تولید کنند، به آن برخورد هش میگویند. برای مدیریت این مشکل، دیکشنری از زنجیرهسازی (Chaining) استفاده میکند تا لیستی از جفتهای برخوردی ایجاد کند.
5. مقایسه با آرایه و لیست
دیکشنری برای دسترسی سریع به دادهها بر اساس کلید استفاده میشود. در حالی که آرایهها و لیستها بیشتر برای دسترسی بر اساس اندیس مناسب هستند.
6. مثال ساده
var employees = new Dictionary<int, string>();
employees.Add(101, "علی");
employees[102] = "محمد";
if (employees.TryGetValue(103, out var name))
Console.WriteLine(name);
else
Console.WriteLine("کارمند یافت نشد");
7. اهمیت GetHashCode()
برای استفاده از Dictionary با انواع سفارشی، باید متد
GetHashCode()
و Equals()
را به درستی پیادهسازی کنید تا عملکرد بهینه باشد.جمعبندی
نوع Dictionary برای ذخیره و دسترسی سریع به دادهها بر اساس کلید منحصربهفرد مناسب است و با استفاده از جدول هش عملکرد بسیار بالایی دارد. برای جستجوهای سریع و کارآمد، Dictionary بهترین گزینه است.
#سی_شارپ #داتنت #Dictionary #برنامهنویسی
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
۱۰ تا کتاب خیلی خوب برای مهندسهای نرمافزار که تو سال ۲۰۲۵ میتونه براشون جذاب باشه. بیا یه نگاه خودمونی و مختصر بهشون بندازیم:
۱. کتاب Clean Code (کد تمیز) - رابرت مارتین (عمو باب)
چی میگه؟ این کتاب حکم راهنمای اصول نوشتن کدی رو داره که خوانا، قابل نگهداری و فهمیدنی باشه. اگه میخوای کدهات رو بقیه هم بفهمن و راحت بشه تغییرش داد، این کتاب واجبه.
۲. کتاب The Pragmatic Programmer (برنامهنویس عملگرا) - دیوید توماس و اندرو هانت
چی میگه؟ پر از نکتههای کاربردی و تجربههای ارزشمنده که کمکت میکنه یه برنامهنویس بهتر، کارآمدتر و حرفهایتر بشی. از مدیریت شغلی گرفته تا ابزارها و تکنیکهای کدنویسی رو پوشش میده.
۳. کتاب Design Patterns: Elements of Reusable Object-Oriented Software (الگوهای طراحی) - گنگ چهار نفره (GoF)
چی میگه؟ این کتاب کلاسیک، الگوهای طراحی رایج و تستشده رو معرفی میکنه که برای حل مشکلات پرتکرار تو طراحی نرمافزارهای شیءگرا استفاده میشن. خوندنش دیدت رو نسبت به معماری نرمافزار باز میکنه.
۴. کتاب Refactoring: Improving the Design of Existing Code (بازآرایی کد) - مارتین فاولر
چی میگه؟ یاد میده چطور کد موجود رو بدون تغییر کارکردش، بهبود بدی. تکنیکهای عملی برای تمیز کردن کد، کاهش پیچیدگی و بهتر کردن طراحی رو توضیح میده.
۵. کتاب Code Complete (کد کامل) - استیو مککانل
چی میگه؟ یه کتاب جامع و حجیم که بهترین روشها و تکنیکهای ساخت نرمافزار با کیفیت بالا رو از جنبههای مختلف (طراحی، کدنویسی، تست، دیباگ) پوشش میده. مثل یه دایرهالمعارف برای برنامهنویسهاست.
۶. کتاب The Mythical Man-Month (نفر-ماه افسانهای) - فردریک بروکس
چی میگه؟ با اینکه قدیمیه، ولی درسهاش در مورد مدیریت پروژههای نرمافزاری، مشکلات تخمین زمان و اضافه کردن نیرو به پروژههای دیرشده، هنوزم کاملاً بهروز و کاربردیه.
۷. کتاب Working Effectively with Legacy Code (کار موثر با کدهای قدیمی) - مایکل فیدرز
چی میگه؟ خیلی وقتها مجبوریم با کدهایی کار کنیم که خودمون ننوشتیم و شاید خیلی هم تمیز نباشن (کدهای لگسی). این کتاب پر از تکنیکهای عملیه که چطور این کدها رو بفهمیم، تست کنیم و با اطمینان تغییر بدیم.
۸. کتاب Cracking the Coding Interview (شکستن مصاحبه کدنویسی) - گیل لاکمن مکداول
چی میگه؟ اگه دنبال کار تو شرکتهای بزرگ تکنولوژی هستی، این کتاب برای آماده شدن برای مصاحبههای فنی (سوالات الگوریتم و ساختمان داده) عالیه. پر از مثال و راه حله.
۹. کتاب Structure and Interpretation of Computer Programs (SICP) (ساختار و تفسیر برنامههای کامپیوتری)
چی میگه؟ یه کتاب عمیق و پایهای در مورد مفاهیم برنامهنویسی و علوم کامپیوتره. شاید کمی چالشبرانگیز باشه ولی دید خیلی خوبی نسبت به انتزاع، بازگشت و اصول محاسبات بهت میده.
۱۰. کتاب Designing Data-Intensive Applications (طراحی برنامههای دادهمحور) - مارتین کلپمن
چی میگه؟ اگه با سیستمهای بزرگ، پایگاهدادهها، و چالشهای مقیاسپذیری و پایداری سر و کار داری، این کتاب رو باید بخونی. خیلی عمیق و کاربردی به معماری سیستمهای داده مدرن میپردازه.
تمام این کتاب ها رو میتونید از سایت رفهاب رایگان دانلود کنید و یا به صورت چاپی خریداری کنین.
https://refhub.ir/fa/expert_pick/15/
میتونید از کد تخفیف ۲۵ درصدی زیر هم برای خریدتون از رفهاب استفاده کنین (برای ۱۰ نفر اول) :
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
۱. کتاب Clean Code (کد تمیز) - رابرت مارتین (عمو باب)
چی میگه؟ این کتاب حکم راهنمای اصول نوشتن کدی رو داره که خوانا، قابل نگهداری و فهمیدنی باشه. اگه میخوای کدهات رو بقیه هم بفهمن و راحت بشه تغییرش داد، این کتاب واجبه.
۲. کتاب The Pragmatic Programmer (برنامهنویس عملگرا) - دیوید توماس و اندرو هانت
چی میگه؟ پر از نکتههای کاربردی و تجربههای ارزشمنده که کمکت میکنه یه برنامهنویس بهتر، کارآمدتر و حرفهایتر بشی. از مدیریت شغلی گرفته تا ابزارها و تکنیکهای کدنویسی رو پوشش میده.
۳. کتاب Design Patterns: Elements of Reusable Object-Oriented Software (الگوهای طراحی) - گنگ چهار نفره (GoF)
چی میگه؟ این کتاب کلاسیک، الگوهای طراحی رایج و تستشده رو معرفی میکنه که برای حل مشکلات پرتکرار تو طراحی نرمافزارهای شیءگرا استفاده میشن. خوندنش دیدت رو نسبت به معماری نرمافزار باز میکنه.
۴. کتاب Refactoring: Improving the Design of Existing Code (بازآرایی کد) - مارتین فاولر
چی میگه؟ یاد میده چطور کد موجود رو بدون تغییر کارکردش، بهبود بدی. تکنیکهای عملی برای تمیز کردن کد، کاهش پیچیدگی و بهتر کردن طراحی رو توضیح میده.
۵. کتاب Code Complete (کد کامل) - استیو مککانل
چی میگه؟ یه کتاب جامع و حجیم که بهترین روشها و تکنیکهای ساخت نرمافزار با کیفیت بالا رو از جنبههای مختلف (طراحی، کدنویسی، تست، دیباگ) پوشش میده. مثل یه دایرهالمعارف برای برنامهنویسهاست.
۶. کتاب The Mythical Man-Month (نفر-ماه افسانهای) - فردریک بروکس
چی میگه؟ با اینکه قدیمیه، ولی درسهاش در مورد مدیریت پروژههای نرمافزاری، مشکلات تخمین زمان و اضافه کردن نیرو به پروژههای دیرشده، هنوزم کاملاً بهروز و کاربردیه.
۷. کتاب Working Effectively with Legacy Code (کار موثر با کدهای قدیمی) - مایکل فیدرز
چی میگه؟ خیلی وقتها مجبوریم با کدهایی کار کنیم که خودمون ننوشتیم و شاید خیلی هم تمیز نباشن (کدهای لگسی). این کتاب پر از تکنیکهای عملیه که چطور این کدها رو بفهمیم، تست کنیم و با اطمینان تغییر بدیم.
۸. کتاب Cracking the Coding Interview (شکستن مصاحبه کدنویسی) - گیل لاکمن مکداول
چی میگه؟ اگه دنبال کار تو شرکتهای بزرگ تکنولوژی هستی، این کتاب برای آماده شدن برای مصاحبههای فنی (سوالات الگوریتم و ساختمان داده) عالیه. پر از مثال و راه حله.
۹. کتاب Structure and Interpretation of Computer Programs (SICP) (ساختار و تفسیر برنامههای کامپیوتری)
چی میگه؟ یه کتاب عمیق و پایهای در مورد مفاهیم برنامهنویسی و علوم کامپیوتره. شاید کمی چالشبرانگیز باشه ولی دید خیلی خوبی نسبت به انتزاع، بازگشت و اصول محاسبات بهت میده.
۱۰. کتاب Designing Data-Intensive Applications (طراحی برنامههای دادهمحور) - مارتین کلپمن
چی میگه؟ اگه با سیستمهای بزرگ، پایگاهدادهها، و چالشهای مقیاسپذیری و پایداری سر و کار داری، این کتاب رو باید بخونی. خیلی عمیق و کاربردی به معماری سیستمهای داده مدرن میپردازه.
تمام این کتاب ها رو میتونید از سایت رفهاب رایگان دانلود کنید و یا به صورت چاپی خریداری کنین.
https://refhub.ir/fa/expert_pick/15/
میتونید از کد تخفیف ۲۵ درصدی زیر هم برای خریدتون از رفهاب استفاده کنین (برای ۱۰ نفر اول) :
Software-Engineer
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥2👍1🎉1
یه نگاهی به این عکس باحال بندازیم که پر از نکتههای کاربردی برای طراحی APIهای خوب و امنه. انگار یه چکلیست جمعوجور و مفیده که بهمون میگه چی خوبه ✅ و چی نه ❌. از اسمگذاری منابع و استفاده از حالت جمع گرفته تا امنیت و فیلتر کردن، کلی چیز میز داره.
اما امروز میخوام روی یه قسمت خاصش زوم کنیم که خیلی هم مهمه: نسخهبندی یا Versioning API.
چرا اصلاً نسخهبندی مهمه؟
فرض کن یه API خفن ساختی و کلی آدم دارن ازش استفاده میکنن (مثلاً اپلیکیشن موبایلشون بهش وصله). حالا میخوای یه تغییر بزرگ بدی یا یه قابلیت جدید اضافه کنی که ممکنه روش کارکرد قبلی رو خراب کنه. اگه همینجوری آپدیتش کنی، یهو میبینی اپلیکیشن کاربرات از کار افتاده و کلی آدم شاکی پشت خط داری!
اینجاست که نسخهبندی (Versioning) مثل یه فرشته نجات ظاهر میشه! بهت اجازه میده تغییرات جدید رو توی یه "نسخه" جدید از API اعمال کنی، در حالی که نسخه قبلی همچنان برای کاربرای قدیمی کار میکنه. اینطوری هم میتونی API رو بهروز نگه داری و هم کاربرای فعلی رو راضی نگه داری. مثل این میمونه که همزمان دو تا جاده داشته باشی؛ یکی جاده قدیم برای ماشینهای قدیمی، یکی هم اتوبان جدید برای اونایی که میخوان سریعتر برن!
عکس چی میگه؟
توی عکس، ردیف چهارم دقیقاً به همین موضوع اشاره کرده:
* ❌
* ✅
این یعنی چی؟ یعنی پیشنهاد میکنه که شماره نسخه (مثل
1. واضحه: همون اول کار مشخصه که داریم با کدوم نسخه از API کار میکنیم.
2. مسیریابی (Routing) راحتتره: برای سرور راحتتره که درخواستها رو بر اساس نسخه به کد مربوطه هدایت کنه.
راههای دیگه برای نسخهبندی هم هست؟
آره! روشی که توی عکس اومده (گذاشتن نسخه توی URL Path) خیلی رایجه، اما تنها راه نیست. چند تا روش متداول دیگه هم داریم:
1. Query Parameter: نسخه رو مثل یه پارامتر عادی توی URL میفرستیم:
این روش URL رو شلوغ نمیکنه ولی شاید یه کم کمتر به چشم بیاد.
2. Custom Request Header: نسخه رو توی هِدِر (Header) درخواست میفرستیم:
این روش URL رو کاملاً تمیز نگه میداره و از نظر معنایی هم شاید درستتر باشه، ولی کار کردن و تست کردنش با مرورگر یه کم سختتره.
کدوم روش بهتره؟
هیچکدوم ذاتاً "بهترین" نیستن. انتخابش بستگی به نیاز پروژه، راحتی تیم و استانداردهایی داره که استفاده میکنید. روش URL Path (همونی که تو عکسه) خیلی محبوبه چون ساده و شفافه.
جمعبندی
نسخهبندی API یه موضوع حیاتی برای مدیریت تغییرات و تکامل APIهاست، بدون اینکه کاربرای فعلی رو اذیت کنیم. این عکس باحال یه روش خوب و رایج (گذاشتن نسخه اول URL) رو پیشنهاد میده. یادت باشه که روشهای دیگهای هم هست و مهمه که از همون اول طراحی API به فکر نسخهبندی باشی.
در کل، این عکس یه منبع عالی پر از نکات کاربردی برای طراحی API هست. حتماً بقیه مواردش رو هم یه نگاه بنداز!
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
اما امروز میخوام روی یه قسمت خاصش زوم کنیم که خیلی هم مهمه: نسخهبندی یا Versioning API.
چرا اصلاً نسخهبندی مهمه؟
فرض کن یه API خفن ساختی و کلی آدم دارن ازش استفاده میکنن (مثلاً اپلیکیشن موبایلشون بهش وصله). حالا میخوای یه تغییر بزرگ بدی یا یه قابلیت جدید اضافه کنی که ممکنه روش کارکرد قبلی رو خراب کنه. اگه همینجوری آپدیتش کنی، یهو میبینی اپلیکیشن کاربرات از کار افتاده و کلی آدم شاکی پشت خط داری!
اینجاست که نسخهبندی (Versioning) مثل یه فرشته نجات ظاهر میشه! بهت اجازه میده تغییرات جدید رو توی یه "نسخه" جدید از API اعمال کنی، در حالی که نسخه قبلی همچنان برای کاربرای قدیمی کار میکنه. اینطوری هم میتونی API رو بهروز نگه داری و هم کاربرای فعلی رو راضی نگه داری. مثل این میمونه که همزمان دو تا جاده داشته باشی؛ یکی جاده قدیم برای ماشینهای قدیمی، یکی هم اتوبان جدید برای اونایی که میخوان سریعتر برن!
عکس چی میگه؟
توی عکس، ردیف چهارم دقیقاً به همین موضوع اشاره کرده:
* ❌
GET /carts/v1/123
(روش نامناسب)* ✅
GET /v1/carts/123
(روش مناسب)این یعنی چی؟ یعنی پیشنهاد میکنه که شماره نسخه (مثل
v1
برای نسخه اول) رو اول آدرس URL بیاریم. این کار چند تا مزیت داره:1. واضحه: همون اول کار مشخصه که داریم با کدوم نسخه از API کار میکنیم.
2. مسیریابی (Routing) راحتتره: برای سرور راحتتره که درخواستها رو بر اساس نسخه به کد مربوطه هدایت کنه.
راههای دیگه برای نسخهبندی هم هست؟
آره! روشی که توی عکس اومده (گذاشتن نسخه توی URL Path) خیلی رایجه، اما تنها راه نیست. چند تا روش متداول دیگه هم داریم:
1. Query Parameter: نسخه رو مثل یه پارامتر عادی توی URL میفرستیم:
GET /carts/123?version=1
این روش URL رو شلوغ نمیکنه ولی شاید یه کم کمتر به چشم بیاد.
2. Custom Request Header: نسخه رو توی هِدِر (Header) درخواست میفرستیم:
Accept: application/vnd.yourapi.v1+json
این روش URL رو کاملاً تمیز نگه میداره و از نظر معنایی هم شاید درستتر باشه، ولی کار کردن و تست کردنش با مرورگر یه کم سختتره.
کدوم روش بهتره؟
هیچکدوم ذاتاً "بهترین" نیستن. انتخابش بستگی به نیاز پروژه، راحتی تیم و استانداردهایی داره که استفاده میکنید. روش URL Path (همونی که تو عکسه) خیلی محبوبه چون ساده و شفافه.
جمعبندی
نسخهبندی API یه موضوع حیاتی برای مدیریت تغییرات و تکامل APIهاست، بدون اینکه کاربرای فعلی رو اذیت کنیم. این عکس باحال یه روش خوب و رایج (گذاشتن نسخه اول URL) رو پیشنهاد میده. یادت باشه که روشهای دیگهای هم هست و مهمه که از همون اول طراحی API به فکر نسخهبندی باشی.
در کل، این عکس یه منبع عالی پر از نکات کاربردی برای طراحی API هست. حتماً بقیه مواردش رو هم یه نگاه بنداز!
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Forwarded from Software Philosophy
پشتیبانی از عملگر LeftJoin در NET 10.
در نسخه جدید NET 10.، پشتیبانی بومی از عملگر
قبل از NET 10.:
در نسخههای قبلی EF Core، برای استفاده از عملیات
مثال کد قبل از NET 10.:
پس از اضافه شدن LeftJoin در NET 10.:
با معرفی متد
مثال کد پس از NET 10.:
مزایای استفاده از LeftJoin در NET 10.:
- سادگی و خوانایی بیشتر: به جای استفاده از ترکیب پیچیدهی متدها، میتوانید با یک متد ساده به راحتی
- عملکرد بهتر: به دلیل بهینهسازیهای داخلی در EF Core، عملیات
- کاهش پیچیدگی کد: به جای کدهای طولانی و پیچیده، میتوانید کدهای سادهتری بنویسید که فهم آنها برای سایر برنامهنویسان راحتتر است.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
________
در نسخه جدید NET 10.، پشتیبانی بومی از عملگر
LeftJoin
در LINQ به این فریمورک اضافه شده است. این تغییر مهم در زمان نوشتن کوئریها در Entity Framework Core (EF Core) به شما کمک میکند تا کد سادهتری بنویسید و از پیچیدگیهای قبلی که نیازمند استفاده از ترکیب چندین متد مانند SelectMany
و GroupJoin
بود، رهایی یابید.قبل از NET 10.:
در نسخههای قبلی EF Core، برای استفاده از عملیات
LeftJoin
نیاز به ترکیب چندین متد پیچیده بود. در این روش، ابتدا با استفاده از GroupJoin
دادهها را به هم پیوند میدادیم، سپس از SelectMany
و DefaultIfEmpty
برای شبیهسازی رفتار LeftJoin
استفاده میکردیم.مثال کد قبل از NET 10.:
var query = students
.GroupJoin(
departments,
student => student.DepartmentID,
department => department.ID,
(student, departmentList) => new { student, subgroup = departmentList })
.SelectMany(
joinedSet => joinedSet.subgroup.DefaultIfEmpty(),
(student, department) => new
{
student.student.FirstName,
student.student.LastName,
Department = department.Name ?? "[NONE]"
});
پس از اضافه شدن LeftJoin در NET 10.:
با معرفی متد
LeftJoin
در NET 10.، نوشتن کوئریها بسیار سادهتر و خواناتر شده است. دیگر نیازی به استفاده از ترکیب چندین متد نخواهید داشت، بلکه میتوانید به راحتی از این متد جدید استفاده کنید.مثال کد پس از NET 10.:
var query = context.Students
.LeftJoin(
context.Departments,
student => student.DepartmentID,
department => department.ID,
(student, department) => new
{
student.FirstName,
student.LastName,
Department = department.Name ?? "[NONE]"
});
مزایای استفاده از LeftJoin در NET 10.:
- سادگی و خوانایی بیشتر: به جای استفاده از ترکیب پیچیدهی متدها، میتوانید با یک متد ساده به راحتی
LeftJoin
را انجام دهید.- عملکرد بهتر: به دلیل بهینهسازیهای داخلی در EF Core، عملیات
LeftJoin
به شکل بهینهتری در پایگاه داده اجرا میشود.- کاهش پیچیدگی کد: به جای کدهای طولانی و پیچیده، میتوانید کدهای سادهتری بنویسید که فهم آنها برای سایر برنامهنویسان راحتتر است.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
________
GitHub
core/release-notes/10.0/preview/preview1/efcore.md at main · dotnet/core
.NET news, announcements, release notes, and more! - dotnet/core
👍8🔥1