सॉफ्टवेयर



सॉफ्टवेयर निर्देश का एक संग्रह है जो कंप्यूटर को बताता है कि कैसे काम करना है। यह हार्डवेयर के विपरीत है, जिससे सिस्टम बनाया गया है और जो वास्तव में काम करता है।

सबसे कम प्रोग्रामिंग स्तर, निष्पादन योग्य कोड में मशीन भाषा निर्देश होते हैं जो एक व्यक्ति प्रोसेसर द्वारा समर्थित होते हैं- आमतौर पर एक केंद्रीय प्रसंस्करण इकाई (CPU) या ग्राफिक्स प्रोसेसिंग यूनिट (GPU)। मशीनी भाषा में बाइनरी मानों के सेट होते हैं जो प्रोसेसर निर्देशों का प्रतिनिधित्व करते हैं जो कंप्यूटर की स्थिति को उसकी पिछली स्थिति से बदलते हैं। उदाहरण के लिए, एक निर्देश कंप्यूटर में किसी विशेष स्टोरेज स्थान में संग्रहीत मूल्य को बदल सकता है- एक ऐसा प्रभाव जो उपयोगकर्ता के लिए सीधे देखने योग्य नहीं है। एक निर्देश कई इनपुट या आउटपुट ऑपरेशंस में से एक को भी आमंत्रित कर सकता है, उदाहरण के लिए कंप्यूटर स्क्रीन पर कुछ टेक्स्ट प्रदर्शित करना; राज्य में परिवर्तन करना जो उपयोगकर्ता को दिखाई देना चाहिए । वह प्रोसेसर निर्देशों को उनके द्वारा दिए गए क्रम में निष्पादित करता है, जब तक कि उसे किसी भिन्न निर्देश पर "कूदने" का निर्देश नहीं दिया जाता है, या ऑपरेटिंग सिस्टम द्वारा बाधित नहीं किया जाता है। 2015 तक, अधिकांश व्यक्तिगत कंप्यूटर (personal computer), स्मार्टफोन डिवाइस और सर्वर में कई निष्पादन इकाइयों (execution unit) या एक साथ गणना करने वाले कई प्रोसेसर वाले प्रोसेसर होते हैं, और कंप्यूटिंग अतीत की तुलना में बहुत अधिक समवर्ती गतिविधि बन गई है।

अधिकांश सॉफ्टवेयर उच्च स्तरीय प्रोग्रामिंग भाषा में लिखे गए हैं। वे प्रोग्रामर के लिए आसान और अधिक कुशल हैं क्योंकि वे मशीनी भाषाओं की तुलना में  प्राकृतिक भाषा के करीब हैं । उच्च स्तरीय भाषाओं को एक कंपाइलर या दुभाषिया या दोनों के संयोजन का उपयोग करके मशीनी भाषा में अनुवादित किया जाता है। सॉफ़्टवेयर को निम्न-स्तरीय असेंबली भाषा में भी लिखा जा सकता है, जिसमें कंप्यूटर के मशीनी भाषा निर्देशों के लिए एक मजबूत पत्राचार होता है और एक असेंबलर का उपयोग करके मशीन भाषा में अनुवाद किया जाता है।

इतिहास
एल्गोरिथम, जो सॉफ्टवेयर का पहला टुकड़ा होता,  एडा लवलेस द्वारा 19वीं शताब्दी में नियोजित   विश्लेषणात्मक इंजन के लिए लिखा गया था। उसने    प्रमाण बनाए, यह दिखाने के लिए कि इंजन   बर्नौली संख्या एस की गणना कैसे करेगा सबूतों और एल्गोरिथम के कारण, उन्हें पहला कंप्यूटर प्रोग्रामर माना जाता है

