मुख्य निष्कर्ष
1. जटिलता सॉफ़्टवेयर डिज़ाइन चुनौतियों की जड़ है
जटिलता निर्भरता और अस्पष्टताओं के संचय से उत्पन्न होती है।
जटिलता धीरे-धीरे बढ़ती है। जैसे-जैसे सॉफ़्टवेयर सिस्टम बढ़ते हैं, वे घटकों के बीच निर्भरता और अस्पष्ट कोड अनुभागों के संचय के कारण अधिक जटिल हो जाते हैं। यह जटिलता तीन मुख्य तरीकों से प्रकट होती है:
- परिवर्तन प्रवर्धन: छोटे बदलावों के लिए कई स्थानों पर संशोधन की आवश्यकता होती है
- संज्ञानात्मक भार: डेवलपर्स को बदलाव करने के लिए बड़ी मात्रा में जानकारी समझने की आवश्यकता होती है
- अज्ञात अज्ञात: यह स्पष्ट नहीं होता कि किस कोड को संशोधित करने की आवश्यकता है या कौन सी जानकारी प्रासंगिक है
सरलता इसका उपाय है। जटिलता से निपटने के लिए, सॉफ़्टवेयर डिज़ाइनरों को सरल, स्पष्ट डिज़ाइन बनाने पर ध्यान केंद्रित करना चाहिए जो निर्भरता और अस्पष्टताओं को कम करते हैं। इसमें शामिल है:
- मॉड्यूलर डिज़ाइन: सिस्टम को स्वतंत्र मॉड्यूल में विभाजित करना
- जानकारी छिपाना: मॉड्यूल के भीतर कार्यान्वयन विवरण को संलग्न करना
- स्पष्ट अमूर्तता: सरल इंटरफेस प्रदान करना जो अंतर्निहित जटिलता को छिपाते हैं
2. रणनीतिक प्रोग्रामिंग सामरिक दृष्टिकोणों से बेहतर है
सबसे अच्छा दृष्टिकोण लगातार छोटे निवेश करना है।
दीर्घकालिक सोच बेहतर परिणाम देती है। रणनीतिक प्रोग्रामिंग एक महान डिज़ाइन बनाने पर ध्यान केंद्रित करती है जो काम करती है, बजाय केवल कोड को काम करने के। इस दृष्टिकोण में शामिल है:
- प्रारंभिक डिज़ाइन में समय निवेश करना
- लगातार छोटे सुधार करना
- साफ डिज़ाइन बनाए रखने के लिए कोड को पुनर्गठित करना
सामरिक प्रोग्रामिंग तकनीकी ऋण की ओर ले जाती है। जबकि सामरिक दृष्टिकोण अल्पकालिक में तेज़ लग सकते हैं, वे अक्सर परिणामस्वरूप होते हैं:
- त्वरित सुधार और हैक्स का संचय
- समय के साथ बदलाव करने में बढ़ती कठिनाई
- उच्च दीर्घकालिक विकास लागत
रणनीतिक मानसिकता अपनाकर, डेवलपर्स ऐसे सिस्टम बना सकते हैं जो बनाए रखने और विकसित करने में आसान हों, अंततः लंबे समय में समय और प्रयास की बचत करते हैं।
3. मॉड्यूल गहरे होने चाहिए, उथले नहीं
सबसे अच्छे मॉड्यूल वे हैं जो शक्तिशाली कार्यक्षमता प्रदान करते हैं फिर भी उनके इंटरफेस सरल होते हैं।
गहराई अमूर्तता बनाती है। गहरे मॉड्यूल सरल इंटरफेस के पीछे महत्वपूर्ण कार्यान्वयन जटिलता को छिपाते हैं। यह दृष्टिकोण:
- मॉड्यूल के उपयोगकर्ताओं के लिए संज्ञानात्मक भार को कम करता है
- कार्यान्वयन के संशोधन को आसान बनाता है
- जानकारी छिपाने और संलग्नता को बढ़ावा देता है
उथले मॉड्यूल जटिलता जोड़ते हैं। जिन मॉड्यूल के इंटरफेस उनकी कार्यक्षमता के सापेक्ष जटिल होते हैं, उन्हें उथला माना जाता है। ये मॉड्यूल:
- समग्र सिस्टम जटिलता को बढ़ाते हैं
- अनावश्यक कार्यान्वयन विवरण उजागर करते हैं
- सिस्टम को समझना और संशोधित करना कठिन बनाते हैं
गहरे मॉड्यूल बनाने के लिए, सरल, सहज इंटरफेस डिज़ाइन करने पर ध्यान केंद्रित करें जो अंतर्निहित जटिलता को अमूर्त करते हैं। कार्यक्षमता से इंटरफेस जटिलता के अनुपात को अधिकतम करने का प्रयास करें।
4. अच्छे इंटरफेस जटिलता प्रबंधन की कुंजी हैं
एक मॉड्यूल का इंटरफेस दो प्रकार की जानकारी रखता है: औपचारिक और अनौपचारिक।
अच्छी तरह से डिज़ाइन किए गए इंटरफेस सिस्टम को सरल बनाते हैं। अच्छे इंटरफेस एक मॉड्यूल की कार्यक्षमता का स्पष्ट अमूर्तता प्रदान करते हैं बिना अनावश्यक विवरणों को उजागर किए। उन्हें चाहिए:
- उपयोग में सरल और सहज होना
- कार्यान्वयन जटिलताओं को छिपाना
- औपचारिक (जैसे, विधि हस्ताक्षर) और अनौपचारिक (जैसे, उच्च-स्तरीय व्यवहार विवरण) दोनों जानकारी प्रदान करना
इंटरफेस को सोच-समझकर विकसित करना चाहिए। मौजूदा कोड को संशोधित करते समय:
- मॉड्यूल के इंटरफेस पर प्रभाव पर विचार करें
- कार्यान्वयन विवरणों को उजागर करने से बचें
- इंटरफेस द्वारा प्रदान की गई अमूर्तता को बनाए रखने या सुधारने का प्रयास करें
अच्छे इंटरफेस बनाने और बनाए रखने पर ध्यान केंद्रित करके, डेवलपर्स जटिलता का प्रबंधन कर सकते हैं और अपने सिस्टम को अधिक मॉड्यूलर और समझने में आसान बना सकते हैं।
5. अमूर्तता बनाने के लिए टिप्पणियाँ महत्वपूर्ण हैं
टिप्पणियाँ अमूर्तता को पूरी तरह से पकड़ने का एकमात्र तरीका प्रदान करती हैं, और अच्छी अमूर्तता अच्छे सिस्टम डिज़ाइन के लिए मौलिक हैं।
टिप्पणियाँ अमूर्तता को पूरा करती हैं। जबकि कोड कार्यान्वयन विवरण व्यक्त कर सकता है, टिप्पणियाँ आवश्यक हैं:
- उच्च-स्तरीय डिज़ाइन निर्णयों को पकड़ने के लिए
- विकल्पों के पीछे तर्क
- अपेक्षाएँ और बाधाएँ
- अमूर्तता जो कोड से स्पष्ट नहीं हैं
पहले टिप्पणियाँ लिखें। कोड को लागू करने से पहले टिप्पणियाँ लिखकर:
- आप डिज़ाइन के बारे में अपनी सोच को स्पष्ट करते हैं
- आप अमूर्तता का मूल्यांकन और परिष्कृत कर सकते हैं
- आप सुनिश्चित करते हैं कि दस्तावेज़ीकरण हमेशा अद्यतित है
क्या और क्यों पर ध्यान केंद्रित करें, कैसे नहीं। अच्छी टिप्पणियाँ चाहिए:
- उन चीजों का वर्णन करें जो कोड से स्पष्ट नहीं हैं
- कोड के उद्देश्य और उच्च-स्तरीय व्यवहार की व्याख्या करें
- केवल यह दोहराने से बचें कि कोड क्या करता है
स्पष्ट, सूचनात्मक टिप्पणियों को प्राथमिकता देकर, डेवलपर्स बेहतर अमूर्तता बना सकते हैं और अपने सिस्टम के समग्र डिज़ाइन में सुधार कर सकते हैं।
6. सुसंगत नामकरण और स्वरूपण पठनीयता को बढ़ाते हैं
अच्छे नाम दस्तावेज़ीकरण का एक रूप हैं: वे कोड को समझने में आसान बनाते हैं।
संगति संज्ञानात्मक भार को कम करती है। नामकरण और स्वरूपण के लिए सम्मेलनों की स्थापना और पालन करके, डेवलपर्स कर सकते हैं:
- कोड को अधिक पूर्वानुमानित और पढ़ने में आसान बनाएं
- कोड को समझने के लिए आवश्यक मानसिक प्रयास को कम करें
- असंगतियों को उजागर करें जो बग या डिज़ाइन मुद्दों का संकेत दे सकती हैं
नामों को सावधानी से चुनें। अच्छे नाम होने चाहिए:
- सटीक और अस्पष्टता रहित
- नामित इकाई की स्पष्ट छवि बनाएं
- कोडबेस में लगातार उपयोग किया जाए
स्वरूपण मायने रखता है। सुसंगत स्वरूपण मदद करता है:
- कोड की संरचना को अधिक स्पष्ट बनाना
- संबंधित तत्वों को दृश्य रूप से समूहित करना
- महत्वपूर्ण जानकारी पर जोर देना
नामकरण और स्वरूपण पर ध्यान देकर, डेवलपर्स अपने कोड की पठनीयता और रखरखाव में काफी सुधार कर सकते हैं।
7. साफ डिज़ाइन बनाए रखने के लिए निरंतर परिष्करण आवश्यक है
यदि आप एक साफ सॉफ़्टवेयर संरचना चाहते हैं, जो आपको दीर्घकालिक में कुशलता से काम करने की अनुमति देगी, तो आपको उस संरचना को बनाने के लिए कुछ अतिरिक्त समय लेना होगा।
डिज़ाइन एक सतत प्रक्रिया है। साफ सॉफ़्टवेयर डिज़ाइन की आवश्यकता होती है:
- मौजूदा कोड में सुधार के लिए नियमित पुनर्गठन
- डिज़ाइन निर्णयों का निरंतर मूल्यांकन
- सिस्टम के विकसित होने पर बदलाव करने की इच्छा
सुधार में निवेश करें। साफ डिज़ाइन बनाए रखने के लिए:
- सफाई और पुनर्गठन के लिए समय आवंटित करें
- डिज़ाइन मुद्दों को तुरंत संबोधित करें, इससे पहले कि वे बढ़ें
- प्रत्येक कोड परिवर्तन को समग्र डिज़ाइन में सुधार के अवसर के रूप में देखें
पूर्णता और प्रगति के बीच संतुलन। साफ डिज़ाइन के लिए प्रयास करते समय:
- पहचानें कि कुछ समझौते आवश्यक हो सकते हैं
- क्रमिक सुधार करने पर ध्यान केंद्रित करें
- उन परिवर्तनों को प्राथमिकता दें जो सबसे महत्वपूर्ण लाभ प्रदान करते हैं
डिज़ाइन को परिष्करण की एक सतत प्रक्रिया के रूप में मानकर, डेवलपर्स अपने सिस्टम को साफ और प्रबंधनीय रख सकते हैं क्योंकि वे बढ़ते और विकसित होते हैं।
8. त्रुटि प्रबंधन को सरल बनाना चाहिए, न कि फैलाना
अपवाद प्रबंधन जटिलता को समाप्त करने का सबसे अच्छा तरीका यह है कि अपने एपीआई को इस तरह परिभाषित करें कि संभालने के लिए कोई अपवाद न हो: त्रुटियों को अस्तित्व से बाहर परिभाषित करें।
अपवाद मामलों को कम करें। त्रुटि प्रबंधन को सरल बनाने के लिए:
- एपीआई को असाधारण स्थितियों को कम करने के लिए डिज़ाइन करें
- सामान्य किनारे के मामलों को संभालने के लिए डिफ़ॉल्ट व्यवहार का उपयोग करें
- विचार करें कि क्या अपवाद वास्तव में आवश्यक हैं
त्रुटि प्रबंधन को समेकित करें। जब अपवाद अपरिहार्य होते हैं:
- जहां संभव हो, कई अपवादों को एक ही स्थान पर संभालें
- संबंधित त्रुटियों के प्रबंधन को सरल बनाने के लिए अपवाद पदानुक्रमों का उपयोग करें
- उन अपवादों को पकड़ने से बचें जिन्हें आप अर्थपूर्ण रूप से संभाल नहीं सकते
सामान्य मामलों को आसान बनाएं। अपने कोड के माध्यम से सामान्य, त्रुटि-मुक्त पथ को यथासंभव सरल और स्पष्ट बनाने पर ध्यान केंद्रित करें। यह दृष्टिकोण:
- डेवलपर्स पर संज्ञानात्मक भार को कम करता है
- बग पेश करने की संभावनाओं को कम करता है
- कोड को समझने और बनाए रखने में आसान बनाता है
त्रुटि प्रबंधन को सरल बनाकर, डेवलपर्स अधिक मजबूत और समझने में आसान सिस्टम बना सकते हैं।
9. सामान्य-उद्देश्य कोड विशेष-उद्देश्य समाधान से आमतौर पर बेहतर होता है
भले ही आप किसी वर्ग का विशेष-उद्देश्य तरीके से उपयोग करें, इसे सामान्य-उद्देश्य तरीके से बनाना कम काम है।
सामान्यता पुन: प्रयोज्यता को बढ़ावा देती है। सामान्य-उद्देश्य कोड:
- समस्याओं की एक विस्तृत श्रृंखला पर लागू किया जा सकता है
- अक्सर सरल और अधिक अमूर्त होता है
- साफ इंटरफेस होते हैं
असमय विशेषीकरण से बचें। नई कार्यक्षमता डिज़ाइन करते समय:
- कुछ हद तक सामान्य-उद्देश्य दृष्टिकोण से शुरू करें
- विशिष्ट उपयोग मामलों के लिए जल्दी अनुकूलन करने के आग्रह का विरोध करें
- वास्तविक उपयोग पैटर्न के आधार पर डिज़ाइन को विकसित होने दें
सामान्यता और सरलता के बीच संतुलन। सामान्य-उद्देश्य समाधान के लिए प्रयास करते समय:
- अधिक इंजीनियरिंग या अनावश्यक जटिलता जोड़ने से बचें
- सुनिश्चित करें कि सामान्य-उद्देश्य डिज़ाइन अभी भी सामान्य मामलों के लिए उपयोग में आसान है
- जब वास्तव में आवश्यक हो तो विशेष समाधान बनाने के लिए तैयार रहें
सामान्य-उद्देश्य डिज़ाइन का पक्ष लेकर, डेवलपर्स अधिक लचीले और बनाए रखने योग्य सिस्टम बना सकते हैं जो भविष्य की आवश्यकताओं को संभालने के लिए बेहतर रूप से सुसज्जित हैं।
10. पठनीयता के लिए कोड लिखें, लिखने में आसानी के लिए नहीं
सॉफ़्टवेयर को पढ़ने में आसानी के लिए डिज़ाइन किया जाना चाहिए, लिखने में आसानी के लिए नहीं।
दीर्घकालिक रखरखाव को प्राथमिकता दें। कोड लिखते समय:
- भविष्य के पाठकों के लिए इसे समझने में आसान बनाने पर ध्यान केंद्रित करें
- शॉर्टकट या चतुर चालों से बचें जो कोड के उद्देश्य को अस्पष्ट करते हैं
- स्पष्ट अमूर्तता और दस्तावेज़ीकरण बनाने में समय निवेश करें
कोड को स्पष्ट बनाएं। ऐसा कोड लिखने का प्रयास करें जो:
- न्यूनतम मानसिक प्रयास के साथ जल्दी से समझा जा सके
- स्पष्ट और सुसंगत नामकरण सम्मेलनों का उपयोग करता है
- एक तार्किक और अनुसरण करने में आसान संरचना है
स्पष्टता के लिए पुनर्गठन करें। मौजूदा कोड की नियमित रूप से समीक्षा और सुधार करें:
- जटिल अनुभागों को सरल बनाने के अवसरों की तलाश करें
- लंबे तरीकों को छोटे, अधिक केंद्रित टुकड़ों में विभाजित करें
- डुप्लिकेशन और असंगतियों को समाप्त करें
पठनीयता को लिखने में आसानी पर प्राथमिकता देकर, डेवलपर्स ऐसे सिस्टम बना सकते हैं जिन्हें बनाए रखना, डिबग करना और समय के साथ विस्तारित करना आसान है। यह दृष्टिकोण शुरू में अधिक प्रयास की आवश्यकता हो सकती है लेकिन दीर्घकालिक जटिलता में कमी और टीम की उत्पादकता में सुधार के रूप में भुगतान करता है।
अंतिम अपडेट:
FAQ
What's "A Philosophy of Software Design" about?
- Focus on Complexity: The book addresses the core problem of software design, which is managing complexity. It emphasizes that complexity is the primary challenge in building and maintaining software systems.
- Design Principles: John Ousterhout presents a set of high-level design principles aimed at reducing complexity, such as creating deep modules and defining errors out of existence.
- Practical Advice: The book offers practical advice for software developers on how to think strategically about design, rather than just focusing on getting code to work.
- Educational Approach: It is based on Ousterhout's experience teaching a software design course at Stanford, where students learn through iterative design and code reviews.
Why should I read "A Philosophy of Software Design"?
- Improve Design Skills: The book provides insights into improving software design skills, which can lead to more maintainable and efficient code.
- Strategic Mindset: It encourages a strategic approach to programming, focusing on long-term design quality rather than short-term fixes.
- Real-World Examples: The book includes numerous real-world examples and case studies that illustrate the principles in action.
- Philosophical Insights: It offers philosophical insights into the nature of software design, making it valuable for both novice and experienced developers.
What are the key takeaways of "A Philosophy of Software Design"?
- Complexity is Incremental: Complexity builds up in small increments, and managing it requires constant vigilance and strategic thinking.
- Deep Modules: Modules should have simple interfaces but provide significant functionality, hiding complexity from the rest of the system.
- Information Hiding: Effective information hiding reduces dependencies and makes systems easier to modify and understand.
- Design it Twice: Consider multiple design options before settling on one, as the first idea is rarely the best.
What is the "Design it Twice" principle in "A Philosophy of Software Design"?
- Multiple Options: The principle suggests considering multiple design options for each major decision, rather than settling on the first idea.
- Radical Differences: It encourages exploring radically different approaches to understand the strengths and weaknesses of each.
- Improved Design: By comparing alternatives, you can identify the best design or combine features from multiple designs for a superior solution.
- Learning Opportunity: This process also enhances your design skills by teaching you what makes designs better or worse.
How does "A Philosophy of Software Design" define complexity?
- Practical Definition: Complexity is anything in the software structure that makes it hard to understand and modify.
- Symptoms: It manifests as change amplification, cognitive load, and unknown unknowns, making development tasks more difficult.
- Causes: Complexity arises from dependencies and obscurity, which can be minimized through good design practices.
- Incremental Nature: Complexity accumulates in small increments, requiring a zero-tolerance approach to prevent it from becoming overwhelming.
What is the importance of "Deep Modules" in "A Philosophy of Software Design"?
- Simple Interfaces: Deep modules have simple interfaces that hide the complexity of their implementations, reducing the cognitive load on developers.
- Functionality vs. Interface: They provide significant functionality relative to the complexity of their interfaces, offering a high benefit-to-cost ratio.
- Information Hiding: Deep modules effectively hide information, making it easier to evolve the system without affecting other modules.
- Examples: The book uses examples like Unix I/O and garbage collectors to illustrate the concept of deep modules.
How does "A Philosophy of Software Design" suggest handling exceptions?
- Define Errors Out of Existence: Redefine operations to eliminate error conditions, reducing the need for exception handling.
- Mask Exceptions: Handle exceptions at a low level to prevent them from propagating and complicating higher-level code.
- Aggregate Exceptions: Use a single handler to manage multiple exceptions, simplifying the code and reducing duplication.
- Just Crash: For certain errors, it may be more practical to crash the application rather than handle the exception, especially if recovery is complex.
What role do comments play according to "A Philosophy of Software Design"?
- Essential for Abstraction: Comments are crucial for defining abstractions, as they provide information that can't be captured in code.
- Describe Non-Obvious Information: They should describe things that aren't obvious from the code, such as design rationale and usage constraints.
- Part of Design Process: Writing comments early in the design process can improve both the design and the quality of the comments.
- Avoid Repetition: Comments should not repeat the code but instead provide additional insights and context.
What is the "Investment Mindset" in "A Philosophy of Software Design"?
- Long-Term Focus: The investment mindset emphasizes spending time on design improvements that will pay off in the long run.
- Continuous Improvement: It involves making continual small investments in the system's design to prevent complexity from accumulating.
- Strategic Programming: Developers should prioritize creating a great design over just getting code to work, even if it takes longer initially.
- Payback Period: The book suggests that the benefits of a strategic approach will outweigh the initial costs within 6–18 months.
How does "A Philosophy of Software Design" address the issue of naming?
- Create an Image: Names should create a clear image of what the entity represents, providing precise and intuitive information.
- Consistency: Use names consistently across the codebase to reduce cognitive load and prevent misunderstandings.
- Avoid Vague Names: Names should be specific and avoid generic terms that can lead to ambiguity and errors.
- Impact on Complexity: Good naming practices can significantly reduce complexity and improve code readability.
What are some best quotes from "A Philosophy of Software Design" and what do they mean?
- "Complexity is incremental": This quote highlights the idea that complexity builds up gradually, requiring constant attention to manage.
- "Working code isn’t enough": It emphasizes that simply getting code to work is not sufficient; good design is crucial for long-term success.
- "Modules should be deep": This quote underscores the importance of creating modules with simple interfaces that hide complexity.
- "Define errors out of existence": It suggests redefining operations to eliminate error conditions, simplifying exception handling.
How does "A Philosophy of Software Design" suggest dealing with performance concerns?
- Natural Efficiency: Choose design alternatives that are naturally efficient without sacrificing simplicity.
- Measure Performance: Before optimizing, measure the system to identify the true bottlenecks and ensure changes have a measurable impact.
- Critical Path Design: Focus on optimizing the critical path, the smallest amount of code that must be executed in the common case.
- Simplicity and Speed: Simpler code tends to run faster, and clean design often leads to better performance.
समीक्षाएं
सॉफ़्टवेयर डिज़ाइन का एक दर्शन, दूसरी संस्करण को मिली-जुली समीक्षाएँ प्राप्त होती हैं। कई लोग इसकी जटिलता प्रबंधन और गहरे मॉड्यूल डिज़ाइन करने पर दी गई अंतर्दृष्टियों की प्रशंसा करते हैं, जबकि कुछ इसकी टिप्पणियों पर जोर देने और कुछ क्षेत्रों में गहराई की कमी की आलोचना करते हैं। पाठक इसकी स्पष्ट लेखन शैली और व्यावहारिक सलाह की सराहना करते हैं, विशेषकर नए डेवलपर्स के लिए। हालाँकि, कुछ अनुभवी प्रोग्रामर इसे बहुत बुनियादी मानते हैं या कुछ सिफारिशों से असहमत होते हैं। पुस्तक का ध्यान वस्तु-उन्मुख प्रोग्रामिंग और शैक्षणिक दृष्टिकोण पर है, जिसमें कुछ लोग अधिक विविध भाषा के उदाहरणों और वास्तविक दुनिया के अनुप्रयोगों की इच्छा व्यक्त करते हैं।
Similar Books







