- मैं अपनी सॉफ़्टवेयर डिज़ाइन क्षमता बेहतर बनाने की कोशिश कर रहा हूँ, और मुझे सलाह दी गई कि मौजूदा अच्छी तरह डिज़ाइन किए गए कोडबेस का अध्ययन करूँ
- मैं जानना चाहता हूँ कि सार्वजनिक रूप से उपलब्ध कोडबेस में से किन्हें सॉफ़्टवेयर डिज़ाइन का गोल्ड स्टैंडर्ड माना जाता है
1. सिफारिश किए गए कोडबेस
- बड़े/प्रतिनिधि प्रोजेक्ट
- Git, Postgres, CPython
- Linux Kernel का "lieutenants model"
- UNIX v6, BSDs
- फ्रेमवर्क/लाइब्रेरी
- सिस्टम/सर्वर
- गेम/विशेष मामले
- शैक्षिक/सीखने की सामग्री
- अन्य
- Monocypher (क्रिप्टोग्राफी लाइब्रेरी)
- Tcl भाषा का implementation
2. कोड पढ़ना बनाम दस्तावेज़/डिज़ाइन सीखना
- सिर्फ कोड की सीमाएँ
- कोडबेस implementation दिखाता है, लेकिन डिज़ाइन का इरादा या trade-offs छिपे रहते हैं
- डिज़ाइन दस्तावेज़ों का महत्व
- ADR (Architectural Decision Records), Rust RFCs, Python PEPs जैसे decision records डिज़ाइन सीखने के लिए कहीं अधिक उपयोगी हैं
- डिज़ाइन दस्तावेज़ लिखना खुद में एक अभ्यास हो सकता है
- किताबें/साहित्य की सिफारिश
3. प्रैक्टिस-केंद्रित सीखने का दृष्टिकोण
- अनुभव और trial-and-error
- डिज़ाइन बार-बार समस्याओं का सामना करके और उनसे बचना सीखकर आती है
- सिर्फ कोड पढ़ने से सीख पूरी नहीं होती; खुद लिखने और विफलताओं को हल करने की प्रक्रिया में सीख मिलती है
- रुचि-आधारित सीखना
- जिन प्रोजेक्ट्स में आपकी रुचि हो, उन्हें बनाने से आप गहराई से सीखते हैं
- विफलता की कम लागत
- सॉफ़्टवेयर में भौतिक इंजीनियरिंग की तुलना में विफलता की लागत कम होती है, इसलिए कोशिश और असफलता के जरिए सीखना प्रभावी है
4. सॉफ़्टवेयर इंजीनियरिंग की प्रकृति पर बहस
- अपरिपक्व इंजीनियरिंग का तर्क
- अगर पाँच इंजीनियर इकट्ठा हों और पाँच अलग समाधान दें, तो इसे इंजीनियरिंग के रूप में अपरिपक्वता का संकेत माना जा सकता है
- प्रयोग-अनुकूल प्रकृति का तर्क
- सॉफ़्टवेयर में सीमाएँ कम होती हैं, इसलिए कई तरह के समाधान संभव हैं; भौतिक इंजीनियरिंग की तरह एक तय सही जवाब नहीं होता
- कला और इंजीनियरिंग की सीमा
- डिज़ाइन सौंदर्य तत्वों वाली एक कलात्मक क्रिया भी है, लेकिन कार्यात्मक आवश्यकताओं को पूरा करने के पहलू में यह इंजीनियरिंग भी है
- सॉफ़्टवेयर कलात्मक लचीलेपन और इंजीनियरिंग की कठोरता के बीच स्थित है
5. वैकल्पिक सीखने के तरीके
- खराब कोड का विश्लेषण
- अच्छी तरह डिज़ाइन किए गए कोड के साथ-साथ कमज़ोर कोडबेस को सुधारना भी बहुत बड़ा सीखने का प्रभाव देता है
- अपने कोडबेस से सीखना
- टीम के अंदरूनी कोडबेस को सबसे अधिक सीख देने वाली सामग्री माना गया
- लेकिन अगर टीम का कोड कमज़ोर हो, तो बाहरी उदाहरणों को साथ में देखना ज़रूरी है
- डोमेन-अनुकूल सीखना
- जिस समस्या को आप हल करना चाहते हैं, उससे मिलते-जुलते कोडबेस पढ़ना सबसे प्रभावी है
मुख्य इनसाइट्स
- अच्छी तरह डिज़ाइन किए गए कोडबेस मददगार होते हैं, लेकिन सीख तभी पूरी होती है जब डिज़ाइन के इरादे को समझा जाए और trial-and-error साथ चले
- सिर्फ कोड पढ़ने से ज्यादा डिज़ाइन दस्तावेज़ और decision records मुख्य सीखने की सामग्री हैं
- प्रमुख उच्च-गुणवत्ता वाले प्रोजेक्ट्स (Git, Postgres, CPython, Rust std आदि) सीखने के लिए बहुत मूल्यवान हैं
- सिर्फ अच्छे कोड ही नहीं, बल्कि कमज़ोर कोड और अपने खुद के कोड से सीखना लंबी अवधि में अधिक व्यावहारिक है
मुख्य टिप्पणियों का सार
प्रतिनिधि कोडबेस की सिफारिश (CraigJPerry)
- Postfix mail server
- security-केंद्रित architecture, जो microservices की अवधारणा से पहले ही मिलती-जुलती संरचना दिखाता है
- जहाँ आधुनिक microservices बड़े संगठनों में distributed systems पर ज़ोर देती हैं, Postfix को security और simplicity के लिए डिज़ाइन किया गया था
- Spring Framework
- इसमें enterprise environment के Java developers की ज़रूरतों को गहराई से समझने वाली संस्कृति झलकती है
- इससे user-centered design approach सीखी जा सकती है
- Git
- object database (blob, tree, commit) और references की अवधारणा समझ लें, तो बाकी सब उसका क्रमिक विस्तार है
- मुख्य अवधारणाओं का लगातार विस्तार अच्छे डिज़ाइन का उदाहरण है
- Varnish
- high-performance reverse proxy होने के साथ-साथ इतना सुव्यवस्थित कोडबेस है कि इसे learning tool की तरह भी इस्तेमाल किया जा सकता है
- Linux Kernel Lieutenants Model
- यह कोडबेस नहीं है, लेकिन बड़े पैमाने के सॉफ़्टवेयर प्रबंधन मॉडल के रूप में देखने लायक है
- ये सिर्फ "अच्छी तरह डिज़ाइन किया गया कोड" नहीं, बल्कि ऐसे उदाहरण हैं जहाँ डिज़ाइन निर्णय गहरी छाप छोड़ते हैं
व्यावहारिक कोडबेस से सीखने पर ज़ोर (crystal_revenge)
- सबसे बड़ा सीखने का मूल्य अपनी टीम के कोडबेस से मिलता है
- वास्तविक requirements और implementation के बीच के अव्यवस्थित जुड़ाव की प्रक्रिया में अच्छे और बुरे दोनों विकल्पों का अनुभव होता है
- वास्तविक constraints में सबसे बड़ा तत्व समय का दबाव है, और आदर्श डिज़ाइन व वास्तविकता के बीच संतुलन सीखना ही मुख्य बात है
- अच्छा सॉफ़्टवेयर वह है जो यूज़र की ज़रूरतें हल करे, और बार-बार के अनुभव से ऐसी डिज़ाइन सीखी जाती है जो सफलता की संभावना बढ़ाती है
पिछली चर्चाएँ और सामग्री लिंक (sprobertson)
- HN पर यही विषय कई बार उठ चुका है
कोड बनाम डिज़ाइन दस्तावेज़ (alphazard)
- कोडबेस implementation का परिणाम है, स्वयं डिज़ाइन नहीं
- डिज़ाइन सीखने के लिए डिज़ाइन दस्तावेज़ लिखना अधिक प्रभावी है
- दस्तावेज़ इतने स्पष्ट होने चाहिए कि कोई दूसरा व्यक्ति उन्हीं के आधार पर implementation कर सके
- अगर विकल्पों की सूची बनाई जाए और यह भी दर्ज हो कि उन्हें क्यों छोड़ा गया, तो यह डिज़ाइन संबंधी विचार-विमर्श का प्रमाण बनता है
- अच्छा डिज़ाइनर वह है जो अधिक व्यापक design space पर विचार करे और उसमें सही बिंदु चुने
पूरे सिस्टम की समझ पर ज़ोर (RossBencina)
- पूरे कोडबेस को समझने की प्रक्रिया बेहद मूल्यवान है
- इससे सिर्फ अच्छा कोड नहीं, बल्कि सिस्टम की बड़ी तस्वीर देखने का अभ्यास होता है
- UML जैसे diagrams के जरिए संबंधों को visualise करना मददगार होता है
- सीखने का तरीका:
- जिस तरह का सॉफ़्टवेयर आप बना रहे हैं, उससे मिलता-जुलता सॉफ़्टवेयर पढ़ना प्रभावी है
- ऐसे डोमेन के कोड से शुरू करने की सलाह है जिन्हें आप पहले से जानते हों (web framework, web server, Python standard library, VSCode आदि)
- शुरुआत में छोटे प्रोग्राम और परिचित डोमेन से शुरू करना बेहतर है
अच्छे डिज़ाइन का मानदंड (mamcx)
- अच्छा डिज़ाइन लक्ष्य और विचार है, और कोडबेस उससे जुड़ी implementation की गुणवत्ता दिखाता है
- अच्छा डिज़ाइन सिर्फ "तेज़ है, सुरक्षित है" जैसे विशेषण नहीं, बल्कि ठोस विचार और trade-offs का रिकॉर्ड भी होना चाहिए
- उदाहरण: Erlang, शुरुआती Pascal, और कई RDBMS डिज़ाइनों में यह विशेषता देखी जा सकती है
- Rust की std लाइब्रेरी security और consistency पर ज़ोर देती है, और उसका कोड व दस्तावेज़ इसे ईमानदारी से दर्शाते हैं; इसलिए यह सीखने की अच्छी सामग्री है
नज़र न आने वाले डिज़ाइन निर्णय (ben30)
- अच्छी तरह डिज़ाइन किए गए कोडबेस में सबसे महत्वपूर्ण हिस्सा वह होता है जो दिखाई नहीं देता
- complexity को बाहर रखना, अनावश्यक abstraction से बचना, और कुछ patterns को अस्वीकार करना जैसी अनुपस्थिति में लिए गए निर्णय असली कुंजी हैं
- इसे पूरक करने के लिए ADR (Architectural Decision Records) उपयोगी हैं
- इनमें विकल्प, उन्हें छोड़ने के कारण, और चयन के आधार दर्ज होते हैं, जिससे संदर्भ बचा रहता है
- भविष्य के maintainers और AI tools, दोनों के लिए यह बहुत मददगार होता है
- सीखते समय सिर्फ कोड नहीं, बल्कि ADR, RFC, PEP जैसे डिज़ाइन decision documents वाले प्रोजेक्ट्स भी देखना प्रभावी है
अभी कोई टिप्पणी नहीं है.