सॉफ्टवेयर के बारे में पहला सिद्धांत, कंप्यूटर के निर्माण से पहले, जैसा कि हम उन्हें आज जानते हैं, एलन ट्यूरिंग ने अपने 1935 के निबंध, ऑन कम्प्यूटेबल नंबर्स में, एक एप्लीकेशन टू द एंट्सचीडंग्सप्रॉब्लम (निर्णय समस्या) के साथ प्रस्तावित किया था।  यह अंततः कंप्यूटर विज्ञान और सॉफ्टवेयर इंजीनियरिंग के अकादमिक क्षेत्रों के निर्माण के लिए प्रेरित हुआ; दोनों क्षेत्र सॉफ्टवेयर और उसके निर्माण का अध्ययन करते हैं।  कंप्यूटर विज्ञान कंप्यूटर और सॉफ्टवेयर का सैद्धांतिक अध्ययन है (ट्यूरिंग का निबंध कंप्यूटर विज्ञान का एक उदाहरण है), जबकि सॉफ्टवेयर इंजीनियरिंग सॉफ्टवेयर के विकास के लिए इंजीनियरिंग सिद्धांतों का अनुप्रयोग है।  1946 से पहले, सॉफ़्टवेयर अभी तक संग्रहीत-प्रोग्राम डिजिटल कंप्यूटरों की स्मृति में संग्रहीत प्रोग्राम नहीं था, जैसा कि अब हम इसे समझते हैं; इसके बजाय पहले इलेक्ट्रॉनिक कंप्यूटिंग उपकरणों को "रीप्रोग्राम" करने के लिए रीवायर किया गया था।

2000 में, येल लॉ स्कूल के एक लाइब्रेरियन फ्रेड शापिरो ने एक पत्र प्रकाशित किया जिसमें खुलासा किया गया कि जॉन वाइल्डर टुके के 1958 के पेपर "द टीचिंग ऑफ कंक्रीट मैथमेटिक्स" में "सॉफ्टवेयर" शब्द का सबसे पहला ज्ञात उपयोग था। इसने कई लोगों को इस शब्द को गढ़ने का श्रेय दिया, विशेष रूप से उसी वर्ष प्रकाशित मृत्युलेखों में हालांकि तुकी ने कभी भी ऐसे किसी सिक्के के लिए क्रेडिट का दावा नहीं किया। 1995 में, पॉल निकेट ने दावा किया कि उन्होंने मूल रूप से अक्टूबर 1953 में इस शब्द को गढ़ा था, हालांकि उन्हें अपने दावे का समर्थन करने वाला कोई दस्तावेज नहीं मिला। एक इंजीनियरिंग संदर्भ में "सॉफ़्टवेयर" शब्द का सबसे पहला ज्ञात प्रकाशन अगस्त 1953 में रिचर्ड आर. कारहार्ट द्वारा रैंड कॉर्पोरेशन रिसर्च मेमोरेंडम में किया गया था।

प्रकार


लगभग सभी कंप्यूटर प्लेटफॉर्म पर, सॉफ्टवेयर को कुछ व्यापक श्रेणियों में बांटा जा सकता है।

