کیفیت نرم‌افزار
در مبحث مهندسی نرم‌افزار، **کیفیت نرم‌افزار** به دو رده مرتبط اما مجزای زیر اشاره دارد:

* **کیفیت عملیاتی نرم‌افزار** (Software Functional Quality): شاخصی جهت نشان دادن میزان تطابق نرم‌افزار با نیازمندی‌های عملیاتی تعریف شده برای نرم‌افزار.
* **کیفیت ساختاری نرم‌افزار** (Software Structural Quality): که منعکس کننده میزان دست یابی به نیازمندی‌های غیر عملیاتی مانند استحکام (Robustness) و قابلیت نگهداری (Maintainability) نرم‌افزار است.

بسیاری از جنبه‌های کیفیت ساختاری نرم‌افزار تنها با تحلیل و بررسی ساختار درونی و کد آن در سطح واحد، سطح تکنولوژی و سطح سیستم بررسی می‌شود. اما برخی خصوصیات ساختاری مثل قابلیت استفاده بودن فقط به صورت پویا قابل ارزیابی می‌باشند .(ارزیابی کاربران و افرادی که با نرم‌افزار سر و کار دارند حتی اگر با یک نسخهٔ پروتوتایپ روبرو باشند) جنبه‌های دیگر مثل قابلیت اطمینان ممکن است علاوه بر نرم‌افزار، سخت‌افزار را نیز در یر بگیرد. پس می‌توان آن را به صورت ایستا و پویا ارزیابی کرد.

کیفیت عملیاتی نرم‌افزار معمولاً به صورت پویا بررسی می‌شود اما می‌توان بررسی‌های ایستا هم برای آن در نظر گرفت.

به لحاظ تاریخی ساختار، دسته‌بندی و مطالعهٔ ویژگی‌ها و معیارهای مورد استفاده در مدیریت کیفیت نرم‌افزار از مدل‌های ISO 9126-3 و ISO 2500:2005 سرچشمه می‌گیرد. بر اساس این مدل‌ها کنسرسیوم کیفیت نرم‌افزارهای آی تی پنج خصوصیت اصلی برای یک محصول نرم‌افزاری دارای ارزش بازاری را معرفی کرد: قابلیت اطمینان، کارایی، امنیت، قابلیت نگه داری و اندازه کافی

اندازه‌گیری کیفیت نرم‌افزار در اصل بررسی میزان تطابق نرم‌افزار با این پنج ویژگی است. اندازه‌گیری کیفیت نرم‌افزار در اصل یک نمرهٔ کیفی یا کمی یا ترکیبی از هر دو و سپس یک سیتم وزن‌گیری که اولویت‌ها را مشخص می‌کند می‌باشد. این روش با تجزیه و تحلیل خطاهای برنامه‌نویسی که منجر به فاجعه می‌شود خاتمه می‌یابد. این خطاها در سطح سیستم تا ۹۰ درصد از مشکلات پروژه را نشان می‌دهند. در حالی که در سطح واحد ۱۰ درصد از مشکلات تولید را شامل می‌شود. در نتیجه کیفیت کد بدون بدون چهارچوب کل سیستم دارای ارزش محدود است.

برای دیدن، بررسی، آنالیز و ارتباطات اندازه‌گیری کیفیت نرم‌افزار، مفاهیم و تکنیک‌های تجسم کردن اطلاعات، بسیار مفید است به‌خصوص وقتی که چندین فاکتور مختلف با یکدیگر مرتبط باشند. به عنوان مثال نقشهٔ نرم‌افزار اطلاعات مربوط به توسعه نرم‌افزار، کیفیت نرم‌افزار و دینامیک سیستم را مورد بررسی قرار می‌دهد.

انگیزه
------

اندازه‌گیری کیفیت نرم‌افزار حداقل با دو هدف اساسی صورت می‌گیرد. مدیریت ریسک و مدیریت هزینه

مدیریت ریسک: خرابی نرم‌افزار مشکلاتی بیش از ناراحتی و نگرانی ایجاد کرده‌است. مشکلات نرم‌افزار فجایای انسانی ایجاد کرده‌است. این مشکلات می‌تواند از طراحی رابط کاربری ضعیف تا حطاهای اساسی نرم‌افزار در کد نویسی متغیر باشد. مثال‌هایی از از مشکلات نرم‌افزاری که به مرگ منجر شده‌اند در مقاله دکتر لوسون موجود است. این مثال‌ها شامل نرم‌افزارهایی که در دستگاه‌های پزشکی و دیگر دستگاه‌های حساس وجود دارند، می‌باشد ."[مهندسانی که نرم‌افزارهای جاسازی شده را می‌نویسند] برنامه‌های جاوارا می‌بینند که یک سوم ثانیه برای انجام جمع آوری زباله و به روزرسانی رابط کاربری، زمان صرف می‌کنند و آنها هواپیماهای در حال سقوط از آسمان را پیش بینی می‌کنند. ". در ایالات متحده، اداره حمل و نقل هوایی فدرال (FAA)، با ارائهٔ سرویس صدور گواهینامه هواپیما FAA، برنامه‌های نرم‌افزاری، قوانین، راهنمایی و آموزش‌هایی ارائه می‌دهد، که تأثیر آن بر روی محصولات هواپیمایی است.

