Persian notes on software engineering, architecture, system design, and software development patterns for clearer and deeper understanding.
این ریپو مجموعهای از یادداشتها و آموختههای مرتبط با مهندسی نرمافزار است؛ از مفاهیم پایه و الگوهای طراحی گرفته تا معماری نرمافزار، طراحی سیستم، مدلسازی دامنه، تست، سیستمهای توزیعشده و تجربههای کاربردی در پروژههای واقعی.
هدف این ریپو فقط جمعآوری چند تعریف تئوری نیست. هدف این است که مفاهیم مهم مهندسی نرمافزار با بیان ساده، دقیق و قابل استفاده در دنیای واقعی توضیح داده شوند.
بخش زیادی از مفاهیم مهندسی نرمافزار با منابع انگلیسی یاد گرفته میشوند، اما گاهی درک عمیق آنها به زبان مادری راحتتر اتفاق میافتد.
به همین دلیل محتوای این ریپو به فارسی منتشر میشود تا مفاهیم پیچیدهتر، روشنتر و قابل فهمتر منتقل شوند. در کنار اصطلاحات فارسی، معمولاً عبارت انگلیسی اصلی هم آورده میشود تا ارتباط با منابع اصلی حفظ شود.
این یادداشتها بیشتر برای افرادی مناسب است که با برنامهنویسی و توسعه نرمافزار آشنا هستند و میخواهند درک عمیقتری از طراحی، معماری و تصمیمهای مهندسی پیدا کنند.
مخاطب اصلی این ریپو:
- توسعهدهندگان سطح متوسط
- توسعهدهندگان ارشد
- معماران نرمافزار
- علاقهمندان به طراحی سیستم
- افرادی که درگیر تحلیل، طراحی و پیادهسازی سیستمهای واقعی هستند
- کسانی که میخواهند مفاهیم نرمافزاری را فراتر از syntax و framework دنبال کنند
در هر مبحث تلاش میشود فقط به تعریف بسنده نشود. هر فصل تا حد امکان به این سؤالها پاسخ میدهد:
- مسئله اصلی چیست؟
- این مفهوم چرا به وجود آمده؟
- چه زمانی استفاده از آن منطقی است؟
- چه زمانی استفاده از آن باعث پیچیدگی بیدلیل میشود؟
- در پروژه واقعی چه شکلی پیدا میکند؟
- چه اشتباهات رایجی در استفاده از آن وجود دارد؟
- ارتباط آن با سایر مفاهیم مهندسی نرمافزار چیست؟
در متن اصلی فصلها، نمونهها تا حد امکان بهصورت pseudo-code نوشته میشوند تا تمرکز روی مفهوم بماند، نه روی syntax یک زبان یا framework خاص.
اگر جایی نیاز به نمونهکد واقعی باشد، آن نمونهها بهصورت تکمیلی و جداگانه قرار میگیرند؛ اما مسیر اصلی محتوا مستقل از زبان برنامهنویسی خاص باقی میماند.
برای پیدا کردن سریعتر مسیر مطالعه، میتوانید از بخشهای زیر شروع کنید.
| موضوع | توضیح | وضعیت |
|---|---|---|
| Domain-Driven Design | مدلسازی دامنه، زبان مشترک، مرزبندی سیستم و الگوهای پیادهسازی DDD | در حال تدوین |
| Software Architecture | معماری نرمافزار، ساختاردهی سیستم، لایهبندی و مرزبندی مسئولیتها | بهزودی |
| System Design | طراحی سیستمهای مقیاسپذیر، قابل نگهداری و قابل توسعه | بهزودی |
| Design Patterns | الگوهای رایج طراحی نرمافزار و کاربرد درست آنها | بهزودی |
| Clean Architecture | جداسازی وابستگیها، لایهها و قوانین اصلی معماری تمیز | بهزودی |
| Testing Strategies | استراتژیهای تست، تست واحد، تست یکپارچگی و تست end-to-end | بهزودی |
| Distributed Systems | مفاهیم سیستمهای توزیعشده، ارتباط سرویسها و چالشهای عملیاتی | بهزودی |
| Event-Driven Architecture | طراحی سیستمهای مبتنی بر رویداد، پیامرسانی و هماهنگی بین سرویسها | بهزودی |
| Microservices | طراحی، مرزبندی و چالشهای معماری میکروسرویس | بهزودی |
| Modular Monolith | ساختاردهی سیستمهای ماژولار بدون پیچیدگیهای غیرضروری میکروسرویس | بهزودی |
| Vertical Slice Architecture | طراحی قابلیتها بهصورت عمودی و مستقل از لایهبندی سنتی | بهزودی |
اولین مسیر محتوایی این ریپو با Domain-Driven Design یا DDD شروع میشود.
DDD نقطه شروع خوبی برای ورود به مباحث عمیقتر مهندسی نرمافزار است، چون قبل از صحبت درباره کد، دیتابیس، فریمورک و معماری، روی فهم مسئله، زبان مشترک، مدلسازی دامنه و مرزبندی سیستم تمرکز میکند.
در بخش DDD به مرور درباره موضوعاتی مثل موارد زیر نوشته میشود:
- Domain و Subdomain
- Core Domain
- Generic Subdomain
- Supporting Subdomain
- Ubiquitous Language
- Bounded Context
- Context Map
- Transaction Script
- Active Record
- Entity
- Value Object
- Aggregate
- Domain Service
- Domain Event
- Event Sourcing
- Event Storming
- Domain Storytelling
- ارتباط DDD با معماری نرمافزار، Microservice و Event-Driven Architecture
اگر تازه میخواهید وارد مباحث عمیقتر مهندسی نرمافزار شوید، مسیر پیشنهادی فعلی این است:
- شروع با Domain-Driven Design
- آشنایی با Domain و Subdomain
- آشنایی با Ubiquitous Language
- آشنایی با Bounded Context
- بررسی Context Map
- ورود به الگوهای ساده پیادهسازی مثل Transaction Script و Active Record
- آشنایی با الگوهای پیادهسازی دامنه مثل Entity، Value Object، Aggregate و Domain Event
- حرکت به سمت معماری نرمافزار، سیستمهای توزیعشده و الگوهای ارتباطی
به مرور، موضوعات دیگری هم به این ریپو اضافه میشوند؛ از جمله:
- Software Architecture
- System Design
- Design Patterns
- Clean Architecture
- Testing Strategies
- Distributed Systems
- Event-Driven Architecture
- Refactoring
- Code Quality
- Engineering Practices
- Vertical Slice Architecture
- Modular Monolith
- Microservices
این ریپو بهمرور تکمیل میشود. بعضی فصلها ممکن است در ابتدا کوتاه باشند و بعداً با مثال، دیاگرام، توضیح تکمیلی یا تجربههای واقعی بهروزرسانی شوند.
اگر پیشنهادی برای اصلاح، تکمیل یا شفافتر شدن مطالب وجود داشته باشد، میتوان از طریق Issue یا Pull Request آن را مطرح کرد.
محتوای آموزشی این ریپو تحت مجوز Creative Commons Attribution 4.0 International (CC BY 4.0) منتشر میشود.
استفاده، بازنشر، ترجمه، تغییر و اقتباس از مطالب این ریپو آزاد است؛ به شرطی که به منبع اصلی ارجاع داده شود و لینک این ریپو حفظ شود.
شبهکدها، نمونهکدها و مثالهای فنی موجود در این ریپو، مگر اینکه خلاف آن ذکر شده باشد، میتوانند آزادانه برای یادگیری و استفاده عملی مورد استفاده قرار بگیرند.