उद्देश्य, या उपयोग का क्षेत्र
लक्ष्य के आधार पर कंप्यूटर सॉफ्टवेयर को निम्न में विभाजित किया जा सकता है:


 *  एप्लिकेशन सॉफ्टवेयर  कंप्यूटर सिस्टम का उपयोग कंप्यूटर के मूल संचालन से परे विशेष कार्य करने के लिए करता है। कई अलग-अलग प्रकार के एप्लिकेशन सॉफ़्टवेयर हैं क्योंकि आधुनिक कंप्यूटर के साथ किए जा सकने वाले कार्यों की श्रेणी इतनी बड़ी है— सॉफ़्टवेयर की सूची देखें।
 *  सिस्टम सॉफ्टवेयर  हार्डवेयर व्यवहार का प्रबंधन करता है, ताकि उपयोगकर्ताओं द्वारा आवश्यक बुनियादी कार्यक्षमता प्रदान की जा सके, या अन्य सॉफ्टवेयर, यदि कोई हो। सिस्टम सॉफ़्टवेयर को एप्लिकेशन सॉफ़्टवेयर चलाने के लिए एक प्लेटफ़ॉर्म प्रदान करने के लिए भी डिज़ाइन किया गया है और इसमें निम्नलिखित शामिल हैं:
 *  ऑपरेटिंग सिस्टम (OS) सॉफ़्टवेयर के आवश्यक संग्रह हैं जो संसाधनों का प्रबंधन करते हैं और अन्य सॉफ़्टवेयर के लिए सामान्य सेवाएं प्रदान करते हैं जो उनमें से "शीर्ष पर" चलते हैं। पर्यवेक्षी कार्यक्रम, बूट लोडर, शेल और विंडो सिस्टम ऑपरेटिंग सिस्टम के मुख्य भाग हैं। व्यवहार में, एक ऑपरेटिंग सिस्टम अतिरिक्त सॉफ़्टवेयर (एप्लिकेशन सॉफ़्टवेयर सहित) के साथ आता है ताकि उपयोगकर्ता संभावित रूप से ऐसे कंप्यूटर के साथ कुछ काम कर सके जिसमें केवल एक ऑपरेटिंग सिस्टम हो।
 *  डिवाइस ड्राइवर  एक विशेष प्रकार के डिवाइस को संचालित या नियंत्रित करते हैं जो कंप्यूटर से जुड़ा होता है। प्रत्येक डिवाइस को कम से कम एक संगत डिवाइस ड्राइवर की आवश्यकता होती है; क्योंकि एक कंप्यूटर में आमतौर पर कम से कम एक इनपुट डिवाइस और कम से कम एक आउटपुट डिवाइस होता है, एक कंप्यूटर को आमतौर पर एक से अधिक डिवाइस ड्राइवर की आवश्यकता होती है।
 *   यूटिलिटीज  कंप्यूटर प्रोग्राम हैं जिन्हें उपयोगकर्ताओं को उनके कंप्यूटर के रखरखाव और देखभाल में सहायता करने के लिए डिज़ाइन किया गया है।
 *  दुर्भावनापूर्ण सॉफ़्टवेयर, या मैलवेयर,या मैलवेयर, ऐसा सॉफ़्टवेयर है जिसे कंप्यूटर को नुकसान पहुंचाने या बाधित करने के लिए विकसित किया गया है। मैलवेयर कंप्यूटर से संबंधित अपराधों से निकटता से जुड़ा हुआ है, हालांकि कुछ दुर्भावनापूर्ण प्रोग्राम व्यावहारिक चुटकुले के रूप में डिज़ाइन किए गए हो सकते हैं।

निष्पादन की प्रकृति या डोमेन

 * डेस्कटॉप एप्लिकेशन जैसे वेब ब्राउज़र और माइक्रोसॉफ्ट ऑफिस और लिब्रे ऑफिस और वर्डपरफेक्ट, साथ ही स्मार्टफोन और टैबलेट एप्लिकेशन (जिन्हें " ऐप्स " कहा जाता है)।
 * जावास्क्रिप्ट स्क्रिप्ट पारंपरिक रूप से वेब पेजों में एम्बेडेड सॉफ्टवेयर के टुकड़े हैं जो सीधे वेब ब्राउजर के अंदर चलाए जाते हैं जब एक वेब ब्राउजर प्लगइन की आवश्यकता के बिना वेब पेज लोड होता है। अन्य प्रोग्रामिंग भाषाओं में लिखे गए सॉफ़्टवेयर को वेब ब्राउज़र के भीतर भी चलाया जा सकता है यदि सॉफ़्टवेयर का या तो जावास्क्रिप्ट में अनुवाद किया गया है, या यदि उस भाषा का समर्थन करने वाला वेब ब्राउज़र प्लग इन स्थापित है; उत्तरार्द्ध का सबसे आम उदाहरण एक्शनस्क्रिप्ट स्क्रिप्ट है, जो एडोब फ्लैश प्लगइन द्वारा समर्थित है।
 * सर्वर सॉफ्टवेयर, जिसमें शामिल हैं:
 * वेब एप्लिकेशन वेब एप्लिकेशन, जो आमतौर पर वेब सर्वर पर चलते हैं और गतिशील रूप से उत्पन्न वेब पेजों को वेब ब्राउज़र में आउटपुट करते हैं, उदाहरण के लिए पीएचपी, जावा, एएसपी. NET, या यहां तक कि जावास्क्रिप्ट जो सर्वर पर चलता है । आधुनिक समय में इनमें आमतौर पर वेब ब्राउज़र में चलाने के लिए कुछ जावास्क्रिप्ट शामिल होते हैं, इस मामले में वे आमतौर पर आंशिक रूप से सर्वर पर, आंशिक रूप से वेब ब्राउज़र में चलते हैं।
 * प्लगइन्स और एक्सटेंशन ऐसे सॉफ़्टवेयर हैं जो सॉफ़्टवेयर के किसी अन्य भाग की कार्यक्षमता को बढ़ाते या संशोधित करते हैं, और इसके लिए आवश्यक है कि कार्य करने के लिए सॉफ़्टवेयर का उपयोग किया जाए।
 * एंबेडेड सॉफ्टवेयर एम्बेडेड सिस्टम के भीतर फर्मवेयर के रूप में रहता है, एकल उपयोग के लिए समर्पित डिवाइस या कार और टीवी जैसे कुछ उपयोग (हालांकि कुछ एम्बेडेड डिवाइस जैसे वायरलेस चिपसेट स्वयं एक साधारण, गैर-एम्बेडेड कंप्यूटर सिस्टम जैसे पीसी का हिस्सा हो सकते हैं) या स्मार्टफोन) एम्बेडेड सिस्टम संदर्भ में कभी-कभी सिस्टम सॉफ़्टवेयर और एप्लिकेशन सॉफ़्टवेयर के बीच कोई स्पष्ट अंतर नहीं होता है। हालाँकि, कुछ एम्बेडेड सिस्टम एम्बेडेड ऑपरेटिंग सिस्टम चलाते हैं, और ये सिस्टम सिस्टम सॉफ़्टवेयर और एप्लिकेशन सॉफ़्टवेयर के बीच अंतर को बनाए रखते हैं (हालाँकि आमतौर पर केवल एक ही निश्चित एप्लिकेशन होगा जो हमेशा चलता रहता है)।
 * माइक्रोकोड एक विशेष, अपेक्षाकृत अस्पष्ट प्रकार का एम्बेडेड सॉफ्टवेयर है जो प्रोसेसर को मशीन कोड को निष्पादित करने का तरीका बताता है, इसलिए यह वास्तव में मशीन कोड से निचला स्तर है।  यह आमतौर पर प्रोसेसर निर्माता के स्वामित्व में होता है, और किसी भी आवश्यक सुधारात्मक माइक्रोकोड सॉफ़्टवेयर अपडेट को उनके द्वारा उपयोगकर्ताओं को आपूर्ति की जाती है (जो शिपिंग प्रतिस्थापन प्रोसेसर हार्डवेयर से काफी सस्ता है)। इस प्रकार एक साधारण प्रोग्रामर को कभी भी इससे निपटने की उम्मीद नहीं होगी।