مدیریت هزینه: همانند زمینه‌های دیگر مهندسی، برنامه ای با کیفیت ساختاری مناسب هزینهٔ نگه داری، یادگیری و تغییر بسیار کمتری دارد. آمار نشان می‌دهد که کیفیت ساختاری ضعیف در برنامه‌های تجاری (مانند برنامه‌ریزی منابع سازمانی (ERP)، مدیریت ارتباط با مشتری (CRM) یا سیستم‌های مالی با پردازش‌های بزرگ) باعث افزایش هزینه‌ها می‌شود و از طرفی باعث ایجاد دوباره کاری (حتی تا ۴۵ درصد از زمان توسعه در برخی سازمانها) می‌شود. علاوه بر این، کیفیت ساختاری ضعیف به دلیل ارائهٔ داده‌های غلط، توقف برنامه‌ها و مشکلات امنیتی و پردازشی باعص ایجاد اختلال در عملکرد سازمان‌ها می‌شود.

با این حال، بین اندازه‌گیری و بهبود کیفیت نرم‌افزار در یک سیستم جاسازی شده (با تأکید بر مدیریت ریسک) و کیفیت نرم‌افزار در نرم‌افزارهای تجاری (با تأکید بر هزینه و مدیریت پایداری) تفاوت وجود دارد. سیستم‌های جاسازی شده در حال حاضر اغلب شامل یک رابط کاربری هستند و طراحان آنها به همان اندازه که همتایان خودروی برنامه‌های تجاری متمرکز هستند، نگران قابلیت استفاده و بهره‌وری کاربر هستند. گروه دوم به دنبال سیستم ERP یا CRM به عنوان یک سیستم عصبی شرکتی هستند که زمان و عملکرد آن برای رفاه شرکت مهم است. این همگرایی بیشتر در پردازش‌های موبایل قابل مشاهده است: کاربری که به یک برنامه ERP در تلفن هوشمند خود دسترسی پیدا می‌کند، از بین لایه‌های نرم‌افزار به کیفیت بستگی دارد.

در حال حاضر هر دو نوع نرم‌افزار از معماری چند لایه ای و پیشرفته استفاده می‌کنند، بنابراین تجزیه و تحلیل و اندازه‌گیری کیفیت نرم‌افزار باید به صورت جامع و مداوم مدیریت شود، و از هدف نهایی یا استفاده نهایی نرم‌افزار جدا شوند.

تعاریف
------

تعاریف مختلف زیادی از کیفیت وجود دارد. در برخی تعاریف، کیفیت "توانایی یک محصول نرم‌افزاری برای مطابقت با الزامات "است. (طبق ISO / IEC 9001) در حالی که برای دیگران می‌تواند مترادف با "ارزش مندی برای مشتری" (Highsmith، ۲۰۰۲) باشد.

اولین تعریفی از کیفیت که تاریخ به یاد می‌آورد از شوهارت در آغاز قرن بیستم است: *دو جنبه متداول از کیفیت وجود دارد: یکی به عنوان یک واقعیت عینی مستقل از وجود انسان است.* *دیگری با آنچه در نتیجه واقعیت عینی فکر می‌کنیم، احساس می‌کنیم یا احساس می‌شود، ارتباط دارد.* *به عبارت دیگر، یک کیفیت ذهنی وجود دارد.* (شیوارت).

### پنج دیدگاه Kitchenham , Pfleeger و Garvin در کیفیت

Kitchenham و Pfleeger، در ادامه آموزه‌های دیوید گاروین، پنج دیدگاه مختلف در مورد کیفیت را بیان می‌کنند:

* دیدگاه آرمان گرایانه که به جنبه متافیزیکی کیفیت می‌پردازد. در این دیدگاه، کیفیت، "چیزی است که ما به عنوان یک ایدئال برایش تلاش می‌کنیم، اما ممکن است هرگز به طور کامل اجرا نشود". به سختی می‌توان تعریف کرد.
* دیدگاه کاربر مربوط به مناسب بودن محصول برای استفاده است. دیدگاه آرمان گرایانه یک دیدگاه ذاتی است، اما دیدگاه کاربر به‌طور خاص و مشخص تر از ویژگی‌های محصول که پاسخگوی نیاز کاربران باشد برنامه‌ریزی می‌شود.
* چشم‌انداز تولید، کیفیت را مطابق با الزامات و اصول نشان می‌دهد. این جنبه از کیفیت توسط استانداردهایی مانند ISO 9001 تأکید می‌شود، که کیفیت را "مجموعه ای از خصوصیات بالقوه "تعریف می‌کند (ISO / IEC 9001).
* چشم‌انداز محصول که بیان می‌کند که می‌توان با اندازه‌گیری ویژگیهای ذاتی محصول، کیفیت آن را ارزیابی کرد.
* چشم‌انداز نهایی کیفیت، براساس ارزش است. این دیدگاه بیان می‌کند که دیدگاه‌های مختلف کیفیت ممکن است اهمیت یا ارزش متفاوتی را برای ذینفعان مختلف داشته باشد.

### کیفیت نرم‌افزار مطابق Deming

> این مشکل ذاتی در تعریف کیفیت یک محصول، هر نوع محصول، توسط استاد والتر شوگارت بیان شده‌است.
> 
> 
> مشکل تعیین کیفیت، مشکل تبدیل نیازهای آینده کاربر به ویژگی‌های قابل اندازه‌گیری است، به گونه ای که می‌توان محصولی را طراحی کرد که رضایت را در قبال مبلغی که کاربر پرداخت می‌کند به او هدیه بدهد. این کار آسانی نیست و به محض احساس احساس موفقیت، متوجه می‌شویم که نیازهای مصرف‌کننده تغییر کرده‌است، رقبای دیگر وارد میدان شده‌اند و …
> 
> 
>   
> 
> 
> 

### کیفیت نرم‌افزار مطابق با Feigenbaum

