इस किताब को न केवल शुरुआती प्रोग्रामरों को, बल्कि उन लोगों को भी जो लंबे समय से इस क्षेत्र में हैं, पढ़ने की सख्त सलाह देता हूँ। यह किताब रॉबर्ट मार्टिन की "क्लीन कोड" जिसे मैंने पहले पढ़ा था, से काफी मिलती-जुलती है, लेकिन मेरी राय में इसमें बेहतर उदाहरण हैं और अधिक विषयों को कवर किया गया है।
सबसे पहले मैं संक्षेप में किताब के सभी मुख्य अनुभागों का वर्णन करूंगा, साथ ही अपने छोटे-छोटे टिप्पणियों के साथ। उसके बाद मैं समग्र निष्कर्ष लिखूंगा जिसमें किताब के फायदे और नुकसान दोनों का उल्लेख करूंगा। स्पॉइलर: किताब बहुत अच्छी है, और इसके फायदे इसके नुकसानों से कहीं ज्यादा हैं।
सॉफ्टवेयर विकास की मूल बातें
किताब का यह भाग पूरी तरह से प्रोग्रामिंग की बुनियादी अवधारणाओं और इसके विभिन्न हिस्सों तथा सॉफ्टवेयर विकास में शामिल प्रक्रियाओं को समर्पित है। इसमें आवश्यकताओं की परिभाषा, विकास, परीक्षण और रखरखाव जैसे चरणों पर चर्चा की गई है। निश्चित रूप से इन्हें अधिक विस्तार से और रोचक तरीके से समझाया गया है, ताकि पढ़ना उबाऊ न लगे। हालांकि यह अनुभाग विशेष रूप से उन लोगों के लिए उपयोगी होगा जो प्रोग्रामिंग करियर की शुरुआत कर रहे हैं। इस भाग को और बेहतर ढंग से समझाने के लिए इसमें रूपकों और उपमाओं (जैसे कि निर्माण संबंधी उपमा) का प्रयोग किया गया है। अन्य कई ऐसी ही किताबों की तरह, इसमें भी विभिन्न चरणों में की गई गलतियों की लागत का उल्लेख है (फिलहाल सतही तौर पर, क्योंकि इसे नीचे विस्तार से समझाया जाएगा)। इस भाग का एक और प्लस पॉइंट यह है कि इसमें विकास के विभिन्न दृष्टिकोणों — पुनरावृत्त (स्पाइरल) और वॉटरफॉल — का उल्लेख किया गया है। प्रत्येक दृष्टिकोण के लाभ और हानियों का संक्षिप्त विवरण दिया गया है। हालांकि इसमें Scrum या Agile जैसे आधुनिक तरीकों का जिक्र नहीं है, लेकिन लेखक द्वारा बताए गए तरीकों से नौसिखिए के लिए पर्याप्त ज्ञान मिल जाता है। अंत में, लेखक सॉफ्टवेयर की महत्वपूर्ण विशेषताओं का भी उल्लेख करता है, जैसे कि: स्केलेबिलिटी, मेंटेनेबिलिटी, पोर्टेबिलिटी, फॉल्ट टॉलरेंस, सुरक्षा और अन्य।
उच्च गुणवत्ता वाला कोड
अगर आप सोच रहे हैं कि काफी मात्रा में रोचक सामग्री पढ़ने के बाद अब आप सीधे अच्छे कोडिंग अभ्यासों और चर्चित विषयों जैसे फंक्शन के नामकरण, वेरिएबल्स, टैब्स और स्पेस के उपयोग में गोता लगाएंगे, तो आप गलत हैं। इसके आगे पूरा एक खंड सॉफ्टवेयर डिज़ाइन को समर्पित है। मैं यह नहीं कहूंगा कि यह खंड वास्तुकला (जैसे कि ओनियन आर्किटेक्चर या माइक्रोसर्विस) के बारे में सीधे बात करता है। बल्कि यह प्रणाली के समग्र विवरण और इसके बड़े मॉड्यूल के निर्धारण, फिर व्यक्तिगत कक्षाओं और अंततः उनकी विधियों के डिज़ाइन पर केंद्रित है। यह एक प्रकार का अमूर्त प्रोग्रामिंग है जिसमें डायग्राम और ब्लॉक स्कीम्स का उपयोग किया गया है। मैं यह दावा नहीं कर सकता कि आजकल यह दृष्टिकोण (ब्लॉक स्कीम्स और डायग्राम्स वाला) हर जगह उपयोग किया जाता है। मुझे स्वयं कॉलेज और विश्वविद्यालय के दिनों में ही इसका सामना करना पड़ा था। काम के दौरान मैंने और मेरे मित्रों ने कभी ब्लॉक स्कीम्स नहीं बनाए।
इसके अलावा, इस भाग में OOP (ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग) की चर्चा की गई है, और फंक्शनल प्रोग्रामिंग के संदर्भ में यह इतना सीधा नहीं है। इसलिए इस भाग को पढ़ना दिलचस्प है, लेकिन इसे व्यावहारिक रूप में लागू करना कितना उपयोगी है — यह एक बड़ा प्रश्न है।
यह अनुभाग मुख्यतः छोटी और मध्यम समस्याओं को हल करने के बारे में है, न कि पूर्ण परियोजनाओं के बारे में। इसमें प्रौद्योगिकियों का कोई उल्लेख नहीं है, बल्कि केवल अमूर्तताओं का उपयोग और SOLID सिद्धांतों का पालन करने की बात की गई है। वैसे OOP दृष्टिकोण को यहां अच्छी तरह से समझाया गया है। निश्चित ही, इसके लिए कोई पूरी किताब पढ़ी जा सकती थी, लेकिन नौसिखियों के लिए इतना भी पर्याप्त है। इसमें अच्छे और उचित नामकरण पर भी काफी ध्यान दिया गया है। यह समझाया गया है कि कब अलग-अलग मेथड्स बनाने चाहिए और कब नहीं। अपवादों और त्रुटि प्रबंधन पर भी कुछ बातें की गई हैं। एक और रोचक पॉइंट है नौसिखियों के लिए छद्मकोड (pseudocode) के माध्यम से प्रोग्रामिंग। मैं इसे पेपर प्रोग्रामिंग भी कहता हूं। यदि शुरुआती लोग नहीं जानते कि किसी एल्गोरिथ्म को कैसे लिखें, तो यह उनके लिए विशेष रूप से उपयोगी है।
वेरिएबल्स
अब इस भाग से मैं सलाह दूंगा कि किताब को और ध्यान से पढ़ें, भले ही आप अनुभवी डेवलपर क्यों न हों और कई परियोजनाएं पूरी कर चुके हों।
सौ पृष्ठों की सामग्री। लग सकता है कि वेरिएबल्स के बारे में क्या इतना लिखा जा सकता है? लेकिन यहां काफी उपयोगी बातें हैं। यह अनुभाग रोचक प्रश्नों के साथ शुरू होता है, जैसे डेटा प्रकारों का ज्ञान (जैसे कि ट्रीज़, हीप्स आदि)। विभिन्न भाषाओं में वेरिएबल्स के अच्छे और बुरे इनिशियलाइज़ेशन के उदाहरण दिए गए हैं। विजुअल चित्रों की मदद से स्कोप को समझाया गया है। स्कोप को कम करने के सामान्य सुझाव भी सूचीबद्ध किए गए हैं।
डेटा की जीवन अवधि, अस्थायी वेरिएबल्स के नामकरण, स्टेटस फ्लैग्स, विभिन्न भाषाओं के नामकरण कन्वेंशन्स, उचित संक्षिप्त नाम और सामान्यतः स्वीकृत उपसर्गों की चर्चा की गई है।
इस भाग के अंत में डेटा प्रकारों और उनकी सीमाओं का गहरा परिचय दिया गया है: फ्लोटिंग पॉइंट नंबर, एनम्स, कॉन्स्टैंट्स, कस्टम डेटा प्रकार, ऐरे, स्ट्रक्चर्स और पॉइंटर्स।
ऑपरेटर्स
इस भाग में कोड की अनुक्रमिक संरचना, कंडीशनल ऑपरेटर्स और लूप्स के उपयोग की चर्चा की गई है। यह अनुभाग भी सौ पृष्ठों में फैला हुआ है, इसलिए इसमें कई चीजें विस्तार से समझाई गई हैं। उदाहरण के लिए, विभिन्न भाषाओं — C, C++, C#, Java और Visual Basic — में समान लूप्स के निर्माण और प्रदर्शन का तुलनात्मक विश्लेषण दिया गया है। साथ ही, रिकर्शन और goto जैसे विषयों को भी छुआ गया है।
कोड में सुधार
यह अनुभाग निम्नलिखित अध्यायों में विभाजित है:
- सॉफ्टवेयर की गुणवत्ता
- सहयोगात्मक निर्माण
- डेवलपर्स द्वारा किया गया परीक्षण
- डिबगिंग
- रिफैक्टरिंग
- कोड ऑप्टिमाइजेशन की रणनीतियाँ
- कोड ऑप्टिमाइजेशन की तकनीकें
शुरुआत में फिर से सॉफ्टवेयर के आवश्यकताओं और गुणों का उल्लेख है — वही जो पहले भाग में था। बग्स को ढूंढने और सुधारने की लागत की चर्चा है। यह अनुभाग मुख्यतः सैद्धांतिक है, इसमें कोड कम है। पेयर प्रोग्रामिंग का उल्लेख है। जैसा कि मैंने पहले अनुभाग में लिखा, यहां की सामग्री थोड़ी विवादास
सिस्टम संबंधी प्रश्न
इस अनुभाग में निम्नलिखित अध्याय शामिल हैं:
- कार्यक्रम के आकार का निर्माण पर प्रभाव
- निर्माण का प्रबंधन
- एकीकरण
- प्रोग्रामिंग उपकरण
यहाँ क्या दिलचस्प है? उदाहरण के लिए, इस बात पर चर्चा की गई है कि टीम का आकार उत्पादकता को कैसे प्रभावित कर सकता है, साथ ही यह भी बताया गया है कि टीम के आकार के आधार पर कुल कोड में प्रोग्रामर का योगदान लगभग कितना होता है। यह भी बताया गया है कि परियोजना के कोड की पंक्तियों की संख्या त्रुटि घनत्व से कैसे संबंधित है। शायद ग्राफ और तालिकाएँ थोड़ी विवादास्पद हैं, लेकिन इसे पढ़ना उपयोगी है। विशेष रूप से, मैं इस अनुभाग को प्रबंधकों को पढ़ने की सलाह दूंगा।
कुल मिलाकर, यह अनुभाग सैद्धांतिक है और इसमें लगभग कोई कोड नहीं है। परियोजना के दौरान आवश्यकताओं में बदलाव और इसके कारण परियोजना में देरी पर भी चर्चा की गई है। साथ ही, प्रोग्रामर और टीम से संबंधित मुख्य कारकों की सूची दी गई है, जो गति को प्रभावित कर सकते हैं। लेखक ने इन कारकों में शामिल किया है:
- प्रोग्रामर का अनुभव और क्षमता;
- टीम की प्रेरणा;
- प्रबंधन की गुणवत्ता;
- पुनः प्रयुक्त कोड की मात्रा;
- कर्मचारियों का स्थानांतरण दर;
- आवश्यकताओं में परिवर्तनशीलता;
- और अन्य।
प्रोग्रामरों के साथ संबंध और संचार बनाने के मुद्दे पर भी चर्चा की गई है। उदाहरण के लिए, यह कि प्रोग्रामर अपना समय कैसे व्यतीत करते हैं। यानी उस समय भी बर्नआउट का मुद्दा प्रासंगिक था। यहाँ एक और विषय का भी उल्लेख किया गया है, जो "धार्मिक" प्रश्नों से संबंधित है — जैसे कि IDE का चयन, नामकरण और कोड शैली, लिंटर का उपयोग आदि।
एकीकरण के विषय पर चर्चा की गई है — चरणबद्ध और वृद्धिशील, टी-आकार का और अन्य प्रकार। प्रत्येक के फायदे और नुकसान का वर्णन किया गया है। लेकिन सामग्री थोड़ी विवादास्पद है, क्योंकि आधुनिक CI/CD के बारे में कुछ भी नहीं कहा गया है।
प्रोग्रामिंग में महारत
अंततः, यह पुस्तक का सामान्य अनुभाग है, जिसमें कई अन्य अनुभाग शामिल हैं और पहले पढ़े गए अनुभागों का संदर्भ दिया गया है। सामान्य सुझावों को स्पष्ट किया गया है, साथ ही कोड के कई उदाहरण दिए गए हैं — टिप्पणियों को रखने से लेकर कक्षाओं और विधियों के साथ काम करने तक। मैं यह नहीं कहूंगा कि इस अनुभाग को पूरी पुस्तक का निष्कर्ष माना जा सकता है — बल्कि, यह पिछले भागों का पूरक है। यह अनुभाग लेखक के नैतिक उपदेशों के साथ समाप्त होता है, उदाहरण के लिए, आलस्य, सटीकता और अन्य गुणों के प्रति कैसा दृष्टिकोण रखना चाहिए। अंत में एक विशाल साहित्य सूची दी गई है, जो कम से कम यह दर्शाती है कि पुस्तक के लेखन के दौरान पेशेवर दृष्टिकोण अपनाया गया और इसे सावधानीपूर्वक तैयार किया गया।
निष्कर्ष
यह पुस्तक लगभग 900 पृष्ठों की है, लेकिन इससे डरने की जरूरत नहीं है, क्योंकि इसमें प्रस्तुत सामग्री, मेरी राय में, रॉबर्ट मार्टिन की तुलना में भी कहीं बेहतर है। आइए पुस्तक के मुख्य फायदे और नुकसान को सूचीबद्ध करें।
नुकसान:
- पुस्तक बहुत बड़ी है, और हर किसी के लिए इसे पढ़ना आसान नहीं है।
- प्रकाशन वर्ष बहुत नया नहीं है, इसलिए कुछ उदाहरण और विषय पुराने हो सकते हैं। उदाहरण के लिए, कुछ आधुनिक प्रोग्रामिंग भाषाओं का उल्लेख नहीं है, और एप्लिकेशन डिप्लॉयमेंट के आधुनिक दृष्टिकोण और सॉफ़्टवेयर विकास तकनीकें अब काफी बदल चुकी हैं।
फायदे:
- उत्कृष्ट और स्पष्ट संरचना।
- आसानी से पढ़ी जा सकती है।
- हर अध्याय के अंत में एक संक्षिप्त सारांश और महत्वपूर्ण बिंदुओं की सूची दी गई है।
- अक्सर खराब कोड के उदाहरण दिए गए हैं और फिर उन्हें बेहतर कोड में परिवर्तित किया गया है।
- कोड विभिन्न भाषाओं में प्रस्तुत किया गया है, साथ ही विभिन्न भाषाओं में एल्गोरिदम की तुलना भी की गई है।
यह पुस्तक निश्चित रूप से उत्कृष्ट है। मैं कहूंगा कि यह प्रोग्रामिंग पर सर्वश्रेष्ठ सैद्धांतिक पुस्तकों में से एक है, जिसे शुरुआती और अनुभवी डेवलपर्स दोनों को पढ़ना चाहिए।