प्रोग्रामिंग टूल
प्रोग्रामिंग टूल प्रोग्राम या एप्लिकेशन के रूप में भी सॉफ्टवेयर हैं जिनका उपयोग डेवलपर्स सॉफ्टवेयर बनाने, डिबग करने, बनाए रखने या अन्यथा समर्थन करने के लिए करते हैं।

सॉफ्टवेयर एक या अधिक प्रोग्रामिंग भाषाओं में लिखा जाता है; अस्तित्व में कई प्रोग्रामिंग भाषाएं हैं, और प्रत्येक में कम से कम एक कार्यान्वयन है, जिनमें से प्रत्येक में प्रोग्रामिंग टूल का अपना सेट होता है। ये उपकरण अपेक्षाकृत स्व-निहित प्रोग्राम हो सकते हैं जैसे कि कंपाइलर (compiler), डिबगर (debugger), दुभाषिए (interpreters), लिंकर्स (linkers), और टेक्स्ट एडिटर (text editors), जिन्हें किसी कार्य को पूरा करने के लिए जोड़ा जा सकता है; या वे एक एकीकृत विकास वातावरण (आईडीई) बना सकते हैं, जो ऐसे स्व-निहित उपकरणों की अधिक या सभी कार्यक्षमता को जोड़ती है। आईडीई या तो प्रासंगिक व्यक्तिगत उपकरणों को लागू करके या नए तरीके से उनकी कार्यक्षमता को फिर से लागू करके ऐसा कर सकते हैं।  एक आईडीई विशिष्ट कार्यों को करना आसान बना सकता है, जैसे किसी विशेष परियोजना में फाइलों में खोज करना।  कई प्रोग्रामिंग भाषा कार्यान्वयन व्यक्तिगत टूल या आईडीई दोनों का उपयोग करने का विकल्प प्रदान करते हैं।

