چکیده :
در این پروژه به بررسی سبک ها و متدهای مهندسی نرم افزار پرداخته شده است ، مهندسی نرمافزار پیشهای است که به یاری دانش رایانه و دیگر فناوریها و روشها به آفریدن و نگاهداری نرمافزار رایانهای میپردازد.
مسائل اصلی مهندسی نرمافزار تولید نرمافزار بر اساس موارد زیر است:
الزامات تعیین شده
در زمان تعیین شده
در محدودهٔ بودجه پیشبینی شده
مهندسی نرمافزار طراحی، برنامه نویسی، توسعه، مستندسازی و نگهداری نرمافزار با بکارگرفتن روشهای فنی و عملی از علوم کامپیوتر ، مدیریت پروزه ، مهندسی ، محدوده کاربرد، طراحی رابط، مدیریت تجهیزات دیجیتال و سایر زمینهها است.
کاربردهای مهندسی نرمافزار دارای ارزشهای اجتماعی و اقتصادی هستند، زیرا بهرهوری مردم را بالا برده، چند و چون زندگی آنان را بهتر میکنند. مردم با بهرهگیری از نرمافزار، توانایی انجام کارهایی را دارند که قبل از آن برایشان شدنی نبود. نمونههای از این دست نرمافزارها عبارتاند از: سامانههای توکار، نرمافزار اداری، نرم افزارهای رایانهای، و اینترنت.
فناوریها و خدمات مهندسی نرمافزار به کاربران برای بهبود بهرهوری و کیفیت یاری میرساند. نمونههایی از زمینههای بهبود: پایگاه دادهها، زبانها، کتابخانهها، الگوها، فرآیندها و ابزار.
فصل اول
کلیات بحث
مقدمه :
با بزرگ شدن پروژه های نرم افزاری و پیشرفت علم مهندسی نرم افزار ، روش های سازمان یافته ای برای توسعه نرم افزارها ابداع شد که هر کدام بسته به نوع پروژه و محدودیت های آن در جای خاصی کاربرد دارد. برخی روش ها مانند R.A.D به دلیل کمبود زمان تولید، برخی مانند spiral به دلیل مشخص نبودن نیازمندی های اولیه نرم افزار و برخی مانند X.P برای کسانی که کار طراحی نرم افزار را با کدنویسی شروع میکنند ابداع شدند. ایجاد پروژه های بزرگ بدون بکارگیری یکی از روش های مهندسی نرم افزار ممکن نیست.
پیشینه مهندسی نرمافزار
اصطلاح مهندسی نرمافزار بعد از سال ۱۹۶۸ شناخته شد. این اصطلاح طی کنفرانس «مهندسی نرمافزار ناتو ۱۹۶۸» (که در گارمیش آلمان برگزار شد) توسط ریاست کنفرانس F.L. Bauer معرفی شد و از آن پس بطور گسترده مورد استفاده قرار گرفت.
اصطلاح مهندسینرمافزار عموماً به معانی مختلفی به کار میرود:
بهعنوان یک اصطلاح غیر رسمی امروزی برای محدوده وسیع فعالیتهایی که قبلا برنامهنویسی و تحلیل سیستمها نامیده میشد.
بهعنوان یک اصطلاح جامع برای تمامی جنبههای عملی برنامهنویسی کامپیوتر، در مقابل تئوری برنامه نویسی کامپیوتر، که علوم کامپیوتر نامیده میشود.
بهعنوان اصطلاح مجسم کننده طرفداری از یک رویکرد خاص نسبت به برنامهنویسی کامپیوتر که اصرار میکند، مهندسی نرمافزار، بجای انکه هنر یا مهارت باشد، باید بهعنوان یک رشته عملی مهندسی تلقی شود و از جمع کردن و تدوین روشهای عملی توصیه شده به شکل متدولوژیهای مهندسی نرمافزار طرفداری میکند.
مهندسی نرمافزار عبارتست از : الف) کاربرد یک رویکرد سیستماتیک، انتظام یافته، قابل سنجش نسبت به توسعه، عملکرد و نگهداری نرمافزار، که کاربرد مهندسی در نرمافزار است و ب) مطالعه روشهای موجود در استاندارد IEEE
محدوده مهندسی نرمافزار و تمرکز آن
مهندسی نرمافزار به مفهوم توسعه و بازبینی یک سیستم نرمافزاری مربوط میباشد. این رشته علمی با شناسایی، تعریف، فهمیدن و بازبینی خصوصیات مورد نیاز نرمافزار حاصل سر و کار دارد. این خصوصیات نرمافزاری ممکن است شامل: پاسخگویی به نیازها، اطمینانپذیری، قابلیت نگهداری، در دسترس بودن، آزمونپذیری، استفاده آسان، قابلیت حمل و سایر خصوصیات باشد.
مهندسی نرمافزار ضمن اشاره به خصوصیات فوق، مشخصات معین طراحی و فنیای را آماده میکند که اگر بدرستی پیادهسازی شود، نرمافزاری را تولید خواهد کرد که میتواند بررسی شود که آیا این نیازمندیها را تامین میکند یا خیر.
مهندسی نرمافزار همچنین با خصوصیات پروسه توسعه نرمافزاری در ارتباط است. در این رابطه، با خصوصیاتی مانند هزینه توسعه نرمافزار، طول مدت توسعه نرمافزار و ریسکهای توسعه نرمافزار درگیر است.
نیاز به مهندسی نرمافزار
نرمافزار عموماً از محصولات و موقعیتهایی شناخته میشود که قابلیت اطمینان زیادی از آن انتظار میرود، حتی در شرایط طاقت فرسا، مانند نظارت و کنترل نیروگاههای انرژِی هستهای، یا هدایت یک هواپیمای مسافربری در هوا، چنین برنامههایی شامل هزاران خط کد هستند، که از نظر پیچیدگی با پیچیدهترین ماشینهای مدرن قابل مقایسهاند. بهعنوان مثال یک هواپیمای مسافربری چند میلیون قطعه فیزیکی دارد (و یک شاتل فضایی خدود ده میلیون بخش دارد)، در حالی که نرمافزار هدایت چنین هواپیمایی میتواند تا ۴ میلیون خط کد داشته باشد.
تکنولوژیها و روشهای عملی
مهندسین نرمافزار طرفدار تکنولوژیها و روشهای عملی بسیار متفاوت و مختلفی هستند، که با هم ناسازگارند. این بحث در سالهای دهه ۶۰ میلادی شروع شد و ممکن است برای همیشه ادامه پیدا کند. مهندسین نرمافزار از تکنولوژیها و روشهای عملی بسیار متنوعی استفاده میکنند. کسانی که کار عملی میکنند از تکنولوژیهای متنوعی استفاده میکنند : کامپایلرها، منابع کد، پردازشگرهای متن. کسانی که کار عملی میکنند از روشهای عملی بسیار متنوعی استفاده میکنند تا تلاشهایشان را اجرا و هماهنگ کنند : برنامه نویسی در دستههای دونفری، بازبینی کد، و جلسات روزانه. هدف هر مهندس نرمافزار بایستی رسیدن به ایدههای جدید خارج از مدلهای طراحی شده قبلی باشد، که باید شفاف بوده و بخوبی مستند شده باشد.
با وجود رشد فزاینده اقتصادی و قابلیت تولید فزایندهای که توسط نرمافزار ایجاد شده ، هنوز هم بحث و جدلهای ماندگار درباره کیفیت نرمافزار ادامه دارند.
ماهیت مهندسی نرمافزار
دیوید پارناس گفتهاست که مهندسی نرمافزار یک شکل از مهندسی است. استیو مککانل گفتهاست که هنوز اینطور نیست، ولی مهندسی نرمافزار باید یک شکل از مهندسی بشود. دونالد کنوت گفتهاست که برنامه نویسی یک هنر است. دیوان فعالیتهای آماری آمریکا مهندسان نرمافزار را به عنوان زیرگروهی از «متخصصین کامپیوتر»، با فرصتهای شغلیای مانند «دانشمند کامپیوتر»، «برنامه نویس» و «مدیر شبکه» دسته بندی کردهاست. BLS تمام مهندسین دیگر این شاخه علمی، که شامل مهندسین سختافزار کامپیوتر نیز هست، را بهعنوان «مهندسین» دسته بندی میکند.
1 - روش آبشاری (waterfall) :
این روش اولین روش مهندسی نرم افزار محسوب میشود و گاهی آنرا روش سنتی نیز مینامند. هر روش مهندسی معمولا شامل 5 پروسه اصلی است که عبارتند از آنالیز سیستم، طراحی سیستم، کدنویسی و اجرا، تست و تحویل و پشتیبانی . این 5 پروسه در روش آبشاری به ساده ترین شکل بیان میشوند. بدین ترتیب که هر فاز از پروسه ی کلی، انجام میشود و بعد فاز بعدی آغاز میشود. این روش در پروژه هایی کاربرد دارد که فاز اول که آنالیز است توسط مهندس نرم افزاری که کار تحلیل را بر عهده دارد کاملا شناخته شود و طراح کاملا نیازمندی های سیستم مربوطه را بداند تا در فاز بعدی بتواند طراحی معماری سیستم را آغاز کند. در عکس زیر نمودار عملیاتی روش آبشاری را مراجعه میکنید. گرچه در هر مرحله امکان برگشت به مرحله قبل گنجانده شده، اما این برگشت هزینه ی بسیاری را بر دوش تیم نرم افزاری میگذارد. زیرا هر تغییر در مرحله قبل، میتواند باعث شود تا پروژه در فاز بعدی نیازمند شروع از ابتدا باشد.
2 - روش افزایشی (Incremental):
این روش برای زمانی است که نیازمندی های نرم افزاری که باید نوشته شود تشخیص داده شده است ، اما امکان استفاده از روش رو به جلوی آبشاری وجود ندارد.به همین دلیل با ترکیب چند پروسه ی آبشاری، روش افزایشی ایجاد میشود. بطور مثال شما میخواهید یک نرم افزار مانند word بنویسید. در هر مرحله بخشی از نرم افزار را از آنالیز تا پیاده سازی و تست پیش می برید و بار بعدی امکانات جدیدی را در نظر میگیرید تا به نرم افزار اضافه کنید. امکانات ضروری تر در اولویت بالاتر اجرا قرار می گیرند.
3 - روش R.A.D :
این روش زیر مجموعه روش افزایشی است و بر روی چرخه ی کوتاه مدت تولید نرم افزار تاکید دارد. در این روش از برنامه نویسی با استفاده از کامپوننت های آماده بیشترین بهره را می بریم تا سرعت تحویل پروژه را افزایش دهیم . معمولا پروژه هایی با این روش اجرا میشوند که کمتر از 90 روز وقت می گیرند و برای افزایش سرعت از تیم های موازی نیز برای اجرا کمک میگیریم تا هر تیم بخشی از نرم افزار را اجرا کند و نهایتا آن بخش ها را با هم یکپارچه میکنیم. با توجه به اهمیت سرعت در این مدل ، افراد تیم باید همگی زبده باشند تا بتوانند بدون هدر رفتن وقت پروژه را در موعد مقرر تحویل دهند. همانطور که در تصویر زیر میبینید پروژه توسط چند تیم در حال پیشبرد است:
4 - روش الگویی (prototyping) :
این روش معمولا زمانی بکار گرفته میشود که مشتری مجموعه ای از نیازها را بیان میکند ، اما از ورودی و خروجی ها و الگوریتم های داخلی اش اطلاع کافی ندارد. با توجه به اینکه معمولا اولین نسخه ی هیچ نرم افزاری کامل نیست و نیازمند بازنگری است، این روش با چرخه ی تولید و تست خود باعت میشوند ایرادات نرم افزار استخراج و رفع شود. اما گاهی خارج شدن از این سیکل (با توجه به بالارفتن سطح توقع مشتری) سخت میشود.
5 - روش حلزونی (spiral) :
این روش ترکیبی از روش سیستماتیک آبشاری و روش prototyping است. در این روش نرم افزار طی چندین نسخه ی ارائه شده به تکامل می رسد. در هر مرحله ریسک های پروژه با جزئیات بررسی میشوند. همانطور که درنمودار زیر میبینید، کلیه ی مراحل انجام پروژه در هر گردش در سایز بزرگتری اجرا میشوند.
6 - روش مهندسی همزمان (concurrent development) :
این روش شامل یکسری فاز اجرایی است. هر فاز خود شامل یکسری وضعیت (state) است. هر یک از اینstate ها بر اساس event هایی که برایشان تعریف میکنیدم تغییر میکنند و به وضعیت دیگری می روند. در عکس زیر بخش آنالیز را در این مدل مهندسی مشاهده میکنید. اگر در موقعیت development باشیم و تغییری در نیازمندی های تعریف شده توسط مشتری ایجاد شود، به وضعیت awaiting changes می رویم. زیرا تغییراتی در ساختار پروژه ایجاد شده که میتواند منجر به تغییر در فاز development شود. این روش معمولا برای نرم افزارهایی که بصورت کلاینت سروری کار میکنند بکار می رود.
علاوه بر مدل های مهندسی نرم افزار فوق، روش های دیگری مانند XP ، Clean Room ، component-based ، Agile و غیره وجود دارند. که هر یک در جای خود قابل استفاده هستند. اما روش های فوق متداول ترین مدل هایی هستند که بکار گرفته میشوند.
برنامه نویسی :
برنامهنویسی رایانه در فرهنگ واژه غیر متخصصین ممکن است به تمام پروژه ساخت نرمافزار یا برنامهٔ رایانهای گفته شود. با این همه برنامهنویسی تنها بخشی از فرآیند توسعه نرمافزار یا برنامه رایانهای است. اهمیت، توجه و منابع اختصاص داده شده به برنامهنویسی، بسته به ویژگیهای مشخص شده محصول و خواست افراد درگیر در پروژه و کاربران و در نهایت شیوهٔ انتخاب شده مهندسی نرمافزار متغیر است.
برنامهنویسی کامپیوتر (که اغلب در انگلیسی programming یا coding گفته میشود) فرآیند نوشتن، اشکال زدایی(debug) و نگهداری کد منبع (source code) برنامه کامپیوتر میباشد. این کد منبع با یک زبان برنامه نویسی نوشته شده است. این کد منبع ممکن است تغییر داده شده یک کد قبلی و یا یک کد کاملا جدید باشد. هدف برنامه نویسی ساختن یک برنامه میباشد که یک رفتار خواسته شده را به نمایش بگذارد.
تاریخچه
موضوع دستگاههایی که به دنبالهای از دستورالعملهای از قبل تعریف شده عمل میکند بر میگردد به Greek Mythology.
برنامه نویسی مدرن
الزامات کیفیت
پیچیدگی الگوریتم
متدولوژی (روش شناسی)
اندازه گیری کاربرد زبان
تعیین اینکه محبوبترین زبان برنامه نویسی مدرن کدام است کار بسیار مشکلی است. بعضی از زبانها در کاربردهای خاصی محبوب است و بعضی دیگر مرتبا در نوشتن کاربردهای گوناگون استفاده میشود. روشهای اندازه گیری محبوبیت زبان شامل موارد زیر میباشد : شمردن تعداد آگهیهای اشتغال و توجه به یک زبان، تعداد کتابهای آموزشی فروخته شده در مورد یک زبان، تخمین تعداد خطوط کد نوشته شده در یک زبان
اشکال زدایی
اشکال زدایی وظیفه بسیار مهمی در فرآیند توسعه نرمافزار میباشد، زیرا یک برنامه غلط میتواند پیامدهای مهمی برای کاربر خود داشته باشد. بعضی از زبانها بیشتر در معرض برخی اشتباهات میباشند، به خاطر خصوصیاتشان نیاز به بررسی بیشتر کامپایلر نسبت به زبانهای دیگر ندارند.
زبان برنامهنویسی
اجرا و عملی ساختن الگوریتمهای انتزاعی وابسته به هم بهوسیله تولید یک برنامه رایانهای مشخص با ابزار زبان برنامهنویسی ممکن است.
طراحی و برنامه نویسی تحت وب:
بسیاری از دانشجویان نرم افزار در حین تحصیل به یکی از رشته های زیرمجموعه نرم افزار علاقه مند میشوند و در آن رشته شروع به فعالیت میکنند. رشته هایی مانند هوش مصنوعی ، برنامه نویسی ، روباتیک ، طراحی وب و غیره.
این روزها بخصوص در ایران با توجه به نبود قانون کپی رایت، برنامه نویسی و تولید نرم افزار چندان طرفداری ندارد و این موضوع باعث گرایش دانشجویان به برنامه نویسی تحت وب شده است که بیشترین بازار کار را برای دانشجویان رشته نرم افزار فراهم میکند. اما این رشته جزئیات بسیاری را می طلبد که ممکن است در دانشگاه بعنوان یک درس مطرح نشوند و به دلیل گشترش بسیار سریع اینترنت و ظهور تکنولوژی های جدید ، دانشجو پس از فارغ التحصیلی با مفاهیمی از وب روبرو میشود که هرگز در دانشگاه با آنها برخورد نکرده است.
اگر شما هم برنامه نویسی تحت وب را بعنوان شغل خود انتخاب کرده اید نیازمند یادگیری تکنولوژی های بسیاری هستید که در هنگام ایجاد یک پروژه تحت وب با آن برخورد خواهید کرد و باید از آن تکنولوژی حداقل به میزانی که بتوانید به کارش ببندید، مطلع باشید. در این مقاله تعدادی از این تکنولوژی ها را معرفی خواهم کرد.
تکنولوژی های لازم برای شروع برنامه نویسی تحت وب:
--- زبان HTML :
این زبان برای چیدن اشیائی که روی صفحه وب مشاهده میکنید استفاده میشود. محل قرارگیری عکس هاف متون ، جداول ، لینک ها و هر چیزی که در یک صفحه وب مشاهده میکند با این کدها در کنار هم قرار می گیرند. و مرورگر با دریافت کدهای اچ تی ام ال آنها را تفسیر میکند و شکل کلی یک صفحه وب را به شما نشان می دهد. یک طراح و حتی برنامه نویس وب باید به زبان html آشنا باشد تا بتواند سرویس بهینه ای را طراحی کند. پس از اینکه این زبان را آموختید میتوانید از نرم افزارهایی مانند ExpressionWeb و DreamWeaver که کار ساختن کدهای HTML را انجام میدهند استفاده کنید و کار خود را به دوش آنها بیندازید. اما شما باید طرز استفاده از آنها را بدانید. اینکار مانند این است که ابتدا ضرب را بیاموزید و بعد از ماشین حساب استفاده کنید.
--- یک زبان برنامه نویسی تحت وب:
پیشنهاد ما بخصوص در ایران ASP.net و با استفاده از زبان پایهء C# است. گرچه دانستن زبانی مانند PHP هم میتواند موقعیت های شغلی خوبی را برای شما ایجاد کند.
--- طراحی بانک اطلاعاتی رابطه ای:
اولین چیزی که یک سایت بزرگ نیاز دارد یک بانک اطلاعاتی قدرتمند و بهینه شده است. شما باید اصول طراحی بانک های اطلاعاتی ، نرمال سازی در طراحی بانک های اطلاعاتی ، و سپس پیاده سازی را توسط یک بانک قدرتمند مانند SQL Server و یا MySQL بدانید تا بتوانید اولین قدم را در برنامه نویسی تحت وب بردارید.
--- آشنایی با وب :
شما نمی توانید ساختمانی مناسب بسازید، مگر اینکه قبلا ساختمان های متفاوتی را دیده باشید. ضعف بزرگی که بسیاری از مهندسین نرم افزار دارند، آشنا نبودن آنان با محیط اینترنت و دنیای مجازی است. برای حل این مشکلتان پیشنهاد میکنم یک وبلاگ درست کنید و مدتی وبلاگ نویس شوید و وبلاگ خوان . خواندن وبلاگ های متفاوت و آشنایی با سرویس های اینترنتی شما را با محیطی که قرار است در آن مشغول به ساخت و ساز شوید آشنا میکند.
شما بعنوان یک مهندس نرم افزار باید با سایت های اینترنتی زیادی آشنا باشید. هر سایت یک دیدگاه جدید در طراحی وب به شما میدهد. پیشنهاد میکنم برای شروع با سایتهایی مانند جیمیل، فلیکر، پرشین بلاگ، فرندفید ، یاهو360 ، پیکاسا ، یوتیوب، لست.اف.ام آشنا شوید. هرکدام از این سایتها یکی از برجهای افراشته شده در دنیای مجازی وب است. کم کم در وبلاگهایی که میخوانید با سایت های جدید آشنا خواهید شد. هنگام گشت و گذار در این سایت ها به معماری بکار رفته در طراحی آنها دقت کنید.
--- آشنایی با شبکه :
مفاهیمی در برنامه نویسی تحت وب هست که ممکن است در برنامه نویسی تحت ویندوز هرگز با آن مواجه نشوید. مفاهیمی مانند IP ، Server Configuration ، Browser Compatibility و صدها واژه و مفهوم دیگر که جزئی جدانشدنی از وب هستند. سعی کنید با مفاهیم شبکه ها ، پروتکل های وب مانند FTP و HTTP و تاریخچه ای از وب آشنا باشید. این اطلاعات نه تنها مفید بلکه برای برنامه نویسی تحت وب ضروری است.
نکاتی که در بالا ذکر شد برای شروع برنامه نویسی تحت وب است و برای اینکه بتوانید سایتهای بهینه و مفیدی طراحی کنید نیازمند تکنولوژی های روز دنیای وب هستید که در ادامه به تعدادی از آنها اشاره میکنم.
• CSS:
سی اس اس امکان تغییر گرافیکی صفحات وب را بسیار ساده میکند و دانستن آن کمک بسیاری به شما در طراحی سایت هایی میکند که امکان تغییر صفحات سایت را مانند تغییر قالب وبلاگ فراهم میکنند.
• جاوا اسکریپت :
این زبان اسکریپتی کاربرد بسیار زیادی در طراحی وب دارد و بسیاری از رویدادهای صفحات وب با استفاده از جاوا اسکریپت کنترل میشوند. نیازی نیست کل دستورات و نکات موجود در این زبان دا یاد بگیرید. اما باید دستورات ابتدایی و نوع بکاربردن آنها را بیاموزید تا بعدها بتوانید از سورسهای آمادهء جاوا اسکریپتی در پروژه هایتان استفاده کنید.
• آجاکس :
احتمالا یک اکانت جیمیل دارید. آیا سرعت حذف نامه ها را در این سرویس با سایت های دیگه مقایسه کرده اید؟ گاهی کمتر از نیم ثانیه. جیمیل یکی از سایت هایی است که خیلی زود و درست از تکنولوژی آجاکس استفاده کرد ، امروزه بسیاری از سایت ها از این روش برای بالابردن سرعت لود صفحات سایت خود استفاده میکنند و حتی سایت های ایرانی نیز از اجاکس برای طراحی بهره می برند.
• XML:
فایل های XML برای ذخیره و بازیابی اطلاعات حجیم در سرویس های تحت وب استفاده بسیاری دارند. همچنین گاهی شما مجبورید بخشی از اطلاعات موجود در بانک اطلاعاتی را در فایل XML ذخیره کنید تا باری که روی دوش بانک اطلاعاتی است کاهش یابد. XML در این زمینه بهترین انتخاب است.
• Regular Expressions:
یا عبارات منظم برای خواندن و بازیابی اطلاعات از میان فایل های متنی مانند XML و یا صفحات وب سایتها قدرت بسیاری را در دستان شما قرار می دهند. ممکن است در طراحی سایت مورد نظر خود نیازمند استخراج اطلاعات از روی یک سایت دیگر باشید. اگر سایت مورد نظر فید نداشته باشد، میتوانید با استفاده از R.E ها اینکار را انجام دهید.
• Security :
وقتی شما یک سایت را طراحی میکند و روی اینترنت قرار میدهید مانن این است که یک ساختمان را که با چوب کبریت ساخته اید در مقابل باد قرار دهید. همیشه هکر ها و رقبایی هستند که با نیت های گوناگون دنبال ضربه زدن به سایت شما هستند . بنابراین بخش مهمی از آموزش های خود را به آموزش امن کردن سایت های اینترنتی و برنامه ای که نوشته اید اختصاص دهید.
• Stored Prcedure Programming :
برای اتصال به بانک اطلاعاتی از طریق برنامه ای که نوشته اید چندین راه وجود دارد. شما میتوانید فرمان های SQL را در داخل صفحات وبی که ایجاد کرده اید بنویسید. اما این راه نه تنها امن نیست، بلکه سرعت و قابلیت های برنامه شما را کاهش میدهد. برای نوشتن دستورات SQL باید از بخش پروسیجر های SQL استفاده کنید. با اینکار، برنامه شما بسیار استاندارد تر نوشته شده و از امنیت بالاتری نسبت به حالت قبلی برخوردار میشود.
آنچه در این بخش معرفی شد مهم ترین تکنولوژی هایی هستند که شما را در طراحی سیستم های تحت وب یاری میکنند و پشتوانه شما برای انتخاب شغل آینده تان بعنوان یک برنامه نویس وب است. در راهی که انتخاب کرده اید با روش هایی برای کوتاه کردن پروسه های برنامه نویسی نیز آشنا میشوید مانند استفاده از سورس کدهای آماده ، کامپوننت ها و ...
همچنین سعی کنید از سایت های برنامه نویسی و طراحی در اینترنت بیشترین بهره را ببرید. بسیاری از تکنولوژی هایی که امروزه بصورت متداول در آمده است روزی بعنوان یک ایده در یک وبلاگ مطرح شده است.
فصل دوم
مهندسی معکوس در طراحی نرم افزار
کاربرد مهندسی معکوس در طراحی نرم افزار های رایانه ای :
به هر گونه تلاش و فعالیت در راستای رسیدن از مراحل بالاتر طراحی و تولید به یک یا چند مرحله پایینتر، مهندسی معکوس گویند. این مفهوم در تمامی شاخهها و زمینههای مهندسی از جمله نرمافزار و سختافزار مطرح است. برای مثال دستیابی به ایدهها و روشهای تولید یک محصول، از نمونه محصول نهایی نمونهای از مهندسی معکوس است. یکی از اهداف مهندسی معکوس، شناسایی اجزای سازنده یک محصول و روابط بین آنهاست که گاهی از آن اجزا برای ساخت یک محصول جدید نیز بهره گرفته میشود.
گاهی نیز بهمنظور ایجاد تغییرات در سیستمی است که طرح و اجزای اولیه آن در دسترس نیست. این کار که بهمنظور مطابقت سیستم جدید با خواستهها و نیازهای جدید صورت میگیرد، مهندسی دوباره (Reengineering) نیز نامیده میشود. همچنین با این کار میتوان مشکلات موجود در یک سیستم را ردیابی و بررسی کرد: طی بررسی یک سیستم میتوان به مستندسازی آن سیستم نیز پرداخت تا با ایجاد درک بهتر از سیستم در جهت بهبود آن گام برداشت.
البته باید توجه داشت که بهکارگیری فنون مهندسی معکوس در هر رشتهای، دشواریها و مشکلات خاص خود را دارد و به ابزار و امکانات خاصی نیاز دارد و گاهی با وجود کامل بودن ابزار و امکانات ممکن است نتیجه مطلوب نهایی حاصل نشود. بنابراین در بهکارگیری این فنون باید تمامی هزینهها و زمان مصرفی و نتیجه نهایی در نظر گرفته شوند. بهعبارتی باید توجه داشت که میزان هزینه مورد نظر در مقابل دسترسی به چه هدفی صرف میشود.
در ادامه تلاش خواهیم کرد که به چند مورد از کاربردهای مهندسی معکوس در شاخه نرمافزار اشارهای کوتاه داشته باشیم تا هدف از این شاخه از علم رایانه نیز تا حدی روش شود.
کشف رمزها و کدها
باید توجه داشت که از هر ابزاری میتوان در راه خوب یا بد استفاده کرد. این که شخص از مهارت خود و ابزارهای موجود استفاده نادرست کند، خود مسوول آن کار خواهد بود.
معمولا کشف کدها یا شکستن رمز، ذهن را به سمت اعمال غیرقانونی میبرد. کشف کدها و رمزها و کدهای یک نرمافزار بانک از جمله این موارد است. اما شکستن رمز همیشه بد و غیرقانونی نیست. اغلب اطلاعات رد و بدل شده بین مجرمان نیز رمزگذاری میشود و برای جلوگیری از فعالیت آنها، پلیس باید اطلاعات بهدست آمده از آنها را کشف رمز کند. باید توجه داشت که معمولا عمل رمزگشایی با استفاده از کلید صورت میگیرد و در صورت در دسترس نبودن کلید، ناچار به شکستن رمز یا کشف رمز هستیم. بنابراین خوب است در بهکارگیری این اصطلاحات دقت کنیم.
معمولا در شکستن رمزها از تکنیکهای مهندسی معکوس استفاده میشود. بدون استفاده از این تکنیکها اگر بخواهیم اقدام به کشف رمز کنیم،چارهای جز حدس، آزمون و خطا و یا بررسی کلیه حالتهای ممکن (Brute force) نخواهیم داشت که کار بس زمانگیر، دشوار و طاقتفرساست.
تغییر در کار یا ظاهر نرمافزار
ممکن است نرمافزاری در اختیار داشته باشیم که کدهای برنامهنویسی آن در دسترس ما نباشد و بخواهیم تغییرکوچکی در روند اجرای برنامه اعمال کنیم. همچنین ممکن است بخواهیم تغییری در ظاهر برنامه ایجاد کنیم. حتی برخی اوقات لازم است قابلیتهای جدیدی به یک نرمافزار اضافه شود و یا اشکالات موجود در آن رفع شوند. در کلیه این موارد نیز جز تکنیکهای مهندسی معکوس، راه دیگری نخواهیم داشت. اغلب این مسایل در مواقعی رخ میدهد که کد برنامه در دسترس نبوده و شرکت تولیدکننده نرم افزار نیز دیگر از آن پشتیبانی نمیکند.
یکی از این مشکلات، مشکل سال2000 (Y2K) بود که شاید آن را بهخاطر داشته باشید. این مشکل با آغاز هزار جدید بهوجود آمد و در آن زمان بسیاری از سازمانها و کاربران در حال استفاده از نرمافزارهایی بودند که شاید سالها با آن کار کرده بودند و مشکلات آن را رفع کرده و اطلاعات زیادی در آنها جمعآوری کرده بودند. بسیاری از این نرمافزارها بهعلت آن که قدیمی شده بودند، دیگر از جانب شرکت تولیدکننده، پشتیبانی نمیشدند و یا شرکتها بهطور کامل منحل شده بودند. اما همچنان برای آن سازمان پرکاربرد بودند. با مطرح شدن مشکل سال 2000، شرکتها و سازمانهای زیادی بار مالی زیادی را برای رفع این مشکل با استفاده از تکنیکهای مهندسی معکوس، متحمل شدند.
طراحی مجدد
یکی از کاربردها و زمینههای فعالیت برای مهندسی معکوس که بسیاری مفید است، طراحی مجدد یک نرمافزار بر اساس یک نمونه موجود است. این کار معمولا بهدلایل زیادی، از جمله تغییر سیستم عامل، صورت میگیرد و کاری بسیار پیچیده و دقیق است که معمولا بهصورت کار گروهی و توسط شرکتهای بزرگ انجام میشود.
مراحل این کار که به دو قسمت مهندسی معکوس و مهندسی مستقیم (Forward Engineering)تقسیم میشود، به این صورت است که ابتدا کلیه ایدهها و روشهای پیادهسازی نرمافزار مورد نظر تشخیص داده شده و سپس با توجه به اطلاعات بهدست آمده، نرمافزار جدیدی طراحی و پیادهسازی میشود. شاید این یکی از دشوارترین و مفیدترین زمینههای کار در مهندسی معکوس باشد.
مستندسازی
برای برنامهها و یا توابع کتابخانهای که بدون کد برنامهنویسی عرضه میشودند معمولا مستنداتی نیز وجود ندارد. مانند توابع محلی ویندوزNT که شامل چندین هزار تابع است که برای آنها جز چند صفحه اطلاعات ابتدایی، مستنداتی از سوی شرکت سازنده یعنی مایکروسافت ارایه نشده است. برای مستندسازی اینگونه برنامهها یا توابع نیز، تکنیکهای مهندسی معکوس چارهساز خواهند بود.
زبان و کامپایلر
پیش از هر چیزی، لازم است بدانیم، نرمافزاری را که میخواهیم بررسی کنیم با چه زبانی نوشته شده است و با چه کامپایلری به فایل اجرایی تبدیل شده است. معمولا کامپایلرها با روشهای بهخصوصی اقدام به ساخت فایلهای اجرایی میکنند. با توجه به آن روشها که در همه فایلهای اجرایی نیز یکسان است میتوان فهمید که آن برنامه با چه کارهایی ساخته شده است. البته بهدلیل آن که شناخت کامپایلرها و طریقه ساخت فایلهای اجرایی توسط هر کدام از آنها نیز مستلزم داشتن آگاهی و شناخت کافی از آنهاست، این کار با استفاده نرمافزارهای ویژهای انجام میشود. برنامههای بسیاری هستند که پس از اجرای آنها و انتخاب فایل اجرایی دلخواه، اطلاعات کاملی در مورد زبان برنامهنویسی، کامپایلر مورد نظر و حتی نگارش کامپایلر و اطلاعات مفید دیگر را در اختیارتان قرار میدهد. خوب است بدانیم که شناسایی نوع کامپایلر میتواند استراتژی ما را در مراحل بعد، کاملا تحت تاثیر قرار دهد. زیرا معمولا هر کامپایلر ساختار خاصی را برای مدیریت و سازماندهی کدها، دادهها و منابع در فایل اجرایی خاص خود در نظر میگیرد که با کامپایلرهای دیگر کاملا متفاوت است.
فایلهای وابسته
بسیاری از نرمافزارها و فایلهای اجرایی، بههنگام اجرا از کتابخانهها و فایلهایی استفاده میکنند که معمولا این فایلها با پسوند.dll شناخته میشوند. گاهی لازم است بدانیم که هرdll شامل چه توابعی است و یک فایل اجرایی در هنگام کار به کدام فایلها وابسته است و کدامیک را فراخوانی میکند. نرمافزارهایی وجود دارند که قادر هستند کلیه فایلهای مورد نیاز یک برنامه در هنگام اجرا را بهصورت چند سطحی تشخیص دهند، به این معنا که اگر یک فایل وابسته، خود به فایل دیگری نیز وابسته بود، آن را هم شناسایی کنند.
منابع بهکار رفته
یکی از اجزای مهم بهکار رفته در فایلهای اجرایی، به منابع (Resources) معروف هستند که در واقع دادههای از پیش تعریفشده را برای برنامه نگهداری میکنند. پنجرههای از پیش تعریفشده، آیکونها، تصاویر گرافیکی موجود در برنامه، رشتههای متنی، فایلهای صوتی و تصویری و ... از جمله منابع یک فایل اجرایی بهشمار میروند. یک برنامهنویس میتواند به هر تعداد و از نوع منبع به فایل ارجایی خود بیافزاید و در مهندسی معکوس میتوان این منابع را استخراج کرده یا تغییر داده و یا نمونه دیگری جایگزین کرد.
نرمافزارهای ویژهای هستند که میتوان با استفاده از آنها به منابع یک فایل اجرایی دسترسی پیدا کرد و آنها را مطابق میل خود تغییر داد و یا آنها را از دل فایل اجرایی بیرون کشید. با استفاده از همین برنامههاست که میتوان زبان منوها، پنجرههای و محیط برنامه را بدون دسترسی داشتن به کد برنامه تغییر داد. انواع نرمافزارهای فارسیساز با استفاده از همین تکنیکها طراحی میشوند
Disassemblerها
هر برنامه، مستقل از زبان برنامهنویسی آن به کد ماشین تبدیل میشود. حال اگر بخواهیم که ماشین را دوباره به کدهای زبان برنامهنویسی تبدیل کنیم، ممکن است این کار امکانپذیر نباشد. اما با توجه به اینکه هر دستور زبان ماشین معادل یک دستور زبان اسمبلی است، میتوان هر برنامهای را بهزبان اسمبلی برگرداند که این عمل را Disassemble یا عکس عمل اسمبل گویند. با این کار، اگر شخص بهقدر کافی به زبان اسمبلی مسلط باشد، میتواند هر تغییری در کد برنامه بدهد و مجددا آن را اسمبل کرده و فایل اجرایی جدید با اعمال تغییرات ایجاد کند. نرمافزارهای توانمندی هستند که میتوانند علاوه بر عمل disassemble ، امکانات بسیاری را برای اعمال تغییرات در فایل اجرایی در اختیار کاربران قرار دهند.
فعالیتهای فایل اجرایی
بهعنوان اطلاعات اولیه، شاید لازم باشد که بدانیم یک فایل اجرایی در زمان اجرا چه رفتاری از خود نشان میدهد و فعالیت آن چگونه است. بهعنوان مثال چه میزان حافظه اصلی را اشغال میکند و چه میزان از حافظه مجازی روی دیسک را به خود اختصاص میدهد یا در زمان اجرا تا چه حد از توان پردازنده را در اختیار خود میگیرد. این اطلاعات و بسیاری اطلاعات دیگر، از جمله مواردی هستند که میتوان در زمان اجرا، از یک فایل اجرایی کسب کرد. برای این کار نیز نرمافزارهای متنوعی وجود دارند. سادهترین ابزار موجود در این زمینه Task Manager موجود در ویندوز است که تا حدی، اطلاعات مفیدی در مورد برنامههای در حال اجرا در اختیار کاربران قرار میدهد.
ورودی و خروجی
بیشتر برنامهها عمل ورودی و خروجی روی فایل دارند. یعنی یا از فایل خواند یا بر روی آن مینویسند. اطلاعات مربوط به این فعالیتها نیز ممکن است در جایی لازم باشد.
نرمافزارهایی وجود دارند که بهمحض اجرای یک برنامه، تمامی فعالیتهای ورودی و خروجی مربوط به فایل آن را تحت نظارت و کنترل قرار میدهند. با استفاده از اینگونه نرمافزارها میتوان اطلاعات ارزشمندی در مورد این نوع فعالیت فایلهای اجرایی نیز کسب کرد.
فعالیت در رجیستری و شبکه
دو نوع فعالیت دیگر وجود دارد که در حوزههای جداگانه بررسی میشوند و میتوانند اطلاعات خوبی در اختیار کار برقرار دهند و یکی تاثیرات که یک فایل اجرایی در رجیستری ویندوز اعمال میکند و دیگری ارتباطات و اتصالهایی که برنامه با شبکه و اینترنت برقرار میکند. در این زمینهها نیز نرمافزارهایی وجود دارند که کلیه کارهای یک برنامه را برای تغییر دادن رجیستری در نظر میگیرد و میتوان با بررسی آن به رفتارهای فایل اجرایی پی برد. برنامههایی نیز تحت عنوان کلیNetwork monitor هستند که کلیه اتصالها، نوع اتصال و پروتکل بهکار رفته در آن و دیگر جزییات مربوط به ارتباطات و شبکه را کنترل میکنند.
ارتباطات سختافزاری
و بالاخره یک فایل اجرایی ممکن است در طول اجرا با سختافزارهای مختلف و درگاهها، تبادل اطلاعات و ارسال و دریافت داده داشته باشد. ارتباط با درگاههای سریال، موازی، USB و ... . ارسال اطلاعات به نمایشگر و تبادل اطلاعات با دیسکها و درایوها و دیگر لوازم جانبی رایانه از جمله مواردی هستند که میتوانند در بررسی رفتار یک فایل اجرایی و کسب اطلاعات اولیه در گام اول مهندسی معکوس موثر واقع شوند.
اگر سابقه ی صنعت و چگونگی رشد آن در کشورهای جنوب شرقی آسیا را مورد مطالعه قرار دهیم به این مطلب خواهیم رسید که در کمتر مواردی این کشورها دارای ابداعات فن آوری بوده اند و تقریباً در تمامی موارد، کشورهای غربی (آمریکا و اروپا) پیشرو بوده اند. پس چه عاملی باعث این رشد شگفت آور و فنی در کشورهای خاور دور گردیده است؟در این نوشتار به یکی از راهکارهای این کشورها در رسیدن به این سطح از دانش فنی می پردازیم.
در صورتی که به طور خاص کشور ژاپن را زیر نظر بگیریم، خواهیم دید که تقریباً تمامی مردم دنیا از نظر کیفیت، محصولات آنها را تحسین می کنند ولی به آنها ایراد می گیرند که ژاپنی ها از طریق کپی برداری از روی محصولات دیگران به این موفقیت دست یافته اند.این سخن اگر هم که درست باشد و در صورتی که کپی برداری راهی مطمئن برای رسیدن به هدف باشد چه مانعی دارد که این کار انجام شود.این مورد، به خصوص درباره ی کشورهای در حال توسعه ویا جهان سوم به شکاف عمیق فن آوری بین این کشورها و کشورهای پیشرفته دنیا، امری حیاتی به شمار می رود و این کشورها باید همان شیوه را پیش بگیرند(البته در قالب مقتضیات زمان و مکان و سایر محدودیت ها) به عنوان یک نمونه، قسمتی از تاریخچه ی صنعت خودرو و آغاز تولید آن در ژاپن را مورد بررسی قرار می دهیم:
تولید انبوه خودرو در ژاپن قبل از جنگ جهانی دوم ودر سال 1920 بوسیله ی کارخانه ها "ایشی کاواجیما" آغاز شد که مدل ژاپنی فورد آمریکایی را کپی کرده و به شکل تولید انبوه به بازار عرضه نمود.
همچنین شورلت ژاپنی AE جزو اولین خودرو های کپی شده آمریکایی توسط ژاپنی ها بود که به تعداد زیاد تولید می شد. سپس با تلاش های فراوانی که انجام شد(آنهم در شرایط بحرانی ژاپن در آن دوره) مهمترین کارخانهی خودرو سازی ژاپن یعنی "تویوتا" درسال 1932 فعالیت خود را با ساخت خودرویی با موتور "کرایسلر" آغاز نمود ، در سال 1934، نوع دیگری از خودرو را با موتور"شورلت" ساخته و وارد بازار نموده و از سال 1936، اولین تلاش ها برای ساخت خودروی تمام ژاپنی آغاز شد. البته تا مدت ها ژاپنی ها مشغول کپی برداری از اتومبیل های آمریکایی و اروپایی بودند.
آنها خودروی پاکارد و بیوک آمریکایی و رولزرویس، مرسدس بنز و فیات اروپایی را نیز تولید کردند که همین تولیدها زمینه ساز گسترش فعالیت خودروسازی ژاپن شد و سرانجام در دهه ی 1960 میلادی پس از سعی و کوشش فراوان ، اولین اتومبیل تمام ژاپنی که ضمنا دارای استاندارد جهانی بود، تولید و به بازار عرضه شد.
در تمامی مطاب فوق رد پای یک شگرد خاص و بسیار مفید به چشم می خورد که "مهندسی معکوس"(Reverse Engineering ) نام دارد.
مهندسی معکوس روشی آگاهانه برای دستیابی به فن آوری حاضر و محصولات موجوداست. در این روش، متخصصین رشته های مختلف علوم پایه و کاربردی از قبیل مکانیک، فیزیک و اپتیک، مکاترونیک، شیمی پلیمر، متالورژی،الکترونیک و ...جهت شناخت کامل نحوه ی عملکرد یک محصول که الگوی فن آوری مذکور می باشد تشکیل گروه های تخصصی داده و توسط تجهیزات پیشرفته و دستگاه های دقیق آزمایشگاهی به همراه سازماندهی مناسب تشکیلات تحقیقاتی و توسعه های R&D "سعی در به دست آوردن مدارک و نقشه های طراحی محصول فوق دارند تا پس از مراحل نمونه سازی (Prototyping) و ساخت نیمه صنعتی (Pilot plant) در صورت لزوم ، تولید محصول فوق طبق استاندارد فنی محصول الگو انجام خواهد شد . همان گونه که اشاره شد استفاده از روش مهندسی معکوس برای کشورهای در حال توسعه یا عقب مانده روش بسیار مناسبی جهت دسترسی به فن آوری ، رشد و توسعه ی آن می باشد. این کشور ها که در موارد بسیاری از فن آوری ها در سطح پایینی قرار دارند، در کنار روش ها و سیاست های دریافت دانش فنی، مهندسی معکوس را مناسب ترین روش دسترسی به فن آوری تشخیص داده و سعی می کنند با استفاده از روش مهندسی معکوس، اطلاعات و دانش فنی محصولات موجود ، مکانیزم عمل کرد و هزاران اطلاعات مهم دیگر را بازیابی کرده و در کنار استفاده ار روش های مهندسی مستقیم (Forward Engineering) و روش های ساخت قطعات ، تجهیزات ، تسترهای مورد استفاده در خط مونتاژ و ساخت مانند قالب ها ،گیج و فیکسچر ها و دستگاههای کنترل، نسبت به ایجاد کارخانه ای پیشرفته و مجهز جهت تولید محصولات فوق اقدام نمایند. همچنین ممکن است مهندسی معکوس، برای رفع معایب و افزایش قابلیت های محصولات موجود نیز مورد استفاده قرار می گیرد. به عنوان مثال در کشور آمریکا ، مهندسی معکوس توسط شرکت "جنرال موتور" بر روی محصولات کمپانی "فورد موتور" و نیز برعکس، برای حفظ وضعیت رقابتی و رفع نواقص محصولات به کار برده شده است.
بسیاری از مدیران کمپانی های آمریکایی، هر روز قبل از مراجعت به کارخانه، بازدیدی از جدیدترین محصولات عرضه شده در فروشگاه ها و نمایشگاه های برگزار شده انجام داده و جدیدترین محصولات عرضه شده مربوط به محصولات کمپانی خود را خریداری نموده و به واحد تحقیق و توسعه R&D تحویل می دهند تا نکات فنی مربوط به طراحی وساخت محصولات مذکور و آخرین تحقیقات ، هر چه سریع تر در محصولات شرکت فوق نیز مورد توجه قرار گیرد.
جالب است بدانید که مهندسی معکوس حتی توسط سازندگان اصلی نیز ممکن است به کار گرفته شود . زیرا به دلایل متعدد، نقشه های مهندسی اولیه با ابعاد واقعی قطعات (مخصوصا زمانی که قطعات چندین سال پیش طراحی و ساخته و به دفعات مکرر اصلاح شده اند)مطابقت ندارد برای مثال جهت نشان دادن چنین نقشه هایی با ابعاد واقعی قطعات و کشف اصول طراحی و تلرانس گذاری قطعات، بخش میکروسویچ شرکتHonywell از مهندسی معکوس استفاده نموده و با استفاده از سیستم اندازه گیری CMM (Coordinate Measuring Machine) با دقت و سرعت زیاد ابعاد را تعیین نموده و به نقشه های مهندسی ایجاد شده توسط سیستم CAD منتقل می کنند.
متخصصین این شرکت اعلام می دارند که روش مهندسی معکوس و استفاده از ابزار مربوطه، به نحو موثری زمان لازم برای تعمیر و بازسازی ابزارآلات ، قالب ها و فیکسچرهای فرسوده را کم می کند و لذا اظهار می دارند که "مهندسی معکوس زمان اصلاح را به نصف کاهش میدهد."
مهندسین معکوس، اضافه بر اینکه باید محصول موجود را جهت کشف طراحی آن به دقت مورد مطالعه قرار دهند، همچنین باید مراحل بعد از خط تولید یعنی انبارداری و حمل و نقل را از کارخانه تا مشتری و نیز قابلیت اعتماد را در مدت استفاده ی مفید مورد تجزیه و تحلیل قرار دهند. چرا که مثلا فرایند آنیلینگ مورد نیاز قطعه،ممکن است برای ایجاد مشخصات مورد نظر در هنگام عمل کرد واقعی محصول یا در طول مدت انبارداری و حمل و نقل طراحی شده و لزوم وجود آن تنها در هنگام اجرای مراحل مذکور آشکار خواهد شد.
چه بسا که بررسی یک پیچ بر روی سوراخی بر بدنه ی محصول(که به قطعات و اجزای دیگر متصل نشده) ، متخصصان مهندسی معکوس را ماه ها جهت کشف راز عملیاتی آن به خود مشغول کند، غافل از اینکه محل این پیچ، امانم جهت تخلیه ی هوا، تست آب بندی یا امکان دسترسی به داخل محصول جهت تست نهایی می باشد. از سوی دیگر مهندسین معکوس باید عوامل غیر مستقیمی را که ممکن است در طراحی و تولید محصول مذکور تاثیر بگذارند، را به دقت بررسی نمایند. به دلیل اینکه بسیاری از این موارد با توجه به خصوصیات و مقتضیات زمانی و مکانی ساخت محصول مورد نظر، توسط سازندگان اصلی توجیه پذیر باشد اما ماجرای آن به وسیله ی مهندسین معکوس فاجعه ساز باشد. مثلا فرایند تولید قطعات تا حدود قابل توجهی بستگی به تعداد محصولات مورد نیاز و ... دارد . اگر تعداد محصولات مورد نیاز جهت کشور ثانویه در بسیار کمتر از کشور اصلی که در حد جهانی و بینالمللی فعالیت نموده ، باشد پس به عنوان مثال تعیین فرایند یک قطعه با باکالیتی (نوعی مواد پلیمری) از طریق ساخت قالب های چند حفره ای با مکانیزم عملکرد خود کاربا توجه به معضلات پخت قطعه در داخل قالب ، می تواند برای مجریان مهندسی معکوس فاجعه ساز باشد ( اگر که این مهندسان از فرایند های ساده تر با توجه به تیراژ تولید محصول و نیز خصوصیات تکنولوژیکی کشور خود استفاده نکنند.) بنابراین، مرحله بعد از کشف طراحی، تطبیق طراحی انجام شده بر مقتضیات زمانی و مکانی کشور ثانویه میباشد که باید به دقت مورد توجه متخصصین مهندسی معکوس واقع شود.
خلاصه اینکه مهندسی معکوس ممکن است یک کاربرد غیر معقول و نامناسب از کاربرد هنر و علم مهندسی به نظر برسد، اما آن یک حقیقت از زندگی روزمره ی ما به شمار می رود.
دسته بندی ابزارهای اصلی مورد استفاده در معکوس سازی
1 - hex editor
2 - debugger
3 - disassembler
4 - decompiler
5 - patcher
6 - compressorفشرده ساز
7 - analyzerتحلیل گر
8 - monitoring tools
9 - protector
Hex Editor
از جمله editorهایی مانند notepad یا Tex pad محسوب می شود و تنها تفاوت آن با editorهای معمولی در آن است که محتویات فایل را به صورت hexadecimal(در مبنای 16) نمایش می دهد و امکان تغییر در محتویات فایل یا search کردن و... را به صورت های binary یا در hexadecimal یا ASII را فراهم می آورد. همچنین از جمله کارهای دیگری که hex editor ها انجام می دهند، امکان تبدیل از مبنای 16 به مبنای 2 و ... اطلاعات است.
در حال حاضر به عنوان یک ابزار مهم در روند و فرایند معکوس سازی ، hex editor های بسیار متنوعی وجود دارند که از مشهورترین آنها می توان به hiew یا Win Hex یا Hack man و یا hex workshop اشاره کرد. همچنین برخی hex editorها مثل Win Hex یا HackMan و یا hex workshop، امکاناتی مانند انجام محاسبات آماری بر روی داده های یک فایل و یا امکان encrypt یا decrypt کردن فایل ها و یا
دانلود مقاله بررسی سبک ها و الگوهای مهندسی نرم افزار