ساخت و توسعه نرم افزار (Software development)
آبان ۲۷, ۱۳۹۷رایانه یا کامپیوتر چیست و چه تحولی در زندگی بشر ایجاد کرد؟
آبان ۲۷, ۱۳۹۷برنامه نویسی کامپیوتر عبارت است از فرآیند طراحی و ساخت یک برنامه کامپیوتری قابل اجرا برای انجام یک وظیفه رایانشی مشخص.
برنامه نویسی شامل کارهایی از قبیل تحلیل، تولید الگوریتم ها، زیرنظر گرفتن دقت الگوریتم ها و مصرف منابع سیستم توسط آن ها و پیاده سازی الگوریتم ها به یک زبان برنامه نویسی انتخابی( که اغلب به آن کد نویسی گفته می شود). کد منبع یک برنامه به یک یا چند زبان برنامه نویسی نوشته می شود. هدف برنامه نویسی، یافتن مجموعه ای از دستور ها است که فرآیند انجام یک کار یا حل یک مسئله را به صورت خودکار در می آورد. بنابراین، فرآیند برنامه نویسی اغلب به تخصص و مهارت در چند زمینه دیگر، شامل دانش در زمینه دامنه کاربرد، الگوریتم های مخصوص و منطق رسمی نیاز دارد.
کار های لازم برای برنامه نویسی شامل تست نرم افزار، اشکال زدایی(دیباگ کردن) آن، نگهداری از کد منبع برنامه، پیاده سازی سیستم Buildها و مدیریت مصنوعات مشتق شده مانند کد ماشین برنامه های کامپیوتری است. این کار ها را می توان به عنوان بخشی از فرآیند برنامه نویسی نیز در نظر گرفت اما اغلب از عبارت توسعه نرم افزار برای توصیف این فرآیند بزرگ تر استفاده می شود و واژه هایی مانند برنامه نویسی، پیاده سازی یا کد نویسی اغلب برای خود فرآیند نوشتن کد منبع نرم افزار مورد استفاده قرار می گیرند. مهندسی نرم افزار تکنیک های مهندسی را با روش های توسعه نرم افزار ترکیب می کند.
تاریخچه برنامه نویسی کامپیوتر
دستگاه های قابل برنامه نویسی حداقل از سال ۱۲۰۶ قبل از میلاد وجود داشتند. در آن زمان ماشین خودکار الجَزَری از طریق گیره ها و دندانه هایش قابلیت برنامه ریزی شدن داشت و می توانست الگو ها و ریتم های مختلفی از طبل ها را بنوازد. در سال ۱۸۰۱ میلادی، دستگاه پارچه بافی ژاکارد می توانست با تغییر “برنامه”(مجموعه ای از کارت های مقوایی که سوراخ هایی بر روی آن ها پانچ شده بود)، بافت های مختلفی را تولید کند.
با این وجود، اولین برنامه کامپیوتری به سال ۱۸۴۳ میلادی بر می گردد. در این سال، ایدا لاولیس، ریاضی دان انگلیسی، الگوریتمی را منتشر کرد که می توانست دنباله ای از اعداد برنولی را محاسبه کند و برای ماشین تحلیلی چارلز بابیج نوشته شده بود.
در دهه ۱۸۸۰ میلادی، هرمن هولریت مفهوم ذخیره سازی داده ها به شکل قابل بازخوانی برای ماشین ها را ابداع کرد. در ادامه، اضافه شدن یک پنل کنترلی به ماشین حسابداری نوع یک او(مربوط به سال ۱۹۰۶) امکان برنامه ریزی آن برای انجام کار های مختلف را فراهم کرد و تا اواخر دهه ۴۰ میلادی، ماشین های حسابداری ثبت واحد مانند IBM 602 و IBM 604 و همچنین اولین کامپیوتر های الکترونیکی نیز به وسیله پنل های کنترلی به طور مشابه برنامه ریزی شدند. با این حال، با ابداع مفهوم کامپیوتر های ذخیره دستوری در سال ۱۹۴۹، هم برنامه ها و هم داده ها به یک طریق در حافظه کامپیوتر ذخیره و دست کاری می شدند.
زبان ماشین، زبان برنامه های اولیه به شمار می رفت که اغلب به شکل مجموعه دستورالعمل های یک ماشین خاص و به صورت دودویی نوشته می شدند. خیلی زود، زبان های اسمبلی توسعه یافتند. این زبان ها به برنامه نویس اجازه می دادند دستورالعمل ها را به صورت متن مشخص کرده(مانند ADD X و TOTAL)، برای هر کد عملیاتی علائم اختصاری تعریف کند و از اسامی معنا دار برای مشخص کردن ادرس استفاده کند. با این حال، به دلیل این که زبان اسمبلی چیزی بیشتر از علائم متفاوت برای یک زبان ماشین است، هر دو ماشین با مجموعه دستورالعمل های مختلف نیز دارای زبان های اسمبلی متفاوتی هستند.
زبان های سطح بالا به برنامه نویس اجازه می دهند که برنامه را به گونه ای بنویسند که از نظر قواعد نحوی غنی بوده و توانایی بیشتری برای انتزاع کد داشته باشد. به این ترتیب کد مورد نظر می تواند از طریق اعلان های گردآوری و الگوریتم جستجوی کاشف، توسط مجموعه دستورالعمل های مختلف ماشین مورد هدف قرار بگیرد. اولین کامپایلر برای یک زبان برنامه نویسی توسط گریس هاپر توسعه یافت. وقتی هاپر در سال ۱۹۴۹ برای کار بر روی UNIVAC عازم شد، ایده استفاده از کامپایلر ها را نیز با خود به همراه آورد. کامپایلر ها قدرت کامپیوتر ها را مهار کرده و با فراهم آوردن امکان تعریف محاسبات با استفاده از نوشتن یک فرمول از طریق نشانه گذاری میانوندی (برای مثال Y = X*2 + 5*X + 9)، برنامه نویسی را به کاری ساده تر تبدیل می کنند. Fortran، اولین زبان سطح بالا که به صورت گسترده مورد استفاده قرار گرفت، اجرای آن کاربردی بود و امکان انتزاع بلوک های قابل استفاده مجددی از کد ها را فراهم می کرد، در سال ۱۹۵۷ بیرون آمد و زبان های بسیار زیاد دیگری هم خیلی زود بعد از آن توسعه یافتند که به طور خاص می توان به COBOL که با هدف پردازش داده های تجاری توسعه یافته بود و Lisp که هدفش تحقیق در زمینه کامپیوتر بود، اشاره کرد. در سال ۱۹۵۱، بتی هولبرتون اولین تولیدکننده مرتب سازی ادغامی را که بر روی UNIVAC I اجرا می شد، توسعه داد. یک زن دیگر، به نام اَدل میلیکاس، که در UNIVAC کار می کرد، برنامه ای را توسعه داد که اولین نمونه از تولیدکننده های خودکار گزارش بود. ایده ساخت COBOL در سال ۱۹۵۹شکل گرفت. در این سال، ماری هاوِس که برای شرکت Burroughs کار می کرد، جلسه ای را تشکیل داد تا در مورد ساخت یک زبان مشترک کسب و کار بحث و گفتگو شود. او شش نفر، از قبیل گریس هاپر را به این جلسه دعوت کرد. هاپر در توسعه COBOL به عنوان یک زبان کسب و کار دخالت داشت و توانست برنامه ای “خود مستند ساز” تولید کند. نقش هاپر در توسعه COBOL به وسیله زبان برنامه نویسی خودش که FLOW-MATIC نام داشت، ایفا شد. در سال ۱۹۶۱، ژان سامت، FORMAC را توسعه داد و همچنین کتاب “زبان های برنامه نویسی: تاریخچه و مبانی” را منتشر کرد که تبدیل به مرجعی استاندارد در مورد زبان های برنامه نویسی شد.
در آن زمان، بیشتر برنامه ها هنوز هم با استفاده از کارت های پانچ شده مقوایی یا نوار های کاغذی پانچ شده وارد می شدند. در اواخر دهه ۶۰ میلادی، دستگاه های ذخیره داده و ترمینال های کامپیوتری به اندازه کافی ارزان شدند به طوری که امکان ساخت برنامه ها از طریق تایپ مستقیم در آن ها فراهم شد. زمانی که بتی هولبرتون در UNIVAC کار می کرد، کدی را تهیه کرد که امکان گرفتن ورودی های کیبورد را فراهم می کرد. در ادامه ویرایشگر های متنی توسعه یافتند که تغییر و تصحیح کد ها را به فرآیندی بسیار ساده تر از کارت های پانچی تبدیل کردند. در دهه ۶۰ میلادی، ماری کنت کِلِر دانشجوی تحصیلات تکمیلی در دانشگاه Dartmouth بود و بر روی توسعه زبان برنامه نویسی BASIC کار می کرد. در دهه ۷۰ میلادی، یکی از اولین زبان های برنامه نویسی شی گرا به نام Smalltalk توسط هفت برنامه نویس، شامل اَدل گلدبرگ، توسعه یافت. در سال ۱۹۸۵، رادیا پرلمن پروتکل درخت پوشا را توسعه داد تا بسته های اطلاعات شبکه، با بازده بالا مسیردهی شوند.
برنامه نویسی مدرن
فارغ از رویکرد مورد استفاده در برنامه نویسی، برنامه نهایی باید دارای یک سری خواص بنیادی باشد. در ادامه به چند مورد از مهم ترین این خواص اشاره می شود:
- قابلیت اطمینان: نتایج یک برنامه هر چند بار در میان درست هستند. این موضوع به درستی الگوریتم ها از نظر مفهومی و کمینه سازی خطا های برنامه نویسی، مثلا خطا در مدیریت منابع(سر ریز شدن بافر یا وضعیت رقابتی) و خطا های منطقی( مثل تقسیم به صفر یا خطای off by one) بستگی دارد.
- پایایی: یک برنامه چقدر خوب می تواند انتظار مشکلات ناشی از خطا( نه باگ ها) را داشته باشد. این مورد شامل وضعیت هایی مانند داده های غلط، نامناسب یا خراب، در دسترس نبودن منابع مورد نیاز مانند حافظه، خدمات سیستم عامل و اتصال به شبکه، خطای کاربر و قطع ناگهانی برق است.
- کاربرد پذیری: ارگونومی یک برنامه؛ یعنی میزان راحتی استفاده از برنامه توسط کاربر برای تحقق هدف مورد نظر برنامه و یا در برخی موارد تحقق هدفی متفاوت و غیر منتظره توسط برنامه. فارغ از سایر مشکلات، چنین مسائلی می تواند باعث موفقیت یا شکست برنامه شود. کاربردپذیری شامل بازه گسترده ای از المان های متنی، گرافیکی و گاهی اوقات سخت افزاری است که شفافیت، شهودی بودن، یکپارچگی و کامل بودن رابط کاربری یک برنامه را بهبود می بخشند.
- قابلیت انتقال: مجموعه سخت افزار ها و سیستم عامل هایی که کد منبع برنامه می تواند بر روی آن ها کامپایل یا تفسیر شده و اجرا شود. این موضوع به تفاوت امکانات برنامه نویسی که توسط پلتفرم های مختلف ارائه می شوند، بستگی دارد. از جمله این تفاوت ها می توان به منابع سخت افزاری و سیستم عامل، رفتار مورد انتظار سخت افزار و سیستم عامل، در دسترس بودن کامپایلر و گاهی اوقات کتابخانه های مخصوص به هر پلتفرم برای زبان برنامه نویسی کد منبع اشاره کرد.
- نگهداشت پذیری: میزان آسانی اصلاح یک برنامه کامپیوتری توسط توسعه دهندگان فعلی یا آتی آن به منظور بهبود عملکرد، شخصی سازی، بر طرف کردن باگ ها و حفره های امنیتی یا تطبیق با محیط های جدید. در این راستا، عملکرد مناسب در جریان مراحل اولیه توسعه نرم افزار می تواند بسیار حیاتی باشد. این خاصیت ممکن است به طور مستقیم برای کاربر نهایی ملموس نباشد اما می تواند به طرز چشمگیری سرنوشت یک برنامه را در بلند مدت تعیین کند.
- کارایی(عملکرد): معیاری از میزان منابعی از سیستم که توسط برنامه مصرف می شود(زمان پردازش، فضای حافظه، دستگاه های کند مانند دیسک ها، پهنای باند شبکه و تا حدی تعامل کاربر). هر چقدر این مصرف منابع کمتر باشد، بهتر خواهد بود. این مورد همچنین شامل مدیریت دقیق منابع، مثلا پاک کردن فایل های موقت و از بین بردن نشتی های حافظه است.
خوانایی کد منبع
در برنامه نویسی کامپیوتر، منظور از خوانایی، میزان آسانی درک هدف، جریان برنامه و عملکرد کد منبع توسط خواننده است. این موضوع بر جنبه هایی از کیفیت برنامه که در قسمت قبل ذکر شدند، از قبیل قابلیت انتقال، کاربرد پذیری و مهم تر از همه نگهداشت پذیری است.
خوانایی موضوعی مهم است زیرا برنامه نویسان به جای نوشتن کد منبع جدید، بیشتر وقت خود را صرف خواندن و تلاش برای درک و اصلاح کد منبع موجود می کنند. کد های ناخوانا اغلب منجر به وجود باگ در برنامه، پایین آمدن بازده و کد های تکراری می شود. تحقیقی در این زمینه به این نکته پی برد که چند تبدیل ساده برای افزایش خوانایی کد را کوتاه تر کرده و زمان لازم برای درک آن را به شدت کاهش می دهد.
تبعیت کردن از یک سبک برنامه نویسی منسجم اغلب باعث بهبود خوانایی می شود. با این حال، خوانایی تنها به سبک برنامه نویسی وابسته نیست. عوامل متعددی هستند که تاثیر چشمگیری بر توانایی کامپیوتر در کامپایل کردن کد و اجرای موثر آن ندارند، اما در زمینه خوانایی کد اهمیت پیدا می کنند. برخی از این عوامل عبارتند از:
- بلوک بندی متفاوت(فضای سفید و خالی)
- کامنت ها
- تبدیل قسمت های طولانی به قسمت های کوتاه تر
- قواعد نامگذاری برای اشیا( مانند متغیر ها، کلاس ها، فرآیند ها و…)
جنبه های ظاهری این کار(مانند تو رفتگی ها، رفتن به خط بعدی، هایلایت رنگی و موارد دیگر) اغلب به وسیله ویرایشگر کد منبع انجام می شوند اما از جنبه های محتوایی آن نمایانگر استعداد و مهارت های برنامه نویس هستند.
با هدف حل مشکلات مربوط به خوانایی، زبان های برنامه نویسی تصویری مختلفی نیز توسعه یافته اند که نگرش جدیدی را نسبت به ساختار کد و نمایش آن در پیش گرفته اند. محیط های یکپارچه توسعه نرم افزار(IDE) می خواهند تمامی این کمک ها را به صورت یکپارچه در بیاورند. تکنیک هایی مانند بازسازی کد می تواند خوانایی را افزایش دهد.
پیچیدگی الگوریتمی
برنامه نویسی کامپیوتر، چه در حیطه دانشگاهی و چه در کاربرد مهندسی عمدتا درگیر یافتن و پیاده سازی پر بازده ترین الگوریتم ها برای دسته خاصی از مسائل است. برای این منظور، الگوریتم ها اغلب با استفاده نماد O بزرگ، به مرتبه های مختلف تقسیم بندی می شوند. این نماد اغلب میزان مصرف منابع، مثلا زمان اجرا یا مصرف حافظه را نسبت به اندازه یک ورودی نشان می دهد. برنامه نویس های خبره اغلب با انواع مختلفی از الگوریتم های شناخته شده و پیچیدگی های هر کدام آشنا هستند و از این دانش برای انتخاب مناسب ترین الگوریتم ها برای شرایط مسئله، استفاده می کنند.
مثال: الگوریتم های شطرنج
“برنامه نویسی یک کامپیوتر برای شطرنج بازی کردن” نام یک مقاله علمی مربوط به سال ۱۹۵۰ است که الگوریتم بیشینه کمینه(minimax) که بخشی از تاریخچه پیچیدگی الگوریتمی محسوب می شود را ارزیابی می کرد. درسی در مورد کامپیوتر شطرنج باز دیپ بلو، مربوط به شرکت IBM نیز جز برنامه درسی دانشجویان دانشگاه استنفورد به شمار می رود.
روش ها
اولین قدم در بیشتر فرآیند های معمول توسعه نرم افزار، تحلیل نیازمندی ها است. مراحل بعدی شامل آزمایش به منظور تعیین مدل مقادیر، پیاده سازی و در نهایت حذف مشکلات(دیباگ کردن) است. برای هر کدام از کار های ذکر شده، رویکرد های مختلفی وجود دارد. یکی از رویکرد های محبوب برای تحلیل نیازمندی ها، تحلیل مورد استفاده(Use Case) است. بسیاری از برنامه نویسان از شکل های مختلفی از روش های توسعه نرم افزاری چابک استفاده می کنند که در آن مراحل مختلف توسعه نرم افزار به صورت یکپارچه در آمده و به شکل چرخه های کوتاهی در می آیند که به جای سال ها طول کشیدن، تنها چند هفته طول خواهند کشید. رویکرد های مختلفی برای فرآیند توسعه نرم افزار وجود دارد.
روش های مدلسازی محبوب شامل تحلیل و طراحی شی گرا(OOAD) و معماری مدل مبنا(MDA) است. زبان مدلسازی یکپارچه(UML)، زبانی است که برای OOAD و MDA به کار می رود.
روشی مشابه که برای طراحی بانک های اطلاعاتی مورد استفاده قرار می گیرد مدل موجودیت-رابطه(ER) است.
روش های پیاده سازی شامل زبان های ضروری(شی گرا یا رویه ای)، زبان های تابعی و زبان های منطقی است.
اندازه گیری کاربرد زبان ها
تعیین محبوب ترین زبان های برنامه نویسی مدرن کاری بسیار سخت است. روش های اندازه گیری میزان محبوبیت زبان های برنامه نویسی شامل این موارد است: ۱- شمردن تعداد آگهی های شغلی که به زبان مورد نظر اشاره می کنند ۲-تعداد کتاب های فروخته شده و کلاس های برگزار شده برای آموزش آن زبان( این روش باعث می شود تا محبوبیت زبان های جدید بیشتر از حد واقعی به نظر برسند) ۳- تخمین تعداد خط های کد موجود به زبان مورد نظر( این روش تعداد کاربران زبان های کسب و کار مانند COBOL را کمتر از حد واقعی تخمین می زند).
برخی از زبان ها برای کاربرد های خاص، بسیار محبوب هستند در حالی که برخی دیگر از زبان ها به صورت متداول برای نوشتن برنامه های با کاربرد های مختلف استفاده می شوند. برای مثال COBOL هنوز در مراکز داده شرکت ها و بر روی کامپیوتر های Main frame آن ها استفاده می شود. Fortran هنوز در کاربرد های مهندسی، زبان های اسکریپت نویسی در توسعه وب و C در نرم افزار سیستم های نهفته مورد استفاده قرار می گیرند. در ساخت و استفاده بسیاری از کاربرد ها از ترکیب چندین زبان استفاده می شود. زبان های جدید اغلب حول قواعد نحوی زبان های قبلی طراحی می شوند اما کاربرد های جدیدی را اضافه می کنند(مثلا C++ شی گرایی را به C اضافه می کند یا Java مدیریت حافظه و بایتکد را به C++ اضافه می کند. اما در نتیجه این کار، بازدهی خود و قابلیت دستکاری سطح پایین را از دست می دهد).
عیب زدایی(دیباگینگ)
عیب زدایی یکی از بخش های مهم در فرآیند توسعه نرم افزار است زیرا وجود نقص در برنامه می تواند پیامد های چشمگیری را برای کاربران برنامه در پی داشته باشد. برخی زبان ها بیشتر در معرض برخی خطا ها قرار می گیرند زیرا خصوصیات آن ها، کامپایلر ها را به اندازه سایر زبان ها ملزم به اجرای بررسی های متعدد نمی کند. استفاده از ابزار تحلیل ایستای کد می تواند در تشخیص برخی از مشکلات کمک کند. عموما اولین قدم در عیب زدایی، تلاش برای تولید اشکال است. این کار می تواند دشوار باشد( مثلا در مورد فرآیند های موازی یا باگ های نرم افزاری غیرعادی). همچنین، محیط کاربری مشخص و تاریخچه استفاده نیز می توانند باعث دشواری در بازتولید مشکل شوند.
پس از این که باگ مجددا تولید شد، ممکن است لازم باشد تا ورودی مسئله ساده سازی شود تا فرآیند عیب زدایی آسان تر انجام شود. برای مثال، وجود یک باگ در کامپایلر می تواند باعث متوقف شدن آن در جریان بررسی فایل های منبع بزرگ شود. با این وجود، پس از ساده سازی مورد آزمایش، تنها چند خط از فایل منبع اولیه می تواند برای تولید مجدد مشکل ذکر شده کافی باشد. چنین ساده سازی هایی را می توان به صورت دستی و با استفاده از رویکرد تقسیم و غلبه انجام داد. در این روش، برنامه نویس تلاش خواهد کرد تا بخش هایی از مورد آزمایش را حذف کرده و بررسی کند که آیا مشکل مورد نظر هنوز هم وجود دارد یا خیر. در هنگام عیب زدایی یک مشکل در رابط کاربری گرافیکی، برنامه نویس تلاش خواهد کرد تا برخی از تعاملات کاربری در مشکل اولیه را رد کرده و ببیند آیا عمل های باقی مانده برای ظاهر شدن باگ ها کافی هستند یا خیر.
عیب زدایی اغلب با کمک IDE هایی مانند Eclipse، Visual Studio، Xcode، Kdevelop، NetBeans و Code::Blocks انجام می گیرد. دیباگر های مجزا مانند GDB نیز گاهی اوقات مورد استفاده قرار می گیرند. این دیباگر ها اغلب محیطی کمتر تصویری و بیشتر به شکل خط فرمان دارند. برخی از ویرایشگر های متن مانند Emacs به GDB اجازه می دهند تا از طریق آن ها وارد عمل شود و از این طریق محیطی تصویری را برای آن فراهم می کنند.
زبان های برنامه نویسی
زبان های مختلف برنامه نویسی از سبک های مختلف برنامه نویسی(که به آن پارادایم های مختلف برنامه نویسی نیز گفته می شود) پشتیبانی می کنند. انتخاب زبان مورد استفاده به موارد مختلفی مانند سیاست های شرکت، مناسب بودن برای هدف برنامه، در دسترس بودن بسته های شخص ثالث و یا سلیقه شخصی بستگی دارد. در حالت ایده ال، مناسب ترین زبان برنامه نویسی برای کاربرد مورد نظر، انتخاب خواهد شد. مسائلی که باعث فاصله گرفتن از این حالت ایده آل می شوند شامل یافتن تعداد کافی از برنامه نویسانی که زبان مورد نظر را بدانند، در دسترس بودن کامپایلر های مناسب برای زبان مورد نظر و بازده اجرای برنامه در یک زبان مشخص هستند. زبان های برنامه نویسی در طیفی تقریبی قرار می گیرند که از سطح پایین شروع شده و تا سطح بالا ادامه دارد. زبان های سطح پایین اغلب ماشین محور تر هستند و اجرای آن ها سریع تر است در حالی که زبان های سطح بالا خلاصه تر بوده و استفاده از آن ها آسان تر است اما اجرای آن ها کمی بیشتر طول می کشد. به طور کلی برنامه نویسی به زبان های سطح بالا آسان تر از زبان های سطح پایین است.
آلن داونی، در کتاب خود به نام “چگونه مانند یک دانشمند علوم کامپیوتر فکر کنیم” می نویسد:
جزئیات در زبان های مختلف، متفاوت به نظر می رسند اما چند دستورالعمل ساده در هر زبانی وجود دارند:
- ورودی: جمع آوری اطلاعات از طریق کیبورد، یک فایل یا دستگاه ورودی دیگر
- خروجی: نمایش اطلاعات بر روی صفحه یا ارسال آن ها به یک فایل یا دستگاه دیگر
- محاسبات: انجام عملیات اصلی محاسباتی مانند جمع و ضرب
- حالت های شرطی: بررسی شرایطی خاص و اجرای رشته مناسبی از گزاره ها
- تکرار: انجام یک کار به صورت تکراری و با تغییرات کوچک
بسیاری از زبان های برنامه نویسی، مکانیزم هایی را برای فراخوانی توابع از کتابخانه های مشترک فراهم می کنند. به شرطی که توابع موجود در یک کتابخانه از قرارداد های زمان اجرای مناسب تبعیت کنند( مانند روش انتقال آرگومان ها)، می توان این توابع را به هر زبان دیگری نیز نوشت.
برنامه نویسان کامپیوتر
برنامه نویسان کامپیوتر افرادی هستند که نرم افزار کامپیوتر را می نویسند. کار آن ها اغلب شامل موارد زیر است:
- کدنویسی
- یکپارچه سازی
- معماری نرم افزار
- عیب زدایی
- نگهداری
- آزمایش نرم افزار
- مستند سازی
- تحلیل نیاز ها
- مشخصات