आर्किटेक्चर
लोग आधुनिक सामान्य प्रयोजन के कंप्यूटरों ( एम्बेडेड सिस्टम, एनालॉग कंप्यूटर और सुपर कंप्यूटर के विपरीत) का उपयोग करते हैं, वे आमतौर पर सॉफ्टवेयर की तीन परतों को विभिन्न प्रकार के कार्य करते हुए देखते हैं: प्लेटफ़ॉर्म, एप्लिकेशन और उपयोगकर्ता सॉफ़्टवेयर।


 * प्लेटफ़ॉर्म सॉफ़्टवेयर (Platform software): प्लेटफ़ॉर्म में फ़र्मवेयर, डिवाइस ड्राइवर, एक ऑपरेटिंग सिस्टम और आमतौर पर एक ग्राफिकल यूजर इंटरफेस शामिल होता है, जो कुल मिलाकर, उपयोगकर्ता को कंप्यूटर और उसके बाह्य उपकरणों (संबंधित उपकरण) के साथ बातचीत करने की अनुमति देता है। प्लेटफ़ॉर्म सॉफ़्टवेयर अक्सर कंप्यूटर के साथ बंडल में आता है। एक पीसी पर आमतौर पर प्लेटफॉर्म सॉफ्टवेयर को बदलने की क्षमता होती है।
 * एप्लीकेशन सॉफ्टवेयर (Application software): एप्लीकेशन सॉफ्टवेयर वह है जो ज्यादातर लोग सॉफ्टवेयर के बारे में सोचते समय सोचते हैं। विशिष्ट उदाहरणों में कार्यालय सुइट और वीडियो गेम शामिल हैं। एप्लीकेशन सॉफ्टवेयर अक्सर कंप्यूटर हार्डवेयर से अलग से खरीदा जाता है। कभी-कभी एप्लिकेशन को कंप्यूटर के साथ बंडल किया जाता है, लेकिन यह इस तथ्य को नहीं बदलता है कि वे स्वतंत्र एप्लिकेशन के रूप में चलते हैं। एप्लिकेशन आमतौर पर ऑपरेटिंग सिस्टम से स्वतंत्र प्रोग्राम होते हैं, हालांकि वे अक्सर विशिष्ट प्लेटफॉर्म के लिए तैयार किए जाते हैं। अधिकांश उपयोगकर्ता कंपाइलर, डेटाबेस और अन्य "सिस्टम सॉफ़्टवेयर" को एप्लिकेशन के रूप में सोचते हैं।
 * उपयोगकर्ता-लिखित सॉफ़्टवेयर (User-written software): उपयोगकर्ताओं की विशिष्ट आवश्यकताओं को पूरा करने के लिए अंतिम-उपयोगकर्ता विकास दर्जी सिस्टम। उपयोगकर्ता सॉफ़्टवेयर में स्प्रेडशीट टेम्प्लेट और वर्ड प्रोसेसर टेम्प्लेट शामिल हैं।यहां तक कि ईमेल फिल्टर भी एक तरह का यूजर सॉफ्टवेयर है। उपयोगकर्ता इस सॉफ़्टवेयर को स्वयं बनाते हैं और अक्सर यह अनदेखा कर देते हैं कि यह कितना महत्वपूर्ण है। उपयोगकर्ता द्वारा लिखित सॉफ़्टवेयर को डिफ़ॉल्ट एप्लिकेशन पैकेज में कितनी कुशलता से एकीकृत किया गया है, इस पर निर्भर करते हुए, कई उपयोगकर्ताओं को मूल पैकेज और सहकर्मियों द्वारा जोड़े गए अंतर के बारे में पता नहीं हो सकता है।

निष्पादन
कंप्यूटर सॉफ्टवेयर को कंप्यूटर के स्टोरेज (जैसे हार्ड ड्राइव या मेमोरी ) में "लोड" करना पड़ता है। एक बार सॉफ्टवेयर लोड हो जाने के बाद, कंप्यूटर सॉफ्टवेयर को निष्पादित करने में सक्षम होता है। इसमें एप्लिकेशन सॉफ़्टवेयर से सिस्टम सॉफ़्टवेयर के माध्यम से हार्डवेयर को निर्देश देना शामिल है, जो अंततः मशीन कोड के रूप में निर्देश प्राप्त करता है। प्रत्येक निर्देश कंप्यूटर को एक ऑपरेशन करने के लिए प्रेरित करता है - डेटा को स्थानांतरित करना, गणना करना, या निर्देशों के नियंत्रण प्रवाह को बदलना।

