- Robert “Uncle Bob” Martin और John Ousterhout के बीच सितंबर 2024 से फ़रवरी 2025 तक चली सॉफ़्टवेयर डिज़ाइन पर बातचीत
- दोनों ने सॉफ़्टवेयर डिज़ाइन पर पुस्तकें लिखी हैं
- तीन मुख्य विषयों (मेथड की लंबाई, टिप्पणियाँ, Test-Driven Development) पर दोनों के विचार अलग थे
- बातचीत का केंद्र कोड की जटिलता कम करने, पठनीयता बढ़ाने, और उपयुक्त तरीके से टेस्ट लिखने पर था
मेथड की लंबाई
- Uncle Bob (आगे UB) ने इस रुख पर ज़ोर दिया कि “छोटे फ़ंक्शन बेहतर होते हैं, और संभव हो तो उन्हें और छोटा बाँटना चाहिए”
- एक मेथड को सिर्फ़ एक ही “काम (One Thing)” करना चाहिए
- लेकिन इसे बहुत चरम रूप में लागू करने पर अत्यधिक विखंडन (over-decomposition) हो सकता है
- John ने कहा कि बहुत छोटे मेथड पूरे फ़्लो को समझना उल्टा कठिन बना सकते हैं
- अगर बहुत सारे “shallow” मेथड हों, तो किसी एक फ़ीचर को समझने के लिए उससे जुड़े सभी मेथड देखने पड़ते हैं
- मेथड्स के बीच पारस्परिक निर्भरता (“entanglement”) बढ़ जाती है, जिससे कोड पढ़ने का बोझ बढ़ता है
PrimeGenerator उदाहरण
- UB का मूल कोड लगभग 8 छोटे मेथड्स में बँटा था, और वे आपस में इस तरह जुड़े थे कि उसे समझना मुश्किल था
- John के संस्करण में एक ही मेथड के भीतर पर्याप्त टिप्पणियाँ थीं, ताकि पूरा फ़्लो एक नज़र में समझ आ सके
- UB ने भी कुछ हद तक माना कि “अत्यधिक विखंडन हुआ था”
- निष्कर्षतः, दोनों मानते हैं कि कोड को विभाजित करना महत्वपूर्ण है, लेकिन “बहुत ज़्यादा छोटा तोड़ना” और “बहुत बड़ा छोड़ देना” के बीच संतुलन बनाना ही असली बात है
टिप्पणियाँ
- UB टिप्पणियों को “आवश्यक बुराई (necessary evil)” के रूप में देखते हैं
- उनका मानना है कि टिप्पणियाँ अक्सर अपडेट नहीं होतीं या उनमें गलत जानकारी होने का जोखिम रहता है
- वे पसंद करते हैं कि कोड खुद ही अपनी मंशा स्पष्ट करे, और ज़रूरत पड़े तो बहुत लंबे नाम इस्तेमाल किए जाएँ
- John का कहना है कि टिप्पणियाँ ज़रूरी हैं
- अगर इंटरफ़ेस (मेथड) का उद्देश्य या implementation intent अंग्रेज़ी में साफ़ लिखा हो, तो दूसरे डेवलपर्स का बेवजह कोड खंगालने में लगने वाला समय बचता है
- उनके अनुसार “सबसे ख़तरनाक स्थिति वह है जब टिप्पणियाँ न हों और कोड को सीधे खुद समझना पड़े”
PrimeGenerator के उदाहरण में John ने कहा कि अगर यह बताने वाली टिप्पणी न हो कि “एल्गोरिदम इस तरह क्यों काम करता है”, तो इसे समझना बहुत कठिन हो जाता है
- UB का रुख है कि “अगर टिप्पणी सटीक न हो तो वह उल्टा नुकसान करती है”, जबकि John का मानना है कि “गलत टिप्पणी से भी अधिक हानिकारक है कोई टिप्पणी न होना”
- दोनों किसी हद तक इस बात पर सहमत थे कि “टीम और परिस्थिति के अनुसार उचित स्तर की टिप्पणियाँ होनी चाहिए”, लेकिन कुल मिलाकर John टिप्पणियों के मूल्य को कहीं अधिक महत्व देते हैं
John का PrimeGenerator रिफैक्टरिंग
- John ने मूल 8-मेथड वाले कोड को फिर से एक एकल मेथड, या 2~3 मेथड्स के रूप में पुनर्गठित किया
- ज़रूरी जगहों पर भरपूर टिप्पणियाँ जोड़कर यह समझाया कि “इसे इस तरह क्यों implement किया गया है”
- टिप्पणियों में मुख्य वेरिएबल्स (
multiples, primes) की मंशा और एल्गोरिदम के काम करने का तरीका दोनों बताया गया, ताकि कोड जल्दी समझ में आए
- UB ने कहा कि यह कोड भी पूरी तरह सहज नहीं था
- जटिल एल्गोरिदम को समझाने के लिए फिर भी समय चाहिए था, और लेखक को खुद समीक्षा करते समय कठिनाई महसूस हुई
Bob का PrimeGenerator2 रिफैक्टरिंग
- यह John के कोड का UB द्वारा थोड़ा संशोधित संस्करण था
- कुछ मेथड्स को और अलग करके “आगे की रिफैक्टरिंग” लागू की गई
- लूप वाले हिस्से में पठनीयता बढ़ी, लेकिन अस्थायी रूप से performance में गिरावट आई
- John ने कहा कि “बहुत छोटे मेथड्स में बाँटने से performance समस्याएँ आ सकती हैं”, और UB ने फिर संशोधन करके performance सुधारी
- फिर भी, क्योंकि UB की पसंद “टिप्पणियों को न्यूनतम रखना” है, John अपनी इस बात पर कायम रहे कि “और स्पष्टीकरण हों तो समझना आसान होगा”
Test-Driven Development
- UB ने TDD के उस तरीके की मज़बूती से वकालत की जिसमें छोटे चक्रों में पहले टेस्ट लिखा जाता है, फिर उस failing test को पास कराने के लिए थोड़ा-थोड़ा कोड जोड़ा जाता है
- उनका कहना है कि इस तरीके से कोड हमेशा test coverage बनाए रखता है और जटिल debugging से बचा जा सकता है
- उनका रुख है कि कोड को बार-बार रिफैक्टर करते हुए धीरे-धीरे साफ़ बनाया जाता है
- John को चिंता थी कि TDD बहुत अधिक “tactical approach” बन सकता है
- उनका तर्क था कि “पहले डिज़ाइन आना चाहिए, लेकिन TDD पहले कोड लिखने (टेस्ट के लिए न्यूनतम implementation) की ओर ले जाता है”
- उनका मानना है कि अच्छा डिज़ाइन थोड़ा व्यापक दायरे में पहले सोचा जाना चाहिए, और फिर उस कोड के लिए टेस्ट को bundled रूप में लिखना बेहतर है
- UB का कहना है कि “TDD को गलत तरीके से लागू करने पर समस्याएँ हो सकती हैं”, लेकिन सही ढंग से करने पर यह test coverage और redesign (refactoring) दोनों में मदद करता है
- John ने चिंता जताई कि “शुरुआती लोगों के लिए TDD उल्टा कोड को जल्दी अव्यवस्थित बना सकता है”
- अंततः दोनों इस बात पर सहमत थे कि “TDD भी और bundling approach भी, अगर सही ढंग से किया जाए, तो दोनों बेहतरीन कोड दे सकते हैं”, लेकिन कौन बेहतर है, इस पर मतभेद बना रहा
समापन
- John:
- उन्हें चिंता है कि “Clean Code” बहुत छोटे फ़ंक्शन्स में विभाजन और टिप्पणियों को दबाने पर ज़ोर देता है, जिससे पाठक उसे चरम रूप में अपनाने लग सकते हैं
- पर्याप्त टिप्पणियाँ न होने पर कोड समझना मुश्किल हो जाता है, और अंततः डेवलपर्स को अधिक समय खर्च करना पड़ता है
- उन्होंने यह भी कहा कि TDD में बड़े चित्र वाला डिज़ाइन छूट सकता है
- UB:
- उन्होंने कहा कि “Clean Code” के दूसरे संस्करण में कुछ हद तक सुधार किए गए हैं और John की कुछ राय शामिल की गई है
- अलग-अलग अनुभवों और दृष्टिकोणों का सम्मान करते हुए उन्होंने इस साझा बिंदु पर ज़ोर दिया कि “सभी को साफ़ और maintainable कोड की दिशा में काम करना चाहिए”
- निष्कर्षतः, दोनों सॉफ़्टवेयर डिज़ाइन के महत्व और “कोड को पढ़ने में आसान बनाना” को सर्वोच्च मूल्य मानते हैं
- हालाँकि मेथड विभाजन के मानदंड, टिप्पणियों के उपयोग, और टेस्ट लिखने के क्रम जैसे मुद्दों पर दोनों की स्थितियाँ अलग हैं
- मुख्य बात यह है कि टीम के माहौल और कोड संरचना के अनुसार संतुलन बनाया जाए, और डिज़ाइन को लगातार बेहतर करने का प्रयास जारी रखा जाए
14 टिप्पणियां
मेरे पास Clean series की कई किताबें हैं, लेकिन वे बस एक तरह की meta-cognitive reference के तौर पर ही ठीक लगती हैं। अगर उन्हें सिद्धांत या नियम की तरह लिया जाए तो यह बहुत थकाऊ हो जाता है, और व्यावहारिक भी नहीं रहता। Uncle Bob हमेशा SOLID principles की बात करते हैं, लेकिन व्यक्तिगत रूप से मुझे उनमें बहुत ज़्यादा practical content नहीं लगता।
मेरे हिसाब से
Code Complete,Clean Codeसबसे ज़्यादा overhyped किताबों की रैंकिंग में संयुक्त रूप से पहले स्थान पर हैं।क्या Software Philosophy का अनुवादित संस्करण आया है? खोजने पर मुझे नहीं मिल रहा।
विडंबना यह है कि अच्छे कोड पर यह बताने वाली किताबों की बजाय, शायद व्यंग्यात्मक अंदाज़ में यह सिखाने वाली किताब कि कोड को maintenance के लिए मुश्किल कैसे बनाया जाए, ज़्यादा आसानी से समझ में आएगी।
आजकल मुझे लगता है कि clean code से ज़्यादा बहस उन लोगों से हुई है जो किसी खास tech stack या architecture के इतने fan होते हैं कि जैसे अगर यह tech stack या architecture अपनाया नहीं गया तो बहुत बड़ी मुसीबत हो जाएगी। लगता है कि चीज़ों को स्थिति देखकर लागू करना सही है; हर चीज़ हर हाल में अच्छी नहीं होती।
यह एक शानदार चर्चा है।
वैसे सोचूँ तो, मैं जूनियर्स को John की philosophy of sw design की सिफारिश करता हूँ, लेकिन clean code की खास तौर पर सिफारिश नहीं की थी।
मुझे लगता है कि किसी भी headline का आँख मूंदकर पालन करने के बजाय, उसके संदर्भ को अच्छी तरह समझकर लागू करना ज़्यादा महत्वपूर्ण है।
कोडिंग self-help किताबें उन शुरुआती लोगों के लिए ठीक हो सकती हैं जिनके पास तकनीक या implementation methods को लेकर अभी कोई ठोस दृष्टिकोण नहीं है, लेकिन मेरा मानना है कि अनुभव बढ़ने के साथ उनकी उपयोगिता कम होती जाती है। इसकी वजह यह है कि हर project और environment पर लागू होने वाला कोई पूर्ण सत्य नहीं होता, और कई बार ऐसे हालात भी आते हैं जहाँ सामान्य सिद्धांत काम नहीं करते। दूसरे सामान्य क्षेत्रों की self-help किताबों की सलाह की तरह, उनसे थोड़ा फासला रखते हुए सिर्फ वही सलाह अपनाना बेहतर लगता है जो परिस्थिति के अनुकूल हो, और सलाह का अंधाधुंध पीछा नहीं करना चाहिए।
मुझे John की बात से थोड़ा ज़्यादा सहमति है.
मुझे लगता है कि असली बात यह है कि दोनों में से किसी की बात को डॉग्मा की तरह बिना शर्त मानने के बजाय यह समझते हुए आगे बढ़ना चाहिए कि वे ऐसा क्यों कहते हैं।
यह नहीं भूलना चाहिए कि clean code कोई लक्ष्य नहीं, बल्कि एक साधन है।
आखिरकार, संतुलन ही सबसे ज़रूरी है।
उपयोगी है 👍🏻
Hacker News राय
कुछ लोग खास चीज़ों को लेकर बहुत कट्टर हो सकते हैं। समझ नहीं आता कि लोग इन्हें किसी धर्मग्रंथ की तरह क्यों मान लेते हैं
अगर आप किसी ऐसे project में काम करें जो Uncle Bob की सिफारिशों को आँख मूंदकर मानता हो, तो उसकी सीमित उपयोगिता जल्दी समझ आ जाती है
Clean Code एक अच्छे software engineer के toolbox का सिर्फ एक हिस्सा है
कुछ लोग functions को तब अलग नहीं करते जब वे reusable हों या logically meaningful हों, बल्कि बस पास-पास की lines को जोड़कर उसे "refactoring" कह देते हैं
comments की अहमियत पर एक महत्वपूर्ण उदाहरण छूट जाता है
मैं "A Philosophy of Software Design" की ज़ोरदार सिफारिश करता हूँ
यह Clean Code आंदोलन से पहले software industry की असली समस्याओं के जवाब के रूप में आया था
Bob की comments को लेकर राय अजीब है
समय के साथ Uncle Bob की किताबों से आगे निकल जाना स्वाभाविक है
Clean Code नाम को लेकर भी आपत्ति है