> کیفیت از دید مشتری مهم است، نه کیفیت از دید یک مهندس، نه کیفیت از دید بازاریاب و نه مدیریت. این کیفیت می‌تواند تجربه واقعی مشتری با محصول یا خدمات باشد که مطابق با خواسته‌های وی آگاهانه یا صرفاً احساسی بیان شده‌است و از لحاظ فنی عملیاتی یا کاملاً ذهنی اندازه‌گیری می‌شود و همیشه نشان دهنده یک هدف اساسی در بازار رقابتی است.
> 
> 

### کیفیت نرم‌افزار مطابق Juran

> واژه کیفیت معانی مختلفی دارد. دو تا از این معانی را بررسی می‌کنیم:
> 
> 
> 1. کیفیت شامل ویژگی‌های محصول است که نیاز مشتری را برآورده می‌کند و در نتیجه رضایت مندی از محصول را فراهم می‌کند.
> 2. کیفیت شامل رفع نواقص است.
> 
> 
> با این وجود، می‌توان به عنوان یک تعریف کوتاه از کیفیت گفت: کیفیت مناسب بودن یک محصول برای استفاده است.
> 
> 

### مدل کیفیت CISQ

اگرچه "کیفیت یک ویژگی ادراکی، بسته به مورد و تا حدودی ذهنی است و ممکن است افراد مختلف برداشت‌های مختلفی از آن بکنند "(همان‌طور که در مقاله در مورد کیفیت در تجارت ذکر شده‌است)، کیفیت ساختاری نرم‌افزار به‌طور واضح توسط کنسرسیوم کیفیت نرم‌افزارهای حوزهٔ آی تی (CISQ) مشخص شده‌است. با هدایت بیل کورتیس، نویسنده چارچوب قابلیت مدل بلوکی و مدیر CISQ و Capers Jones، مشاور برجسته CISQ , CISQ پنج ویژگی اصلی مطلوب یک قطعه از نرم‌افزار مورد نیاز برای تأمین ارزش تجاری را تعریف کرده‌است. در مدل خانه کیفیت، اینها مواردی هستند که باید به آنها برسید:

قابلیت اطمینان
یک ویژگی برای مقاومت و استحکام ساختاری. قابلیت اطمینان سطح ریسک و احتمال خرابی‌های احتمالی را اندازه‌گیری می‌کند. همچنین ضعف‌های موجود را به دلیل تغییراتی که در نرم‌افزار ایجاد شده‌است ("پایداری آن" مطابق با ISO) اندازه‌گیری می‌کند. هدف از بررسی قابلیت اطمینان، کاهش و جلوگیری از خرابی برنامه، قطع برنامه‌ها و خطاهایی است که به‌طور مستقیم بر کاربران تأثیر می‌گذارد است.

بهره‌وری
سورس کد و ویژگی‌های معماری نرم‌افزار مواردی هستند که عملکرد برنامه در حالت اجرا را تضمین می‌کنند. بهره‌وری به ویژه برای برنامه‌های کاربردی در محیط‌های با سرعت بالا مانند پردازش الگوریتمی یا تراکنشی که مقیاس پذیری و بهره‌وری به صورت موازی مهم هستند کاربرد دارد. تجزیه و تحلیل بهره‌وری سورس کد و مقیاس پذیری، تصویر روشنی از تأثیر کاهش بهره‌وری روی رضایت کاربر ارائه می‌دهد.

امنیت
آزمونی از احتمال نقض امنیت به دلیل شیوه‌های نادرست برنامه‌نویسی و معماری. این موضوع، خطر روبرو شدن با آسیب‌های اساسی که به تجارت آسیب می‌رساند را کم می‌کند.

قابلیت نگهداری
قابلیت نگه داری، شامل مفهوم سازگاری، قابلیت حمل و انتقال (از یک تیم توسعه به تیم دیگر) است. اندازه‌گیری و نظارت بر قابلیت نگه داری، این قابلیت برای مواردی که در آن تغییرات توسط برنامه‌های زمانی محدود به بازار انجام می‌شود و در جایی که مهم است فناوری اطلاعات پاسخگو به تغییرات محور در تجارت باشد. همچنین کنترل هزینه‌های نگهداری نیز ضروری است.

اندازه
در حالی که اندازه به خودی خود از ویژگی‌های کیفیت نیست، اما به وضوح بر حفظ آن تأثیر می‌گذارد. در کنار ویژگی‌های کیفیت که بررسی شد، اندازه نرم‌افزار می‌تواند برای ارزیابی میزان کار تولید شده توسط تیم‌ها و همچنین بهره‌وری آنها از طریق داده‌های زمانی و سایر معیارهای مرتبط با SDLC مورد استفاده قرار گیرد.

کیفیت عملکردی نرم‌افزار به عنوان تطابق آن با الزامات کاربردی به صورت صریح بیان شده تعریف شده‌است، به عنوان مثال با استفاده از تجزیه و تحلیل صدای مشتری (بخشی از طراحی جعبه ابزار Six Sigma و / یا مستند از طریق موارد استفاده) و سطح رضایت کاربر نهایی استفاده می‌شود. مورد دوم قابلیت استفاده است اینکه چقدر رابط کاربری بصری و پاسخگو است، چقدر عملیات ساده و پیچیده را می‌توان انجام داد و پیام‌های خطای مفید چقدر است. به‌طور معمول، شیوه‌ها و ابزارهای آزمایش نرم‌افزار اطمینان حاصل می‌کنند که یک تکه از نرم‌افزار مطابق با طراحی اصلی، تجربه کاربری برنامه‌ریزی شده و تست پذیری مطلوب رفتار می‌کند.