डेटा मूवमेंट आमतौर पर मेमोरी में एक स्थान से दूसरे स्थान पर होता है। कभी-कभी इसमें मेमोरी और रजिस्टरों के बीच डेटा को स्थानांतरित करना शामिल होता है जो सीपीयू में हाई-स्पीड डेटा एक्सेस को सक्षम करता है। डेटा को स्थानांतरित करना, विशेष रूप से इसकी बड़ी मात्रा में, महंगा हो सकता है; इसके बजाय कभी-कभी डेटा के लिए "पॉइंटर्स" का उपयोग करके इसे टाला जाता है। संगणना में सरल ऑपरेशन शामिल हैं जैसे एक चर डेटा तत्व के मूल्य को बढ़ाना। अधिक जटिल संगणनाओं में एक साथ कई संचालन और डेटा तत्व शामिल हो सकते हैं।

गुणवत्ता और विश्वसनीयता
सॉफ्टवेयर की गुणवत्ता बहुत महत्वपूर्ण है, खासकर वाणिज्यिक और सिस्टम सॉफ्टवेयर के लिए। यदि सॉफ़्टवेयर दोषपूर्ण है, तो यह किसी व्यक्ति के कार्य को हटा सकता है, कंप्यूटर को क्रैश कर सकता है और अन्य अप्रत्याशित कार्य कर सकता है। दोषों और त्रुटियों को " बग " कहा जाता है जो अक्सर अल्फा और बीटा परीक्षण के दौरान खोजे जाते हैं। सॉफ्टवेयर अक्सर एक शिकार भी होता है जिसे सॉफ्टवेयर एजिंग के रूप में जाना जाता है, अनदेखी बग के संयोजन के परिणामस्वरूप प्रगतिशील प्रदर्शन में गिरावट।

सॉफ़्टवेयर परीक्षण के माध्यम से कई बग खोजे जाते हैं और उन्हें ठीक किया जाता है। हालांकि, सॉफ़्टवेयर परीक्षण शायद ही कभी—अगर कभी—हर बग को समाप्त करता है; कुछ प्रोग्रामर कहते हैं कि "हर प्रोग्राम में कम से कम एक और बग होता है" (लुबार्स्की का नियम)।। सॉफ़्टवेयर विकास की जलप्रपात पद्धति में, अलग-अलग परीक्षण दल आमतौर पर कार्यरत होते हैं, लेकिन नए दृष्टिकोणों में, सामूहिक रूप से चुस्त सॉफ़्टवेयर विकास कहा जाता है, डेवलपर्स अक्सर अपने स्वयं के सभी परीक्षण करते हैं, और प्रतिक्रिया प्राप्त करने के लिए नियमित रूप से उपयोगकर्ताओं/ग्राहकों को सॉफ़्टवेयर प्रदर्शित करते हैं।  सॉफ्टवेयर का परीक्षण इकाई परीक्षण, प्रतिगमन परीक्षण और अन्य विधियों के माध्यम से किया जा सकता है, जो मैन्युअल रूप से, या सबसे अधिक, स्वचालित रूप से किया जाता है, क्योंकि परीक्षण किए जाने वाले कोड की मात्रा बड़ी हो सकती है। कमांड सॉफ्टवेयर वाले प्रोग्राम हार्डवेयर इंजीनियरिंग और सिस्टम संचालन को एक साथ अधिक आसानी से कार्य करने में सक्षम बनाते हैं।

लाइसेंस
सॉफ़्टवेयर का लाइसेंस उपयोगकर्ता को लाइसेंस प्राप्त वातावरण में सॉफ़्टवेयर का उपयोग करने का अधिकार देता है, और मुफ्त सॉफ़्टवेयर लाइसेंस के मामले में, अन्य अधिकार भी प्रदान करता है जैसे कि प्रतिलिपि बनाने का अधिकार। मालिकाना सॉफ्टवेयर (Proprietary software) को दो प्रकारों में विभाजित किया जा सकता है:


 * फ्रीवेयर, जिसमें "फ्री ट्रायल" सॉफ्टवेयर या " फ्रीमियम " सॉफ्टवेयर की श्रेणी शामिल है (अतीत में, शेयरवेयर शब्द का इस्तेमाल अक्सर फ्री ट्रायल/फ्रीमियम सॉफ्टवेयर के लिए किया जाता था)। जैसा कि नाम से पता चलता है, फ्रीवेयर का उपयोग मुफ्त में किया जा सकता है, हालांकि फ्री ट्रायल या फ्रीमियम सॉफ्टवेयर के मामले में, यह कभी-कभी सीमित अवधि के लिए या सीमित कार्यक्षमता के साथ ही सही होता है।
 * एक शुल्क के लिए उपलब्ध सॉफ्टवेयर, जिसका उपयोग केवल लाइसेंस की खरीद पर कानूनी रूप से किया जा सकता है

