در معماری نرمافزار، کیفیت و کارایی سیستمها تا حد زیادی به ویژگیهای کیفی آنها وابسته است. ویژگیهای کیفی مانند عملکرد، امنیت، پایداری و قابلیت نگهداری نقش مهمی در موفقیت یک نرمافزار ایفا میکنند. در اینجا به بررسی و طبقهبندی این ویژگیها، تاثیر متقابل آنها و نحوه بهینهسازی آنها در قالب استراتژیهای trade-off میپردازیم.
معماری نرمافزار فرایندی پیچیده است که هدف آن ایجاد ساختاری است که علاوه بر پوشش نیازهای عملکردی، ویژگیهای کیفی مورد نظر را نیز برآورده کند.
طبقهبندی ویژگیهای کیفی
ویژگیهای کیفی یا Quality Attributes بر اساس عملکرد و اهداف مورد نظر به سه دسته اصلی تقسیم میشوند:
ویژگیهای عملکردی که عمدتاً در زمان اجرا نمود پیدا میکنند.
ویژگیهای ساختاری که در طراحی نرمافزار نقش دارند.
ویژگیهایی که بخشهای مختلف سیستم را تحت تاثیر قرار میدهند.
ویژگیهای عملیاتی (Operational)
این دسته شامل ویژگیهایی است که مستقیماً بر رفتار سیستم در زمان اجرا تاثیر میگذارند، مانند عملکرد (performance)، در دسترس بودن (availability)، پایداری (resiliency) و قابلیت اطمینان (reliability). این ویژگیها به طور گستردهای توسط اندازهگیریهای دقیق ارزیابی میشوند و برای بهبود عملکرد در محیطهای عملیاتی مورد استفاده قرار میگیرند.
ویژگیهای ساختاری (Structural)
ویژگیهای ساختاری به مواردی مانند قابلیت نگهداری (maintainability)، قابلیت تکامل (evolvability) و قابلیت تست (testability) اشاره دارند که بر طراحی و توسعه بلندمدت سیستم اثر میگذارند. بهینهسازی این ویژگیها، توسعه و بهبود نرمافزار در طول زمان را سادهتر میکند.
ویژگیهای Cross-Cutting
این ویژگیها به عنوان ویژگیهای کیفی سیستم شناخته میشوند که بخشهای مختلف را تحت تاثیر قرار میدهند. برای مثال امنیت (security) و یادگیریپذیری (learnability). این ویژگیها اغلب در سراسر سیستم منتشر شده و چالشهای خاصی برای تیمهای معماری و توسعه به همراه دارند.
ویژگیهای کیفی صریح و ضمنی (Explicit and Implicit)
ویژگیهای کیفی در زمینههای مختلف ممکن است صریح (explicit) یا ضمنی (implicit) باشند. برای مثال، امنیت در یک وبسایت معمولی ممکن است به عنوان یک ویژگی ضمنی در نظر گرفته شود، اما در سیستمهای حساس و حیاتی مانند سیستمهای بانکی، امنیت به طور صریح مورد توجه قرار گرفته و به عنوان یک ضرورت طراحی تلقی میشود.
استراتژیهای trade-off در ویژگیهای کیفی
کیفیتهای مختلف میتوانند اثرات مثبت یا منفی بر یکدیگر داشته باشند و نیاز به بهینهسازی trade-off میان آنها را ایجاد کنند. به عنوان مثال، افزایش امنیت ممکن است موجب کاهش عملکرد شود و بالعکس. هدف معماری نرمافزار، دستیابی به کمهزینهترین ترکیب trade-off برای به حداکثر رساندن کیفیتها است.
بررسی ویژگی دسترسپذیری (Availability)
دسترسپذیری یکی از ویژگیهای عملیاتی کلیدی است که بر مبنای وقوع خطاها (faults) و شکستها (failures) تعیین میشود. در این بخش به بررسی روشهای جلوگیری از بروز خطا، شناسایی خطا و بهبود دسترسپذیری میپردازیم:
جلوگیری از وقوع خطاها
مدیریت خطا و تحمل آن با استفاده از روشهایی مانند Idempotency
حذف عامل خطا از مدار. برای مثال خارج کردن server دارای اختلال
پیشبینی خطاها. برای مثال پیشبینی زیر بار رفتن سیستم
در مورد fault، اولین و مهمترین مسئله، شناسایی آنها است. منظور از شناسایی این است که بدانیم چه نوع faultهایی ممکن است در سیستم رخ دهند و چگونه میتوانیم برای آنها آماده باشیم. بهعنوان مثال، خرابی دیتابیس یا قطع شدن شبکه از جمله faultهای محتمل هستند.
در ادامه، ارزیابی ریسک و تواتر رخداد این خطاها مطرح میشود که برای درک عمق و احتمال تاثیرات آنها ضروری است.
به طور کلی faultها به سه دسته کلی تقسیم میشوند:
خطاهای جزئی که ممکن است کاربران را دچار ناراحتی کنند، اما باعث از کار افتادن سیستم نمیشوند.
خطاهای جدی که میتوانند در عملکرد سیستم اختلال ایجاد کنند.
خطاهایی که در صورت تبدیل به failure، ممکن است سیستم را به طور کامل از کار بیندازند.
این طبقهبندی به معماران سیستم کمک میکند تا با توجه به سطح اهمیت، برای هر نوع fault راهکارهای مناسبی جهت شناسایی و مدیریت آنها تدوین کنند.
سناریوهای مختلف در دسترسپذیری (Availability General Scenarios)
برای سنجش دسترسپذیری، لازم است عوامل موثر بر سیستم و شرایط مختلف را مورد بررسی قرار دهیم:
تکنیکهای شناسایی و بازیابی از خطا
سیستمها باید قادر به شناسایی خطاهای پیش آمده و بازیابی از آنها باشند. تکنیکهایی مانند Heartbeat، Monitoring و Ping برای شناسایی خطا و تکنیکهای Resiliency برای بازیابی سیستم از شکست استفاده میشوند.
نتیجهگیری
در معماری نرمافزار، ویژگیهای کیفی نقش بسیار مهمی در موفقیت سیستمها ایفا میکنند. طراحی و پیادهسازی این ویژگیها نیازمند شناخت و درک کامل trade-offهای بین آنها است.