ویژگی ساختاری دوگانه کیفیت نرم‌افزار با مدل ارائه شده در کد کامل استیو مک کانل که ویژگی‌های نرم‌افزار را به دو قسمت تقسیم می‌کند سازگار است: ویژگی‌های کیفیت داخلی و خارجی. ویژگی‌های کیفیت خارجی آن بخش‌هایی از محصول است که با کاربران آن روبرو می‌شود و کیفیت داخلی برعکس آن است.

روش‌های جایگزین
---------------

یکی از مشکلات تعیین کیفیت این است که «همه احساس می‌کنند که آن را می‌فهمند» و تعاریف دیگر از کیفیت نرم‌افزار می‌تواند مبتنی بر گسترش مفهوم کیفیتی که در تجارت استفاده می‌شود باشد.

دکتر تام د مارکو اظهار داشته‌است که «کیفیت محصول تابعی از تغییر جهان برای بهتر شدن» یعنی کیفیت عملکرد و رضایت کاربر در تعیین کیفیت نرم‌افزار از کیفیت ساختاری مهم‌تر است.

تعریفی دیگر که توسط جرالد وینبرگ در مدیریت کیفیت نرم‌افزار ایجاد شده‌است: تفکر سیستمی این است که "کیفیت برای برخی از افراد ارزش دارد". این تعریف تأکید می‌کند که کیفیت ذاتاً ذهنی است، افراد مختلف کیفیت یک نرم‌افزار یکسان را متفاوت تجربه می‌کنند. یکی از نقاط قوت این تعریف سؤالاتی است که تیمهای نرم‌افزاری را برای بررسی آنها دعوت می‌کند، سوالاتی از قبیل: "افرادی که می‌خواهیم به نرم‌افزار ما ارزش دهند چه کسانی هستند؟" و "چه چیزی برای آنها با ارزش خواهد بود؟".

اندازه‌گیری
-----------

اگرچه مفاهیم ارائه شده در این بخش برای هر دو کیفیت ساختاری و کاربردی نرم‌افزار کاربرد دارد، اندازه‌گیری دومی اساساً از طریق آزمایش انجام می‌شود [به مقاله اصلی مراجعه کنید: تست نرم‌افزار ].

مقدمه
-----

اندازه‌گیری کیفیت نرم‌افزار درواقع بررسی این است که نرم‌افزار تا چه میزان خصوصیات مورد انتظار را دارد. این امر می‌تواند از طریق روش‌های کیفی یا کمی یا ترکیبی از هر دو انجام شود. در هر دو مورد، برای هر خصوصیت مطلوب، مجموعه ای از ویژگی‌های قابل اندازه‌گیری وجود دارد که وجود آنها در یک قطعه نرم‌افزار یا سیستم منجر به وجود ویژگی مورد نظر می‌شوند. به عنوان مثال، یک ویژگی مرتبط با قابلیت حمل، تعداد عبارات وابسته به هدف در یک برنامه است. به‌طور دقیق تر، با استفاده از رویکرد استقرار عملکرد کیفیت، این ویژگی‌های قابل اندازه‌گیری "چگونگی"‌هایی هستند که باید اجرا شوند تا بتوانند "آنچه راً در تعریف کیفیت نرم‌افزار بالا را فعال کنید.

ساختار، طبقه‌بندی و اصطلاحات ویژگی‌ها و معیارهای قابل استفاده برای مدیریت کیفیت نرم‌افزار از دو مدل ISO 9126-3 و ISO / IEC 25000: 2005 گرفته شده‌است. تمرکز اصلی روی کیفیت ساختاری داخلی است. زیر شاخه‌ها برای رسیدگی به موارد خاص مانند معماری برنامه کاربردی تجاری و خصوصیات فنی مانند دسترسی به داده‌ها و دستکاری‌ها داده‌ها ایجاد شده‌اند.

ارتباط بین خطاهای برنامه‌نویسی و نقص تولید نشان می‌دهد که خطاهای کد اصلی ۹۲٪ از کل خطاهای موجود در سورس کد را تشکیل می‌دهد. این تعداد بسیار زیاد مشکلات مربوط به کد در نهایت تنها ۱۰٪ از نقص تولید را به خود اختصاص می‌دهد. روشهای بد مهندسی نرم‌افزار در سطح معماری تنها ۸٪ از نقص کل را شامل می‌شود، اما بیش از نیمی از تلاش صرف شده برای رفع مشکلات را انجام می‌دهد و منجر به ۹۰٪مشکلات جدی در مورد قابلیت اطمینان، امنیت و کارایی در تولید می‌شود.

### تجزیه و تحلیل مبتنی بر کد

بسیاری از روش‌های اندازه‌گیری موجود، عناصر ساختاری برنامه را که منجر به تجزیه سورس کد به دستورالعمل‌های واحد است، شمارش می‌کنند (پارک، ۱۹۹۲)، نشانه (Halstead، ۱۹۷۷)، ساختارهای کنترل (McCabe، ۱۹۷۶)، و اشیاء (Chidamber & Kemerer، ۱۹۹۴).

اندازه‌گیری کیفیت نرم‌افزار، تعیین وسعت سیستم یا نرم‌افزار در این ابعاد است. تجزیه و تحلیل را می‌توان با استفاده از یک رویکرد کیفی یا کمی یا ترکیبی از هر دو انجام داد تا نمای کلی (با استفاده از میانگین (های) وزنی که نشان دهنده اهمیت نسبی بین عوامل مطرح شده می‌باشد) ارائه شود.

این دیدگاه از کیفیت نرم‌افزار در یک روش قدم به قدم باید با شناسایی خطاهای برنامه‌نویسی بحرانی گسسته تکمیل شود. این خطاها ممکن است یک مورد آزمایشی را از بین نبرند، اما در شرایط خاص می‌توانند منجر به وقوع فاجعه بار، تخریب عملکرد، نقض امنیت، خراب کردن داده و مشکلات بی شمار دیگری شوند (Nygard، ۲۰۰۷). یک سیستم واقعی و آماده استفاده، بدون در نظر گرفتن امتیاز آن بر اساس اندازه‌گیری‌های کل، یک سیستم مناسب به‌شمار نمی‌آید.