ओपन-सोर्स सॉफ्टवेयर एक मुफ्त सॉफ्टवेयर लाइसेंस के साथ आता है, जो प्राप्तकर्ता को सॉफ्टवेयर को संशोधित और पुनर्वितरित करने का अधिकार देता है।

पेटेंट
सॉफ्टवेयर पेटेंट, अन्य प्रकार के पेटेंटों की तरह, सैद्धांतिक रूप से एक आविष्कारक को एक विस्तृत विचार (उदाहरण के लिए एक एल्गोरिथ्म) के लिए एक विशेष, समय-सीमित लाइसेंस देना चाहिए कि कैसे सॉफ्टवेयर के एक टुकड़े, या सॉफ्टवेयर के एक घटक को लागू किया जाए । उपयोगी चीजों के लिए विचार जो सॉफ्टवेयर कर सकता था, और उपयोगकर्ता की आवश्यकताएं, पेटेंट योग्य नहीं होनी चाहिए, और ठोस कार्यान्वयन (अर्थात पेटेंट को लागू करने वाले वास्तविक सॉफ्टवेयर पैकेज) को पेटेंट योग्य नहीं माना जाता है - बाद वाले पहले से ही कॉपीराइट द्वारा कवर किए जाते हैं, आम तौर पर खुद ब खुद। इसलिए सॉफ़्टवेयर पेटेंट को आवश्यकताओं और ठोस कार्यान्वयन के बीच मध्य क्षेत्र को कवर करना चाहिए। कुछ देशों में, भौतिक दुनिया पर प्रभाव डालने के लिए दावा किए गए आविष्कार की आवश्यकता भी एक सॉफ़्टवेयर पेटेंट के लिए मान्य होने की आवश्यकताओं का हिस्सा हो सकती है - हालांकि चूंकि सभी उपयोगी सॉफ़्टवेयर का भौतिक दुनिया पर प्रभाव पड़ता है, इसलिए यह आवश्यकता हो सकती है बहस के लिए खुला। इस बीच, सॉफ्टवेयर कोड के लेखन के विभिन्न पहलुओं पर अमेरिकी कॉपीराइट कानून लागू किया गया था।

सॉफ्टवेयर उद्योग में सॉफ्टवेयर पेटेंट विवादास्पद हैं, कई लोग उनके बारे में अलग-अलग विचार रखते हैं। विवाद के स्रोतों में से एक यह है कि प्रारंभिक विचारों और पेटेंट के बीच उपरोक्त विभाजन को पेटेंट वकीलों द्वारा व्यवहार में सम्मानित नहीं किया जाता है - उदाहरण के लिए पहलू-उन्मुख प्रोग्रामिंग (एओपी) के लिए पेटेंट, जिसे किसी भी प्रोग्रामिंग टूल पर अधिकारों का दावा करने के लिए कहा जाता है। एओपी के विचार को लागू करना, चाहे वह कितना भी लागू हो।  विवाद का एक अन्य स्रोत नवाचार पर प्रभाव है, कई प्रतिष्ठित विशेषज्ञों और कंपनियों का तर्क है कि सॉफ्टवेयर इतना तेजी से आगे बढ़ने वाला क्षेत्र है कि सॉफ्टवेयर पेटेंट केवल विशाल अतिरिक्त मुकदमेबाजी लागत और जोखिम पैदा करते हैं, और वास्तव में मंद नवाचार।  संयुक्त राज्य अमेरिका के बाहर सॉफ्टवेयर पेटेंट के बारे में बहस के मामले में, तर्क दिया गया है कि बड़े अमेरिकी निगम और पेटेंट वकील सॉफ्टवेयर पेटेंट की अनुमति देने या जारी रखने के प्राथमिक लाभार्थी होने की संभावना है।

