مهندسی معکوس !
مهندسی معکوس به معنی بدست آوردن سطح بالایی از نمایش برنامهها و سیستمهای نرمافزاری است. معمولاً مهندسی نرمافزار بوسیلة یک نمایش سطح پایین از یک سیستم (مثل مقادیر باینری، کدهای ساده، و یا اجراهای قدم به قدم ) شروع میشود و سعی در بدست آوردن نمایش بهتر از موارد مطروحه را دارد. بعنوان مثال بدست آوردن سورس برنامه، نماهایی از معماری، یا use caseها و ترتیب اجرای آنها در یک سیستم نمونهای از این موارد است. روشهای مهندسی معکوس و تکنولوژی نقشی مهمی در بسیاری از وظایف مهندسی نرمافزار ایفا میکنند. میتوان اداراک بهتر نرمافزاری، مهاجرت سیستمها رو به نسلهای جدید و تکامل نرمافزار را نمونههایی از کاربردهای مفید مهندسی معکوس نامید. در تعریفی دیگر مهندسی معکوس تفهیم یک سیستم از شناسایی اجزاء یا مصنوعات سیستم که موجب یافتن روابط میان آنها و ایجاد اجزاء انتزاعی از اطلاعات یک سیستم میشود را گویند. البته باید بخاطر داشته باشیم که هدف مهندسی معکوس تغییر اهداف سیستم به سمتی دیگر نمیباشد . تعریفی دیگر از مهندسی معکوس داریم که مهندسی معکوس عبارت است از توانایی گرفتن اطلاعات از کد منبع و ایجاد یا ارتقاء مدل سیستم در زبان برنامهنویسی مورد نظر تیم مهندسی معکوس؛ یکی از موانع موجود بر سر راه پروژههای علم فناوری اطلاعات سازگار نگاه داشتن مدل آبجت با کد است. با تغییر نیازها، تغییر مستقیم کد میتواند وسوسهانگیز باشد، تا اینکه مدل را تغییر داده شود و سپس کد تغییر یافته را از مدل سیستم تولید نمائیم. مهندسی معکوس به ما امکان میدهد تا همیشه مدل سیستم را با کد، همسان نگاه داریم.
البته تعاریفی که در اینجا مطرح گردید تعاریف مثبتی از مسئلة مهندسی معکوس نرمافزار را مطرح کردهاند. در اینجا ما نیز یکی دیگر از کاربردهای مهندسی معکوس که بوسیلة سارقان نرمافزار بکار برده میشود را ارائه میدهیم. سارقان نرمافزار با در دست داشتن سیستم نرمافزاری تولید شده و اجرای فرآیندهای مهندسی معکوس بر روی آنها به کدهای سیستم و تمامی اجزاء آن خواهند رسید و به تغییر آنها میپردازند. از جملة این تغییرات میتوان به حذف قفلهای نرمافزاری، تغییر عناوین و نشانهای مالکین سیستم به عناوین سارقان نرمافزار، تغییر روند اجرای سیستم طبق خواستة سارقان و مواردی از این قبیل اشاره نمود.
مهندسی معکوس سیستمهای نرمافزاری بزرگ به علت حجم بزرگ و پیچیدگیهای آنها مشکل است. هرچند که این امر پیشنیازی برای نگهداری، مهندسی مجدد، و تکامل نرمافزار میباشد. چیکوفسکی مهندسی معکوس را چنین تعریف میکند:« فرآیند تجزیة یک سیستم برای شناسایی اجزاء سیستم و روابط میان آنها و ایجاد نمایشهایی از سیستم در شکلی دیگر یا در یک سطح بالاتر از اجزاء انتزاعی آن است». نگهداری و توسعه دادن سیستمهای نرمافزاری امروزی به چند دلیل مشکل میباشد. از جمله این موارد بالا بردن سرعت تغییر و تحول کار تولیدکنندگان، افزایش اندازه و پیچیدگی سیستمهای نرمافزاری، و تغییر احتیاجات ثابت سیستمهای نرمافزاری میباشد. بعنوان مثال سیستمهای قدیمی بزرگ، کامل و متشکل از سیستمهای نرمافزاری پیچیدهای هستند که نتیجة یک سرمایهگذاری بلند مدت توسط یک شرکت و بیشتر به همین دلیل نگهداری و پشتیبانی شدهاند پس ملزومات جدید میبایست اتمام گشته و سرمایهگذاری شرکت باید بازگردد. پارنِس تخمین زده است که بیشتر سیستمهای قدیمی از مشکلات متنوعی مانند اینکه تولیدکنندگان اصلی ممکن است تا مدت زیادی در دسترس نباشند، روشهای پیشبرد منسوخ و یا زبانهای قدیمی، و یا مستندسازیهای گمشده و یا غیرکافی و منسوخ میباشند است .
دلایل جدا بودن از دشواریهای تکنیکی و گران بودن نگهداری و تکامل بعضی از سیستمها بدین ترتیب است: سامرویل و دویس تخمین زده است که هزینة حسابهای نگهداری نرمافزار 50 تا 75 درصد از کل هزینة یک سیستم نرمافزاری است. بازنویسی این سیستمها از روی چکنویس همیشه مسئلهدار بوده است زیرا این قضیه حجم بزرگی از زمان، پول و منابع انسانی را نیاز دارد .
از زمانی که سیستمهای قدیمی به سمت حجیم شدن توسط هزاران خط کد نویسی بدلیل وجود مستندسازیهای ناقص رفته است، نیاز به راهنماییهای خاصی که در فهمیدن و رفع نقص نرمافزار کمک کند احساس میشود. تمرکز ما بر روی سیستمهای شئگرا قدیمی بوده که اساساً بدلیل وجود بسیاری سیستم متفاوت که با این روش نوشته شدهاند و بدلیل اینکه عمر مسبب تغییر قسمتی از یک سیستم نرمافزاری در سیستمهای قدیمی نمیشود، اما سرعت در هر کدام توسعه و تغییر یافته است .