اندازه‌گیری ویژگی‌های مهم برنامه شامل اندازه‌گیری ویژگی‌های ساختاری معماری برنامه، برنامه‌نویسی و مستندات درون کد است؛ بنابراین، هر مشخصه تحت تأثیر ویژگی‌هایی در سطوح متعدد انتزاع در برنامه قرار دارد و همه این موارد را باید در محاسبه اندازه‌گیری خصوصیات در صورتی که پیش‌بینی کننده ارزشمندی از نتایج کیفی است که در کسب و کار تأثیر می‌گذارد، لحاظ کرد.

تحلیل و اندازه‌گیری کیفیت ساختاری از طریق تجزیه و تحلیل سورس کد، معماری، چارچوب نرم‌افزار، شمای پایگاه داده در رابطه با اصول و معیارهای تشکیل دهنده معماری مفهومی و منطقی سیستم انجام می‌شود. این موضوع با تجزیه و تحلیل کدهای اساسی، محلی و مؤلفه ای سطحی که معمولاً توسط ابزارهای توسعه انجام می‌شود می‌باشد.

### قابلیت اطمینان

علل اصلی ضعف در قابلیت اطمینان، عدم رعایت شیوه‌های خوب معماری و رمزگذاری است. این موضوع با اندازه‌گیری ویژگی‌های کیفی استاتیک برنامه قابل تشخیص است. ارزیابی ویژگی‌های استاتیک زیربنای قابل اطمینان بودن برنامه، تخمین سطح ریسک تجاری و احتمال بروز نقص احتمالی برنامه را در هنگام بهره‌برداری فراهم می‌کند.

ارزیابی قابلیت اطمینان مستلزم بررسی حداقل روشهای مهندسی نرم‌افزار زیر و بهترین خصوصیات فنی است:

* شیوه‌های معماری کاربرد
* شیوه‌های برنامه‌نویسی
* پیچیدگی الگوریتم‌ها
* پیچیدگی شیوه‌های برنامه‌نویسی
* انطباق با برنامه‌نویسی شی گرا و ساختار یافته (در صورت امکان)
* نسبت استفاده مجدد از الگوها
* برنامه‌نویسی کثیف
* استفاده از خطا و استثنا (برای همه لایه‌ها - GUI، منطق و داده‌ها)
* طراحی چند لایه
* مدیریت محدودیت منابع
* نرم‌افزار از الگوهای جلوگیری می‌کند که منجر به رفتارهای غیرمنتظره می‌شود
* نرم‌افزار مدیریت یکپارچگی و ثبات داده‌ها را کنترل می‌کند
* سطح پیچیدگی تبادلات

بسته به نوع معماری برنامه و مؤلفه‌های مورد استفاده (مانند کتابخانه‌های خارجی یا چارچوب‌ها)، موارد شخصی و سفارشی دیگر هم باید تعریف شوند تا از ارزیابی بهتری از قابلیت اطمینان نرم‌افزار داشته باشیم.

### کارایی

مانند اطمینان، علل ناکارآمدی عملکرد اغلب در موارد نقض معماری و برنامه‌نویسی خوب است که می‌توان با اندازه‌گیری خصوصیات کیفیت استاتیک یک برنامه آن هارا شناسایی کرد. این ویژگیهای استاتیکی، گلوگاه‌های عملکرد احتمالی عملیاتی و مشکلات مقیاس پذیری در آینده را پیش‌بینی می‌کنند، به ویژه برای برنامه‌هایی که به سرعت اجرای بالایی را برای دستیابی به الگوریتم‌های پیچیده یا حجم عظیم داده‌ها نیاز دارند.

ارزیابی کارایی نیاز به بررسی حداقل روشهای مهندسی نرم‌افزار زیر و ویژگیهای فنی دارد:

* شیوه‌های معماری کاربرد
* تعامل مناسب با منابع گران‌قیمت یا منابع راه دور
* عملکرد دسترسی به داده‌ها و مدیریت داده‌ها
* مدیریت حافظه، شبکه و فضای دیسک
* شیوه‌های برنامه‌نویسی
* انطباق با برنامه‌نویسی شی گرا و ساختار یافته (در صورت لزوم)
* انطباق با بهترین شیوه‌های برنامه‌نویسی SQL

### امنیتی

بیشتر آسیب‌پذیری‌های امنیتی به دلیل برنامه‌نویسی ضعیف و معماری ضعیف است. یک مثال آن تزریق SQL درون سایت است. این موارد به خوبی در لیست‌هایی که توسط CWE، و مرکز فوریت‌های رایانه ای SEI / Computer (CERT) در دانشگاه کارنگی ملون ثبت شده‌است.

ارزیابی امنیت حداقل نیاز به بررسی بهترین روشها و خصوصیات فنی زیر دارد:

* شیوه‌های معماری کاربرد
* انطباق طراحی چند لایه
* بهترین شیوه‌های امنیتی (اعتبار سنجی ورودی، SQL Injection، فیلمبرداری متقاطع سایت و غیره)
* تمرین‌های برنامه‌نویسی (سطح کد)
* خطا و مدیریت استثنا
* بهترین شیوه‌های امنیتی (دسترسی به توابع سیستمی، کنترل دسترسی به برنامه‌ها)

### قابلیت نگه داری