डिज़ाइन और सुधार
सॉफ्टवेयर का डिजाइन और कार्यान्वयन सॉफ्टवेयर की जटिलता के आधार पर भिन्न होता है। उदाहरण के लिए, माइक्रोसॉफ्ट वर्ड के डिजाइन और निर्माण में माइक्रोसॉफ्ट नोटपैड को डिजाइन करने और विकसित करने की तुलना में अधिक समय लगा क्योंकि पूर्व में बहुत अधिक बुनियादी कार्यक्षमता है।

सॉफ्टवेयर आमतौर पर एकीकृत विकास वातावरण (आईडीई) जैसे एक्लिप्स, इंटेलीजे और माइक्रोसॉफ्ट विजुअल स्टूडियो में विकसित किया जाता है जो प्रक्रिया को सरल बना सकता है और सॉफ्टवेयर को संकलित कर सकता है। जैसा कि एक अलग खंड में उल्लेख किया गया है, सॉफ्टवेयर आमतौर पर मौजूदा सॉफ्टवेयर और एप्लिकेशन प्रोग्रामिंग इंटरफेस (एपीआई) के शीर्ष पर बनाया जाता है जो अंतर्निहित सॉफ्टवेयर जीटीके +, जावाबीन या स्विंग प्रदान करता है।  पुस्तकालयों (एपीआई) को उनके उद्देश्य से वर्गीकृत किया जा सकता है। उदाहरण के लिए, स्प्रिंग फ्रेमवर्क का उपयोग उद्यम अनुप्रयोगों को लागू करने के लिए किया जाता है, विंडोज फॉर्म लाइब्रेरी का उपयोग ग्राफिकल यूजर इंटरफेस (जीयूआई) अनुप्रयोगों जैसे माइक्रोसॉफ्ट वर्ड को डिजाइन करने के लिए किया जाता है, और विंडोज कम्युनिकेशन फाउंडेशन का उपयोग वेब सेवाओं को डिजाइन करने के लिए किया जाता है।  जब कोई प्रोग्राम डिज़ाइन किया जाता है, तो वह एपीआई पर निर्भर करता है। उदाहरण के लिए, एक माइक्रोसॉफ्ट विंडोज डेस्कटॉप एप्लिकेशन एपीआई फ़ंक्शन को. NET विंडोज़ फॉर्म लाइब्रेरी जैसे फॉर्म 1। बंद करें और फॉर्म 1। Show  एप्लिकेशन को बंद या खोलने के लिए। इन एपीआई के बिना, प्रोग्रामर को इन कार्यात्मकताओं को पूरी तरह से स्वयं लिखना होगा। Oracle और Microsoft जैसी कंपनियां अपने स्वयं के API प्रदान करती हैं ताकि कई एप्लिकेशन उनके सॉफ़्टवेयर पुस्तकालयों का उपयोग करके लिखे जा सकें जिनमें आमतौर पर उनमें कई API होते हैं।

डेटा संरचनाएं जैसे हैश टेबल, सरणियाँ, और बाइनरी ट्री, और एल्गोरिदम जैसे क्विकॉर्ट, सॉफ़्टवेयर बनाने के लिए उपयोगी हो सकते हैं।

कंप्यूटर सॉफ्टवेयर में विशेष आर्थिक विशेषताएं होती हैं जो इसके डिजाइन, निर्माण और वितरण को अधिकांश अन्य आर्थिक वस्तुओं से अलग बनाती हैं।

सॉफ़्टवेयर बनाने वाले व्यक्ति को प्रोग्रामर, सॉफ़्टवेयर इंजीनियर या सॉफ़्टवेयर डेवलपर कहा जाता है, इन शब्दों का अर्थ समान है। प्रोग्रामर के लिए अधिक अनौपचारिक शब्द भी मौजूद हैं जैसे "कोडर" और "हैकर" – हालांकि बाद वाले शब्द का उपयोग भ्रम पैदा कर सकता है, क्योंकि इसका उपयोग अक्सर किसी ऐसे व्यक्ति के लिए किया जाता है जो अवैध रूप से कंप्यूटर सिस्टम में सेंध लगाता है ।