कंप्यूटर प्रोग्रामिंग

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

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

इतिहास


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

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

1880 के दशक में हरमन होलेरिथ  ने मशीन-पठनीय रूप में डेटा संग्रहीत करने की अवधारणा का आविष्कार किया। बाद में उनके 1906 टाइप I टेबुलेटर में एक प्लगबोर्ड ( प्लग बोर्ड ) जोड़ा गया, जिससे इसे विभिन्न नौकरियों के लिए प्रोग्राम किया जा सकता था, और 1940 के दशक के अंत तक,  यूनिट रिकॉर्ड उपकरण  जैसे कि  IBM 602  और  IBM 604  को इसी तरह से कंट्रोल पैनल द्वारा प्रोग्राम किया गया था।, जैसा कि पहले  इलेक्ट्रॉनिक कंप्यूटर  थे। हालाँकि, 1949 में पेश किए गए  संग्रहीत-प्रोग्राम कंप्यूटर  की अवधारणा के साथ, प्रोग्राम और डेटा दोनों को  स्मृति  में उसी तरह से स्टोर और हेरफेर किया गया था।

मशीन की भाषा
मशीन कोड प्रारंभिक कार्यक्रमों की भाषा थी, जिसे विशेष मशीन के निर्देश सेट में लिखा जाता था, अक्सर बाइनरी अंक प्रणाली  संकेतन में। असेंबली भाषाएं जल्द ही विकसित की गईं कि प्रोग्रामर को प्रत्येक ऑपरेशन कोड के लिए संक्षिप्त नाम और पते निर्दिष्ट करने के लिए सार्थक नामों के साथ एक टेक्स्ट प्रारूप (जैसे, ADD X, TOTAL) में निर्देश निर्दिष्ट करने दें। हालाँकि, क्योंकि एक असेंबली भाषा एक मशीनी भाषा के लिए एक अलग संकेतन से थोड़ी अधिक है,  निर्देश सेट आर्किटेक्चर की तुलना  वाली दो मशीनों में भी अलग-अलग असेंबली भाषाएँ होती हैं।



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

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

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

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

स्रोत कोड की पठनीयता
कंप्यूटर प्रोग्रामिंग में, पठनीयता से तात्पर्य उस सहजता से है जिसके साथ एक मानव पाठक स्रोत कोड के उद्देश्य, नियंत्रण प्रवाह और संचालन को समझ सकता है। यह पोर्टेबिलिटी, उपयोगिता और सबसे महत्वपूर्ण रखरखाव सहित उपरोक्त गुणवत्ता के पहलुओं को प्रभावित करता है।

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

इसके प्रस्तुतिकरण और सामग्री पहलुओं को अलग करना (जैसे इंडेंट, लाइन ब्रेक, रंग हाइलाइटिंग, और इसी तरह) अक्सर स्रोत कोड संपादक  द्वारा नियंत्रित किया जाता है, लेकिन सामग्री पहलू प्रोग्रामर की प्रतिभा और कौशल को दर्शाते हैं।

कोड संरचना और प्रदर्शन के लिए गैर-पारंपरिक दृष्टिकोण अपनाकर पठनीयता संबंधी चिंताओं को हल करने के इरादे से विभिन्न दृश्य प्रोग्रामिंग भाषा ओं को भी विकसित किया गया है। एकीकृत विकास वातावरण (I.D.Es) का उद्देश्य ऐसी सभी सहायता को एकीकृत करना है।  कोड रिफैक्टरिंग  जैसी तकनीकें पठनीयता को बढ़ा सकती हैं।

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

शतरंज एल्गोरिदम एक उदाहरण के रूप में
शतरंज खेलने के लिए कंप्यूटर प्रोग्रामिंग करना 1950 का एक पेपर था जिसने एक मिनीमैक्स एल्गोरिथम का मूल्यांकन किया जो एल्गोरिथम जटिलता के इतिहास का हिस्सा है; आईबीएम के डीप ब्लू (शतरंज कंप्यूटर)  पर एक पाठ्यक्रम  स्टैनफोर्ड विश्वविद्यालय  में कंप्यूटर विज्ञान पाठ्यक्रम का हिस्सा है।

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

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