قابلیت نگه داری شامل مفاهیم قطعه بندی کد، قابل درک بودن، قابلیت تغییر، قابلیت آزمایش، قابلیت استفاده مجدد و قابلیت انتقال از تیم توسعه به تیم دیگر است. این موارد به عنوان مسائل مهم در سطح کد معرفی نمی‌شوند. در عوض، قابلیت نگهداری ضعیف معمولاً نتیجه هزاران مورد نقض جزئی در مستندسازی، استراتژی اجتناب از پیچیدگی و شیوه‌های اصلی برنامه‌نویسی است که باعث می‌شود تفاوت بین کد تمیز و آسان برای خواندن و کدهای شلوغ و سخت باشد.

ارزیابی قابلیت نگه داری نیاز به بررسی روشها و خصوصیات فنی زیر دارد:

* شیوه‌های معماری کاربرد
* معماری، برنامه‌ها و اسناد کد تعبیه شده در کد منبع
* خوانایی کد
* سطح پیچیدگی تبادلات
* پیچیدگی الگوریتم‌ها
* پیچیدگی شیوه‌های برنامه‌نویسی
* انطباق با برنامه‌نویسی شی گرا و ساختار یافته بهترین شیوه‌ها (در صورت کاربرد)
* نسبت استفاده مجدد از کد
* استفده از برنامه‌نویسی پویا
* نسبت اتصال
* برنامه‌نویسی کثیف
* مستندات
* سخت‌افزار، سیستم عامل، میان افزار، مؤلفه‌های نرم‌افزار و استقلال بانک اطلاعاتی
* طراحی چند لایه
* قابلیت حمل
* تمرین‌های برنامه‌نویسی (سطح کد)
* کد و عملکردهای تکراری کاهش یافته‌است
* پاکیزگی فایل سورس کد

قابلیت نگه داری به مفهوم بدهی فنی Ward Cunningham است، که بیانگر هزینه‌های ناشی از عدم نگهداری صحیح است. دلایل پایین بودن قابلیت نگه داری را می‌توان به عنوان جسور در مقابل محتاطانه و عمدی در مقابل غیرعمد طبقه‌بندی کرد، و اغلب منشأ آنها در ناتوانی توسعه دهندگان، کمبود وقت، بی دقتی و اختلاف آنها در هزینه‌ها و منافع است.

### اندازه نرم‌افزار

اندازه‌گیری اندازه نرم‌افزار مستلزم جمع‌آوری کامل کد منبع از جمله اسکریپت‌های ساختار پایگاه داده، سورس کد تغییر داده‌ها ، کامپوننت‌ها، فایل‌های پیکربندی و غیره است. در واقع دو نوع اندازه نرم‌افزار برای اندازه‌گیری وجود دارد، اندازه فنی و اندازه کاربردی:

* چندین روش اندازه‌گیری فنی نرم‌افزار وجود دارد که به‌طور گسترده مطرح شده‌است. متداول‌ترین روش اندازه‌گیری فنی تعداد خطوط کد در هر بخش، تعداد فایل‌ها، توابع، کلاس‌ها، جداول و غیره است که از آن می‌توان نقاط عملکرد پس زمینه را محاسبه کرد.
* متداول‌ترین روش اندازه‌گیری اندازه عملکرد، تجزیه و تحلیل Function Point است. اندازه‌گیری Function Point بر اساس نیاز کاربر انجام می‌شود و نمایش دقیقی از اندازه را برای توسعه دهنده / تخمین‌گر و مقدار (عملکردی که باید تحویل داده شود) ارائه می‌دهد و عملکرد تجاری را که به مشتری تحویل داده می‌شود، منعکس می‌کند. این روش شامل شناسایی و وزن ورودی‌ها، خروجی‌ها و داده‌های قابل تشخیص کاربر است. عدد به‌دست آمده برای استفاده در تعیین کمیت و ارزیابی تحویل نرم‌افزار و عملکرد (هزینه توسعه در هر نقطه عملکرد؛ نقص تحویل در هر نقطه عملکرد؛ نقاط عملکرد در هر ماه برای کارکنان) در دسترس است.

استاندارد اندازه‌گیری تجزیه و تحلیل Function Point توسط گروه کاربری بین‌المللی نقطه عملکرد (IFPUG) پشتیبانی می‌شود. این موضوع می‌تواند در مراحل اولیه چرخه توسعه نرم‌افزار اعمال شود و به خطوط کد وابسته نیست.

از زمان شروع تحلیل سطح تابع پذیری، تغییرات زیادی ایجاد شده‌است و تکنیک‌های اندازه‌گیری کاربردی گسترش یافته‌است، اقداماتی نظیر COSMIC , NESMA , Use Case Points , FP Lite , FP. با این حال، سطح تابع پذیری دارای سابقه آماری دقیق است و از آن به عنوان واحد مشترک اندازه‌گیری کار در مدیریت توسعه بیشمار برنامه (ADM) یا مشاغل برون سپاری یاد می‌شود.

یکی از محدودیت‌های متداول در مورد روش Function Point این است که این یک فرایند دستی است و بنابراین می‌تواند در پروژه‌های بزرگ مانند توسعه برنامه یا مشاغل برون سپاری پرهزینه باشد. این جنبه منفی استفاده از روش‌شناسی رهبران فناوری اطلاعات را به ایجاد کنسرسیوم برای معرفی استاندارد برای خودکارسازی اندازه‌گیری کیفیت نرم‌افزار تشویق کرد، در حالی که IFPUG همچنان بر فعالیت‌های دستی تأکید دارد.

### شناسایی خطاهای مهم برنامه‌نویسی

خطاهای برنامه‌نویسی بحرانی شیوه‌های بد معماری یا کد نویسی هستند که منجر به خطر اختلال در تجارت می‌شوند. این خطاها اغلب به فناوری وابسته هستند و به اهداف و ریسکهای کسب و کار وابستگی زیادی دارند.

