پیچیدگی نرم افزار
در حالت کلّی پیچیدگی نرمافزار، میزان کار فکری مورد نیاز برای درک نرمافزار را مشخص میکند. پیچیدگی در فاز توسعهی نرمافزار، تلاش مورد نیاز برای آزمون و اشکالزدایی برنامه، پیمانهها و زیر سیستمها را به شدّت تحت تأثیر قرار میدهد. در فاز نگهداری نرمافزار، پیچیدگی دشواری مکانیابی و تصحیح خطاهای کشف نشده پیادهسازی و همچنین میزان تلاش مورد نیاز برای تغییر پیمانههایی از برنامه که باید تصحیح شوند را مشخص میکند.
کار زیادی در مورد منشأ و ماهیت پیچیدگی نرمافزار انجام نشده است. بیشتر کارهای انجام شده دراین زمینه به تأثیر پیچیدگی بر پروژههای نرمافزاری پرداختهاند که در رأس آنها کیفیت و هزینههای محصول قرار میگیرد. توجه مدیران و مهندسان پروژههای نرمافزاری به پیچیدگی نرمافزار برای کنترل و پیشبینی کیفیت و بهرهوری محصول است.
گرچه در مورد علل و ماهیت پیچیدگی نرمافزار مطالب زیادی موجود نیست. امّا چندین تعریف برای پیچیدگی ارائه شده است. بیشتر آنها بر اساس این مفهوم هستند که پیچیدگی نرمافزار میزان دشواری تحلیل، طراحی، کد، تست، نگهداری، تغییر و اصلاح نرمافزار است.
۲-تعریف پیچیدگی
وقتی در مورد پیچیدگی نرمافزار صحبت میکنیم اولین سؤالی که باید پاسخ داده شود این است که: “پیچیدگی چیست؟”. توافق عمومی بر روی چگونگی تعریف پیچیدگی نرمافزار وجود ندارد. پیچیدگی نرمافزار یک موضوع کلّی، غیراستاندارد و اصطلاحی وابسته است که ترکیب سیستم را توصیف میکند. دلیل وابسته بودن این اصطلاح این است که مقدار مطلقی را نمیتوان به آن نسبت داد. یک سیستم با پیچیدگی نرمافزاری بالا ممکن است نسبت به سیستمهای دیگر پیچیدگی کمتری داشته باشد، پیچیدگی نرمافزار اصطلاح غیراستانداردی است زیرا محدودهی آن مشخص نیست و میتواند در موارد متفاوت با معانی متفاوت به کار رود. یک سیستم با کد حجیم که چندین پیمانه به هم مرتبط دارد میتواند بهعنوان یک سیستم پیچیده در نظر گرفته شود. از طرفی یک برنامهی کوتاه با الگوریتم سخت را نیز میتوان پیچیده نامید.
باور عمومی بر این است که پیچیدگی نرمافزار را نمیتوان فقط با استفاده از یک بعد تعریف کرد.
فرهنگ کامپیوتری استاندارد IEEE، “پیچیدگی” را به این صورت تعریف میکند : میزان سختی درک یا بازبینی یک سیستم یا مولفه که طراحی یا پیاده سازی شده است.[۱] عبارت “سختی ِدرک” اشاره دارد به اینکه پیچیدگی لزوماً مقیاس مطلقی برای اندازه گیری نیست بلکه نسبی است به این معنی که آنچه برای شخصی پیچیده به نظر میرسد میتواند برای دیگری براحتی قابل فهم باشد مثلاً، یک مهندس نرمافزار که با تئوری سیستمهای کنترل آشنایی دارد ساختار و سازمان خوب یک سیستم خوشطرح کنترلی را تشخیص میدهد در حالی که مهندس نا آشنا با تئوری مشکل زیادی در درک طراحی خواهد داشت. مهمتر این که مهندس ناآشنا بدون داشتن دانش پایه به احتمال زیاد توانایی طرح یک سیستم خوشساختار را نخواهد داشت. بنابراین آموزش جزء مهمیدر رابطه با پیچیدگی نرمافزار است.
اندازهگیری پیچیدگی نرمافزار یکی از زمینههای مهندسی نرمافزار است که به فاکتورهایی از اندازهگیری تأثیرگذار بر هزینههای نگهداری و توسعه میپردازد. Zuseادعا میکند “پیچیدگی نرمافزار” به درستی تعریف نشده است و اندازهگیری پیچیدگی نرمافزار اسم بی مسمّی است. وی برای پیچیدگی نرمافزار تعریفی به این صورت ارائه میکند: “معنی درست پیچیدگی نرمافزار سختی نگهداری، تغییر و درک نرمافزار است. پس با پیچیدگی وابسته به روانشناسی نرمافزار سر و کار دارد”.
این تعاریف پیچیدگی نرمافزار را به پیچیدگی وابسته روانشناسی مر بوط میکند. سه نوع مشخص از پیچیدگی وابسته به روانشناسی که بر درک برنامهنویس از نرمافزار اثر میگذارد عبارتنداز: پیچیدگی مسأله، پیچیدگی طراحی سیستم و پیچیدگی رویهای. پیچیدگی مسأله، تابعی از دامنه مسأله است. به بیان ساده، فرض بر این است که درک مسائل پیچیده برای برنامهنویس مشکلتر از درک مسائل ساده است. از آنجا که این نوع از پیچیدگی غیر قابل کنترل است عموماً در مهندسی نرمافزار نادیده گرفته میشود. پیچیدگی سیستمی نگاشتِ فضای مسأله به یک نمایش مشخص است. پیچیدگی دادهای و پیچیدگی ساختاری دو نوع از پیچیدگی طراحی سیستم است که برای سیستمهای ساخت یافته تعریف میشود[۲]. پیچیدگی ساختاری به مفهوم اتّصال اشاره دارد. اتّصال، وابستگیِ بین پیمانههای کد منبع را اندازهگیری میکند، بعنوان مثال، توابع C سایر توابع C را فراخوانی میکنند. هر چه اتّصال بین پیمانهها بیشتر باشد درک پیمانه برای برنامهنویس مشکلتر خواهد بود. پیچیدگیِ دادهای مفهوم چسبندگی را تداعی میکند چسبندگی، وابستگی در درون پیمانه را اندازهگیری میکند. در این حالت، هر چه پیمانه چسبندهتر باشد درک آن برای برنامهنویس آسانتر است[۳]. پیچیدگیِ دادهای و ساختاری، میزانهای مبتنی بر fan-in، fan-out پیمانه و تعداد متغیرهای ورودی/خروجی هستند.
پیچیدگی سیستم بر مجموع پیچیدگی دادهای و ساختاری همه پیمانههای سیستم مبتنی است. این میزانها، پیچیدگی اطلاعاتیِ سیستم در سطح پیمانه و سیستم را نشان میدهند. این روشِ چند سطحی در میزانهای سنّتی نرمافزار که بر اتّصال و چسبندگی تأکید دارد پایهای برای مدلهای پیچیدگیِ پیشنهادی برای سیستمهای OO میباشد.
پیچیدگیِ رویهای به ساختار منطقی برنامه مربوط میشود. این روش اندازهگیری پیچیدگی، طول برنامه (تعداد نشانه ها یا تعداد خط کد برنامه) یا تعداد ساختمانهای منطقی (ترتیب، تصمیمگیریها یا حلقهها) را که برنامه شامل میشود بعنوان پیچیدگی برنامه در نظر میگیرد.
Brooks، بر طبقهبندیِ غالب برای پیچیدگی، یعنی عارضی و ضروری اشاره میکند. ” پیچیدگی نرمافزار یک ویژگی ضروری است نه عارضی. بنابراین، توصیفاتی از موجودیت نرمافزار که نرمافزار را از پیچیدگی جدا میکند اغلب ماهیت نرمافزار را از آن جدا میکند. ” پیچیدگی ضروری از ماهیت مسأله و عمق مجموعه مهارتهای مورد نیاز برای درک مسأله نشأت میگیرد. پیچیدگی عارضی نتیجه کوشش ناکافی برای حلّ مسأله است و میتواند معادل چیزی باشد که بعضی آن را عارضه مینامند. بکارگیری الگوی طراحی نادرست یا انتخاب ساختار دادهای نامناسب پیچیدگی عارضی به یک مسأله میافزاید.
ایدهی پشتِ تمام تعاریف پیچیدگی این است که هرچه عبارت یا مدلی حاوی اطلاعات بیشتری باشد، پیچیدهتر است. اطلاعات چیزی است مثل محتوای یک پیغام که بین فرستنده و گیرنده ارتباط برقرار میکند و روی حامل اطلاعاتی مثل مجموعهای از عبارات زبانی و نمادها منتقل میشود.
۳- ماهیت پیچیدگی
در مرکزِ موضوع پیچیدگی، مسأله شناخت قرار میگیرد[۴]. زمانیکه نرمافزار تأخیر دارد، ناقص است، بدرستی معیّن نشده یا بطور دقیق قیمت گذاری نمیشود ممکن است به این دلیل باشد که توسعهدهندگان نرمافزار در یک حوزه ناشناخته و پویا کار میکنند که کورمال دنبال شناخت دقیق و کامل موضوعاتی هستند که نرمافزار باید اداره کند. وقتی نرمافزار براحتی قابل استفاده مجدّد نیست یا نگهداری و عملیاتی شدن آن سخت است بدلیل کنار هم قرار گرفتن پیچیدهی بخشهایی با تعامل بالایی است که شناخت نرمافزار را مشکل میکند. علت بی دوامی نرمافزار یا بروز اتفاقات غافلگیرکننده ناخوشایند نبودن شناخت کامل است که به مصالحه و انعطاف ناپذیری منجر شده وتغییر و انحراف از استفاده معمول خطرناک میشود. در هر حالت، پیامدِ پیچیدگی خسارتی است که بدلیل عدم شناخت میپردازیم. بنابراین پیچیدگی میزانی برای دشواری شناخت و درک یک چیز است.
۴- اجزاءی کلیدی در پیچیدگی
پیچیدگی برچسبی است که ما به وجود متغیرهای وابستهی زیاد در یک سیستم موجود میدهیم. هر چه متغیرها زیاد و وابستگی بین آنها زیادتر باشد سیستم پیچیدهتر میشود. اتّصال بین متغیرها ما را مجبور میکند که در آن واحد ویژگیهای بسیار زیادی را در نظر بگیریم به علاوه اینکه غیر ممکن است که فقط مسئولیّت یک عمل را در سیستم پیچیده به عهده بگیریم.
پیچیدگی چند جزء کلیدی دارد:
مقیاس: تعداد اجزاءی سیستم نرمافزاری
تنوّع: گستره اجزاءی متفاوتی که سیستم را تشکیل میدهند.
اتّصال: ارتباطات بین مولفهها
چرا این اجزاءء پیچیدگی دشواریِ درک سیستم را موجب میشوند؟
مقیاس به تنهایی مسأله نیست. اگر ساختار سیستم با قاعده باشد بصورت تحلیلی تعیین میشود و اگر تعداد اجزاء به اندازه کافی زیاد باشد بصورت امّاری میتوان آن را معین کرد. مقیاس درکنار اجزاءء دیگر پیچیدگی، درک سیستم نرمافزاری را دشوارتر میکند.
تنوّع، تعداد انواع اجزاءیی را که باید تحلیل شوند افزایش میدهد هر چه تنوّع بیشتر باشد تلاش بیشتری برای درک هر جزء و ترکیبی از اجزاء لازم است.
اتّصالات نیز دشواریِ درک یک سیستم را بیشتر میکنند. با افزایش مقیاس تعامل بین اجزاء بصورت نمایی افزایش مییابد.
۵- عملکردِ ضروری در مقابل پیچیدگی عارضی
عملکردِ ضروری از نیازمندیها بر میخیزد و در حقیقت ماهیت آنچه سیستم باید انجام دهد را مشخص میکند و میتواند مثلاً از سختافزار به نرمافزار منتقل شود ولی نمیتواند حذف شود مگر با حذف نیازمندیهای غیر ضروری. پیچیدگی ضروری ذاتی و غیر قابل اجتناب است و در حقیقت از چیزی که سیستم باید انجام دهد ناشی میشود. پیچیدگی ذاتی با پیچیدگی الگوریتم سر و کار دارد و به مدل محاسباتی استفاده شده برای حلّ مسأله وابسته است که به صورت کمینه، پیچیدگی در بین تمام الگوریتمهایی که بهعنوان راهحل ارائه شدهاند، تعریف میشود. پیچیدگی ذاتی عموماً، برحسب زمان و فضای مورد نیاز برای اجرا اندازهگیری میشود. کیفیت و کارایی طراحی و هزینهی کلّی پروژه در بهترین حالت از طریق پیچیدگی ذاتی تعیین میشود. امّا پیچیدگی عارضی از برنامههای کامپیوتری یا از فرایند توسعه (برنامهنویسی کامپیوتری) یا از انتخابهای صورت گرفته در ساخت یک سیستم ناشی میشود مثلاً از معماری نرمافزار، طراحی ساختمانداده، زبان برنامهنویسی و راهبردهای کد نویسی نشأت میگیرد. انتخابهای عاقلانهتر میتوانند پیچیدگی عارضی را کاهش دهند. پس پیچیدگی عارضی در حقیقت نتیجه چگونگی ساخت نرمافزار است. بنابراین بهترین راه برای مقابله با پیچیدگی این است که ابتدا مسأله (چه چیز) را درست تعریف کنیم سپس دنبال ایجاد یا انتخاب راه حلی (چگونگی) مناسب برای حلّ مسأله باشیم. این نوع پیچیدگی با توسعه سیستم سر و کار دارد و شامل ویژگیهایی نظیر اندازهی سیستم، تعداد پیمانهها، تعداد توابع در درون سیستم و اتّصال بین پیمانهها میباشد.[۵]
فاکتورهای پیچیدگی ضروری با داشتن نیازمندیهای صحیح، غیر مبهم، ضروری، کامل و با ثبات همارز است. بدیهی است که بزرگترین موضوع پیچیدگی ضروری مهندسی نیازها و تحلیل است. امّا، در پیچیدگی عارضی تعداد و محدوده موضوعات بسیار متنوّع و گستردهای شامل فرایند، سازمان، استاندارد و غیره را در بر میگیرد.
پیچیدگی عارضی با تصمیمگیریهای درست قابل کاهش است و هدف اکثر پیشنهادهای مطرح شده است.
فاکتورهای دخیل در پیچیدگیِ عارضی میتوانند انتخاب معماری نرمافزار، تجربه و مهارت تیم نرمافزار، ابزارهای توسعه بکار رفته، منابع و فرصت آماده کردن مناسب بجای آماده سازی سریع باشند. پیچیدگی عارضی میتواند با افزایش پیچیدگی ضروری افزایش یابد.
به عبارتی پیچیدگی به دو دسته تقسیم میشود:
پیچیدگی مسأله: (پیچیدگی ذاتی یا پیچیدگی ضروری) که در طول فازِ نیازمندیها ایجاد میشود.
پیچیدگی راهحل: (پیچیدگی افزوده یا پیچیدگی عارضی) که بعد از پیچیدگی مسأله مطرح میشود. این نوع از پیچیدگی اساساً، در مراحل توسعه نرمافزار بعد از فاز نیازمندیها در فازهای طراحی و تولید کد ایجاد میشود.
این نوع دسته بندیها به مهندسان نرمافزار کمک میکند تا تعیین کنند که کی و چگونه پیچیدگی وارد پروژه میشود، همچنین آگاه میشوند که روی کدام مرحله از چرخه حیات نرمافزار باید تمرکز کنند تا قادر باشند پیچیدگی نرمافزار را کنترل و کاهش دهند.
این پیچیدگی با منابع مورد نیاز پروژه ارتباط دارد. با این رویکرد پیچیدگی یک مسأله را میتوان بصورت مقدار منابع مورد نیاز برای یک راهحل بهینه برای مسأله تعریف کرد، پس پیچیدگی یک راهحل میتواند بصورت منابع مورد نیاز برای پیادهسازی یک راهحل خاص درنظر گرفته شود. این منابع از دو جنبه بررسی میشود زمان، بعنوان مثال زمان کامپیوتر و ساعات پرسنل و فضا بعنوان مثال حافظه کامیپوتر، پشتیبانی نرمافزار و غیره.
مطالب مشابه :
مقایسه بین صفحات HTML و ASP
موسسه آموزش عالی سفیر دانش ایلام. کمک به دانشجویان کامپیوتر دانشگاه سفیردانش ایلام هست
پیچیدگی نرم افزار
موسسه آموزش عالی سفیر دانش ایلام. کمک به دانشجویان کامپیوتر دانشگاه سفیردانش ایلام هست
پروتکل TCP و نسخه های مختلف آن
موسسه آموزش عالی سفیر دانش ایلام. کمک به دانشجویان کامپیوتر دانشگاه سفیردانش ایلام هست
برچسب :
سفیردانش ایلام