نرم افزار چیست؟
نرم افزار شامل برنامه های کامپیوتری هست که اجرای یک کامپیوتر رو هدایت میکنه. همچنین نرم افزار شامل اسناد طراحی و مشخصات هم میشه.
تاریخچه نرم افزار
تاریخچه نرم افزار ارتباط نزدیکی با توسعه کامپیوترهای دیجیتال در اواسط قرن بیستم داره. برنامه های اولیه به زبان ماشین خاص سخت افزار نوشته میشدن. معرفی زبان های برنامه نویسی سطح بالا در سال 1958 باعث شد که دستورالعمل ها خواناتر برای انسان بشن و توسعه نرم افزار راحت تر و قابل حمل تر بین معماری های مختلف کامپیوتری بشه. نرم افزارهایی که با زبان برنامه نویسی نوشته میشن، از طریق یک کامپایلر یا مفسر اجرا میشن تا روی سخت افزار معماری مربوطه اجرا بشن. با گذشت زمان، نرم افزارها به دلیل پیشرفت هایی در شبکه، سیستم عامل ها و پایگاه های داده پیچیده تر شدن.
انواع نرم افزار
به طور کلی، نرم افزار به دو نوع اصلی تقسیم میشه:
- سیستم عامل ها که منابع سخت افزاری رو مدیریت میکنن و خدماتی برای برنامه های کاربردی فراهم میکنن
- نرم افزارهای کاربردی که وظایف مشخصی رو برای کاربران انجام میدن
ظهور رایانش ابری یک مدل جدید برای ارائه نرم افزار به نام نرم افزار به عنوان سرویس (SaaS) معرفی کرده. در SaaS، برنامه ها توسط یک ارائه دهنده میزبانی میشن و از طریق اینترنت در دسترس قرار میگیرن.فرآیند توسعه نرم افزار شامل چندین مرحله هست. این مراحل شامل طراحی نرم افزار، برنامه نویسی، تست، انتشار و نگهداری میشه. تضمین کیفیت نرم افزار و امنیت از جنبه های حیاتی در توسعه نرم افزار هستن، چون وجود باگ ها و آسیب پذیری های امنیتی میتونه منجر به خرابی سیستم و نقض امنیت بشه. علاوه بر این، مسائل حقوقی مثل مجوزهای نرم افزاری و حقوق مالکیت فکری نقش مهمی در توزیع محصولات نرم افزاری دارن.
توسعه و نگهداری نرم افزار
شرکت های نرم افزاری سعی میکنن محصولی با کیفیت بالا رو در زمان مقرر و با بودجه مشخص ارائه بدن. یکی از چالش ها اینه که تخمین تلاش مورد نیاز برای توسعه نرم افزار اغلب نادرست از آب درمیاد.توسعه نرم افزار با ایده پردازی پروژه، ارزیابی امکان سنجی، تحلیل نیازهای کسب و کار و طراحی نرم افزار شروع میشه. اکثر پروژه های نرم افزاری با استفاده مجدد یا ادغام نرم افزارهای موجود، چه به صورت نرم افزارهای تجاری آماده (COTS) و چه نرم افزارهای متن باز، روند توسعه رو سرعت میبخشن. تضمین کیفیت نرم افزار معمولاً ترکیبی از بازبینی دستی کد توسط سایر مهندسان و تست خودکار نرم افزار هست. به دلیل محدودیت های زمانی، تست نمیتونه تمام جنبه های عملکردی مورد انتظار نرم افزار رو پوشش بده، بنابراین توسعه دهنده ها بیشتر روی بخش های حیاتی تمرکز میکنن. در برخی سیستم های حیاتی از روش های رسمی برای اثبات صحت کد استفاده میشه، در حالی که تست پذیرش کاربر کمک میکنه تا محصول مطابق با انتظارات مشتری باشه.
کیفیت و امنیت نرم افزار
کیفیت نرم افزار به معنای برآورده کردن نیازهای مشخص شده و همچنین انتظارات مشتری هست. کیفیت یک مفهوم کلیه که میتونه به رفتار درست و بهینه کد، قابلیت استفاده مجدد، قابلیت حمل یا سهولت در تغییرات اشاره داشته باشه. معمولا مقرون به صرفه تره که کیفیت از ابتدا در محصول گنجانده بشه تا اینکه بخوان در مراحل بعدی توسعه به اون اضافه کنن. کد با کیفیت بالاتر، هزینه نگهداری رو هم برای تأمین کنندگان و هم مشتریان کاهش میده، چون قابل اعتمادتره و نگهداری ازش راحت تره.در سیستم های حیاتی، خطاهای نرم افزاری میتونن بسیار جدی باشن و حتی منجر به مرگ بشن. طبق برخی برآوردها، هزینه نرم افزارهای بی کیفیت میتونه به 20 تا 40 درصد از میزان فروش برسه. با اینکه هدف توسعه دهنده ها ارائه محصولی هست که کاملاً مطابق انتظار کار کنه، اما تقریباً تمام نرم افزارها شامل باگ هایی هستن.
کدگذاری و اجرا
زبان های برنامه نویسی
زبان های برنامه نویسی قالبی هستن که نرم افزارها در اون نوشته میشن. از دهه 1950 تاکنون، هزاران زبان برنامه نویسی مختلف اختراع شده؛ بعضی از اون ها برای دهه ها مورد استفاده قرار گرفتن، در حالی که بعضی دیگه به مرور از بین رفتن.برخی تعاریف، کد ماشین یعنی دستورالعمل های دقیق و مستقیمی که مستقیماً توسط سخت افزار اجرا میشن و زبان اسمبلی که خواناتر از کد ماشینه و دستوراتش به طور یک به یک به کد ماشین تبدیل میشن رو هم به عنوان زبان برنامه نویسی در نظر میگیرن.برنامه هایی که با زبان های برنامه نویسی سطح بالا نوشته میشن، چند ویژگی اصلی مشترک دارن:
- نیازی به دانش مستقیم از کد ماشین برای نوشتن اون ها نیست
- قابل انتقال به سیستم های کامپیوتری مختلف هستن
- نسبت به کد ماشین، خواناتر و مختصرتر برای انسان ها هستن
با این حال، این زبان ها هم باید هم برای انسان ها خوانا باشن و هم قابلیت ترجمه به دستورالعمل های واضح و مشخص برای سخت افزار کامپیوتر رو داشته باشن.
کامپایل، تفسیر و اجرا
اختراع زبان های برنامه نویسی سطح بالا همزمان با توسعه کامپایلرها بود که برای ترجمه خودکار این زبان ها به کد ماشین طراحی شدن.اکثر برنامه ها شامل تمام منابع مورد نیاز برای اجرا نیستن و به کتابخانه های خارجی وابسته هستن. یکی از وظایف کامپایلر اینه که این فایل ها رو به گونه ای بهم متصل کنه که برنامه بتونه توسط سخت افزار اجرا بشه. بعد از کامپایل شدن، برنامه میتونه به عنوان یک فایل اجرایی ذخیره بشه و لودر (بخشی از سیستم عامل) این فایل ذخیره شده رو دریافت و به عنوان یک فرایند روی سخت افزار کامپیوتر اجرا میکنه.برخی زبان های برنامه نویسی به جای کامپایلر از مفسر (Interpreter) استفاده میکنن. مفسر، برنامه رو در زمان اجرا به کد ماشین تبدیل میکنه، که این فرآیند باعث میشه اجرای برنامه ها 10 تا 100 برابر کندتر از زبان های کامپایل شده باشه.
مسائل حقوقی
مسئولیت پذیری
نرم افزارها اغلب در حالی منتشر میشن که توسعه دهندگان میدونن هنوز کامل نیستن یا شامل باگ هایی هستن. خریداران هم با آگاهی از این وضعیت اقدام به خرید اون ها میکنن، که این موضوع باعث شده یک نظام حقوقی خاص برای نرم افزارها شکل بگیره، جایی که مسئولیت قانونی تولیدکنندگان نرم افزار نسبت به سایر محصولات به طور قابل توجهی محدودتره.
مجوزها
کد منبع نرم افزار تحت قانون کپی رایت محافظت میشه و به صاحب اون حق انحصاری برای کپی و توزیع کد رو میده. با این حال، ایده ها و الگوریتم های اساسی تحت قانون کپی رایت محافظت نمیشن، اما معمولاً به عنوان اسرار تجاری در نظر گرفته میشن و از طریق روش هایی مثل توافقنامه های عدم افشا (NDA) مخفی نگه داشته میشن.کپی رایت نرم افزار از اواسط دهه 1970 به رسمیت شناخته شده و حقوق اون متعلق به شرکت سازنده نرم افزار هست، نه کارمندان یا پیمانکارانی که اون رو نوشته باشن.استفاده از بیشتر نرم افزارها تحت یک توافقنامه (مجوز نرم افزار) بین صاحب کپی رایت و کاربر تنظیم میشه.
- نرم افزارهای مالکیتی معمولاً تحت مجوزهای محدودکننده فروخته میشن که کپی و استفاده مجدد از اون ها رو محدود میکنه (اغلب با ابزارهایی مثل مدیریت حقوق دیجیتال (DRM) اجرا میشه).
- در مقابل، مجوزهای متن باز اجازه میدن که نرم افزار به صورت رایگان استفاده و توزیع بشه، اما معمولاً شرایط خاصی دارن.
بیشتر مجوزهای متن باز از کاربران میخوان که هرگونه تغییرات ایجاد شده رو تحت همون مجوز منتشر کنن، که این موضوع میتونه هنگام استفاده از نرم افزار متن باز در پروژه های مالکیتی، مشکلاتی ایجاد کنه.