خطاهای برنامه‌نویسی بحرانی همچنین می‌توانند براساس مشخصات CISQ طبقه‌بندی شوند:

* قابلیت اطمینان
	+ از الگوهای نرم‌افزاری که منجر به رفتار غیرمنتظره شود جلوگیری کنید.
	+ روش‌ها، مراحل و عملکردهایی که درج، بروزرسانی، حذف، ایجاد جدول یا انتخاب باید انجام دهند شامل مدیریت خطا است.
	+ توابع چند نخی باید ایمن شوند، به عنوان مثال سرویس‌های دسته ای یا کلاسهای کاری نباید دارای زمینه‌های استاتیک باشند.
* بهره‌وری
	+ اطمینان از متمرکز کردن درخواست مشتری (ورودی و داده) برای کاهش ترافیک شبکه.
	+ از پرس و جوهای SQL که از ایندکس استفاده نمی‌کنند، خودداری کنید
* امنیت
	+ از دسترسی به داده بدون جلوگیری از مدیریت خطا خودداری کنید
	+ کدهای برگشتی کنترل را کنترل کرده و مکانیسم‌های مدیریت خطا را پیاده‌سازی کنید
	+ اطمینان از اعتبارسنجی ورودی برای جلوگیری از نقص برنامه‌نویسی در سطح سایت یا نقص تزریق SQL
* قابلیت نگهداری
	+ برای بهبود درک مطلب باید از درختان ارث عمیق و لانه سازی جلوگیری کرد
	+ برای جلوگیری از انتشار اصلاحات، ماژول‌ها باید بهم پیوسته (fanout، واسطه‌ها) وصل شوند
	+ قراردادهای نامگذاری همگن را اجرا کنید

### مدل‌های عملیاتی تر

پیشنهادهای جدیدتر برای مدل‌های کیفیت مانند Squale و Quamoco از یکپارچه سازی در تعریف ویژگی‌های کیفیت و اندازه‌گیری کیفیت استفاده می‌کنند. با تجزیه ویژگی‌های کیفیتی یا حتی تعریف لایه‌های اضافی، ویژگی‌های پیچیده و انتزاعی کیفیت (مانند قابلیت اطمینان یا قابلیت نگهداری) قابل کنترل تر و قابل اندازه‌گیری می‌شوند. این مدل‌های جدید کیفیت در زمینه‌های صنعتی استفاده شده‌اند اما تا کنون به صورت گسترده و عمومی مورد توجه قرار نگرفته‌اند.

منابع
-----

پیوند به بیرون
--------------

| * ن
* ب
* و
مهندسی نرم‌افزار |
| --- |
| حوزه‌ها | تحلیل نیازمندی‌ها •  تحلیل سامانه‌ها •  طراحی نرم‌افزار •  برنامه‌نویسی •  روش‌های صوری •  وارسی مدل •  تست نرم‌افزار •  توسعه نرم‌افزار •  گسترش نرم‌افزار •  نگهداری نرم‌افزار |
| مفاهیم | مدل‌سازی داده •  معماری سازمانی •  مشخصات کاربردی •  زبان مدل‌سازی •  پارادایم برنامه‌نویسی •  نرم‌افزار •  معماری نرم‌افزار •  فرایند توسعه نرم‌افزار •  فرایند تولید نرم‌افزار •  کیفیت نرم‌افزار •  تضمین کیفیت نرم‌افزار •  Software archaeology •  تحلیل ساختمند |
| گرایشات | مدل چابک •  مدل طراحی جنبه‌گرا •  شیءگرایی •  آنتولوژی •  سرویس‌گرایی •  چرخه حیات توسعه سیستم‌ها |
| مدل‌ها | 

|  |  |
| --- | --- |
| مدل‌های توسعه | مدل چابک •  آریوپی  •  اسکرام •  مدل مارپیچی •  مدل آبشاری •  برنامه‌سازی مفرط •  مدل وی •  مدل تکراری و افزایشی •  پیش‌نمونه |
| مدل‌های دیگر | Automotive SPICE •  مدل بلوغ قابلیت یکپارچه •  مدل داده •  مدل تابع •  مدل اطلاعات •  فرامدل •  مدل شیءگرایی •  مدل‌سازی سیستم‌ها •  مدل نما |
| زبان‌های مدل سازی | IDEF •  زبان مدل‌سازی یکپارچه |

 |
| مهندساننرم‌افزار سرشناس | 
* ویکتور باسیلی
* کنت بک
* گریدی بوچ
* فردریک بروکز
* Barry Boehm
* وارد کانینگهام
* تام دی ماکرو
* ادسخر دیکسترا
* مارتین فولر
* تونی هور
* واتس هامفری
* مایکل ای. جکسون
* ایوار جاکوبسون
* Stephen J. Mellor
* برترند میر
* دیوید پارناس
* وینستون واکر رویس
* جیمز رامبا
* نیکلاوس ویرت
* Edward Yourdon
* Mohamed Fayad

 |
| حوزه‌های مرتبط | 
* علوم رایانه
* مهندسی کامپیوتر
* مدیریت پروژه
* مدیریت ریسک
* مهندسی سامانه‌ها

 |
|  •  رده  •  انبار |

| * ن
* ب
* و
علوم رایانه |
| --- |
| Note: This template roughly follows the 2012 ACM Computing Classification System. |
| سخت‌افزار | 
* برد مدار چاپی
* دستگاه جانبی
* مدار مجتمع
* یکپارچه‌سازی کلان‌مقیاس
* سامانه روی یک تراشه
* رایانش سبز
* خودکارسازی طراحی الکترونیکی
* شتاب‌دهنده سخت‌افزاری

 |
