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

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

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

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

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

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

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

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



संकलक भाषाएं
उच्च-स्तरीय भाषाओं ने प्रोग्राम को विकसित करने की प्रक्रिया को सरल और अधिक समझने योग्य, और अंतर्निहित संगणक धातु सामग्री से कम बाध्य किया है।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

कार्यान्वयन विधियों में अनिवार्य भाषाएं (वस्तु उन्मुख कार्यकर्म या प्रक्रियात्मक प्रोग्रामिंग), कार्यात्मक प्रोग्रामिंग और तर्क प्रोग्रामिंग सम्मिलित होता हैं।

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

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

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

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

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

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

सॉफ्टवेयर विकास के लिए प्रोग्रामिंग भाषाएं आवश्यक हैं। वह सबसे सरल अनुप्रयोगों से लेकर सबसे परिष्कृत तक, सभी सॉफ़्टवेयर के लिए बिल्डिंग ब्लॉक हैं।

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


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

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

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

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

यह भी देखें

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

अग्रिम पठन

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



बाहरी संबंध