डेटाबेस डिज़ाइन के लिए उपयोग की जाने वाली एक समान तकनीक इकाई-संबंध मॉडल  (इकाई-रिलेशनशिप मॉडल) है।

कार्यान्वयन तकनीकों में अनिवार्य भाषाएं ( वस्तु उन्मुख कार्यकर्म | ऑब्जेक्ट-ओरिएंटेड या  प्रक्रियात्मक प्रोग्रामिंग ),  कार्यात्मक प्रोग्रामिंग  और  तर्क प्रोग्रामिंग  शामिल हैं।

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

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

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

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

डिबगिंग अक्सर एकीकृत विकास वातावरण के साथ किया जाता है। GDB  जैसे स्टैंडअलोन डिबगर्स का भी उपयोग किया जाता है, और ये अक्सर कम दृश्य वातावरण प्रदान करते हैं, आमतौर पर  कमांड लाइन  का उपयोग करते हुए। कुछ पाठ संपादक जैसे  Emacs  GDB को उनके माध्यम से एक दृश्य वातावरण प्रदान करने की अनुमति देते हैं।

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

एलन डाउनी ने अपनी पुस्तक हाउ टू थिंक लाइक ए कंप्यूटर साइंटिस्ट में लिखा है:


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

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

प्रोग्रामर
कंप्यूटर प्रोग्रामर वे होते हैं जो कंप्यूटर सॉफ्टवेयर लिखते हैं। उनकी नौकरियों में आमतौर पर शामिल हैं:

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

यह भी देखें

 * एसीसीयू (संगठन)
 * संगणक तंत्र संस्था
 * कंप्यूटर नेटवर्क
 * नमस्कार विश्व कार्यक्रम
 * विश्लेषकों और प्रोग्रामरों का संस्थान
 * राष्ट्रीय कोडिंग सप्ताह
 * वस्तु पदानुक्रम
 * सिस्टम प्रोग्रामिंग
 * पंच कार्ड युग में कंप्यूटर प्रोग्रामिंग
 * कंप्यूटर प्रोग्रामिंग की कला
 * कंप्यूटिंग में महिलाएं
 * कंप्यूटिंग में महिलाओं की समयरेखा

अग्रिम पठन

 * ए.के. हार्टमैन, कंप्यूटर सिमुलेशन के लिए प्रैक्टिकल गाइड, सिंगापुर: विश्व वैज्ञानिक (2009)
 * ए. हंट, डी. थॉमस, और डब्ल्यू. कनिंघम, द प्रैग्मैटिक प्रोग्रामर। जर्नीमैन से मास्टर तक, एम्स्टर्डम: एडिसन-वेस्ले लॉन्गमैन (1999)
 * ब्रायन डब्ल्यू कर्निघन, द प्रैक्टिस ऑफ़ प्रोग्रामिंग, पियर्सन (1999)
 * वेनबर्ग, जेराल्ड एम., कंप्यूटर प्रोग्रामिंग का मनोविज्ञान, न्यूयॉर्क: वैन नॉस्ट्रैंड रेनहोल्ड (1971)
 * एड्सगर डब्ल्यू डिज्क्स्ट्रा, प्रोग्रामिंग का एक अनुशासन, प्रेंटिस-हॉल (1976)
 * ओ.-जे. डाहल, ई.डब्ल्यू.डिज्क्स्ट्रा, कार। होरे, स्ट्रक्चर्ड प्रोग्रामिंग, अकादमिक प्रेस (1972)
 * डेविड ग्रिज़, प्रोग्रामिंग का विज्ञान, स्प्रिंगर-वेरलाग (1981)



बाहरी संबंध