| سازمانسامانه‌های رایانه | 
* معماری رایانه
* سامانه نهفته
* رایانش بی‌درنگ
* اطمینان‌پذیری

 |
| شبکه رایانه‌ای | 
* معماری شبکه
* پروتکل ارتباطات
* سخت‌افزار شبکه
* برنامه‌ریز شبکه
* کارایی شبکه رایانه‌ای
* سرویس شبکه‌ای

 |
| سازمان نرم‌افزار | 
* مفسر
* میان‌افزار
* ماشین مجازی
* سیستم‌عامل
* کیفیت نرم‌افزار

 |
| نظریه زبان‌های برنامه‌نویسیو ابزار توسعه نرم‌افزار | 
* الگو برنامه‌نویسی
* زبان برنامه‌نویسی
* کامپایلر
* زبان خاص دامنه
* زبان مدل‌سازی
* چارچوب نرم‌افزاری
* محیط یکپارچه توسعه نرم‌افزار
* مدیریت پیکربندی نرم‌افزار
* کتابخانه (رایانه)
* مخزن نرم‌افزاری

 |
| توسعه نرم‌افزار | 
* فرایند توسعه نرم‌افزار
* تحلیل نیازمندی‌ها
* طراحی نرم‌افزار
* ساخت نرم‌افزار
* استقرار نرم‌افزار
* تعمیر و نگهداری نرم‌افزار
* تیم برنامه‌نویسی
* نرم‌افزار متن‌باز
* برنامه‌نویسی
* آزمون نرم‌افزار

 |
| نظریه محاسبات | 
* مدل محاسبه
* زبان صوری
* نظریه اتوماتا
* نظریه رایانش‌پذیری
* نظریه پیچیدگی محاسباتی
* منطق در علوم کامپیوتر
* معنی‌شناسی (علوم رایانه)

 |
| الگوریتمها | 
* الگوریتم
* تحلیل الگوریتم‌ها
* کارایی الگوریتمی
* الگوریتم‌های تصادفی
* هندسه محاسباتی

 |
| ریاضیاترایانه | 
* ریاضیات گسسته
* احتمالات
* آمار
* نرم‌افزار ریاضی
* نظریه اطلاعات
* آنالیز ریاضی
* آنالیز عددی

 |
| سامانه اطلاعاتی | 
* پایگاه داده
* ذخیره‌سازی داده رایانه
* سامانه اطلاعات سازمانی
* نرم‌افزار اجتماعی
* سامانه اطلاعات جغرافیایی
* سامانه پشتیبانی تصمیم
* کنترل فرایند
* پایگاه داده چند رسانه‌ای
* داده‌کاوی
* کتابخانه دیجیتال
* سکوی رایانش
* بازاریابی اینترنتی
* وب جهان‌گستر
* بازیابی اطلاعات
* مستندسازی فنی

 |
| امنیت رایانه | 
* رمزنگاری
* روش‌های صوری
* خدمات امنیتی
* سامانه تشخیص نفوذ
* خرابی سخت‌افزار
* امنیت شبکه
* امنیت اطلاعات
* امنیت برنامه

 |
| تعامل انسان و رایانه | 
* طراحی تعاملی
* رایانش اجتماعی
* رایانش فراگیر
* مصورسازی
* دسترس‌پذیری رایانه
* واسط‌های کاربر
* رایانش پوشیدنی

 |
| همروندی | 
* رایانش همزمان
* رایانش موازی
* رایانش توزیع‌شده
* چندریسمانی
* چندپردازشی

 |
| هوش مصنوعی | 
* پردازش زبان‌های طبیعی
* بازنمود دانش
* بینایی رایانه‌ای
* برنامه‌ریزی خودکار
* بهینه‌سازی
* نظریه کنترل
* فلسفه هوش مصنوعی
* هوش مصنوعی توزیع شده
* استدلال خودکار
* زبان‌شناسی رایانشی
* یادگیری ماشین

 |
| یادگیری ماشین | 
* یادگیری با نظارت
* یادگیری بی‌نظارت
* یادگیری تقویتی
* یادگیری چند-وظیفه‌ای
* روش اعتبارسنجی متقابل

 |
| گرافیک رایانه‌ای | 
* پویانمایی رایانه‌ای
* رندرینگ (گرافیک رایانه‌ای)
* روتوش
* واحد پردازش گرافیکی
* واقعیت ترکیبی
* واقعیت مجازی
* فشرده‌سازی تصویر
* مدلسازی جامد

 |
| رایانشکاربردی | 
* تجارت الکترونیک
* نرم‌افزار سازمانی
* ریاضیات محاسباتی
* فیزیک محاسباتی
* شیمی محاسباتی
* زیست‌شناسی محاسباتی
* علوم اجتماعی محاسباتی
* مهندسی و علم محاسبه
* انفورماتیک پزشکی
* هنر دیجیتال
* نشر الکترونیک
* جنگ مجازی
* رأی‌گیری الکترونیکی
* بازی ویدئویی
* واژه‌پرداز
* تحقیق در عملیات
* فناوری آموزشی
* سامانه مدیریت اسناد

 |
| توجه: بنا بر سامانه رده‌بندی رایانش ای‌سی‌ام علم رایانه همچنین می‌تواند به موضوع‌ها یا زمینه‌های گوناگون تقسیم شود.
* **کتاب:علوم رایانه**
* **رده:علوم رایانه**
* **طرح کلی علوم رایانه**
* **ویکی‌پدیا:ویکی‌پروژه علوم رایانه**
* **ویکی‌انبار**
 |