دسته بندی ویژگیهای معماری نرم افزار
ویژگیهای معماری (مثل scalability یا modularity) خیلی متنوعن؛ از چیزای سادهی کدنویسی تا مسائل سنگینِ عملیاتی.
هیچ لیست استاندارد جهانی براشون وجود نداره(هرچند تلاش کردن) ولی هر سازمان برداشت خودش رو داره.
ضمن اینکه دنیای نرمافزار مدام مفاهیم و اصطلاحات جدید معرفی میکنه و همین باعث میشه ویژگیهای معماری تازهای هم هی اضافه بشن.
ویژگیهای معماری فرآیند (Process architectural characteristics)
ویژگیهای معماری فرآیند، جایی هستن که فرآیند توسعهی نرمافزار با معماری نرمافزار تلاقی پیدا میکنه. این ویژگیها بازتاب تصمیماتی هستن که دربارهی نحوهی ساخت نرمافزار گرفته میشن — یعنی «مکانیک» توسعهی نرمافزار.
بهعبارتی، این ویژگیها بیشتر به چگونگی ساخت نرمافزار مربوط میشن تا چیستی اون.
ماژولار بودن (Modularity)
میزان تقسیمپذیری نرمافزار به اجزای مستقل. روی نحوهی سازماندهی رفتارها و بلوکهای منطقی توسط معمار نرمافزار تأثیر میذاره.
قابلیت تست (Testability)
اینکه چقدر راحت میشه سیستم رو تست کرد — شامل تست واحد(Unit Test)، تست عملکردی(Functional Test)، پذیرش کاربر(User Acceptance Testing)، و تستهای اکتشافی (Exploratory Testing). منظور از تستپذیری، تستهایی هستن که در زمان توسعه انجام میشن، نه تستهای رسمی تضمین کیفیت (Quality Assurance).
چابکی (Agility)
یه ویژگی ترکیبیه که شامل testability، deployability، modularity و کلی ویژگی دیگهست که توسعهی چابک رو ممکن میکنن. در ادامه بیشتر دربارهش صحبت میشه.
قابلیت استقرار (Deployability)
اینکه چقدر راحت و مؤثر میشه نرمافزار رو مستقر کرد. یکی از اجزای مهم چابکیه.
قابلیت توسعه (Extensibility)
میزان راحتی توسعهدهندهها در گسترش سیستم. شامل ساختار معماری، طراحی داخلی، شیوههای مهندسی، و سیاستهای حاکمیتی میشه.
قابلیت جداسازی اجزا (Decouple-ability)
میزان استقلال اجزای سیستم از هم. برخی معماریها روشهایی خاص برای جداسازی اجزا ارائه میدن تا مزایای خاصی حاصل بشه (مثل انعطافپذیری یا تستپذیری بهتر).
ویژگیهای معماری ساختاری (Structural Architectural Characteristics)
ویژگیهای معماری ساختاری، روی ساختار داخلی سیستم نرمافزاری تأثیر میذارن. این ویژگیها شامل عواملی مثل میزان اتصال (coupling) بین اجزا و نوع روابط بین نقاط مختلف یکپارچهسازی (integration points) هستن.
بهعبارتی، این ویژگیها تعیین میکنن اجزای سیستم چطور به هم وصل میشن، چقدر مستقل یا وابستهان، و چطور با سیستمهای دیگه تعامل دارن.
امنیت (Security)
میزان امنیت کلی سیستم. مثلاً:
- آیا دادهها باید در پایگاه داده رمزنگاری بشن؟
- ارتباطات شبکهای بین سیستمهای داخلی چطور؟
- چه نوع احراز هویتی برای دسترسی کاربران راه دور لازمه؟
امنیت همیشه در معماری حضور داره — چه بهصورت آشکار، چه ضمنی.
قابلیت نگهداری (Maintainability)
اینکه چقدر راحت میشه تغییراتی برای بهبود سیستم یا رفع باگها اعمال کرد. هم برای توسعهدهندهها مهمه، هم برای معمارها.
قابلیت انتقالپذیری (Portability)
میزان راحتی اجرای سیستم روی پلتفرمهای مختلف (مثل ویندوز و macOS). این ویژگی میتونه به رابط کاربری، پلتفرم اجرایی، یا هر بخش دیگهای از سیستم مربوط باشه.
قابلیت توسعه (Extensibility)
اینکه توسعهدهندهها چقدر راحت میتونن سیستم رو گسترش بدن. شامل ساختار معماری، طراحی داخلی، شیوههای مهندسی، و سیاستهای حاکمیتی میشه. این ویژگی از اون مواردیه که تو دسته بندی های مختلف دیده میشه.
بومیسازی (Localization)
میزان پشتیبانی سیستم از زبانهای مختلف، واحدهای اندازهگیری، ارزها، و سایر عوامل بینالمللی.
ویژگیهای معماری عملیاتی (Operational Architectural Characteristics)
ویژگیهای معماری عملیاتی نشون میدن که تصمیمات معماری چه تأثیری روی تواناییهای تیم عملیات دارن. یعنی این ویژگیها تعیین میکنن تیمهای عملیاتی (مثل DevOps، پشتیبانی، یا مدیریت زیرساخت) چطور میتونن سیستم رو اجرا، نظارت، نگهداری یا مقیاسگذاری کنن.
دسترسپذیری (Availability)
سیستم باید چه درصدی از زمان در دسترس باشه؟
اگه قراره ۲۴ ساعته و ۷ روز هفته کار کنه، بعد از یک خرابی چقدر سریع میتونید دوباره بالا بیاریدش؟
این عدد معمولاً با تعداد «۹»ها نشون داده میشه (مثلاً ۹۹.۹۹۹%).
برای نمونه، آپتایم با ۵ تا ۹ یعنی کمتر از ۵ دقیقه قطعی در کل سال.
قابلیت بازیابی (Recoverability)
وقتی اتفاق بدی افتاد، سیستم با چه سرعتی میتونه دوباره آنلاین بشه و کار رو ادامه بده؟
این موضوع روی استراتژی بکاپگیری و نیاز به سختافزار پشتیبان تاثیر مستقیم داره.
جالبه بدونید این یه مثال خوبه از این قاعده که هر صفتی رو میشه با «-ility» تبدیل به یه ویژگی معماری کرد!
مقاومت (Robustness)
توانایی سیستم برای هندل کردن خطاها و شرایط بحرانی حین اجرا.
مثلاً اگه برق بره، اینترنت قطع بشه یا سختافزار خراب بشه، سیستم باید یا پایدار بمونه یا حداقل به شکل کنترلشده از کار بیفته.
کارایی (Performance)
این که سیستم با منابعی که داره، چقدر خوب میتونه نیازهای زمانی رو برآورده کنه.
کارایی فقط سرعت نیست؛ ابعاد مختلفی داره که بعداً میبینیم.
قابلیت اطمینان / ایمنی (Reliability / Safety)
آیا سیستم باید Fail-Safe باشه یا به قدری حیاتی که خرابیش به زندگی آدمها یا هزینههای سنگین مربوط بشه؟
مثلاً اگه از کار بیفته، آیا جون کسی در خطر میفته یا شرکت ضرر بزرگی میکنه؟
این ویژگی توی سیستمهای پزشکی، نرمافزارهای بیمارستانی و سیستمهای هواپیمایی خیلی رایجه.
وقتی این ویژگیها مهم باشن، دیگه شوخیبردار نیست.
مقیاسپذیری (Scalability)
سیستم وقتی تعداد کاربران یا درخواستها زیاد میشه، همچنان چطور کار میکنه؟
برخی از «-ility»ها راحتتر بهدست میآن، ولی این یکی معمولاً سخته و نیاز به طراحی حسابشده داره.
ویژگیهای معماری فراگیر (Cross-cutting Architectural Characteristics)
هرچقدر هم بخوایم همهچی رو قشنگ و منظم دستهبندی کنیم، باز هم یه سری ویژگی هستن که تو هیچ دسته جا نمیشن، اینها همون ویژگیهایی هستن که مرزها رو رد میکنن و روی کل سیستم اثر میذارن.
امنیت (Security)
میزان ایمن بودن سیستم به شکل کلی.
آیا دادهها توی دیتابیس باید رمزنگاری بشن؟
ارتباطات بین سیستمهای داخلی چی؟
برای دسترسی کاربر از راه دور چه نوع احراز هویتی لازمه؟
امنیت همیشه پای ثابت ماجراست و یکی از Cross-Cutting Concernهاست، یعنی روی همه جای سیستم تاثیر میذاره.
احراز هویت / مجوزدهی (Authentication / Authorization)
اطمینان از این که کاربر واقعاً همون کسیه که میگه هست (Authentication) و این که فقط به بخشها یا قابلیتهایی که مجاز هست دسترسی داره (Authorization).
این محدودیتها میتونن توی سطحهای مختلف اعمال بشن: سناریو، بخش سیستم، صفحه وب، قانون تجاری یا حتی فیلدهای داده.
هر دو، زیرمجموعه امنیت هستن.
حریم خصوصی (Privacy)
توانایی سیستم برای پنهان کردن و رمزنگاری تراکنشها به شکلی که حتی کارمندهای داخلی مثل اپراتورهای داده، معمارها یا توسعهدهندهها نتونن اونها رو ببینن.
خیلی از کشورها قوانین سختگیرانهای برای حریم خصوصی دارن، و این باعث میشه برای سیستمهای بینالمللی هماهنگی سختتر بشه.
دسترسپذیری برای همه کاربران (Accessibility)
این که همه بتونن از سیستم استفاده کنن، حتی کسانی که معلولیتهایی مثل کوررنگی یا کمشنوایی دارن.
توی خیلی از کشورها، سازمانهای دولتی یه حداقل سطح دسترسپذیری رو اجباری میکنن.
کاربردپذیری (Usability)
این که کاربرها چقدر راحت میتونن با سیستم به هدفشون برسن.
آیا استفاده ازش نیاز به آموزش خاصی داره؟
کاربردپذیری باید مثل بقیه ویژگیهای معماری جدی گرفته بشه.
این ویژگی یه مثال خوب از ابهامه، چون «Usability» بعضی وقتها به طراحی تجربه کاربری (UX) هم گفته میشه.
